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

Содержимое удалено Содержимое добавлено
Строка 77:
* Инициируется процесс интерактивного выделения и реакция на послупающие события
 
Рассмотрим на примере этапы реализации процедуры интерактивного выделения ребер, напоминающей поведение команды Fillet. ЭтотПользователю простой пример предлагает пользователюпредлагается выделить ребро и, как только выделение состоялось, отображает его длину. Первым делом следует создать объект InteractionEvents вызовом метода CreateInteractionEvents объекта CommandManager. Далее следует инициализировать ряд объектов, связывая их с интересующими нас событиями, и задать различные их свойства, чтобы обеспечить желаемое поведение. События есть для объекта InteractionEvents, аподдерживает такжесобытия для объектов SelectEvents, MouseEvents и KeyboardEvents,. которые можно получить у объекта InteractionEvents.
 
Как только с помощью событий и свойств разных объектов будет задано желамое поведение, можно запустить процесс выделения вызовом метода Start объекта InteractionEvents можно запустить сам процесс выделения. Следует отметить, что старт объекта InteractionEvents, как и активизация обычныхактивация команд самого Инвентора, прерывает исполнение текущей команды. Справедливо и обратное, старт команды Autodesk Inventor в момент работы InteractionEvents, прерывает исполнение InteractionEvents. Из этого правила есть лишь одно исключение — команды визуализации. Они не прерывают текущую команду, а временно приостанавливают ее выполнение до завершения команды визуализации. Объект InteractionEvents может предоставить информацию, которая необходима для корректной обработки этих ситуаций.
Объект InteractionEvents может предоставить информацию, которая необходима для корректной обработки этих ситуаций.
 
 
 
<pre>
Public Sub Edge_Length_Test()
 
'Создание нового объекта clsSelect.
Dim oSelect As New cls_EdgeSelect
'
'Call the pick method of the clsSelect object and set
'the filter to pick any face.
Dim oEdge As Edge
Set oEdge = oSelect.Pick(kPartEdgeFilter)
' информационное сообщение пользователю
Dim Msg As String
'Проверка, что ребро выделено.
If Not oEdge Is Nothing Then
'Вычисление длины выделенного ребра
Dim Length As Double
Length = GetEdgeLength(oEdge)
MsgBox "Точная длина выделенного ребра: " & vbNewLine _
& Math.Round(Length * 10, 5) & " mm"
Else
MsgBox "Выделение отменено"
End If
 
End Sub '~~~ Edge_Length_Test ~~~
 
 
{{Внимание|Продолжение еще не готово}}.
'возвращает длину ребра любого типа (в сантиметрах)
Function GetEdgeLength(ByVal oEdge As Edge) As Double
Dim dLength As Double, dMin As Double, dMax As Double
Call oEdge.Evaluator.GetParamExtents(dMin, dMax)
Call oEdge.Evaluator.GetLengthAtParam(dMin, dMax, dLength)
GetEdgeLength = dLength
End Function
</pre>
 
 
<pre>
'*************************************************************
'Приведенный ниже код следует поместить
'модуль класса cls_EdgeSelect.
'*************************************************************
 
' Объявление объектов поддержки событий
Private WithEvents oInteractEvents As InteractionEvents
Private WithEvents oSelectEvents As SelectEvents
 
' флаг окончания процесса выделения
Private bStillSelecting As Boolean
 
 
'Возвращает ссылку на выделенный объект
Public Function Pick(filter As SelectionFilterEnum) As Object
bStillSelecting = True 'Инициализация флага
' Создание объекта InteractionEvents
Set oInteractEvents = ThisApplication.CommandManager.CreateInteractionEvents
' Убедимся, что взаимодействие не подавлено.
oInteractEvents.InteractionDisabled = False
' Ссылка на события выдвления SelectEvents
Set oSelectEvents = oInteractEvents.SelectEvents
' задаем условия фильтрации выделяемых объектов
oSelectEvents.AddSelectionFilter filter
'Задаем режим выделения только одного объекта
oSelectEvents.SingleSelectEnabled = True
'активируем режим отображения подсказок
ThisApplication.GeneralOptions.ShowCommandPromptTooltips = True
' Начало работы объекта InteractionEvents
oInteractEvents.Start
' Цикл ожидания завершения процесса выделения
Do While bStillSelecting
DoEvents
Loop
' Получим ссылку на первый выделенный объект, игнорируя прочие.
Dim oSelectedEnts As ObjectsEnumerator
Set oSelectedEnts = oSelectEvents.SelectedEntities
If oSelectedEnts.Count > 0 Then
Set Pick = oSelectedEnts.Item(1)
Else
Set Pick = Nothing 'выделение отменено (пусто)
End If
' Останавливаем процесс выделения InteractionEvents.
oInteractEvents.Stop
' Уходя, гасите всех... (Clean up)
Set oSelectEvents = Nothing
Set oInteractEvents = Nothing
End Function
 
Private Sub oSelectEvents_OnPreSelect( _
ByRef PreSelectEntity As Object, _
ByRef DoHighlight As Boolean, _
ByRef MorePreSelectEntities As Inventor.ObjectCollection, _
ByVal SelectionDevice As Inventor.SelectionDeviceEnum, _
ByVal ModelPosition As Inventor.Point, _
ByVal ViewPosition As Inventor.Point2d, _
ByVal View As Inventor.View)
 
Dim Msg As String
'благодаря фильтрации выделенным может быть только ребро
Dim oEdge As Edge
Set oEdge = PreSelectEntity ' Ссылка на подсвеченное ребро
'реакция в зависимости от типа ребра
Select Case oEdge.GeometryType
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
Msg = "Этот тип рёбер не поддерживается"
' Не позволяем визуально выделять ребра иных типов
DoHighlight = False
End Select
oInteractEvents.StatusBarText = Msg
End Sub
 
Private Sub oSelectEvents_OnSelect( _
ByVal JustSelectedEntities As Inventor.ObjectsEnumerator, _
ByVal SelectionDevice As Inventor.SelectionDeviceEnum, _
ByVal ModelPosition As Inventor.Point, _
ByVal ViewPosition As Inventor.Point2d, _
ByVal View As Inventor.View)
bStillSelecting = False 'флаг завершения процесса выделения
End Sub
 
Private Sub oInteractEvents_OnTerminate()
'выставляем флаг завершения процесса выделения
bStillSelecting = False
' Очистка строки подсказки
oInteractEvents.StatusBarText = ""
End Sub
 
Private Sub oSelectEvents_OnUnSelect( _
ByVal UnSelectedEntities As Inventor.ObjectsEnumerator, _
ByVal SelectionDevice As Inventor.SelectionDeviceEnum, _
ByVal ModelPosition As Inventor.Point, _
ByVal ViewPosition As Inventor.Point2d, _
ByVal View As Inventor.View)
oInteractEvents.StatusBarText = "Укажите прямое или круглое ребро."
End Sub
 
Private Sub oSelectEvents_OnStopPreSelect( _
ByVal ModelPosition As Inventor.Point, _
ByVal ViewPosition As Inventor.Point2d, _
ByVal View As Inventor.View)
oInteractEvents.StatusBarText = "Укажите прямое или круглое ребро."
End Sub
</pre>
 
== Организация отмены выполненных действий ==