private void SetCurveType(Rg.Curve curve) { Rg.Circle R = new Rg.Circle(); Rg.Arc A = new Rg.Arc(); Rg.Ellipse S = new Rg.Ellipse(); Rg.Polyline P = new Rg.Polyline(); if (curve.TryGetCircle(out R)) { curveType = CurveTypes.Circle; } else if (curve.TryGetArc(out A)) { curveType = CurveTypes.Arc; } else if (curve.TryGetEllipse(out S)) { curveType = CurveTypes.Ellipse; } else if (curve.IsLinear()) { curveType = CurveTypes.Line; } else if (curve.TryGetPolyline(out P)) { curveType = CurveTypes.Polyline; } else { curveType = CurveTypes.Spline; } }
/***************************************************/ 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 void computeContourCurve() { if (targetPRhObjID == Guid.Empty) { return; } ObjRef targetpObjRef = new ObjRef(targetPRhObjID); snapPointsList = new List <Point3d>(); Double tolerance = 0; if (drawnType != DrawnType.In3D) { Brep targetBrep = (Brep)(targetpObjRef.Object().Geometry); //TODO- topLeftP won't be on the face in the 3D case. so probably use orgin float minD = 1000000f; int minIndex = -1; for (int i = 0; i < targetBrep.Faces.Count; i++) { //cast BrepFace to Brep for ClosestPoint(P) menthod double dist = targetBrep.Faces[i].DuplicateFace(false).ClosestPoint(projectP).DistanceTo(projectP); if (dist < minD) { minD = (float)dist; minIndex = i; } } Surface s = targetBrep.Faces[minIndex]; //surface might not be a perfect planar surface while (tolerance < toleranceMax) { if (s.TryGetPlane(out curvePlane, tolerance)) { break; } tolerance++; } if (tolerance >= toleranceMax) { double u, v; if (s.ClosestPoint(projectP, out u, out v)) { Rhino.Geometry.Vector3d normal = s.NormalAt(u, v); //TODO fix the issue when normal is inward curvePlane = new Plane(projectP, normal); } } else { //testing finding the edge curve Rhino.Geometry.Curve[] edgeCurves = (targetBrep.Faces[minIndex].DuplicateFace(false)).DuplicateEdgeCurves(true); double tol = mScene.rhinoDoc.ModelAbsoluteTolerance * 2.1; edgeCurves = Rhino.Geometry.Curve.JoinCurves(edgeCurves, tol); // TODO: Check if null contourCurve = edgeCurves[0]; //detect whether it's rect or circle then generate a snap pointList Circle circle; Rhino.Geometry.Polyline polyline; if (contourCurve.TryGetCircle(out circle)) { snapPointsList.Add(circle.Center); snapPointsList.Add(circle.PointAt(0)); snapPointsList.Add(circle.PointAt(Math.PI / 2)); snapPointsList.Add(circle.PointAt(Math.PI)); snapPointsList.Add(circle.PointAt(Math.PI * 1.5)); } else if (contourCurve.TryGetPolyline(out polyline)) { Rectangle3d rect = Rectangle3d.CreateFromPolyline(polyline); snapPointsList.Add(rect.Center); snapPointsList.Add(rect.Corner(0)); snapPointsList.Add(rect.Corner(1)); snapPointsList.Add(rect.Corner(2)); snapPointsList.Add(rect.Corner(3)); } else { double u = 0; double v = 0; s.ClosestPoint(s.GetBoundingBox(true).Center, out u, out v); snapPointsList.Add(s.PointAt(u, v)); } } } }