示例#1
0
        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));
        }
示例#2
0
        /// <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)));
        }
示例#4
0
        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));
        }
示例#5
0
        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);
        }
示例#6
0
        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));
        }