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});
        }
 /// <summary>
 /// Create a surface from a plane definition
 /// </summary>
 /// <param name="activeModeler"></param>
 /// <param name="plane"></param>
 /// <returns></returns>
 public static ISurface CreatePlanarSurface(this IModeler activeModeler, PointDirection3 plane)
 {
     var planeDirection = plane.Direction;
     var vRef = planeDirection.Orthogonal();
     var mathVector = planeDirection;
     var vRootPoint = plane.Point;
     return (ISurface) activeModeler.CreatePlanarSurface2(vRootPoint.ToDoubles(), mathVector.ToDoubles(), vRef.ToDoubles());
 }
        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});
        }