/// <summary> /// /// Create FdCoordinateSystem from Dynamo coordinate system of a Arc or Circle. /// Dynamo Arcs and Circles follow left-hand rule. /// This method realignes the coordinate system. /// </summary> internal static FdCoordinateSystem FromDynamoCoordinateSystemArcOrCircle(Autodesk.DesignScript.Geometry.CoordinateSystem obj) { FdPoint3d origin = FdPoint3d.FromDynamo(obj.Origin); FdVector3d localX = FdVector3d.FromDynamo(obj.YAxis); FdVector3d localY = FdVector3d.FromDynamo(obj.XAxis); FdVector3d localZ = localX.Cross(localY).Normalize(); return(new FdCoordinateSystem(origin, localX, localY, localZ)); }
/// <summary> /// Construct FdCoordinateSystem from origin point and local x and y axes. /// </summary> public FdCoordinateSystem(FdPoint3d origin, FdVector3d localX, FdVector3d localY) { this.Origin = origin; this._localX = localX; this._localY = localY; this._localZ = localX.Cross(localY); if (!this.IsComplete()) { throw new System.ArgumentException("The defined coordinate system is not complete!"); } if (!this.IsOrthogonal()) { throw new System.ArgumentException($"The defined coordinate system is not orthogonal within the tolerance {Tolerance.DotProduct}"); } }
/// <summary> /// Set Y-axis and rotate coordinate system accordingly around X-Axis. /// </summary> public void SetYAroundX(FdVector3d vector) { // try to set axis FdVector3d val = vector.Normalize(); FdVector3d x = this.LocalX; double dot = x.Dot(val); if (Math.Abs(dot) < Tolerance.DotProduct) { this._localY = val; this._localZ = x.Cross(val); // follows right-hand-rule } else { throw new System.ArgumentException($"The passed Y-axis is not perpendicular to X-axis. The dot-product is {dot}, but should be 0"); } }