|
В 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 и их
взаимосвязи.
Использование объектного броузера Visual
Basic 5.0 или VBA для просмотра Active-X
объектов Autocad.
Объекты
автоматизации можно просматривать через
объектный броузер, котрый поставляется
вместе с Visual Basic 5.0 или VBA (в
дальнейшем пойдет речь только о Visual
Basic 5.0 посколько не смотря на наличии
в документации к AutoCAD упоминаний о
присутствии в дистрибутиве программы VBA
не на одном из умевшихся у меня
дистрибутивов его обнаружить не удалось
:-(). Объектный броузер позволяет видеть
полный спсок объектов, доступных в
приложении вместе со свойствами и
методами, приминимыми к данному объекту.
Пример
написание подпрограммы для 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:
Set acad = GetObject(, "AutoCAD.Application")
Set acad = CreateObject("AutoCAD.Application")
MsgBox "Unable to connect to AutoCAD"
Функция
GetObject устанавливает связь между
приложением и
AutoCAD, если
AutoCAD уже запущен.
Эта функция возвращает объект
AutoCAD.Application и сохраняет его
в переменной acad.
CreateObject начинает новый сеанс
AutoCAD.
В
контекстном меню, появившемся после
нажатия правой кнопкой мыши на окне кода
выберите Hide, чтобы скрыть код и
двойным нажатием на кнопке Quit снова
перейдите в режим ввода кода, что бы
ввести код и для этой кнопки (в данном
случае команду завершения сеанса
AutoCAD):
То же для
СheckBox1:
По
умалчанию в этой программе AutoCAD
запускается невидимо для пользователя
(не отображается на панели задач). Это
свойство можно использовать к примеру
для его вызова, выполнения какой-то
последовательности операций без
вмешательства пользователя а затем
выхода. Без необходимости регенирировать
графический экран эти операции будут
выполнены быстрее. Таким образом, когда
мы с помощью данной подпрограммы
запустим AutoCAD, то он буде не виден на
экране. Когда же мы установим галочку на
переключателе Visible, он отобразится на
экране.
В верхней
части окна кода выберите в
раскрывающемся списке поле "(General)" и
затем в месте кода формы, куда
переместится курсор введите строку:
Данная
иструкция объявляет переменную 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. Выбор
любого элемента схемы влечет за собой
появление справки с перечислением
доступных методов и свойств для данного
элемента.
Использование средства ActiveX для
обеспечения связи AutoCAD с другими
приложениями.
Можно
использовать VBA, поставляемый с Office
97 или другими программами для создания
перекрестно ссылающихся программ,
используя объекты из различных
приложений. Рассмотрим пример такого
использования создав приложение,
связывающее AutoCAD, Microsift Excel и
Microsoft Word. Функция приложения будет
состоять в подсчете числа блоков и
случаев их использования в чертеже. На
основании полученных данных строится
график, на основании которого
генерируется документ в Microsoft Word.
Сначала
откроем для редактирвание макрос в
Microsoft Excel, выбрав пункт "Редактор
Microsoft Visual Basic" из подменю
"Макрос" меню "Сервис". В поле кода
введем следующие:
Public excelSheet As Object
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
Set objAcad = GetObject(, "AutoCAD.Application")
Set objAcad = CreateObject("AutoCAD.Application")
Set obj.Doc = objAcad.ActiveDocument
If Right(ActiveWorkbook.Path, 1) = "\" Then
DwgName = ActiveWorkbook.Path & "ew.dwg"
DwgName = ActiveWorkbook.Path & "\ew.dwg"
Set objDoc = objAcad.ActiveDocument
If objDoc.FullName <> DwgName Then
Set objMspace = objDoc.ModelSpace
objExelSheet.Range(Cells(1, 1), Cells(100, 12)).Clear
For Each objElement In objDoc.Blocks
If (.Name <> "*MODEL_SPACE" And .Name <> "PAPER_SPACE") Then
objExcelSheet.Cells(intI, 1) = objElement.Name
strBlockName(intI) = objElement.Name
intTotalNumOfBlocks = intI
For intI = 1 To intTotalNumOfBlocks
intNumBlockName(intI) = 0
objExcelSheet.Range(Cells(1, 1), Cells(intI, 1)).Font.Bold = True
For Each objElement In objMspace
If StrComp(objElement.entityName, "AcDbBlockReference", 1) = 0 Then
For intI = 1 To intTotalNumOfBlocks
If StrComp(.Name, strBlockName(intI), 1) = 0 Then
intNumBlockName(intI) = intNumBlockName(intI) + 1
For intI = 1 To intTotalNumOfBlocks
objExcelSheet.Cells(intI, 2) = intNumBlockName(intI)
CreateChart (intTotalNumOfBlocks)
В
подпрограмме CountBlocks сначала
происходит соединение с текущим образцом
приложения Excel с помощью функции
GetObject. Далее активизируется
Лист1 в Excel, этот лист делается
текущим и в него записуется перечень
блоков. Затем циклически просматривается
база данных AutoCAD с отождествлением
каждого блока и сохранением информации в
переменной strBlockName, а также
с его записью на странице Excel. Далее
снова производится циклический просмотр
базы данных и добавляется перечень для
каждого блока в переменной
intNumBlockName.
Далее
добавим подпрограмму создания диаграммы
Microsoft Excel на основании
подсчитанного числа блоков в чертеже:
Private Sub CreateChart(NumberOfBlocks As Integer)
Static NewChart As Object
Set ChartRange = ActiveSheet.Range(Cells(1, 1), _
Cells(NumberOfBlocks, 2))
Set NewChart = Charts.Add
.CopyPicture xlScreen, xlBitmap
В функции
CreateChart происходит установка
ввода диапазона значений для диаграммы,
добавление диаграммы к набору Excel
Charts, активизация диаграммы и
копирование ее в буфер обмена.
Далее
напишем подпрограмму получения системной
даты для ввода ее в документ Word. Эта
подпрограмма также добавляет интервал
ожидания в четыре секунды, чтобы дать
время Microsoft Excel для завершения
создания объекта в виде диаграммы
прежде, чем Excel запустит Word.
NewMinute = Minute(Now())
NewSecond = Second(Now()) + 4
WaitTime = TimeSerial(NewHour, NewMinute, NewSecond)
Application.Wait WaitTime
Далее
напишем функцию создания документа в
Microsoft Word.
Set Word = CreateObject("Word.Basic")
.Insert "Дата:" & Chr(9) & Format(Date, "mmm d, yyyy")
.Insert "Кому: <Укажите здесь имя>"
.Insert "Вы можете вставить здесь любой текст, какой желаете"
.Insert "Вводите требуемый текст на каждую строку"
Application.StatusBar = ""
MsgBox "Заметка создана и сохранена", vbInformation
Подпрограмма MakeMemos запускает Word,
открывает заданный по умолчанию документ,
добавляет некоторую информацию о
форматировании, вставляет диаграмму из
Excel и сохраняет документ.
Запуск примера осуществляется выбором
пункта "Макросы" из подменю "Макрос"
меню "Сервис". В появившемся меню из
списка макросов выбираем Count_Blocks и
нажимаем "Выполнить". |