public static ICurve CreateTrimmedLine(this IModeler modeler, Vector3 p0, Vector3 v0, double length)
 {
     v0 = v0.Unit() * (double) length;
     var p1 = p0 + v0;
     return CreateTrimmedLine(modeler,p0, p1);
 }
 public static Vector3 ProjectOn(this Vector3 point, Vector3 axis)
 {
     return ProjectOnUnit(point, axis.Unit());
 }
        public static IBody2 CreateSemiCirclularSheet
            ( this IModeler modeler
            , Vector3 center
            , Vector3 vNormal
            , Vector3 vRef // Horizontal  
            , double radius)
        {
            // Should be orthogonal
            Debug.Assert(vRef.Dot(vNormal)<1e-9);

            var math = SwAddinBase.Active.Math;
            var centerSw = center.ToSwMathPoint();
            var vNormalSw = vNormal.ToSwMathPoint();
            var vNormalOrthSw = vRef.ToSWVector(math).Normalise();

            var centerDbls = centerSw.ArrayData;
            var vNormalDbls = vNormalSw.ArrayData;
            var vNormalOrthDbls = vNormalOrthSw.ArrayData;

            var surf = (Surface) modeler.CreatePlanarSurface2(centerDbls, vNormalDbls, vNormalOrthDbls);


            var startPoint = center + radius*vRef.Unit();
            var endPoint = center - radius*vRef.Unit();

            var startPointDbls = startPoint.ToDoubles();
            var endPointDbls = endPoint.ToDoubles();

            
            var arco = modeler.CreateArc
                        (centerDbls, vNormalDbls, radius, startPointDbls, endPointDbls);

            var arc = (Curve) arco;
            var arcStartPoint = startPoint;
            var arcEndPoint = endPoint;

            var trimmedArc = arc.CreateTrimmedCurve2(arcStartPoint.X,arcStartPoint.Y,arcStartPoint.Z,arcEndPoint.X,arcEndPoint.Y,arcEndPoint.Z);
            var line = modeler.CreateTrimmedLine(arcEndPoint, arcStartPoint);
            return (IBody2) surf.CreateTrimmedSheet(new[] {trimmedArc, line});
        }