private static Autodesk.DesignScript.Geometry.Curve Convert(Autodesk.Revit.DB.NurbSpline crv) { var convert = NurbsCurve.ByControlPointsWeightsKnots(crv.CtrlPoints.Select(x => x.ToPoint()).ToArray(), crv.Weights.Cast <double>().ToArray(), crv.Knots.Cast <double>().ToArray(), crv.Degree); if (!crv.IsBound) { return(convert); } // bound the curve parametric range // we first get the full parametric domain from the knots // note that some knots be negative and the domain may appear reversed var parms = crv.Knots.Cast <double>().ToList(); var fsp = parms.First(); var fep = parms.Last(); // obtain the full domain var fd = Math.Abs(fsp - fep); // these are the start and end parameters of the bound curve var sp = crv.get_EndParameter(0); var ep = crv.get_EndParameter(1); // get the normalized parameters for trim var nsp = Math.Abs(fsp - sp) / fd; var nep = Math.Abs(fsp - ep) / fd; return(convert.ParameterTrim(nsp, nep)); }
/// <summary> /// Convert a Revit HermiteSpline exactly to a NurbsCurve equivalent /// </summary> /// <param name="crv"></param> /// <returns></returns> public static NurbsCurve ConvertExact(Autodesk.Revit.DB.HermiteSpline crv) { var knots = Clamp(crv.Parameters.Cast <double>()); var points = GetNurbsPoints(crv, knots); // the resultant nurbs curve is not rational - i.e. it's weights are 1 var weights = Enumerable.Repeat(1.0, points.Length).ToArray(); return(NurbsCurve.ByControlPointsWeightsKnots(points, weights, knots, 3)); }
public NurbsCurve CurveToNative(Curve curve) { var points = ArrayToPointList(curve.points, curve.units); var dsKnots = curve.knots; NurbsCurve nurbsCurve = NurbsCurve.ByControlPointsWeightsKnots( points, curve.weights.ToArray(), dsKnots.ToArray(), curve.degree ); return(nurbsCurve.SetDynamoProperties <NurbsCurve>(GetDynamicMembersFromBase(curve))); }
public static NurbsCurve ToNative(this SpeckleCurve curve) { var points = curve.Points.ToPoints(); var dsKnots = curve.Knots; dsKnots.Insert(0, dsKnots.First()); dsKnots.Add(dsKnots.Last()); NurbsCurve nurbsCurve = NurbsCurve.ByControlPointsWeightsKnots( points, curve.Weights.ToArray(), dsKnots.ToArray(), curve.Degree ); return(nurbsCurve.SetSpeckleProperties <NurbsCurve>(curve.Properties)); }
internal static Curve CurveFromMfnNurbsCurveFromDag(MDagPath dagPath, MSpace.Space space) { Point3DCollection controlVertices; List <double> weights, knots; int degree; bool closed, rational; decomposeMayaCurve(dagPath, space, out controlVertices, out weights, out knots, out degree, out closed, out rational); // var controlPoints = new List<Point>(controlVertices.Count); var curvePoints = new PointList(controlVertices.Count); if (MGlobal.isYAxisUp) { curvePoints.AddRange(controlVertices.Select(cv => Point.ByCoordinates(cv.X, -cv.Z, cv.Y))); } else { curvePoints.AddRange(controlVertices.Select(cv => Point.ByCoordinates(cv.X, cv.Y, cv.Z))); } Curve theCurve; if (closed) { theCurve = NurbsCurve.ByControlPoints(curvePoints, degree, true); } else { theCurve = NurbsCurve.ByControlPointsWeightsKnots(curvePoints, weights.ToArray(), knots.ToArray(), degree); } curvePoints.Dispose(); return(theCurve); }
private static NurbsCurve ElevateBezierDegreeBy1(NurbsCurve crv) { var cpts = crv.ControlPoints(); var n = crv.Degree + 1; var cptsFinal = new List <Point>(); cptsFinal.Add(cpts.First()); for (var i = 1; i < cpts.Length; i++) { cptsFinal.Add(Interp(cpts[i - 1], cpts[i], (double)i / n)); } cptsFinal.Add(cpts.Last()); var oldKnots = crv.Knots(); var knots = HermiteToNurbs.Clamp(new[] { oldKnots.First(), oldKnots.Last() }, n); var weights = Enumerable.Repeat(1.0, cptsFinal.Count).ToArray(); return(NurbsCurve.ByControlPointsWeightsKnots(cptsFinal, weights, knots, n)); }