Getting XYZ coordinates in CATIA V6 from other Absolute Axis System?

Thiyagarajan Mohan

Getting XYZ coordinates in CATIA V6 from other Absolute Axis System?

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