Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 40045.doc
Скачиваний:
3
Добавлен:
30.04.2022
Размер:
243.71 Кб
Скачать

Лабораторная работа № 6 доступ к средствам autocad с использованием visual

BASIC FOR APPLICATIONS (VBA)

1. Цель работы

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

2. Теоретический материал

Начиная с версии R14 в AutoCAD в качестве контроллера автоматизации включен Microsoft Visual Basic for Applications (VBA).

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

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

Для просмотра библиотеки типов объектов Autocad необходимо выполнить следующие шаги:

  1. Из меню Project выбрать References (рис. 4).

  2. В диалоговом окне References выбрать AutoCAD Object Library, или если же ее нет в списке доступных ссылок, выбрать кнопку Browse и указать файл acad.tlb в каталоге исполняемых программ Autocad.

Рис. 1. Меню доступных объектов Visual Basic

В меню View выбрать Object Browser. Как показано на рис. 4, левый столбец объектного браузера содержит список объектов для выбранного приложения, в правом же столбце отображаются свойства и методы, связанные с подсвеченным объектом (рис. 2).

Рис. 2. Объектный браузер в Visual Basic

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

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

Программирование на языке Visual Basic for

Applications

Visual Basic для приложений (Visual Basic for Applications - VBA) представляет собой язык программирования и среду, включенную во множество приложений Microsoft, таких как Word, Excel, PowerPoint или Access. VBA идеально подходит для тех случаев, когда необходимо работать более чем с одним приложением одновременно или в пределах приложения AutoCad.

Для работы с VBA следует открыть собственный интерфейс VBA воспользовавшись командой из основного меню ToolMacroVBA Maneger (Инструменты  Макро  Редактор Visual Basic). В AutoCAD можно кроме этого ввести команду - vbaide. После этого открывается окно среды VBA.

Проекты VBA содержатся в модулях, представляющих собой самодостаточный программный код. Для открытия модуля в меню выбрать ВставкаМодуль.

AutoCAD при этом работает в фоновом режиме, т.е. в него можно вернуться в любой момент времени.

VBA обеспечивает легкий доступ к объектам, их создание и управление ими. Чтобы ознакомиться со списком объектов, откройте Object Browser щелчком на соответствующей кнопке панели инструментов или выбором в меню команды View  Object Browser (Вид  Окно объекта). Объекты организованы в библиотеки; все объекты, с которыми вы работаете в AutoCAD, находятся в библиотеке AutoCAD. Это позволяет работать с группами объектов.

Все объекта имеют свойства и методы. Метод - это определенное действие, которое может быть выполнено над объектом. В окне объектов правая панель перечисляет все свойства и методы выбранного объекта.

Чтобы работать с любым объектом, необходимо знать место данного объекта в иерархии VBA. Чтобы сориентироваться в иерархии объектов в среде VBA , необходимо выбрать метод или свойство в окне Объекта и щелкнуть на пиктограмме Помощь в его панели инструментов. Затем выберите модель объекта.

Рассмотрим синтаксис Visual Basic for Applications на примере готового фрагмента кода для прорисовки параллелепипеда:

' Вставка параллелепипеда

Sub Box ()

' декларация переменных для использования в AddBox ()

Dim dOrigin (0 To 2) As Double ' массив чисел с плавающей точкой

Dim dLength As Double ' длина

Dim dHeigth As Double ' высота

Dim myBox As Acad3DSolid ' хранит возвращаемое значение

dOrigin(0) = 0# ' устанавливает dOrigin(0) в (0,0,0)

dOrigin(1) = 0#

dOrigin(2) = 0#

dLength = 5# ' создание куба 555

dWidth = 5#

dHeight = 5#

' создание параллелепипеда в пространстве текущего чертежа

Set myBox = ThisDrawing.ModelSpace.AddBox(dOrigin, dLength, dWidth, dHeight)

' изменение точки обзора для лучшего осмотра паралелепипеда ThisDrawing.SendCommand ("VPOINT 1,1,1 ")

End Sub

Для загрузки программы можно воспользоваться командой VBALOAD или в меню выбрать следующее (TOOL  Load Application)/ AutoCAD откроет диалоговое окно Load/Unload Application, в котором выбрать необходимый проект и щелкнуть на кнопке Load. После этих действий проект загружен и диалоговое окно можно закрыть щелкнув на кнопке Close.

Для запуска VBA-программы выбрать команду TOOL  Macro  Macros или ввести команду vbarun. В появившемся окне Macros выбрать необходимый модуль и запустить его щелкнув на кнопке Run.

Доступ к другим приложениям

Основное достоинство VBA заключается в интеграции других приложений с AutoCAD. Технология, позволяющая двум приложениям или компонентам взаимодействовать друг с другом, называется автоматизация (Automation). Эта технология требует наличия сервера и клиента. Многие приложения могут выступать в обоих ролях, выполняя функции как клиента, так и сервера автоматизации, например, AutoCAD, Access, Excel или Word. Большинство управляющих элементов ActiveX представляет собой серверы автоматизации. Любое приложение, поддерживающее VBA, может выступать в роли клиента автоматизации.

Рассмотрим пример работы с Excel - с использованием раннего и позднего связывания:

Sub XlsEarly()

Dim objXls As New Excel.Application

'Приложение не запускается до тех пор, пока не будет

' использовано свойство или метод объекта

MsgBox "Application: " & objXls.Name & " Version: " & objXls.Version

objXls.Visible = True

objXls.Quit

Set objXls = Nothing

End Sub

Sub XlsLate ()

Dim objXls As Object

' CreateObject запускает приложение

Set objXls = CreateObject ("Excel.Application")

MsgBox "Application: " & objXls.Name & " Version: " & objXls.Version

objXls.Visible = True

objXls.Quit

Set objXls = Nothing

End Sub

Объектный браузер Visual Basic 5.0 или VBA можно использовать для просмотра Active-X объектов Autocad. Объект Application, который использовался в нашем примере, является объектом верхнего уровня. Все другие объекты могут быть достигнуты через методы и свойства объекта Application. Можно использовать 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

Из-за большего количества доступного VisualLISP-кода, проще транслировать существующий блок VisualLISP в VBA, чем повторно изобретать это. Также проще сравнить два кода, если имена переменных остаются те же самые.

В VisualLISP используется функция (setq) для определения точки. Следующая строка назначает переменный PT1 переменный значение расположения точки 0,0,0, что относится к x -, y -, и z-координатам расположения точки:

(setq PT1 '(0 0 0))

В VBA это действие требует еще нескольких строк кода:

Dim PT1(0 To 2) As Double

PT1(0) = 0#

PT1(1) = 0#

PT1(2) = 0#

Декларация Dim используется для объявления переменных в VBA. Точки всегда сохраняются в массиве из тремя элементами типа doubles. Массив не ничто больше чем список переменных. Переменные в массиве все имеют те же самые имена. Первая переменная в массиве использует индексное значение 0, таким образом это переменная PT1(0). Вторая переменная в массиве - PT1(1), и так далее. VBA использует символ # как указатель на тип данных double. В этом массиве, PT1(0) сохраняет значение для x-координаты, PT1(1) - значение для y-координаты, и PT1(2) - значение для z-координаты.

VBA и VisualLISP обеспечивают некоторые общие функции работы с файлами и выражения, обеспечивающие ввод-вывод в дисковую систему.

Обработка файлов относительно проста. Прежде всего необходимо открыть файл. В VisualLISP можно использовать выражение: (setq #1 (open "c:/temp/test.txt" "w")). VisualLISP возвращает файловую метку или указатель который сохраняется в переменной #1.

В VBA используйте: Open "c:\temp\test.txt" For Output as #1. В VBA Вы должны указать режим открытия. VBA режимы подобны режимам VisualLISP. Номер файла #1 есть номер от 1 до 255 и ассоциируется с открытым файлом с этим номером. Предшествующий знак (#) является произвольным. На обоих языках имя файла c:\temp\test.txt должно быть строковая величина или переменная, которая содержит имя файла. Однако, в VisualLISP Вы должны использовать косую черту (/) или две наклонных черты влево (\\), чтобы показать путь к файлу внутри строки имени файла.

Для закрытия файлов оба языка используют оператор Close, чтобы освободить файл для других приложений. Перед выходом из программы необходимо закрыть все открытые файлы.

Для запись в файл VisualLISP использует функцию (write-line) , чтобы записать данные в файл или на экран и добавляет в конце строки: (write-line "THIS IS THE FIRST LINE" #1). В VBA, оператор write# допускает запись данных в любом формате в любой файл на диске. Write# записывает строки, числа, постоянные, и переменные в любой и всех комбинациях в дисковый файл и добавляет <Enter> в конце строки: Write #1, "THIS IS THE FIRST LINE".

Для чтения файлов данных VisualLISP использует функцию (read-line), которая читает файлы только последовательно cверху вниз. В VisualLISP чтобы читать из файла, необходимо открыть файл в режиме "r" и извлечь данные функцией (read-line). VisualLISP автоматически переходит на следующую строку с каждым вызовом (read-line). Когда достигается конец файла, VisualLISP возвращает nil.

Функция (eof) на обоих языках - встроенная функция конца файла, которая определяет, когда (read-line) или Input достигают конца файла. (eof) возвращает True, когда достигнут конец файла и False, когда файл еще имеет данные для чтения. Большинство вводимых данных программирует в цикле, пока (eof) не true.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]