protected override Result RunCommand(RhinoDoc doc, RunMode mode)
    {
      var go = new Rhino.Input.Custom.GetObject();
      go.SetCommandPrompt("Select objects");
      go.EnablePreSelect(true, true);
      go.EnablePostSelect(true);
      go.GetMultiple(0, 0);
      if (go.CommandResult() != Result.Success)
        return go.CommandResult();

      var selected_objects = go.Objects().ToList();

      if (go.ObjectsWerePreselected)
      {
        go.EnablePreSelect(false, true);
        go.DeselectAllBeforePostSelect = false;
        go.EnableUnselectObjectsOnExit(false);
        go.GetMultiple(0, 0);
        if (go.CommandResult() == Result.Success)
        {
          foreach (var obj in go.Objects())
          {
            selected_objects.Add(obj);
            // The normal behavior of commands is that when they finish,
            // objects that were pre-selected remain selected and objects
            // that were post-selected will not be selected. Because we
            // potentially could have both, we'll try to do something
            // consistent and make sure post-selected objects also stay selected
            obj.Object().Select(true);
          }
        }
      }
      return selected_objects.Count > 0 ? Result.Success : Result.Nothing;
    }
    public static Rhino.Commands.Result Sweep1(Rhino.RhinoDoc doc)
    {
        Rhino.DocObjects.ObjRef rail_ref;
        var rc = RhinoGet.GetOneObject("Select rail curve", false, Rhino.DocObjects.ObjectType.Curve, out rail_ref);

        if (rc != Rhino.Commands.Result.Success)
        {
            return(rc);
        }

        var rail_crv = rail_ref.Curve();

        if (rail_crv == null)
        {
            return(Rhino.Commands.Result.Failure);
        }

        var gx = new Rhino.Input.Custom.GetObject();

        gx.SetCommandPrompt("Select cross section curves");
        gx.GeometryFilter = Rhino.DocObjects.ObjectType.Curve;
        gx.EnablePreSelect(false, true);
        gx.GetMultiple(1, 0);
        if (gx.CommandResult() != Rhino.Commands.Result.Success)
        {
            return(gx.CommandResult());
        }

        var cross_sections = new List <Rhino.Geometry.Curve>();

        for (int i = 0; i < gx.ObjectCount; i++)
        {
            var crv = gx.Object(i).Curve();
            if (crv != null)
            {
                cross_sections.Add(crv);
            }
        }
        if (cross_sections.Count < 1)
        {
            return(Rhino.Commands.Result.Failure);
        }

        var sweep = new Rhino.Geometry.SweepOneRail();

        sweep.AngleToleranceRadians = doc.ModelAngleToleranceRadians;
        sweep.ClosedSweep           = false;
        sweep.SweepTolerance        = doc.ModelAbsoluteTolerance;
        sweep.SetToRoadlikeTop();
        var breps = sweep.PerformSweep(rail_crv, cross_sections);

        for (int i = 0; i < breps.Length; i++)
        {
            doc.Objects.AddBrep(breps[i]);
        }
        doc.Views.Redraw();
        return(Rhino.Commands.Result.Success);
    }
示例#3
0
    public static Rhino.Commands.Result Flow(Rhino.RhinoDoc doc)
    {
        ObjectType filter = SpaceMorphObjectFilter();

        Rhino.DocObjects.ObjRef objref;
        Rhino.Commands.Result   rc = Rhino.Input.RhinoGet.GetOneObject("Select object to flow", false, filter, out objref);
        if (rc != Rhino.Commands.Result.Success || objref == null)
        {
            return(rc);
        }

        Rhino.Input.Custom.GetObject go0 = new Rhino.Input.Custom.GetObject();
        go0.SetCommandPrompt("Source curve");
        go0.GeometryFilter  = Rhino.DocObjects.ObjectType.Curve;
        go0.SubObjectSelect = false;
        go0.EnablePreSelect(false, true);
        go0.DeselectAllBeforePostSelect = false;
        go0.Get();
        if (go0.CommandResult() != Rhino.Commands.Result.Success)
        {
            return(go0.CommandResult());
        }

        Rhino.DocObjects.ObjRef crv0_ref = go0.Object(0);

        Rhino.Input.Custom.GetObject go1 = new Rhino.Input.Custom.GetObject();
        go1.SetCommandPrompt("Source curve");
        go1.GeometryFilter  = Rhino.DocObjects.ObjectType.Curve;
        go1.SubObjectSelect = false;
        go1.EnablePreSelect(false, true);
        go1.DeselectAllBeforePostSelect = false;
        go1.Get();
        if (go1.CommandResult() != Rhino.Commands.Result.Success)
        {
            return(go1.CommandResult());
        }

        Rhino.DocObjects.ObjRef crv1_ref = go1.Object(0);

        Rhino.Geometry.Morphs.FlowSpaceMorph morph = new Rhino.Geometry.Morphs.FlowSpaceMorph(crv0_ref.Curve(), crv1_ref.Curve(), false);

        Rhino.Geometry.GeometryBase geom = objref.Geometry().Duplicate();
        if (morph.Morph(geom))
        {
            doc.Objects.Add(geom);
            doc.Views.Redraw();
        }

        return(Rhino.Commands.Result.Success);
    }
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            var go = new Rhino.Input.Custom.GetObject();

            go.SetCommandPrompt("Select objects");
            go.EnablePreSelect(true, true);
            go.EnablePostSelect(true);
            go.GetMultiple(0, 0);
            if (go.CommandResult() != Result.Success)
            {
                return(go.CommandResult());
            }

            var selected_objects = go.Objects().ToList();

            if (go.ObjectsWerePreselected)
            {
                go.EnablePreSelect(false, true);
                go.DeselectAllBeforePostSelect = false;
                go.EnableUnselectObjectsOnExit(false);
                go.GetMultiple(0, 0);
                if (go.CommandResult() == Result.Success)
                {
                    foreach (var obj in go.Objects())
                    {
                        selected_objects.Add(obj);
                        // The normal behavior of commands is that when they finish,
                        // objects that were pre-selected remain selected and objects
                        // that were post-selected will not be selected. Because we
                        // potentially could have both, we'll try to do something
                        // consistent and make sure post-selected objects also stay selected
                        obj.Object().Select(true);
                    }
                }
            }
            return(selected_objects.Count > 0 ? Result.Success : Result.Nothing);
        }
示例#5
0
    public static Rhino.Commands.Result Splop(Rhino.RhinoDoc doc)
    {
        ObjectType filter = SpaceMorphObjectFilter();

        Rhino.DocObjects.ObjRef objref;
        Rhino.Commands.Result   rc = Rhino.Input.RhinoGet.GetOneObject("Select object to splop", false, filter, out objref);
        if (rc != Rhino.Commands.Result.Success || objref == null)
        {
            return(rc);
        }

        Rhino.Geometry.Plane plane = doc.Views.ActiveView.ActiveViewport.ConstructionPlane();

        Rhino.Input.Custom.GetObject go = new Rhino.Input.Custom.GetObject();
        go.SetCommandPrompt("Surface to splop on");
        go.GeometryFilter  = Rhino.DocObjects.ObjectType.Surface;
        go.SubObjectSelect = false;
        go.EnablePreSelect(false, true);
        go.DeselectAllBeforePostSelect = false;
        go.Get();
        if (go.CommandResult() != Rhino.Commands.Result.Success)
        {
            return(go.CommandResult());
        }

        Rhino.DocObjects.ObjRef srfref = go.Object(0);

        double u, v;

        srfref.SurfaceParameter(out u, out v);

        Rhino.Geometry.Point2d uv = new Rhino.Geometry.Point2d(u, v);

        Rhino.Geometry.Morphs.SplopSpaceMorph morph = new Rhino.Geometry.Morphs.SplopSpaceMorph(plane, srfref.Surface(), uv);
        Rhino.Geometry.GeometryBase           geom  = objref.Geometry().Duplicate();
        if (morph.Morph(geom))
        {
            doc.Objects.Add(geom);
            doc.Views.Redraw();
        }

        return(Rhino.Commands.Result.Success);
    }
示例#6
0
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            const Rhino.DocObjects.ObjectType geometryFilter = Rhino.DocObjects.ObjectType.Surface |
                                                               Rhino.DocObjects.ObjectType.PolysrfFilter |
                                                               Rhino.DocObjects.ObjectType.Mesh;
            int integer1 = 300;
            int integer2 = 300;

            Rhino.Input.Custom.OptionInteger optionInteger1 = new Rhino.Input.Custom.OptionInteger(integer1, 200, 900);
            Rhino.Input.Custom.OptionInteger optionInteger2 = new Rhino.Input.Custom.OptionInteger(integer2, 200, 900);

            Rhino.Input.Custom.GetObject go = new Rhino.Input.Custom.GetObject();
            go.SetCommandPrompt("Select surfaces, polysurfaces, or meshes");
            go.GeometryFilter = geometryFilter;
            go.AddOptionInteger("Option1", ref optionInteger1);
            go.AddOptionInteger("Option2", ref optionInteger2);
            go.GroupSelect     = true;
            go.SubObjectSelect = false;
            go.EnableClearObjectsOnEntry(false);
            go.EnableUnselectObjectsOnExit(false);
            go.DeselectAllBeforePostSelect = false;

            bool bHavePreselectedObjects = false;

            for (; ;)
            {
                var res = go.GetMultiple(1, 0);

                if (res == Rhino.Input.GetResult.Option)
                {
                    go.EnablePreSelect(false, true);
                    continue;
                }

                else if (res != Rhino.Input.GetResult.Object)
                {
                    return(Result.Cancel);
                }

                if (go.ObjectsWerePreselected)
                {
                    bHavePreselectedObjects = true;
                    go.EnablePreSelect(false, true);
                    continue;
                }

                break;
            }

            if (bHavePreselectedObjects)
            {
                // Normally, pre-selected objects will remain selected, when a
                // command finishes, and post-selected objects will be unselected.
                // This this way of picking, it is possible to have a combination
                // of pre-selected and post-selected. So, to make sure everything
                // "looks the same", lets unselect everything before finishing
                // the command.
                for (int i = 0; i < go.ObjectCount; i++)
                {
                    Rhino.DocObjects.RhinoObject rhinoObject = go.Object(i).Object();
                    if (null != rhinoObject)
                    {
                        rhinoObject.Select(false);
                    }
                }
                doc.Views.Redraw();
            }

            int objectCount = go.ObjectCount;

            integer1 = optionInteger1.CurrentValue;
            integer2 = optionInteger2.CurrentValue;

            RhinoApp.WriteLine("Select object count = {0}", objectCount);
            RhinoApp.WriteLine("Value of integer1 = {0}", integer1);
            RhinoApp.WriteLine("Value of integer2 = {0}", integer2);

            return(Result.Success);
        }
示例#7
0
        public static GeometryLarge CreateGeometry(MaterialType mType, string mName)

        {
            RhinoDoc doc = RhinoDoc.ActiveDoc;

            //Allow user to pick multiple objects
            const Rhino.DocObjects.ObjectType geometryFilter = Rhino.DocObjects.ObjectType.Curve;

            Rhino.Input.Custom.GetObject go = new Rhino.Input.Custom.GetObject()
            {
                GeometryFilter              = geometryFilter,
                GroupSelect                 = true,
                SubObjectSelect             = false,
                DeselectAllBeforePostSelect = false
            };
            go.SetCommandPrompt("Pick one or two closed curves.");
            go.EnableClearObjectsOnEntry(false);
            go.EnableUnselectObjectsOnExit(false);

            bool bHavePreselectedObjects = false;

            for (;;)
            {
                Rhino.Input.GetResult res = go.GetMultiple(1, 0);
                if (go.ObjectsWerePreselected)
                {
                    bHavePreselectedObjects = true;
                    go.EnablePreSelect(false, true);
                    continue;
                }
                break;
            }

            //Unselects the preselected objects
            if (bHavePreselectedObjects)
            {
                for (int i = 0; i < go.ObjectCount; i++)
                {
                    RhinoObject rhinoObject = go.Object(i).Object();
                    if (null != rhinoObject)
                    {
                        rhinoObject.Select(false);
                    }
                }

                doc.Views.Redraw();
            }

            ObjRef[]     objs           = go.Objects();
            List <Curve> selectedCurves = new List <Curve>();

            foreach (ObjRef objRef in objs)
            {
                if (objRef.Curve() == null)
                {
                    RhinoApp.WriteLine("One of the selected objects was invalid.");
                    continue;
                }
                else if (!objRef.Curve().IsClosed)
                {
                    RhinoApp.WriteLine("One of the selected curves was not closed.");
                    continue;
                }
                selectedCurves.Add(objRef.Curve());
            }

            GeometryLarge larg;

            //if the curve is not closed do nothing
            switch (selectedCurves.Count)
            {
            case 0:
                Rhino.RhinoApp.WriteLine("No valid geometries was found.");
                return(null);

            case 1:
                larg = DrawAndSaveUserAttr(Brep.CreatePlanarBreps(selectedCurves)[0], doc, mType, mName);
                break;

            case 2:
                Brep brep1 = Brep.CreatePlanarBreps(new[] { selectedCurves[0] })[0];
                Brep brep2 = Brep.CreatePlanarBreps(new[] { selectedCurves[1] })[0];

                double area      = Brep.CreateBooleanUnion(new[] { brep1, brep2 }, 0.001)[0].GetArea();
                double brep1Area = brep1.GetArea();
                double brep2Area = brep2.GetArea();
                if (area > 0.999 * brep1Area && area < 1.001 * brep1Area)
                {
                    Brep brep = Brep.CreateBooleanDifference(brep1, brep2, doc.ModelAbsoluteTolerance)[0];
                    larg = DrawAndSaveUserAttr(brep, doc, mType, mName);
                    break;
                }

                else if (area > 0.999 * brep2Area && area < 1.001 * brep2Area)
                {
                    Brep brep = Brep.CreateBooleanDifference(brep1, brep2, doc.ModelAbsoluteTolerance)[0];
                    larg = DrawAndSaveUserAttr(brep, doc, mType, mName);
                    break;
                }
                else
                {
                    RhinoApp.WriteLine("The curves were not inside one another.");
                    return(null);
                }

            default:
                return(null);
            }

            foreach (ObjRef objRef in objs)
            {
                doc.Objects.Delete(objRef, false);
            }
            return(larg);
        }
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            const Rhino.DocObjects.ObjectType geometryFilter = Rhino.DocObjects.ObjectType.Point;

            Rhino.Input.Custom.GetObject go = new Rhino.Input.Custom.GetObject();
            go.SetCommandPrompt("Pick all the points that you want to change to reinforcement.");
            go.GeometryFilter  = geometryFilter;
            go.GroupSelect     = true;
            go.SubObjectSelect = false;
            go.EnableClearObjectsOnEntry(false);
            go.EnableUnselectObjectsOnExit(false);
            go.DeselectAllBeforePostSelect = false;

            bool bHavePreselectedObjects = false;

            for (;;)
            {
                Rhino.Input.GetResult res = go.GetMultiple(1, 0);

                /*
                 * if (res == Rhino.Input.GetResult.Option)
                 * {
                 *  go.EnablePreSelect(false, true);
                 *  continue;
                 * }
                 * else if (res != Rhino.Input.GetResult.Option)
                 * {
                 *  return Rhino.Commands.Result.Cancel;
                 * }
                 */
                if (go.ObjectsWerePreselected)
                {
                    bHavePreselectedObjects = true;
                    go.EnablePreSelect(false, true);
                    continue;
                }
                break;
            }

            List <Point3d> points = new List <Point3d>();

            if (bHavePreselectedObjects)
            {
                for (int i = 0; i < go.ObjectCount; i++)
                {
                    RhinoObject rhinoObject = go.Object(i).Object();
                    if (null != rhinoObject)
                    {
                        rhinoObject.Select(false);
                    }
                }
                doc.Views.Redraw();
            }

            int layerIndex = getLayerIndex(doc, "Reinforcement");

            doc.Layers[layerIndex].Color = Color.Black;
            if (layerIndex == 999)
            {
                return(Result.Failure);
            }

            ObjRef[] objects = go.Objects();
            foreach (ObjRef obj in objects)
            {
                Point3d point = obj.Point().Location;

                //TODO add the functionality how to assign different steel materials.
                Reinforcement reinf = new Reinforcement(ProjectPlugIn.Instance.CurrentBeam)
                {
                    Material = new SteelMaterial("B500B", SteelType.Reinforcement, ProjectPlugIn.Instance.CurrentBeam),
                    Centroid = point,
                    Diameter = 8
                };



                ObjectAttributes attr = new ObjectAttributes();
                attr.UserData.Add(reinf);
                attr.SetUserString("Name", "Reinforcement");
                attr.LayerIndex = layerIndex;

                //Unused code to create a hatch around the point

                /*
                 * doc.Objects.AddCurve(reinf.OutLine,attr);
                 * ObjectAttributes attrHatch = new ObjectAttributes();
                 * attrHatch.LayerIndex = layerIndex;
                 * doc.Objects.AddHatch(reinf.Hatch, attrHatch);
                 */


                doc.Objects.ModifyAttributes(obj, attr, true);
            }



            return(Result.Success);
        }
示例#9
0
        public Boolean createDimensions(List <Guid> guidList)
        {
            doc = RhinoDoc.ActiveDoc;
            go  = new Rhino.Input.Custom.GetObject();
            go.GeometryFilter  = Rhino.DocObjects.ObjectType.Curve;
            go.GroupSelect     = true;
            go.SubObjectSelect = false;
            go.EnableClearObjectsOnEntry(false);
            go.EnableUnselectObjectsOnExit(false);
            go.DeselectAllBeforePostSelect = false;
            go.EnableSelPrevious(true);
            go.EnablePreSelect(true, false);
            go.GeometryFilter = Rhino.DocObjects.ObjectType.Curve;
            go.SetCommandPrompt("Select panels to create dimensions");
            while (true)
            {
                go.ClearCommandOptions();

                // perform the get operation. This will prompt the user to select the list of curves, but also
                // allow for command line options defined above
                GetResult result = go.GetMultiple(1, 0);

                if (result == GetResult.Option)
                {
                    go.EnablePreSelect(false, true);
                    continue;
                }
                else if (result == GetResult.Number)
                {
                    continue;
                }
                else if (result != GetResult.Object)
                {
                }

                if (go.ObjectsWerePreselected)
                {
                    go.EnablePreSelect(true, true);
                    break;
                }

                break;
            }

            int objecTCount = go.ObjectCount;

            foreach (ObjRef objRef in go.Objects()) //Go through each curve  in the objects list
            {
                Curve curve = objRef.Curve();

                // If curve is null, means objRef is not a curve
                if (curve == null)
                {
                    dimensionsCreated = false;
                    continue;
                }

                // If curve is not Closed Curve
                if (curve.IsClosed == false)
                {
                    RhinoApp.WriteLine(objRef.ToString() + " curve is open");
                    dimensionsCreated = false;
                    continue;
                }

                if (curve.IsPlanar() == false)
                {
                    RhinoApp.WriteLine(objRef.ToString() + " curve is not planar");
                    dimensionsCreated = false;
                    continue;
                }
                MetrixUtilities.createMetrixRealDimension();
                BoundingBox boundingBox = curve.GetBoundingBox(Plane.WorldXY);
                Point3d     min         = boundingBox.Min;
                Point3d     max         = boundingBox.Max;

                //Add Horizontal dimension
                origin       = new Point3d(min.X, max.Y, 0);
                offset       = new Point3d(max.X, max.Y, 0);
                pt           = new Point3d((offset.X - origin.X) / 2, max.Y + 180, 0);
                plane        = Plane.WorldXY;
                plane.Origin = origin;
                guidList     = drawDimension(plane, pt, offset, origin, guidList, doc); //draw the dimension


                //Add vertical Dimensions
                origin       = new Point3d(min.X, min.Y, 0);
                offset       = new Point3d(min.X, max.Y, 0); //left
                pt           = new Point3d(min.X - 180, (offset.Y - origin.Y) / 2, 0);
                plane        = Plane.WorldXY;
                plane.XAxis  = new Vector3d(0, -1, 0); //-1 to rotate the dimension vertically
                plane.YAxis  = new Vector3d(-1, 0, 0);
                plane.ZAxis  = new Vector3d(0, 0, -1);
                plane.Origin = origin;
                guidList     = drawDimension(plane, pt, offset, origin, guidList, doc); //draw the dimension

                dimensionsCreated = true;
            }
            doc.Views.Redraw(); //finally redraw to refresh the screen and display dimensions to user
            return(dimensionsCreated);
        }
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            string selectedLayer;
            Color  selectedColour;

            // For this example we will use a GetPoint class, but all of the custom
            // "Get" classes support command line options.
            Rhino.Input.Custom.GetObject go = new Rhino.Input.Custom.GetObject();
            go.SetCommandPrompt("Select panels to create borders");

            double border = Properties.Settings.Default.PanelBorderDefault; // Default borderSize is 50

            // set up the options
            Rhino.Input.Custom.OptionDouble borderSizeOption = new Rhino.Input.Custom.OptionDouble(border);

            go.AddOptionDouble("Borders", ref borderSizeOption);
            go.AcceptNumber(true, true);
            go.GeometryFilter  = Rhino.DocObjects.ObjectType.Curve;
            go.GroupSelect     = true;
            go.SubObjectSelect = false;
            go.EnableClearObjectsOnEntry(false);
            go.EnableUnselectObjectsOnExit(false);
            go.DeselectAllBeforePostSelect = false;
            go.EnableSelPrevious(true);
            go.EnablePreSelect(true, false);

            go.GeometryFilter = Rhino.DocObjects.ObjectType.Curve;


            RequiredLayer getRequiredLayer = new RequiredLayer();

            getRequiredLayer.ShowDialog();
            selectedLayer  = getRequiredLayer.getLayerName();
            selectedColour = getRequiredLayer.getSelectedColor();
            while (true)
            {
                go.ClearCommandOptions();
                borderSizeOption = new Rhino.Input.Custom.OptionDouble(border);
                go.AddOptionDouble("Borders", ref borderSizeOption);
                // perform the get operation. This will prompt the user to select the list of curves, but also
                // allow for command line options defined above
                GetResult result = go.GetMultiple(1, 0);

                if (result == GetResult.Option)
                {
                    border = borderSizeOption.CurrentValue;
                    go.EnablePreSelect(false, true);
                    continue;
                }
                else if (result == GetResult.Number)
                {
                    border = go.Number();
                    continue;
                }
                else if (result != GetResult.Object)
                {
                    return(Result.Cancel);
                }

                if (go.ObjectsWerePreselected)
                {
                    go.EnablePreSelect(false, true);
                    continue;
                }

                break;
            }

            int objecTCount = go.ObjectCount;

            border = borderSizeOption.CurrentValue;

            foreach (ObjRef objRef in go.Objects())
            {
                Curve curve = objRef.Curve();

                // If curve is null, means objRef is not a curve
                if (curve == null)
                {
                    continue;
                }

                // If curve is not Closed Curve
                if (curve.IsClosed == false)
                {
                    RhinoApp.WriteLine(objRef.ToString() + " curve is open");
                    continue;
                }

                if (curve.IsPlanar() == false)
                {
                    RhinoApp.WriteLine(objRef.ToString() + " curve is not planar");
                    continue;
                }

                // Process the curve
                Plane   plane = Rhino.Geometry.Plane.WorldXY;
                Curve[] offsetCurves;

                int layerIndex = doc.Layers.CurrentLayerIndex;
                RhinoUtilities.SetActiveLayer(selectedLayer, selectedColour);

                //if (curve.TryGetPlane(out plane))
                //{
                if (border < 0) //If the border is negative, it means the border should be drawn outside the perimeter
                {
                    plane.XAxis = -plane.XAxis;
                    plane.YAxis = -plane.YAxis;
                    plane.ZAxis = -plane.ZAxis;

                    offsetCurves = curve.Offset(plane, border, 0.1, Rhino.Geometry.CurveOffsetCornerStyle.Sharp);
                }
                else
                {
                    offsetCurves = curve.Offset(plane, -border, 0.1, Rhino.Geometry.CurveOffsetCornerStyle.Sharp);
                }

                //Check if the curve is outside border and border is a positive
                if (curve.Contains(offsetCurves[0].PointAtStart, Plane.WorldXY, 0) == PointContainment.Outside && border > 0)
                {
                    offsetCurves = curve.Offset(plane, border, 0.1, Rhino.Geometry.CurveOffsetCornerStyle.Sharp); //if true, then try to set the curve to be within the border
                }

                //Check if the curve is within the border and border is a negative
                if (curve.Contains(offsetCurves[0].PointAtStart, Plane.WorldXY, 0) == PointContainment.Inside && border < 0)
                {
                    offsetCurves = curve.Offset(plane, -border, 0.1, Rhino.Geometry.CurveOffsetCornerStyle.Sharp); //if true, then try to set the curve to be outside the border
                }

                foreach (Curve c in offsetCurves)
                {
                    doc.Objects.AddCurve(c);
                }


                doc.Layers.SetCurrentLayerIndex(layerIndex, true);
            }

            doc.Views.Redraw();

            Properties.Settings.Default.PanelBorderDefault = border;
            Properties.Settings.Default.Save();

            return(Result.Success);
        }
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            // For this example we will use a GetPoint class, but all of the custom
            // "Get" classes support command line options.
            Rhino.Input.Custom.GetObject go = new Rhino.Input.Custom.GetObject();
            go.SetCommandPrompt("Select panels to create fixing holes");
            //get the default values for the properties
            double holeSize   = Properties.Settings.Default.FixingHoleSize;
            double offsetX    = Properties.Settings.Default.FixingHoleOffsetX;
            double offsetY    = Properties.Settings.Default.FixingHoleOffsetY;
            double spacing    = Properties.Settings.Default.FixingHoleSpacing;
            double minSpacing = Properties.Settings.Default.FixingHoleMinimum;

            // set up the options
            Rhino.Input.Custom.OptionDouble holeSizeOption   = new Rhino.Input.Custom.OptionDouble(holeSize);
            Rhino.Input.Custom.OptionDouble offsetXOption    = new Rhino.Input.Custom.OptionDouble(offsetX);
            Rhino.Input.Custom.OptionDouble offsetYOption    = new Rhino.Input.Custom.OptionDouble(offsetY);
            Rhino.Input.Custom.OptionDouble spacingOption    = new Rhino.Input.Custom.OptionDouble(spacing);
            Rhino.Input.Custom.OptionDouble minSpacingOption = new Rhino.Input.Custom.OptionDouble(minSpacing);


            //using option to get values and save automatically(only if user enters)
            go.AddOptionDouble("HoleSize", ref holeSizeOption);
            go.AddOptionDouble("OffsetX", ref offsetXOption);
            go.AddOptionDouble("OffsetY", ref offsetYOption);
            go.AddOptionDouble("Spacing", ref spacingOption);
            go.AddOptionDouble("MinSpacing", ref minSpacingOption);

            go.AcceptNumber(true, true);
            go.GeometryFilter  = Rhino.DocObjects.ObjectType.Curve;
            go.GroupSelect     = true;
            go.SubObjectSelect = false;
            go.EnableClearObjectsOnEntry(false);
            go.EnableUnselectObjectsOnExit(false);
            go.DeselectAllBeforePostSelect = false;
            go.EnableSelPrevious(true);
            go.EnablePreSelect(true, false);

            go.GeometryFilter = Rhino.DocObjects.ObjectType.Curve;

            while (true)
            {
                go.ClearCommandOptions();
                holeSizeOption   = new Rhino.Input.Custom.OptionDouble(holeSize);
                offsetXOption    = new Rhino.Input.Custom.OptionDouble(offsetX);
                offsetYOption    = new Rhino.Input.Custom.OptionDouble(offsetY);
                spacingOption    = new Rhino.Input.Custom.OptionDouble(spacing);
                minSpacingOption = new Rhino.Input.Custom.OptionDouble(minSpacing);

                go.AddOptionDouble("HoleSize", ref holeSizeOption);
                go.AddOptionDouble("OffsetX", ref offsetXOption);
                go.AddOptionDouble("OffsetY", ref offsetYOption);
                go.AddOptionDouble("Spacing", ref spacingOption);
                go.AddOptionDouble("MinSpacing", ref minSpacingOption);
                // perform the get operation. This will prompt the user to select the list of curves, but also
                // allow for command line options defined above
                GetResult result = go.GetMultiple(1, 0);

                if (result == GetResult.Option)
                {
                    holeSize   = holeSizeOption.CurrentValue;
                    offsetX    = offsetXOption.CurrentValue;
                    offsetY    = offsetYOption.CurrentValue;
                    spacing    = spacingOption.CurrentValue;
                    minSpacing = minSpacingOption.CurrentValue;
                    go.EnablePreSelect(false, true);
                    continue;
                }
                //else if (result == GetResult.Number)
                //{
                //   border = go.Number();
                //   continue;
                //}
                else if (result != GetResult.Object)
                {
                    return(Result.Cancel);
                }

                if (go.ObjectsWerePreselected)
                {
                    go.EnablePreSelect(false, true);
                    continue;
                }

                break;
            }

            int objecTCount = go.ObjectCount;

            foreach (ObjRef objRef in go.Objects())
            {
                Curve curve = objRef.Curve();

                // If curve is null, means objRef is not a curve
                if (curve == null)
                {
                    continue;
                }

                // If curve is not Closed Curve
                if (curve.IsClosed == false)
                {
                    RhinoApp.WriteLine(objRef.ToString() + " curve is open");
                    continue;
                }

                if (curve.IsPlanar() == false)
                {
                    RhinoApp.WriteLine(objRef.ToString() + " curve is not planar");
                    continue;
                }


                // Find the boundary
                BoundingBox boundingBox = curve.GetBoundingBox(Plane.WorldXY);
                Point3d     min         = boundingBox.Min;
                Point3d     max         = boundingBox.Max;

                List <Point3d> pointsList = new List <Point3d> ();

                // Calculate top and bottom fixing holes
                double runningX = min.X + offsetX; //25
                double runningY = max.Y - offsetY; //-626.5

                Point3d point;

                while (runningX < (max.X - offsetX) - minSpacing)
                {
                    point = new Point3d(runningX, runningY, 0);
                    pointsList.Add(point);

                    point = new Point3d(runningX, min.Y + offsetY, 0);
                    pointsList.Add(point);

                    runningX = runningX + spacing;
                }

                point = new Point3d(max.X - offsetX, runningY, 0); //adds the top right fixing hole
                pointsList.Add(point);

                point = new Point3d(max.X - offsetX, min.Y + offsetY, 0); //adds the bottom right fixing hole
                pointsList.Add(point);

                runningY = runningY - spacing;

                // Calculate the sides
                while (runningY > (min.Y - offsetY) + minSpacing)
                {
                    point = new Point3d(min.X + offsetX, runningY, 0); //adds the left fixing holes
                    pointsList.Add(point);

                    point = new Point3d(max.X - offsetX, runningY, 0); //adds the right fixing hole
                    pointsList.Add(point);

                    runningY = runningY - spacing;
                }

                // Process the curve
                Plane plane = Rhino.Geometry.Plane.WorldXY;

                int layerIndex = doc.Layers.CurrentLayerIndex;

                RhinoUtilities.SetActiveLayer("Fixing Holes", System.Drawing.Color.Black);

                // Draw all the holes
                Round round = new Round();
                round.X = holeSize;


                foreach (Point3d p in pointsList)
                {
                    round.drawTool(p);
                }

                //Round round = new Round();
                //round.X = holeSize;
                //round.drawTool(point);


                //offsetCurves = curve.Offset(plane, -border, 0.1, Rhino.Geometry.CurveOffsetCornerStyle.Sharp);

                //if (curve.Contains(offsetCurves[0].PointAtStart, Plane.WorldXY, 0) == PointContainment.Outside)
                //{
                //   offsetCurves = curve.Offset(plane, border, 0.1, Rhino.Geometry.CurveOffsetCornerStyle.Sharp);
                //}


                //foreach (Curve c in offsetCurves)
                //{
                //   doc.Objects.AddCurve(c);
                //}
                //// }

                doc.Layers.SetCurrentLayerIndex(layerIndex, true);
            }

            doc.Views.Redraw();

            Properties.Settings.Default.FixingHoleSize    = holeSize;
            Properties.Settings.Default.FixingHoleOffsetX = offsetX;
            Properties.Settings.Default.FixingHoleOffsetY = offsetY;
            Properties.Settings.Default.FixingHoleSpacing = spacing;
            Properties.Settings.Default.FixingHoleMinimum = minSpacing;
            Properties.Settings.Default.Save();

            return(Result.Success);
        }
  public static Rhino.Commands.Result GetMultipleWithOptions(Rhino.RhinoDoc doc)
  {
    const Rhino.DocObjects.ObjectType geometryFilter = Rhino.DocObjects.ObjectType.Surface | 
                                                       Rhino.DocObjects.ObjectType.PolysrfFilter | 
                                                       Rhino.DocObjects.ObjectType.Mesh;
    int integer1 = 300;
    int integer2 = 300;

    Rhino.Input.Custom.OptionInteger optionInteger1 = new Rhino.Input.Custom.OptionInteger(integer1, 200, 900);
    Rhino.Input.Custom.OptionInteger optionInteger2 = new Rhino.Input.Custom.OptionInteger(integer2, 200, 900);

    Rhino.Input.Custom.GetObject go = new Rhino.Input.Custom.GetObject();
    go.SetCommandPrompt("Select surfaces, polysurfaces, or meshes");
    go.GeometryFilter = geometryFilter;
    go.AddOptionInteger("Option1", ref optionInteger1);
    go.AddOptionInteger("Option2", ref optionInteger2);
    go.GroupSelect = true;
    go.SubObjectSelect = false;
    go.EnableClearObjectsOnEntry(false);
    go.EnableUnselectObjectsOnExit(false);
    go.DeselectAllBeforePostSelect = false;

    bool bHavePreselectedObjects = false;

    for (; ; )
    {
      Rhino.Input.GetResult res = go.GetMultiple(1, 0);

      if (res == Rhino.Input.GetResult.Option)
      {
        go.EnablePreSelect(false, true);
        continue;
      }

      else if (res != Rhino.Input.GetResult.Object)
        return Rhino.Commands.Result.Cancel;

      if (go.ObjectsWerePreselected)
      {
        bHavePreselectedObjects = true;
        go.EnablePreSelect(false, true);
        continue;
      }

      break;
    }

    if (bHavePreselectedObjects)
    {
      // Normally when command finishes, pre-selected objects will remain
      // selected, when and post-selected objects will be unselected.
      // With this sample, it is possible to have a combination of 
      // pre-selected and post-selected objects. To make sure everything
      // "looks the same", unselect everything before finishing the command.
      for (int i = 0; i < go.ObjectCount; i++)
      {
        Rhino.DocObjects.RhinoObject rhinoObject = go.Object(i).Object();
        if (null != rhinoObject)
          rhinoObject.Select(false);
      }
      doc.Views.Redraw();
    }

    int objectCount = go.ObjectCount;
    integer1 = optionInteger1.CurrentValue;
    integer2 = optionInteger2.CurrentValue;

    Rhino.RhinoApp.WriteLine("Select object count = {0}", objectCount);
    Rhino.RhinoApp.WriteLine("Value of integer1 = {0}", integer1);
    Rhino.RhinoApp.WriteLine("Value of integer2 = {0}", integer2);

    return Rhino.Commands.Result.Success;
  }
示例#13
0
        private Tuple <Brep[], Dictionary <int, List <Guid> > > GetObjectsToNest()
        {
            //Select Objects To Nest

            const Rhino.DocObjects.ObjectType geometryFilter =
                Rhino.DocObjects.ObjectType.Annotation |
                Rhino.DocObjects.ObjectType.TextDot |
                Rhino.DocObjects.ObjectType.Point |
                Rhino.DocObjects.ObjectType.Curve |
                Rhino.DocObjects.ObjectType.Surface |
                Rhino.DocObjects.ObjectType.PolysrfFilter |
                Rhino.DocObjects.ObjectType.Mesh;

            Rhino.Input.Custom.GetObject go = new Rhino.Input.Custom.GetObject();
            go.SetCommandPrompt("OpenNest: Select objects for nesting");
            go.GeometryFilter  = geometryFilter;
            go.GroupSelect     = false;
            go.SubObjectSelect = false;
            go.EnableClearObjectsOnEntry(true);
            go.EnableUnselectObjectsOnExit(true);
            go.DeselectAllBeforePostSelect = false;


            bool bHavePreselectedObjects = false;

            for (; ;)
            {
                Rhino.Input.GetResult res = go.GetMultiple(1, 0);

                if (res == Rhino.Input.GetResult.Option)
                {
                    go.EnablePreSelect(false, true);
                    continue;
                }
                else if (res != Rhino.Input.GetResult.Object)
                {
                    return(null);//Rhino.Commands.Result.Cancel;
                }
                if (go.ObjectsWerePreselected)
                {
                    bHavePreselectedObjects = true;
                    go.EnablePreSelect(false, true);
                    continue;
                }

                break;
            }

            if (bHavePreselectedObjects)
            {
                // Normally when command finishes, pre-selected objects will remain
                // selected, when and post-selected objects will be unselected.
                // With this sample, it is possible to have a combination of
                // pre-selected and post-selected objects. To make sure everything
                // "looks the same", unselect everything before finishing the command.
                for (int i = 0; i < go.ObjectCount; i++)
                {
                    Rhino.DocObjects.RhinoObject rhinoObject = go.Object(i).Object();

                    if (null != rhinoObject)
                    {
                        rhinoObject.Select(false);
                    }
                }
                //doc.Views.Redraw();
            }

            List <Guid> guids = new List <Guid>();

            for (int i = 0; i < go.ObjectCount; i++)
            {
                guids.Add(go.Object(i).ObjectId);
            }

            Tuple <Brep[], Dictionary <int, List <Guid> > > data = OpenNestLib.OpenNestUtil.SortGuidsByPlanarCurves(guids, this.cp);

            Rhino.RhinoApp.WriteLine("OpenNest: Select object count = {0}", go.ObjectCount);
            this.n = data.Item1.Length;
            Rhino.RhinoDoc.ActiveDoc.Views.Redraw();
            return(data);
        }