public static ICurve CreateTrimmedArc
            (this IModeler modeler, Vector3 center, Vector3 axis, Vector3 startPoint, Vector3 endPoint)
        {
            var radius = (startPoint - center).Length();
            var arc =
                (Curve)
                    modeler.CreateArc
                        (center.ToDoubles(), axis.ToDoubles(), (double) radius, startPoint.ToDoubles(), endPoint.ToDoubles());

            var pp0 = arc.GetClosestPointOn(startPoint.X, startPoint.Y, startPoint.Z).CastArray<double>();
            var pp1 = arc.GetClosestPointOn(endPoint.X, endPoint.Y, endPoint.Z).CastArray<double>();

            return arc.CreateTrimmedCurve(pp0[3], pp1[3]);

        }
        public static IBody2 CreateCirclularSheet
            ( this IModeler modeler
            , Vector3 center
            , Vector3 vNormal
            , Vector3 vRef
            , 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 = centerSw.AddTs(vNormalOrthSw.ScaleTs(radius));

            var startPointDbls = startPoint.ArrayData;

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

            var arc = (Curve) arco;
            var arcStartPoint = arc.StartPoint();
            var arcEndPoint = arc.EndPoint();

            var trimmedArc = arc.CreateTrimmedCurve2(arcStartPoint.X,arcStartPoint.Y,arcStartPoint.Z,arcEndPoint.X,arcEndPoint.Y,arcEndPoint.Z);
            return (IBody2) surf.CreateTrimmedSheet(new[] {trimmedArc});
        }
        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});
        }