isicad.ru :: портал САПР, PLM и ERP :: версия для печати

Статьи

14 декабря 2023

Переход с AutoCAD на nanoCAD: проблемы переноса самописных макросов и утилит

Виталий Власов, Максим Горнов, Евгений Нефедов

Виталий Власов Максим Горнов Евгений Нефедов


Авторы — сотрудники отдела сопровождения проектов ПИР, РН-БашНИПИнефть


AutoCAD является одним из самых популярных программных продуктов для компьютерного проектирования и черчения. Однако, в связи с растущей популярностью nanoCAD, многие пользователи и компании выбирают для работы именно его как альтернативу, благодаря низкой стоимости и совместимости с форматами DWG/DXF.

Язык Lisp и по сей день является довольно мощным инструментом, используемым в AutoCAD в виде встроенного AutoLISP и в отечественном nanoCAD, на который мы сейчас активно переходим.

Со времён создания Лисп было разработано много языков-потомков, их диалекты могут существенно различаться и быть несовместимыми. Именно с такой несовместимостью мы, как и многие наши коллеги, столкнулись в своей работе при переносе Lisp-программ из AutoCAD в nanoCAD. В этой статье мы хотели бы поделиться нашим опытом.

У нас в РН-БашНИПИнефть — крупнейшем проектном институте Роснефти — выполняется огромный объем проектно-изыскательных работ при обустройстве нефтегазовых месторождений. И зачастую стандартный функционал САПР программ не отвечает всем требованиям для быстрого и качественного выполнения поставленных задач. В таком случае мы дорабатываем программы своими силами путём разработки различных плагинов и утилит, тем самым расширяя возможности программ и адаптируя их под собственные нужды. Нами уже были реализованы плагины для AutoCAD с целью автоматизации производственных процессов. Например, программа для создания таблиц спецификаций в AutoCAD и Excel, генерация и заполнение штампов и прочее. Всё это реализовано при помощи AutoLISP.

Однако в nanoCAD встроен стандартный язык Лисп, и хотя обе эти платформы позволяют управлять данными и элементами чертежа при помощи Лисп-скриптов, некоторые действующие в AutoCAD функции там попросту не работают. Несмотря на то что nanoCAD предлагает большую часть функциональности AutoCAD, некоторые продвинутые возможности AutoCAD могут быть недоступны в нём. Так как nanoCAD имеет свой собственный API для разработки программных решений, переход может потребовать адаптации программного обеспечения, разработанного для AutoCAD, чтобы обеспечить его совместимость и эффективную работу в новой среде. Необходимо проводить тестирование и определять, какие функции и библиотеки используются в программе. Затем адаптировать код программы под nanoCAD, используя уже его аналогичные функции и библиотеки.

Есть следующий пример. При выполнении скрипта мы заметили, что в nanoCAD наш штамп остается пустым. Значит “MText” не создается, как в AutoCAD. Приняли решение заменить его на “StAddMtext”.

Штамп в AutoCAD

Штамп в AutoCAD

Штамп в AutoCAD

Штамп в nanoCAD

;; начало примера добавления объекта MText в пространство модели. См. Справка AutoCAD 2019
;; /Russian/Help/index.html#!/url=./filesACD/GUID-0A441CDB-21D3-4AA3-A616-7FF4DA8925D2.htm
;; (defun C:Example_AddMtext ()
;; (StAddMtext  0 100 5000 "AAAA dddd ccc" 5 300.0)
(defun StAddMtext (X Y width text just h / ; добавил параметры
               acadObj adoc modelSpace MTextObj corner) ; добавил лок. переменные
    (if (/= text " ")
    (progn
    (if IsTest (progn (princ "\n10 StAddMtext ")))	
;; Этот пример создает объект MText в пространстве модели.
    (vl-load-com)
    (setq acadObj (vx-get-acad-object))
    (setq adoc (v-get-ActiveDocument acadObj))
    
    ;; Определение многострочного текстового объекта
    (setq corner (vx-3d-point X Y 0)) ; точка вставки Mtext
    ; (setq width 5000)   ; ширина текста
    ; (setq text "This is the text String for the mtext Object") ; Текст

    ;; Создается объект mtext
    (setq modelSpace (if(and(zerop(getvar"tilemode"))(= 1 (getvar"cvport")))(v-get-PaperSpace adoc)(v-get-ModelSpace adoc))) 
    ;(setq modelSpace (v-get-ModelSpace adoc))
    (setq MTextObj (v-AddMText modelSpace corner width text))
    ;(v-ZoomAll acadObj)    ;
    ;(v-ZoomExtents acadObj) ; добавил
    ; (vx-ename->v-object (car (entsel))) ; добавил. Но это лишнее, если известен MTextObj
    ;(vx-dump-object(vx-ename->v-object (entst)))   ; добавил
    (if IsTest (progn (princ "\n10.1 ") (vx-dump-object MTextObj)))   ; добавил     
    ;далее взять свойства и задать AttachmentPoint = 5 (just=5)
    ;Lineweight = -1 - пользовательская высота по умолчанию, надо задать = 5
    ;(vx-put-property obj property arg)
    (vx-put-property MTextObj 'AttachmentPoint just)
    (vx-put-property MTextObj 'InsertionPoint (list X Y 0))
    (vx-put-property MTextObj 'Height h)
    (if IsTest (progn (princ "\n10.2 StAddMtext ")))
    (princ)
    );progn
    );end if
);
;; конец примера добавления объекта MText


Другой пример. Мультивыноска в AutoCAD и nanoCAD отличается DFX кодами и их структурой, а также именами свойств и их возможными параметрами.

Сравним DFX коды координат начала «полочки» относительно начальной точки линии выноски.

Данные определения объекта (часть списка):

((-1 . <Имя объекта: 230e01c0490>) (0 . "MULTILEADER") (330 . <Имя объекта: 230e01cb1f0>) (5 . "281") (100 . "AcDbEntity") ……)

AutoCAD nanoCAD
Слева: (176 . 2) на 19 позиции списка
Справа: (176 . 0) на 18 позиции списка
Слева: (11 -1.0 0.0 -1.0) на 55 позиции списка
Справа: (11 1.0 0.0 0.0) на 54 позиции списка


Этими записями меняется сторона, с которой будет выноска. Как видим, отличаются не только сами записи, но и их позиции в общем списке данных, которые можно получить через entget.

Из-за таких моментов скрипты AutoCAD отказываются работать в nanoCAD. Стоит отметить факт, что в AutoCAD есть встроенный редактор/отладчик VisualLISP в котором можно пошагово выполнить код и быстро найти место/переменную, где происходит ошибка, узнать значение и быстро разобраться в причинах ошибки. В nanoCAD есть некий «блокнот» (редактор скриптов), в котором максимум что можно увидеть — это подсветку синтаксиса. Не может быть никакой речи о быстрой отладке кода. Разработчик САПР эту функцию развивать не собирается и делает ставку на VBA и С#.

Для поиска ошибок в коде создателю скрипта (не только при переносе из AutoCAD) приходится иногда дробить блоки setq на более мелкие. И между ними, а также в других местах кода вставлять записи вида (princ "метка1…"), чтобы выявить место, где произошла ошибка.

DCL-диалоги также не остались без проблем, но их проблемы — это капля в море по сравнению с отсутствием отладчика Lisp в nanoCAD.

Однако разработчики не стоят на месте, и в nanoCAD версии 21.0 та же «MText» уже присутствует и прекрасно работает. Важно, что мы набили руку и сделали выводы на будущее. В целом перенос самописных программ из AutoCAD в nanoCAD может быть сложной задачей из-за различий в синтаксисе команд и структуре файлов. Однако с помощью правильного подхода и использования соответствующих инструментов можно избежать большинства проблем и успешно перенести программы и утилиты на новую платформу.


Альтернативой адаптации программ может служить технология ActiveX для написания макросов.

В AutoCAD и nanoCAD ActiveX используется для автоматизации рутинных задач, создания макросов, пользовательских интерфейсов и работы с внешними приложениями. Компоненты ActiveX могут быть написаны на любом языке программирования, который поддерживает COM, включая C++, C# и Visual Basic. Эта технология позволяет создавать компоненты программного обеспечения, которые могут быть использованы сразу в обеих программах.

Допустим, мы хотим создать простой макрос, который будет выводить сообщение с текстом, введенным пользователем в текстовое поле.

После создания проекта типа “ActiveX Control”, добавили на форму текстовое поле и кнопку “OK” и написали следующий код для обработки события нажатия на кнопку:


Private Sub CommandButton1_Click()
    MsgBox "Введенный текст: " & TextBox1.Text 
End Sub 


Скомпилировали проект и сохранили полученный файл с расширением “.ocx”. Теперь можно загрузить полученный файл в AutoCAD или nanoCAD, используя команду “APPLOAD”.

Или другой пример. Можно создать компонент с помощью текстового файла. Вставить в него код на языке Visual Basic, к примеру такой, написанный на скорую руку, для изменения цвета объекта на зелёный:


Public Sub ChangeColor()
    Dim obj As Object
    Set obj = GetObject(, "AutoCAD.Application")
    If obj Is Nothing Then
        Set obj = GetObject(, "nanoCAD.Application")
    End If
    If Not obj Is Nothing Then
        Dim selecSet As Object
        Set selecSet = obj.ActiveDocument.SelectionSets.Add("MySelectionSet")
        selSet.SelectOnScreen
        If selecSet.Count > 0 Then
            Dim ent As Object
            For Each ent In selecSet
                ent.color = 3 'зелёный цвет
            Next ent
        End If
        selecSet.Delete
    End If
End Sub


После чего сохранить этот текстовый файл в формате “.vbs” и загрузить в AutoCAD или nanoCAD, используя команду “SCRIPT”. Затем выбрать объекты, цвет которых нужно изменить, выполнить команду “SCRIPT” и выбрать загруженный файл.

Кроме того, использование ActiveX дает возможность использовать богатый функционал, который может быть доступен только через API других приложений.

Таким образом, разработка компонентов ActiveX выглядит более универсальным инструментом при автоматизации производственных процессов в nanoCAD или AutoCAD, так как компоненты могут быть использованы сразу в обеих программах при необходимости, что исключает проблемы при адаптации, рассмотренные в этой статье.

Все права защищены. © 2004-2025 Группа компаний «ЛЕДАС»

Перепечатка материалов сайта допускается с согласия редакции, ссылка на isicad.ru обязательна.
Вы можете обратиться к нам по адресу info@isicad.ru.