Autodesk Inventor API. Первые шаги/Взаимодействие с пользователем: различия между версиями

Содержимое удалено Содержимое добавлено
Строка 60:
 
=== Интерактивное выделение ===
 
Объект InteractionEvents позволяет контролировать процесс выделения объектов в существенно большей степени, чем SelectSet.
 
Интерактивное выделение является мощным инструментом взаимодействия с пользователем благодаря возможности вашего участия в самом процессе выделения объектов. С этой целью поддерживается целый ряд событий, благодаря которым вы можете знать о том, что происходит, и можете повлиять на то, что видит пользователь. Если приглядеться к работе команд самого Инвентора, можно заметить, что для каждой из них характерен собственный стиль поведения, помогающий пользователю выделять лишь те объекты, которые имеют смысл в контексте выполняемой задачи. Например, при вызове команды «Fillet» (Сопряжение) вы можете выделять ребра модели, но не грани, рабочую геометрию и проч. Кроме того, автоматически выделяются и другие ребра, если они связаны с уже выделенным ребром зависимостью касательности. Здесь представлен краткий обзор объектов и событий интерактивного выделения.
 
Объект InteractionEvents позволяет контролировать процесс выделения объектов в существенно большей степени, чем SelectSet. Объект InteractionEvents поведением напоминает команды самого Инвентора. С началом его работы прерывается текущая команда, и он становится активной командой. На InteractionEvents перенаправляется весь поток событий, связанных со взаимодействием с пользователем. С этого момента вы можете фильтровать этот поток и реагировать на значимые для вашего приложения события.
На рисунке ниже приведена часть объектной модели API, относящаяся к объектам InteractionEvents и SelectEvents.
 
[[Файл:Interaction_Events_API.png| ]]
 
Объект InteractionEvents поддерживает доступ к четырём наборам событий: SelectEvents, MouseEvents, KeyboardEvents и TriadEvents. Для наборов SelectEvents и MouseEvents характерно то, что в каждый конкретный момент времени вы можете получать события только от одного из них, но не от обоих одновременно. Который из них сгенерирует событие, зависит от значения свойства SelectionActive объекта InteractionEvents. Зато набор KeyboardEvents всегда доступен и никакими иными событиями не ограничен.
 
Объект InteractionEvents поддерживает ряд событий, которые используются для его корректной работы. Например, если пользователь активирует иную команду, генерируется событие OnTerminate, информируя вас о необходимости выполнить предусмотренный комплекс завершающих операций.
 
 
 
Строка 82 ⟶ 86 :
 
 
Основная процедура '''Edge_Length_Test''' размещается в сандартном модуле VBA.
Она вызывает метод Pick объекта clsSelect с фильтром, который ограничивает выделение только подмножеством рёбер модели. Метод Pick возвращает либо ребро, и тогда программа выводит в окно сообщения его длину в миллиметрах, либо Nothing, если пользователь отказался от выбора, нажав, например, клавишу '''Esc'''.
 
<pre>
Строка 89 ⟶ 95 :
Dim oSelect As New cls_EdgeSelect
'
'CallВызов theметода pickPick method of theобъекта clsSelect object andс setфильтром,
'который ограничивает выделение только ребрами.
'the filter to pick any face.
Dim oEdge As Edge
Set oEdge = oSelect.Pick(kPartEdgeFilter)
Строка 103 ⟶ 109 :
Length = GetEdgeLength(oEdge)
MsgBox "Точная длина выделенного ребра: " & vbNewLine _
& Math.Round(Length * 10, 5) & " mmмм"
Else
MsgBox "Выделение отменено"
Строка 109 ⟶ 115 :
 
End Sub '~~~ Edge_Length_Test ~~~
 
 
'возвращает длину ребра любого типа (в сантиметрах)
Строка 124 ⟶ 129 :
 
 
Приведенный далее код следует разместить
в модуле класса '''cls_EdgeSelect'''.
 
Метод Pick инициализирует процесс интерактивного выделения с заданным пользователем фильтром и ожидает завершения, наблюдая за логической переменной
<tt>bStillSelecting</tt>. Затем возвращает вызывающей процедуре либо выделенное пользователем ребро, либо нулевой указатель Nothing в случае отмены операции.
<pre>
'*************************************************************
Строка 167 ⟶ 177 :
DoEvents
Loop
'Примечание к циклу ожидания:
'При работе на 64-битной версии Инвентора
'VBA-вызов DoEvents следует замнить на
'ThisApplication.UserInterfaceManager.DoEvents.
'Дело в том, что в 64-битной конфигурации код VBA выполняется
'НЕ в доном процессе с самим Инвентором,
'как это происходит в 32-битной конфигурации.
 
' Получим ссылку на первый выделенный объект, игнорируя прочие.
Строка 184 ⟶ 202 :
Set oInteractEvents = Nothing
End Function
</pre>
 
Заслуживает небольшого внимания использование события OnPreSelect.
 
Данное событие генерируется в момент, когда курсор мыши проходит над объектом, выделение которого допускается действующим фильтром, причем событие генерируется ДО подсвечивания объекта. Это дает возможность программе провести дополнительный анализ "кандидата". В данном примере проверяется геометрия ребра. Если ребро не является круглым или линейным, то "кандидат" отбраковывается, аргументу DoHighlight присваивается значение False, что запрещает Инвентору выделять ребро.
 
Дополнительно используется удобный вариант информационных сообщений посредством переопределения свойства InteractionEvents.StatusBarText, в котором выводятся подсказки и вычисленная "на лету" длина ребра, если оно удовлетворяет требованиям по геометрии. Способ хорош тем, что обеспечивает пользователя контекстно-чувствительной информацией о модели при абсолютном минимуме телодвижений с его стороны.
<pre>
Private Sub oSelectEvents_OnPreSelect( _
ByRef PreSelectEntity As Object, _
Строка 204 ⟶ 229 :
Case CurveTypeEnum.kCircleCurve
Msg = "ЭтоКруглое ребро" & vbNewLine & "окружность" & vbNewLine &_ _
"Длина, мм = " & Math.Round(GetEdgeLength(oEdge) * 10, 1)
Case CurveTypeEnum.kLineSegmentCurve
Msg = "ЭтоПрямое прямаяребро" & vbNewLine & _
"Длина, мм = " & Math.Round(GetEdgeLength(oEdge) * 10, 1)
Case Else
Строка 219 ⟶ 244 :
oInteractEvents.StatusBarText = Msg
End Sub
</pre>
 
Обработчики событий OnSelect и OnTerminate выставляют признак окончание работы bStillSelecting в значение False, что приводит к завершению цикла ожидания в методе Pick.
<pre>
Private Sub oSelectEvents_OnSelect( _
ByVal JustSelectedEntities As Inventor.ObjectsEnumerator, _