В уроке 4 вы создали на форме кнопку, чтобы подавлять видимость выделенных компонентов в активной сборке Inventor. Вы познакомились с вариантами использования объектов Inventor и способами управления последовательностью выполнения программы с помощью выражений “If Then” и “For Next”. Теперь вместо непосредственного подавления видимости выделенных компонентов мы научимся помечать нужные компоненты, чтобы управлять впоследствии их видимостью. Присвоение компонентам атрибутов, поддерживаемое Inventor API, дает возможность находить и выполнять требуемые действия с ранее помеченными компонентами. |
![]() |
lesson5_visualstudio_visualexpress00.zip (zip - 19Kb) |
For Each obj In selSet compOcc = obj Debug.Print(compOcc.Name) 'compOcc.Visible = False Next
Dim attbSets As AttributeSets = compOcc.AttributeSets
' Добавим атрибуты в ComponentOccurrence If Not attbSets.NameIsUsed("myPartGroup") Then End If
Dim attbSet As AttributeSet = attbSets.Add("myPartGroup")
Dim attb As Inventor.Attribute = _ attbSet.Add( _ "PartGroup1", ValueTypeEnum.kStringType, "Group1")
Tеперь добавим к нашей форме вторую кнопку, с помощью которой мы воспользуемся ранее присвоенными атрибутами. Переключитесь на Конструктор (правый клик на Form1.vb в браузере проекта и там пункт Открыть в конструкторе или же Shift+F7). Снова отобразите Панель элементов (Shift+F7) через меню Вид → Другие окна → Панель элементов (или клавиши Ctrl+Alt+X). Перетащите мышью элемент управления из палитры на форму и задайте кнопке подходящий размер.
If _invApp.Documents.Count = 0 Then MsgBox("Следует открыть документ сборки") Return End If If _invApp.ActiveDocument.DocumentType <> _ DocumentTypeEnum.kAssemblyDocumentObject Then MsgBox("Активным должен быть документ сборки") Return End If Dim asmDoc As AssemblyDocument asmDoc = _invApp.ActiveDocumen
Try Dim attbMan As AttributeManager = asmDoc.AttributeManager Dim objsCol As ObjectCollection objsCol = _ attbMan.FindObjects("myPartGroup", "PartGroup1", "Group1") Catch ex As Exception MsgBox("Проблема с подавлением видимости компонента") End Try
Dim compOcc As ComponentOccurrence For Each obj As Object In objsCol compOcc = obj 'Переключаем состояние видимости 'компонента на противоположное compOcc.Visible = Not compOcc.Visible Next
Код в кнопке Button1
Как вы теперь знаете, Inventor API дает нам возможность ассоциировать пользовательские атрибуты с объектами Inventor (в нашем случае, с компонентами). Эти атрибуты могут быть полезны, чтобы впоследствии найти помеченные объекты для выполнения с ними тех или иных операций. В нашем примере мы использовали атрибуты для выявления компонентов, видимость которых нуждается в изменении. В Inventor API для работы с атрибутами предусмотрены три класса: AttributeSets, AttributeSet и Attribute. Очень многие объекты Inventor, в частности, ComponentOccurrence, имеют свойство AttributesSets. Ссылка на коллекцию наборов атрибутов AttributesSets была сохранена в переменной attbSets, имя которой получено сокращением от AttributesSets. На практике применяются разнообразные схемы именования переменных, однако особенно полезны мнемонические имена, которые легко ассоциируются либо с типом, либо с назначением переменной.
Dim attbSets As AttributeSets = compOcc.AttributeSets
Элементами коллекции AttributesSets являются наборы атрибутов AttributeSet. Они, в свою очередь, также являются коллекциями, но уже атрибутов. Каждый набор AttributeSet должен иметь имя, уникальное в пределах материнской коллекции AttributesSets, т.е. в пределах своего объекта. Вы не можете создать в объекте двух наборов с одинаковыми именами, это вызовет ошибку. Чтобы проверить, имеется ли в объекте набор атрибутов с конкретным именем, в коллекции AttributesSets предусмотрен метод NameIsUsed(). Имя набора атрибутов myPartGroup, который создавался в данном примере, передается методу NameIsUsed(). В блоке If Not Then код между If и End If выполняется в случае, если в компоненте набор атрибутов с именем myPartGroup еще не создан.
' Добавим атрибуты в ComponentOccurrence If Not attbSets.NameIsUsed("myPartGroup") Then End If
Для создания набора атрибутов служит метод Add() коллекции AttributeSets. Напомним, ссылку на коллекцию наборов атрибутов возвращает свойство AttributeSets компонента. Аргументом метода AttributeSets.Add() является имя создаваемого набора атрибутов AttributeSet. В этом качестве нами использовалось имя myPartGroup, заданное явно строкой символов.
Dim attbSet As AttributeSet = attbSets.Add("myPartGroup")
Строковые константы заключают последовательность символов в двойные кавычки. Рекомендуется в таких случаях давать содержательные имена, это делает текст программы более понятным. Это же имя myPartGroup было использовано в методе NameIsUsed для проверки существования в компоненте набора атрибутов с таким именем.
If Not attbSet attbSets.Add("myPartGroup") Then ... End If
Третьим объектом, который требуется для создания атрибутов, является собственно сам атрибут Attribute. Он создается методом Add() набора атрибутов AttributeSet.
Dim attb As Inventor.Attribute = _ attbSet.Add( _ "PartGroup1", ValueTypeEnum.kStringType, "Group1")
Метод AttributeSet.Add() принимает три аргумента. Обратите внимание, насколько полезен сервис IntelliSense, чтобы ориентироваться среди типов различных аргументов.
Первый аргумент имеет тип String, это имя создаваемого атрибута. Второй аргумент задает тип значения этого атрибута. Допускаются типы, приведенные в множестве Inventor.ValueTypeEnum. Третьим аргументом является само значение атрибута. Тип значения должен быть согласован с типом, заявленным во втором аргументе.
Код в кнопке Button2
Код в Button2 ищет компоненты, отмеченные атрибутами при выполнении кода кнопки Button1. Для этого был применен метод FindObjects() объекта AttributeManager. Ссылка на менеджер атрибутов была получена из документа сборки asmDoc и сохранена в переменной attbMan. Для перехвата и обработки возможных в процессе выполнения программы ошибок все эти операции были помещены в блок Try Catch.
Try Dim attbMan As AttributeManager = asmDoc.AttributeManager Dim objsCol As ObjectCollection objsCol = _ attbMan.FindObjects("myPartGroup", "PartGroup1", "Group1") Catch ex As Exception MsgBox("Проблема с подавлением видимости компонента") End Try
Метод FindObjects() возвращает результаты поиска объектов с атрибутами в виде коллекции типа ObjectCollection. Задание на поиск в этом методе формируется с помощью трех необязательных аргументов. В нашем примере были использованы все три – был задан поиск компонентов с конкретным именем набора атрибутов (“myPartGroup”), именем атрибута (“PartGroup1”) и значением атрибута (“Group1”). В данном простом случае такой набор аргументов явно избыточен. Было бы достаточно проверять наличие у объекта нужного набора атрибутов. Обратите внимание, в подсказках IntelliSense необязательные аргументы указываются в квадратных скобках.
Итак, найденные в методе FindObjects компоненты возвращаются нам в составе коллекции типа ObjectCollection. Для переключения их видимости нам требуется организовать цикл перебора всех членов коллекции и у каждого из них инвертировать текущее значение свойства Visible. Наиболее естественным типом цикла по всем членам коллекции является цикл “For Each Next”. Другие типы циклов также будут работать, но в таком случае для доступа к конкретным членам коллекции вам придется самостоятельно организовывать вычисление их порядковых номеров. Цикл For Each Next без лишних усилий предоставляет в наше распоряжение по очереди каждый элемент коллекции.
В этом цикле всю работу делает одна строка, в которой значение свойства Visible компонента, изменяется на противоположное. Если было False, станет True и наоборот. Оператор логического отрицания Not выполняет инвертирование значения очень экономично, избавляя нас от необходимости использовать условные выражения.
Dim compOcc As ComponentOccurrence For Each obj As Object In objsCol compOcc = obj 'Переключаем состояние видимости 'компонента на противоположное compOcc.Visible = Not compOcc.Visible Next
На этом занятие 5 завершается.