Логотип сайта поддержки пользователей САПРО сайте поддержки пользователей САПР Translate to:

ActiveX Automation для AutoCAD.

Cоставил Ткаченко В.Б. http://www.cad.dp.ua/

Содержание:

Введение.

В AutoCAD R14 ActiveX Automation обеспечивает альтернативу Autolisp, хотя и не предназначена для его замены. Наиболее популярный контроллер автоматизации - Visual Basic. Интерфейс автоматизации для AutoCAD похож на интерфейс автоматизации для Excel и Access. В частности это потому, что в AutoCAD в качестве контроллера автоматизации включен Microsoft Visual Basic for Applications (VBA), который включен и в приложения Microsoft Office 97.

Термины и определения:

Контроллер автоматизации - приложение, которое управляет служебным приложением. Так AutoCAD является служебным приложением по отношению к VBA или Visual Basic, которые действую в качестве контроллера автоматизации.

Объект AutoCAD - элемент AutoCAD (отрезок, UCS или слой - к примеру). Каждый объект AutoCAD имеет набор методов и свойств. (функций, которые устанавливают или возвращают информацию о объекте), и допускается использовать только стандартный набор функций для программирования отдельного объекта.

Свойство - представляет атрибут объекта и может быть "только для чтения" или для "чтения - записи". Программа может назначать новое свойство для свойств "чтения - записи", и лишь обращаться к значению свойств "только для чтения".

Методы - это функции (типа Move, Copy, Regen и Save), которые выполняют действия по отношению к объекту. Метод может возвращать значение, а также принимать любое число аргументов, каждый из которых может быть не обязательным. Аргументы передаются с помощью значения или ссылки.

Объектная модель AutoCAD представляет собой доступные объекты AutoCAD и их взаимосвязи. На рисунках 1 и 2 представлен краткий обзор этих связей.
Иерархическое взаимодействие между
объектами в объектной модели Autocad.
Рис. 1. Иерархическое взаимодействие между объектами в объектной модели Autocad.
Рис. 2. Иерархическое взаимодействие между
объектами в объектной модели Autocad (продолжение).
Рис. 2. Иерархическое взаимодействие между объектами в объектной модели Autocad (продолжение).

Использование объектного броузера Visual Basic 5.0 или VBA для просмотра Active-X объектов Autocad.

Объекты автоматизации можно просматривать через объектный броузер, котрый поставляется вместе с Visual Basic 5.0 или VBA (в дальнейшем пойдет речь только о Visual Basic 5.0 посколько не смотря на наличии в документации к AutoCAD упоминаний о присутствии в дистрибутиве программы VBA не на одном из умевшихся у меня дистрибутивов его обнаружить не удалось :-(). Объектный броузер позволяет видеть полный спсок объектов, доступных в приложении вместе со свойствами и методами, приминимыми к данному объекту.

Меню доступных объектов Visual Basic 5.0
Рис. 3. Меню доступных объектов Visual Basic 5.0
Для просмотра библиотеки типов объектов Autocad необходимо выполнить следующие шаги:
  1. Из меню Project выбрать References (рис. 3).
  2. В диалоговом окне References выбрать AutoCAD Object Library, или если же ее нет в списке доступных ссылок, выбрать кнопку Browse и указать файл acad.tlb в каталоге исполняемых программ Autocad.
  3. В меню View выбрать Object Browser. Как показано на рисунке 4, левый столбец объектного броузера содержит список объектов для выбранного приложения, в правом же столбце отображаются свойства и методы, связанные с подсвеченным объектом (рис. 4).
Объектный броузер в Visual Basic 5.0
Рис. 4. Объектный броузер в Visual Basic 5.0

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

Что бы получить интерактивную справку для специфического метода или свойства объекта сначала подсвечивают объект в левом столбце, затем элемент в правом столбце, а после этого выполняют щелчек мышью на кнопке с вопросительным знаком.

Пример написание подпрограммы для AutoCAD с помощью Visual Basic 5.0 или VBA.

Загружаем Visual Basic 5.0 с заданной по умолчанию формой (standard exe). Для начала разместим на поле формы ( 2 - на рисунке 5) кнопки из панели инструментов ( 1 - на рисунке 5). Делается это сначала щелчком мыши на элементе панели инструментов, а затем щелчком на форме, и не отпуская мыши растягиванием элемента из панели инструментов на поле формы до приемлимой величины. Разместите таким образом 2 кнопки (CommandButton) и один переключатель (CheckBox) на поле формы как показано на рисунке 5. Затем на панели свойств элементов ( 3 - на рисунке 5) выполните следующие изменения:

Поле формы (Form1):
Caption: Exercise 1
Scalemode: 2-Point

Поле первой кнопки (CommandButton1):
Caption: Start AutoCAD
Name: cmdStart

Поле второй кнопки (CommandButton2):
Enabled: False
Caption: Quit
Name: cmdQuit

Поле Переключателя (CheckBox1):
Caption: Visible
Name: cmdVisible

Далее введем в нашу форму немного программного кода: двойным нажатием мыши на кнопку Start AutoCAD перейдем в режим ввода кода и занесем следующие строки между строками Private Sub cmdStart_Click() и End Sub:

On Error Resume Next
Set acad = GetObject(, "AutoCAD.Application")
            If Err Then
               Err.Clear
               Set acad = CreateObject("AutoCAD.Application")
                If Err Then
                   MsgBox "Unable to connect to AutoCAD"
                   Exit Sub
                End If
            End If
cmdQuit.Enabled = True

Функция GetObject устанавливает связь между приложением и AutoCAD, если AutoCAD уже запущен. Эта функция возвращает объект AutoCAD.Application и сохраняет его в переменной acad. CreateObject начинает новый сеанс AutoCAD.

В контекстном меню, появившемся после нажатия правой кнопкой мыши на окне кода выберите Hide, чтобы скрыть код и двойным нажатием на кнопке Quit снова перейдите в режим ввода кода, что бы ввести код и для этой кнопки (в данном случае команду завершения сеанса AutoCAD):

acad.Quit
End

То же для СheckBox1:

acad.Visible = True

По умалчанию в этой программе AutoCAD запускается невидимо для пользователя (не отображается на панели задач). Это свойство можно использовать к примеру для его вызова, выполнения какой-то последовательности операций без вмешательства пользователя а затем выхода. Без необходимости регенирировать графический экран эти операции будут выполнены быстрее. Таким образом, когда мы с помощью данной подпрограммы запустим AutoCAD, то он буде не виден на экране. Когда же мы установим галочку на переключателе Visible, он отобразится на экране.

В верхней части окна кода выберите в раскрывающемся списке поле "(General)" и затем в месте кода формы, куда переместится курсор введите строку:

Public acad As Object

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

Теперь подпрограмма готова к работе. Запустите ее из меню Run пунктом Start With Full Compile, предварительно не забыв подключить VBA AutoCAD как расказано в разделе Использование объектного броузера Visual Basic 5.0 или VBA для просмотра Active-X объектов Autocad..

Объект Application, который успользовался в нашем примере, является объектом верхнего уровня. Все другие объекты могут быть достигнуты через методы и свойства объекта Application. Лучьшим средством получения справки о иерархии объекта Application является стандартный Help AutoCAD. В меню Help Выберите пункт Contents, а там раздел ActiveX Automation, подраздел ActiveX Automation Reference. Далее выбираем Object Model. Появляется схема схожая с показанными на Рис. 1 и 2. Выбор любого элемента схемы влечет за собой появление справки с перечислением доступных методов и свойств для данного элемента.

Рабочий стол Visual Basic 5.0
Рис. 5. Рабочий стол Visual Basic 5.0

Использование средства ActiveX для обеспечения связи AutoCAD с другими приложениями.

Можно использовать VBA, поставляемый с Office 97 или другими программами для создания перекрестно ссылающихся программ, используя объекты из различных приложений. Рассмотрим пример такого использования создав приложение, связывающее AutoCAD, Microsift Excel и Microsoft Word. Функция приложения будет состоять в подсчете числа блоков и случаев их использования в чертеже. На основании полученных данных строится график, на основании которого генерируется документ в Microsoft Word.

Сначала откроем для редактирвание макрос в Microsoft Excel, выбрав пункт "Редактор Microsoft Visual Basic" из подменю "Макрос" меню "Сервис". В поле кода введем следующие:

Public acad As Object
Public excelSheet As Object
Sub CountBlocks()
Dim objMspace As Object
Dim objElement As Object
Dim objExcel As Object
Dim objDoc As Object
Dim intI As Integer
Dim strBlockName(1 To 1000) As String
Dim intNumBlockName(1 To 1000) As Integer
Dim intTotalNumOfBlocks As Integer
Set objExcel = GetObject(, "Excel.Application")
Set objExcelSheet = objExcel.ActiveWorkbook.Sheets("Лист1")
Worksheets("Лист1").Activate
On Error Resume Next
Set objAcad = GetObject(, "AutoCAD.Application")
If Err <> 0 Then
Set objAcad = CreateObject("AutoCAD.Application")

Exit Sub
End If
obj.acad.Visible = True
    Set obj.Doc = objAcad.ActiveDocument
                If Right(ActiveWorkbook.Path, 1) = "\" Then
        DwgName = ActiveWorkbook.Path & "ew.dwg"
    Else
        DwgName = ActiveWorkbook.Path & "\ew.dwg"
    End If
    Set objDoc = objAcad.ActiveDocument
    If objDoc.FullName <> DwgName Then
        objDoc.Open DwgName
    End If
    Set objMspace = objDoc.ModelSpace
    objExelSheet.Range(Cells(1, 1), Cells(100, 12)).Clear
    intI = 1
    For Each objElement In objDoc.Blocks
        With objElement
            If (.Name <> "*MODEL_SPACE" And .Name <> "PAPER_SPACE") Then
objExcelSheet.Cells(intI, 1) = objElement.Name
strBlockName(intI) = objElement.Name
    intI = intI + 1
End If
End With
Next
    intI = intI - 1
    intTotalNumOfBlocks = intI
    For intI = 1 To intTotalNumOfBlocks
        intNumBlockName(intI) = 0
    Next
    objExcelSheet.Range(Cells(1, 1), Cells(intI, 1)).Font.Bold = True
For Each objElement In objMspace
With objElement
    Found = False
    If StrComp(objElement.entityName, "AcDbBlockReference", 1) = 0 Then
        For intI = 1 To intTotalNumOfBlocks
            If Not Found Then
                If StrComp(.Name, strBlockName(intI), 1) = 0 Then
                    intNumBlockName(intI) = intNumBlockName(intI) + 1
                    Found = True
                End If
            End If
        Next
    End If
End With
Set objElement = Nothing

Next objElement
    For intI = 1 To intTotalNumOfBlocks
        objExcelSheet.Cells(intI, 2) = intNumBlockName(intI)
    Next
    CreateChart (intTotalNumOfBlocks)
    Auto_Wait
    MakeMemos

End Sub

В подпрограмме CountBlocks сначала происходит соединение с текущим образцом приложения Excel с помощью функции GetObject. Далее активизируется Лист1 в Excel, этот лист делается текущим и в него записуется перечень блоков. Затем циклически просматривается база данных AutoCAD с отождествлением каждого блока и сохранением информации в переменной strBlockName, а также с его записью на странице Excel. Далее снова производится циклический просмотр базы данных и добавляется перечень для каждого блока в переменной intNumBlockName.

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

Private Sub CreateChart(NumberOfBlocks As Integer)
Dim ChartRange As Object
Static NewChart As Object
Set ChartRange = ActiveSheet.Range(Cells(1, 1), _
    Cells(NumberOfBlocks, 2))
ChartRange.Select
Set NewChart = Charts.Add
NewChart.Activate
With NewChart
        .Type = xl3DColumn
        '.SubType = xlNormal
        .CopyPicture xlScreen, xlBitmap
End With
End Sub

В функции CreateChart происходит установка ввода диапазона значений для диаграммы, добавление диаграммы к набору Excel Charts, активизация диаграммы и копирование ее в буфер обмена.

Далее напишем подпрограмму получения системной даты для ввода ее в документ Word. Эта подпрограмма также добавляет интервал ожидания в четыре секунды, чтобы дать время Microsoft Excel для завершения создания объекта в виде диаграммы прежде, чем Excel запустит Word.

Private Sub Auto_Wait()

    Dim NewHour As Double
    Dim NewMinute As Double
    Dim NewSecond As Double
    Dim WaitTime As Date
    NewHour = Hour(Now())
    NewMinute = Minute(Now())
    NewSecond = Second(Now()) + 4
    WaitTime = TimeSerial(NewHour, NewMinute, NewSecond)
    Application.Wait WaitTime
    
End Sub

Далее напишем функцию создания документа в Microsoft Word.

Private Sub MakeMemos()
    Dim Word As Object
    Set Word = CreateObject("Word.Basic")
    With Word
        .FileNewDefault
        .Insert "M E M O"
        .InsertPara
        .InsertPara
        .Insert "Дата:" & Chr(9) & Format(Date, "mmm d, yyyy")
        .InsertPara
        .Insert "Кому: <Укажите здесь имя>"
        .InsertPara
        .Insert "От: <Ваше имя>"
        .InsertPara
        .Insert "Заголовок"
        Word.EditPaste
        .InsertPara
        .InsertPara
        .Insert "Вы можете вставить здесь любой текст, какой желаете"
        .InsertPara
        .Insert "Вводите требуемый текст на каждую строку"
        .StartOfDocument
        .EndOfLine 1
        .Bold
        .CenterPara
        .FileSaveAs "demo.doc"
        .DocClose
    End With
    Set Word = Nothing
Application.StatusBar = ""
MsgBox "Заметка создана и сохранена", vbInformation
Set excelSheet = Nothing
        
End Sub

Подпрограмма MakeMemos запускает Word, открывает заданный по умолчанию документ, добавляет некоторую информацию о форматировании, вставляет диаграмму из Excel и сохраняет документ.

Запуск примера осуществляется выбором пункта "Макросы" из подменю "Макрос" меню "Сервис". В появившемся меню из списка макросов выбираем Count_Blocks и нажимаем "Выполнить". Ресультат работы можно видеть на рисунке 6.

Результат работы подпрограммы Count_Blocks
Рис. 6. Результат работы подпрограммы Count_Blocks.

Заключение.

Подведем итоги. Средства ActiveX Automation для AutoCAD стали доступны только начиная с версии 14. Поэтому следует ожидать их дальнейшее развитие в следующих версиях AutoCAD. Вместе с тем средства VBA не рассматриваются AutoDesk как замена Autolisp или ARX, а скорее как альтернативное решение, дополняющее их. В самом деле, человеку, программирующему на Visual Basic и не знающему Autolisp, будет удобнее работать в AutoCAD на знакомом средстве разработки, чем изучать Autolisp. С другой стороны, разработчику на ARX или Autolisp нет необходимости переводить свои разработки на VBA, но зато можно включить в свой код средства интеграции с Microsoft Office с помощью VBA. В любом случае VBA для AutoCAD имеет большое будущее.

Я надеюсь на двухстороннюю связь с читателями. Пишите, если у Вас есть замечания или предложения по расширению данного обзора.

Приложения.

Файлы примера cвязи Microsoft Excel, Microsoft Word и AutoCAD, описанного в данной статье доступны для Download здесь - primer1.zip

Кроме этого как примеры программ на VBA можно порекомендовать следующие программы Ивана Щенникова (e-mail: andreich@aha.ru, Homepage: http://www.aha.ru/~andreich/):

http://vbdesign.hypermart.net/ - более 150 freeware и shareware программ на VBA.

Страница о ActiveX для AutoCAD: http://www.humbugreality.com/activecad/
table.zip - Пример ввода спецификации из MS Excel 97 в AutoCAD R14. Запускается по CTRL+t .
graph.zip - Пример ввода графика из MS Excel 97 в AutoCAD R14.

Код, рисующий в открытом АКАДе отрезок из 10,20,30 в 100,200,300:
  Dim ACad As Object
  Dim ADoc As Object
  Dim MSpace As Object
  Dim begp(0 To 2) As Double
  Dim endp(0 To 2) As Double
  Dim buf As Object
Set ACad = GetObject(, "AutoCAD.Application")
Set ADoc = ACad.ActiveDocument
Set MoSpace = ADoc.ModelSpace
begp(0)=10
begp(1)=20
begp(2)=30
endp(0)=100
endp(1)=200
endp(2)=300
Set buf = MoSpace.AddLine(begp, endp)



Copyright © Сайт поддержки пользователей САПР by Victor Tkachenko