At root we have different axis systems whose xyz coordinates are not starting with 0,0,0 and hence wanted to compute children's xyz coordinates w.r.t this coordinates. I have wrote following program but it doesn't provide desired result (most of components return local coordinates). could you suggest right direction to get xyz coordinates in catia v6?
Sub GetCoordinates()
Dim oEditor As Editor
Set oEditor = CATIA.ActiveEditor
Dim oPLMProductService As PLMProductService
Set oPLMProductService =
oEditor.GetService("PLMProductService")
Dim oRootOcc As VPMRootOccurrence
Set oRootOcc = oPLMProductService.RootOccurrence
Set fs = CreateObject("Scripting.FileSystemObject")
Set logf = fs.CreateTextFile("C:\catia\coordinates.log", True)
Dim oPLMRef As VPMReference
Set oPLMRef = oRootOcc.ReferenceRootOccurrenceOf
logf.WriteLine "VPMReference --- " & oPLMRef.Name
Dim repInstances As VPMRepInstances
Set repInstances = oPLMRef.repInstances
logf.WriteLine "Rep reference instances---" &
repInstances.Count
logf.WriteLine "repInstances.Item(1)---" &
repInstances.Item(1).Name
Dim repIns As VPMRepInstance
Set repIns = repInstances.Item(1) 'since there is only one 3dshape
obj under root
Dim repref As VPMRepReference
Set repref = repIns.ReferenceInstanceOf
logf.WriteLine "repref.Name" & "---" & repref.Name
Dim oPart As Part
Set oPart = repref.GetItem("Part")
Dim oAxisSystems As AxisSystems
Set oAxisSystems = oPart.AxisSystems
logf.WriteLine "no of axis system - " & oAxisSystems.Count
Dim axisSystem 'As axisSystem
Dim i As Integer
Dim org2(2)
Dim XAxis1(2)
Dim XAxis2(2)
Dim YAxis1(2)
Dim YAxis2(2)
Dim ZAxis1(2)
Dim ZAxis2(2)
For i = 1 To oAxisSystems.Count
'If oAxisSystems.Item(i).Name <> "Absolute Axis System"
Then
MsgBox oAxisSystems.Item(i).Name
Set axisSystem = oAxisSystems.Item(i)
axisSystem.IsCurrent = True
axisSystem.GetOrigin org2
axisSystem.GetXAxis XAxis2
axisSystem.GetYAxis YAxis2
axisSystem.GetZAxis ZAxis2
logf.WriteLine axisSystem.Name & " origin : " & org2(0) & "," &
org2(1) & "," & org2(2)
logf.WriteLine axisSystem.Name & " X Axis : " & XAxis2(0) & "," &
XAxis2(1) & "," & XAxis2(2)
logf.WriteLine axisSystem.Name & " Y Axis : " & YAxis2(0) & "," &
YAxis2(1) & "," & YAxis2(2)
logf.WriteLine axisSystem.Name & " Z Axis : " & ZAxis2(0) & "," &
ZAxis2(1) & "," & ZAxis2(2)
' End If
Next
Dim oFoundOcc As VPMOccurrence
Dim isOccFound As Boolean
logf.WriteLine "Name - " &
oRootOcc.PLMEntity.GetAttributeValue("PLM_ExternalID") & _
vbCrLf & "Title - " &
oRootOcc.PLMEntity.GetAttributeValue("V_Name") & _
vbCrLf & "First level children - " & oRootOcc.Occurrences.Count
isOccFound = navigateOccurrences(oRootOcc, oFoundOcc, logf, org2)
logf.WriteLine "end of program"
logf.Close
End Sub
Function navigateOccurrences(oOcc As VPMOccurrence, oFoundOcc As
VPMOccurrence, logf As Variant, origin As Variant) As Boolean
On Error GoTo ErrorSub
Dim cOccs As VPMOccurrences
Set cOccs = oOcc.Occurrences
logf.WriteLine "oOcc.Name ~~~~~ " & oOcc.Name
logf.WriteLine "TypeName(origin) ~~~~~ " & TypeName(origin)
For i = 1 To cOccs.Count
Dim oChildOcc As VPMOccurrence
Set oChildOcc = cOccs.Item(i)
Dim oPLMRef 'As VPMReference
Set oPLMRef = oChildOcc.RepOccurrences
logf.WriteLine "oChildOcc.RepOccurrences --- " &
TypeName(oPLMRef)
logf.WriteLine "oChildOcc.RepOccurrences --- " &
oChildOcc.RepOccurrences.Count
'loop repoccurences
Dim t As Integer
For t = 1 To oChildOcc.RepOccurrences.Count
Dim repOcc As VPMRepOccurrence
Set repOcc = oChildOcc.RepOccurrences.Item(t)
Dim repIns As VPMRepInstance
Set repIns = repOcc.RelatedRepInstance
logf.WriteLine "repIns.ReferenceInstanceOf.Name --- " &
repIns.ReferenceInstanceOf.Name
logf.WriteLine "repIns.ReferenceInstanceOf.Type --- " &
TypeName(repIns.ReferenceInstanceOf)
Dim repref As VPMRepReference
Set repref = repIns.ReferenceInstanceOf
logf.WriteLine "V_usage - " &
repref.GetAttributeValue("V_usage")
logf.WriteLine "PLM_ExternalID - " &
repref.GetAttributeValue("PLM_ExternalID")
If "3DPart" = repref.GetAttributeValue("V_usage") Or "3DShape" =
repref.GetAttributeValue("V_usage") Then
Dim oPart As Part
Set oPart = repref.GetItem("Part")
Dim oAxisSystems As AxisSystems
Set oAxisSystems = oPart.AxisSystems
logf.WriteLine "no of axis system - " & oAxisSystems.Count
Dim axisSystem 'As axisSystem
Dim s As Integer
Dim org2(2)
Dim XAxis1(2)
Dim XAxis2(2)
Dim YAxis1(2)
Dim YAxis2(2)
Dim ZAxis1(2)
Dim ZAxis2(2)
For s = 1 To oAxisSystems.Count
logf.WriteLine oAxisSystems.Item(s).Name
Set axisSystem = oAxisSystems.Item(s)
axisSystem.GetOrigin org2
axisSystem.GetXAxis XAxis2
axisSystem.GetYAxis YAxis2
axisSystem.GetZAxis ZAxis2
logf.WriteLine axisSystem.Name & " origin : " & org2(0) & "," &
org2(1) & "," & org2(2)
logf.WriteLine axisSystem.Name & " X Axis : " & XAxis2(0) & "," &
XAxis2(1) & "," & XAxis2(2)
logf.WriteLine axisSystem.Name & " Y Axis : " & YAxis2(0) & "," &
YAxis2(1) & "," & YAxis2(2)
logf.WriteLine axisSystem.Name & " Z Axis : " & ZAxis2(0) & "," &
ZAxis2(1) & "," & ZAxis2(2)
Next
End If
Next
If navigateOccurrences(oChildOcc, oFoundOcc, logf, origin) Then
navigateOccurrences = True
Next
GoTo EndSub
ErrorSub:
MsgBox Err.Description
EndSub:
End Function