Here are the steps and sample code I made to learn about getting the navisworks insertion point or midpoint of a component. I know how to find the component by its id (I am using AutoPLANT component id), now I know how to find the midpoint of that component or the location of that component.
Steps to find the navisworks insertion point
- Accessing the file units and location information using Navisworks .NET API
- A pdf primer on Navisworks basic objects and how those objects are related (key resource)
- I made some VBA to put pause points and look at objects as they went by. In short
- start with a path object – in this code example – the currently selected objects (so select one to keep it easy!!!)
- Pause points/Interest points are the Beep lines which might have been replaced with Debug.Print lines
- In our example, I am looking for AutoPLANT components with a unique id that would similar to “AT_HSHF31AB_2Q7” (the 2nd set of strings is the doc id and the last part is the unique AutoPLANT part id in that doc)
- look for through the code below for *********** ANSWER *********** to get where we get the Navisworks Insertion or midpoint of our component
Code to find the navisworks insertion point – read the comments to follow along
[vb]
Sub FindSomething()
Dim nwObj As NavisworksAutomationAPI10.Document
Set nwObj = GetObject(, "Navisworks.Document.10") ‘nw 2013
Debug.Print "Visible:" & nwObj.Visible
nwObj.Visible = True
nwObj.StayOpen ‘ critical!!!! See http://elbsolutions.com/projects/getobjectclassnamehere-only-works-the-first-time-why-a-look-into-the-rot-table-navisworks-and-other-apps-too-that-use-activex/
‘nwObj.state.CurrentView = nwObj.state.SavedViews(1).anonview
Dim mstate As InwOpState
Set mstate = nwObj.state
Dim bob As VarEnum
Dim b As Variant
Dim b1 As InwSelectionPathsColl
Dim myPath As InwOaPath
Dim N As Variant
Dim myNode As InwOaNode
Dim n1 As InwOaPartition
Dim bBox As InwLBox3f
Dim a As Variant
Dim a1 As InwOaPublishAttribute
Dim a2 As InwOaPropertyAttribute
Dim a3 As InwOaPropertyAttribute
Dim a4 As InwOaPropertyAttribute
Beep ‘Pause here
For Each b In mstate.CurrentSelection.Paths
Set myPath = b
Debug.Print "ObjectName: " & myPath.ObjectName
‘The loop here was added near the end of the investigation so we can see how
‘ myPath is assembled/represented – in specific UserName
For Each N In myPath.Nodes
Set myNode = N
Debug.Print "Class: " & myNode.ClassName & " ClassUserName:" & myNode.ClassUserName & " UserName: " & myNode.username
‘Beep ‘Pause here
Next
‘This is the orignal loop looking at attributes and other properties of the nodes in each path
For Each N In myPath.Nodes
Set myNode = N
Set bBox = myNode.GetBoundingBox(False, False)
Beep ‘ pause here to take a look at myNode and bBox
‘ the myNode nodes seem to transverse the heirarchy from the root downwards
‘ down the path ‘b’
If (VBA.Left(myNode.username, 3) = "AT_") Then ‘ this line was added after I looked at the UserName property and it was the string I was interested in
Debug.Print ""
Debug.Print "myPath.Nodes.ObjectName:" & N.ObjectName
Debug.Print "myPath.Nodes.ObjectName (isGeometry):" & myNode.IsGeometry
Debug.Print "myPath.Nodes.ObjectName (isGeometry):" & myNode.IsGeometry
If Not bBox.IsEmpty Then
‘ Here is the bounding box’s limits and average (mid point)
‘ the mid point is the xyz location we are intereseted in.
‘ ******** ANSWER ************
Debug.Print "Data1 min: " & bBox.min_pos.Data1 & " max: " & bBox.max_pos.Data1 & " avg: " & ((bBox.min_pos.Data1 + bBox.max_pos.Data1) / 2)
Debug.Print "Data2 min: " & bBox.min_pos.Data2 & " max: " & bBox.max_pos.Data2 & " avg: " & ((bBox.min_pos.Data2 + bBox.max_pos.Data2) / 2)
Debug.Print "Data3 min: " & bBox.min_pos.Data3 & " max: " & bBox.max_pos.Data3 & " avg: " & ((bBox.min_pos.Data3 + bBox.max_pos.Data3) / 2)
End If
‘Set n1 = n
If N.ObjectName <> "nwOaPath" And N.ObjectName <> "nwOaPartition" Then
Beep
For Each a In N.Attributes
Debug.Print vbTab & "** attribute.ObjectName:" & a.ObjectName
‘Beep ‘ Pause Here
‘ I think the info below is a red-herring for what I require
Select Case a.ObjectName
Case "nwOaPublishAttribute"
Set a1 = a
Debug.Print "author:" & a1.Author
Debug.Print "ClassName:" & a1.ClassName
Debug.Print "ClassUserName:" & a1.ClassUserName
Debug.Print "Comments:" & a1.Comments
Debug.Print "Copyright:" & a1.Copyright
‘Debug.Print "ExpiryDate:" & CStr(a1.ExpiryDate)
Debug.Print "flags:" & a1.flags
Debug.Print "Keywords:" & a1.Keywords
Debug.Print "ObjectName:" & a1.ObjectName
Debug.Print "Subject:" & a1.Subject
Debug.Print "Title:" & a1.Title
Debug.Print "UserName:" & a1.username
Case "nwOaPartition"
Beep
Case "nwOaMaterial"
Dim mat As InwOaMaterial
Set mat = a
Case Else
Dim apart As InwOaPartition
Dim apropa As InwOaPropertyAttribute
‘ Set apropa = a
‘ Set apart = a
Beep
End Select
‘Set a1 = a
Beep
Next
Beep
End If
End If
Next
Next
mstate.CurrentSelection.Paths
Beep
End Sub
[/vb]