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

Рис. 1. Подходы к автоматизации задач в САПР
Многие САПР из линейки nanoCAD реализуют оба подхода:
Эта статья подразделяется на тематические части. В первой мы познакомимся с вариантами доступных API, акцентировав внимание на COM API nanoCAD BIM Строительство. Расскажем об основных элементах и о тех нюансах, с которыми можно столкнуться при работе с данным вариантом API. В следующей части подробнее рассмотрим правила построения выражений при работе с COM в Мастере функций, а также различные пользовательские приемы.
Линейка nanoCAD довольно обширна, в нашем случае мы сконцентрируемся на программе nanoCAD BIM Строительство и использовании COM-интерфейса в Мастере функций. Но сперва определимся с термином.
API (МФА: [ˌeɪ.piˈaɪ]; аббр. от англ. application programming interface, дословно интерфейс программирования приложения – программный интерфейс, то есть описание способов взаимодействия одной компьютерной программы с другими (в противоположность пользовательскому интерфейсу, применяемому для взаимодействия программы и конечного пользователя).
API позволяет взаимодействовать с функционалом программы посредством программирования, при этом у одного приложения может быть множество API – в частности, это справедливо для решений линейки nanoCAD. Разные варианты API могут подразумевать использование разных языков программирования и разные возможности работы с объектами приложения.
API не предоставляет доступа к исходному коду приложения, но позволяет задействовать ряд готовых программных функций. На уровне исходного кода описываются свойства и функции какой-либо сущности, а на уровне API пользователи получают доступ к этим же свойствам и функциям в более лаконичной форме. Таким образом исходные сущности инкапсулируются и потому становятся более удобными для работы через API.
Поскольку nanoCAD BIM Строительство является вертикально инсталлируемым приложением, мы можем в рамках API работать как с Платформой nanoCAD (рис. 2), так и с nanoCAD BIM Строительство (рис. 3). У обоих приложений варианты API довольно разнообразны.

Рис. 2. Перечень API Платформы nanoCAD

Рис. 3. Перечень API nanoCAD BIM Строительство
В источнике COM-интерфейс в списке не приведен, но у объектов nanoCAD BIM Строительство он фактически имеется. При этом важно отметить, что у новых объектов конфигурации архитектуры COM интерфейс содержит меньше методов и свойств в сравнении с объектами конфигурации конструкций.
Использование того или иного варианта API зависит от множества факторов:
Для nanoCAD BIM Строительство хорошо задокументирован интерфейс .NET. SDK по нему можно найти на портале разработчиков.
По COM-интерфейсу, к сожалению, документации и учебных материалов меньше. Причем рядовому пользователю данный вариант интерфейса, доступный в рамках окна Мастера функций, ближе всего. Эта статья написана для восполнения пробела в материалах.
Дадим определение COM-интерфейсу:
COM API (аббр. от англ. Component Object Model Application Programming Interface) – это технология Microsoft для создания взаимодействующих программных компонентов, предоставляющая стандартизированный способ взаимодействия между разными частями ПО, даже написанными на разных языках, через интерфейсы.
Исходя из определения можно заключить, что данный вид интерфейса в первую очередь применяется для обеспечения взаимодействия программных решений между собой. Например, используя данные из Excel, можно автоматизировать создание/редактирование объектов в nanoCAD. По ссылке доступен пример такой автоматизации.
Однако использовать COM-интерфейс можно и внутри самой среды проектирования. Причем делать это в рамках инструмента разработки scripted (рис. 4), а для nanoCAD BIM Строительство использовать Мастер функций (рис. 5).

Рис. 4. Получение значения UnitName с помощью AutoLISP в окне редактора скриптов

Рис. 5. Получение значения UnitName с помощью COM в окне Мастера функций
Документацию на COM API можно запросить у разработчика. Также эта документация ранее выкладывалась в телеграм-канале, посвященном программным продуктам линейки Model Studio CS (t.me/ModelStudioCS).
В COM API nanoCAD BIM Строительство есть четыре основных элемента (объект, метод, свойство, коллекция).
1. Объект (оболочка, класс) – сущность, обладающая набором методов и свойств. В рамках Мастера функций она, в частности, является точкой входа при написании выражений. Стандартным обращением к собственному COM-интерфейсу объекта является ключевое слово Object. В зависимости от категории объекта класс также будет различаться (рис. 6).

Рис. 6. Различие имен объектов при обращении через Object
Объекты имеют структуру наследования, поэтому могут обладать свойствами и методами, которые не описаны в исходной технической документации («Справочник по COM API Model Studio CS»). Например, для объектов nanoCAD BIM Строительство можно вызывать свойство, которое содержит имя слоя Object.layer (рис. 7). Это свойство унаследовано от родительского класса Entity. Учитывая, что доступны не все методы и свойства родительского класса, можно сделать вывод, что наследование частичное.

Рис. 7. Получение имени слоя, на котором размещен объект
Просмотреть полный перечень свойств, включая унаследованные, можно при помощи LISP-выражения. Вы можете ввести его непосредственно в командную строку (рис. 8):
(progn (vl-load-com) (vlax-dump-Object (vlax-ename->vla-object (car (entsel)))))

Рис. 8. Получение перечня COM-свойств
Описание COM-интерфейса для свойства layer содержится в документации SDK Платформы nanoCAD (рис. 9). Также эти материалы можно скачать на сайте.

Рис. 9. Пример документации из SDK Платформы nanoCAD
2. Свойство – информационный атрибут объекта (рис. 10). Значения свойств динамически обновляются в зависимости от действий, производимых над объектом. Важно отметить, что в рамках Мастера функций свойства доступны только для чтения.

Рис. 10. Получение свойства объекта в COM
3. Метод – операция (функция), позволяющая изменить/прочитать свойства объекта, к которому данный метод применяется. Например, метод Move обеспечивает возможность выполнить относительное перемещение объекта по указанным координатам пространства чертежа – аналогично команде перемещения Платформы nanoCAD (рис. 11).

Рис. 11. Использование метода Move в COM
4. Коллекция – безразмерный перечень (набор, список) каких-либо элементов. Может содержать как список простых типов данных (строки, числа), так и перечень объектов COM. В программировании для обработки списков как правило используют циклы. Мастер функций таких операторов не имеет, однако располагает функциями коллекций, которые позволяют работать с данными внутри коллекции (рис. 12). Существует множество пользовательских приемов применения этих функций, подробнее мы рассмотрим их в следующей части статьи.

Рис. 12. Применение функции коллекций
Также для некоторых коллекций в COM API доступны методы, позволяющие получить элемент коллекции по его индексу (рис. 13).

Рис. 13. Получение по индексу элемента коллекции через метод Item
В ряде случаев можно получить элемент коллекции без использования COM, то есть извлечь этот элемент, указав значение индекса в квадратных скобках после функции (рис. 14).

Рис. 14. Получение элемента коллекции через индекс в скобках
Отдельно стоит отметить, что свойства и методы могут возвращать разные типы данных: строки, числа, логический (булевый) тип, объекты, коллекции. Для примера разберем последовательность получения значения свойства из окна параметров (рис. 15).

Рис. 15. Получение значения параметра в COM
Object – собственная COM-оболочка объекта. Точка входа. В данном случае класс объекта IMDSParametricEnt.
Element – свойство Object, которое возвращает объект одноименного класса (рис. 16).

Рис. 16. Element, пример технической документации на COM API
Parameters – свойство Element, которое возвращает коллекцию параметров (рис. 17).

Рис. 17. Parameters, пример технической документации на COM API
Item – метод коллекции Parameters, который позволяет извлечь параметр по его индексу/имени. В данном случае метод возвращает объект класса Parameter (рис. 18).

Рис. 18. Item, пример технической документации на COM API
Value – свойство класса Parameter, которое возвращает строковое значение параметра (рис. 19).

Рис. 19. Value, пример технической документации на COM API
Общая схема отношений между объектами представлена на рис. 20. В левой верхней части рисунка приведен пример взаимоотношений, по которому ранее было получено значение параметра объекта.

Рис. 20. Отношения объектов COM
Можно выделить следующие преимущества использования COM API объектов nanoCAD BIM Строительство:
К недостаткам следует отнести:

Рис. 21. Попытка получить ссылку на данные
Очень здорово иметь под рукой САПР, которая реализует оба подхода автоматизации: для типовых задач – готовые к использованию инструменты, для сложных – инструменты API. Множество программных продуктов линейки nanoCAD реализует оба подхода. Даже в рамках отдельно взятого программного продукта nanoCAD возможностей автоматизации довольно много, а одним из самых популярных вариантов является COM-интерфейс, особенности которого и были рассмотрены. В следующей части статьи мы еще основательнее углубимся в параметризацию и автоматизацию с использованием данного инструмента.