public void CreateCut(int segmentID, Plane jointPlane0, Plane jointPlane1, double length, ref Panel jointPanel) //, ref Panel neiPanel,) { { double e = 0; Polyline cut = new Polyline(); Line segment0 = contourNoJoints[0].SegmentAt(segmentID); Line segment1 = contourNoJoints[1].SegmentAt(segmentID); //Intersect plate edge line and joint plane offsets Point3d edgePoint00 = PlaneUtil.LinePlane(segment0, jointPlane0); Point3d edgePoint01 = PlaneUtil.LinePlane(segment0, jointPlane1); Point3d edgePoint10 = PlaneUtil.LinePlane(segment1, jointPlane0); Point3d edgePoint11 = PlaneUtil.LinePlane(segment1, jointPlane1); //Get direction of a cut Vector3d v00 = PlaneUtil.PlanePlaneVec(planeOffset0, jointPlane0); Vector3d v01 = PlaneUtil.PlanePlaneVec(planeOffset0, jointPlane1); Vector3d v10 = PlaneUtil.PlanePlaneVec(planeOffset1, jointPlane0); Vector3d v11 = PlaneUtil.PlanePlaneVec(planeOffset1, jointPlane1); bool moveFlag = (segment0.PointAt(0.5) + v00).DistanceTo(planeOffset0.Origin) < (segment0.PointAt(0.5) - v00).DistanceTo(planeOffset0.Origin); //Moved Points Point3d innerPoint00 = (moveFlag) ? edgePoint00 + (v00 * length) : edgePoint00 - (v00 * length); Point3d innerPoint01 = (moveFlag) ? edgePoint01 + (v01 * length) : edgePoint01 - (v01 * length); Point3d innerPoint10 = (moveFlag) ? edgePoint10 + (v10 * length) : edgePoint10 - (v10 * length); Point3d innerPoint11 = (moveFlag) ? edgePoint11 + (v11 * length) : edgePoint11 - (v11 * length); Point3d innerPointCenter = (innerPoint00 + innerPoint01 + innerPoint10 + innerPoint11) * 0.25; Plane perpPlane = new Plane(innerPointCenter, jointPlane0.Normal, Vector3d.CrossProduct(planeOffset0.Normal, v00)); innerPoint00 = perpPlane.RayPlane(edgePoint00, v00); innerPoint01 = perpPlane.RayPlane(edgePoint01, v01); innerPoint10 = perpPlane.RayPlane(edgePoint10, v10); innerPoint11 = perpPlane.RayPlane(edgePoint11, v11); //Rhino.RhinoDoc.ActiveDoc.Objects.AddRectangle(new Rectangle3d(perpPlane, 50, 50)); //Rhino.RhinoDoc.ActiveDoc.Objects.AddRectangle(new Rectangle3d(jointPlane0, 50, 50)); //Middle points and projection to plane Point3d innerPointMid00 = (moveFlag) ? edgePoint00 + (v00 * length * 0.5) : edgePoint00 - (v00 * length * 0.5); Point3d innerPointMid01 = (moveFlag) ? edgePoint01 + (v01 * length * 0.5) : edgePoint01 - (v01 * length * 0.5); Point3d innerPointMid10 = (moveFlag) ? edgePoint10 + (v10 * length * 0.5) : edgePoint10 - (v10 * length * 0.5); Point3d innerPointMid11 = (moveFlag) ? edgePoint11 + (v11 * length * 0.5) : edgePoint11 - (v11 * length * 0.5); Point3d innerPointMid = (innerPointMid00 + innerPointMid01 + innerPointMid10 + innerPointMid11) * 0.25; Plane perpPlaneMid = new Plane(innerPointMid, jointPlane0.Normal, perpPlane.YAxis); innerPointMid00 = perpPlaneMid.RayPlane(edgePoint00, v00); innerPointMid01 = perpPlaneMid.RayPlane(edgePoint01, v01); innerPointMid10 = perpPlaneMid.RayPlane(edgePoint10, v10); innerPointMid11 = perpPlaneMid.RayPlane(edgePoint11, v11); //It is not closest point because the connection is not perpendicular to two adjacent plates //It might be close to perpendicular but not possible Polyline cut0 = new Polyline(new Point3d[] { edgePoint00, innerPointMid00 + v00 * e, innerPointMid01 + v01 * e, edgePoint01 });//perpPlane.ClosestPoint Polyline cut1 = new Polyline(new Point3d[] { edgePoint10, innerPointMid10 + v10 * e, innerPointMid11 + v11 * e, edgePoint11 }); this.cuts.Add(cut0); this.cuts.Add(cut1); Polyline cutNei0 = new Polyline(new Point3d[] { innerPoint00, innerPointMid00 + v00 * -e, innerPointMid10 + v01 * -e, innerPoint10 });//perpPlane.ClosestPoint Polyline cutNei1 = new Polyline(new Point3d[] { innerPoint01, innerPointMid01 + v10 * -e, innerPointMid11 + v11 * -e, innerPoint11 }); jointPanel.cuts.Add(cutNei0); jointPanel.cuts.Add(cutNei1); contour[0].InsertPolyline(cut0); contour[1].InsertPolyline(cut1); jointPanel.contour[0].InsertPolyline(cutNei0); jointPanel.contour[1].InsertPolyline(cutNei1); //Rhino.RhinoDoc.ActiveDoc.Objects.AddPolyline(cut0); //Rhino.RhinoDoc.ActiveDoc.Objects.AddPolyline(cut1); }
public void CreateCut(int segmentID, Plane jointPlane0, Plane jointPlane1, double length_, ref Panel jointPanel, bool bake = false) //, ref Panel neiPanel,) { { double e = 0; Polyline cut = new Polyline(); Line segment0 = contourNoJoints[0].SegmentAt(segmentID); Line segment1 = contourNoJoints[1].SegmentAt(segmentID); double dist = this.plane.Origin.DistanceTo(segment0.PointAt(0.5)); double length = length_;// * dist * 0.01; //Rhino.RhinoApp.WriteLine(dist.ToString()); //Intersect plate edge line and joint plane offsets Point3d edgePoint00 = PlaneUtil.LinePlane(segment0, jointPlane0); Point3d edgePoint01 = PlaneUtil.LinePlane(segment0, jointPlane1); Point3d edgePoint10 = PlaneUtil.LinePlane(segment1, jointPlane0); Point3d edgePoint11 = PlaneUtil.LinePlane(segment1, jointPlane1); //Get direction of a cut Vector3d v00 = PlaneUtil.PlanePlaneVec(planeOffset0, jointPlane0); Vector3d v01 = PlaneUtil.PlanePlaneVec(planeOffset0, jointPlane1); Vector3d v10 = PlaneUtil.PlanePlaneVec(planeOffset1, jointPlane0); Vector3d v11 = PlaneUtil.PlanePlaneVec(planeOffset1, jointPlane1); //Really f****d up way of checking which direction plane must be offseted for correct cut direction Point3d p0 = mesh.ClosestPoint((segment0.PointAt(0.5) + v00 * 10)); Point3d p1 = mesh.ClosestPoint((segment0.PointAt(0.5) - v00 * 10)); //bool moveFlag = (segment0.PointAt(0.5) + v00*10).DistanceTo(planeOffset0.Origin) < (segment0.PointAt(0.5) - v00*10).DistanceTo(planeOffset0.Origin); bool moveFlag = p0.DistanceToSquared((segment0.PointAt(0.5) + v00 * 10)) < p1.DistanceToSquared((segment0.PointAt(0.5) - v00 * 10)); if (bake) { //Rhino.RhinoDoc.ActiveDoc.Objects.AddPoint(planeOffset0.Origin); //Rhino.RhinoDoc.ActiveDoc.Objects.AddPoint(segment0.PointAt(0.5) + v00*100); //Rhino.RhinoDoc.ActiveDoc.Objects.AddPoint(segment0.PointAt(0.5) - v00*100); } //Moved Points Point3d innerPoint00 = (moveFlag) ? edgePoint00 + (v00 * length) : edgePoint00 - (v00 * length); Point3d innerPoint01 = (moveFlag) ? edgePoint01 + (v01 * length) : edgePoint01 - (v01 * length); Point3d innerPoint10 = (moveFlag) ? edgePoint10 + (v10 * length) : edgePoint10 - (v10 * length); Point3d innerPoint11 = (moveFlag) ? edgePoint11 + (v11 * length) : edgePoint11 - (v11 * length); Point3d innerPointCenter = (innerPoint00 + innerPoint01 + innerPoint10 + innerPoint11) * 0.25; Plane perpPlane = new Plane(innerPointCenter, jointPlane0.Normal, Vector3d.CrossProduct(planeOffset0.Normal, v00)); innerPoint00 = perpPlane.RayPlane(edgePoint00, v00); innerPoint01 = perpPlane.RayPlane(edgePoint01, v01); innerPoint10 = perpPlane.RayPlane(edgePoint10, v10); innerPoint11 = perpPlane.RayPlane(edgePoint11, v11); //Rhino.RhinoDoc.ActiveDoc.Objects.AddRectangle(new Rectangle3d(perpPlane, 50, 50)); //Rhino.RhinoDoc.ActiveDoc.Objects.AddRectangle(new Rectangle3d(jointPlane0, 50, 50)); //Middle points and projection to plane Point3d innerPointMid00 = (moveFlag) ? edgePoint00 + (v00 * length * 0.5) : edgePoint00 - (v00 * length * 0.5); Point3d innerPointMid01 = (moveFlag) ? edgePoint01 + (v01 * length * 0.5) : edgePoint01 - (v01 * length * 0.5); Point3d innerPointMid10 = (moveFlag) ? edgePoint10 + (v10 * length * 0.5) : edgePoint10 - (v10 * length * 0.5); Point3d innerPointMid11 = (moveFlag) ? edgePoint11 + (v11 * length * 0.5) : edgePoint11 - (v11 * length * 0.5); Point3d innerPointMid = (innerPointMid00 + innerPointMid01 + innerPointMid10 + innerPointMid11) * 0.25; Plane perpPlaneMid = new Plane(innerPointMid, jointPlane0.Normal, perpPlane.YAxis); innerPointMid00 = perpPlaneMid.RayPlane(edgePoint00, v00); innerPointMid01 = perpPlaneMid.RayPlane(edgePoint01, v01); innerPointMid10 = perpPlaneMid.RayPlane(edgePoint10, v10); innerPointMid11 = perpPlaneMid.RayPlane(edgePoint11, v11); //It is not closest point because the connection is not perpendicular to two adjacent plates //It might be close to perpendicular but not possible Polyline cut0 = new Polyline(new Point3d[] { edgePoint00, innerPointMid00 + v00 * e, innerPointMid01 + v01 * e, edgePoint01 });//perpPlane.ClosestPoint Polyline cut1 = new Polyline(new Point3d[] { edgePoint10, innerPointMid10 + v10 * e, innerPointMid11 + v11 * e, edgePoint11 }); this.cuts.Add(cut0); this.cuts.Add(cut1); Polyline cutNei0 = new Polyline(new Point3d[] { innerPoint00, innerPointMid00 + v00 * -e, innerPointMid10 + v01 * -e, innerPoint10 });//perpPlane.ClosestPoint Polyline cutNei1 = new Polyline(new Point3d[] { innerPoint01, innerPointMid01 + v10 * -e, innerPointMid11 + v11 * -e, innerPoint11 }); jointPanel.cuts.Add(cutNei0); jointPanel.cuts.Add(cutNei1); contour[0].InsertPolyline(cut0); contour[1].InsertPolyline(cut1); jointPanel.contour[0].InsertPolyline(cutNei0); jointPanel.contour[1].InsertPolyline(cutNei1); if (bake) { Rhino.RhinoDoc.ActiveDoc.Objects.AddPolyline(cut0); Rhino.RhinoDoc.ActiveDoc.Objects.AddPolyline(cut1); } //Rhino.RhinoDoc.ActiveDoc.Objects.AddPolyline(cutNei0); //Rhino.RhinoDoc.ActiveDoc.Objects.AddPolyline(cutNei1); }
protected override void SolveInstance(IGH_DataAccess DA) { Mesh M = DA.Fetch <Mesh>("Mesh"); GH_Structure <GH_Curve> Curves = DA.FetchTree <GH_Curve>("Panels"); DataTree <Polyline> C = new DataTree <Polyline>(); GH_Structure <GH_Vector> edgeVectors = DA.FetchTree <GH_Vector>("EdgeVectors"); DataTree <Vector3d> EVec = new DataTree <Vector3d>(); int D = DA.Fetch <int>("JointDiv"); double L = DA.Fetch <double>("JointLen"); double H = DA.Fetch <double>("JointHei"); double W = DA.Fetch <double>("JointThi"); bool Center = DA.Fetch <bool>("Center"); bool Finger = DA.Fetch <bool>("Finger"); double Custom = DA.Fetch <double>("Custom"); GH_Structure <GH_Curve> CurvesChamfer = DA.FetchTree <GH_Curve>("PanelsChamfer"); DataTree <Polyline> CChamfer = new DataTree <Polyline>(); for (int i = 0; i < Curves.Branches.Count; i++) { for (int j = 0; j < Curves.get_Branch(i).Count; j++) { Polyline polyline; Curves.get_DataItem(Curves.Paths[i], j).Value.TryGetPolyline(out polyline); C.Add(polyline, Curves.Paths[i]); } } if (CurvesChamfer.DataCount == Curves.DataCount) { for (int i = 0; i < Curves.Branches.Count; i++) { for (int j = 0; j < Curves.get_Branch(i).Count; j++) { Polyline polyline; CurvesChamfer.get_DataItem(Curves.Paths[i], j).Value.TryGetPolyline(out polyline); CChamfer.Add(polyline, Curves.Paths[i]); } } } for (int i = 0; i < edgeVectors.Branches.Count; i++) { for (int j = 0; j < edgeVectors.get_Branch(i).Count; j++) { EVec.Add(edgeVectors.get_DataItem(edgeVectors.Paths[i], j).Value, edgeVectors.Paths[i]); } } //Solution DataTree <Polyline> diagonalConnections = new DataTree <Polyline>(); int divisions = Math.Max(1, D); double length = L;//Math.Max(0.1, L); double height = Math.Max(0.1, H); double width = Math.Max(0.1, W); int[][] tv = M.GetNGonsTopoBoundaries(); int[][] fe = M.GetNGonFacesEdges(tv); HashSet <int> e = M.GetAllNGonEdges(tv); Dictionary <int, int[]> efDict = M.GetFE(e, false); Point3d[] centers = M.GetNGonCenters(); DataTree <Polyline> Ccut = new DataTree <Polyline>(); for (int i = 0; i < C.BranchCount; i++) { for (int j = 0; j < C.Branch(i).Count; j++) { if (CurvesChamfer.DataCount == Curves.DataCount) { Ccut.Add(new Polyline(CChamfer.Branch(i)[j]), new GH_Path(CChamfer.Path(i))); } else { Ccut.Add(new Polyline(C.Branch(i)[j]), new GH_Path(C.Path(i))); //Rhino.RhinoApp.WriteLine(CChamfer.DataCount.ToString() + " " + Curves.DataCount.ToString()); } } } DataTree <Vector3d> EV = new DataTree <Vector3d>(); if (EVec.DataCount == 0) { foreach (int ee in e) { if (M.TopologyEdges.GetConnectedFaces(ee).Length != 1) { if (Center) { int[] facePair = efDict[ee]; Vector3d insertionVec = centers[facePair[0]] - centers[facePair[1]]; insertionVec.Unitize(); EV.Add(insertionVec, new GH_Path(ee)); //Line li = new Line(centers[facePair[0]] , centers[facePair[1]]); //Rhino.RhinoDoc.ActiveDoc.Objects.AddLine(li); } else { EV.Add(NGonsCore.VectorUtil.BisectorVector(M.TopologyEdges.EdgeLine(ee), M.GetNGonNormal(efDict[ee][0])), new GH_Path(ee)); } } } } else { EV = EVec; } DataTree <Polyline> recJoints = new DataTree <Polyline>(); for (int i = 0; i < EV.BranchCount; i++) { GH_Path p = EV.Path(i); int ecur = p.Indices[0]; int f0 = efDict[ecur][0]; int f1 = efDict[ecur][1]; //Divide line into points Line line = M.TopologyEdges.EdgeLine(ecur); Point3d[] pts = NGonsCore.PointUtil.InterpolatePoints(line.From, line.To, divisions, false); Point3d[] pts0 = new Point3d[pts.Length]; Point3d[] pts1 = new Point3d[pts.Length]; //Get average normal between faces Vector3d edgeNormal = M.GetNGonNormal(f0) + M.GetNGonNormal(f1); edgeNormal.Unitize(); Vector3d cross = Vector3d.CrossProduct(edgeNormal, EV.Branch(p)[0]); cross.Unitize(); //Get line planes Plane[] edgePlanes = new Plane[pts.Length]; Plane edgePlane90 = new Plane(line.PointAt(0.5), cross, edgeNormal); for (int j = 0; j < pts.Length; j++) { Vector3d v = EV.Branch(p)[0]; v.Unitize(); edgePlanes[j] = new Plane(pts[j], v, edgeNormal); } Point3d[][] edgePoints = new Point3d[edgePlanes.Length][]; for (int j = 0; j < edgePlanes.Length; j++) //C.Branch(f0).Count { Polyline[] rectangleWithoutJoints = new Polyline[] { new Polyline(), new Polyline() }; List <Polyline>[] rectangleJoints = new List <Polyline>[] { new List <Polyline>(), new List <Polyline>() }; foreach (int fn in efDict[ecur]) { int e0 = Array.IndexOf(fe[fn], ecur); edgePoints[j] = new Point3d[C.Branch(fn).Count]; Polyline[] perpJoint = new Polyline[C.Branch(fn).Count]; Polyline recJoint0 = new Polyline(); Polyline recJoint1 = new Polyline(); for (int k = 0; k < C.Branch(fn).Count; k++) { if (k % 2 == 0 && k != 0) { //rectangleJoints[0].Add(recJoint0); //rectangleJoints[1].Add(recJoint1); recJoint0.Clear(); recJoint1.Clear(); } Line segment = C.Branch(fn)[k].SegmentAt(e0); Plane planeOff0 = edgePlanes[j].MovePlanebyAxis(W * 0.5); Plane planeOff1 = edgePlanes[j].MovePlanebyAxis(-W * 0.5); Plane planeFace = C.Branch(fn)[k].plane(); Plane plane3 = new Plane(planeFace.Origin, edgePlanes[j].Normal, planeFace.Normal); //Face0 edge points Point3d edgePoint0 = PlaneUtil.LinePlane(segment, planeOff0); Point3d edgePoint1 = PlaneUtil.LinePlane(segment, planeOff1); //Inner Points Vector3d v0 = PlaneUtil.PlanePlaneVec(planeFace, planeOff0); Vector3d v1 = PlaneUtil.PlanePlaneVec(planeFace, planeOff1); bool moveFlag = (segment.PointAt(0.5) + v0).DistanceTo(planeFace.Origin) < (segment.PointAt(0.5) - v0).DistanceTo(planeFace.Origin); bool flagMod = j % 2 == 0; bool flagFace = efDict[ecur][0] == fn; flagMod = false; //double scalarLength = (centers[fn] - edgePlanes[j].Origin).Length*(double)Math.Abs(length); if (L < 0) { length = (centers[fn] - edgePlanes[j].Origin).Length * (double)Math.Abs(L); } //length = (centers[fn] - edgePlanes[j].Origin).Length*1; Point3d innerPoint0 = (moveFlag) ? edgePoint0 + (v0 * length) : edgePoint0 - (v0 * length); Point3d innerPoint1 = (moveFlag) ? edgePoint1 + (v1 * length) : edgePoint1 - (v1 * length); if (Finger) { innerPoint0 = (!moveFlag && !Finger) ? edgePoint0 + (v0 * length) : edgePoint0 - (v0 * length); innerPoint1 = (!moveFlag && !Finger) ? edgePoint1 + (v1 * length) : edgePoint1 - (v1 * length); } //Point3d innerPoint0 = edgePoint0 +(v0 * L); //Point3d innerPoint1 = edgePoint1 +(v1 * L) ; Polyline polylinep0 = new Polyline(new Point3d[] { edgePoint0, innerPoint0, innerPoint1, edgePoint1 }); // Rhino.RhinoDoc.ActiveDoc.Objects.AddPolyline(polylinep0); Line guideLine0 = new Line(edgePoint0, innerPoint0); Line guideLine1 = new Line(edgePoint1, innerPoint1); Point3d mid = (innerPoint1 + innerPoint0) * 0.5; innerPoint0 = guideLine0.ClosestPoint(mid, false); innerPoint1 = guideLine1.ClosestPoint(mid, false); Point3d center = (edgePoint0 + innerPoint0 + innerPoint1 + edgePoint1) * 0.25; Point3d center0 = guideLine0.ClosestPoint(center, false); Point3d center1 = guideLine1.ClosestPoint(center, false); perpJoint[k] = new Polyline(new Point3d[] { innerPoint0, center0, center1, innerPoint1 }); Polyline polyline0 = new Polyline(new Point3d[] { edgePoint0, center0, center1, edgePoint1 }); //finger joints or standard if (Finger) { if (efDict[ecur][0] == fn) { Ccut.Branch(efDict[ecur][0])[k].InsertPolyline(polyline0);//offset needed } else { Ccut.Branch(efDict[ecur][1])[k].InsertPolyline(polyline0);//offset needed } } else { Ccut.Branch(fn)[k].InsertPolyline(polyline0);//offset needed } if (fn == efDict[ecur][0]) { if (k == 1 || k == NGonsCore.MathUtil.Wrap(C.Branch(fn).Count - 2, C.Branch(fn).Count)) { rectangleWithoutJoints[0].Add(innerPoint0); rectangleWithoutJoints[1].Add(innerPoint1); } } else { if (k == 1) { rectangleWithoutJoints[0].Add(innerPoint0); rectangleWithoutJoints[1].Add(innerPoint1); } if (k == NGonsCore.MathUtil.Wrap(C.Branch(fn).Count - 2, C.Branch(fn).Count)) { rectangleWithoutJoints[0].Insert(2, innerPoint0); rectangleWithoutJoints[1].Insert(2, innerPoint1); } } // Rhino.RhinoDoc.ActiveDoc.Objects.AddPoint(innerPoint0); //Rhino.RhinoDoc.ActiveDoc.Objects.AddPoint(center0); //Rhino.RhinoDoc.ActiveDoc.Objects.AddPoint(innerPoint1); // Rhino.RhinoDoc.ActiveDoc.Objects.AddPolyline(recJoint0); //Rhino.RhinoDoc.ActiveDoc.Objects.AddPolyline(recJoint1); if (k % 2 == 0) { recJoint0.Add(innerPoint0); recJoint0.Add(center0); recJoint1.Add(innerPoint1); recJoint1.Add(center1); } else { recJoint0.Add(center0); recJoint0.Add(innerPoint0); recJoint1.Add(center1); recJoint1.Add(innerPoint1); } if (k % 2 == 1) { rectangleJoints[0].Add(new Polyline(recJoint0)); rectangleJoints[1].Add(new Polyline(recJoint1)); } if (k % 2 == 1) { //Rhino.RhinoDoc.ActiveDoc.Objects.AddPolyline(recJoint0); //Rhino.RhinoDoc.ActiveDoc.Objects.AddPolyline(recJoint1); } //edgePoints[j][k] = edgePoint0; // Rhino.RhinoDoc.ActiveDoc.Objects.AddPoint(edgePoint0); // Rhino.RhinoDoc.ActiveDoc.Objects.AddPoint(edgePoint1); // Rhino.RhinoDoc.ActiveDoc.Objects.AddPoint(innerPoint0); // Rhino.RhinoDoc.ActiveDoc.Objects.AddPoint(innerPoint1); // Rhino.RhinoDoc.ActiveDoc.Objects.AddPolyline(polyline0); } } for (int m = 0; m < rectangleWithoutJoints.Length; m++) { Line l0 = CurveUtil.ExtendLine(rectangleWithoutJoints[m].SegmentAt(0), height); Line l1 = CurveUtil.ExtendLine(rectangleWithoutJoints[m].SegmentAt(2), height); if (l0.From.DistanceTo(l1.From) < l0.From.DistanceTo(l1.To)) { l1.Flip(); } rectangleWithoutJoints[m] = new Polyline(new Point3d[] { l0.From, l0.To, l1.From, l1.To, l0.From }); // Line line } for (int m = 0; m < rectangleJoints[0].Count; m++) { //Rhino.RhinoDoc.ActiveDoc.Objects.AddPolyline(rectangleJoints[0][j]); rectangleWithoutJoints[0].InsertPolyline(rectangleJoints[0][m]); rectangleWithoutJoints[1].InsertPolyline(rectangleJoints[1][m]); } //try make special joint if (Custom >= 0 && C.Branch(0).Count == 4) { Polyline rebuild0 = new Polyline(); Polyline rebuild1 = new Polyline(); for (int m = 2; m < 18; m++) { if (m == 2) { Vector3d v0 = rectangleWithoutJoints[0][m] - rectangleWithoutJoints[0][m + 1]; v0.Unitize(); rebuild0.Add(rectangleWithoutJoints[0][m] + v0 * Custom); rebuild1.Add(rectangleWithoutJoints[1][m] + v0 * Custom); } else if (m == 17) { Vector3d v0 = rectangleWithoutJoints[0][17] - rectangleWithoutJoints[0][16]; v0.Unitize(); rebuild0.Add(rectangleWithoutJoints[0][17] + v0 * Custom); rebuild1.Add(rectangleWithoutJoints[1][17] + v0 * Custom); } else { rebuild0.Add(rectangleWithoutJoints[0][m]); rebuild1.Add(rectangleWithoutJoints[1][m]); } } rebuild0.Close(); rebuild1.Close(); rectangleWithoutJoints[0] = rebuild0; rectangleWithoutJoints[1] = rebuild1; } recJoints.AddRange(rectangleWithoutJoints, new GH_Path(ecur)); } //Rhino.RhinoDoc.ActiveDoc.Objects.AddPolyline(rectangleWithoutJoints[0]); //Rhino.RhinoDoc.ActiveDoc.Objects.AddPolyline(rectangleWithoutJoints[1]); //A = edgePlanes; } DA.SetDataTree(0, Ccut); DA.SetDataTree(1, recJoints); //DC = diagonalConnections; //Panels = Ccut; //Joints = recJoints; }