Exemplo n.º 1
0
        /// <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));
        }
    }
Exemplo n.º 3
0
        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]);
        }
Exemplo n.º 4
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);
        }
Exemplo n.º 5
0
        /// <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);
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        /// <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);
        }
Exemplo n.º 8
0
        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);
        }