Example #1
0
        public static NurbsSurface ToRhino(DB.NurbsSurfaceData surface, DB.BoundingBoxUV bboxUV)
        {
            var degreeU = surface.DegreeU;
            var degreeV = surface.DegreeV;

            var knotsU = surface.GetKnotsU();
            var knotsV = surface.GetKnotsV();

            int controlPointCountU = knotsU.Count - degreeU - 1;
            int controlPointCountV = knotsV.Count - degreeV - 1;

            var nurbsSurface = NurbsSurface.Create(3, surface.IsRational, degreeU + 1, degreeV + 1, controlPointCountU, controlPointCountV);

            var controlPoints = surface.GetControlPoints();
            var weights       = surface.GetWeights();

            var points = nurbsSurface.Points;

            for (int u = 0; u < controlPointCountU; u++)
            {
                int u_offset = u * controlPointCountV;
                for (int v = 0; v < controlPointCountV; v++)
                {
                    var pt = controlPoints[u_offset + v];
                    if (surface.IsRational)
                    {
                        double w = weights[u_offset + v];
                        points.SetPoint(u, v, pt.X * w, pt.Y * w, pt.Z * w, w);
                    }
                    else
                    {
                        points.SetPoint(u, v, pt.X, pt.Y, pt.Z);
                    }
                }
            }

            {
                var knots = nurbsSurface.KnotsU;
                int index = 0;
                foreach (var w in knotsU.Skip(1).Take(knots.Count))
                {
                    knots[index++] = w;
                }
            }

            {
                var knots = nurbsSurface.KnotsV;
                int index = 0;
                foreach (var w in knotsV.Skip(1).Take(knots.Count))
                {
                    knots[index++] = w;
                }
            }

            return(nurbsSurface);
        }
Example #2
0
        public Surface NurbsSurfaceToSpeckle(DB.NurbsSurfaceData surface, DB.BoundingBoxUV uvBox, string units = null)
        {
            var result = new Surface();
            var unit   = units ?? ModelUnits;

            result.units = unit;

            result.degreeU = surface.DegreeU;
            result.degreeV = surface.DegreeV;

            result.domainU = new Interval(0, 1);
            result.domainV = new Interval(0, 1);

            var knotsU = surface.GetKnotsU().ToList();
            var knotsV = surface.GetKnotsV().ToList();

            result.knotsU = knotsU.GetRange(1, knotsU.Count - 2);
            result.knotsV = knotsV.GetRange(1, knotsV.Count - 2);

            var controlPointCountU = knotsU.Count - result.degreeU - 1;
            var controlPointCountV = knotsV.Count - result.degreeV - 1;

            var controlPoints = surface.GetControlPoints();
            var weights       = surface.GetWeights();

            var points = new List <List <ControlPoint> >();

            for (var u = 0; u < controlPointCountU; u++)
            {
                var uOffset = u * controlPointCountV;
                var row     = new List <ControlPoint>();

                for (var v = 0; v < controlPointCountV; v++)
                {
                    var pt    = controlPoints[uOffset + v];
                    var extPt = ToExternalCoordinates(pt);
                    if (surface.IsRational)
                    {
                        var w     = weights[uOffset + v];
                        var point = PointToSpeckle(extPt, unit);
                        row.Add(new ControlPoint(point.x, point.y, point.z, w, unit));
                    }
                    else
                    {
                        var point = PointToSpeckle(extPt, unit);
                        row.Add(new ControlPoint(point.x, point.y, point.z, unit));
                    }
                }
                points.Add(row);
            }

            result.SetControlPoints(points);

            return(result);
        }
        public Surface NurbsSurfaceToSpeckle(DB.NurbsSurfaceData surface, DB.BoundingBoxUV uvBox)
        {
            var result = new Surface();

            result.units = ModelUnits;

            result.degreeU = surface.DegreeU;
            result.degreeV = surface.DegreeV;

            var knotsU = surface.GetKnotsU().ToList();
            var knotsV = surface.GetKnotsV().ToList();

            result.knotsU = knotsU.GetRange(1, knotsU.Count - 2);
            result.knotsV = knotsV.GetRange(1, knotsV.Count - 2);

            var controlPointCountU = knotsU.Count - result.degreeU - 1;
            var controlPointCountV = knotsV.Count - result.degreeV - 1;

            var controlPoints = surface.GetControlPoints();
            var weights       = surface.GetWeights();

            var points = new List <List <ControlPoint> >();

            for (var u = 0; u < controlPointCountU; u++)
            {
                var uOffset = u * controlPointCountV;
                var row     = new List <ControlPoint>();

                for (var v = 0; v < controlPointCountV; v++)
                {
                    var pt    = controlPoints[uOffset + v];
                    var extPt = ToExternalCoordinates(pt);
                    if (surface.IsRational)
                    {
                        var w = weights[uOffset + v];
                        row.Add(new ControlPoint(ScaleToSpeckle(extPt.X), ScaleToSpeckle(extPt.Y), ScaleToSpeckle(extPt.Z), w, ModelUnits));
                    }
                    else
                    {
                        row.Add(new ControlPoint(ScaleToSpeckle(extPt.X), ScaleToSpeckle(extPt.Y), ScaleToSpeckle(extPt.Z), ModelUnits));
                    }
                }
                points.Add(row);
            }
            result.SetControlPoints(points);
            return(result);
        }
Example #4
0
        public static NurbsSurface ToRhino(this DB.NurbsSurfaceData surface, DB.BoundingBoxUV bboxUV)
        {
            var degreeU = surface.DegreeU;
            var degreeV = surface.DegreeV;

            var knotsU = surface.GetKnotsU();
            var knotsV = surface.GetKnotsV();

            int controlPointCountU = knotsU.Count - degreeU - 1;
            int controlPointCountV = knotsV.Count - degreeV - 1;

            var nurbsSurface = NurbsSurface.Create(3, surface.IsRational, degreeU + 1, degreeV + 1, controlPointCountU, controlPointCountV);

            var controlPoints = surface.GetControlPoints();
            var weights       = surface.GetWeights();

            var points = nurbsSurface.Points;

            for (int u = 0; u < controlPointCountU; u++)
            {
                int u_offset = u * controlPointCountV;
                for (int v = 0; v < controlPointCountV; v++)
                {
                    var pt = controlPoints[u_offset + v];
                    if (surface.IsRational)
                    {
                        double w = weights[u_offset + v];
                        points.SetPoint(u, v, pt.X * w, pt.Y * w, pt.Z * w, w);
                    }
                    else
                    {
                        points.SetPoint(u, v, pt.X, pt.Y, pt.Z);
                    }
                }
            }

            {
                var knots = nurbsSurface.KnotsU;
                int index = 0;
                foreach (var w in knotsU.Skip(1).Take(knots.Count))
                {
                    knots[index++] = w;
                }
            }

            {
                var knots = nurbsSurface.KnotsV;
                int index = 0;
                foreach (var w in knotsV.Skip(1).Take(knots.Count))
                {
                    knots[index++] = w;
                }
            }

            double ctol = Revit.ShortCurveTolerance * 5.0;

            // Extend using smooth way avoids creating C2 discontinuities
            nurbsSurface = nurbsSurface.Extend(IsoStatus.West, ctol, true) as NurbsSurface ?? nurbsSurface;
            nurbsSurface = nurbsSurface.Extend(IsoStatus.East, ctol, true) as NurbsSurface ?? nurbsSurface;
            nurbsSurface = nurbsSurface.Extend(IsoStatus.South, ctol, true) as NurbsSurface ?? nurbsSurface;
            nurbsSurface = nurbsSurface.Extend(IsoStatus.North, ctol, true) as NurbsSurface ?? nurbsSurface;

            return(nurbsSurface);
        }