public static Result ExtendCurve(RhinoDoc doc) { ObjRef[] boundary_obj_refs; var rc = RhinoGet.GetMultipleObjects("Select boundary objects", false, ObjectType.AnyObject, out boundary_obj_refs); if (rc != Result.Success) { return(rc); } if (boundary_obj_refs == null || boundary_obj_refs.Length == 0) { return(Result.Nothing); } var gc = new GetObject(); gc.SetCommandPrompt("Select curve to extend"); gc.GeometryFilter = ObjectType.Curve; gc.GeometryAttributeFilter = GeometryAttributeFilter.OpenCurve; gc.DisablePreSelect(); gc.Get(); if (gc.CommandResult() != Result.Success) { return(gc.CommandResult()); } var curve_obj_ref = gc.Object(0); var curve = curve_obj_ref.Curve(); if (curve == null) { return(Result.Failure); } double t; if (!curve.ClosestPoint(curve_obj_ref.SelectionPoint(), out t)) { return(Result.Failure); } var curve_end = t <= curve.Domain.Mid ? CurveEnd.Start : CurveEnd.End; var geometry = boundary_obj_refs.Select(obj => obj.Geometry()); var extended_curve = curve.Extend(curve_end, CurveExtensionStyle.Line, geometry); if (extended_curve != null && extended_curve.IsValid) { if (!doc.Objects.Replace(curve_obj_ref.ObjectId, extended_curve)) { return(Result.Failure); } doc.Views.Redraw(); } else { RhinoApp.WriteLine("No boundary object was intersected so curve not extended"); return(Result.Nothing); } return(Result.Success); }
protected override Result RunCommand(RhinoDoc doc, RunMode mode) { // select curves to loft var gs = new GetObject(); gs.SetCommandPrompt("select curves to loft"); gs.GeometryFilter = ObjectType.Curve; gs.DisablePreSelect(); gs.SubObjectSelect = false; gs.GetMultiple(2, 0); if (gs.CommandResult() != Result.Success) { return(gs.CommandResult()); } var curves = gs.Objects().Select(obj => obj.Curve()).ToList(); var breps = Brep.CreateFromLoft(curves, Point3d.Unset, Point3d.Unset, LoftType.Tight, false); foreach (var brep in breps) { doc.Objects.AddBrep(brep); } doc.Views.Redraw(); return(Result.Success); }
public Result AddApertureBySurface(RhinoDoc doc, IEnumerable <ObjRef> rooms) { //Select window geometry. using (var go2 = new GetObject()) { go2.SetCommandPrompt("Please select planer window surfaces"); go2.GeometryFilter = ObjectType.Surface; go2.GroupSelect = false; go2.DisablePreSelect(); go2.EnableSelPrevious(false); go2.SubObjectSelect = false; go2.GetMultiple(1, 0); if (go2.CommandResult() != Result.Success) { return(go2.CommandResult()); } if (go2.Objects().Count() == 0) { return(Result.Failure); } var SelectedObjs = go2.Objects(); //prepare BrepObjects var WinObjs = SelectedObjs.ToList(); //var room = rooms.First(); //var roomBrep = room.Brep(); //match window to room var matchedRoomDoors = rooms.AddDoors(WinObjs); foreach (var match in matchedRoomDoors) { var doors = match.doors; if (!doors.Any()) { continue; } foreach (var door in doors) { doc.Objects.Replace(door.id, door.brep); } //Replace the rhino object in order to be able to undo/redo doc.Objects.Replace(match.roomId, match.room); RhinoApp.WriteLine($"{doors.Count} windows have been successfully added to room {match.roomId}"); } return(Result.Success); } }
public static Result CurveSurfaceIntersect(RhinoDoc doc) { var gs = new GetObject(); gs.SetCommandPrompt("select brep"); gs.GeometryFilter = ObjectType.Brep; gs.DisablePreSelect(); gs.SubObjectSelect = false; gs.Get(); if (gs.CommandResult() != Result.Success) { return(gs.CommandResult()); } var brep = gs.Object(0).Brep(); var gc = new GetObject(); gc.SetCommandPrompt("select curve"); gc.GeometryFilter = ObjectType.Curve; gc.DisablePreSelect(); gc.SubObjectSelect = false; gc.Get(); if (gc.CommandResult() != Result.Success) { return(gc.CommandResult()); } var curve = gc.Object(0).Curve(); if (brep == null || curve == null) { return(Result.Failure); } var tolerance = doc.ModelAbsoluteTolerance; Point3d[] intersection_points; Curve[] overlap_curves; if (!Intersection.CurveBrep(curve, brep, tolerance, out overlap_curves, out intersection_points)) { RhinoApp.WriteLine("curve brep intersection failed"); return(Result.Nothing); } foreach (var overlap_curve in overlap_curves) { doc.Objects.AddCurve(overlap_curve); } foreach (var intersection_point in intersection_points) { doc.Objects.AddPoint(intersection_point); } RhinoApp.WriteLine("{0} overlap curves, and {1} intersection points", overlap_curves.Length, intersection_points.Length); doc.Views.Redraw(); return(Result.Success); }
protected override Result RunCommand(RhinoDoc doc, RunMode mode) { #region user input // select a surface var gs = new GetObject(); gs.SetCommandPrompt("select surface"); gs.GeometryFilter = ObjectType.Surface; gs.DisablePreSelect(); gs.SubObjectSelect = false; gs.Get(); if (gs.CommandResult() != Result.Success) { return(gs.CommandResult()); } // get the brep var brep = gs.Object(0).Brep(); if (brep == null) { return(Result.Failure); } // get X and Y double x = 0.0, y = 0.0; var rc = RhinoGet.GetNumber("value of X coordinate", true, ref x); if (rc != Result.Success) { return(rc); } rc = RhinoGet.GetNumber("value of Y coordinate", true, ref y); if (rc != Result.Success) { return(rc); } #endregion // an earlier version of this sample used a curve-brep intersection to find Z //var maxZ = maxZIntersectionMethod(brep, x, y, doc.ModelAbsoluteTolerance); // projecting points is another way to find Z var max_z = MaxZProjectionMethod(brep, x, y, doc.ModelAbsoluteTolerance); if (max_z != null) { RhinoApp.WriteLine("Maximum surface Z coordinate at X={0}, Y={1} is {2}", x, y, max_z); doc.Objects.AddPoint(new Point3d(x, y, max_z.Value)); doc.Views.Redraw(); } else { RhinoApp.WriteLine("no maximum surface Z coordinate at X={0}, Y={1} found.", x, y); } return(Result.Success); }
public static Result DetermineNormalDirectionOfBrepFace(RhinoDoc doc) { // select a surface var gs = new GetObject(); gs.SetCommandPrompt("select surface"); gs.GeometryFilter = ObjectType.Surface; gs.DisablePreSelect(); gs.SubObjectSelect = false; gs.Get(); if (gs.CommandResult() != Result.Success) { return(gs.CommandResult()); } // get the selected face var face = gs.Object(0).Face(); if (face == null) { return(Result.Failure); } // pick a point on the surface. Constain // picking to the face. var gp = new GetPoint(); gp.SetCommandPrompt("select point on surface"); gp.Constrain(face, false); gp.Get(); if (gp.CommandResult() != Result.Success) { return(gp.CommandResult()); } // get the parameters of the point on the // surface that is clesest to gp.Point() double u, v; if (face.ClosestPoint(gp.Point(), out u, out v)) { var direction = face.NormalAt(u, v); if (face.OrientationIsReversed) { direction.Reverse(); } RhinoApp.WriteLine( string.Format( "Surface normal at uv({0:f},{1:f}) = ({2:f},{3:f},{4:f})", u, v, direction.X, direction.Y, direction.Z)); } return(Result.Success); }
protected override Result RunCommand(RhinoDoc doc, RunMode mode) { var gs = new GetObject(); gs.SetCommandPrompt("select sphere"); gs.GeometryFilter = ObjectType.Surface; gs.DisablePreSelect(); gs.SubObjectSelect = false; gs.Get(); if (gs.CommandResult() != Result.Success) { return(gs.CommandResult()); } Sphere sphere; gs.Object(0).Surface().TryGetSphere(out sphere); if (sphere.IsValid) { var mesh = Mesh.CreateFromSphere(sphere, 10, 10); if (mesh == null) { return(Result.Failure); } var conduit = new DrawBlueMeshConduit(mesh) { Enabled = true }; doc.Views.Redraw(); var in_str = ""; Rhino.Input.RhinoGet.GetString("press <Enter> to continue", true, ref in_str); conduit.Enabled = false; doc.Views.Redraw(); return(Result.Success); } else { return(Result.Failure); } }
protected override Result RunCommand(RhinoDoc doc, RunMode mode) { var gs = new GetObject(); gs.SetCommandPrompt("select surface"); gs.GeometryFilter = ObjectType.Surface | ObjectType.PolysrfFilter; gs.DisablePreSelect(); gs.SubObjectSelect = false; gs.Get(); if (gs.CommandResult() != Result.Success) { return(gs.CommandResult()); } var brep = gs.Object(0).Brep(); if (brep == null) { return(Result.Failure); } var points = Intersection.ProjectPointsToBreps( new List <Brep> { brep }, // brep on which to project new List <Point3d> { new Point3d(0, 0, 0), new Point3d(3, 0, 3), new Point3d(-2, 0, -2) }, // some random points to project new Vector3d(0, 1, 0), // project on Y axis doc.ModelAbsoluteTolerance); if (points != null && points.Length > 0) { foreach (var point in points) { doc.Objects.AddPoint(point); } } doc.Views.Redraw(); return(Result.Success); }
private void Btn_GetPlot_Click(object sender, RoutedEventArgs e) { var gcc = new GetObject(); gcc.SetCommandPrompt("select closed curve"); gcc.GeometryFilter = Rhino.DocObjects.ObjectType.Curve; gcc.GeometryAttributeFilter = GeometryAttributeFilter.ClosedCurve; gcc.DisablePreSelect(); //gcc.SubObjectSelect = false; gcc.Get(); if (gcc.CommandResult() != Result.Success) { return; } if (null == gcc.Object(0).Curve()) { return; } Curve boundary = gcc.Object(0).Curve(); TuringAndCorbusierPlugIn.InstanceClass.plot = new TuringAndCorbusier.Plot(boundary); }
protected override Result RunCommand(RhinoDoc doc, RunMode mode) { var gc1 = new GetObject(); gc1.DisablePreSelect(); gc1.SetCommandPrompt("Select first curve to fillet (close to the end you want to fillet)"); gc1.GeometryFilter = ObjectType.Curve; gc1.GeometryAttributeFilter = GeometryAttributeFilter.OpenCurve; gc1.Get(); if (gc1.CommandResult() != Result.Success) { return(gc1.CommandResult()); } var curve1_obj_ref = gc1.Object(0); var curve1 = curve1_obj_ref.Curve(); if (curve1 == null) { return(Result.Failure); } var curve1_point_near_end = curve1_obj_ref.SelectionPoint(); if (curve1_point_near_end == Point3d.Unset) { return(Result.Failure); } var gc2 = new GetObject(); gc2.DisablePreSelect(); gc2.SetCommandPrompt("Select second curve to fillet (close to the end you want to fillet)"); gc2.GeometryFilter = ObjectType.Curve; gc2.GeometryAttributeFilter = GeometryAttributeFilter.OpenCurve; gc2.Get(); if (gc2.CommandResult() != Result.Success) { return(gc2.CommandResult()); } var curve2_obj_ref = gc2.Object(0); var curve2 = curve2_obj_ref.Curve(); if (curve2 == null) { return(Result.Failure); } var curve2_point_near_end = curve2_obj_ref.SelectionPoint(); if (curve2_point_near_end == Point3d.Unset) { return(Result.Failure); } double radius = 0; var rc = RhinoGet.GetNumber("fillet radius", false, ref radius); if (rc != Result.Success) { return(rc); } var join = false; var trim = true; var arc_extension = true; var fillet_curves = Curve.CreateFilletCurves(curve1, curve1_point_near_end, curve2, curve2_point_near_end, radius, join, trim, arc_extension, doc.ModelAbsoluteTolerance, doc.ModelAngleToleranceDegrees); if (fillet_curves == null /*|| fillet_curves.Length != 3*/) { return(Result.Failure); } foreach (var fillet_curve in fillet_curves) { doc.Objects.AddCurve(fillet_curve); } doc.Views.Redraw(); return(rc); }
protected override Result RunCommand(RhinoDoc doc, RunMode mode) { var rails = new Guid[2]; var go = new GetObject(); go.SetCommandPrompt("Select first rail"); go.GeometryFilter = ObjectType.Curve; go.GeometryAttributeFilter = GeometryAttributeFilter.ClosedCurve; go.DisablePreSelect(); go.SubObjectSelect = false; go.Get(); if (go.CommandResult() != Result.Success) { return(go.CommandResult()); } var obj = go.Object(0).Object(); if (null == obj) { return(Result.Failure); } rails[0] = obj.Id; go.SetCommandPrompt("Select second rail"); go.DeselectAllBeforePostSelect = false; go.Get(); if (go.CommandResult() != Result.Success) { return(go.CommandResult()); } obj = go.Object(0).Object(); if (null == obj) { return(Result.Failure); } rails[1] = obj.Id; var gc = new GetObject(); gc.SetCommandPrompt("Select cross section curves"); gc.GeometryFilter = ObjectType.Curve; gc.GeometryAttributeFilter = GeometryAttributeFilter.OpenCurve; gc.DisablePreSelect(); gc.DeselectAllBeforePostSelect = false; gc.SubObjectSelect = false; gc.GetMultiple(1, 0); if (gc.CommandResult() != Result.Success) { return(gc.CommandResult()); } var curves = new Guid[gc.ObjectCount]; for (var i = 0; i < gc.ObjectCount; i++) { obj = gc.Object(i).Object(); if (null == obj) { return(Result.Failure); } curves[i] = obj.Id; } var object_ids = ScriptedSweep2(doc, rails[0], rails[1], curves); doc.Views.Redraw(); return(Result.Success); }
public IList <PFVertex> PickVertex() { var innerVerts = Vertices.Where(x => !x.External); var pickedVerts = new List <PFVertex>(); var doc = Rhino.RhinoDoc.ActiveDoc; var vertexConduit = new DrawPFVertexConduit(innerVerts) { Enabled = true }; doc.Views.Redraw(); var gVert = new GetPFVertex(innerVerts); //var permOption = new OptionToggle(false, "temp", "perm"); gVert.AddSnapPoints(innerVerts.Select(x => x.Point).ToArray()); while (true) { gVert.SetCommandPrompt("select Vertex points. (<ESC> to exit"); //gVert.AddOptionToggle("Remember", ref permOption); gVert.AcceptNothing(true); gVert.AcceptString(true); //gVert.SetCursor() // this we can change after switching to Rhino 6 - api gVert.SetDefaultString($"({pickedVerts.Count}) vertices selected press <Enter> to accept"); gVert.Get(true); doc.Views.Redraw(); var result = gVert.CommandResult(); var strResult = gVert.StringResult(); pickedVerts = new List <PFVertex>(); if (gVert.CommandResult() == Rhino.Commands.Result.Cancel) { break; } foreach (var vrt in innerVerts) { if (vrt.Picked) { pickedVerts.Add(vrt); } } if (gVert.GotDefault()) { // here use a pick mechanism to get the geometry if (pickedVerts.Count > 0) { var outside = new OptionToggle(true, "true", "false"); var fixPoint = new OptionToggle(false, "constrain", "fix"); var getRefGeo = new GetObject(); getRefGeo.SetCommandPrompt("Pick the constrain object for the selected vertices"); getRefGeo.AddOptionToggle("Outside", ref outside); getRefGeo.AddOptionToggle("Fixed", ref fixPoint); getRefGeo.AcceptNothing(true); getRefGeo.DisablePreSelect(); if (getRefGeo.Get() == Rhino.Input.GetResult.Object) { var geoGet = getRefGeo.Object(0); var idGet = getRefGeo.Object(0).ObjectId; SetVertexConstraints(pickedVerts, geoGet.Object(), 1, outside.CurrentValue); } else if (getRefGeo.Result() == Rhino.Input.GetResult.Nothing) { foreach (var vert in pickedVerts) { vert.RestrictPosition = null; vert.RestrictSupport = null; vert.SupportGuid = Guid.Empty; } } else if (getRefGeo.Result() == Rhino.Input.GetResult.Option && fixPoint.CurrentValue == true) { foreach (var vert in pickedVerts) { vert.RestrictPosition = vert.ConstrainPoint; vert.RestrictSupport = new Rhino.Geometry.Point(vert.Point); // this is what keeps the vertex in place vert.InfluenceCoef = 100; // this is what makes it relatively immovable vert.SupportGuid = Guid.Empty; vert.Fixed = true; // this is just for serilization refference } } doc.Objects.UnselectAll(); pickedVerts.ForEach(x => x.Picked = false); doc.Views.Redraw(); } else { break; } } } vertexConduit.Enabled = false; doc.Views.Redraw(); return(pickedVerts); }
public static Result CustomGeometryFilter(RhinoDoc doc) { m_tolerance = doc.ModelAbsoluteTolerance; // only use a custom geometry filter if no simpler filter does the job // only curves var gc = new GetObject(); gc.SetCommandPrompt("select curve"); gc.GeometryFilter = ObjectType.Curve; gc.DisablePreSelect(); gc.SubObjectSelect = false; gc.Get(); if (gc.CommandResult() != Result.Success) { return(gc.CommandResult()); } if (null == gc.Object(0).Curve()) { return(Result.Failure); } Rhino.RhinoApp.WriteLine("curve was selected"); // only closed curves var gcc = new GetObject(); gcc.SetCommandPrompt("select closed curve"); gcc.GeometryFilter = ObjectType.Curve; gcc.GeometryAttributeFilter = GeometryAttributeFilter.ClosedCurve; gcc.DisablePreSelect(); gcc.SubObjectSelect = false; gcc.Get(); if (gcc.CommandResult() != Result.Success) { return(gcc.CommandResult()); } if (null == gcc.Object(0).Curve()) { return(Result.Failure); } Rhino.RhinoApp.WriteLine("closed curve was selected"); // only circles with a radius of 10 var gcc10 = new GetObject(); gcc10.SetCommandPrompt("select circle with radius of 10"); gc.GeometryFilter = ObjectType.Curve; gcc10.SetCustomGeometryFilter(CircleWithRadiusOf10GeometryFilter); // custom geometry filter gcc10.DisablePreSelect(); gcc10.SubObjectSelect = false; gcc10.Get(); if (gcc10.CommandResult() != Result.Success) { return(gcc10.CommandResult()); } if (null == gcc10.Object(0).Curve()) { return(Result.Failure); } RhinoApp.WriteLine("circle with radius of 10 was selected"); return(Result.Success); }