Pull to refresh

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

Reading time 6 min
Views 20K
В статье рассмотрен один из вариантов автоматизации работы проектировщиков в САПР nanoCAD, позволяющий в значительной степени использовать параметризацию построений и сокращать сроки выполнения различных задач.



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

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

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



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



Для удобства отладки кода необходимо подключить определённые библиотеки: в меню 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:



В появившемся окне подготовим основу будущей программы:
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). Результат работы программы представлен на картинке:



Пример демонстрирует возможность создания базовых примитивов. Больше информации по объектной модели 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. Для этого на вкладке «Разработчик» нужно выбрать «Вставить» – «Элемент управления формы» – «Кнопка»:



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





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

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

    ThisDrawing.SendCommand "CIRCLE" & vbCr & "100,100,0" & vbCr & "1000" & vbCr

Данная команда построит окружность с центром в точке X:100, Y:100, Z:0 с радиусом 1000 единиц чертежа.

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

    MsgBox "x1: " & x1

Появится диалоговое окно со значением переменной x1:



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

    ThisDrawing.Utility.Prompt "x1: " & x1 & " y1: " & y1

На основе данного подхода нами разработана программа для автоматизации построения развёрток монолитных железобетонных стен. После задания исходных данных (около 30 параметров), на выходе получаем практически готовый чертёж стены с учётом фактической геометрии, наличия проёмов, примыкания других стен:



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

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

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

Update (2014-10-06):
Видео с демонстрацией работы подобного скрипта:

Tags:
Hubs:
+10
Comments 2
Comments Comments 2

Articles