// Polycurve
        // Rh Capture/Gh Capture
        public Polycurve PolycurveToSpeckle(PolyCurve p, string units = null)
        {
            var u      = units ?? ModelUnits;
            var myPoly = new Polycurve();

            myPoly.closed = p.IsClosed;
            myPoly.domain = IntervalToSpeckle(p.Domain);
            myPoly.length = p.GetLength();
            myPoly.bbox   = BoxToSpeckle(new RH.Box(p.GetBoundingBox(true)), u);

            var segments = new List <RH.Curve>();

            CurveSegments(segments, p, true);

            //let the converter pick the best type of curve
            myPoly.segments = segments.Select(s => CurveToSpeckle(s, u)).ToList();
            myPoly.units    = u;
            return(myPoly);
        }
        public static void DrawReleases(GH_PreviewWireArgs args, PolyCurve crv, double angle, GsaBool6 start, GsaBool6 end)
        {
            if (start == null | end == null)
            {
                return;
            }
            #region translation start
            if (start.X == true)
            {
                Point3d pt;
                double  scale = 1;
                if (crv.GetLength() < 1)
                {
                    pt    = crv.PointAtNormalizedLength(0.05);
                    scale = crv.GetLength();
                }
                else
                {
                    pt = crv.PointAtLength(0.05);
                }

                Plane pln = new Plane();
                crv.PerpendicularFrameAt(0.02, out pln);
                pln.Rotate(angle, pln.Normal);
                Vector3d vec1 = new Vector3d(pln.XAxis);
                vec1.Unitize();
                vec1 = new Vector3d(vec1.X * 0.025 * scale, vec1.Y * 0.025 * scale, vec1.Z * 0.025 * scale);
                Vector3d vec2 = new Vector3d(vec1);
                vec2.Reverse();
                Transform xf1 = Rhino.Geometry.Transform.Translation(vec1);
                Transform xf2 = Rhino.Geometry.Transform.Translation(vec2);
                Point3d   pt1 = new Point3d(pt);
                pt1.Transform(xf1);
                Point3d pt2 = new Point3d(pt);
                pt2.Transform(xf2);
                Vector3d vec = new Vector3d(pln.Normal);
                vec.Unitize();
                vec = new Vector3d(vec.X * 0.25 * scale, vec.Y * 0.25 * scale, vec.Z * 0.25 * scale);
                Line ln1 = new Line(pt1, vec);
                args.Pipeline.DrawLine(ln1, UI.Colour.Support);
                Line ln2 = new Line(pt2, vec);
                args.Pipeline.DrawLine(ln2, UI.Colour.Support);
            }
            if (start.Y == true)
            {
                Point3d pt;
                double  scale = 1;
                if (crv.GetLength() < 1)
                {
                    pt    = crv.PointAtNormalizedLength(0.05);
                    scale = crv.GetLength();
                }
                else
                {
                    pt = crv.PointAtLength(0.05);
                }

                Plane pln = new Plane();
                crv.PerpendicularFrameAt(0.02, out pln);
                pln.Rotate(angle, pln.Normal);
                Vector3d vec1 = new Vector3d(pln.XAxis);
                vec1.Unitize();
                vec1 = new Vector3d(vec1.X * 0.05 * scale, vec1.Y * 0.05 * scale, vec1.Z * 0.05 * scale);
                Vector3d vec2 = new Vector3d(vec1);
                vec2.Reverse();
                Transform xf1 = Rhino.Geometry.Transform.Translation(vec1);
                Transform xf2 = Rhino.Geometry.Transform.Translation(vec2);
                Point3d   pt1 = new Point3d(pt);
                pt1.Transform(xf1);
                Point3d pt2 = new Point3d(pt);
                pt2.Transform(xf2);
                Vector3d vec3 = new Vector3d(pln.Normal);
                vec3.Unitize();
                vec3 = new Vector3d(vec3.X * 0.025 * scale, vec3.Y * 0.025 * scale, vec3.Z * 0.025 * scale);
                Vector3d vec4 = new Vector3d(vec3);
                vec4.Reverse();
                Transform xf3  = Rhino.Geometry.Transform.Translation(vec3);
                Transform xf4  = Rhino.Geometry.Transform.Translation(vec4);
                Point3d   pt3A = new Point3d(pt1);
                pt3A.Transform(xf3);
                Point3d pt3B = new Point3d(pt2);
                pt3B.Transform(xf3);
                Point3d pt4A = new Point3d(pt1);
                pt4A.Transform(xf4);
                Point3d pt4B = new Point3d(pt2);
                pt4B.Transform(xf4);

                Vector3d vec = new Vector3d(pln.XAxis);
                vec.Unitize();
                vec = new Vector3d(vec.X * 0.15 * scale, vec.Y * 0.15 * scale, vec.Z * 0.15 * scale);
                Vector3d vecRev = new Vector3d(vec);
                vecRev.Reverse();
                Line ln1A = new Line(pt3A, vec);
                args.Pipeline.DrawLine(ln1A, UI.Colour.Support);
                Line ln1B = new Line(pt3B, vecRev);
                args.Pipeline.DrawLine(ln1B, UI.Colour.Support);
                Line ln2A = new Line(pt4A, vec);
                args.Pipeline.DrawLine(ln2A, UI.Colour.Support);
                Line ln2B = new Line(pt4B, vecRev);
                args.Pipeline.DrawLine(ln2B, UI.Colour.Support);
            }
            if (start.Z == true)
            {
                Point3d pt;
                double  scale = 1;
                if (crv.GetLength() < 1)
                {
                    pt    = crv.PointAtNormalizedLength(0.05);
                    scale = crv.GetLength();
                }
                else
                {
                    pt = crv.PointAtLength(0.05);
                }

                Plane pln = new Plane();
                crv.PerpendicularFrameAt(0.02, out pln);
                pln.Rotate(angle, pln.Normal);
                Vector3d vec1 = new Vector3d(pln.YAxis);
                vec1.Unitize();
                vec1 = new Vector3d(vec1.X * 0.05 * scale, vec1.Y * 0.05 * scale, vec1.Z * 0.05 * scale);
                Vector3d vec2 = new Vector3d(vec1);
                vec2.Reverse();
                Transform xf1 = Rhino.Geometry.Transform.Translation(vec1);
                Transform xf2 = Rhino.Geometry.Transform.Translation(vec2);
                Point3d   pt1 = new Point3d(pt);
                pt1.Transform(xf1);
                Point3d pt2 = new Point3d(pt);
                pt2.Transform(xf2);
                Vector3d vec3 = new Vector3d(pln.Normal);
                vec3.Unitize();
                vec3 = new Vector3d(vec3.X * 0.025 * scale, vec3.Y * 0.025 * scale, vec3.Z * 0.025 * scale);
                Vector3d vec4 = new Vector3d(vec3);
                vec4.Reverse();
                Transform xf3  = Rhino.Geometry.Transform.Translation(vec3);
                Transform xf4  = Rhino.Geometry.Transform.Translation(vec4);
                Point3d   pt3A = new Point3d(pt1);
                pt3A.Transform(xf3);
                Point3d pt3B = new Point3d(pt2);
                pt3B.Transform(xf3);
                Point3d pt4A = new Point3d(pt1);
                pt4A.Transform(xf4);
                Point3d pt4B = new Point3d(pt2);
                pt4B.Transform(xf4);

                Vector3d vec = new Vector3d(pln.YAxis);
                vec.Unitize();
                vec = new Vector3d(vec.X * 0.15 * scale, vec.Y * 0.15 * scale, vec.Z * 0.15 * scale);
                Vector3d vecRev = new Vector3d(vec);
                vecRev.Reverse();
                Line ln1A = new Line(pt3A, vec);
                args.Pipeline.DrawLine(ln1A, UI.Colour.Support);
                Line ln1B = new Line(pt3B, vecRev);
                args.Pipeline.DrawLine(ln1B, UI.Colour.Support);
                Line ln2A = new Line(pt4A, vec);
                args.Pipeline.DrawLine(ln2A, UI.Colour.Support);
                Line ln2B = new Line(pt4B, vecRev);
                args.Pipeline.DrawLine(ln2B, UI.Colour.Support);
            }
            #endregion
            #region translation end
            if (end.X == true)
            {
                Point3d pt;
                double  scale = 1;
                if (crv.GetLength() < 1)
                {
                    pt    = crv.PointAtNormalizedLength(0.95);
                    scale = crv.GetLength();
                }
                else
                {
                    double len = crv.GetLength();
                    pt = crv.PointAtLength(len - 0.05);
                }

                Plane pln = new Plane();
                crv.PerpendicularFrameAt(0.98, out pln);
                pln.Rotate(angle, pln.Normal);
                Vector3d vec1 = new Vector3d(pln.XAxis);
                vec1.Unitize();
                vec1 = new Vector3d(vec1.X * 0.025 * scale, vec1.Y * 0.025 * scale, vec1.Z * 0.025 * scale);
                Vector3d vec2 = new Vector3d(vec1);
                vec2.Reverse();
                Transform xf1 = Rhino.Geometry.Transform.Translation(vec1);
                Transform xf2 = Rhino.Geometry.Transform.Translation(vec2);
                Point3d   pt1 = new Point3d(pt);
                pt1.Transform(xf1);
                Point3d pt2 = new Point3d(pt);
                pt2.Transform(xf2);
                Vector3d vec = new Vector3d(pln.Normal);
                vec.Unitize();
                vec = new Vector3d(vec.X * 0.25 * scale, vec.Y * 0.25 * scale, vec.Z * 0.25 * scale);
                vec.Reverse();
                Line ln1 = new Line(pt1, vec);
                args.Pipeline.DrawLine(ln1, UI.Colour.Support);
                Line ln2 = new Line(pt2, vec);
                args.Pipeline.DrawLine(ln2, UI.Colour.Support);
            }
            if (end.Y == true)
            {
                Point3d pt;
                double  scale = 1;
                if (crv.GetLength() < 1)
                {
                    pt    = crv.PointAtNormalizedLength(0.95);
                    scale = crv.GetLength();
                }
                else
                {
                    double len = crv.GetLength();
                    pt = crv.PointAtLength(len - 0.05);
                }

                Plane pln = new Plane();
                crv.PerpendicularFrameAt(0.02, out pln);
                pln.Rotate(angle, pln.Normal);
                Vector3d vec1 = new Vector3d(pln.XAxis);
                vec1.Unitize();
                vec1 = new Vector3d(vec1.X * 0.05 * scale, vec1.Y * 0.05 * scale, vec1.Z * 0.05 * scale);
                Vector3d vec2 = new Vector3d(vec1);
                vec2.Reverse();
                Transform xf1 = Rhino.Geometry.Transform.Translation(vec1);
                Transform xf2 = Rhino.Geometry.Transform.Translation(vec2);
                Point3d   pt1 = new Point3d(pt);
                pt1.Transform(xf1);
                Point3d pt2 = new Point3d(pt);
                pt2.Transform(xf2);
                Vector3d vec3 = new Vector3d(pln.Normal);
                vec3.Unitize();
                vec3 = new Vector3d(vec3.X * 0.025 * scale, vec3.Y * 0.025 * scale, vec3.Z * 0.025 * scale);
                Vector3d vec4 = new Vector3d(vec3);
                vec4.Reverse();
                Transform xf3  = Rhino.Geometry.Transform.Translation(vec3);
                Transform xf4  = Rhino.Geometry.Transform.Translation(vec4);
                Point3d   pt3A = new Point3d(pt1);
                pt3A.Transform(xf3);
                Point3d pt3B = new Point3d(pt2);
                pt3B.Transform(xf3);
                Point3d pt4A = new Point3d(pt1);
                pt4A.Transform(xf4);
                Point3d pt4B = new Point3d(pt2);
                pt4B.Transform(xf4);

                Vector3d vec = new Vector3d(pln.XAxis);
                vec.Unitize();
                vec = new Vector3d(vec.X * 0.15 * scale, vec.Y * 0.15 * scale, vec.Z * 0.15 * scale);
                Vector3d vecRev = new Vector3d(vec);
                vecRev.Reverse();
                Line ln1A = new Line(pt3A, vec);
                args.Pipeline.DrawLine(ln1A, UI.Colour.Support);
                Line ln1B = new Line(pt3B, vecRev);
                args.Pipeline.DrawLine(ln1B, UI.Colour.Support);
                Line ln2A = new Line(pt4A, vec);
                args.Pipeline.DrawLine(ln2A, UI.Colour.Support);
                Line ln2B = new Line(pt4B, vecRev);
                args.Pipeline.DrawLine(ln2B, UI.Colour.Support);
            }
            if (end.Z == true)
            {
                Point3d pt;
                double  scale = 1;
                if (crv.GetLength() < 1)
                {
                    pt    = crv.PointAtNormalizedLength(0.95);
                    scale = crv.GetLength();
                }
                else
                {
                    double len = crv.GetLength();
                    pt = crv.PointAtLength(len - 0.05);
                }

                Plane pln = new Plane();
                crv.PerpendicularFrameAt(0.02, out pln);
                pln.Rotate(angle, pln.Normal);
                Vector3d vec1 = new Vector3d(pln.YAxis);
                vec1.Unitize();
                vec1 = new Vector3d(vec1.X * 0.05 * scale, vec1.Y * 0.05 * scale, vec1.Z * 0.05 * scale);
                Vector3d vec2 = new Vector3d(vec1);
                vec2.Reverse();
                Transform xf1 = Rhino.Geometry.Transform.Translation(vec1);
                Transform xf2 = Rhino.Geometry.Transform.Translation(vec2);
                Point3d   pt1 = new Point3d(pt);
                pt1.Transform(xf1);
                Point3d pt2 = new Point3d(pt);
                pt2.Transform(xf2);
                Vector3d vec3 = new Vector3d(pln.Normal);
                vec3.Unitize();
                vec3 = new Vector3d(vec3.X * 0.025 * scale, vec3.Y * 0.025 * scale, vec3.Z * 0.025 * scale);
                Vector3d vec4 = new Vector3d(vec3);
                vec4.Reverse();
                Transform xf3  = Rhino.Geometry.Transform.Translation(vec3);
                Transform xf4  = Rhino.Geometry.Transform.Translation(vec4);
                Point3d   pt3A = new Point3d(pt1);
                pt3A.Transform(xf3);
                Point3d pt3B = new Point3d(pt2);
                pt3B.Transform(xf3);
                Point3d pt4A = new Point3d(pt1);
                pt4A.Transform(xf4);
                Point3d pt4B = new Point3d(pt2);
                pt4B.Transform(xf4);

                Vector3d vec = new Vector3d(pln.YAxis);
                vec.Unitize();
                vec = new Vector3d(vec.X * 0.15 * scale, vec.Y * 0.15 * scale, vec.Z * 0.15 * scale);
                Vector3d vecRev = new Vector3d(vec);
                vecRev.Reverse();
                Line ln1A = new Line(pt3A, vec);
                args.Pipeline.DrawLine(ln1A, UI.Colour.Support);
                Line ln1B = new Line(pt3B, vecRev);
                args.Pipeline.DrawLine(ln1B, UI.Colour.Support);
                Line ln2A = new Line(pt4A, vec);
                args.Pipeline.DrawLine(ln2A, UI.Colour.Support);
                Line ln2B = new Line(pt4B, vecRev);
                args.Pipeline.DrawLine(ln2B, UI.Colour.Support);
            }
            #endregion
            #region rotation start
            if (start.XX == true)
            {
                Point3d pt;
                double  scale = 1;
                if (crv.GetLength() < 1)
                {
                    pt    = crv.PointAtNormalizedLength(0.05);
                    scale = crv.GetLength();
                }
                else
                {
                    pt = crv.PointAtLength(0.05);
                }

                Plane pln = new Plane();
                crv.PerpendicularFrameAt(0.02, out pln);
                Vector3d vec = new Vector3d(pln.Normal);
                vec.Unitize();
                vec = new Vector3d(vec.X * 0.25 * scale, vec.Y * 0.25 * scale, vec.Z * 0.25 * scale);
                Line ln1 = new Line(pt, vec);
                args.Pipeline.DrawLine(ln1, UI.Colour.Release, 3);
            }
            if (start.YY == true)
            {
                Point3d pt;
                double  scale = 1;
                if (crv.GetLength() < 1)
                {
                    pt    = crv.PointAtNormalizedLength(0.05);
                    scale = crv.GetLength();
                }
                else
                {
                    pt = crv.PointAtLength(0.05);
                }

                Plane pln = new Plane();
                crv.PerpendicularFrameAt(0.02, out pln);
                pln.Rotate(angle, pln.Normal);
                Vector3d vec1 = new Vector3d(pln.XAxis);
                vec1.Unitize();
                vec1 = new Vector3d(vec1.X * 0.05 * scale, vec1.Y * 0.05 * scale, vec1.Z * 0.05 * scale);
                Vector3d vec2 = new Vector3d(vec1);
                vec2.Reverse();
                Transform xf1 = Rhino.Geometry.Transform.Translation(vec1);
                Transform xf2 = Rhino.Geometry.Transform.Translation(vec2);
                Point3d   pt1 = new Point3d(pt);
                pt1.Transform(xf1);
                Point3d pt2 = new Point3d(pt);
                pt2.Transform(xf2);

                Vector3d vec = new Vector3d(pln.XAxis);
                vec.Unitize();
                vec = new Vector3d(vec.X * 0.15 * scale, vec.Y * 0.15 * scale, vec.Z * 0.15 * scale);
                Vector3d vecRev = new Vector3d(vec);
                vecRev.Reverse();
                Line ln1A = new Line(pt1, vec);
                args.Pipeline.DrawLine(ln1A, UI.Colour.Release);
                Line ln1B = new Line(pt2, vecRev);
                args.Pipeline.DrawLine(ln1B, UI.Colour.Release);
            }
            if (start.ZZ == true)
            {
                Point3d pt;
                double  scale = 1;
                if (crv.GetLength() < 1)
                {
                    pt    = crv.PointAtNormalizedLength(0.05);
                    scale = crv.GetLength();
                }
                else
                {
                    pt = crv.PointAtLength(0.05);
                }

                Plane pln = new Plane();
                crv.PerpendicularFrameAt(0.02, out pln);
                pln.Rotate(angle, pln.Normal);
                Vector3d vec1 = new Vector3d(pln.YAxis);
                vec1.Unitize();
                vec1 = new Vector3d(vec1.X * 0.05 * scale, vec1.Y * 0.05 * scale, vec1.Z * 0.05 * scale);
                Vector3d vec2 = new Vector3d(vec1);
                vec2.Reverse();
                Transform xf1 = Rhino.Geometry.Transform.Translation(vec1);
                Transform xf2 = Rhino.Geometry.Transform.Translation(vec2);
                Point3d   pt1 = new Point3d(pt);
                pt1.Transform(xf1);
                Point3d pt2 = new Point3d(pt);
                pt2.Transform(xf2);

                Vector3d vec = new Vector3d(pln.YAxis);
                vec.Unitize();
                vec = new Vector3d(vec.X * 0.15 * scale, vec.Y * 0.15 * scale, vec.Z * 0.15 * scale);
                Vector3d vecRev = new Vector3d(vec);
                vecRev.Reverse();
                Line ln1A = new Line(pt1, vec);
                args.Pipeline.DrawLine(ln1A, UI.Colour.Release);
                Line ln1B = new Line(pt2, vecRev);
                args.Pipeline.DrawLine(ln1B, UI.Colour.Release);
            }
            #endregion
            #region rotation end
            if (end.XX == true)
            {
                Point3d pt;
                double  scale = 1;
                if (crv.GetLength() < 1)
                {
                    pt    = crv.PointAtNormalizedLength(0.95);
                    scale = crv.GetLength();
                }
                else
                {
                    double len = crv.GetLength();
                    pt = crv.PointAtLength(len - 0.05);
                }

                Plane pln = new Plane();
                crv.PerpendicularFrameAt(0.02, out pln);
                Vector3d vec = new Vector3d(pln.Normal);
                vec.Unitize();
                vec.Reverse();
                vec = new Vector3d(vec.X * 0.25 * scale, vec.Y * 0.25 * scale, vec.Z * 0.25 * scale);
                Line ln1 = new Line(pt, vec);
                args.Pipeline.DrawLine(ln1, UI.Colour.Release, 3);
            }
            if (end.YY == true)
            {
                Point3d pt;
                double  scale = 1;
                if (crv.GetLength() < 1)
                {
                    pt    = crv.PointAtNormalizedLength(0.95);
                    scale = crv.GetLength();
                }
                else
                {
                    double len = crv.GetLength();
                    pt = crv.PointAtLength(len - 0.05);
                }

                Plane pln = new Plane();
                crv.PerpendicularFrameAt(0.02, out pln);
                pln.Rotate(angle, pln.Normal);
                Vector3d vec1 = new Vector3d(pln.XAxis);
                vec1.Unitize();
                vec1 = new Vector3d(vec1.X * 0.05 * scale, vec1.Y * 0.05 * scale, vec1.Z * 0.05 * scale);
                Vector3d vec2 = new Vector3d(vec1);
                vec2.Reverse();
                Transform xf1 = Rhino.Geometry.Transform.Translation(vec1);
                Transform xf2 = Rhino.Geometry.Transform.Translation(vec2);
                Point3d   pt1 = new Point3d(pt);
                pt1.Transform(xf1);
                Point3d pt2 = new Point3d(pt);
                pt2.Transform(xf2);

                Vector3d vec = new Vector3d(pln.XAxis);
                vec.Unitize();
                vec = new Vector3d(vec.X * 0.15 * scale, vec.Y * 0.15 * scale, vec.Z * 0.15 * scale);
                Vector3d vecRev = new Vector3d(vec);
                vecRev.Reverse();
                Line ln1A = new Line(pt1, vec);
                args.Pipeline.DrawLine(ln1A, UI.Colour.Release);
                Line ln1B = new Line(pt2, vecRev);
                args.Pipeline.DrawLine(ln1B, UI.Colour.Release);
            }
            if (end.ZZ == true)
            {
                Point3d pt;
                double  scale = 1;
                if (crv.GetLength() < 1)
                {
                    pt    = crv.PointAtNormalizedLength(0.95);
                    scale = crv.GetLength();
                }
                else
                {
                    double len = crv.GetLength();
                    pt = crv.PointAtLength(len - 0.05);
                }

                Plane pln = new Plane();
                crv.PerpendicularFrameAt(0.02, out pln);
                pln.Rotate(angle, pln.Normal);
                Vector3d vec1 = new Vector3d(pln.YAxis);
                vec1.Unitize();
                vec1 = new Vector3d(vec1.X * 0.05 * scale, vec1.Y * 0.05 * scale, vec1.Z * 0.05 * scale);
                Vector3d vec2 = new Vector3d(vec1);
                vec2.Reverse();
                Transform xf1 = Rhino.Geometry.Transform.Translation(vec1);
                Transform xf2 = Rhino.Geometry.Transform.Translation(vec2);
                Point3d   pt1 = new Point3d(pt);
                pt1.Transform(xf1);
                Point3d pt2 = new Point3d(pt);
                pt2.Transform(xf2);

                Vector3d vec = new Vector3d(pln.YAxis);
                vec.Unitize();
                vec = new Vector3d(vec.X * 0.15 * scale, vec.Y * 0.15 * scale, vec.Z * 0.15 * scale);
                Vector3d vecRev = new Vector3d(vec);
                vecRev.Reverse();
                Line ln1A = new Line(pt1, vec);
                args.Pipeline.DrawLine(ln1A, UI.Colour.Release);
                Line ln1B = new Line(pt2, vecRev);
                args.Pipeline.DrawLine(ln1B, UI.Colour.Release);
            }
            #endregion
        }