В 2023 году на Всероссийской инженерной конференции «ТИМ-практика» инженеры компании ООО «Нормасофт», премьер- и фокус-партнера компании «Нанософт» по направлениям «Конструкции», «Инженерия», «Обработка данных ЛС», рассказали о своем опыте на примере 15 проектов, выполненных ими с применением отечественных ТИМ. Работая с трехмерными проектами с 2016 года, инженеры компании ООО «Нормасофт» неоднократно сталкивались с необходимостью расстановки 3D-элементов ограждений на плане. Из своего опыта помню, как при смене поставщика ограждений по проекту приходилось вручную заменять опоры и блоки ограждений с шагом 3 метра на шаг 2,6 метра.
В 2022 году инженеры компании ООО «Нормасофт» расширили свои возможности в проектировании, приняв участие в пилотных проектах информационного моделирования мостов и гидротехнических сооружений. Именно на таких объектах мы стали получать от многих заказчиков запрос на автоматическую расстановку ограждений по заданной траектории. Это необходимо для создания различных типов ограждений – от сигнальных столбиков и заборов до сварных и шпунтовых ограждений.
Казалось бы, в Платформе nanoCAD компании «Нанософт» уже есть инструмент Массив по траектории, который копирует объекты с заданным шагом вдоль полилинии. Эта команда действительно удобна для применения при 2D-проектировании. Однако сложность расстановки 3D-элементов на плане состоит в неоднородности рельефа. При автоматической расстановке ограждений по заданной траектории должно учитываться изменение координаты Z, возможность задавать шаг между опорами, а также участки на расстояниях некратных шагу.
Для решения этой задачи специалисты, обладающие необходимыми квалификацией и опытом в компании ООО «Нормасофт», разработали скрипт автоматической расстановки ограждения по заданной траектории.
Перед нашими специалистами стояла непростая задача по автоматизации процесса расстановки ограждений по траектории в пространстве с несколькими условиями:
- Ограждение может быть расставлено как на плоскости, так и на неровной поверхности.
- Ограждение может быть замкнутым и разомкнутым.
- Секция ограждения может быть подрезана, если она не помещается на свою траекторию.
Для реализации этих задач было предложено самое логичное и простое решение – использовать и отталкиваться от того, что имеем. Как и в инструменте Массив по траектории, наше автоматическое ограждение будет строиться по полилинии, а впоследствии и по 3D-полилинии.
В теории, 3D-полилиния представляет собой последовательность отрезков в трехмерном пространстве, где конец предыдущего отрезка является началом следующего. И сама 3D-полилиния может быть замкнутой или разомкнутой. В свою очередь, полилинию можно считать частным случаем 3D-полилинии. На практике, 3D-полилиния представляет собой список точек с тремя координатами, полилиния – с двумя.
Исходя из начальных условий и способа реализации, получаем следующее:
- Для построения ограждения пользователь указывает полилинию или 3D-полилинию, которая может быть замкнутой или разомкнутой.
- Для построения ограждения пользователь выбирает исходную секцию ограждения как объект из чертежа или как элемент из базы данных оборудования.
- Если количество секций не кратно длине отрезка полилинии, то устанавливается секция длиной на остаток от деления.
Был выбран итерационный подход к разработке от простого к сложному. Можно выделить две основные итерации: расстановка ограждения на полилинии и расстановка ограждения по 3D-полилинии.
Для написания скрипта будет использоваться AutoLISP. Это популярное расширение языка обработки списков LISP для написания скриптов под CAD-системы. Это расширение языка поддерживается nanoCAD и дает интерфейсы взаимодействия с командной строкой и специфичными vl-some функциями для взаимодействия с CAD-объектами.
Для работы с этим языком, изучения синтаксиса и возможностей предлагаем на выбор использовать доступные учебный и справочные ресурсы:
- Любые доступные онлайн-ресурсы, справочники по операторам и функциям языка AutoLISP (например).
- Руководство разработчика с функциями и комментариями. Полещук Н.Н., Лоскутов П.В. «AutoLISP и Visual LISP в среде AutoCAD».
- Про разработку САПР-приложений (опыт, находки, технологии). Зуев С.А., Полещук Н.Н. «САПР на базе AutoCAD – как это делается».
- Русскоязычное сообщество autolisp.ru.
- Личный кабинет разработчика nanoCAD.
- Для более удобного написания скриптов на AutoLISP в качестве среды для разработки (IDE) был выбран Visual Studio Code (VSCode) или его свободная версия VSCodium. Эта среда обладает всеми современными настройками и функциями по работе с кодом различных языков, а также имеет широкое сообщество и магазин плагинов для расширения возможностей текстового редактора до полноценной IDE. При этом, открыв файл в Редакторе скриптов nanoCAD (рис. 1), параллельно можно открыть его и в VSCode (рис. 2). Редактирование открытого скрипта в любом из них ведет к изменениям в другом, то есть для написания скрипта мы используем VSCode, а для запуска редактора в nanoCAD. В отличие от штатного Редактора скриптов nanoCAD эта среда предоставляет следующие возможности:
- Удобную, настраиваемую и интеллектуальную подсветку синтаксиса.
- Автозавершения и дополнения кода (IntelliSense).
- Расширения функционала и удобства (управление версиями кода (Git-системы), встроенная справка по LISP, проверка правописания и прочее). Уже не говоря о более широких возможностях отладки, компиляции на других языках.
Для работы c языком AutoLISP и удобства в VSCode необходимо из вкладки Расширения в VSCode установить:
- AutoCAD AutoLISP Extension – самый полезный и крупный плагин для AutoLISP, добавляющий подсветку синтаксиса, подсказки и прочее, с чем можно ознакомиться на странице плагина.
- Code Spell Checker и Russian – Code Spell Checker опционально обеспечивает проверку правописания.
- Русификацию интерфейса Russian Language Pack for Visual Studio Code. Иногда может мешать, если необходимо найти какую-либо функцию-возможность VSCode.
С остальными настройками VSCode можно ознакомиться самостоятельно в свободных источниках.
Как ранее уже говорилось, язык LISP – это язык обработки списков. Поэтому первое «странное», с чем мы столкнемся в синтаксисе, – это засилье парных скобок в текстах скриптов. Открывающие выражение скобки и закрывающие обязательно парные. А также многочисленная вложенность этих блоков. Поэтому будьте предельно внимательны. В их отслеживании, выделении и подсветке вам поможет VSCode. Если понадобится, можно найти расширение для их явного цветного выделения или настройку, которая поможет совершать меньше ошибок этого плана.
В примерах lisp-скриптов вы можете найти те, которые содержат довольно громоздкую логику. Казалось бы, там уже напрашивается ООП. Но написанием этих скриптов чаще занимаются инженеры, а не программисты. Заранее неизвестно, насколько большую логику скрипта вам предстоит реализовать. Поэтому старайтесь делать блоки более читабельными, выделяющимися и в своих скриптах.
Не забывайте снабжать скрипт подробными комментариями, так как второе – сложные для восприятия конструкции выражений и мало что говорящие названия системных функций. Может быть исходя из опыта это и понятно, но поначалу или открыв скрипт месячной давности, вы можете неприятно удивиться. Для комментария используется точка с запятой.
Для быстрой загрузки скрипта в nanoCAD откройте Редактор скриптов во вкладке Настройки. В открывшейся левой вкладке Редактор скриптов вы будете открывать и запускать скрипт для добавления-обновления команды-функции в окружении nanoCAD (рис. 3).
С помощью функции (defun c:super_fencing ( … ) … ) появляется наша основная команда SUPER_FENCING, которая и будет вызываться в nanoCAD. После запуска скрипта эта функция добавляется в окружение и ее можно вызывать вводом в командной строке (рис. 4).
Как и полагается, у функции есть аргументы, внутренняя пара скобок и тело функции: все, что далее первого блока. Косая черта в аргументах функции используется для обозначения опциональных аргументов: в этом случае она используется для документирования.
Далее надо параллельно открыть этот скрипт в VSCode для его редактирования и сохранения. Остальные особенности будут проанализированы по ходу объяснения работы нашего скрипта.
Не надо забывать и общепринятые правила написания хорошего кода: осмысленное именование переменных, функций, общепринятое оформление синтаксиса и прочее. Если LISP вам не нравится, зачем делать его хуже.
Для работы с vl-some функциями (Visual LISP) необходимо подгрузить COM-интерфейс объектов с помощью директивы-функции: (vl-load-com).
После этого можно использовать все функции, описанные в справочниках и начинающиеся на префиксы vl, vla, vlax.
Далее следует объявление основной функции super_fencing. В аргументах и входных параметрах указываются основные переменные-объекты, с которыми можно будет работать (рис. 5). В основном там можно найти вспомогательные объекты. Допустим, после запуска команды SUPER_FENCING пользователь выбирает следующие из них (здесь можно рассмотреть блок скрипта Ввод):
- polyline – переменная, в которой хранится выбранная полилиния.
- base_fencing_vla – vla-объект, элемент ограждения.
- base_point – базовая точка ограждения, точка вставки (рис. 6).
- length_section – длина секции, ввод данных от пользователя.
Начнем с основного элемента – секции ограждения. В nanoCAD BIM Строительство (конфигурация «Конструкции») был разработан параметрический объект Ограждение перильное, состоящее из основного звена и двух стоек. Основной параметр, с которым придется работать, – длина звена-секции ограждения (Шаг). При изменениях этого поля параметрический объект будет перестраиваться, меняя длину звена ограждения (рис. 7). Для этого в параметрическом объекте при создании была заложена зависимость длины и положения элементов внутри звена ограждения от параметра Шаг.
После ввода основных данных обработки производятся расчеты (рис. 8). В них ведется подготовка данных для этапа построения, а именно их списки с точками, углами поворота и прочими данными. Для этого были подготовлены соответствующие функции.
Разберем одну из таких функций – get_list_pt_polyline, которая возвращает список точек полилинии. В 35-ой строке скрипта присваивается значение вывода функции переменной list_pt_polyline с помощью специального оператора setq. На вход этой функции в качестве аргумента передается объект полилинии, указанный пользователем. Далее перейдем к определению самой функции.
В начале определяется тип полилинии согласно параметрам структуры самого объекта – полилинии. Структуры любого примитива можно самостоятельно изучить на соответствующих ресурсах по AutoLISP или практически вывести параметры примитива. Для этого сначала необходимо извлечь информацию через entget (рис. 9) и далее вывести результат в командную строку для анализа структуры и написания соответствующих обращений, как в приведенном нами примере.
После получения типа полилинии polyline_type в зависимости от значения AcDbPolyline для полилинии или AcDb3dPolyline для 3D-полилинии формируется список с двумерными или трехмерными координатами для их возврата в конце, в строке 274 (рис. 10).
После осуществления расчетов и преобразований происходит построение ограждения (рис. 11).
После размещения секций ограждения необходимо использовать одну хитрость: следует перестроить и обновить параметрические объекты, так как программное изменение полей параметрического объекта не ведет к обновлению его графики. В отличие от ручного изменения параметров в форме nanoCAD BIM Строительство (конфигурация Конструкции), где после нажатия кнопки ОК в окне Параметры объекта происходит принудительное перестроение графики, в этом случае следует вызвать команду urs_remove_sys_params для обновления всей сцены.
Скрипт готов. После этого следует вывести в пространство модели звено ограждения и начертить контур ограждения в плане инструментом Полилиния (рис. 12).
После этого необходимо запустить команду SUPER_FENCING, указать курсором в пространстве модели полилинию – контур ограждения, звено и его базовую точку. В командной строке следует ввести длину звена. В итоге для ограждения по полилинии в плоскости будет получен результат, как показано на рис. 13. В командной строке отобразятся логи выполнения команды SUPER_FENCING (рис. 14).
В пространстве модели необходимо отобразить 3D-полилинию по рельефу местности. Контур ограждения по рельефу показан красным цветом на рис. 15.
Затем следует выполнить команду SUPER_FENCING для 3D-полилинии по рельефу местности. Для этого в пространстве модели надо указать курсором 3D-полилинию – контур ограждения и звено ограждения как объект из чертежа или как элемент из базы данных оборудования, а также его базовую точку. В командной строке необходимо ввести длину звена. В итоге для ограждения по 3D-полилинии будет получен результат, показанный на рис. 16-17.
Итогом работы становится скрипт, позволяющий автоматизировать процесс расстановки ограждений по траектории в трехмерном пространстве. В зависимости от длины траектории время автоматической расстановки ограждения занимает до двух минут. Благодаря этому скрипту уменьшается время работы проектировщика по моделированию любых ограждающих конструкций, элементы которых созданы как параметрическое оборудование в nanoCAD BIM Строительство (конфигурация «Конструкции») и имеют параметр Шаг.