public static SpeckleObject fromBrep(Brep o, bool getEncoded, bool getAbstract)
        {
            var encodedObj = "RH:" + SpeckleConverter.getBase64(o);
            var ms         = getMeshFromBrep(o);

            Rhino.Geometry.VolumeMassProperties volumeProps = Rhino.Geometry.VolumeMassProperties.Compute(o);
            Rhino.Geometry.AreaMassProperties   areaProps   = Rhino.Geometry.AreaMassProperties.Compute(o);

            SpeckleObject obj = new SpeckleObject();

            obj.value      = new ExpandoObject();
            obj.properties = new ExpandoObject();

            obj.type                      = "Brep";
            obj.hash                      = "Brep." + SpeckleConverter.getHash(encodedObj);
            obj.encodedValue              = getEncoded ? encodedObj : "";
            obj.value.vertices            = ms.Vertices;
            obj.value.faces               = ms.Faces;
            obj.value.colors              = ms.VertexColors;
            obj.properties.volume         = volumeProps.Volume;
            obj.properties.area           = areaProps.Area;
            obj.properties.volumeCentroid = fromPoint(volumeProps.Centroid);
            obj.properties.areaCentroid   = fromPoint(areaProps.Centroid);

            return(obj);
        }
        public static SpeckleObject fromMesh(Mesh o)
        {
            var encodedObj = "RH:" + SpeckleConverter.getBase64(o);

            Rhino.Geometry.VolumeMassProperties volumeProps = Rhino.Geometry.VolumeMassProperties.Compute(o);
            Rhino.Geometry.AreaMassProperties   areaProps   = Rhino.Geometry.AreaMassProperties.Compute(o);

            SpeckleObject obj = new SpeckleObject();

            obj.value      = new ExpandoObject();
            obj.properties = new ExpandoObject();


            obj.type = "Mesh";
            obj.hash = "Mesh." + SpeckleConverter.getHash(encodedObj);

            obj.value.vertices = o.Vertices.Select(pt => fromPoint(pt));
            obj.value.faces    = o.Faces;
            obj.value.colors   = o.VertexColors.Select(c => c.ToArgb());
            //o.UserData
            obj.properties.volume         = volumeProps.Volume;
            obj.properties.area           = areaProps.Area;
            obj.properties.volumeCentroid = fromPoint(volumeProps.Centroid);
            obj.properties.areaCentroid   = fromPoint(areaProps.Centroid);

            return(obj);
        }
        public static SpeckleObject fromPolyline(Polyline poly)
        {
            var encodedObj = "RH:" + SpeckleConverter.getBase64(poly.ToNurbsCurve());

            Rhino.Geometry.AreaMassProperties areaProps = Rhino.Geometry.AreaMassProperties.Compute(poly.ToNurbsCurve());

            SpeckleObject obj = new SpeckleObject();

            obj.value      = new ExpandoObject();
            obj.properties = new ExpandoObject();

            obj.type = "Polyline";
            obj.hash = "Polyline." + SpeckleConverter.getHash(encodedObj);

            obj.value                   = poly.Select(pt => fromPoint(pt));
            obj.properties.length       = poly.Length;
            obj.properties.area         = areaProps != null ? areaProps.Area : 0;
            obj.properties.areaCentroid = areaProps != null?fromPoint(areaProps.Centroid) : null;

            return(obj);
        }
        public static SpeckleObject fromCurve(Curve o, bool getEncoded, bool getAbstract)
        {
            var encodedObj = "RH:" + SpeckleConverter.getBase64(o);

            Rhino.Geometry.AreaMassProperties areaProps = Rhino.Geometry.AreaMassProperties.Compute(o);
            var      polyCurve = o.ToPolyline(0, 1, 0, 0, 0, 0.1, 0, 0, true);
            Polyline poly; polyCurve.TryGetPolyline(out poly);

            SpeckleObject obj = new SpeckleObject();

            obj.value      = new ExpandoObject();
            obj.properties = new ExpandoObject();

            obj.type                    = "Curve";
            obj.hash                    = "Curve." + SpeckleConverter.getHash(encodedObj);
            obj.value                   = fromPolyline(poly);
            obj.encodedValue            = getEncoded ? encodedObj : "";
            obj.properties.length       = o.GetLength();
            obj.properties.area         = areaProps != null ? areaProps.Area : 0;
            obj.properties.areaCentroid = areaProps != null?fromPoint(areaProps.Centroid) : null;

            return(obj);
        }