Обзор способов доступа к Inventor API

Автор: | 03.02.2018

Введение
Объектная модель
Различия между приложениями под Inventor и Apprentice
Инсталляция шаблонов для Add-In приложений
Пример Add-In «HelloWorld!» на VB.NET
Пример Add-In «HelloWorld!» на C#
Отличия между VB и VBA приложениями
Разновидности VBA проектов

Введение

API, или интерфейс прикладного программирования – это термин, используемый для описания функциональных возможностей графического редактора Inventor, предоставляемый в рамках программы. Например, вы можете использовать API, чтобы написать программу, которая реализует повторяющиеся операции.

Autodesk Inventor является общей системой CAD, а это означает, что он не предназначен для какой-либо конкретной отрасли или используются для моделирования только определенных видов продукции. Наличие API позволяет добавлять функциональные возможности Inventor, специфичные для ваших индивидуальных потребностей.

Inventor API реализуется на основе COM технологии и предоставляет разные способы обратиться к данным Inventor при помощи различных видов надстроечных приложений (Plug-in modules).

Белые поля представляют компоненты, которые обеспечивают API – Inventor и «Apprentice Server». Синий цилиндр в основании представляет Inventor данные, к которым Вы обращаетесь – это детали, сборки, и т.д. Все желтые поля представляют программы, которые Вы записываете. Когда одно поле включает другое поле, это указывает, что включенное поле выполняется в том же самом процессе как поле, включающее его. Например, VBA выполняется в том же самом процессе как Inventor. Программа, которая запускается в том же процессе, работает значительно быстрее, чем программа, запускаемая «вне процесса».

Обычно, выбирая VBA, руководствуются следующими преимуществами:

  • VBA является средой программирования, которая доступна изнутри Inventor и не требуется, чтобы Вы покупали дополнительный язык программирования.
  • Вы можете внедрить программы в пределах документа, для обработки которого они разработаны. При этом Вы можете также сохранить программы в отдельных файлах, чтобы они могли использоваться в различных документах.
  • VBA выполняется в том же самом процессе как Inventor.
  • VBA имеет тот же самый доступ ко всем особенностям API как любой из других способов обращения к API (за исключением Add-Ins).

Автономный EXE – программа, которая выполняется самостоятельно и соединяется с Inventor. Этот тип программы обычно используется в случае, когда Вы имеете программу, которая использует Inventor, но имеет собственный интерфейс и не требует, чтобы пользователь в интерактивном режиме работал с Inventor. Например, программа может контролировать новые записи, которые будут добавлены в базу данных. Когда новая запись создана, программа запускает Inventor, открывает желаемый документ и печатает его – все без какого-либо взаимодействия с пользователем.

Apprentice (подмастерье) сервер – подмножество Inventor, которое не имеет интерфейса пользователя и запускается в одном процессе с другим приложением. Единственный способ взаимодействовать с Apprentice сервером – через его API. Apprentice сервер намного более эффективен, чем использование Inventor, поскольку без интерфейса пользователя операции исполняются быстрее. Библиотека типа Apprentice содержит ограниченный набор объектов, поддерживаемых библиотекой типа Inventor. Apprentice обеспечивает доступ к структуре сборки, B-Rep геометрии и рендер стилям – только для чтения. Доступ к ссылкам файла, атрибутам и свойствам документа – для чтения и записи.

Add-In – особый вид надстроечного приложения, который автоматически загружается при запуске Inventor, имеет высокую производительность и представляется пользователю как бы частью Inventor. Inventor’s Add-In – это способ соединится с Inventor и использовать его API. С помощью Add-In приложений можно создавать команды. На диаграмме  Add-In перечислен дважды – как DLL и как EXE. DLL приложения работают в том же самом процессе как Inventor, EXE приложения удобны для отладки.

Объектная модель

Чтобы использовать Inventor API, Вы должны познакомиться с объектами, которые он предоставляет, и понять, как получить желаемый объект. Структура API отражена через так называемую объектную модель.

Иерархия объектной модели показывает связи между различными объектами и позволяет определить, как пересечь иерархию, чтобы получить доступ к какому либо объекту. Главный элемент иерархии – объект Application, который расположен наверху объектной иерархии. Получая доступ к объекту Application, Вы можете приниматься за любой другой объект, который расположен ниже в иерархии, обращаться к их свойствам и методам.

Коллекция (Сollection) – специальный тип объекта, который обеспечивает итерацию по входящим в нее объектам. Например, объект Documents – коллекция. Свойство Count объекта Documents возвращает количество в настоящее время открытых документов. Вы можете обратиться к любому из открытых документов, используя свойство Item. Объект Documents также поддерживает метод Add, который создает новый документ, и метод Remove, который удаляет документ из коллекции.

Полный набор объектов в Inventor API описан через так называемую библиотеку типов (type library). Ссылаясь на этот файл в пределах вашего проекта, Вы получаете доступ ко всем объектам, которые составляют API Inventor. Есть также библиотека типов для Apprentice, которая может использоваться при создании приложений только для работы с Apprentice сервером.

Вы можете просматривать содержание библиотеки типов (type library), используя объектный браузер в VBA или VB.

Список в правой части браузера показывает объекты, определенные в библиотеке типов. Когда Вы выбираете объект из этого списка, правая часть браузера показывает методы, свойства и события, поддерживаемые выбранным объектом. Если Вы выбираете конкретные метод, свойство, или событие, его прототип отображается внизу браузера наряду с кратким описанием.

Различия между приложениями под Inventor и Apprentice

Первичные различия между Inventor и Apprentice  – объекты Application и Document. Объект Apprentice Application называют ApprenticeServerComponent. Он поддерживает намного более ограниченное API, чем объект Inventor Application. В Apprentice нет коллекции Documents. Apprentice ведет себя подобно «интерфейсу c единственным документом», т.е. Вы можете иметь только один открытый документ. Вы можете использовать Apprentice Open метод, чтобы открыть документ, но если Вы используете этот метод снова, чтобы открыть другой документ, документ, в настоящее время открытый, автоматически закрывается.

Объекты документа, используемые в пределах Apprentice, отличны от объектов документа, используемых в Inventor. В Inventor есть PartDocument, AssemblyDocument, DrawingDocument, и объекты PresentationDocument. В Inventor объект ApprenticeServerDocument представляет деталь, сборку и документ презентации, а ApprenticeServerDrawingDocument представляют документ чертежа. Код ниже иллюстрирует использование Apprentice, чтобы открыть документ.

Private Sub TestApprentice()
Dim oApprentice As New ApprenticeServerComponent
Dim oDoc As ApprenticeServerDocument
Set oDoc = oApprentice.Open("C:\Temp\Assembly1.iam")
End Sub

Ключевое слово «New» используется в объявлении переменной типа ApprenticeServerComponent. Apprentice не загружается в этом месте, он загружается, когда переменная впервые используется – когда метод Open объекта Apprentice вызывается.

Как только Вы заканчиваете работу с объектами верхнего уровня, объекты, которые ниже них в иерархии, будут те же самые, что используются в Inventor. Например, процедура GetComponents (см. ниже) отобразит дерево сборки с расположением компонентов, независимо от того, используется ли она в Apprentice или Inventor.

Private Sub GetComponents(InCollection As ComponentOccurrences, Level As Long)
Dim oCompOccurrence As ComponentOccurrence
Debug.Print Space(Level * 3) & oCompOccurrence.Name
Call GetComponents(oCompOccurrence.SubOccurrences, Level + 1)
Next
End Sub

Apprentice обеспечивает доступ только “для чтения” к части информации Inventor. Например, свойство Name объекта ComponentOccurrence может быть использовано только для чтения в Apprentice, тогда как в Inventor оно для “чтения-записи”. Если Вы попытаетесь устанавливать это свойство в Apprentice приложении, система выдаст ошибку.

Apprentice  способен изменить ссылку на файл, когда файл открыт в Inventor. Например, Вы имеете сборку, которая содержит детали Part1 и Part2. В случае если Part1 должен быть изменен, Вы делаете копию файла с новым именем, делаете изменения к детали и сохраняете ее. Когда Вы открываете сборку, то она еще ссылается на старый файл. Объект FileSaveAs, который является доступным только в Apprentice, обеспечивает функциональные возможности, которые позволяют Вам сохранять компоненты сборки к различным именам файла и обновлять ссылки сборки, чтобы указать на новые файлы. Пример ниже открывает сборку, ищет ссылку к определенному файлу, изменяет ссылку, чтобы указать на другой файл, и затем сохраняет изменение.

Private Sub ChangeReferenceSample()
Dim oApprentice As New ApprenticeServerComponent
Dim oDoc As ApprenticeServerDocument
Set oDoc = oApprentice.Open("C:\Temp\Assembly1.iam")
' Iterate through the references looking for a reference to a specific file.
Dim oRefFileDesc As ReferencedFileDescriptor
For Each oRefFileDesc In oDoc.ReferencedFileDescriptors
If oRefFileDesc.FullFileName = "C:\Temp\OldPart.ipt" Then
' Replace the reference.
Call oRefFileDesc.PutLogicalFileNameUsingFull( "C:\Temp\NewPart.ipt")
Exit For
End If
Next
' Set a reference to the FileSaveAs object.
Dim oFileSaveAs As FileSaveAs
Set oFileSaveAs = oApprentice.FileSaveAs
' Save the assembly.
Call oFileSaveAs.AddFileToSave(oDoc, oDoc.FullFileName)
Call oFileSaveAs.ExecuteSave
End Sub

Инсталляция шаблонов для Add-In приложений

Чтобы получить готовые шаблоны для создания Add-In приложений необходимо произвести установку SDK . Установочные файлы SDK обычно находятся в папке (для Inventor 2016):

В этой папке можно увидеть два файла: developertools.msi и usertools.msi. Файл developertools.msi устанавливает в Visual Studio шаблоны для создания AddIn, также содержит примеры на различных языках программирования, заголовочные файлы для «нативного» C++, схему объектной модели Inventor и пр. Файл usertools.msi содержит дополнительные примеры для программирования.

Бывает ситуация, что SDK Inventor не адаптирован под версию Visual Studio и при распаковке файла developertools.msi возникает сообщение об ошибке.

При этом файлы уже распаковались, однако после нажатия в нем кнопки OK распакованные файлы исчезают. Поэтому, прежде чем нажать на кнопку OK, скопируйте распакованные файлы в какую-либо папку. При этом, поскольку инсталляция шаблонов для AddIn происходила некорректно, необходимо перенести шаблоны в Visual Studio вручную. В извлеченном архиве находим архивы с шаблонами в папке VS10.0_USRPRJTEMPL.

Копируем архивы шаблонов в соответствующие папки Visual Studio, в настройках по умолчанию путь к этим папкам имеет вид:

Запускаем Visual Studio, шаблоны для обоих языков должны быть в доступе

Пример Add-In «HelloWorld!» на VB.NET

Ниже подробно рассматривается создание Add-In приложения с использованием VB.NET, хотя основные концепции создания Add-In те же самые, независимо от языка программирования.

Запустим создание шаблона на VB.NET  и назовем проект “HelloWorld”. В “Обозревателе решений” Visual Studio откроем на редактирование файл, в котором содержится базовый программный код – это файл StandardAddInServer.vb. В открывшемся программном коде находим процедуру с именем Activate и вставляем в неё установку свойства Caption объекта g_inventorApplication и  запуск окна приветствия:

Public Sub Activate(ByVal addInSiteObject As Inventor.ApplicationAddInSite, ByVal firstTime As Boolean) Implements Inventor.ApplicationAddInServer.Activate
' Initialize AddIn members.
g_inventorApplication = addInSiteObject.Application
' Connect to the user-interface events to handle a ribbon reset.
m_uiEvents = g_inventorApplication.UserInterfaceManager.UserInterfaceEvents
g_inventorApplication.Caption = "My AddIn was loaded"
MsgBox("HelloWorld!")
…
End Sub

После компиляции проекта создается dll-файл в прописанной системой директории:

 При компиляции может появиться сообщение об ошибке

Cannot determine the location of the VS Common Tools folder” или “«vsvars32» is not recognized as an internal or external command”. Тогда найдите в настройках системы переменную Path  и добавьте к ней ;C:\Windows\System32. После этого Visual Studio необходимо перегрузить.

Для тестирования AddIn  приложения запустим Inventor, создадим в нем документ “Деталь”, вызовем диспетчер надстроек и загрузим файл HelloWorld.dll. В результате увидим, что изменился заголовок окна Inventor и получено сообщение

При необходимости изменения программного кода перед компиляцией проекта Inventor придется выгрузить. Это связано с тем, что при загрузке AddIn приложения Inventor забирает права на его редактирование.

Посмотрим, что было подготовлено в шаблоне AddIn  приложения. Если зайти в свойства проекта, то можно увидеть, что в шаблоне была подключена ссылка на Inventor Object Library. Кроме того, в браузере проекта были созданы несколько программных модулей.

В реестре технологией NET вместо регистрации DLL-файла предусмотрен инструмент манифеста. Манифест представляет из себя текстовый файл в формате xml (Имя DLL-файла.X.manifest). Данные из манифеста внедряются в DLL-файл после его компиляции. По этим данным Inventor находит класс, содержащий интерфейс для взаимодействия с AddIn.

Для подключения созданного AddIn по технологии “Registry free” необходимо дать понять Inventor, где искать DLL-файл. Для этого в проекте шаблона создан еще один файл в формате xml, имеющий расширение .addin.

Рассмотрим подробнее программный модуль StandardAddInServer. В первой строке импортировано пространство имен Inventor. Ниже можно увидеть уже сгенерированный для нашего AddIn приложения GuidAttribute, который содержит в себе уникальный 128-ми битный идентификатор (GUID): «54eca785-854c-4a5f-8341-6910d215ff49». Для того что бы создаваемый AddIn и Inventor могли понимать друг друга реализуется интерфейс Inventor.ApplicationAddInServer. Этим интерфейсом поддерживается 3 метода и одно свойство:

  • Activate;
  • Deactivate;
  • ExecuteCommand;
  • Automation.

Метод Activate запускается самим Inventor при загрузке AddIn или при ручном включении AddIn через пользовательский интерфейс в Inventor. В сигнатуре этого метода содержатся два объекта AddInSiteObject и FirstTime. Объект AddInSiteObject содержит в себе ссылку на объект AddInSiteObject.Application, который в свою очередь является корневым объектом API Inventor, через который и будет управляться Inventor. Булева переменная FirstTime=true, сообщает о том, что метод был вызван самим Inventor первый раз, и поэтому его можно использовать как индикацию необходимости построения различных меню и пользовательских интерфейсов.

Метод Deactivate запускается при закрытии Inventor или при отключении AddIn через пользовательский интерфейс. Здесь необходимо удалить все ненужные объекты. В отличие от программ на C++, при написании программы на NET-языке нет необходимости тщательно следить за тем, чтобы все объекты были удалены, поскольку они будут автоматически утилизироваться сборщиком мусора, встроенным в NET Framework.

Метод ExecuteCommand вызывается, когда пользователь выполняет click на кнопке, которая связана с одной из Add-In’s команд. Метод ExecuteCommand является устаревшим и на данный момент не используется.

Свойство Automation служит для реализации управления AddIn другими программами через свой дополнительный интерфейс управления для надстройки. В этом свойстве можно возвратить этот интерфейс на базе COM-технологии. Большинство Add-Ins не имеют собственный API и поэтому не могут применять это свойство.

Пример Add-In «HelloWorld!» на C#

Запустим создание шаблона на C# и назовем проект “HelloWorld”. В “Обозревателе решений” Visual Studio откроем на редактирование файл, в котором содержится базовый программный код.  Для C# это файл StandardAddInServer.cs.

Ищем, в открывшемся программном коде функцию с именем Activate и вставляем в неё запуск окна приветствия:

public void Activate(Inventor.ApplicationAddInSite addInSiteObject, bool firstTime)
{
// This method is called by Inventor when it loads the addin.
// The AddInSiteObject provides access to the Inventor Application object.
// The FirstTime flag indicates if the addin is loaded for the first time.
// Initialize AddIn members.
m_inventorApplication = addInSiteObject.Application;
System.Windows.Forms.MessageBox.Show("HelloWorld!");
// TODO: Add ApplicationAddInServer.Activate implementation.
// e.g. event initialization, command creation etc.
}

Для вывода стандартного окна на C#, необходимо подключить ссылку на класс System.Windows.Forms. Для этого в “Обозревателе решений” вызываем контекстное меню на строке References:

В “Менеджере ссылок” подключаем нужную ссылку:

Дальнейшие действия такие же, как для примера «HelloWorld!» на языке VB.NET.

Отличия между VB и VBA приложениями

Ниже приведено простое VBA приложение, которое отображает имя файла в настоящее время активного документа.

Public Sub VBASample()
' Set a reference to the currently active document.
Dim oDoc As Inventor.Document
Set oDoc = ThisApplication.ActiveDocument
' Check to see if a filename is defined.
If oDoc.FullFileName = "" Then
MsgBox "The file has not been saved."
Else
MsgBox "The active file is: " & oDoc.FullFileName
End If
End Sub

Строка «Dim» объявляет, что переменная имеет тип Document. Часть объявления «Inventor.» используется, чтобы определить объект Document от библиотеки типов по имени «Inventor.». Следующая строка использует глобальную переменную, доступную только в VBA, по имени «ThisApplication». Это обеспечивает прямой доступ к объекту Application. С объектом Application Вы можете через объектную иерархию получить любой объект, в котором Вам необходим. В примере Вы используете свойство ActiveDocument объекта Application, чтобы получить документ, который является в настоящее время активным. Первая строка Условного оператора If вызывает свойство FullFileName объекта Document, чтобы увидеть, или определено какое либо имя. Возвращается пустая строка, если файл не был сохранен еще. Если имя файла существует, свойство FullFileName используется снова, чтобы отобразить имя используемого файла.

Имеются различные методы получить объект Application в зависимости от того, как Вы соединяетесь с Inventor – извне или работаете внутри него. Ниже тот же самый пример, записанный для внешнего процесса VB программы.

Public Sub VBSample()
' Set a reference to a running instance of Inventor.
On Error Resume Next
Dim oApp As Inventor.Application
Set oApp = GetObject(, "Inventor.Application")
If Err Then
MsgBox "Inventor must be running."
Exit Sub
End If
On Error GoTo 0
' Set a reference to the currently active document.
Dim oDoc As Inventor.Document
Set oDoc = oApp.ActiveDocument
' Check to see if a filename is defined.
If oDoc.FullFileName = "" Then
MsgBox "The file has not been saved."
Else
MsgBox "The active file is: " & oDoc.FullFileName
End If
End Sub


Единственное различие между этой и предыдущей версией примера – то, как получена ссылка к объекту Application. В этом случае используется VB функция GetObject, чтобы получить ссылку на Inventor. В примере используется VB error trapping (заманивание в ловушку ошибки), чтобы захватить случай, когда Inventor не выполняется. Вы можете также использовать VB функцию CreateObject, чтобы запустить Inventor и установить ссылку на объект Application.

Разновидности VBA проектов

Inventor’s VBA поддерживает три типа проектов: Document, Application и User (документа, прикладной и пользовательский).

Первые два создаются автоматически при запуске редактора VBA, пользовательский тип проекта можно создать (открыть) в VBA редакторе кнопками меню File>Новый проект…  Первичное различие между этими типами проектов то, где проект VBA сохранен:

  • В случае проекта типа Document, VBA проект сохраняется в пределах документа Inventor.
  • В случае прикладного и пользовательского проекта, проект сохраняется во внешнем файле с расширением .ivb.

Различие между прикладными и пользовательскими проектами в том, как они загружены в VBA среду. Inventor загружает прикладные проекты автоматически всякий раз, когда пользователь начинает работать с Inventor. Пользовательские проекты необходимо догружать при каждом сеансе работы с Inventor. Только один проект может быть определен, как прикладной проект. Любой пользовательский проект можно сделать прикладным

Прикладной проект только один и загружается автоматически при запуске Inventor. Его создание может происходить даже без открытия Inventor документа, достаточно запустить VBA редактор. В результате откроется редактор VBA c открытым окном модуля для записи кода. Введем в него следующий код:

Public Sub SampleMacro()
MsgBox "This is a sample."
End Sub

Для запуска созданного макроса достаточно в окне Макросы (в Inventor окно Макросы открывается кнопками меню Инструменты>Макросы) выполнить Click на кнопке Run.

Для создания VBA проекта типа Document необходимо, чтобы был начат или открыт какой-либо Inventor документ (Part, Assembly…). Например, при создании Inventor документа Деталь1 в VBA редакторе отобразится следующая иерархия объектов.

Проект Document имеет модуль «ThisDocument». Он представляет документ, в который можно записывать макрокоманду, точно также как и в любой другой модуль. Запись кода в пределах ThisDocument модуля дает Вам прямой доступ к Inventor документу. Например, следующий код правилен в пределах ThisDocument модуля:

Public Sub DocDisplayName()
Dim sDocDisplayName As String
sDocDisplayName = DisplayName
MsgBox sDocDisplayName
End Sub

DisplayName – свойство объекта Document. При записи кода в пределах ThisDocument модуля, методы и свойства документа непосредственно доступны. Объект Document также доступен в пределах других модулей проекта через использование глобальной переменной ThisDocument. Например, код ниже может использоваться в других модулях проекта Document:

Public Sub DocDisplayName ()
Dim sDocDisplayName As String
sDocDisplayName = ThisDocument.DisplayName
MsgBox sDocDisplayName
End Sub

Глобальная переменная ThisDocument не доступна в проектах Application и User. В этих проектах, и в проектах Document, Вы можете использовать «ThisApplication» как глобальную переменную. Это обеспечивает прямой доступ к объекту Application:

Public Sub DocDisplayName ()
Dim sDocDisplayName As String
sDocDisplayName = ThisApplication.ActiveDocument.DisplayName
MsgBox sDocDisplayName
End Sub

VBA, подобно Visual Basic, позволяет Вам создавать кроме модулей кода (Module, ThisDocument) еще модули формы (UserModule) и класса (Class Module). В отличие от Visual Basic все VBA модули содержатся в пределах одного файла и не могут загружаться отдельно от проекта.

С другой стороны каждый VBA проект может содержать много несвязанных функциональных возможностей. Т.е., любое количество функций может быть написано в пределах единственного проекта и выполнено независимо. Для создания дополнительных модулей необходимо выполнить Click правой кнопкой на имени соответствующего проекта в браузере.

 

 

Автор: Николай Свирневский

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *