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

Содержимое удалено Содержимое добавлено
Строка 183:
TransientGeometry не ограничивается точками, линиями или плоскостями. Например, объект Box может расширяться, чтобы поглотить заданные точки, или проверить наличие пересечения с другим объектом Box, или может проверить, находится ли у него внутри заданная пользователем точка.
 
== Ссылочные ключи и атрибуты ==
== Плоский эскиз ==
 
Ссылочные ключи (Reference keys) являются средством получения особых ссылок на объекты Инвентора. Такие ссылки отличаются тем, что сохраняются между этапами редактирования модели и даже между сеансами работы Инвентора. Например, приведенный ниже программный фрагмент получает ссылку на тело и затем ссылку на грань этого тела.
 
 
Dim oBody As SurfaceBody
Set oBody = ThisApplication.ActiveDocument.componetdefinition.SurfaceBodies.Item(1)
Dim oFace As Face
Set oFace = oBody.Faces.Item(1)
 
 
 
Это наиболее распространенный вариант ссылок на объекты, однако они являются временными. Если каким-либо образом сохранить такие ссылки, затем закрыть и снова открыть документ, выяснится, что сохраненные ссылки более не актуальны. Если ссылка указывает на объект типа B-Rep (SurfaceBody, FaceShell, Face, EdgeLoop, Edge, EdgeUse или Vertex), и вы сделали нечто, что вызвало пересчет модели, скажем, изменили значение параметра, ссылка перестанет быть актуальной и, следовательно, сколько-нибудь полезной. Для объектов типа B-Rep такие ссылки имеют смысл только, пока модель пребывает в неизменном статичном состоянии. Ссылки на прочие (не B-Rep) объекты остаются действительными и после пересчета модели, однако теряют актуальность c закрытием документа.
API предоставляет два метода, которые позволят получить более долгоживущие ссылки на любой объект внутри Инвентора. Это ссылочные ключи (reference key) и атрибуты (attribute).
 
 
=== Ссылочные ключи (Reference Keys) ===
 
Ссылочный ключ (Reference key) —это уникальный и неизменный идентификатор объекта. Reference key это не сама ссылка, но он используется для создания ссылки на тот объект, для которого reference key был сгенерирован. Он неизменный, поскольку продолжает работать в процессе пересчета модели, а также после закрытия и повторного открытия документа. Другой особенностью ссылочных ключей является то, что сам Инвентор их не поддерживает. Это означает, что Инвентор не сохраняет эту информацию в своих файлах. Если вы используете ссылочные ключи, задача их сохранения между сеансами работы Инвентора ложится на вас. Использовать ссылочные ключи в пределах одной сессии Инвентора довольно просто, для этого достаточно сохранить ключ в переменной и использовать его по мере необходимости. Чтобы воспользоваться ссылочными ключами в последующих сеансах Инвентора, вы вероятно сохраните их во внешнем файле и, таким образом, сможете использовать ключи в любой момент в будущем. Управление ссылочными ключами является исключительно вашей заботой. Инвентор лишь предоставляет их в ваше распоряжение, а для заданного ключа возвращает соответствующий ему объект.
Поскольку сам Инвентор не управляет ключами, возникает любопытный побочный эффект — вы можете использовать ссылочные ключи без изменения документа, в котором ключи были получены. Это означает, что вам не требуется сохранять документ, в котором они были сгенерированы, более того, сам документ может быть защищенным от изменений (read-only). По этой причине ссылочные ключи используются в Apprentice.
Техника использования ссылочных ключей для объектов типа B-Rep отличается рядом особенностей. Мы начнем с более простых не B-Rep объектов, а уже потом перейдем к B-Rep. При необходимости поддерживать одновременно B-Rep и не B-Rep объекты, вы можете для всех объектов применять единообразную технику, характерную для B-Rep, как более универсальную.
 
=== Ссылочные ключи для не B-Rep объектов ===
 
В принципе, идея ссылочных ключей довольно проста, если представлять их как идентификаторы объектов. Ссылочные ключи не B-Rep объектов еще и довольно просты в применении. Вы получаете ссылочный ключ объекта, каким-либо образом сохраняете его и позднее используете в любой момент, чтобы получить нормальную «живую» ссылку на объект. Объект ReferenceKeyManager (менеджер ссылочных ключей) в документе с нужными вам объектами, обеспечивает ряд методов и свойств для работы со ссылочными ключами. В этом процессе есть только одна особенность. Ссылочный ключ это не одно значение, а байтовый массив. Вспомним, байт — целое число в интервале от 0 до 255.
Ниже приведен фрагмент кода, который иллюстрирует получение ссылочных ключей, запись ключа в файл, чтение его из файла, и, наконец, восстановление связи ключа с исходным объектом. Процедура SaveNonBRepKey может быть выполнена для любого документа детали, содержащего хотя бы два эскиза. GetNonBRepKey можно применить для того же самого документа (даже после его закрытия и повторного открытия), чтобы восстановить ключи из файла и использовать их для установления связи с эскизами.
Public Sub SaveNonBRepKey()
 
Dim oDoc As PartDocument
Set oDoc = ThisApplication.ActiveDocument
' Получение ссылочных ключей (reference keys) для двух эскизов
Dim oSketch As Sketch
Set oSketch = oDoc.ComponentDefinition.Sketches.Item(1)
Dim abtRefKey1() As Byte
Call oSketch.GetReferenceKey(abtRefKey1)
 
Set oSketch = oDoc.ComponentDefinition.Sketches.Item(2)
Dim abtRefKey2() As Byte
Call oSketch.GetReferenceKey(abtRefKey2)
 
' Открываем файл в режиме binary access.
Dim iFile As Integer
iFile = FreeFile
Open "C:\Temp\RefKey.dat" For Binary As #iFile
 
' Запись ссылочных ключей в файл (вместе с длиной массива).
Dim iSize As Long
iSize = UBound(abtRefKey1) - LBound(abtRefKey1)
Put #iFile, , iSize
Put #iFile, , abtRefKey1
iSize = UBound(abtRefKey2) - LBound(abtRefKey2)
Put #iFile, , iSize
Put #iFile, , abtRefKey2
' Закрываем файл.
Close #iFile
End Sub
 
Public Sub GetNonBRepKey()
' Открываем файл.
Dim iFile As Integer
iFile = FreeFile
Open "C:\Temp\RefKey.dat" For Binary As #iFile
' Читаем из файла два ссылочных ключа.
Dim iRefKeyLen As Long
Get #iFile, , iRefKeyLen
Dim abtRefKey1() As Byte
ReDim abtRefKey1(iRefKeyLen) As Byte
Get #iFile, , abtRefKey1
 
Get #iFile, , iRefKeyLen
Dim abtRefKey2() As Byte
ReDim abtRefKey2(iRefKeyLen) As Byte
Get #iFile, , abtRefKey2
 
' Закрываем файл.
Close #iFile
' Получаем ссылку на менеджер ссылочных ключей (reference key manager)
' активного документа.
Dim oRefKeyManager As ReferenceKeyManager
Set oRefKeyManager = ThisApplication.ActiveDocument.ReferenceKeyManager
' Восстановление связи с исходными объектами
On Error Resume Next
Dim oSketch1 As Sketch
Set oSketch1 = oRefKeyManager.BindKeyToObject(abtRefKey1)
If Err Then
MsgBox "Failed to bind back to the first sketch."
Err.Clear
End If
 
Dim oSketch2 As Sketch
Set oSketch2 = oRefKeyManager.BindKeyToObject(abtRefKey2)
If Err Then
MsgBox "Failed to bind back to the second sketch."
Err.Clear
End If
On Error Goto 0
' Используем свойство Name эскиза для проверки работоспособности ссылок.
MsgBox oSketch1.Name
MsgBox oSketch2.Name
End Sub
 
Обратите внимание, попытка восстановить из ключа ссылку вполне может закончиться неудачей. Например, если объект, на который ссылается ключ, уже более не существует. Если в нашем примере вы удалите один из эскизов, вызов метода BindKeyToObject для этого отсутствующего эскиза приведет к ошибке.
 
=== Ссылочные ключи для B-Rep объектов ===
 
Использование reference keys в случае объектов B-Rep несколько сложнее. Для объекта B Rep ключ это не просто набор байтов, однозначно идентифицирующих объект, но последовательность байтов, используемая для поиска объекта в таблице. Поскольку объекты B-Rep очень динамичны, определение ссылок на конкретный объект внутри B-Rep оказывается сложным процессом. Полный идентификатор B-Rep в действительности есть описание самого объекта и связанных с ним объектов в составе B-Rep, которое и позволяет Инвентору находить их снова. По этой причине идентификаторы B-Rep могут быть довольно большими. Для минимизации размера ссылочных ключей и с учетом того, что часть этой описательной информации дублируется в других B-Rep объектах, применяются специальные таблицы. На них и ссылаются ссылочные ключи объектов B-Rep. В API эта таблица получила название reference key context — контекст ссылочных ключей.
 
Если понять назначение таблицы контекста, то работать с объектами B-Rep станет не намного сложнее, чем с прочими объектами. Как уже отмечалось, вы всегда можете выбрать ссылочный контекст (reference context), независимо от того, работаете ли вы с объектами B-Rep или нет, обеспечивая внутренние связи в своей программе. Если у вас не B-Rep объект, таблица контекста будет просто проигнорирована. Следующий программный фрагмент иллюстрирует приемы работы со ссылочными ключами для объектов B-Rep.
 
 
Public Sub SaveBRepKey()
Dim oDoc As PartDocument
Set oDoc = ThisApplication.ActiveDocument
' Получение ссылки на выделенную грань
Dim oFace As Face
On Error Resume Next
Set oFace = oDoc.SelectSet.Item(1)
If Err Then
MsgBox "A face must be selected."
Exit Sub
End If
On Error GoTo 0
' Ссылка на ReferenceKeyManager активного документа
Dim oRefKeyManager As ReferenceKeyManager
Set oRefKeyManager = oDoc.ReferenceKeyManager
' Создание контекста ключа.
Dim iKeyContext As Long
iKeyContext = oRefKeyManager.CreateKeyContext
' Создание ключа для грани.
Dim abtRefKey() As Byte
Call oFace.GetReferenceKey(abtRefKey, iKeyContext)
' Открываем файлOpen a file for binary access.
Dim iFile As Integer
iFile = FreeFile
Open "C:\Temp\RefKey.dat" For Binary As #iFile
' Преобразование контекста ключа (key context) в байтовый массив.
Dim abtKeyContext() As Byte
Call oRefKeyManager.SaveContextToArray(iKeyContext, abtKeyContext)
' Запись контекста ключа в файл вместе с длиной массива.
Dim iSize As Long
iSize = UBound(abtKeyContext) - LBound(abtKeyContext)
Put #iFile, , iSize
Put #iFile, , abtKeyContext
' Запись ссылочного ключа в файл вместе с длиной массива.
iSize = UBound(abtRefKey) - LBound(abtRefKey)
Put #iFile, , iSize
Put #iFile, , abtRefKey
' Закрываем файл.
Close #iFile
End Sub
 
Public Sub GetBRepKey()
' Открываем файл.
Dim iFile As Integer
iFile = FreeFile
Open "C:\Temp\RefKey.dat" For Binary As #iFile
' Считываем из файла данные контекста ключа.
Dim iLen As Long
Get #iFile, , iLen
Dim abtKeyContext() As Byte
ReDim abtKeyContext(iLen) As Byte
Get #iFile, , abtKeyContext
' Читаем из файла ключ.
Get #iFile, , iLen
Dim abtRefKey() As Byte
ReDim abtRefKey(iLen) As Byte
Get #iFile, , abtRefKey
' Закрываем файл.
Close #iFile
' Получаем ссылку на менеджер ссылочных ключей активного документа.
Dim oRefKeyManager As ReferenceKeyManager
Set oRefKeyManager = ThisApplication.ActiveDocument.ReferenceKeyManager
' Восстанавливаем контекст ключа (key context).
Dim iKeyContext As Long
iKeyContext = oRefKeyManager.LoadContextFromArray(abtKeyContext)
' Устанавливаем связь с гранью.
' Вернется объект Face (грань), если будет найдена одна грань.
' Если граней будет несколько, то вернется коллекция.
' Если ни одной грани не найдется, будет сгенерирована ошибка.
Dim oResult As Object
On Error Resume Next
Set oResult = oRefKeyManager.BindKeyToObject(abtRefKey, iKeyContext)
If Err Then
MsgBox "The face doesn't exist."
Else
 
' Выделяем полученную грань (грани).
Dim oHS As HighlightSet
Set oHS = ThisApplication.ActiveDocument.HighlightSets.Add
If TypeOf oResult Is Face Then
oHS.AddItem oResult
MsgBox "A single face still exists."
Else
Dim i As Integer
For i = 1 To oResult.Count
oHS.AddItem oResult.Item(i)
Next
MsgBox oResult.Count & " faces now exist for the original face."
End If
oHS.Clear
End If
End Sub
 
 
Этот пример иллюстрирует две концепции, уникальные для ссылочных ключей B Rep объектов. Первая заключается в использовании контекста ключа (key context). Вы создаете контекст ключа и передаете его идентификатор методам GetReferenceKey и BindKeyToObject. При сохранении данных ключа в файл используется метод SaveContextToArray менеджера контекста, чтобы преобразовать контекст ключа в массив байтов. После считывания из файла информации о контексте ключа вы можете вызвать метод LoadContextFromArray менеджера контекста, чтобы воссоздать контекст ключа из массива байтов.
 
== 3D эскиз ==