Урок 6. Окончательный вариант программы

Урок 6: Окончательный вариант программы

В уроке 5 мы использовали атрибуты, чтобы пометить компоненты сборки Inventor. Мы применили атрибуты, чтобы впоследствии «по приборам» найти в сборке эти компоненты и управлять их видимостью. В шестом уроке вместо переключения видимости отмеченных компонентов мы введем дополнительную кнопку, чтобы дать пользователю возможность непосредственно указывать состояние видимости группы компонентов. Мы также введем еще две кнопки, одну для удаления атрибутов из выделенных компонентов, другую — для удаления всех атрибутов из всех компонентов. Мы сделаем код программы более структурированным и удобным для развития и поддержки, введя процедуры, вызываемые в момент клика на кнопках. В этих процедурах мы применим логический аргумент, чтобы одна и та же процедура могла использоваться в различных контекстах.

Обратная связь: напишите нам об этом занятии или о курсе «Моя первая программа myfirstplugin@autodesk.com

 

Скачать файлы Inventor для урока
  lesson6_visualstudio_visualexpress0.zip (zip - 29Kb)

  1. Откройте форму Form1 в проекте из Урока 5 в режиме конструктора (Designer). Если активным оказалось окно кода, то для перехода к Конструктору правым кликом на Form1.vb в Обозревателе решений откройте контекстное меню и воспользуйтесь пунктом «Открыть в конструкторе». Создайте на форме три новых кнопки, расположив их как показано ниже на скриншоте. Измените текст на кнопке, созданной на четвертом уроке, на «Добавить в группу». Для восстановления видимости компонентов у нас будет другая кнопка. На предыдущем уроке мы узнали, как добавлять к форме новые кнопки и изменять на них отображаемый пользователю текст. Откройте Панель элементов управления (toolbox) перетащите на форму значок кнопки, придайте ей желаемый размер и измените текст на кнопке. Сделать это надо для всех трех новых кнопок.

    Текст на новых кнопках:
    Показать группу
    Удалить из группы
    Очистить группу



  2. В окне кода формы между последним End Sub и End Class введите следующие строки:
    Sub HideOrShowGroup(ByVal hide As Boolean)
     
    End Sub
    

  3. Скопируйте код из процедуры Button2_Click и вставьте его в подпрограмму HideOrShowGroup. Вот что в итоге должно получиться:

        Sub HideOrShowGroup(ByVal hide As Boolean)
    
    
    	
    	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.ActiveDocument
     
        Try
          Dim attbMan As AttributeManager = asmDoc.AttributeManager
     
          Dim objsCol As ObjectCollection
          objsCol = _
            attbMan.FindObjects("myPartGroup", "PartGroup1", "Group1")
     
          Dim compOcc As ComponentOccurrence
          For Each obj As Object In objsCol
            compOcc = obj
    
            compOcc.Visible = Not compOcc.Visible
          Next
     
        Catch ex As Exception
          MsgBox("Проблема с подавлением видимости компонента")
        End Try
    
      End Sub
    

  4. Отредактируйте строки в блоке For Each Next.  Свойство Visible компонента следует приравнять значению входного логического аргумента hide

    Dim compOcc As ComponentOccurrence
    For Each obj As Object In objsCol
        compOcc = obj
        compOcc.Visible = hide 
    Next
    

  5. Измените как показано ниже обработчик события кнопки Button2_Click.  Теперь при нажатии на кнопку Button2 будет вызываться процедура HideOrShowGroup с параметром False,

    Private Sub Button2_Click( _
         ByVal sender As System.Object, _
         ByVal e As EventArgs) Handles Button2.Click
       HideOrShowGroup(False)
    End Sub
    

  6. Измените аналогичным образом обработчик события для кнопки Button3 с текстом Show group.  Теперь нажатие этой кнопки приведет к вызову процедуры HideOrShowGroup с аргументом True.

    Private Sub Button3_Click( _
         ByVal sender As System.Object, _
         ByVal e As System.EventArgs) Handles Button3.Click
       HideOrShowGroup(True)
    End Sub
    

  7. В окне кода формы между последним End Sub и End Class введите следующие строки:

    Public Sub AddOrRemoveFromGroup(ByVal add As Boolean 
    End Sub
    
    Это будет новая процедура AddOrRemoveFromGroup с одним аргументом логического типа.

  8. Скопируйте приведенный ниже код из обработчика Button1_Click в тело процедуры AddOrRemoveFromGroup.

        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.ActiveDocument
     
        If asmDoc.SelectSet.Count = 0 Then
          MsgBox("Должна быть выделена деталь или подсборка")
          Return
        End If
     
        Dim selSet As SelectSet
        selSet = asmDoc.SelectSet
     
        Try
          Dim compOcc As ComponentOccurrence
          Dim obj As Object
          For Each obj In selSet
            compOcc = obj
            Debug.Print(compOcc.Name)
    
     
            Dim attbSets As AttributeSets = compOcc.AttributeSets
     
            ' Добавим атрибуты в ComponentOccurrence
            If Not attbSets.NameIsUsed("myPartGroup") Then
     
              Dim attbSet As AttributeSet = attbSets.Add("myPartGroup")
     
              Dim attb As Inventor.Attribute = _
                 attbSet.Add( _
                   "PartGroup1", ValueTypeEnum.kStringType, "Group1")
     
            End If
     
     
          Next
        Catch ex As Exception
          MsgBox("Вы действительно выделили компонент?")
          MsgBox(ex.ToString())
          Return
        End Try
    

    Введите блок If Then Else с проверкой значения входного аргумента add
    If add Then
    
    Блок уловного выражения надо вставить сразу после создания и инициализации переменной attbSets и перед блоком кода «Добавим атрибуты в ComponentOccurrence».
    Dim attbSets As AttributeSets = compOcc.AttributeSets
            If add The
             ' Добавим атрибуты в ComponentOccurrence
               If Not attbSets.NameIsUsed("myPartGroup") Then
                Dim attbSet As AttributeSet = attbSets.Add("myPartGroup")
    

    Вставьте выражение Else сразу после блока «Добавим атрибуты в ComponentOccurrence» – после его End If и перед ключевым словом Next. После End If вставьте ключевое слово Else.

    If add Then
     ' Добавим атрибуты в ComponentOccurrence
     If Not attbSets.NameIsUsed("myPartGroup") Then
      Dim attbSet As AttributeSet = attbSets.Add("myPartGroup") 
      Dim attb As Inventor.Attribute = _
         attbSet.Add( _
           "PartGroup1", ValueTypeEnum.kStringType, "Group1")
         End If
       Else
    
    
    
    
    
    
       
       End If
    Next
    
    
    
    
  9. Между Else и End If, созданными на предыдущем шаге введите вложенный блок If Then,  в котором в методе NameIsUsed() сначала проверяется, используется ли уже имя «myPartGroup».  Если имя занято, то находим набор атрибутов по его имени «myPartGroup» и вызываем метод Delete() для удаления набора из компонента. 

         ' Удалим атрибуты из ComponentOccurrence
         If attbSets.NameIsUsed("myPartGroup") Then
            attbSets.Item("myPartGroup").Delete()
         End If
    

  10. Call Вызов процедуры AddOrRemoveFromGroup с параметром True будем осуществлять из обработчика кнопки Button1_Click:.

    Private Sub Button1_Click( _
           ByVal sender As Object, _
           ByVal e As System.EventArgs) Handles Button1.Click
       AddOrRemoveFromGroup(True)
    End Sub
    

  11. Введем вызов процедуры AddOrRemoveFromGroup с параметром False из обработчика события кнопки с именем «Remove selected components from group».  У нас это четвертая кнопка Button4.  Вот как должен выглядеть текст обработчика Button4_Click:

    Private Sub Button4_Click( _
         ByVal sender As System.Object, _
         ByVal e As System.EventArgs) Handles Button4.Click
      AddOrRemoveFromGroup(False)
    End Sub
    

  12. Осталась пятая кнопка с текстом «Remove all components from group».  Двойным кликом на кнопке в окне конструктора создайте заготовку обработчика события нажатия этой кнопки Button5_Click.  Вы можете скопировать и вставить сюда код из других процедур.  Вот как должен выглядеть этот код:

    Private Sub Button5_Click( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs) _
       Handles Button5.Click
     
        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 = _invApp.ActiveDocument
        ' ссылка на менеджера атрибутов документа asmDoc
        Dim attbMan As AttributeManager = asmDoc.AttributeManager
     
        ' Найдем объектв с атрибутами
        Dim objCol As ObjectCollection
        objCol = _
          attbMan.FindObjects("myPartGroup", "PartGroup1", "Group1")
     
        Dim attbSets As AttributeSets
     
        ' удаление атрибутов из ComponentOccurrence
        For Each obj As Object In objCol
          attbSets = obj.AttributeSets
          attbSets.Item("myPartGroup").Delete()
          ' восстанавливаем видимость компонента
          obj.Visible = True
        Next
      End Sub
    
Рассмотрим код детально

В этом уроке вы создали две различных подпрограммы, которые можно вызывать в момент нажатия кнопок вместо того, чтобы  размещать этот код непосредственно в коде кнопок.  Преимуществом использования отдельных подпрограмм состоит в том, что это снижает масштабы дублирования кода в проекте, код легче поддерживать и развивать в будущем. В уроке 5 была создана кнопка, которая в момент нажатия изменяла видимость компонентов, найденных по наличию у них конкретных атрибутов.  Теперь у вас имеется процедура Sub, которая умеет отображать и гасить видимость компонентов.

Public Sub HideOrShowGroup(ByVal hide As Boolean)
 
End Sub

У вас есть также процедура добавления или удаления компонентов из группы.

 

Public Sub AddOrRemoveFromGroup(ByVal add As Boolean 
End Sub

Эти процедуры могут быть вызваны откуда угодно в нашем проекте.  Мы можем управлять их логикой, передавая им в качестве параметра значения True или False.  Как видим, мы смогли воспользоваться ранее созданным кодом благодаря весьма простым поправкам.  Мы изменили прежний код, вставленный в процедуру HideOrShowComponentsInGroup, чтобы она гасила или зажигала компоненты в зависимости от значения передаваемого ей логического аргумента.  Для этого мы изменили код в цикле For Each Next, где значение свойства Visible компонента было приравнено значению аргумента hide.

 

For Each obj As Object In objsCol
    compOcc = obj
    compOcc.Visible = hide 
Next

В процедуру AddOrRemoveFromGroup тоже была введена способность менять свое поведение в зависимости от значения входного параметра.  Если значение логического аргумента add равно True, выполняется прежний код – он добавляет компонент в группу.  Если же значения аргумента равно False, срабатывает код, который удаляет из компонента набор атрибутов AttributeSet.  Ветвление программы осуществляется с помощью конструкции If Then Else End If.  Поскольку бессмысленно пытаться удалять атрибуты из компонента, если их там нет, сначала с помощью метода NameIsUsed() проверяется наличие нужного набора атрибутов.  Если искомый набор атрибутов AttributeSet имеется, мы получаем на него ссылку с помощью свойства Item коллекции AttributeSets, указав имя набора (“myPartGroup”).  Затем вызываем метод AttributeSet.Delete() для удаления набора атрибутов из компонента.

 

        If add Then
          ' Добавим атрибуты в ComponentOccurrence
          If Not attbSets.NameIsUsed("myPartGroup") Then
 
            Dim attbSet As AttributeSet = attbSets.Add("myPartGroup")
 
            Dim attb As Inventor.Attribute = _
              attbSet.Add( _
                "PartGroup1", ValueTypeEnum.kStringType, "Group1")
          End If
 
        Else
       ' Удалим атрибуты из ComponentOccurrence
       If attbSets.NameIsUsed("myPartGroup") Then
           attbSets.Item("myPartGroup").Delete()
       End If
 
        End If
    Next

Код в пятой кнопке “Очистить группу” сначала находит не только выделенные, но все компоненты сборки с заданным набором атрибутов AttributeSet, и из каждого удаляет этот AttributeSet.  После того, как ссылки на все компоненты с искомыми атрибутами сохранены в коллекции ObjectCollection, мы организуем цикл For Next, в котором удаляем объект AttributeSet из каждого компонента.  После удаления атрибутов мы принудительно делаем компонент видимым.

   ' удаление атрибутов из ComponentOccurrence

   For Each obj As Object In objCol
      attbSets = obj.AttributeSets
      attbSets.Item().Delete()
     ' восстанавливаем видимость компонента
      obj.Visible =True
    Next