Урок 5. Добавим атрибуты.

Урок 5. Добавим атрибуты

В уроке 4 вы создали на форме кнопку, чтобы подавлять видимость выделенных компонентов в активной сборке Inventor.  Вы познакомились с вариантами использования объектов Inventor и способами управления последовательностью выполнения программы с помощью выражений “If Then” и “For Next”.  Теперь вместо непосредственного подавления видимости выделенных компонентов мы научимся помечать нужные компоненты, чтобы управлять впоследствии их видимостью.  Присвоение компонентам атрибутов, поддерживаемое Inventor API, дает возможность находить и выполнять требуемые действия с ранее помеченными компонентами.

Обратная связь: напишите нам об этом занятии или о курсе «Моя первая программа»: myfirstplugin@autodesk.com
Скачать файлы Inventor для урока 5
  lesson5_visualstudio_visualexpress00.zip (zip - 19Kb)

 

  1. Загрузите проект из предыдущего урока и откройте Form1 в окне кода. Если плагин работает, остановите его командой Остановить отладку в меню Отладка VB Express.  Другой способ — закрыть окно формы кликом на x в правом верхнем углу формы.  Если активно окно конструктора, правым кликом на Form1.vb в обозревателе решения откройте контекстное меню и укажите в нем пункт Перейти к коду.  В цикле For Next обработчика события Button1_Click вы уже сейчас можете подавить видимость выделенных пользователем компонентов, меняя у каждого из них текущее значение свойства Visible на False.  Закомментируйте строку, в которой меняется значение свойства Visible. Для этого достаточно в начале строки поставить апостроф (') (одинарную кавычку). 
           For Each obj In selSet
                compOcc = obj
                Debug.Print(compOcc.Name)
                'compOcc.Visible = False
           Next
    
  2. В Inventor API имеются три класса, предназначенные для присвоения объектам атрибутов.  Один из них — коллекция наборов атрибутов AttributeSets.  Введите строку кода с объявлением переменной attbSets типа AttributeSets.  В этой переменной мы сохраним ссылку на свойство AttributeSets компонента compOcc
    Dim attbSets As AttributeSets = compOcc.AttributeSets
    
  3. Мы собираемся однократно присвоить атрибут помечаемым объектам.  Метод NameIsUsed() коллекции AttributeSets дает возможность проверить, не создан ли уже набор атрибутов AttributeSet с заданным именем.  После кода, введенного на шаге 2, введите следующие строки:
    ' Добавим атрибуты в ComponentOccurrence
    If Not attbSets.NameIsUsed("myPartGroup") Then
     
    End If
    
  4. Теперь вы создадите и инициализируете переменную attbSet типа AttributeSet, как и раньше для этого применим ключевое слово Dim и знак равенства.  Строка myPartGroup задает имя набора атрибутов AttributeSet в коллекции AttributeSets.  После условного выражения If Then, введенного на шаге 3, добавьте следующую строку:
    Dim attbSet As AttributeSet = attbSets.Add("myPartGroup")
    

  5. И наконец, третьим классом является, собственно, класс Attribute.  Объекты Attribute создаются методом Add() класса AttributeSet.  Вы можете присвоить ссылку на результат метода Add() непосредственно своей переменной attb типа Inventor.Attribute.  Это еще один случай, когда во избежание конфликта имен с другим классом нам приходится явно указывать пространство имен Inventor.
    Dim attb As Inventor.Attribute = _
                 attbSet.Add( _
                   "PartGroup1", ValueTypeEnum.kStringType, "Group1")
    

  6. Выполните построение проекта. Для этой цели используйте пункт Build в меню Debug. Если в программе есть ошибки, вы получите диагностические сообщения. Регулярное построение проекта помогает выявлять ошибки на ранних стадиях разработки и заодно сохраняет вашу работу на диске.

 

Окно контрольных значений

 

  1. Создайте точку останова программы на строке, в которой добавляется атрибут.  Для этого установите курсор на нужной строке и нажмите функциональную клавишу F9.  Другой метод — кликнуть на серой вертикальной полосе слева от окна кода, той самой, где появляется красный маркер точки останова.



  2. Запустите программу на выполнение, используя клавишу F5 или выбрав пункт Начать отладку в меню Отладка.


  3. В пользовательском интерфейсе Inventor выделите пару компонентов активной сборки и кликните на кнопке в форме.  Среда Visual Basic Express станет активной в момент, когда управление программой дойдет до строки, отмеченной точкой останова. Вы увидите окно программного кода в состоянии ожидания ваших действий.



  4. В состоянии ожидания на точке останова вы можете просматривать текущие значения переменных в окне Контрольное значение (Watch window). Для этого правым кликом на имени переменной откройте контекстное меню и выберите там пункт  Добавить контрольное значение (Add Watch).



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



    Для продолжения вычислений используйте клавишу F5 или варианты из меню Отладка (Debug). Например, для пошагового выполнения программы  полезна клавиша F8.



  5. Для завершения отладки используйте пункт Остановить отладку (Stop Debugging) меню Отладка (Debug).

 

Добавление к форме другой кнопки и применение объекта AttributeManager для поиска компонентов

Tеперь добавим к нашей форме вторую кнопку, с помощью которой мы воспользуемся ранее присвоенными атрибутами.  Переключитесь на Конструктор (правый клик на Form1.vb в браузере проекта и там пункт Открыть в конструкторе или же Shift+F7).  Снова отобразите Панель элементов (Shift+F7) через меню Вид → Другие окна → Панель элементов (или клавиши Ctrl+Alt+X). Перетащите мышью элемент управления из палитры на форму и задайте кнопке подходящий размер.



  1. По умолчанию на только что созданной кнопке отображается текст типа Button1, Button2 и т.д.  В большинстве случаев его желательно заменить на более подходящий вариант.  Это можно сделать в окне Свойства Обозревателя решений.  Чтобы перейти к свойствам, достаточно правым кликом на кнопке открыть ее контекстное меню и выбрать там пункт Свойства.  За отображаемый на кнопке текст отвечает ее свойство Text. Измените значение свойства Text второй кнопки на «Скрыть / Показать группу».  Обратите внимание, отображаемый текст никак не влияет на внутреннее имя кнопки.

     

  2. Аналогичным образом измените текст на первой кнопке на «Добавить в группу».
  3. Двойной клик на кнопке в «Добавить в группу» открывает окно кода и показывает в нем заготовку обработчика события «нажатие кнопки».  На предыдущем уроке мы получили тот же результат, но с использованием выпадающих списков в окне кода.  Оба метода эквивалентны.

  4. В момент клика на кнопке Button2 нам понадобится получить ссылку на AttributeManager активного документа.  Мы должны убедиться, что этот документ является сборкой.  Код такой проверки мы уже имеем в обработчике нажатия кнопки Button1_Click, так что его можно просто скопировать в процедуру Button2_Click Sub.
       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
    

  5. Теперь можно воспользоваться функционалом менеджера атрибутов для поиска ассоциированных с атрибутами объектов.  Введите следующие команды после строк, созданных на предыдущем шаге.
    Try
         Dim attbMan As AttributeManager = asmDoc.AttributeManager
     
          Dim objsCol As ObjectCollection
          objsCol = _
            attbMan.FindObjects("myPartGroup", "PartGroup1", "Group1")
     
         Catch ex As Exception
              MsgBox("Проблема с подавлением видимости компонента")
    End Try
    

  6. Метод FindObjects вернет все отмеченные нашими атрибутами объекты в составе коллекции типа ObjectCollection.  Нам остается лишь пройтись по членам этой коллекции и инвертировать признак видимости компонентов.  В результате все видимые погаснут, а невидимые станут отображаться.  Для этого введите следом следующий код между вызовом метода FindObjects и ключевым словом Catch.
    Dim compOcc As ComponentOccurrence
    For Each obj As Object In objsCol
        compOcc = obj
    'Переключаем состояние видимости
    'компонента на противоположное
       compOcc.Visible = Not compOcc.Visible
    Next
    
  7. Выполните построение проекта и исправьте все ошибки, если будут компилятор их обнаружит.  Вы можете тестировать и отлаживать программу, используя F5 или пункт Начать отладку (Start Debugging) меню Отладка (Debug).  Выделите в сборке пару компонентов и кликните кнопку Button1, чтобы вставить в них наши атрибуты.  Теперь при каждый клик на кнопке Button2 будет переключать видимость отмеченных компонентов. 

Код в кнопке 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 завершается.