Autodesk Inventor API. Первые шаги/Взаимодействие с пользователем: различия между версиями
Содержимое удалено Содержимое добавлено
Vananiev (обсуждение | вклад) |
Vananiev (обсуждение | вклад) |
||
Строка 77:
* Инициируется процесс интерактивного выделения и реакция на послупающие события
Рассмотрим на примере этапы реализации процедуры интерактивного выделения ребер
Как только с помощью событий и свойств разных объектов будет задано желамое поведение,
<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>
== Организация отмены выполненных действий ==
|