![]() |
Translate to: |
||||||
| Обратная связь | Новости САПР | Программы | Документация | Полезные советы | Обзорные статьи | ||
| Заказ и разработка | Каталог САПР | САПР-конференция | Библиотека ГОСТов | Наши соавторы | Коммерческое ПО | ||
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 представлен краткий обзор этих связей.![]() |
| Рис. 1. Иерархическое взаимодействие между объектами в объектной модели Autocad. |
![]() |
| Рис. 2. Иерархическое взаимодействие между объектами в объектной модели Autocad (продолжение). |
Использование объектного броузера Visual Basic 5.0 или VBA для просмотра Active-X объектов Autocad.
Объекты автоматизации можно просматривать через объектный броузер, котрый поставляется вместе с Visual Basic 5.0 или VBA (в дальнейшем пойдет речь только о Visual Basic 5.0 посколько не смотря на наличии в документации к AutoCAD упоминаний о присутствии в дистрибутиве программы VBA не на одном из умевшихся у меня дистрибутивов его обнаружить не удалось :-(). Объектный броузер позволяет видеть полный спсок объектов, доступных в приложении вместе со свойствами и методами, приминимыми к данному объекту.
![]() Рис. 3. Меню доступных объектов Visual Basic 5.0 |
Для просмотра библиотеки типов объектов Autocad необходимо выполнить следующие шаги:
|
![]() Рис. 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):Далее введем в нашу форму немного программного кода: двойным нажатием мыши на кнопку 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. Выбор любого элемента схемы влечет за собой появление справки с перечислением доступных методов и свойств для данного элемента.
![]() |
| Рис. 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.
![]() |
| Рис. 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/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 © Сайт поддержки пользователей САПР