/***************************************************/ public static BHG.ICurve FromRhino(this RHG.Curve rCurve) { if (rCurve == null) { return(null); } Type curveType = rCurve.GetType(); if (rCurve.IsLinear() && rCurve.SpanCount < 2) { return(new BHG.Line { Start = rCurve.PointAtStart.FromRhino(), End = rCurve.PointAtEnd.FromRhino(), Infinite = false }); } if (rCurve.IsCircle()) { RHG.Circle circle = new RHG.Circle(); rCurve.TryGetCircle(out circle); return(circle.FromRhino()); } else if (rCurve.IsArc() || typeof(RHG.ArcCurve).IsAssignableFrom(curveType)) { RHG.Arc arc = new RHG.Arc(); rCurve.TryGetArc(out arc); return(arc.FromRhino()); } else if (rCurve.IsPolyline() || typeof(RHG.PolylineCurve).IsAssignableFrom(curveType)) { RHG.Polyline polyline = new RHG.Polyline(); rCurve.TryGetPolyline(out polyline); return(polyline.FromRhino()); } else if (rCurve.IsClosed && rCurve.IsEllipse()) { RHG.Ellipse ellipse = new RHG.Ellipse(); rCurve.TryGetEllipse(out ellipse); return(ellipse.FromRhino()); } else if (rCurve is RHG.NurbsCurve) { return(((RHG.NurbsCurve)rCurve).FromRhino()); } else if (rCurve is RHG.PolyCurve) { return(((RHG.PolyCurve)rCurve).FromRhino()); //The test of IsPolyline above is very important to make sure we can cast to PolyCurve here } else { return((rCurve.ToNurbsCurve()).FromRhino()); } }
/***************************************************/ private static BHG.ICurve ToBHoMTrimCurve(this RHG.Curve curve) { if (curve.IsArc()) { RHG.Arc arc; curve.TryGetArc(out arc); return(arc.FromRhino()); } else { return(curve.FromRhino()); } }
/// <summary> /// Convert a Rhino curve to a Nucleus one /// </summary> /// <param name="curve"></param> /// <returns></returns> public static Curve Convert(RC.Curve curve) { if (curve == null) { return(null); } if (curve is RC.LineCurve) { return(Convert((RC.LineCurve)curve)); } else if (curve.IsLinear()) { return(Convert(new RC.Line(curve.PointAtStart, curve.PointAtEnd))); } else if (curve.IsPolyline()) { RC.Polyline pLine; if (curve.TryGetPolyline(out pLine)) { return(Convert(pLine)); } } else if (curve is RC.PolyCurve) { return(Convert((RC.PolyCurve)curve)); } else if (curve.IsArc()) { RC.Arc arc; if (curve.TryGetArc(out arc)) { return(Convert(arc)); } } throw new NotImplementedException(); }
private LyrebirdCurve GetLBCurve(Curve crv) { LyrebirdCurve lbc = null; List<LyrebirdPoint> points = new List<LyrebirdPoint>(); if (crv.IsLinear()) { // standard linear element points.Add(new LyrebirdPoint(crv.PointAtStart.X, crv.PointAtStart.Y, crv.PointAtStart.Z)); points.Add(new LyrebirdPoint(crv.PointAtEnd.X, crv.PointAtEnd.Y, crv.PointAtEnd.Z)); lbc = new LyrebirdCurve(points, "Line"); } else if (crv.IsCircle()) { crv.Domain = new Interval(0, 1); points.Add(new LyrebirdPoint(crv.PointAtStart.X, crv.PointAtStart.Y, crv.PointAtStart.Z)); points.Add(new LyrebirdPoint(crv.PointAt(0.25).X, crv.PointAt(0.25).Y, crv.PointAt(0.25).Z)); points.Add(new LyrebirdPoint(crv.PointAt(0.5).X, crv.PointAt(0.5).Y, crv.PointAt(0.5).Z)); points.Add(new LyrebirdPoint(crv.PointAt(0.75).X, crv.PointAt(0.75).Y, crv.PointAt(0.75).Z)); points.Add(new LyrebirdPoint(crv.PointAtEnd.X, crv.PointAtEnd.Y, crv.PointAtEnd.Z)); lbc = new LyrebirdCurve(points, "Circle"); } else if (crv.IsArc()) { crv.Domain = new Interval(0, 1); // standard arc element points.Add(new LyrebirdPoint(crv.PointAtStart.X, crv.PointAtStart.Y, crv.PointAtStart.Z)); points.Add(new LyrebirdPoint(crv.PointAt(0.5).X, crv.PointAt(0.5).Y, crv.PointAt(0.5).Z)); points.Add(new LyrebirdPoint(crv.PointAtEnd.X, crv.PointAtEnd.Y, crv.PointAtEnd.Z)); lbc = new LyrebirdCurve(points, "Arc"); } else { // Spline // Old line: if (crv.Degree >= 3) if (crv.Degree == 3) { NurbsCurve nc = crv as NurbsCurve; if (nc != null) { List<LyrebirdPoint> lbPoints = new List<LyrebirdPoint>(); List<double> weights = new List<double>(); List<double> knots = new List<double>(); foreach (ControlPoint cp in nc.Points) { LyrebirdPoint pt = new LyrebirdPoint(cp.Location.X, cp.Location.Y, cp.Location.Z); double weight = cp.Weight; lbPoints.Add(pt); weights.Add(weight); } for (int k = 0; k < nc.Knots.Count; k++) { double knot = nc.Knots[k]; // Add a duplicate knot for the first and last knot in the Rhino curve. // Revit needs 2 more knots than Rhino to define a spline. if (k == 0 || k == nc.Knots.Count - 1) { knots.Add(knot); } knots.Add(knot); } lbc = new LyrebirdCurve(lbPoints, weights, knots, nc.Degree, nc.IsPeriodic) { CurveType = "Spline" }; } } else { const double incr = 1.0 / 100; List<LyrebirdPoint> pts = new List<LyrebirdPoint>(); List<double> weights = new List<double>(); for (int i = 0; i <= 100; i++) { Point3d pt = crv.PointAtNormalizedLength(i * incr); LyrebirdPoint lbp = new LyrebirdPoint(pt.X, pt.Y, pt.Z); weights.Add(1.0); pts.Add(lbp); } lbc = new LyrebirdCurve(pts, "Spline") { Weights = weights, Degree = crv.Degree }; } } return lbc; }