How can I select programmatically a node in the browser and perform a command as if it was performed from the UserInterface?
- The “GetDocumentBrowserPane(oDoc As Document) As BrowserPane” method will return the main BrowserPane object independently of the type of the active document. From this object you are able to access the “TopNode” property and then all the children nodes present in the browser.
- The “GetBrowserNodeByFullPath(FullPath As String) As BrowserNode” method will return the BrowserNode object that corresponds to the fullpath you provide as input. ‘Nothing’ is retuned if the path doesn’t exist.
- The “GetSelectedNodesFullPath” method will print in the VBA immediate window the list of the currently selected nodes in the browser.
- At last, the “TestSelectNode” method shows an example on how to use these previous methods to select a node in the DrawingBrowser and calls the “Get Model Sketches” command to make the assembly sketches visible in the drawing.
Note: the API is able to select only one node at a time, i.e. calling “oNode.DoSelect” on a second will unselect the first one. If you want to perform the same command on several nodes, you will need to execute it several times, one for each node.
Here are the samples. The code can be cut & paste directly in VBA:
Public Function GetDocumentBrowserPane(ByVal oDoc As Document) As BrowserPane
Dim oModelBP As BrowserPane = Nothing
'Get the Model BrowserPane for Part
If (TypeOf oDoc Is PartDocument) Then
oModelBP = oDoc.BrowserPanes.item("PmDefault")
End If
'Get the Model BrowserPane for Assembly
If (TypeOf oDoc Is AssemblyDocument) Then
oModelBP = oDoc.BrowserPanes.item("AmBrowserArrangement")
End If
'Get the Model BrowserPane for Drawing
If (TypeOf oDoc Is DrawingDocument) Then
oModelBP = oDoc.BrowserPanes.item("DlHierarchy")
End If
GetDocumentBrowserPane = oModelBP
End Function
Public Function GetBrowserNodeByFullPathRecursive(ByVal oBrowserNode As BrowserNode, ByVal FullPath As String) As BrowserNode
If (oBrowserNode.FullPath = FullPath) Then
GetBrowserNodeByFullPathRecursive = oBrowserNode
Exit Function
End If
Dim oBrowserNodeIterator As BrowserNode
Dim oResultNode As BrowserNode = Nothing
For Each oBrowserNodeIterator In oBrowserNode.BrowserNodes
oResultNode = GetBrowserNodeByFullPathRecursive(oBrowserNodeIterator, FullPath)
If Not oResultNode Is Nothing Then
GetBrowserNodeByFullPathRecursive =
oResultNode
Exit Function
End If
Next
Return oResultNode
End Function
Public Function GetBrowserNodeByFullPath(ByVal FullPath As String) As BrowserNode
Dim m_inventorApp As
Inventor.Application = Nothing
' Try to get an active instance of Inventor
Try
m_inventorApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Inventor.Application")
Catch ex As Exception
End Try
' If not active, create a new Inventor session
If m_inventorApp Is Nothing Then
Dim inventorAppType As Type = System.Type.GetTypeFromProgID("Inventor.Application")
m_inventorApp = System.Activator.CreateInstance(inventorAppType)
End If
Dim oModelBP As BrowserPane
oModelBP = GetDocumentBrowserPane(m_inventorApp.ActiveDocument)
GetBrowserNodeByFullPath = GetBrowserNodeByFullPathRecursive(oModelBP.TopNode, FullPath)
End Function
Public Sub GetSelectedNodesFullPathRecursive(
ByVal oBrowserNode As BrowserNode)
If (oBrowserNode.Selected = True) Then
Debug.Print(" - " + oBrowserNode.FullPath)
End If
Dim oBrowserNodeIterator As BrowserNode
For Each oBrowserNodeIterator In oBrowserNode.BrowserNodes
GetSelectedNodesFullPathRecursive(oBrowserNodeIterator)
Next
End Sub
Public Sub GetSelectedNodesFullPath()
Dim m_inventorApp As Inventor.Application = Nothing
' Try to get an active instance of Inventor
Try
m_inventorApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Inventor.Application")
Catch ex As Exception
End Try
' If not active, create a new Inventor session
If m_inventorApp Is Nothing Then
Dim inventorAppType As Type = System.Type.GetTypeFromProgID("Inventor.Application")
m_inventorApp = System.Activator.CreateInstance(inventorAppType)
End If
'Get the Model BrowserPane
Dim oModelBP As BrowserPane
oModelBP = GetDocumentBrowserPane(m_inventorApp.ActiveDocument)
GetSelectedNodesFullPathRecursive(oModelBP.TopNode)
End Sub
Public Sub TestSelectNode()
Dim m_inventorApp As Inventor.Application = Nothing
' Try to get an active instance of Inventor
Try
m_inventorApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Inventor.Application")
Catch ex As Exception
End Try
' If not active, create a new Inventor session
If m_inventorApp Is Nothing Then
Dim inventorAppType As Type = System.Type.GetTypeFromProgID("Inventor.Application")
m_inventorApp = System.Activator.CreateInstance(inventorAppType)
End If
Dim oBrowserNode As BrowserNode
oBrowserNode = GetBrowserNodeByFullPath("Assembly1:Sheet:1:VIEW1:Assembly1.iam:Assembly1.iam")
'Ensures Node is expanded, some commands don't work otherwise
oBrowserNode.Expanded = True
oBrowserNode.DoSelect()
'Call command that is not available in API
Dim InternalCommandName As String
InternalCommandName = "DrawingGetModelSketchesCtxCmd"
m_inventorApp.CommandManager.ControlDefinitions.Item(InternalCommandName).Execute()
End Sub