Управление AutoCAD из VB приложения

Автор: | 05.02.2018

Основы COM автоматизации
Простейший пример управление AutoCAD из VB приложения
Создание чертежа на основе пространственной модели
Моделирование процесса нарезания резьбы
Отличительные особенности VBA приложений

Основы COM (Component Object Model) автоматизации

COM-автоматизация – технология, с помощью которой приложения, написанные на различных языках программирования, могут получать функциональность программных систем (AutoCAD, Word, Excel и др.). Объектная модель приложения определяет иерархию объектов. Доступ к какому-либо свойству (или методу) конкретного объекта осуществляется через указание всех объектов в иерархической последовательности от корневого объекта (Application) и ниже.

Например, возможность обращения к командной строке из программы, написанной на языке VB, реализуется через метод SendCommand объекта ActiveDocument:

Set acadApp = CreateObject(, "AutoCAD.Application")
Set SelSets=acadApp.ActiveDocument.SendCommand "Redraw"

Простейший пример управление AutoCAD из VB приложения

Ниже рассматривается простейший пример программы с загрузкой системы AutoCAD и управление через свойства и методы объекта Circle непосредственно из VB приложения.

В Visual Studio создайте VB проект c прототипом Windows Forms Application. На форме разместите 4 командных кнопки. При запуске VB приложения загружается диалоговое окно и запускается AutoCAD. При выборе кнопок в последовательности сверху вниз соответственно выполняются действия:

  1. создается окружность;
  2. изменяется положение ее центра;
  3. создается окружность на расстоянии (метод «Offset«);
  4. осуществляется выход из программы с выгрузкой AutoCAD.

При разработке проекта приложения необходимо подключить к проекту библиотеки AutoCAD. Для этого выберите кнопки меню Project>Add Reference , раздел COM и отметьте флажок AutoCAD 20… Type Library. Текст программы приводится ниже:

Public Class Form1
Dim acadApp As Object
Dim acadDoc As Object
Dim CircleObj As Object
Dim centerPoint(0 To 2) As Double
Dim newCenterPt(0 To 2) As Double
Dim radius As Integer
Dim dist As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
acadApp = CreateObject("AutoCAD.Application")
acadApp.Visible = True
acadApp.Documents.Add()
acadDoc = acadApp.ActiveDocument
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
centerPoint(0) = 0 : centerPoint(1) = 0 : centerPoint(2) = 0
radius = 50
CircleObj = acadDoc.ModelSpace.AddCircle(centerPoint, radius)
CircleObj.Update()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
newCenterPt(0) = 25 : newCenterPt(1) = 25 : newCenterPt(2) = 0
CircleObj.Center = newCenterPt
CircleObj.Update()
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
dist = 50
CircleObj.Offset(dist)
CircleObj.Update()
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
acadDoc.Close(False)
acadApp.Quit()
'Уничтожаем ссылку на объект
acadApp = Nothing
End
End Sub
End Class

Создание чертежа на основе пространственной модели

 Постановка задачи. Разработать программный продукт, обеспечивающий создание в системе AutoCAD комплексного чертежа из 3-х проекций и аксонометрии.

Для решения задачи создается VB проект, который обеспечивает запуск AutoCAD, загрузку и запуск 2-х VLisp приложений.

В файле mod3d.lsp описывается создание 3D модели объекта, файле pro3.lsp – создание комплексного чертежа из 3-х проекций и аксонометрии объекта.

Модуль класса формы VB проекта

Public Class Form
Dim acadApp As Object
Dim acadDoc As Object
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'Считывание параметров из TextBox в файл обмена
Dim FPath1 As String
FPath1 = "d:\sv\mod\a.txt"
Dim FNum1 As Integer
FNum1 = FreeFile()
'Открытие файла a.txt
FileOpen(FNum1, FPath1, OpenMode.Output)
Dim strA As String
strA = TextBox1.Text
PrintLine(FNum1, strA)
strA = TextBox2.Text
PrintLine(FNum1, strA)
strA = TextBox3.Text
PrintLine(FNum1, strA)
FileClose(FNum1)
'Запуск AutoCAD
acadApp = CreateObject("AutoCAD.Application")
acadApp.Visible = True
acadApp.Documents.Add()
acadDoc = acadApp.ActiveDocument
'С командной строки загружаются файлы и запускаются команды
acadDoc.SendCommand("(load ""d:/sv/mod/mod3d.lsp"") mod3d ")
acadDoc.SendCommand("(load ""d:/sv/mod/pro3.lsp"") pro3 ")
' Обновляем AutoCAD
acadApp.Update()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
acadDoc.Close(False)
acadApp.Quit()
'Уничтожаем ссылку на объект
acadApp = Nothing
End
End Sub
End Class

Файл mod3d.lsp

(defun c:mod3d ()
(setq f (open "d:/sv/mod/a.txt" "r"))
(setq p1(atof (read-line f)))
(setq p2 (atof (read-line f)))
(setq p3 (atof (read-line f)))
(close f)
(command "OSNAP" "None")
(command "rectangle" (list (/ p1 2) (/ p2 2)) (list (- (/ p1 2)) (- (/ p2 2))))
(setq ent1 (entlast))
(command "extrude" ent1 "" p3 "")
)


Структура приложения позволяет разрабатывать комплексный чертеж для любого пространственного объекта. При этом модифицируется только лишь файл mod3d.lsp.

Задание: Модифицируйте файл mod3d.lsp, обеспечив создание в AutoCAD модели в соответствии с вариантом задания.

Моделирование процесса нарезания резьбы

Ниже описывается программа, обеспечивающая моделирование процесса нарезания резьбы с использованием методов и свойств объектов AutoCAD.

Откройте в AutoCAD чертеж Винт.dwg.

Создайте VB проект с формой, на которой размещены две командные кнопки. Одна из кнопок запускает процесс нарезания резьбы, вторая выгружает AutoCAD и закрывает форму. Подключите к проекту библиотеку AutoCAD. Для этого выберите кнопки меню Project>References и отметьте флажок AutoCAD 20… Type Library.

Скопируйте листинг программы (см. ниже) в окно кода. Ознакомьтесь с описанием программы, модифицируйте ее, если необходимо. Протестируйте программу.

Запустите AutoCAD и откройте чертеж-прототип Винт.dwg. При запуске программы (загрузке формы) и нажатии кнопки cmdStart устанавливается связь с этим чертежом-прототипом.

Листинг программы:

Public Class Form1
Dim acadApp As Object
Dim acadDoc As Object
Private Sub cmdStart_Click(sender As Object, e As EventArgs) Handles cmdStart.Click
Const Pi As Double = 3.141592635
Dim FIPOD As Double 'Угол подъема винтовой линии
Dim SHAG As Double 'Шаг винтовой лиинии
Dim RADIUS As Double 'Радиус цилиндра винтовой линии
Dim RZ As Object
Dim TS As Object
Dim RZCOPY As Object
Dim I As Integer
Dim sset As Object
Dim ent1 As Object
Dim ITERA As Integer
acadApp = GetObject(, "AutoCAD.Application")
acadApp.Visible = True
'AppActivate("AutoCAD") '- Активация окна "AutoCAD"
acadDoc = acadApp.ActiveDocument
sset = acadDoc.SelectionSets.Add("SS1")
sset.SelectOnScreen()
For Each ent1 In sset
If ent1.EntityName = "AcDb3dSolid" Then
If ent1.Layer = "ВИНТ" Then TS = ent1
If ent1.Layer = "ГРЕБЕНКА" Then RZCOPY = ent1
End If
Next
sset.Delete()
sset = Nothing
'Параметры резьбы
SHAG = 12.0#
RADIUS = 23.0#
FIPOD = Math.Atan(SHAG / (2 * Pi * RADIUS))
ITERA = 32 'Число итераций на оборот
Dim P1(0 To 2) As Double : Dim P2(0 To 2) As Double
Dim rAngle As Double 'In Radian
P1(0) = 90.0# : P1(1) = 0.0# : P1(2) = 0.0#
P2(0) = 90.0# : P2(1) = 1.0# : P2(2) = 0.0#
'Вращение гребенки на угол подъема
Call RZCOPY.Rotate3D(P1, P2, FIPOD)
P1(0) = 0.0# : P1(1) = 0.0# : P1(2) = 0.0#
P2(0) = SHAG / ITERA : P2(1) = 0.0# : P2(2) = 0.0#
rAngle = (2 * Pi) / ITERA
For I = 1 To ITERA
RZ = RZCOPY.Copy
Call TS.Boolean(2, RZ) 'Вычитание
Call TS.Rotate3D(P1, P2, rAngle) 'Вращение
Call TS.Move(P1, P2)
TS.Update()
Next I
End Sub
Private Sub cmdExit_Click(sender As Object, e As EventArgs) Handles cmdExit.Click
acadDoc.Close(False)
acadApp.Quit()
'Уничтожаем ссылку на объект
acadApp = Nothing
End
End Sub
End Class

При нажатии кнопки Start и указании на запрос AutoCAD объектов чертежа осуществляется поворот гребенки на угол подъема и пошаговое вращение цилиндрического стерженя. На каждом шаге осуществляется булева операция «Вычитание» – от тела стержня вычитается тело гребенки. Результат отображается в AutoCAD .

Отличительные особенности VBA приложений

Язык программирования VisualBasic for Applications (VBA) является такой же встроенной в AutoCAD средой, как и VisualLISP среда. VBA обеспечивает более удобную среду для создания диалоговых окон по сравнению с совместным использованием для этой цели языков VLISP и DCL. Однако, VLISP более прост для программирования графических операций.  К тому же графические действия выполняются на VBA медленнее, поскольку они осуществляются опосредовано через интерфейс COM-автоматизации.

Различия между VBA и VB:

  • VBA запускается в том же самом рабочем пространстве, как и AutoCAD, обеспечивая очень быструю среду программирования.
  • VBA имеет собственный набор объектов, ключевых слов, констант, и т. д., который обеспечивает управление, отладку и выполнение программы.
  • VBA не поддерживает создание выполнимых (executables) программ.
  • VBA обеспечивает связь с активным рисунком в текущем AutoCAD сеансе через объект ThisDrawing. Используя ThisDrawing Вы получаете непосредственный доступ к текущему объекту Document, всем методам, свойствам, и другим объектам в иерархии.

AutoCAD позволяет хранить VBA проекты или как часть документа (вложенный проект), или как отдельный файл с расширением «dvb» (глобальный проект). Вложенные проекты сохраняются внутри рисунка AutoCAD. Эти проекты автоматически загружаются всякий раз, когда рисунок, в котором они содержатся, открыт в AutoCAD. Вложенные проекты не способны открывать или закрыть AutoCAD рисунки, поскольку они функционируют только внутри документа. Глобальные проекты сохраняются в отдельных файлах, они могут работать, открывая и закрывая любой рисунок AutoCAD. Рисунок может иметь только один вложенный проект и любое число глобальных проектов.

Если VBA не поддерживает создание выполнимых (executables) программ. Тогда возникает вопрос, каким образом запускается VBA приложение? Прежде всего, введем новый термин Макрокоманда (Macros) – это VBA подпрограмма, записанная в модуле ThisDrawing или Module. Каждая подпрограмма, записанная в этих модулях, может запускать VBA приложение. Для запуска приложения необходимо выделить имя макроса в диалоговом окне Macros (вызывается из среды AutoCAD кнопками меню Tools>Macro>Macros) и щелкнуть на кнопке Run.

Макросы можно запустить не только из диалогового окна, но и с командной строки, например:

VBARUN Module1.Drawline
VBASTMT RunMacro"Module1.Drawline"

Предварительно командой VBALOAD должен быть загружен проект, запускаемый макросом.

VLISP также позволяет запустить VBA (функция vl-vbarun), однако данные одной среды (переменные и константы) не могут быть видимы из другой среды. В этом случае существует единственная возможность обмена информацией – запись данных в файл одной программой и считывание данных из другой программы.

 

 

Автор: Николай Свирневский

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *