Share

Selection of Surface Graphics Primitives

Description

This demonstrates the ability to select client graphic primitives, by creating SurfaceGraphics and showing how you can select B-Rep entities within the graphics. You must have a part or assembly open and select a part of sat file which will be read in and displayed as client graphics. Depending on our responses to the program it will create the graphics so that only the node is selectable (which is all that was supported before), so that all of the primitives are selected, or so that only certain primitives are selectable (every other face in this case).

Code Samples

To use this sample a part or assembly must be active.
Public Sub SelectablePrimitives()
    ' Make sure a part or assembly is active.
    If ThisApplication.ActiveDocumentType <> kAssemblyDocumentObject And ThisApplication.ActiveDocumentType <> kPartDocumentObject Then
        MsgBox "A part or assembly must be active."
        Exit Sub
    End If
    
    ' Get the document and it's associated definition.
    Dim doc As Document
    Set doc = ThisApplication.ActiveDocument
    Dim def As ComponentDefinition
    Set def = doc.ComponentDefinition
    
    ' Get an .ipt or SAT filename from the user.
    Dim dialog As FileDialog
    Dim filename As String
    Call ThisApplication.CreateFileDialog(dialog)
    With dialog
        .Filter = "Inventor Part File (*.ipt)|*.ipt|ACIS SAT File (*.sat)|*.sat"
        .FilterIndex = 0
        .ShowOpen
        If .filename = "" Then
            Exit Sub
        Else
            filename = .filename
        End If
    End With
    
    ' Get the transient B-Rep object.
    Dim tb As TransientBRep
    Set tb = ThisApplication.TransientBRep
    
    ' If a part was selected, open it inivisibly and get the body.
    Dim body As SurfaceBody
    If UCase(Right$(filename, 4)) = ".IPT" Then
        Dim newPart As PartDocument
        Set newPart = ThisApplication.Documents.Open(filename, False)
        
        ' Copy out the first body of the part.
        Set body = tb.Copy(newPart.ComponentDefinition.SurfaceBodies.Item(1))
    Else
        ' Read in the sat file.
        Dim bodies As SurfaceBodies
        Set bodies = tb.ReadFromFile(filename)
        
        Set body = bodies.Item(1)
    End If
        
    ' Create the client graphics object.
    Dim graphics As ClientGraphics
    On Error Resume Next
    Set graphics = def.ClientGraphicsCollection.Item("Test")
    If Err.Number = 0 Then
        graphics.Delete
    End If
    On Error GoTo 0
    
    Set graphics = def.ClientGraphicsCollection.Add("Test")
    Dim node As GraphicsNode
    Set node = graphics.AddNode(1)
    node.Selectable = True
    node.DisplayName = "My Solid"
    
    Dim answer As VbMsgBoxResult
    answer = MsgBox("Yes=Node Selectable, No=All Selectable, Cancel=Every other face selectable", vbYesNoCancel + vbQuestion)
    
    Dim solidGraphics As SurfaceGraphics
    Set solidGraphics = node.AddSurfaceGraphics(body)
    ThisApplication.ActiveView.Update
    
    If answer = vbYes Then
        solidGraphics.ChildrenAreSelectable = False
    Else
        solidGraphics.ChildrenAreSelectable = True
    
        If answer = vbCancel Then
            Dim i As Integer
            For i = 1 To solidGraphics.DisplayedVertices.Count
                solidGraphics.DisplayedVertices.Item(i).Selectable = False
            Next
            
            For i = 1 To solidGraphics.DisplayedEdges.Count
                solidGraphics.DisplayedEdges.Item(i).Selectable = False
            Next
        
            For i = 1 To solidGraphics.DisplayedFaces.Count
                If i Mod 2 = 0 Then
                    solidGraphics.DisplayedFaces.Item(i).Selectable = False
                End If
            Next
        End If
    End If
End Sub


Was this information helpful?