Sphere
using Autodesk.DesignScript.Interfaces;
using Autodesk.DesignScript.Runtime;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
namespace Autodesk.DesignScript.Geometry
{
    public class Sphere : Solid
    {
        internal ISphereEntity SphereEntity => HostImpl as ISphereEntity;
        public Point CenterPoint => Point.Wrap(SphereEntity.get_CenterPoint(), true);
        [Scaling()]
        public double Radius {
            get {
                return SphereEntity.get_Radius() * DesignScriptEntity.scaleFactor;
            }
        }
        internal Sphere(ISphereEntity host, bool persist)
            : base(host, persist)
        {
        }
        public override string ToString()
        {
            return "Sphere(CenterPoint = " + CenterPoint?.ToString() + ", Radius = " + Radius.ToString(GeometryExtension.DoublePrintFormat, CultureInfo.InvariantCulture) + ")";
        }
        internal new static void InitType()
        {
            Geometry.RegisterHostType(typeof(ISphereEntity), (IGeometryEntity host, bool persist) => new Sphere(host as ISphereEntity, persist));
        }
        internal static Sphere Wrap(ISphereEntity host, bool persist = true)
        {
            if (host == null)
                return null;
            return new Sphere(host, persist);
        }
        internal static Sphere[] Wrap(ISphereEntity[] hosts, bool persist = true)
        {
            return (from x in hosts
            select Wrap(x, persist)).ToArray();
        }
        internal static Sphere[][] Wrap(ISphereEntity[][] hosts, bool persist = true)
        {
            return (from x in hosts
            select Wrap(x, persist)).ToArray();
        }
        internal static ISphereEntity[][] Unwrap(Sphere[][] o)
        {
            return (from x in o
            select Unwrap(x)).ToArray();
        }
        internal static ISphereEntity[] Unwrap(Sphere[] o)
        {
            return (from x in o
            select Unwrap(x)).ToArray();
        }
        internal static ISphereEntity[] Unwrap(IEnumerable<Sphere> o)
        {
            return (from x in o
            select Unwrap(x)).ToArray();
        }
        internal static ISphereEntity Unwrap(Sphere o)
        {
            return o.SphereEntity;
        }
        public static Sphere ByCenterPointRadius([DefaultArgument("Autodesk.DesignScript.Geometry.Point.ByCoordinates(0, 0, 0)")] Point centerPoint, [Scaling()] double radius = 1)
        {
            DesignScriptEntity.CheckArgsForAsmExtents(new List<double> {
                radius
            });
            radius /= DesignScriptEntity.scaleFactor;
            return Wrap(HostFactory.Factory.SphereByCenterPointRadius(Point.Unwrap(centerPoint), radius), true);
        }
        public static Sphere ByFourPoints(IEnumerable<Point> points)
        {
            return Wrap(HostFactory.Factory.SphereByFourPoints(Point.Unwrap(points)), true);
        }
        public static Sphere ByBestFit(IEnumerable<Point> points)
        {
            return Wrap(HostFactory.Factory.SphereByBestFit(Point.Unwrap(points)), true);
        }
    }
}