Урок 4. Интерфейс пользователя и программирование логики

Урок 4: Интерфейс пользователя и программирование логики

На прошлом занятии вы узнали, как можно создать приложение Windows Forms и подключится к сеансу Inventor.  Теперь мы введем в форму командную кнопку, которая, используя код из урока 1, будет гасить видимость выделенных компонентов.  Заодно мы подробно разберем работу программы.

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

 

Скачать файлы Inventor для урока 4

  lesson4_visualstudio_visualexpress10.zip (zip - 18Kb)

Программируем новый функционал

Мы уже говорили о том, что программа представляет собой последовательность инструкций, которые предписывают компьютеру выполнение некоторых действий. Чтобы пользователи могли воспользоваться вашими новыми функциями, в программе нужно предусмотреть тот или иной пользовательский интерфейс.  Создание элементов интерфейса для взаимодействия с пользователем серьезно упрощает панель инструментов Visual Basic Express.

  1. Правым кликом на  Form1.vb  в обозревателе решений откройте контекстное меню и выберите в нем пункт Открыть в конструкторе (View Designer).  Тот же результат вы получите с помощью комбинации клавиш Shift+F7.



    Конструктор (Designer) является основным инструментом создания интерфейса пользователя.  В данном случае с его помощью мы введем в форму одну командную кнопку.
  1. Панель элементов открывается с помощью меню ВидДругие окнаПанель элементов.

  2. Выделите в панели инструментов опцию Button и мышью нарисуйте на форме прямоугольник, который задаст положение и размеры создаваемой кнопки.


  3. Теперь надо задать кнопке функцию, которая будет выполняться при нажатии кнопки.  Это делается в окне кода формы.  Поступим так.  Правым кликом на Form1.vb в Обозревателе решений откроем контекстное меню и выберем в нем пункт Перейти к коду (тот же результат даст функциональная клавиша F7). Затем слева вверху раскройте выпадающий список и кликните на Button1.



    После этого в выпадающем списке справа вверху кликните на событии Click. Обратите внимание, в этом списке для событий используется иконка в виде молнии



    В результате в окне кода формы появится процедура Sub Button1_Click, которая выполняет роль обработчика события Click кнопки Button1.
    Private Sub Button1_Click(ByVal sender As Object, 
                              ByVal e As System.EventArgs) Handles Button1.Click
     
    End Sub
    

  4. Добавим в процедуру Sub Button1_Click следующее условное выражение If – Then:
    If _invApp.Documents.Count = 0 Then
        MsgBox("Надо открыть документ сборки")
        Return
    End If
    

  5. Следом добавим в Sub Button1_Click еще одно условное выражение:
    If _invApp.ActiveDocument.DocumentType <> _
                  DocumentTypeEnum.kAssemblyDocumentObject Then
           MsgBox("Требуется открыть сборку")
           Return
    End If
    

    Оба условных выражения гарантируют нам, что а) в Inventor будет открыт по крайней мере один документ и б) активным документом в момент выполнения команды будет документ сборки (в конце концов, управлять видимостью компонентов наша команда должна в контексте сборки).  Если активным окажется документ иного типа, пользователь увидит ваше предупреждение, после чего оператор Return обеспечит выход из процедуры без выполнения каких-либо действий.
  6. Ниже в процедуре Sub Button1_Click введите следующий код:
     Dim asmDoc As AssemblyDocument
     asmDoc = _invApp.ActiveDocument
     
    If asmDoc.SelectSet.Count = 0 Then
         MsgBox("Должны быть выделены детали или подсборки")
         Return
    End If
    

  7. Далее введите в процедуру Sub Button1_Click следующий код:
    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)
              compOcc.Visible = False
         Next
    Catch ex As Exception
         MsgBox("Является ли выделенный объект компонентом?")
         MsgBox(ex.ToString())
         Return
    End Try
    

    Больше вводить код в этом уроке не понадобится.  Теперь обработчик события Click может проверить, является ли активный документ сборкой и имеются ли в этой сборке выделенные компоненты.  Если какой-либо из выделенных объектов окажется не компонентом, будет зафиксирована ошибка, которую перехватит и обработает блок Catch.



Тестирование плагина

  1. Загрузите Autodesk Inventor.  (Обратите внимание, если наш плагин при старте не обнаружит активный сеанс Inventor, будет создан новый.)

  2. Создайте или откройте существующую сборку:
    Вы можете воспользоваться сборкой Clutch_Bell_Simplified.iam из архива Clutch_Bell_Simplified.zip.  В любом случае, убедитесь, что активным документом является сборка.  В Inventor можно создавать и работать с документами нескольких типов.  Наиболее распространены документы детали Part (.ipt), сборки Assembly (.iam) и чертежа Drawing (.idw).  В пользовательском интерфейсе Inventor вы можете создать новую сборку и ввести в нее несколько деталей.

  3. Загрузите плагин:
    Чтобы Visual Basic Express мог выполнить введенный код, в меню Отладка выберите пункт Начать отладку. Вы можете также нажать функциональную клавишу F5 или же на панели инструментов Стандартная воспользоваться кнопкой с зеленой стрелкой, напоминающей кнопку Play на музыкальном проигрывателе.  В результате на экране будет отображена ваша форма.  Возможно, вам придется свернуть окно VB Express, чтобы одновременно можно было видеть и окно Inventor, и форму

  4. Переключитесь на окно Inventor и выделите несколько компонентов сборки.  При этом фокус взаимодействия с пользователем будет переключен с вашей формы на Inventor.  Снова активируйте свою форму и нажмите на ней кнопку, чтобы запустить процедуру.  Выделенные в сборке компоненты должны стать невидимыми, что должно соответствующим образом отобразиться и в браузере сборки.
Обсудим код

В предыдущем уроке мы выяснили, что класс может иметь методы (процедуры и функции) и свойства.  Кроме того, классы генерируют события, на которые может реагировать ваша программа.  Так при нажатии кнопки на форме срабатывает обработчик события (это специальный вид функции), в который вы ввели код этого урока.

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

End Sub

Нам нужно получить выделенные в данный момент компоненты сборки.  В этом нам помогает свойство SelectSet документа сборки.  Чтобы быть уверенными, что остальной код будет работать корректно, сначала мы должны проверить, а есть ли в Inventor открытые документы. Для этого мы проверяем текущее значение свойства Count коллекции Documents объекта Inventor.Application.  Обратите внимание, как использованы точки для перехода через свойства от одного объекта иерархии к другому

 

If _invApp.Documents.Count = 0 Then
       MsgBox("Надо открыть документ сборки")
       Return
End If

Конструкция “If – Then” позволяет организовать условные переходы внутри программы: если выражение между “If” и “Then” принимает значение “Истина”, тогда выполняется код, размещенный между ключевыми словами “Then” и “End If”.  При нулевом значении Count вы точно знаете, что в Inventor нет открытых документов.  В этом случае вы сообщаете пользователю, что надо открыть сборку, и тут же выходите из процедуры с помощью оператора Return без каких-либо дополнительных действий.  С практической точки зрения гораздо выгоднее заранее отследить потенциально опасную ситуацию, нежели дать программе наткнуться на ошибку с весьма неочевидной диагностикой. Оператор Return отнюдь не прекращает работу вашей программы, он лишь обеспечивает выход из процедуры, так что пользователь может открыть сборку и повторить попытку. 

Следующий фрагмент кода также является условным выражением. На этот раз проверяется, что активным документом в Inventor, что вполне разумно, поскольку задачей программы является управление видимостью компонентов сборки. В данном случае в условии используется оператор неравенства (<>), тогда как в предыдущем условии мы проверяли равенство (=).  Таким образом, если активный документ не является сборкой, вы выводите пользователю новое предупреждение с последующим выходом (Return) из процедуры. 

 

If _invApp.ActiveDocument.DocumentType <> DocumentTypeEnum.kAssemblyDocumentObject Then
       MsgBox("Требуется открыть сборку")
       Return

Символ подчеркивания в конце строки является признаком переноса длинной инструкции на следующую строку.

 

 Dim asmDoc As AssemblyDocument
 asmDoc = _invApp.ActiveDocument
 
If asmDoc.SelectSet.Count = 0 Then
     MsgBox("Должны быть выделены детали или подсборки")
     Return
End If

Для объявления объектной переменной “asmDoc” типа “AssemblyDocument” используется ключевое слово Dim.  Затем созданной переменной присваивается значение свойства ActiveDocument объекта Inventor.Application.  Обратите внимание, что в VB.NET знак равенства “=” может использоваться и для присвоения значений.  Если вы вносите изменения в документ, на который ссылается переменная asmDoc, используя какие-либо его свойства, вы изменяете активный документ сеанса Inventor.  Поскольку здесь вы используете свойство “SelectSet” лишь в блоке “If Then” условного выражения, вы не вносите в документ никаких изменений.  На следующем шаге вы проверяете свойство Count, чтобы убедиться, что коллекция выделенных объектов SelectSet не является пустой.  Если выделенных объектов нет, то перед выходом из процедуры пользователю выводится соответствующее уведомление.

В этой точке программы вы знаете, что пользователь в активной сборке что-то выделил. Соответственно, с выделенными компонентами можно выполнять те или иные операции.

 

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)
          compOcc.Visible = False
     Next
Catch ex As Exception
     MsgBox("Является ли выделенный объект компонентом?")
     MsgBox(ex.ToString())
     Return
End Try

Ссылка на коллекцию выделенных объектов SelectSet активного документа сборки сохраняется в переменной “selSet”.  Для перехвата возможных ошибок использован блок Try Catch.  Если во время выполнения кода, помещенного в блок Try, обнаружится ошибка, будет выполнена часть программы, размещенная в блоке Catch.  Здесь можно вывести пользователю содержательное сообщение о возникшей проблеме.  В данном случае ему предлагается проверить, действительно ли были выделены только компоненты сборки. 

 В теле блока Try был использован цикл “For Next” для перебора всех объектов в коллекции SelectSet.  Если выделенным окажется только один объект, код между строками “For Each” и “Next” будет выполнен только один раз.  Если выделенными окажутся несколько объектов, этот код будет выполнен для каждого из них.  Вы можете быть уверенными, что код в цикле будет выполнен как минимум один раз, поскольку в отсутствие выделенных компонентов произошел бы досрочный выход из процедуры.  Коллекция SelectSet может содержать объекты любого типа, которые можно выделить средствами пользовательского интерфейса Inventor.  Именно по этой причине мы получаем доступ к ним с помощью универсальной переменной obj типа “Object” (такая переменная может хранить ссылку на объекты любых типов).  Если пользователь выделит не компонент сборки, то при попытке обратиться к такому объекту с помощью переменной compOcc типа ComponentOccurrence будет сгенерирована ошибка.  Если сохранение в compOcc ссылки на объект ошибки не вызвало, значит все нормально, и команда Debug.Print в следующей строке отправит имя компонента (оно хранится в свойстве Name объекта ComponentOccurrence) в Окно интерпретации (Immediate) Visual Basic Express.  Это окно можно открыть комбинацией клавиш Ctrl+G или с помощью пункта Окна в меню Отладка.  Отладочная печать с помощью Debug.Print является полезным инструментом, когда требуется выяснить причину возникающих проблем.  Обратите внимание, окно Список ошибок (Error List) открывается иначе — меню Вид → Другие окна.  И наконец, после команды печати Debug.Print вы выполняете главную задачу этого занятия — подавляете видимость выделенного компонента, присваивая его свойству Visible значение False (Ложь).

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