How to create a coordinate system in Discovery/SpaceClaim based on 3 points coordinates?
For doing some mapping in Mechanical it might be useful to create a coordinate system based on source points. This coordinate system will have the origin on the first point, its xaxis will go from 1 to 2 point and the zaxis will be normal to the plane defined by the 3 points.
Answers

This might come in handy for users who are importing data coming from injection molding software with an input mesh that cannot be read by External Model or if we want to avoid having to use the assembly approach in Workbench.
We use this solution posted for making sure that the document has mm as units (the input is assumed to be in mm). Here the script:# Point 1 CS origin # Point 12 x axis # z axis normal to plane import os import math # Here the script for setting mm as units version = dir(SpaceClaim.Api)[1] cmd = 'from SpaceClaim.Api.{} import *'.format(version) exec(cmd) doc = Window.ActiveWindow.Document doc.Units.ActiveUnitsSystem = UnitsSystemType.Metric doc.Units.MetricUnits = MetricUnits(MetricLengthUnit.Millimeters,MetricMassUnit.Kilograms, AngleUnit.Degrees) def dot_product(vector1, vector2): return sum(a * b for a, b in zip(vector1, vector2)) def magnitude(vector): return math.sqrt(sum(component**2 for component in vector)) def angle_between_vectors(vector1, vector2): dot_product_value = dot_product(vector1, vector2) magnitude_product = magnitude(vector1) * magnitude(vector2) cos_theta = max(min(dot_product_value / magnitude_product, 1.0), 1.0) angle_radians = math.acos(cos_theta) angle_degrees = math.degrees(angle_radians) return angle_degrees ####################################################### # Input by user # Point 1 / Point 2 / Point 1 / Point 3 coordinates in mm points = [[x1,y1,z1],[x2,y2,z2],[x1,y1,z1],[x3,y3,z3]] ## # Here it is created a file to import these points and create curves points_SCDM = [] [points_SCDM.append([point[2],point[0],point[1]]) for point in points] path = os.path.dirname(GetActiveWindow().Document.Path) myfile = os.path.join(path,'Curve.txt') with open(myfile, "w") as file: file.write("polyline=false\n") file.write("3d=true\n") for i, array in enumerate(points_SCDM): line = " ".join(str(value) for value in array) line += "\n" if i % 2 == 1 and i != len(points_SCDM)  1: line += "\n" file.write(line) file.write("\n") DocumentInsert.Execute(myfile) os.remove(myfile) # A plane is created normal to the 3 given points CurvesSelection = Selection.Create(GetRootPart()).ConvertToCurves() origin = CurvesSelection.Items[0].EvalStart().Point Curve_1 = CurvesSelection.Items[0] Curve_2 = CurvesSelection.Items[1] x_Dir = Curve_1.EvalEnd().Point.Vector Curve_1.EvalStart().Point.Vector result = DatumPlaneCreator.Create(CurvesSelection, True, None) Plane_Ref = result.CreatedPlanes[0] DirZ_Plane = Plane_Ref.Shape.Geometry.Frame.AxisZ.Direction # A CS is created CS_Ref = DatumOriginCreator.Create(origin,Plane_Ref.Shape.Geometry.Frame.AxisZ.Direction,None).CreatedOrigin # Angle is calculated between xaxis from CS and xaxis given by points 12 x_axis = CS_Ref.Axes[0].Shape.Geometry.Direction.UnitVector x_Dir = Curve_1.EvalEnd().Point.Vector Curve_1.EvalStart().Point.Vector vector1 = [x_axis[0],x_axis[1],x_axis[2]] vector2 = [x_Dir[0],x_Dir[1],x_Dir[2]] angle = angle_between_vectors(vector1, vector2) # Align x axis with points 12 selection = Selection.Create(CS_Ref) axis = CS_Ref.Axes[2].Shape.Geometry options = MoveOptions() result = Move.Rotate(selection, axis, DEG(angle), options, None) # EndBlock Delete.Execute(CurvesSelection) Delete.Execute(Selection.Create(Plane_Ref))
0 
@Jimmy He Can we update the Coordinate System tool to include SpaceClaim and Discovery?
0 
Hello @Landon Mitchell Kanner ,
I verified that this script works in Discovery too, so I modified the title. I also included a verification of units based on your post.0