Community
Inventor Programming - iLogic, Macros, AddIns & Apprentice
Inventor iLogic, Macros, AddIns & Apprentice Forum. Share your knowledge, ask questions, and explore popular Inventor topics related to programming, creating add-ins, macros, working with the API or creating iLogic tools.
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Getting a graphically selected occurrence of a rectangular pattern feature?

3 REPLIES 3
Reply
Message 1 of 4
Gruff
470 Views, 3 Replies

Getting a graphically selected occurrence of a rectangular pattern feature?

We are using Inventor 2011 and I would like to make a small app that allows my users to graphically select one or more occurrences of a rectangular pattern feature  Then allow them to suppress them if desired.

 

I have determined the code to loop through the pattern occurrences and toggle suppression for any instance.

What I do not know how to do is determine which occurrences have been graphically selected.

 

At this time I am only concerned with round hole features.  (Perforated metal)

 

Any help here?

3 REPLIES 3
Message 2 of 4
Vladimir.Ananyev
in reply to: Gruff

You may use SelectSet object to access all objects that are currently selected using the Select command.  If object type is kFeaturePatternElementObject then you may treat it as pattern occurrence.  Its property Index gives you element position in the pattern.

Private Sub RectPatterns()
  
  Dim oDoc As PartDocument
  Set oDoc = ThisApplication.ActiveDocument
  
  Dim oDef As PartComponentDefinition
  Set oDef = oDoc.ComponentDefinition
  
  Dim oRP As RectangularPatternFeature
  Set oRP = oDef.Features.RectangularPatternFeatures.Item(1)
  
  Dim oSSet As SelectSet
  Set oSSet = oDoc.SelectSet
  If oSSet.Count = 0 Then Exit Sub
  
  Dim Entity As Object
  Set Entity = oSSet.Item(1)
  If Entity.Type <> ObjectTypeEnum.kFeaturePatternElementObject Then
    Beep
    MsgBox "Select feature pattern element"
    Exit Sub
  End If
  
  Dim oFPE As FeaturePatternElement
  Set oFPE = Entity
  If oFPE.Index > 1 Then
    oFPE.Suppressed = Not oFPE.Suppressed
  Else
    Beep
    MsgBox "Cannot suppress the first feature pattern element"
    Exit Sub
  End If
  
  oDoc.Update
End Sub

Hope this helps.

Cheers,

 


Vladimir Ananyev
Developer Technical Services
Autodesk Developer Network

Message 3 of 4
Gruff
in reply to: Vladimir.Ananyev

Vlad,

 

I think you misunderstand.

 

I do not want to select the pattern Feature Insances in the Browser Tree.

I am talking about selecting the Pattern instances in the graphics display.

 

Selected elements return Edge or Face when selected there..

 

I need to know how to get the pattern instance from the selected face or edge.

 

Trying to select the desired element from the browser tree is rediculously difficult as it is a 1D array.

Message 4 of 4
Vladimir.Ananyev
in reply to: Gruff

This is also possible.  In the case of hole pattern you may select cylindric faces or cirlce edge (if you do it in the part context).  Function ElementIndexByFace returns the index of selected pattern element.  1 corresponds to the source hole.

 

Function ElementIndexByFace(ByVal oSelectedFace As Face) As Integer

  Dim oDef As PartComponentDefinition
  Set oDef = oSelectedFace.Parent.Parent

  If oSelectedFace.CreatedByFeature.Type _
        = ObjectTypeEnum.kHoleFeatureObject Then
    ElementIndexByFace = 1
    
  ElseIf oSelectedFace.CreatedByFeature.Type _
        = ObjectTypeEnum.kRectangularPatternFeatureObject Then
    
    Dim oRP As RectangularPatternFeature
    Set oRP = oSelectedFace.CreatedByFeature
    Dim oFace As Face
    Dim i As Integer
    Dim oFPE As FeaturePatternElement
    For i = 2 To oRP.PatternElements.Count
      Set oFPE = oRP.PatternElements.Item(i)
      Set oFace = oFPE.Faces.Item(1)
      If oSelectedFace Is oFace Then
        ElementIndexByFace = i
        Exit Function
      End If
    Next
  Else
    ElementIndexByFace = -1
  End If
End Function 'ElementIndexByFace


Private Sub PatternElementByFace()

  Dim oDoc As PartDocument
  Set oDoc = ThisApplication.ActiveDocument
  
  Dim SSET As SelectSet
  Set SSET = oDoc.SelectSet
  
  If SSET.Count = 0 Then
    Call MsgBox("Select cylindric face in pattern element")
    Exit Sub
  End If
  
  'no error checking for brevity
  Dim oSelectedFace As Face
  Set oSelectedFace = SSET.Item(1)
  
  Dim Index As Integer
  Index = ElementIndexByFace(oSelectedFace)
  
  If Index > 0 Then
    Debug.Print "Element  #" & Index
  Else
    MsgBox "Failed to find pattern element index."
  End If

End Sub 'PatternElementByFace




Private Sub PatternElementByEdge()
  'no error checking for brevity
  
  Dim oDoc As PartDocument
  Set oDoc = ThisApplication.ActiveDocument  
  Dim SSET As SelectSet
  Set SSET = oDoc.SelectSet  
  If SSET.Count = 0 Then
    Call MsgBox("Select circle edge in pattern element")
    Exit Sub
  End If    
  Dim oSelectedEdge As Edge
  Set oSelectedEdge = SSET.Item(1)
  
  'verify GeometryType - should be circle curve
  If oSelectedEdge.GeometryType <> CurveTypeEnum.kCircleCurve Then
    Call MsgBox("Select circle edge in pattern element")
    Exit Sub
  End If

  Dim Index As Integer
  Index = 0  
  Dim oFace As Face
  For Each oFace In oSelectedEdge.Faces
    If oFace.SurfaceType = SurfaceTypeEnum.kCylinderSurface Then
      Index = ElementIndexByFace(oFace)
    End If
  Next  
  If Index > 0 Then
    Debug.Print Index
  Else
    MsgBox "Failed to find pattern element index."
  End If
End Sub 'PatternElementByEdge

In assembly context SelectSet returns corresponding proxy objects (FaceProxy, EdgeProxy, etc.). In this case you should use NativeObject property to get object in the context of definition (e.g., Part Document)..

 

 Please fill free to modify this code to satisfy your particular requirements. 

Hope this helps.


Vladimir Ananyev
Developer Technical Services
Autodesk Developer Network

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Autodesk Design & Make Report