«Лицо без шрама» или первые шаги в Multicad.NET API 7 (для Nanocad 8.1)

Волею судеб сложилось так, что для одного из моих хобби, мне понадобилось ковыряться в API к отечественной САПР Nanocad, при этом, не имея каких-то практических навыков в разработке для САПР.

И если пару лет назад в аналогичной ситуации, когда я чисто ради любопытства решил посмотреть API для Revit, проблем вообще никаких не возникало, то с Нанокадом было всё не так просто.

В память и со всем уважением к Михаилу Николаевичу, можно сказать: «Наберите воздуха в грудь…» эти американцы разместили у себя на сайте в открытом доступе… инструкцию по началу работы! Какие же они там все ту… в общем вы поняли, это вам не «лук в колготках хранить».

Но мы с вами как порядочные люди не будем ругать людей, которые дали нам бесплатно вполне вменяемый продукт и доступ к средствам разработки, просто попробуем им немножко помочь, тем более что последняя публикация по MultiCad. NET API была в блоге Nanosoft на Хабре, почти два года назад и надо немного заполнить вакуум.

К сожалению, как полный новичок в этом вопросе я не смогу дать вам материал действительно достойного качества, но по крайней мере мы рассмотрим те вопросы, на которых у меня сразу случился «затык». Получится, как и в прошлом цикле по Data Science статья от новичка — новичкам.

План примерно такой: пару слов о Нанокад, немного в целом о программировании под Нанокад и в конце написание примитивной команды с помощью MultiCAD .NET API 7 (для Nanocad 8.X).

Итак, прячем чертежи в тубус, убираем кульманы, запихиваем лекала на антресоль и милости прошу под кат.

rb74xv1nactakkmjgzjsrqdjohi.png

Дорогой читатель если ты видишь эти строки знай — ты в БОЛЬШОЙ опасности! Те, кому довелось читать мои прошлые статьи знают, что в последнее время я для пущей художественной выразительности дополняю заголовки чем-то стилизованным, то обыгрываю фильмы, то пословицы.

Не знаю почему, но когда я начал писать эту статью, понял, что просто обязан сдобрить её отсылками к выдержкам из монологов времен золотого века передач «Аншлаг» и «Смехопанорама». Так, что эта статья только для людей сильных духом.

Содержание:
Часть I: «Мне за это не платят! (Введение).
Часть II: Импортозамещение
Часть III: Доступ к API, документация, с чего начать.
Часть IV: Настраиваем среду разработки и пишем простую команду
Часть V: Обидно! (Заключение)

1. Мне за это не платят! (Введение)

95duf2tiktop85pnpz1xbwjkkhc.png

Для начала будет уместно сказать, что я никак с Нанософтом не связан, денег мне они не платят, так что все, что будет в статье это мое частное мнение.

Кстати мнение это будет вполне положительным. Полноценное моё знакомство с Нанокадом началось много лет назад, когда мы с коллегой Drzugrik были еще молодыми практикантами и судьбой занесло нас в хорошую компанию, для которой было неприемлемо применение «пиратского» ПО. Естественно, для двух «студентов» не нашлось лицензии AutoCAD, и тут-то нас Нанокад и выручил.

Правда надо отметить, что все бесплатные версии семейства 3.Х стоили мне много вырванных волос и нецензурной брани, но потом вышла версия 5.1 (Nanocad Free), которая представляет собой вполне удобный «электронный кульман». Я до сих пор её использую, когда мне надо набросать какую-нибудь простую «схемку», например, эту:

gf4yp6btwazy-6spfiss4lkmpgo.png

Как видите интерфейс похож на старорежимный — «доленточный» Автокад, да и функционал похож на AutoCAD LT «конца нулевых». Правда в отличии от ЛТ версии Автокада, в бесплатном Нанокаде есть некоторая возможность работать с 3D, пользы от нее не очень много разве что студентам делать задания по начертательной геометрии (начертил себе виды и изометрию, посмотрел, а потом срисовывай).

А в плане двухмерного проектирования для строительной отрасли функционала бесплатной версии вполне может хватить фрилансерам или небольшим проектным бюро и СМР организациям.

Есть безусловно и платная версия, на данный момент Nanocad 8.5, я если честно всех прелестей автоматизации, которые она дает не вкусил. Но если верить книге «Путь к Nanocad» (о ней позже), то работать похоже реально удобно, но сам я на практике не сталкивался, могу только представить сколько бы времени сэкономила автоматизация некоторых полей в чертеже и автоматизированный нормокотроль с помощью NormaCS.

Вся беда в том, что как я понимаю у нас в стране компаний где процесс проектирования поставлен «по уму», наверное, все же меньше, чем контор где всё «должно быть сделано уже вчера» и «на коленке», а на людей, внедряющих автоматизацию смотрят как на юродивых. Это правда мое частное мнение и при этом сильно отставшее от действительности, может быть уже настало светлое будущее, «город-сад» и все такое, тогда я буду крайне рад за отчизну =)
Но вернемся к Нанокад, в свете текущей мировой конъюнктуры есть у него для Российских компаний (в том числе госкомпаний) одна фишка, а именно…

2. Импортозамещение

35ac--iqko5dvhg_ouefpzvfyr0.png

Жизнь как-то спокойней не становится, санкции расширяют, того и глядишь дойдет до того, что будем санкционные дистрибутивы на DVD дисках бульдозером давить, что же тогда делать?

Надо отметить, что так исторически сложилось, что у нас в отрасли строительного проектирования подавляющее преимущество у продуктов Autodesk и его близнецов братьев, продукция фирмы Аскон (Компас), как-то не очень прижилась, хотя иногда и проекты, выполненные в «Компасе», тоже встречаются. Надо отметить, что это опять-таки мое частное мнение, надеюсь оно не спровоцирует «холивар».

Ну, а возвращаясь к «Автокаду и компании» что мы имеем? Продукты Autodesk качественные, но дорогие и офис центральный в США. Есть BricsCAD и ZWCAD, они конечно подешевле, и например тот же BricsCAD расскажет кучу плюсов о себе в сравнении с другими, но и все таки не смотря на наличие отечественных офисов их тоже можно считать иностранными. У этих программ есть свои фанаты, ну, а я про них ничего сказать не могу — не пользовался.

Есть еще DRAFTSIGHT, у которого имеется бесплатная для частного использования версия, работающая под Linux, ни скажу про нее ни плохого, ни хорошего, суммарно пользовался ей минут 30, наверное, да и то давно.
Ну и безусловно есть еще и ArchiCAD, но мне кажется там немного другая концепция и мы не будем их сейчас сравнивать.

Есть и другие САПР в том числе отечественные, про них я знаю совсем мало или ничего.
Главное, что если не считать зависимости от Open Design Alliance, то Nanocad, наверное, первый кандидат на «импортозамещение» некоторой продукции Autodesk в области строительного проектирования.

Отметим, что у платформы есть вертикаль решений и можно встретить различные специализации от механики до модного нынче BIM, я если честно с ними на практике не сталкивался и не могу сказать может ли, например, Nanocad «Инженерный BIM» заменить решения на базе Revit.

Кстати, будет уместно сказать спасибо Autodesk, ведь если верить форуму, то обновление бесплатной версии Nanocad было привязано именно к обновлению формата DWG до версии DWG 2018. Точные сроки обновления бесплатной версии правда пока неизвестны.

Ну, а кроме платных продуктов, вспомним о том, что есть еще конечно opensource решения: FreeCad, LibreCAD, QCAD — я им искренне желаю успехов, но думаю мало кто осмелится строить проектный бизнес на их базе, по крайней мере сейчас.

Ну, а чтобы плавно перейти именно к вопросам API, скажу что MultiCAD .NET API, теоретически позволяет писать универсальные приложения, которые запустятся в Nanocad, AutoCAD, ZWCAD. В случае с неродной платформой библиотеки запускаются через программную прослойку. Правда на практике мне это сейчас проверить не удалось, а почему? А потому, что на ПК у меня установлен только AutoCAD 2017, а на портале для разработчиков доступная «прослойка», его не поддерживает (край это AutoCAD 2016). Так, что оставим доказательство на совести разработчиков.

Вот теперь мы наконец-то плавно начали подходить к проблемам, с которыми столкнется начинающий разработчик, твердо намеренный освоить API Nanocad.


3. Доступ к API, документация, с чего начать.

eecmd0s4nf8rduao7u1-d9ivfbq.png

Пожалуй, самым рациональным путем будет зарегистрироваться в «Клубе разработчиков» Nanocad
Заполняете нехитрую анкету, ждете одобрения (думаю если её адекватно заполнить, то проблем быть не должно), после чего получаете доступ к ресурсам для разработки.

Что это за ресурсы:

  1. Доступ к лицензиям и дистрибутивам вышедших версий Nanocad, включая некоторые бета версии, а также непосредственно к самим API (пакет SDK).
  2. Доступ к закрытому форуму для разработчиков (не путать с обычным форумом)
  3. Общение с разработчиками, возможность указать на «баг» или запросить «фичу».

Ну что же на словах все выглядит очень хорошо, на практике конечно тоже хорошо, но все же с ложкой дегтя.

Думаю, поскольку данное направление непрофильное и не монетизируемое, то занимаются им по остаточному принципу, так, например, на портале для разработчиков сейчас доступна только бета версии 8.5, хотя на портале компании уже выложена полноценная версия. Проблема в том, что полноценная версия с оф. сайта, по-моему, идет без пакета SDK, вот сиди думай сильно SDK от беты отличается от финальной или нет.

Ну и как я уже упоминал выше, пакет MultiCAD_AC_ZC_Enabler_2209_RU (набор «прослоек» для работы API в других CAD), наверняка уже тоже обновился, но более новой версии (для AutoCAD 2017), на портале нет.

Но еще раз повторюсь, и за это — спасибо! Это мелочи, главное, что можно получить лицензии для новых и старых версий программы, и начать пилить свое приложение (лицензии дают только для разработки).

Вторая беда это документация к API, надо отметить, что API есть для многих языков: чистый .NET API (не Мультикад), C++, Lisp, но мы будем сегодня говорить, только о MultiCAD API .NET.
Так вот если вы привыкли к развернутому описанию классов, методов, свойств в родных библиотеках от Microsoft, вас конечно ждет разочарование. Большая часть описаний в справке похоже сгенерирована автоматически, но иногда все же встречаются классы, к которым есть пояснения. Получается, если вы «не абы какой программист» (как и я) и при этом не являетесь гениальным детективом, чтобы сходу разгадать логику работы API, то без посторонней помощи точно не обойтись.

А где мы можем получить помощь? А почти нигде кроме форума разработчиков. Но о форуме чуть позже, а для начала о литературе.

С учебной литературой все просто — её почти нет! В самой документации к API есть небольшое пояснение как создать проект (об этом в следующей главе), еще пара коротких заметок и несколько примеров.

Есть книга «Путь к nanoCAD», поскольку мне «очень приперло», то я её даже купил (кстати нашел дешевле чем на оф. сайте). Книга сама по себе хорошая, пролистать можно за день, и таким образом узнать, что можно (и нельзя) сделать в Nanocad 8.X и как быстро на него пересесть с AutoCAD. В книге есть 13-я глава, где кратко изложены основные концепции программирования для Nanocad. Но информации немного и каши из нее особо не сваришь, по сути это изложение справки из SDK + несколько хороших приемов и пояснений.

Что есть еще? Есть статьи в блоге компании на Хабре или, что на мой взгляд более удобно, те же статьи в англоязычной версии блога по API (там они не перемешиваются со статьями, несвязанными с разработкой). Статьи хорошие, но их откровенно мало и выходят они редко, как я уже упоминал вначале, последняя вышла почти 2 года назад.

Сообщество у Нанокада небольшое поэтому, похоже всё что остается это форум для разработчиков. С одной стороны, сказать, что форум живет прям бурной жизнью, что там кипит «движуха» и так далее, явно нельзя. С другой стороны, на нормальные вопросы специалисты компании стараются отвечать причем в течении дня, за что им спасибо. А вот с «ненормальными» (глупыми) вопросами дела обстоят хуже, на них ответить некому (так что я иногда общаюсь там сам с собой).

Я думаю основная беда, это то что на форуме мало энтузиастов. И для того чтобы это поправить я сейчас пишу, а вы читаете эту статью.

Еще один важный момент — это лицензирование.

Во-первых, вступая в клуб разработчиков вы подписываете договор (ну в смысле жмёте кнопку «согласен»), в котором тяжелым юридическим языком написано, что можно, что нельзя.

Вопрос трактовки этого договора в части прав на ваши приложения (библиотеки) разработчикам задавали, разные люди, в том числе и я. Смысл ответов примерно такой:
Нанософт не ограничивает бесплатное использование и распространение ваших наработок на базе средств разработки Nanocad.
Причем для того чтобы это узнать необязательно вступать в клуб, достаточно просто почитать лицензионное соглашение к любой из версий программы (по крайней мере начиная с версии 5). Так, например, SDK для бесплатной версии 5.1 доступно внутри дистрибутива (по крайне мере раньше было), то есть в принципе, похоже в клуб и не обязательно вступать, но если вы хотите использовать последние версии API (а мы хотим, потому что в NC5.1 оно куцее), то все же надо вступать.

Но хватит говорить, пора уже что-то полезное сделать, давайте перейдём к той части, ради которой вся статья и задумывалась.

4. Настраиваем среду разработки и пишем простую команду


Прежде чем начать, скажу, что MultiCAD .NET API мы выбрали не только за его «кроссплатформенность», но и за возможность создания пользовательских примитивов (но в этом примере мы их создавать не будем).

zkqwgtjomuyixwwgw3pconjsm2o.png

Итак, мы с вами будем писать команду, которая рисует рожицу, ту что слева, а вот потом вы будете самостоятельно рисовать ту что справа (шучу).
Ориентироваться будем на Nanocad 8.1, но код простенький и думаю, что пойдет в любой версии семейства 8.Х.

Писать и собирать код мы будем в MS Visual Studio. Ок, а какую версию выбрать? Всё зависит от наших целей. Так примеры, входящие в состав SDK для NC 8 были собраны в MS Visual studio 2012. И при попытке открыть их в более поздних версиях может появится мастер обновления решений.

К сожалению, поскольку целиком пакет из SDK у меня не собрался, я не могу сказать влияет ли как-то приведение к более новой версии проекта на его работоспособность. Но могу сказать точно, что если вы скачаете бесплатную VS Express Desktop 2012, то проекты в SDK не будут ругаться и в принципе их можно будет собрать спокойно.

Кстати если захотите скачать VS Express Desktop 2012 с сайта Микрософт, то не факт, что вам это удастся, в моем случае MS видимо думает, что я сумасшедший и при настойчивой попытке её скачать блокирует меня, но к счастью данную версию можно найти и в сети, правда опять-таки сервис регистрации похоже помер, так что придется поискать еще и код.

Так или иначе, тот пример что мы будем с вами писать сейчас, можно собрать и в более поздних версия Visual Studio. Я, например, использую VS 2015 Community edition, но думаю и в 2013 и в 2017, тоже должно пойти.

Первое с чего надо начать — создать проект (эта информация есть и в SDK).

kn-w-nszo77qhfzmvnpve1msyis.png

Внимание выбираем .NET Framework 4.0 эта версия используется в API для NC8 (у NC 5.1, например, .NET Framework 3.5). Далее выбираем библиотеку классов, название можете выбрать какое хотите.

Дальше необходимо подключить библиотеки из MultiCAD .NET API (mapimgd.dll и mapibasetypes.dll), как на картинке

fwz2a69aasjndf8gcpbg2mi8vp4.png

Обязательно уберите в свойствах пункт копировать локально

ocyo0wwuaxjdzbpjzhjl5vbgbbo.png

Настроим отладчик так чтобы наша сборка сразу открывалась в Nanocad
Для начала в свойствах проекта укажем в качестве запускаемого приложения nCad.exe (как на картинке)

20wzi28durjyw5xe7pt7wvboke8.png

Подключим нашу библиотеку в список автозагружаемых (чтобы каждый раз не вызывать команду netload)
Для этого в нашем случае (для NC 8.1) перейдем по адресу C:\ProgramData\Nanosoft\nanoCAD x64 Plus 8.1\DataRW и найдем или сами создадим файл load.config со следующим содержанием.


    
		
    


Вместо трех точек естественно полный адрес к вашей папке проекта.
Необязательно ограничиваться одной записью в будущем можно будет добавить еще 1 секцию если у вас появятся еще свои библиотеки.

Теперь при нажатии F5 наш проект будет сразу загружаться в Нанокад и останется только набрать команду, которую мы с вами напишем.
Как обычно, мы с вами сейчас будем разбирать её по кусочкам, а полный текст доступен на GitHub (по данному адресу размещен только .*cs файл, при необходимости проект создайте самостоятельно)

Итак, для начала пропишем необходимые пространства имен:

using System;
using System.Collections.Generic;

using Multicad.AplicationServices;
using Multicad.Runtime;
using Multicad.DatabaseServices;
using Multicad.Geometry;
using Multicad.DatabaseServices.StandardObjects;

using System.Windows.Forms;


Дальше создадим команду.

namespace nanoforhabr1
{
    public class startfor81
    {
        [CommandMethod("Dface", CommandFlags.NoCheck | CommandFlags.NoPrefix )]
        public void DrawFace()
        {


Атрибут [CommandMethod («Dface», CommandFlags.NoCheck | CommandFlags.NoPrefix)]
Определяет название команды, которое будем вводить в командную строку NC (в нашем случае Dface), а дальше идут флаги, про значения флагов пока сказать не готов.
Затем сразу идет название класса в котором мы и реализуем нашу «бизнес логику», название класса любое — на ваше усмотрение у меня public void DrawFace ()

В следующей секции мы нарисуем левую половину лица.


//We draw half of face

            // Draw eye
            DbCircle eye = new DbCircle();
            eye.Radius = 100;
            eye.Center = new Point3d(200, 500,0);
            eye.DbEntity.AddToCurrentDocument();

            //Draw nose
            DbLine nose = new DbLine();
            nose.StartPoint= new Point3d(350, 400, 0);
            nose.EndPoint = new Point3d(350, 200, 0);
            nose.DbEntity.AddToCurrentDocument();

            //Draw mouth 
            DbPolyline mouth = new DbPolyline();
            List mouthPoints = new List() {
                new Point3d(100, 150, 0), new Point3d(200, 100, 0), new Point3d(350, 100, 0) };
            mouth.Polyline=  new Polyline3d(mouthPoints);
            mouth.Polyline.SetClosed(false);
            mouth.DbEntity.Transform(McDocumentsManager.GetActiveDoc().UCS); //change coordinates from UCS to WCS for BD
            mouth.DbEntity.AddToCurrentDocument();

Итак, давайте разбираться. В MultiCAD .NET API есть классы которые отвечают за определение геометрических объектов и отображении их на чертеже, создадим глаз:
DbCircle eye = new DbCircle (); — создает объект круг (аналогично команде CIRCLE в командной строке или нажатию на кружочек в панели инструментов) затем мы настраиваем радиус круга и координаты центра, думаю тут итак понятно.
eye.DbEntity.AddToCurrentDocument (); — добавляет объект на чертеж.

С простой линией я думаю все итак понятно (это будет наш нос).

Затем рисуем рот. Определяем полилинию DbPolyline mouth = new DbPolyline (); Формируем точки по которым она будет строится (наклонная и прямая линии)

List mouthPoints = new List() {
                new Point3d(100, 150, 0), new Point3d(200, 100, 0), new Point3d(350, 100, 0) };


mouth.Polyline= new Polyline3d (mouthPoints); — создаем в объекте БД геометрию по нашим точкам.
mouth.Polyline.SetClosed (false); если захотите чтобы линия замыкалась — поменяйте значение.

mouth.DbEntity.Transform(McDocumentsManager.GetActiveDoc().UCS); //change coordinates from UCS to WCS for BD 


 — эту строку я позаимствовал на форуме разработчиков, не знаю надо ли точно менять систему пользовательских координат на мировую или нет =)

Рисуем вторую часть лица


//draw mirror half the face (2nd half)

            DbCircle eye2 = new DbCircle();
            eye2.Radius = 100;
            eye2.Center = new Point3d(500, 500, 0);
            eye2.DbEntity.AddToCurrentDocument();

            DbPolyline mouth2 = new DbPolyline();
            mouth2.Polyline= mouth.Polyline.Mirror(new Plane3d(new Point3d(350, 100, 0), new Vector3d(200, 0, 0))) as Polyline3d;
            mouth2.DbEntity.AddToCurrentDocument();


Второй глаз мы просто создаем по аналогии,
А вот вторую половину рта ради разнообразия отзеркалим. По сути мы делаем аналог команды ЗЕРКАЛО (mirror)
mouth2.Polyline= mouth.Polyline.Mirror(new Plane3d(new Point3d(350, 100, 0), new Vector3d(200, 0, 0))) as Polyline3d;
эта команда нам создает новую зеркальную копию линии отраженную от базовой точки и плоскости (это как если бы вы ткнули мышкой в экран и провели линию по которой объект отразится)

Добавим немного интерактива.

//Get notification in command line
            McContext.ShowNotification("You need to enter data into the console");


            //Get uaser input
            InputJig editorInput = new InputJig();
            string name = editorInput.GetText("Input your name and press Enter");


Первая секция просто посылает текст в консоль (окно где вы вводите команды)
Вторая секция создает объект для ввода данных в консоль и получает введенное пользователем значение. В данном случае мы просим пользователя представится и сохраняем его имя.

Создаем текстовый объект, это маленькая доля юмора в нашей команде.

            //Drawing face's text
            DbText spech = new DbText();
            spech.Text = new TextGeom("Oh Master! Why I'm so ugly? Please remove me!", new Point3d(510, 15, 0), Vector3d.XAxis, "Standard", 15);
            spech.DbEntity.AddToCurrentDocument();


Привлекаем внимание пользователя к созданной записи, а заодно демонстрируем, то что в ваше приложение может быть встроена конструкция например характерная для windows.forms, то есть вы бы могли сделать и вызов своей собственной формы, а потом обработать данные.
Мы же просто выведем полученное ранее имя пользователя.


            //Get windows message box
            MessageBox.Show("Congratulation " + name +" you did it! But look, it want, to say something to you...");


Кажется, наше лицо недовольно своим бытием, давайте его удалим.

В последней секции мы делаем две вещи: показываем пользователю всплывающую подсказку о том, что включилась автоматически команда «удалить» и запускаем из нашей команды другую команду.

            //Get popup help
            McContext.PopupNotification("Delete command has activated");

            //Activate another command (Delete)
            McContext.ExecuteCommand("Delete");


        }
    }
}


Жмем F5 и если все нормально можем проверить нашу команду в действии, не забудьте ввести название команды как на скриншоте.

gd37ur8p5sjd5gbxb9scrdgqlai.png

И еще для перехвата некоторой отладочной информации можно использовать специальную утилиту для мониторинга.

Если вдруг вы не хотите вступать в клуб разработчиков, а посмотреть результат ваших трудов очень хочется, вы можете скачать демо версию NC 8.5 похоже она идет без пакета SDK в комплекте, но мы не будем расстраиваться, естественно библиотеки mapimgd.dll and mapibasetypes.dll должны быть и в комплекте поставки самой программы, так что их можно найти в папке bin.

Я не знаю можно ли так с точки зрения закона, но думаю, что проблем быть не должно.

Итак, я поделился с вами почти всем, что знал на текущий момент, осталось только подвести заключение.

5. Обидно (Заключение)

gqgjenwx5abozmmeptdnlb-dfjy.png

Ну что же как говорил Виктор Коклюшкин: «Обидно», за что обидно? За то, что перспективный проект — продукт вполне приемлемого качества не развернулся, так как мог бы развернутся. Странно это конечно, вроде даже меры господдержки какие-то были, вроде и в бесплатной версии реально можно что-то простенькое начертить, без желания бросить кирпич в монитор, а все равно как-то среда, созданная вокруг продукта хуже, чем могла быть. Я вот думаю, что если больше народу втянутся в разработку для Нанокад пусть просто даже «just for fun», как мы сейчас с вами, то глядишь и Нанософт почувствует свою востребованность, может и форум заживет, API начнут лучше документироваться и файлы чаще выкладываться. В принципе если учитывать, что возможно всё-таки есть смысл ждать обновления бесплатной версии, то может оно так и будет в будущем.

Ну, а пока скажу спасибо и пожелаю удачи разработчикам Нанокада и всем, кто осилил эту статью до конца, не смотря на шутки из «Аншлага».

Хорошего начала трудовой недели!

© Habrahabr.ru