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

Содержимое удалено Содержимое добавлено
Строка 412:
Этот пример иллюстрирует две концепции, уникальные для ссылочных ключей B Rep объектов. Первая заключается в использовании контекста ключа (key context). Вы создаете контекст ключа и передаете его идентификатор методам GetReferenceKey и BindKeyToObject. При сохранении данных ключа в файл используется метод SaveContextToArray менеджера контекста, чтобы преобразовать контекст ключа в массив байтов. После считывания из файла информации о контексте ключа вы можете вызвать метод LoadContextFromArray менеджера контекста, чтобы воссоздать контекст ключа из массива байтов.
 
=== Атрибуты (Attributes) ===
== 3D эскиз ==
 
Атрибуты (attributes) довольно сильно отличаются от ссылочных ключей, но они успешно применяются для решения сходных задач. Вы можете использовать атрибуты для обеспечения доступа к помеченному объекту в любой момент его жизни. Если эта задача является основной, то через атрибуты ее решить проще, чем с помощью ссылочных ключей. Главная причина легкости их применения заключается в том, что вам не нужно беспокоиться о поддержке данных атрибутов, как это обстоит со ссылочными ключами, за вас это сделает Инвентор. Однако для этого вы должны иметь доступ к файлу на запись, т.к. Инвентору необходимо сохранить в файлах данные атрибутов. В большинстве случаев, если вам требуется лишь запомнить конкретный объект для продолжения работы с ним в следующей сессии, атрибутам следует отдать предпочтение.
 
 
 
Кроме организации ссылок на объекты в последующих сеансах работы Инвентора, атрибуты оказываются полезными и для решения других задач. Функционал атрибутов позволяет «прикрепить» дополнительную информацию практически к любому объекту Инвентора. Позднее эта информация может не только извлекаться из объектов, но и использоваться для организации запросов на поиск конкретных объектов. На рисунке справа показана относящаяся к атрибутам часть объектной модели. Здесь Entity — любой объект, поддерживающий атрибуты. Свидетельством этой поддержки является наличие у объекта Entity свойства AttributeSets (указатель на коллекцию ассоциированных с объектом наборов атрибутов).
 
Любой объект может быть связан со многими объектами AttributeSet (набор атрибутов). Наборы атрибутов AttributeSet обязаны иметь уникальные в пределах объекта имена. Множественность наборов атрибутов AttributeSet у любого Entity позволяет всякому приложению формировать собственные и независимые от других приложений наборы атрибутов. Каждый набор AttributeSet может включать любое количество атрибутов — объектов Attribute. Каждый атрибут Attribute имеет имя и значение. Имя атрибута обязано быть уникальным в пределах его набора AttributeSet. Допустимые в атрибутах типы данных: Double, Integer, String и массив байтов (array of Bytes).
 
После добавления к объекту набора атрибутов AttributeSet и самих атрибутов Attribute, они становятся доступными через сам объект. Однако более общий подход заключается формировании запросов на выборку объектов на базе ассоциированной с ними атрибутной информации. Эту задачу решает менеджер атрибутов AttributeManager, ссылку на который предоставляет объект Document. Менеджер атрибутов AttributeManager может выполнять разнообразные задания на выборку объектов Entity, наборов AttributeSet или самих объектов Attribute.
 
Давайте посмотрим, как можно применить атрибуты для решения задачи из предыдущего примера со ссылочными ключами. Ниже приведен фрагмент, эквивалентный обеим предыдущим процедурам сохранения ключей SaveKey. С точки зрения атрибутов нет различий между B-Rep и не B-Rep объектами.
 
<source lang=vbnet>
Public Sub AddAttribute()
Dim oDoc As PartDocument
Set oDoc = ThisApplication.ActiveDocument
' Get a reference to the selected face.
' получение ссылки на выделенную грань.
Dim oFace As Face
On Error Resume Next
Set oFace = oDoc.SelectSet.Item(1)
If Err Then
MsgBox "Грань должна быть выделена."
Exit Sub
End If
On Error GoTo 0
' Создание набора атрибутов с именем "AttributeSample"
Dim oAttSet As AttributeSet
Set oAttSet = oFace.AttributeSets.Add("AttributeSample")
' Создание атрибута с именем "Face" и текстовым значением "Some data"
Dim oAtt As Inventor.Attribute
Set oAtt = oAttSet.Add("Face", kStringType, "Some data")
End Sub
</source>
 
 
Как и в примере с ключами, процедура сначала определяет ссылку на выделенную пользователем грань oFace, а затем она создает для oFace набор атрибутов и в нем атрибут. Для простой идентификации объекта, как в этом примере, в принципе, достаточно создать лишь пустой набор без каких-либо атрибутов. Собственно, атрибутная информация полезна в случае, когда вы хотите связать с объектом какие-либо дополнительные данные.
 
Пример ниже использует ранее созданный атрибут для поиска ассоциированной с ним грани. Обратите внимание, насколько код выглядит проще и короче, чем в примере со ссылочными ключами.
 
<source lang=vbnet>
Public Sub QueryAttribute()
' Получение ссылки на менеджер атрибутов активного документа
Dim oAttribManager As AttributeManager
Set oAttribManager = ThisApplication.ActiveDocument.AttributeManager
' Запрос на выборку объектов с конкретной атрибутной информацией.
Dim oObjects As ObjectCollection
Set oObjects = oAttribManager.FindObjects("AttributeSample", "Face", "Some data")
' Выделить найденные грани, если таковые будут.
If oObjects.Count > 0 Then
Dim oHS As HighlightSet
Set oHS = ThisApplication.ActiveDocument.HighlightSets.Add
Dim i As Integer
For i = 1 To oObjects.Count
oHS.AddItem oObjects.Item(i)
Next
MsgBox "Found objects are highlighted."
oHS.Clear
End If
End Sub
</source>
 
 
Данный пример вызывает метод FindObjects менеджера атрибутов AttributeManager, чтобы получить коллекцию всех объектов, у которых имеется набор атрибутов AttributeSet с именем «AttributeSample» и в нем атрибут с именем «Face» и текстовым значением «Some data». Все три аргумента — необязательные (optional), и в данном конкретном примере указание любого из них будет достаточным, чтобы получить требуемую грань. К примеру, поставленную задачу успешно выполнит следующая инструкция:
 
<source lang=vbnet>
Set oObjects = oAttribManager.FindObjects("AttributeSample")
</source>
 
Поиск на основе всех трех параметров делает возможным выполнение сложных запросов в документе с множеством разнообразных атрибутов.