/// <summary> /// if plane is Unset, the default plane is new Plane(origin, Line.Direction); /// </summary> /// <param name="line"></param> /// <param name="id"></param> /// <param name="plane_"></param> /// <param name="radius"></param> /// <param name="cutter0"></param> /// <param name="cutter1"></param> /// <param name="sides"></param> /// <param name="radius1"></param> /// <param name="createBrepLoft"></param> /// <returns></returns> public static Pipe CreatePipe(this Line line, int id, Plane plane_, double radius, Plane cutter0, Plane cutter1, int sides = 4, double radius1 = -1, bool createBrepLoft = false) { //Rhino.RhinoApp.WriteLine(radius.ToString()); Plane plane = (plane_ != Plane.Unset) ? plane_ : new Plane(line.From, line.Direction); double r = Math.Max(0.01, radius); int s = Math.Max(3, sides); double r1 = (radius1 == -1) ? r : Math.Max(radius, radius1); Plane p0 = new Plane(line.From, plane.XAxis, plane.YAxis); Plane p1 = new Plane(line.To, plane.XAxis, plane.YAxis); Polyline poly0 = NGonsCore.PolylineUtil.Polygon(s, r, p0, Math.PI * 0.25, false); Polyline poly1 = NGonsCore.PolylineUtil.Polygon(s, r1, p1, Math.PI * 0.25, false); Circle c0 = new Circle(p0, r); Circle c1 = new Circle(p1, r1); Pipe pipe = new Pipe(id, line, plane, radius, cutter0, cutter1, poly0, poly1, c0, c1); //Cut with planes if they are given if (cutter0 != Plane.Unset && cutter0 != Plane.Unset) { Polyline result0 = new Polyline(); Polyline result1 = new Polyline(); //Line[] lines = new Line[poly0.Count - 1]; for (int i = 0; i < poly0.Count - 1; i++) { Line l = new Line(poly0[i], poly1[i]); Point3d cutP0 = NGonsCore.PlaneUtil.LinePlane(l, cutter0); Point3d cutP1 = NGonsCore.PlaneUtil.LinePlane(l, cutter1); result0.Add(cutP0); result1.Add(cutP1); } result0.Close(); result1.Close(); pipe.meshloft = result0.LoftMeshFast(result1, false); pipe.breploft = Brep.CreatePipe(line.ToNurbsCurve(), new double[] { 0, 1 }, new double[] { r, r1 }, false, PipeCapMode.Flat, true, 0.01, 0.01)[0]; //line.Bake(); return(pipe); } else { // Rhino.RhinoApp.WriteLine(r.ToString() + " " + r1.ToString()); pipe.meshloft = poly0.LoftMeshFast(poly1, false); pipe.breploft = Brep.CreatePipe(line.ToNurbsCurve(), new double[] { 0, 1 }, new double[] { r, r1 }, false, PipeCapMode.Flat, true, 0.01, 0.01)[0]; } return(pipe); //if (createBrepLoft) pipe.breploft = Surface.CreateExtrusion(c0.ToNurbsCurve(), line.Direction).ToBrep(); }
public void Update(Point3d p1, Point3d p2, int i, int j, int k) { LineCurve line = new LineCurve(p1, p2); if (Result == 1) { connections.Add(line, new GH_Path(i, j, k)); } else { Brep tube = Brep.CreatePipe(line, tubeR, false, PipeCapMode.None, false, 0.01, 0.1)[0]; connections.Add(tube, new GH_Path(i, j, k)); } }
private Brep createMainReinforcement() { List <Point3d> points = new List <Point3d>(); points.Add(new Point3d(convertToDouble(textBox_cc.Text) + 10, 250, 0)); points.Add(new Point3d(convertToDouble(textBox_cc.Text) + 10, 250 + convertToDouble(textBox_hc.Text), 0)); points.Add(new Point3d(400.0 + convertToDouble(textBox_ac.Text) + convertToDouble(textBox_a5.Text) / 2 - convertToDouble(textBox_cc.Text), 250 + convertToDouble(textBox_hc.Text), 0)); points.Add(new Point3d(400.0 + convertToDouble(textBox_ac.Text) + convertToDouble(textBox_a5.Text) / 2 - convertToDouble(textBox_cc.Text), 250 + convertToDouble(textBox_cc.Text), 0)); points.Add(new Point3d(convertToDouble(textBox_cc.Text) + 10, 250 + convertToDouble(textBox_cc.Text), -convertToDouble((string)comboBoxDiam.SelectedItem))); double radius = getBendingRadius(); List <Curve> curves = new List <Curve>(); for (int i = 0; i < points.Count - 1; i++) { curves.Add(new Line(points[i], points[i + 1]).ToNurbsCurve()); } Curve joinedCurve = new Line().ToNurbsCurve(); for (int i = 0; i < curves.Count - 1; i++) { if (i == 0) { joinedCurve = Curve.CreateFilletCurves(curves[i], curves[i].PointAtNormalizedLength(0.9), curves[i + 1], curves[i + 1].PointAtNormalizedLength(0.1), radius, true, true, false, RhinoDoc.ActiveDoc.PageAbsoluteTolerance, RhinoDoc.ActiveDoc.PageAngleToleranceRadians)[0]; } else { joinedCurve = Curve.CreateFilletCurves(joinedCurve, joinedCurve.PointAtNormalizedLength(0.9), curves[i + 1], curves[i + 1].PointAtNormalizedLength(0.1), radius, true, true, false, RhinoDoc.ActiveDoc.PageAbsoluteTolerance, RhinoDoc.ActiveDoc.PageAngleToleranceRadians)[0]; } } return(Brep.CreatePipe(joinedCurve, convertToDouble((string)comboBoxDiam.SelectedItem) / 2, false, PipeCapMode.Flat, false, RhinoDoc.ActiveDoc.PageAbsoluteTolerance, RhinoDoc.ActiveDoc.PageAngleToleranceRadians)[0]); }
/// <summary> /// Rhino calls the virtual ReplayHistory functions to to remake an objects when inputs have changed. /// </summary> protected override bool ReplayHistory(Rhino.DocObjects.ReplayHistoryData replay) { Rhino.DocObjects.ObjRef objref2 = null; List <Curve> curves2 = new List <Curve>(); Brep[] pipe2; PipeCapMode[] pCapM = { PipeCapMode.None, PipeCapMode.Flat, PipeCapMode.Round }; double radius1 = 0.0; double radius2 = 0.0; double[] radiParam = { 0.0, 0.5, 1.0 }; double[] radi = { radius1, radius2, radius1 }; if (!ReadHistory(replay, ref ids, ref radius1, ref radius2, ref capIndex)) { return(false); } foreach (Guid i in ids) { objref2 = new ObjRef(i); Rhino.Geometry.Curve curve = objref2.Curve(); curves2.Add(curve); } foreach (Curve x in curves2) { pipe2 = Brep.CreatePipe(x, radiParam, radi, true, pCapM[capIndex], true, 0.01, 0.01); replay.Results[0].UpdateToBrep(pipe2[0], null); } return(true); }
/// <summary> /// 計算部分 /// </summary> /// <param name="DA">インプットパラメータからデータを取得し、出力用のデータを保持するオブジェクト</param> protected override void SolveInstance(IGH_DataAccess DA) { int nFL = 0; double FH = 0, Angle = 0, R = 0; IGH_GeometricGoo FL = null; Brep Floor = null; // 入力設定============================ if (!DA.GetData(0, ref nFL)) { return; } if (!DA.GetData(1, ref FH)) { return; } if (!DA.GetData(2, ref Angle)) { return; } if (!DA.GetData(3, ref R)) { return; } if (!DA.GetData(4, ref FL)) { return; } if (!DA.GetData(4, ref Floor)) { return; } // 床の作成 List <IGH_GeometricGoo> list = new List <IGH_GeometricGoo>(nFL); Vector3d DirectionVector = new Vector3d(0, 0, FH); Point3d Center = new Point3d(0, 0, 0); for (int i = 0; i < nFL; i++) { ITransform transform = new Translation(DirectionVector * (double)i); ITransform transform2 = new Rotation(Center, DirectionVector, Angle * (double)i); if (FL != null) { IGH_GeometricGoo FL2 = FL.DuplicateGeometry(); FL2 = FL2.Transform(transform.ToMatrix()); FL2 = FL2.Transform(transform2.ToMatrix()); list.Add(FL2); } else { list.Add(null); } } // 柱の作成 List <Brep> collist = new List <Brep>(nFL); Point3d[] CornerPoints = Floor.DuplicateVertices(); // 内柱 Point3d Point1in = new Point3d(CornerPoints[0].X / 2.0, CornerPoints[0].Y / 2.0, CornerPoints[0].Z / 2.0); Point3d Point2in = new Point3d(CornerPoints[1].X / 2.0, CornerPoints[1].Y / 2.0, CornerPoints[1].Z / 2.0); Point3d Point3in = new Point3d(CornerPoints[2].X / 2.0, CornerPoints[2].Y / 2.0, CornerPoints[2].Z / 2.0); Point3d Point4in = new Point3d(CornerPoints[3].X / 2.0, CornerPoints[3].Y / 2.0, CornerPoints[3].Z / 2.0); // 外柱 Point3d Point1outS = new Point3d(CornerPoints[0].X, CornerPoints[0].Y, CornerPoints[0].Z); Point3d Point2outS = new Point3d(CornerPoints[1].X, CornerPoints[1].Y, CornerPoints[1].Z); Point3d Point3outS = new Point3d(CornerPoints[2].X, CornerPoints[2].Y, CornerPoints[2].Z); Point3d Point4outS = new Point3d(CornerPoints[3].X, CornerPoints[3].Y, CornerPoints[3].Z); Point3d Point1outE = Point1outS; Point3d Point2outE = Point2outS; Point3d Point3outE = Point3outS; Point3d Point4outE = Point4outS; double num1 = GH_Component.DocumentTolerance(); double num2 = GH_Component.DocumentAngleTolerance(); for (int i = 0; i < nFL - 1; i++) { if (FL != null) { if (i != 0) { // 内柱 Point1in = new Point3d(Point1in.X, Point1in.Y, Point1in.Z + FH); Point2in = new Point3d(Point2in.X, Point2in.Y, Point2in.Z + FH); Point3in = new Point3d(Point3in.X, Point3in.Y, Point3in.Z + FH); Point4in = new Point3d(Point4in.X, Point4in.Y, Point4in.Z + FH); // 外柱 Point1outS = new Point3d(Point1outE.X, Point1outE.Y, Point1outE.Z); Point2outS = new Point3d(Point2outE.X, Point2outE.Y, Point2outE.Z); Point3outS = new Point3d(Point3outE.X, Point3outE.Y, Point3outE.Z); Point4outS = new Point3d(Point4outE.X, Point4outE.Y, Point4outE.Z); } // 外柱 終点 Point1outE = new Point3d( Point1outS.X * Math.Cos(Angle) - Point1outS.Y * Math.Sin(Angle), Point1outS.X * Math.Sin(Angle) + Point1outS.Y * Math.Cos(Angle), Point1outS.Z + FH); Point2outE = new Point3d( Point2outS.X * Math.Cos(Angle) - Point2outS.Y * Math.Sin(Angle), Point2outS.X * Math.Sin(Angle) + Point2outS.Y * Math.Cos(Angle), Point2outS.Z + FH); Point3outE = new Point3d( Point3outS.X * Math.Cos(Angle) - Point3outS.Y * Math.Sin(Angle), Point3outS.X * Math.Sin(Angle) + Point3outS.Y * Math.Cos(Angle), Point3outS.Z + FH); Point4outE = new Point3d( Point4outS.X * Math.Cos(Angle) - Point4outS.Y * Math.Sin(Angle), Point4outS.X * Math.Sin(Angle) + Point4outS.Y * Math.Cos(Angle), Point4outS.Z + FH); LineCurve LineCurve1in = new LineCurve(new Line(Point1in, DirectionVector)); LineCurve LineCurve2in = new LineCurve(new Line(Point2in, DirectionVector)); LineCurve LineCurve3in = new LineCurve(new Line(Point3in, DirectionVector)); LineCurve LineCurve4in = new LineCurve(new Line(Point4in, DirectionVector)); // LineCurve LineCurve1out = new LineCurve(new Line(Point1outS, Point1outE)); LineCurve LineCurve2out = new LineCurve(new Line(Point2outS, Point2outE)); LineCurve LineCurve3out = new LineCurve(new Line(Point3outS, Point3outE)); LineCurve LineCurve4out = new LineCurve(new Line(Point4outS, Point4outE)); Brep[] col1in = Brep.CreatePipe(LineCurve1in, R, true, 0, false, num1, num2); Brep[] col2in = Brep.CreatePipe(LineCurve2in, R, true, 0, false, num1, num2); Brep[] col3in = Brep.CreatePipe(LineCurve3in, R, true, 0, false, num1, num2); Brep[] col4in = Brep.CreatePipe(LineCurve4in, R, true, 0, false, num1, num2); // Brep[] col1out = Brep.CreatePipe(LineCurve1out, R, true, 0, false, num1, num2); Brep[] col2out = Brep.CreatePipe(LineCurve2out, R, true, 0, false, num1, num2); Brep[] col3out = Brep.CreatePipe(LineCurve3out, R, true, 0, false, num1, num2); Brep[] col4out = Brep.CreatePipe(LineCurve4out, R, true, 0, false, num1, num2); collist.AddRange(col1in); collist.AddRange(col2in); collist.AddRange(col3in); collist.AddRange(col4in); collist.AddRange(col1out); collist.AddRange(col2out); collist.AddRange(col3out); collist.AddRange(col4out); } } // 出力設定============================ DA.SetDataList(0, list); DA.SetDataList(1, collist); }
protected override Result RunCommand(RhinoDoc doc, RunMode mode) { double tolerance = doc.ModelAbsoluteTolerance; double angleTolerance = doc.ModelAngleToleranceRadians; List <Curve> icur = new List <Curve>(); GetObject gcr = new Rhino.Input.Custom.GetObject(); gcr.SetCommandPrompt("Select reference circles for prongs. (No curves)"); gcr.GeometryFilter = Rhino.DocObjects.ObjectType.Curve; gcr.GroupSelect = true; gcr.SubObjectSelect = true; gcr.DeselectAllBeforePostSelect = true; gcr.OneByOnePostSelect = false; gcr.GetMultiple(1, 0); for (int ie = 0; ie < gcr.ObjectCount; ie++) { Rhino.DocObjects.ObjRef objref = gcr.Object(ie); Rhino.DocObjects.RhinoObject obj = objref.Object(); if (obj == null) { return(Result.Failure); } Curve refcr = objref.Curve(); if (refcr == null) { return(Result.Failure); } obj.Select(false); icur.Add(refcr); } while (true) { m_escape_key_pressed = false; RhinoApp.EscapeKeyPressed += RhinoApp_EscapeKeyPressed; Point3d pt0 = new Point3d(0, 0, hight); Point3d pt1 = new Point3d(0, 0, -(length - hight)); double rotationRadiant = ((rotation / 180) * 3.1415); List <Point3d> curvePoints = new List <Point3d>() { pt0, pt1 }; Curve prongCurve = Curve.CreateInterpolatedCurve(curvePoints, 3); if (!capBool) { capMode = PipeCapMode.Flat; } else if (capBool) { capMode = PipeCapMode.Round; } Brep[] cylBrep1 = Brep.CreatePipe(prongCurve, prongDia / 2, false, capMode, false, tolerance, angleTolerance); Brep cylBrep2 = cylBrep1[0]; cylBrep2.Faces.RemoveAt(2); Brep cylBrep3 = cylBrep2.CapPlanarHoles(tolerance); if (capBool) { Vector3d scaleVec = new Vector3d(0, 0, 1); var scalePlane = new Plane(pt0, scaleVec); var capScale = Transform.Scale(scalePlane, 1.0, 1.0, capHight); var surf2 = cylBrep3.Faces[1].UnderlyingSurface(); NurbsSurface nurbSurf2 = surf2.ToNurbsSurface(); nurbSurf2.Transform(capScale); Brep capBrep = nurbSurf2.ToBrep(); cylBrep3.Append(capBrep); cylBrep3.Faces.RemoveAt(1); } cylBrep3.Compact(); cylBrep3.JoinNakedEdges(tolerance); string instDefCount = DateTime.Now.ToString("ddMMyyyyHHmmss"); Brep[] brepArray = new Brep[1] { cylBrep3 }; var prongIndex = doc.InstanceDefinitions.Add("Prong" + instDefCount, "RefProng", Point3d.Origin, brepArray); foreach (Curve c in icur) { Circle circleProngs = new Circle(); c.TryGetCircle(out circleProngs, tolerance); NurbsCurve curveProngs = circleProngs.ToNurbsCurve(); Plane planeNew = circleProngs.Plane; Vector3d plVec = planeNew.Normal; if (planeNew == null) { curveProngs.DivideByCount(3, true, out Point3d[] curveProngsPoints); planeNew = new Plane(curvePoints[0], curveProngsPoints[1], curveProngsPoints[2]); } Curve[] offsetCurveArray = curveProngs.Offset(planeNew, prongDia / 4, tolerance, CurveOffsetCornerStyle.Sharp); Curve offsetCurve = offsetCurveArray[0]; double[] segParameters = offsetCurve.DivideByCount(prongCount, true); List <Point3d> prongPoints = new List <Point3d>(); List <Guid> idsInter = new List <Guid>(); foreach (double p in segParameters) { Point3d zen = new Point3d(0, 0, 0); Point3d prongPoint = offsetCurve.PointAt(p); Point3d center = circleProngs.Center; Vector3d moveV = new Vector3d(prongPoint); Vector3d zaxis = new Vector3d(0.0, 0.0, 1.0); Plane planeOr = new Plane(zen, zaxis); Plane plane = new Plane(prongPoint, plVec); var transform1 = Transform.PlaneToPlane(planeOr, plane); var transform2 = Transform.Rotation(rotationRadiant, plVec, center); var prongA = doc.Objects.AddInstanceObject(prongIndex, transform1); var prongB = doc.Objects.Transform(prongA, transform2, true); ids.Add(prongB); } doc.Views.Redraw(); } GetOption go = new Rhino.Input.Custom.GetOption(); go.SetCommandPrompt("Set prong parameters."); go.AcceptNothing(true); var countProng = new Rhino.Input.Custom.OptionInteger(prongCount); var diaProng = new Rhino.Input.Custom.OptionDouble(prongDia); var hightProng = new Rhino.Input.Custom.OptionDouble(hight); var lengthProng = new Rhino.Input.Custom.OptionDouble(length); var rotProng = new Rhino.Input.Custom.OptionDouble(rotation); var capProng = new Rhino.Input.Custom.OptionToggle(capBool, "Flat", "Round"); var hightCap = new Rhino.Input.Custom.OptionDouble(capHight); go.AddOptionInteger("Count", ref countProng); go.AddOptionDouble("Diameter", ref diaProng); go.AddOptionDouble("Hight", ref hightProng); go.AddOptionDouble("Length", ref lengthProng); go.AddOptionDouble("Rotation", ref rotProng); go.AddOptionToggle("Cap", ref capProng); if (capBool) { go.AddOptionDouble("Caphight", ref hightCap); } GetResult res = go.Get(); if (m_escape_key_pressed) { break; } hight = hightProng.CurrentValue; length = lengthProng.CurrentValue; prongCount = countProng.CurrentValue; prongDia = diaProng.CurrentValue; rotation = rotProng.CurrentValue; capBool = capProng.CurrentValue; capHight = hightCap.CurrentValue; if (length <= 0.0) { length = 1.0; } if (prongCount <= 0) { prongCount = 1; } if (prongDia <= 0.0) { prongDia = 1.0; } if (res == GetResult.Nothing) { break; } doc.Objects.Delete(ids, true); } RhinoApp.EscapeKeyPressed -= RhinoApp_EscapeKeyPressed; doc.Groups.Add(ids); return(Result.Success); }
/// <summary> /// This is the method that actually does the work. /// </summary> /// <param name="DA">The DA object is used to retrieve from inputs and store in outputs.</param> protected override void SolveInstance(IGH_DataAccess DA) { Surface iSurface = null; double iV = 0.0; double iU = 0.0; double iX = 0.0; //Rhino.Geometry.Curve curve = Rhino.Geometry.Curve.Unset; if (!DA.GetData(0, ref iSurface)) { return; } if (!DA.GetData(1, ref iV)) { return; } if (!DA.GetData(2, ref iU)) { return; } if (!DA.GetData(3, ref iX)) { return; } //Convert surface to brep Brep bp = iSurface.ToBrep(); //List of curves List <Curve> crvs = new List <Curve>(); List <Curve> crvsV = new List <Curve>(); //iso curve length double len = iSurface.IsoCurve(0, 0.0).GetLength(); double baseD = iSurface.IsoCurve(0, 0.0).PointAt(0).Z; //the loop for (double i = 0; i < 1; i += 1 / iV) { //Make the plane Point3d pt = new Point3d(0, 0, baseD + i * len); Vector3d vZ = new Vector3d(0, 0, 1); Plane pln = new Plane(pt, vZ); //Declare the lists Curve[] crvs01; Point3d[] pts; //Intersect geometry bool didItCut = Rhino.Geometry.Intersect.Intersection.BrepPlane(bp, pln, 2.0, out crvs01, out pts); if (didItCut) { foreach (Curve crvE in crvs01) { crvs.Add(crvE); } } } //vertical ones Curve bs = iSurface.IsoCurve(1, 0.5); for (double i = 0; i < 1; i += 1 / iU) { crvsV.Add(iSurface.IsoCurve(0, i * bs.GetLength())); } //pipe from lists List <Brep> breps = new List <Brep>(); foreach (Curve crvT in crvs) { breps.Add(Brep.CreatePipe(crvT, iX, true, 0, true, 2.00, 0.01)[0]); } foreach (Curve crvT in crvsV) { breps.Add(Brep.CreatePipe(crvT, iX, true, 0, true, 2.00, 0.01)[0]); } DA.SetDataList(0, crvs); DA.SetDataList(1, crvsV); DA.SetDataList(2, breps); }
protected override Result RunCommand(RhinoDoc doc, RunMode mode) { Rhino.ApplicationSettings.HistorySettings.RecordingEnabled = true; double tolerance = doc.ModelAbsoluteTolerance; GetObject gc = new GetObject(); gc.SetCommandPrompt("Select curve(s) for multipipe"); gc.GeometryFilter = Rhino.DocObjects.ObjectType.Curve; gc.GroupSelect = true; gc.GetMultiple(1, 0); if (gc.CommandResult() != Rhino.Commands.Result.Success) { return(gc.CommandResult()); } List <Curve> curves = new List <Curve>(); for (int i = 0; i < gc.ObjectCount; i++) { Rhino.DocObjects.ObjRef objref = gc.Object(i); Rhino.Geometry.Curve curve = objref.Curve(); curves.Add(curve); ids.Add(objref.ObjectId); } Rhino.Input.Custom.GetNumber gn = new Rhino.Input.Custom.GetNumber(); gn.SetCommandPrompt("Start and end radius"); int opList = gn.AddOptionList("Cap", caps, capIndex); gn.SetDefaultNumber(radius1); while (true) { Rhino.Input.GetResult get_rc = gn.Get(); if (gn.CommandResult() != Rhino.Commands.Result.Success) { return(gn.CommandResult()); } if (get_rc == Rhino.Input.GetResult.Number) { radius1 = gn.Number(); if (radius1 < 0 || radius1 < 0.0) { Dialogs.ShowMessage("Value must be >= 0.0", "Warning!"); continue; } } else if (get_rc == Rhino.Input.GetResult.Option) { if (gn.OptionIndex() == opList) { capIndex = gn.Option().CurrentListOptionIndex; } continue; } break; } while (true) { RhinoGet.GetNumber("Middle radius", false, ref radius2); if (radius2 <= 0 || radius2 <= 0.0) { Dialogs.ShowMessage("Value must be > 0.0", "Warning!"); continue; } break; } Brep[] pipe; double[] radiParam = { 0.0, 0.5, 1.0 }; double[] radi = { radius1, radius2, radius1 }; PipeCapMode[] pCapM = { PipeCapMode.None, PipeCapMode.Flat, PipeCapMode.Round }; // Create a history record Rhino.DocObjects.HistoryRecord history = new Rhino.DocObjects.HistoryRecord(this, HISTORY_VERSION); WriteHistory(history, ids, radius1, radius2, capIndex); foreach (Curve x in curves) { pipe = Brep.CreatePipe(x, radiParam, radi, true, pCapM[capIndex], true, doc.ModelAbsoluteTolerance, doc.ModelAngleToleranceRadians); doc.Objects.AddBrep(pipe[0], null, history, false); doc.Views.Redraw(); } doc.Views.Redraw(); return(Result.Success); }