Exemplo n.º 1
0
        public DataTree <Line> GetDowels(double radius = 0.075, int count = 8)
        {
            DataTree <Line> dt = new DataTree <Line>();

            for (int i = 0; i < this._nexors.Count; i++)
            {
                if (this._nexors[i].isNexor != 0)
                {
                    var     path = new GH_Path(i);
                    Point3d c    = (this._nexors[i].endPl0.Origin + this._nexors[i].endPl1.Origin) * 0.5;

                    int dir = (c.DistanceToSquared(this._nexors[i].endPl0.Origin + this._nexors[i].endPl0.ZAxis) < c.DistanceToSquared(this._nexors[i].endPl0.Origin - this._nexors[i].endPl0.ZAxis)) ? -1 : 1;

                    Plane  plane  = this._nexors[i].endPl0.ChangeOrigin(PlaneUtil.LinePlane(this._nexors[i].pipe.line, this._nexors[i].endPl0));
                    Circle circle = new Circle(plane, radius);
                    Curve  curve  = circle.ToNurbsCurve();
                    curve.DivideByCount(count, true, out Point3d[] pts);

                    foreach (Point3d p in pts)
                    {
                        Line line = new Line(p, this._nexors[i].endPl0.ZAxis * dir * 0.15);
                        dt.Add(line, path);
                        //line.Bake();
                    }

                    plane  = this._nexors[i].endPl1.ChangeOrigin(PlaneUtil.LinePlane(this._nexors[i].pipe.line, this._nexors[i].endPl1));
                    circle = new Circle(plane, radius);
                    curve  = circle.ToNurbsCurve();
                    curve.DivideByCount(count, true, out Point3d[] pts1);



                    dir = (c.DistanceToSquared(this._nexors[i].endPl1.Origin + this._nexors[i].endPl1.ZAxis) < c.DistanceToSquared(this._nexors[i].endPl1.Origin - this._nexors[i].endPl1.ZAxis)) ? -1 : 1;


                    foreach (Point3d p in pts1)
                    {
                        Line line = new Line(p, this._nexors[i].endPl1.ZAxis * dir * 0.15);
                        dt.Add(line, path);
                        //line.Bake();
                    }

                    //Rhino.RhinoDoc.ActiveDoc.Objects.AddCircle(circle);
                }
            }
            return(dt);
        }
Exemplo n.º 2
0
        public Polyline[][] GetSupportStructure(Mesh M, double W1, double W2, Plane[] facePlanes, Plane[] linePlanes, Plane[][] endPlanes, int[][] fe_, int[][] fe, Surface s, Dictionary <int, int> eDict, ref Plane[] ep0, ref Plane[] ep1, ref Plane[] lp2, ref Plane[] lp3)
        {
            //double thickness = 1.2;
            //double heightScale = 2;


            double thickness   = W1;
            double heightScale = W2 * 2;


            double extend = 1;
            bool   flip   = true;


            Polyline[][] support = new Polyline[linePlanes.Length][];

            ep0 = new Plane[linePlanes.Length];         //Neighbour planes0
            ep1 = new Plane[linePlanes.Length];         //Neighbour planes01
            Plane[] lp0 = new Plane[linePlanes.Length]; //line planes0
            Plane[] lp1 = new Plane[linePlanes.Length]; //line planes1
            lp2 = new Plane[linePlanes.Length];         //line planes2 rotated 90
            lp3 = new Plane[linePlanes.Length];         //line planes3 rotated 90


            for (int i = 0; i < linePlanes.Length; i++)
            {
                Line    projectionAxis = new Line(linePlanes[i].Origin, linePlanes[i].Origin + linePlanes[i].YAxis);
                Point3d projectedPt    = NGonsCore.MeshUtilSimple.SurfaceRay(s, projectionAxis);

                //Six sides of each beam
                lp0[i] = linePlanes[i].MovePlanebyAxis(thickness);
                lp1[i] = linePlanes[i].MovePlanebyAxis(-thickness);
                lp2[i] = (new Plane(projectedPt, linePlanes[i].XAxis, linePlanes[i].ZAxis)).MovePlanebyAxis(heightScale);
                lp3[i] = (new Plane(projectedPt, linePlanes[i].XAxis, linePlanes[i].ZAxis)).MovePlanebyAxis(0);

                ep0[i] = endPlanes[i][0].MovePlanebyAxis(thickness, linePlanes[i].Origin, 2, flip);
                ep1[i] = endPlanes[i][1].MovePlanebyAxis(thickness, linePlanes[i].Origin, 2, flip);


                Plane endPlane0_Offset = endPlanes[i][0].MovePlanebyAxis(thickness * extend, linePlanes[i].Origin, 2, !flip);
                Plane endPlane1_Offset = endPlanes[i][1].MovePlanebyAxis(thickness * extend, linePlanes[i].Origin, 2, !flip);

                //Rectangle3d r0 = new Rectangle3d(lp2[i],10,10);
                //Rhino.RhinoDoc.ActiveDoc.Objects.AddRectangle(r0);

                //First outlines
                List <Plane> sidePlanes = new List <Plane>()
                {
                    lp0[i], lp2[i], lp1[i], lp3[i]
                };
                Polyline topOutline = PolylineUtil.PolylineFromPlanes(ep0[i], sidePlanes);
                Polyline botOutline = PolylineUtil.PolylineFromPlanes(ep1[i], sidePlanes);


                ep0[i] = new Plane(topOutline.CenterPoint(), topOutline.SegmentAt(0).Direction, topOutline.SegmentAt(1).Direction);
                ep1[i] = new Plane(botOutline.CenterPoint(), botOutline.SegmentAt(0).Direction, botOutline.SegmentAt(1).Direction);


                Point3d center = (ep0[i].Origin + ep1[i].Origin) * 0.5;

                if (center.DistanceToSquared(ep0[i].Origin + ep0[i].ZAxis) < center.DistanceToSquared(ep0[i].Origin))
                {
                    ep0[i].Flip();
                    ep0[i].Rotate(-Math.PI * 0.5, ep0[i].ZAxis);
                }
                if (center.DistanceToSquared(ep1[i].Origin + ep1[i].ZAxis) < center.DistanceToSquared(ep1[i].Origin))
                {
                    ep1[i].Flip();
                    ep1[i].Rotate(-Math.PI * 0.5, ep1[i].ZAxis);
                }



                //

                ///if (i == 0)
                // Rhino.RhinoDoc.ActiveDoc.Objects.AddRectangle(new Rectangle3d(ep0[i],10,10));


                support[i] = new Polyline[] { topOutline, botOutline };
            }

            //Loop each edge
            Tuple <int, int>[][] efe = M.GetEF_LocalID(M.GetAllNGonEdges(M.GetNGonsTopoBoundaries()));

            for (int i = 0; i < linePlanes.Length; i++)
            {
                //int meshE = eDict[i];
                Tuple <int, int>[] edgeFaces = efe[i];

                //if edge has two faces go inside their local edges
                if (edgeFaces.Length == 2)
                {
                    int e0 = fe_[edgeFaces[0].Item1].Next(edgeFaces[0].Item2);
                    int e1 = fe_[edgeFaces[0].Item1].Prev(edgeFaces[0].Item2);
                    int e2 = fe_[edgeFaces[1].Item1].Next(edgeFaces[1].Item2);
                    int e3 = fe_[edgeFaces[1].Item1].Prev(edgeFaces[1].Item2);



                    if (i == 11)
                    {
                        Line[]    lines = PolylineUtil.LoftLine(support[i][0], support[i][1]);
                        Point3d[] pInt  = PlaneUtil.LinePlane(lines, linePlanes[e0]);


                        Rectangle3d rec  = new Rectangle3d(linePlanes[i], 20, 20);
                        Rectangle3d rec0 = new Rectangle3d(linePlanes[e0], 10, 10);
                        Rectangle3d rec1 = new Rectangle3d(linePlanes[e2], 10, 10);
                        //rec.pl

                        //Rhino.RhinoDoc.ActiveDoc.Objects.AddRectangle(rec);
                        //Rhino.RhinoDoc.ActiveDoc.Objects.AddRectangle(rec0);
                        //Rhino.RhinoDoc.ActiveDoc.Objects.AddRectangle(rec1);

                        //Current stick intersection
                        //Rhino.RhinoDoc.ActiveDoc.Objects.AddPoints(PlaneUtil.LinePlane(lines, lp0[e0]));
                        //Rhino.RhinoDoc.ActiveDoc.Objects.AddPoints(PlaneUtil.LinePlane(lines, lp0[e1]));
                        //Rhino.RhinoDoc.ActiveDoc.Objects.AddPoints(PlaneUtil.LinePlane(lines, lp0[e2]));
                        //Rhino.RhinoDoc.ActiveDoc.Objects.AddPoints(PlaneUtil.LinePlane(lines, lp0[e3]));
                        //Rhino.RhinoDoc.ActiveDoc.Objects.AddPoints(PlaneUtil.LinePlane(lines, lp1[e0]));
                        //Rhino.RhinoDoc.ActiveDoc.Objects.AddPoints(PlaneUtil.LinePlane(lines, lp1[e1]));
                        //Rhino.RhinoDoc.ActiveDoc.Objects.AddPoints(PlaneUtil.LinePlane(lines, lp1[e2]));
                        //Rhino.RhinoDoc.ActiveDoc.Objects.AddPoints(PlaneUtil.LinePlane(lines, lp1[e3]));

                        //Compare with neighbour stick intersection - the 4 points
                    }
                }
            }



            return(support);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        /// <summary>
        ///For center axis I need three planes:
        ///A - Edge plane
        ///B - Bottom Plane
        ///C - Section Plane
        ///Also two points
        ///And radius
        /// </summary>
        /// <param name="p"></param>
        /// <returns></returns>
        public DataTree <Polyline> RoundBeams(NGonsCore.MeshProps p, double radius = 0.075)
        {
            var dt = new DataTree <Polyline>();


            for (int i = 0; i < p.M._countF(); i++)
            {
                int[] fe = p.M._fe(i);
                for (int j = 0; j < p.M._countE(i); j++)
                {
                    if (this[i, j].isNexor != 0)
                    {
                        Plane edgePlane    = this[i, j].ePl;
                        Plane sectionPlane = new Plane(this[i, j].ePl.Origin, this[i, j].ePl.YAxis, this[i, j].ePl.ZAxis);
                        Plane bottomPlane  = this[i, j].ePl90Offset;

                        //for getting the points

                        Point3d p1 = PlaneUtil.PlanePlanePlane(this[i, j].foPl[0], this[i, j].foPl[1].MovePlanebyAxis(this.plateThickness), sectionPlane);
                        Point3d p0 = PlaneUtil.PlanePlanePlane(this[i, j].fcPl[2], this[i, j].fcPl[1].MovePlanebyAxis(this.plateThickness), sectionPlane);

                        Point3d pc = PlaneUtil.PlanePlanePlane(this[i, j].fcPl[0], this[i, j].fcPl_foPl, sectionPlane);
                        Point3d po = PlaneUtil.PlanePlanePlane(this[i, j].foPl[2], this[i, j].fcPl_foPl, sectionPlane);
                        //pc.Bake();
                        //po.Bake();

                        //if (i == 20) {

                        Line   line   = this[i, j].line;
                        Circle circle = CircleUtil.GetCircleCenter(edgePlane, bottomPlane, sectionPlane, new List <Point3d> {
                            p0, p1
                        }, radius);
                        Vector3d v = circle.Center - line.From;
                        line.Transform(Transform.Translation(v));
                        //Rhino.RhinoDoc.ActiveDoc.Objects.AddCircle(circle);



                        //Rhino.RhinoApp.WriteLine(p.M.IsNaked(p.M._meshE(i, j)).ToString());



                        int[] on = (p.M.IsNaked(fe[j])) ? new int[] { i, (j + 1).Wrap(fe.Length) } : p.M._OppositeFE(i, j, 1);
                        int[] op = (p.M.IsNaked(fe[j])) ? new int[] { i, (j - 1).Wrap(fe.Length) } : p.M._OppositeFE(i, j, -1);

                        bool onFlag = this[on[0], on[1]].isNexor == 0;
                        bool opFlag = this[op[0], op[1]].isNexor == 0;

                        if (this[on[0], on[1]].isNexor == 0)
                        {
                            on = p.M._OppositeFE(on[0], on[1]);
                        }
                        if (this[op[0], op[1]].isNexor == 0)
                        {
                            op = p.M._OppositeFE(op[0], op[1]);
                        }

                        Plane pl0 = onFlag ? this[on[0], on[1]].foPl[0] : this[on[0], on[1]].fcPl[2];
                        Plane pl1 = opFlag ? this[op[0], op[1]].foPl[0] : this[op[0], op[1]].fcPl[2];

                        pl0 = this[i, j].endPl0;
                        pl1 = this[i, j].endPl1;

                        if (this[on[0], on[1]].isNexor != 0 && this[op[0], op[1]].isNexor != 0)
                        {
                            line = new Line(PlaneUtil.LinePlane(line, this[i, j].endPl0), PlaneUtil.LinePlane(line, this[i, j].endPl1));
                            line.Extend(0.1, 0.1);

                            //line.Transform(Transform.Scale(line.Center(), 2));
                            this[i, j].pipe = NGonsCore.PipeUtil.CreatePipe(
                                line,
                                this[i, j].id, sectionPlane,
                                radius,
                                pl0.MovePlanebyAxis(0.01, this[i, j].line.Center(), 2, false),
                                pl1.MovePlanebyAxis(0.01, this[i, j].line.Center(), 2, false),
                                10, -1, true);



                            // Rhino.RhinoDoc.ActiveDoc.Objects.AddMesh(pipe.meshloft);
                            //Rhino.RhinoDoc.ActiveDoc.Objects.AddBrep(this[i, j].pipe.breploft);
                        }


                        //}
                    }
                }
            }



            return(dt);
        }
Exemplo n.º 6
0
        public DataTree <Polyline> Panels(NGonsCore.MeshProps p)
        {
            //Draw panels
            DataTree <Polyline> dtPlates = new DataTree <Polyline>();

            for (int i = 0; i < p.M._countF(); i++)
            {
                Plane        panel0     = p.fPl[i];
                Plane        panel1     = p.fPl[i].MovePlanebyAxis(-plateThickness);
                Plane        panel2     = panel1.MovePlanebyAxis(plateThickness * 10);
                List <Plane> sidePlanes = new List <Plane>();


                for (int j = 0; j < p.M._countE(i); j++)
                {
                    if (this[i, j].isNexor != 0)
                    {
                        sidePlanes.Add(this[i, j].fcPl[0]);
                    }
                    else
                    {
                        int[] oppo = p.M._OppositeFE(i, j);

                        Plane sidePlane = Plane.Unset;

                        if (oppo[0] != -1)
                        {
                            Plane oppoPlane = this[oppo[0], oppo[1]].ePl;

                            Plane ePl0  = oppoPlane;
                            Plane ePl1  = new Plane(oppoPlane.Origin, oppoPlane.YAxis, oppoPlane.ZAxis);
                            Plane left  = p.fPl[i];
                            Plane right = p.fPl[oppo[0]];

                            Point3d originRight = PlaneUtil.PlanePlanePlane(ePl0, ePl1, left);
                            Point3d originLeft  = PlaneUtil.PlanePlanePlane(ePl0, ePl1, right);
                            sidePlane = p.fePl[i][j].ChangeOrigin(originRight);
                        }
                        else
                        {
                            sidePlane = p.fePl[i][j];
                        }



                        sidePlane = sidePlane.MovePlanebyAxis(offset0 * scale * extend, panel0.Origin);
                        sidePlanes.Add(sidePlane);
                    }
                }



                Polyline panelOutline0 = PolylineUtil.PolylineFromPlanes(panel0, sidePlanes);
                Polyline panelOutline1 = PolylineUtil.PolylineFromPlanes(panel1, sidePlanes);
                Polyline panelOutline2 = PolylineUtil.PolylineFromPlanes(panel2, sidePlanes);
                dtPlates.Add(panelOutline0, new Grasshopper.Kernel.Data.GH_Path(i));
                dtPlates.Add(panelOutline1, new Grasshopper.Kernel.Data.GH_Path(i));

                for (int j = 0; j < p.M._countE(i); j++)
                {
                    int[] op = p.M._OppositeFE(i, j);
                    if (this[i, j].isNexor != 0)
                    {
                        this[i, j].CNCtopProfileCuts.Add(panelOutline1);
                        this[i, j].CNCtopProfileCuts.Add(panelOutline2);
                    }

                    if (op[0] != -1)
                    {
                        this[op[0], op[1]].CNCtopProfileCuts.Add(panelOutline1);
                        this[op[0], op[1]].CNCtopProfileCuts.Add(panelOutline2);
                    }
                }
            }



            return(dtPlates);

            List <Line> pipes = new List <Line>();

            for (int i = 0; i < p.M._countF(); i++)
            {
                int[] fe = p.M._fe(i);
                for (int j = 0; j < p.M._countE(i); j++)
                {
                    if (this[i, j].isNexor != 0 && !p.M.IsNaked(fe[j]))
                    {
                        Line line = this[i, j].line;
                        line.Transform(Transform.Translation(this[i, j].ePl.YAxis * -movePipeAxis));
                        line = new Line(PlaneUtil.LinePlane(line, this[i, j].endPl0), PlaneUtil.LinePlane(line, this[i, j].endPl1));
                        line.Extend(0.2, 0.2);
                        pipes.Add(line);
                    }
                }
            }
        }
Exemplo n.º 7
0
        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;
        }