Autodesk Inventor API. Первые шаги/Первая программа: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
Строка 1:
Чтобы преодолеть трение покоя, первые страхи и осознать, что у вас буквально под рукой находится весьма любопытный инструмент, попробуем создать в среде вашего Инвентора первую полезную программу.
Здесь будет пример простой программы с пошаговым объяснением команд и последствий их выполнения.
 
Эта маленькая программа называется Flush_XYZ и работает в контексте сборки и позволяет выделенный пользователем компонент зафиксировать в координатах сборки наложением трех зависимостей совмещения заподлицо одноименных базовых плоскостей XY, YZ и XZ сборки и компонента. Такая привязка компонентов систематически применяется, например, при каркасном проектировании, где ее автоматизация поможет сэкономить конструктору немало времени.
Цель -- помочь преодолеть "трение покоя" и первые страхи.
 
Полный текст Flush_XYZ приведен ниже, а здесь мы проведем подробный пошаговый анализ ее текста и выполняемых действий.
 
Для начала следует попробовать Flush_XYZ в работе.
 
Нажатием клавиш ALt-F11 активируйте среду VBA. В окне слева с название Project показан браузер объектов, где следует найти программный модуль с именем Module1. Раскройте его двойным кликом на имени модуля. Если вы его еще не использовали, то текста он еще не содержит. Окно справа предназначено для программных текстов.
 
[[Изображение:1stProg_01.png| ]]
 
 
Наберите в первой строке <tt>Option Explicit</tt>.
Эта инструкция задает режим явного объявления автором программы всех переменных. Настоятельно рекомендую работать именно в этом режиме.
 
Чтобы среда VBA использовала этот режим по умолчанию, в диалоге настроек 'Options' следует поставить галочку, как показано на рисунке ниже.
 
 
[[Изображение:1stProg Options.png| ]]
 
 
=== Постановка ===
Следующим шагом методом Copy/Paste вставьте в модуль полный текст процедуры Flush_XYZ.
 
[[Изображение:1stProg_03.png| ]]
 
 
 
Сохраните измененный проект командой Ctrl-S.
 
Перейдите в окно Инвентора, создайте несколько деталей Part1, Part2, … и новую сборку. Файлы деталей следует сохранить на диске, а затем вставить в сборку в произвольных местах.
Первая деталь автоматически ориентируется и фиксируется в сборке (Grounded) совмещением координатных систем детали и сборки.
 
Вот теперь все готово, чтобы опробовать Flush_XYZ в деле.
Сначала выделите в сборке любую деталь кроме первой, а потом запустите на выполнение макрос Flush_XYZ.
 
Для запуска VBA макросов в среде Инвентора предназначен диалог 'Macros’, открываемый нажатием клавиш Alt-F8. Диалог выглядит следующим образом:
 
 
[[Изображение:1stProg_04.png| ]]
 
 
Примечание:
Если окно ‘Macro name’ окажется пустым, то выберите нужный модуль из списка в строке ‘Macros in:’.
 
Итак, деталь выделена, курсор стоит на имени макроса. Нажимаем кнопку Run, и деталь встает на положенное ей место
 
Отмените операцию и попробуйте наложить те же зависимости вручную, сравнив затраченное время. А теперь представьте что таких вставок требуется сделать сотни… Да и вообще, приятно, когда Инвентор делает полезную работу сам.
 
 
=== Разбор полетов ===
 
Рассмотрим теперь, что происходило за сценой и чему мы обязаны за этот праздник жизни.
 
Первые несколько строк являются комментариями. Ими считаются любой текст после знака ' . Они игнорируются при исполнении команд, предназначены для читателей текста, т.е. для программистов, и чрезвычайно полезны, когда нужно понять логику алгоритма и внести в программу какие-либо изменения.
 
<source lang="vbnet">
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' Flush_XYZ
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'Выделенный пользователем компонент фиксируется
'в координатах сборки наложением трех зависимостей
'совмещения заподлицо одноименных базовых
'плоскостей XY, YZ и XZ сборки и компонента
'
'Процедура работает в контексте сборки.
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
</source>
 
 
Следующие строки начинают и завершают процедуру (Sub) с именем Flush_XYZ без аргументов, о чем свидетельствуют пустые скобки. Весь текст между этими строками является собственно текстом макроса.
 
<source lang="vbnet">
Public Sub Flush_XYZ()
………………
………………
………………
End Sub ' Flush_XYZ
'
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
</source>
 
 
Первая группа команд, начинающихся с <tt>Dim</tt>, объявляет все нужные программе переменные и их типы.
 
<source lang="vbnet">
Dim oApp As Inventor.Application 'приложение Inventor
Dim oAsmCompDef As AssemblyComponentDefinition 'сборка
Dim oCompOcc As ComponentOccurrence 'компонент
Dim oSelectSet As SelectSet
Dim oAsmPlane As WorkPlane 'рабочие плоскости сборки
Dim oPartPlane As WorkPlane 'рабочие плоскости детали
Dim oPartPlaneProxy As WorkPlaneProxy 'proxy-плоскости детали
Dim i As Long 'счетчик плоскостей 1,2,3
</source>
 
Переменная <tt>oApp</tt> будет хранить указатель (ссылку) на активное приложение Inventor, объект типа <tt>Application</tt>.
После инициализации <tt>oApp</tt> обеспечит нам доступ к такому важному объекту как документ активной сборки и его компонентам.
 
Переменная <tt>oAsmCompDef</tt> предназначена для хранения ссылки на определение компонентов активной сборки.
 
Переменная <tt>oCompOcc</tt> предназначена для получения доступа к определениям компонентов ориентируемой детали, ее базовых рабочих плоскостей, в частности.
 
Переменная <tt>oSelectSet</tt> предназначена для получения доступа к элементам коллекции <tt>SelectSet</tt> активной сборки, т.к. к выделенному компоненту.
 
Следующие три декларации объявляют переменные, посредством которых мы будем оперировать рабочими плоскостями сборки и детали.
<source lang="vbnet">
Dim oAsmPlane As WorkPlane 'рабочие плоскости сборки
Dim oPartPlane As WorkPlane 'рабочие плоскости детали
Dim oPartPlaneProxy As WorkPlaneProxy 'proxy-плоскости детали
</source>
 
Последним объявляется счетчик циклов <tt>i<tt>:
<source lang="vbnet">
Dim i As Long 'счетчик плоскостей 1,2,3
</source>
 
 
Далее идут исполняемые команды.
 
 
Первым делом получим ссылку на активное приложение INVENTOR и сохраним его в переменной <tt>oApp</tt>:
<source lang="vbnet">
Set oApp = ThisApplication
</source>
 
 
 
Далее важный элемент работы программы — следует провериться, а в контексте ли сборки запускает наш макрос пользователь? Если нет, то выводится соответствующее уведомление и работа макроса завершается.
 
<source lang="vbnet">
'Проверка: а в сборке ли мы?
If oApp.ActiveDocument.DocumentType <> kAssemblyDocumentObject Then
MsgBox "Процедура предназначена для работы в контексте сборки."
Exit Sub
End If
</source>
 
Если исполнение программы продвинулось дальше, значит активным документом действительно является сборка, и мы можем создать объект <tt>oAsmCompDef</tt>, в котором сохраняем определение компонентов активной сборки.
 
<source lang="vbnet">
Set oAsmCompDef = oApp.ActiveDocument.ComponentDefinition
</source>
 
Теперь самое время узнать, что же выделил (если выделил) в сборке пользователь. Для этого требуется получить доступ к коллекции выделенных объектов <tt>SelectSet</tt> активной сборки. В программе это делается с помощью переменной <tt>oSelectSet</tt>:
 
<source lang="vbnet">
'Ссылка на коллекцию SelectSet активного документа
Set oSelectSet = oApp.ActiveDocument.SelectSet
</source>
 
 
Далее в программе следуют две обязательных проверки. Первая проверяет, что выделен только один компонент, а вторая — что выделен именно компонент, а не что-либо иное (например, рабочая плоскость). Если хотя бы одно условие не выполнено, то выполнение макроса завершается с выводом пользователю соответствующего сообщения.
 
<source lang="vbnet">
'Проверка: должен быть выделен один и только один элемент
If oSelectSet.Count <> 1 Then
MsgBox "Следует выделить один компонент."
Exit Sub
End If
'Проверка: должен быть выделен именно компонент
If Not (TypeOf oSelectSet.Item(1) Is ComponentOccurrence) Then
MsgBox "Следует выделить один компонент."
Exit Sub
End If
</source>
 
 
Следующий фрагмент кода получает ссылку на выделенный пользователем компонент сборки.
 
<source lang="vbnet">
'ссылка на выделенный компонент (деталь)
Set oCompOcc = oSelectSet.Item(1)
</source>
 
 
Далее в программе мы встречаем интересную конструкцию — пример работы с транзакциями. Здесь формируется транзакция с именем "Привязка_XYZ". Все действия, выполненные программой внутри блока между командами <tt>StartTransaction</tt> и <tt>End</tt> могут быть отменены за один шаг Undo.
 
<source lang="vbnet">
'Инициализация транзакции для возможной отмены за один шаг
Dim oConstrTransaction As Transaction
Set oConstrTransaction = oApp.TransactionManager. _
StartTransaction(oApp.ActiveDocument, "Привязка_XYZ")
…………………………
…………………………
…………………………
…………………………
…………………………
oConstrTransaction.End 'завершение транзакции
</source>
 
 
И наконец, мы подошли к самому главному, тому, ради чего программа и была создана — к привязке выделенного компонента oCompOcc к системе координат сборки наложением трех зависимостей совмещения заподлицо одноименных базовых плоскостей XY, YZ и XZ сборки и компонента.
 
<source lang="vbnet">
'Совмещаем в цикле базовые плоскости сборки и компонента.
' i=1: плоскость YZ, нормаль - ось X
' i=2: плоскость ZX, нормаль - ось Y
' i=3: плоскость XY, нормаль - ось Z
For i = 1 To 3
'ссылка на базовую плоскость i сборки
Set oAsmPlane = oAsmCompDef.WorkPlanes.Item(i)
'ссылка на базовую плоскость i выделенного компонента
Set oPartPlane = oCompOcc.Definition.WorkPlanes.Item(i)
'создаем прокси-объект рабочей плоскости компонента
Call oCompOcc.CreateGeometryProxy(oPartPlane, oPartPlaneProxy)
'создаем зависимость совмещения рабочих плоскостей типа "Заподлицо"
'плоскости сборки и прокси-объекта плоскости компонента
Call oAsmCompDef.Constraints.AddFlushConstraint( _
oAsmPlane, oPartPlaneProxy, 0)
Next i
</source>
 
Для каждой из трех базовых плоскостей сборки выполняется однотипная последовательность операций, завершающихся созданием зависимости типа FlushConstraint (заподлицо). Сборка oAsmCompDef имеет свойство Constraints — ссылку на коллекцию всех сборочных зависимостей. Метод AddFlushConstraint(oAsmPlane, oPartPlaneProxy, 0) дополняет эту коллекцию новой зависимостью совмещения заподлицо для двух плоскостей oAsmPlane сборки и oPartPlaneProxy компонента. Третий аргумент означает отсутствие смещения — нулевое расстояние между указанными плоскостями.
 
Самым любопытным в данном фрагменте является то, что совмещение плоскости сборки производится не с «родной» плоскостью детали, а с ее прокси-объектом, т.к. именно прокси-объекты описывают положение компонента в сборке.
 
 
 
[[Изображение:1stProg_05.png| ]]
[[Изображение:1stProg_06.png| ]]
 
 
 
 
Ниже приведен полный текст макроса Flush_XYZ.
 
 
Строка 99 ⟶ 327 :
End Sub ' Flush_XYZ </source>
'
'20:40, 9 марта 2008 (UTC)20:40, 9 марта 2008 (UTC)20:40, 9 марта 2008 (UTC)20:40, 9 марта 2008 (UTC)20:40, 9 марта 2008 (UTC)20:40, 9 марта 2008 (UTC)20:40, 9 марта 2008 (UTC)20:40, 9 марта 2008 (UTC)20:40, 9 марта 2008 (UTC)20:40, 9 марта 2008 (UTC)20:40, 9 марта 2008 (UTC)20:40, 9 марта 2008 (UTC)20:40, 9 марта 2008 (UTC)~
</source>