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); }
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); }
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); }