Guest Post by Jhoel Forshav

When developing iLogic rules, it’s quite common that you’ll need to prompt the user to pick something from the model window. For example, it could be a face, a component occurrence, a model edge etc. For most of the different types of selections your code might require, there’s a corresponding selection filter to use as an argument in the function CommandManager.Pick(Filter As SelectionFilterEnum, PromptText As String).
One filter however, that I tend to see questions about from time to time on the Inventor Customization Forum is the one to pick a component occurrence represented on a drawing sheet.
In short, there is no selection filter for this. There is however ways to reach the component occurrence by entities that you can pick by iLogic code on the sheet – DrawingCurveSegment.
We cannot use CommandManager.Pick in this case, but there are other ways to reach the same result.
The iLogic code below is an example I wrote to use the DrawingCurveSegment-filter, access the ComponentOccurrence it represents and through that every other DrawingCurveSegment in the same view that represents the same ComponentOccurence. Using the SelectEvents object and its event handlers, we can then have the application highlight every DrawingCurveSegment that represents the same ComponentOccurrence as the one we’re hovering above during the SelectEvent, making it appear as if we’re actually using a ComponentOccurrence-filter.
The property DoHighlight in the OnPreselect-event doesn’t just control whether the preselected collection of entities should be highlighted, it also controls whether it should be selectable. Therefore we can make only DrawingCurveSegments that represents a model edge selectable.
The path from a DrawingCurveSegment to the ComponentOccurrence will looks like this:
DrawingCurveSegment.Parent(=DrawingCurve).ModelGeometry(=Edge).Parent(=SurfaceBodyProxy).Parent(=ComponentOccurrence).
If this path fails to return an object of type ComponentOccurrence we’ll know that the DrawingCurveSegment doesn’t represent a ComponentOccurrence, so a simple Try-Catch statement will be an effective way to determine if DoHighlight should be true or false in our OnPreselect sub.

Here is the iLogic code:
Sub Main
'iLogic Code by Jhoel Forshav - originally posted at https://clintbrown.co.uk/ilogic-occurrence-selection-filter-in-drawings/
Dim oSelect As New SelectClass
Dim oOcc As ComponentOccurrence = oSelect.SelectOccurrence(ThisApplication)
oSelect = Nothing
If IsNothing(oOcc) Then Exit Sub
MessageBox.Show("You have picked: " & oOcc.Name, "Pick part", MessageBoxButtons.OK, _
MessageBoxIcon.Information)
End Sub
Class SelectClass
Private WithEvents oInteractEvents As InteractionEvents
Private WithEvents oSelectEvents As SelectEvents
Private bTooltipEnabled As Boolean
Private ThisApplication As Inventor.Application
Private SelectedOcc As ComponentOccurrence
Private stillSelecting As Boolean = True
Public Function SelectOccurrence(oApp As Inventor.Application)
ThisApplication = oApp
oInteractEvents = ThisApplication.CommandManager.CreateInteractionEvents
oInteractEvents.InteractionDisabled = False
oSelectEvents = oInteractEvents.SelectEvents
oSelectEvents.AddSelectionFilter(SelectionFilterEnum.kDrawingCurveSegmentFilter)
oSelectEvents.WindowSelectEnabled = False
bTooltipEnabled = ThisApplication.GeneralOptions.ShowCommandPromptTooltips
ThisApplication.GeneralOptions.ShowCommandPromptTooltips = True
oInteractEvents.StatusBarText = "Pick part occurrence."
oInteractEvents.Start()
AppActivate(ThisApplication.Caption)
While stillSelecting
ThisApplication.UserInterfaceManager.DoEvents()
End While
Return SelectedOcc
End Function
Private Sub oInteractEvents_OnTerminate() Handles oInteractEvents.OnTerminate
ThisApplication.GeneralOptions.ShowCommandPromptTooltips = bTooltipEnabled
oSelectEvents = Nothing
oInteractEvents = Nothing
stillSelecting = False
End Sub
Private Sub oSelectEvents_OnPreselect(ByRef PreSelectEntity As Object, ByRef DoHighlight As Boolean, _
ByRef MorePreSelectEntities As ObjectCollection, ByVal SelectionDevice As SelectionDeviceEnum, _
ByVal ModelPosition As Point, ByVal ViewPosition As Inventor.Point2d, _
ByVal View As Inventor.View) Handles oSelectEvents.OnPreselect
Try
Dim oCurves As DrawingCurvesEnumerator = DirectCast(PreSelectEntity, DrawingCurveSegment) _
.Parent.Parent.DrawingCurves(DirectCast(PreSelectEntity, DrawingCurveSegment) _
.Parent.ModelGeometry.Parent.Parent)
Dim oCol As ObjectCollection = ThisApplication.TransientObjects.CreateObjectCollection
For Each oCurve As DrawingCurve In oCurves
For Each oSeg As DrawingCurveSegment In oCurve.Segments
If oSeg IsNot PreSelectEntity Then oCol.Add(oSeg)
Next
Next
MorePreSelectEntities = oCol
DoHighlight = True
Catch
DoHighlight = False
End Try
End Sub
Private Sub oSelectEvents_OnSelect(ByVal JustSelectedEntities As ObjectsEnumerator, _
ByVal SelectionDevice As SelectionDeviceEnum, ByVal ModelPosition As Point, _
ByVal ViewPosition As Point2d, ByVal View As Inventor.View) Handles oSelectEvents.OnSelect
SelectedOcc = DirectCast(JustSelectedEntities.Item(1), DrawingCurveSegment) _
.Parent.ModelGeometry.Parent.Parent
ThisApplication.CommandManager.StopActiveCommand
End Sub
End Class
About the Author:
Jhoel Forshav has a Bachelor of Science degree in Mechanical Engineering and a of Master of Science degree in Engineering – Design and Product Development.
He graduated from Linköping University in 2016 and works for a Swedish company that creates industrial steel products. Jhoel’s role at the company is best explained as that of the CAD-expert, automating processes through Addins, iLogic rules and standalone applications for Inventor. Jhoel oversees the CAD procedures and helps manage the Vault.
Jhoel is very active on the Inventor Customization forum and has been an Autodesk Expert Elite member since September 2020.

You must be logged in to post a comment.