Автоматизация работы в nanoCAD с помощью Visual Basic for Applications

В статье рассмотрен один из вариантов автоматизации работы проектировщиков в САПР nanoCAD, позволяющий в значительной степени использовать параметризацию построений и сокращать сроки выполнения различных задач.59139323e2de450c979d0a753e5e0984.jpg

Многие проектировщики используют MS Excel для выполнения математических вычислений в табличной форме. Однако, функционал программы этим не ограничивается. С помощью встроенного в продукты Microsoft Office языка программирования Visual Basic for Applications (VBA) можно взаимодействовать с объектной моделью nanoCAD (и другими продуктами на её платформе). В данной статье мы на простом и универсальном примере продемонстрируем такую возможность — создадим и настроим слои, начертим прямоугольник, проставим к нему размеры и добавим текст, содержащий значение площади фигуры.

В примере используются MS Excel 2010 и nanoCAD 5.0, но версия программных продуктов не имеет особого значения.

Для начала необходимо запустить Excel и подготовить данные для построения:

76ed3379b9a944b8b85b100fe4e38a3f.PNG

Данные в ячейках B1 и B2 записаны простым числом, но они могут быть вычислены и с помощью формулы. Теперь необходимо переключиться на встроенную в Excel систему разработки и отладки программного кода — нажимаем Alt + F11. Появляется окно среды разработки:

d7eb7625154e4c8ab153b57d21bb3be0.PNG

Для удобства отладки кода необходимо подключить определённые библиотеки: в меню Tools выбираем пункт References… и подключаем nanoCAD Type Library (NCAuto.dll) и OdaX Type Library (OdaX_csd.dll). По умолчанию обе библиотеки расположены в папке: C:\Program Files\Nanosoft\nanoCAD 5.0\bin\.

Теперь необходимо создать модуль. Правый клик в дереве проекта по папке Microsoft Excel Objects, в выпадающем списке выбираем Insert — Module:

17f07d80016d4a63b873eb8b990aaa52.png

В появившемся окне подготовим основу будущей программы:

Option Explicit 'требует явного объявления всех переменных в файле Public app As nanoCAD.Application 'глобальная переменная приложения nanoCAD Public ThisDrawing As nanoCAD.Document 'глобальная переменная, отвечающая за активный документ nanoCAD Sub my_drawing () 'функция построения объектов Set app = GetObject (», «nanoCAD.Application») 'подключаемся к nanoCAD app.Visible = True 'переключаем фокус на окно nanoCAD Set ThisDrawing = app.ActiveDocument 'подключаемся к активному документу, открытому в nanoCAD После явного объявления переменных работать с ними становится значительно удобнее: достаточно ввести имя переменной, поставить точку и программа подскажет все параметры и методы, относящиеся к объекту данного типа.Текст после апострофа — комментарии к коду.Объявим переменные с параметрами будущей фигуры и присвоим им значения: Dim r_height As Double, r_width As Double 'переменные, содержащие числа двойной точности r_height = Range («B1»).Value 'высота прямоугольника r_width = Range («B2»).Value 'ширина прямоугольника Создадим новый слой, назначим ему толщину и цвет: Dim layer As AcadLayer 'переменная типа «слой» Set layer = ThisDrawing.Layers.Add («Автоматические построения») 'создаём новый слой layer.Color = 21 'бледно-красный цвет layer.LineWeight = acLnWt050 'толщина линии 0.50 мм ThisDrawing.ActiveLayer = layer 'переключаем текущий слой на созданный Предложим пользователю выбрать координаты вставки объекта: Dim insert_point () As Double 'массив переменных, содержащих числа двойной точности insert_point = ThisDrawing.Utility.GetPoint (»0,0,0», «Укажите точку вставки объекта») 'теперь в переменной insert_point (0) содержится координата X, указанная пользователем на экране, 'в переменной insert_point (1) содержится координата Y, а в переменной insert_point (2) — координата Z Построение прямоугольника, состоящего из четырёх отрезков: Dim x1 As Double, x2 As Double, y1 As Double, y2 As Double x1 = insert_point (0) 'координата по Х левой грани x2 = x1 + r_width 'координата по Х правой грани y1 = insert_point (1) 'координата по У нижней грани y2 = y1 + r_height 'координата по У верхней грани Dim pt1(2) As Double, pt2(2) As Double, pt3(2) As Double, pt4(2) As Double 'создаём 4 массива переменных, отвечающих за координаты углов прямоугольника в пространстве pt1(0) = x1 'Х нижнего левого угла pt1(1) = y1 'У нижнего левого угла pt2(0) = x2 'Х нижнего правого угла pt2(1) = y1 'У нижнего правого угла pt3(0) = x2 'Х верхнего правого угла pt3(1) = y2 'У верхнего правого угла pt4(0) = x1 'Х верхнего левого угла pt4(1) = y2 'У верхнего левого угла Dim obj As AcadLine 'переменная типа «линия» Set obj = ThisDrawing.ModelSpace.AddLine (pt1, pt2) 'построение нижней грани Set obj = ThisDrawing.ModelSpace.AddLine (pt2, pt3) 'построение правой грани Set obj = ThisDrawing.ModelSpace.AddLine (pt3, pt4) 'построение верхней грани Set obj = ThisDrawing.ModelSpace.AddLine (pt4, pt1) 'построение нижней грани Построение размеров: Dim pt5(2) As Double, pt6(2) As Double pt5(0) = (x1 + x2) / 2 'Х текста горизонтального размера pt5(1) = y1 — 500 'У текста горизонтального размера pt6(0) = x2 + 500 'Х текста вертикального размера pt6(1) = (y1 + y2) / 2 'У текста вертикального размера Dim dimrot As AcadDimRotated 'переменная типа «повёрнутый размер» Set dimrot = ThisDrawing.ModelSpace.AddDimRotated (pt1, pt2, pt5, 0) 'строим горизонтальный размер Set dimrot = ThisDrawing.ModelSpace.AddDimRotated (pt2, pt3, pt6, 3.1416 / 2) 'строим вертикальный размер 'последний параметр в скобках определяет угол поворота размера в радианах Вычислим площадь фигуры и вставим МТекст в центр прямоугольника: Dim pt7(2) As Double pt7(0) = (x1 + x2) / 2 'Х текста площади pt7(1) = (y1 + y2) / 2 'У текста площади Dim txt As AcadMText 'переменная типа «Мтекст» Set txt = ThisDrawing.ModelSpace.AddMText (pt7, 3000, CStr ((x2 — x1) * (y2 — y1) / 1000000)) 'второй параметр определяет длину Мтекста, третий параметр — текст Мтекста txt.AttachmentPoint = acAttachmentPointMiddleCenter 'изменение свойства Мтекста «Выравнивание» на «Середина по центру» Завершение базовой функции: End Sub Для запуска написанной программы достаточно нажать F5 (после этого не забудьте указать точку вставки в nanoCAD). Результат работы программы представлен на картинке: 81eb35ada1df4f6dbede1ef0d48bd1d7.PNG

Пример демонстрирует возможность создания базовых примитивов. Больше информации по объектной модели nanoCAD можно найти на просторах сети интернет, в частности, на сайтах: vbamodel.narod.ru/ и www.alex160570.narod.ru/AcadVBA/vba01.htm

Стоит отметить, что писать так много строк однотипного кода, чтобы построить одну линию, трудоёмко и скучно, велика вероятность допустить ошибки. Для большего удобства можно создать пользовательские функции для построения отдельных примитивов. В качестве примера, рассмотрим функцию построения отрезка. Функция получает в качестве параметров координаты X и Y начала и конца отрезка и строит его:

Sub my_line (x1 As Double, y1 As Double, x2 As Double, y2 As Double) Dim pt1(2) As Double, pt2(2) As Double pt1(0) = x1 'Х первой точки отрезка pt1(1) = y1 'У первой точки отрезка pt2(0) = x2 'Х второй точки отрезка pt2(1) = y2 'У второй точки отрезка Dim obj As AcadLine Set obj = ThisDrawing.ModelSpace.AddLine (pt1, pt2) 'построение отрезка из первой точки во вторую End Sub Дополнительные пользовательские функции необходимо расположить после базовой функции, т.е. после строки End Sub, относящейся к базовой функции.Теперь для построения прямоугольника можно использовать сокращённый код: Dim x1 As Double, x2 As Double, y1 As Double, y2 As Double x1 = insert_point (0) 'координата по Х левой грани x2 = x1 + r_width 'координата по Х правой грани y1 = insert_point (1) 'координата по У нижней грани y2 = y1 + r_height 'координата по У верхней грани my_line x1, y1, x2, y1 'построение нижней грани my_line x2, y1, x2, y2 'построение правой грани my_line x2, y2, x1, y2 'построение верхней грани my_line x1, y2, x1, y1 'построение нижней грани Аналогичные пользовательские функции можно написать для любых задач, которые необходимо выполнить больше одного раза. В тоже время, пользователю доступно множество операторов, таких как If…Then…Else, For…Next, Do…Loop и т.п. Для тех пользователей, которые только знакомятся с программированием, разобраться с возможностями языка не составит большого труда — для этого есть справка и многочисленные сайты с примерами решённых задач.Для удобства запуска созданной программы можно расположить кнопку прямо на листе Excel. Для этого на вкладке «Разработчик» нужно выбрать «Вставить» — «Элемент управления формы» — «Кнопка»:

751f256ded74412888ed5cb9086a5e6a.png

В появившемся окне выбрать нашу базовую функцию, после чего разместить кнопку на листе.

9484fe25b9c94ea0aac2c47fd0bff5b1.png

7ef92834103e4e93a7ee5103a08676d5.PNG

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

Иногда возникает необходимость имитировать ввод каких-то команд в командную строку. Для этого можно использовать следующую конструкцию:

ThisDrawing.SendCommand «CIRCLE» & vbCr & »100,100,0» & vbCr & »1000» & vbCr Данная команда построит окружность с центром в точке X:100, Y:100, Z:0 с радиусом 1000 единиц чертежа.Для отладки создаваемых программ можно выводить данные в виде всплывающих окон или в командную строку nanoCAD. После выполнения следующего кода:

MsgBox «x1:» & x1 Появится диалоговое окно со значением переменной x1: e61ed685501442f0b0e8a71991d4eba4.PNG

Для вывода текста в командную строку nanoCAD можно использовать следующий код:

ThisDrawing.Utility.Prompt «x1:» & x1 & » y1:» & y1 На основе данного подхода нами разработана программа для автоматизации построения развёрток монолитных железобетонных стен. После задания исходных данных (около 30 параметров), на выходе получаем практически готовый чертёж стены с учётом фактической геометрии, наличия проёмов, примыкания других стен: 8b27926a5de3475da1bd12a7da8a19e0.PNG

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

В этой статье мы описали способы построения новых примитивов. Но объектная модель nanoCAD позволяет редактировать и существующие в чертеже примитивы, в том числе объекты nanoCAD СПДС — этому будет посвящена следующая статья.

Дмитрий Руденко, главный инженер проекта проектного бюро «Фордевинд»

© Habrahabr.ru