В статье рассмотрен один из вариантов автоматизации работы проектировщиков в САПР 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:
В появившемся окне подготовим основу будущей программы:
После явного объявления переменных работать с ними становится значительно удобнее: достаточно ввести имя переменной, поставить точку и программа подскажет все параметры и методы, относящиеся к объекту данного типа.
Текст после апострофа – комментарии к коду.
Объявим переменные с параметрами будущей фигуры и присвоим им значения:
Создадим новый слой, назначим ему толщину и цвет:
Предложим пользователю выбрать координаты вставки объекта:
Построение прямоугольника, состоящего из четырёх отрезков:
Построение размеров:
Вычислим площадь фигуры и вставим МТекст в центр прямоугольника:
Завершение базовой функции:
Для запуска написанной программы достаточно нажать F5 (после этого не забудьте указать точку вставки в nanoCAD). Результат работы программы представлен на картинке:
Пример демонстрирует возможность создания базовых примитивов. Больше информации по объектной модели nanoCAD можно найти на просторах сети интернет, в частности, на сайтах: vbamodel.narod.ru и www.alex160570.narod.ru/AcadVBA/vba01.htm
Стоит отметить, что писать так много строк однотипного кода, чтобы построить одну линию, трудоёмко и скучно, велика вероятность допустить ошибки. Для большего удобства можно создать пользовательские функции для построения отдельных примитивов. В качестве примера, рассмотрим функцию построения отрезка. Функция получает в качестве параметров координаты X и Y начала и конца отрезка и строит его:
Дополнительные пользовательские функции необходимо расположить после базовой функции, т.е. после строки End Sub, относящейся к базовой функции.
Теперь для построения прямоугольника можно использовать сокращённый код:
Аналогичные пользовательские функции можно написать для любых задач, которые необходимо выполнить больше одного раза. В тоже время, пользователю доступно множество операторов, таких как If...Then...Else, For...Next, Do...Loop и т.п. Для тех пользователей, которые только знакомятся с программированием, разобраться с возможностями языка не составит большого труда – для этого есть справка и многочисленные сайты с примерами решённых задач.
Для удобства запуска созданной программы можно расположить кнопку прямо на листе Excel. Для этого на вкладке «Разработчик» нужно выбрать «Вставить» – «Элемент управления формы» – «Кнопка»:
В появившемся окне выбрать нашу базовую функцию, после чего разместить кнопку на листе.
В один модуль можно добавить любое количество функций, создать для каждой функции кнопку и запускать их все из одного места.
Иногда возникает необходимость имитировать ввод каких-то команд в командную строку. Для этого можно использовать следующую конструкцию:
Данная команда построит окружность с центром в точке X:100, Y:100, Z:0 с радиусом 1000 единиц чертежа.
Для отладки создаваемых программ можно выводить данные в виде всплывающих окон или в командную строку nanoCAD. После выполнения следующего кода:
Появится диалоговое окно со значением переменной x1:
Для вывода текста в командную строку nanoCAD можно использовать следующий код:
На основе данного подхода нами разработана программа для автоматизации построения развёрток монолитных железобетонных стен. После задания исходных данных (около 30 параметров), на выходе получаем практически готовый чертёж стены с учётом фактической геометрии, наличия проёмов, примыкания других стен:
Такой подход к работе позволяет не только сократить время на подготовку документации в десятки, если не в сотни, раз, но и полностью исключить необходимость в её проверке.
В этой статье мы описали способы построения новых примитивов. Но объектная модель nanoCAD позволяет редактировать и существующие в чертеже примитивы, в том числе объекты nanoCAD СПДС — этому будет посвящена следующая статья.
Дмитрий Руденко, главный инженер проекта проектного бюро «Фордевинд»
Update (2014-10-06):
Видео с демонстрацией работы подобного скрипта:
Многие проектировщики используют 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):
Видео с демонстрацией работы подобного скрипта: