NurbsCurve
using Autodesk.DesignScript.Interfaces;
using System.Collections.Generic;
using System.Linq;
namespace Autodesk.DesignScript.Geometry
{
    public class NurbsCurve : Curve
    {
        internal INurbsCurveEntity NurbsCurveEntity => HostImpl as INurbsCurveEntity;
        public int Degree => NurbsCurveEntity.get_Degree();
        public bool IsPeriodic => NurbsCurveEntity.get_IsPeriodic();
        public bool IsRational => NurbsCurveEntity.get_IsRational();
        internal NurbsCurve(INurbsCurveEntity host)
            : base(host)
        {
        }
        public override string ToString()
        {
            return "NurbsCurve(Degree = " + Degree.ToString() + ")";
        }
        internal new static void InitType()
        {
            Geometry.RegisterHostType(typeof(INurbsCurveEntity), (IGeometryEntity host) => new NurbsCurve(host as INurbsCurveEntity));
        }
        internal static NurbsCurve Wrap(INurbsCurveEntity host)
        {
            if (host == null)
                return null;
            return new NurbsCurve(host);
        }
        internal static NurbsCurve[] Wrap(INurbsCurveEntity[] hosts)
        {
            return (from x in hosts
            select Wrap(x)).ToArray();
        }
        internal static NurbsCurve[][] Wrap(INurbsCurveEntity[][] hosts)
        {
            return (from x in hosts
            select Wrap(x)).ToArray();
        }
        internal static INurbsCurveEntity[][] Unwrap(NurbsCurve[][] o)
        {
            return (from x in o
            select Unwrap(x)).ToArray();
        }
        internal static INurbsCurveEntity[] Unwrap(NurbsCurve[] o)
        {
            return (from x in o
            select Unwrap(x)).ToArray();
        }
        internal static INurbsCurveEntity[] Unwrap(IEnumerable<NurbsCurve> o)
        {
            return (from x in o
            select Unwrap(x)).ToArray();
        }
        internal static INurbsCurveEntity Unwrap(NurbsCurve o)
        {
            return o.NurbsCurveEntity;
        }
        public static NurbsCurve ByControlPoints(IEnumerable<Point> points)
        {
            return Wrap(HostFactory.Factory.NurbsCurveByControlPoints(Point.Unwrap(points)));
        }
        public static NurbsCurve ByControlPoints(IEnumerable<Point> points, int degree = 3)
        {
            return Wrap(HostFactory.Factory.NurbsCurveByControlPoints(Point.Unwrap(points), degree));
        }
        public static NurbsCurve ByControlPoints(IEnumerable<Point> points, int degree = 3, bool closeCurve = false)
        {
            return Wrap(HostFactory.Factory.NurbsCurveByControlPoints(Point.Unwrap(points), degree, closeCurve));
        }
        public static NurbsCurve ByControlPointsWeightsKnots(IEnumerable<Point> points, double[] weights, double[] knots, int degree = 3)
        {
            return Wrap(HostFactory.Factory.NurbsCurveByControlPointsWeightsKnots(Point.Unwrap(points), weights, knots, degree));
        }
        public static NurbsCurve ByPoints(IEnumerable<Point> points)
        {
            return Wrap(HostFactory.Factory.NurbsCurveByPoints(Point.Unwrap(points)));
        }
        public static NurbsCurve ByPoints(IEnumerable<Point> points, bool closeCurve = false)
        {
            return Wrap(HostFactory.Factory.NurbsCurveByPoints(Point.Unwrap(points), closeCurve));
        }
        public static NurbsCurve ByPoints(IEnumerable<Point> points, int degree = 3)
        {
            return Wrap(HostFactory.Factory.NurbsCurveByPoints(Point.Unwrap(points), degree));
        }
        public static NurbsCurve ByPointsTangents(IEnumerable<Point> points, Vector startTangent, Vector endTangent)
        {
            return Wrap(HostFactory.Factory.NurbsCurveByPointsTangents(Point.Unwrap(points), Vector.Unwrap(startTangent), Vector.Unwrap(endTangent)));
        }
        public Point[] ControlPoints()
        {
            return Point.Wrap(NurbsCurveEntity.ControlPoints());
        }
        public double[] Knots()
        {
            return NurbsCurveEntity.Knots();
        }
        public double[] Weights()
        {
            return NurbsCurveEntity.Weights();
        }
    }
}
            