Transform Coordinate Systems (with Math)

Goal: Transform the given global coordinates to the first non-global coordinate system object in the tree.

Code:

import units
import math

def MatrixTransformationGlobalToUserCS(global_coordinates, destination_coordinate_system, length_unit):
    from_unit = DataModel.CurrentConsistentUnitFromQuantityName("Length")
    factor = units.ConvertUnit(1, from_unit, length_unit, "Length")

    origin = destination_coordinate_system.Origin

    x_axis = destination_coordinate_system.XAxis
    y_axis = destination_coordinate_system.YAxis
    z_axis = destination_coordinate_system.ZAxis

    user_coordinates = []
    user_coordinates.append(x_axis[0]*(global_coordinates[0] - factor*origin[0]) +
                             x_axis[1]*(global_coordinates[1] - factor*origin[1]) +
                             x_axis[2]*(global_coordinates[2] - factor*origin[2]))
    user_coordinates.append(y_axis[0]*(global_coordinates[0] - factor*origin[0]) +
                             y_axis[1]*(global_coordinates[1] - factor*origin[1]) +
                             y_axis[2]*(global_coordinates[2] - factor*origin[2]))
    user_coordinates.append(z_axis[0]*(global_coordinates[0] - factor*origin[0]) +
                             z_axis[1]*(global_coordinates[1] - factor*origin[1]) +
                             z_axis[2]*(global_coordinates[2] - factor*origin[2]))

    if destination_coordinate_system.CoordinateSystemType == CoordinateSystemTypeEnum.Cartesian:
        return user_coordinates
    elif destination_coordinate_system.CoordinateSystemType == CoordinateSystemTypeEnum.Cylindrical:
        r = sqrt(user_coordinates[0] * user_coordinates[0] + user_coordinates[1] * user_coordinates[1])
        theta = math.degrees(math.atan(user_coordinates[1] / user_coordinates[0]))
        z = user_coordinates[2]
        return [r, theta, z]

def MatrixTransformationGlobalToUserCSUsingMatrix4D(global_coordinates, destination_coordinate_system, length_unit):
    from_unit = ExtAPI.DataModel.CurrentConsistentUnitFromQuantityName("Length")
    factor = units.ConvertUnit(1, from_unit, length_unit, "Length")

    origin = destination_coordinate_system.Origin

    x_axis = destination_coordinate_system.XAxis
    y_axis = destination_coordinate_system.YAxis
    z_axis = destination_coordinate_system.ZAxis

    x_axis_vector = Vector3D(x_axis[0], x_axis[1], x_axis[2])
    y_axis_vector = Vector3D(y_axis[0], y_axis[1], y_axis[2])
    z_axis_vector = Vector3D(z_axis[0], z_axis[1], z_axis[2])

    identity  =  Matrix4D()
    transformation = identity.CreateSystem(x_axis_vector,y_axis_vector,z_axis_vector)

    vector = Vector3D(global_coordinates[0] - origin[0] * factor, global_coordinates[1] - origin[1] * factor, global_coordinates[2] - origin[2] * factor)
    transformation.Transpose()
    vector_trans = transformation.Transform(vector)
    return vector_trans


global_coordinates = [20,40,60]
localCS = Model.CoordinateSystems.Children[1]

localCoordinates1 = MatrixTransformationGlobalToUserCS(global_coordinates, localCS, "mm")
localCoordinates2 = MatrixTransformationGlobalToUserCSUsingMatrix4D(global_coordinates, localCS, "mm")

print(localCoordinates1)
print(localCoordinates2)