protected override Result RunCommand(RhinoDoc doc, RunMode mode)
    {
      m_doc = doc;

      m_window = new Window {Title = "Object ID and Thread ID", Width = 500, Height = 75};
      m_label = new Label();
      m_window.Content = m_label;
      new System.Windows.Interop.WindowInteropHelper(m_window).Owner = Rhino.RhinoApp.MainWindowHandle();
      m_window.Show();


      // register the rhinoObjectAdded method with the AddRhinoObject event
      RhinoDoc.AddRhinoObject += RhinoObjectAdded;

      // add a sphere from the main UI thread.  All is good
      AddSphere(new Point3d(0,0,0));

      // add a sphere from a secondary thread. Not good: the rhinoObjectAdded method
      // doesn't work well when called from another thread
      var add_sphere_delegate = new Action<Point3d>(AddSphere);
      add_sphere_delegate.BeginInvoke(new Point3d(0, 10, 0), null, null);

      // handle the AddRhinoObject event with rhinoObjectAddedSafe which is
      // desgined to work no matter which thread the call is comming from.
      RhinoDoc.AddRhinoObject -= RhinoObjectAdded;
      RhinoDoc.AddRhinoObject += RhinoObjectAddedSafe;

      // try again adding a sphere from a secondary thread.  All is good!
      add_sphere_delegate.BeginInvoke(new Point3d(0, 20, 0), null, null);

      doc.Views.Redraw();

      return Result.Success;
    }
Beispiel #2
0
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            var gp = new GetPoint();
            gp.SetCommandPrompt("Start:");
            
            if (gp.Get() != GetResult.Point)
            {
                RhinoApp.WriteLine("No point selected.");
                return gp.CommandResult();
            }

            var location = gp.Point();

            var dialog = new BBTextDialog();

            if (dialog.ShowDialog()!= true)
                return Result.Cancel;

            var typeWriter = dialog.Bold ? Typewriter.Bold : Typewriter.Regular;

            var x = doc.Views.ActiveView.ActiveViewport.CameraX;
            var y = doc.Views.ActiveView.ActiveViewport.CameraY;

            var unitX = x * dialog.Size;
            var unitY = y * dialog.Size;

            var curves = typeWriter.Write(dialog.Text, location, unitX, unitY, dialog.HAlign, dialog.VAlign);
            
            doc.Groups.Add(curves.Select(curve => doc.Objects.AddCurve(curve)));

            doc.Views.Redraw();

            return Result.Success;
        }
    public static Result MeshVolume(RhinoDoc doc)
    {
        var gm = new GetObject();
        gm.SetCommandPrompt("Select solid meshes for volume calculation");
        gm.GeometryFilter = ObjectType.Mesh;
        gm.GeometryAttributeFilter = GeometryAttributeFilter.ClosedMesh;
        gm.SubObjectSelect = false;
        gm.GroupSelect = true;
        gm.GetMultiple(1, 0);
        if (gm.CommandResult() != Result.Success)
          return gm.CommandResult();

        double volume = 0.0;
        double volume_error = 0.0;
        foreach (var obj_ref in gm.Objects())
        {
          if (obj_ref.Mesh() != null)
          {
        var mass_properties = VolumeMassProperties.Compute(obj_ref.Mesh());
        if (mass_properties != null)
        {
          volume += mass_properties.Volume;
          volume_error += mass_properties.VolumeError;
        }
          }
        }

        RhinoApp.WriteLine("Total volume = {0:f} (+/- {1:f})", volume, volume_error);
        return Result.Success;
    }
    public static Result ReparameterizeCurve(RhinoDoc doc)
    {
        ObjRef obj_ref;
        var rc = RhinoGet.GetOneObject("Select curve to reparameterize", false, ObjectType.Curve, out obj_ref);
        if (rc != Result.Success)
          return rc;
        var curve = obj_ref.Curve();
        if (curve == null)
          return Result.Failure;

        double domain_start = 0;
        rc = RhinoGet.GetNumber("Domain start", false, ref domain_start);
        if (rc != Result.Success)
          return rc;

        double domain_end = 0;
        rc = RhinoGet.GetNumber("Domain end", false, ref domain_end);
        if (rc != Result.Success)
          return rc;

        if (Math.Abs(curve.Domain.T0 - domain_start) < RhinoMath.ZeroTolerance &&
        Math.Abs(curve.Domain.T1 - domain_end) < RhinoMath.ZeroTolerance)
          return Result.Nothing;

        var curve_copy = curve.DuplicateCurve();
        curve_copy.Domain = new Interval(domain_start, domain_end);
        if (!doc.Objects.Replace(obj_ref, curve_copy))
          return Result.Failure;
        else
        {
          doc.Views.Redraw();
          return Result.Success;
        }
    }
 public static Rhino.Commands.Result SelByUserText(RhinoDoc doc)
 {
     // You don't have to override RunCommand if you don't need any user input. In
     // this case we want to get a key from the user. If you return something other
     // than Success, the selection is canceled
     return Rhino.Input.RhinoGet.GetString("key", true, ref m_key);
 }
    public static Result ReplaceHatchPattern(RhinoDoc doc)
    {
        ObjRef[] obj_refs;
        var rc = RhinoGet.GetMultipleObjects("Select hatches to replace", false, ObjectType.Hatch, out obj_refs);
        if (rc != Result.Success || obj_refs == null)
          return rc;

        var gs = new GetString();
        gs.SetCommandPrompt("Name of replacement hatch pattern");
        gs.AcceptNothing(false);
        gs.Get();
        if (gs.CommandResult() != Result.Success)
          return gs.CommandResult();
        var hatch_name = gs.StringResult();

        var pattern_index = doc.HatchPatterns.Find(hatch_name, true);

        if (pattern_index < 0)
        {
          RhinoApp.WriteLine("The hatch pattern \"{0}\" not found  in the document.", hatch_name);
          return Result.Nothing;
        }

        foreach (var obj_ref in obj_refs)
        {
          var hatch_object = obj_ref.Object() as HatchObject;
          if (hatch_object.HatchGeometry.PatternIndex != pattern_index)
          {
        hatch_object.HatchGeometry.PatternIndex = pattern_index;
        hatch_object.CommitChanges();
          }
        }
        doc.Views.Redraw();
        return Result.Success;
    }
    public static Result ModifyObjectColor(RhinoDoc doc)
    {
        ObjRef obj_ref;
        var rc = RhinoGet.GetOneObject("Select object", false, ObjectType.AnyObject, out obj_ref);
        if (rc != Result.Success)
          return rc;
        var rhino_object = obj_ref.Object();
        var color = rhino_object.Attributes.ObjectColor;
        bool b = Rhino.UI.Dialogs.ShowColorDialog(ref color);
        if (!b) return Result.Cancel;

        rhino_object.Attributes.ObjectColor = color;
        rhino_object.Attributes.ColorSource = ObjectColorSource.ColorFromObject;
        rhino_object.CommitChanges();

        // an object's color attributes can also be specified
        // when the object is added to Rhino
        var sphere = new Sphere(Point3d.Origin, 5.0);
        var attributes = new ObjectAttributes();
        attributes.ObjectColor = Color.CadetBlue;
        attributes.ColorSource = ObjectColorSource.ColorFromObject;
        doc.Objects.AddSphere(sphere, attributes);

        doc.Views.Redraw();
        return Result.Success;
    }
    public static Result SetActiveView(RhinoDoc doc)
    {
        // view and view names
        var active_view_name = doc.Views.ActiveView.ActiveViewport.Name;

        var non_active_views =
          doc.Views
          .Where(v => v.ActiveViewport.Name != active_view_name)
          .ToDictionary(v => v.ActiveViewport.Name, v => v);

        // get name of view to set active
        var gs = new GetString();
        gs.SetCommandPrompt("Name of view to set active");
        gs.AcceptNothing(true);
        gs.SetDefaultString(active_view_name);
        foreach (var view_name in non_active_views.Keys)
          gs.AddOption(view_name);
        var result = gs.Get();
        if (gs.CommandResult() != Result.Success)
          return gs.CommandResult();

        var selected_view_name =
          result == GetResult.Option ? gs.Option().EnglishName : gs.StringResult();

        if (selected_view_name != active_view_name)
          if (non_active_views.ContainsKey(selected_view_name))
        doc.Views.ActiveView = non_active_views[selected_view_name];
          else
        RhinoApp.WriteLine("\"{0}\" is not a view name", selected_view_name);

        return Rhino.Commands.Result.Success;
    }
  protected override Rhino.Commands.Result RunCommand(RhinoDoc doc, Rhino.Commands.RunMode mode)
  {
    // make sure our custom visual analysis mode is registered
    var zmode = Rhino.Display.VisualAnalysisMode.Register(typeof(ZAnalysisMode));

    const ObjectType filter = Rhino.DocObjects.ObjectType.Surface | Rhino.DocObjects.ObjectType.PolysrfFilter | Rhino.DocObjects.ObjectType.Mesh;
    Rhino.DocObjects.ObjRef[] objs;
    var rc = Rhino.Input.RhinoGet.GetMultipleObjects("Select objects for Z analysis", false, filter, out objs);
    if (rc != Rhino.Commands.Result.Success)
      return rc;

    int count = 0;
    for (int i = 0; i < objs.Length; i++)
    {
      var obj = objs[i].Object();

      // see if this object is alreay in Z analysis mode
      if (obj.InVisualAnalysisMode(zmode))
        continue;

      if (obj.EnableVisualAnalysisMode(zmode, true))
        count++;
    }
    doc.Views.Redraw();
    RhinoApp.WriteLine("{0} objects were put into Z-Analysis mode.", count);
    return Rhino.Commands.Result.Success;
  }
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            Loop loop = new Loop();
            loop.Run(doc);

            return Result.Success;
        }
    public static Result Ortho(RhinoDoc doc)
    {
        var gp = new GetPoint();
        gp.SetCommandPrompt("Start of line");
        gp.Get();
        if (gp.CommandResult() != Result.Success)
          return gp.CommandResult();
        var start_point = gp.Point();

        var original_ortho = ModelAidSettings.Ortho;
        if (!original_ortho)
          ModelAidSettings.Ortho = true;

        gp.SetCommandPrompt("End of line");
        gp.SetBasePoint(start_point, false);
        gp.DrawLineFromPoint(start_point, true);
        gp.Get();
        if (gp.CommandResult() != Result.Success)
          return gp.CommandResult();
        var end_point = gp.Point();

        if (ModelAidSettings.Ortho != original_ortho)
          ModelAidSettings.Ortho = original_ortho;

        doc.Objects.AddLine(start_point, end_point);
        doc.Views.Redraw();
        return Result.Success;
    }
    public static Result DrawMesh(RhinoDoc doc)
    {
        var gs = new GetObject();
        gs.SetCommandPrompt("select sphere");
        gs.GeometryFilter = ObjectType.Surface;
        gs.DisablePreSelect();
        gs.SubObjectSelect = false;
        gs.Get();
        if (gs.CommandResult() != Result.Success)
          return gs.CommandResult();

        Sphere sphere;
        gs.Object(0).Surface().TryGetSphere(out sphere);
        if (sphere.IsValid)
        {
          var mesh = Mesh.CreateFromSphere(sphere, 10, 10);
          if (mesh == null)
        return Result.Failure;

          var conduit = new DrawBlueMeshConduit(mesh) {Enabled = true};
          doc.Views.Redraw();

          var in_str = "";
          Rhino.Input.RhinoGet.GetString("press <Enter> to continue", true, ref in_str);

          conduit.Enabled = false;
          doc.Views.Redraw();
          return Result.Success;
        }
        else
          return Result.Failure;
    }
    /// <summary>
    /// Commmand.RunCommand override
    /// </summary>
    protected override Rhino.Commands.Result RunCommand(RhinoDoc doc, RunMode mode)
    {
        Rhino.Commands.Result rc = Rhino.Commands.Result.Success;

        if (!_bIsLoaded)
        {
          string script = ScriptFromResources(ResourceName, Password);
          if (!string.IsNullOrEmpty(script))
          {
        string macro = string.Format("_-RunScript ({0})", script);
        if (RhinoApp.RunScript(macro, false))
          _bIsLoaded = true;
        else
          rc = Result.Failure;
          }
        }

        if (rc == Result.Success)
        {
          string macro = string.Format("_-RunScript ({0})", EnglishName);
          RhinoApp.RunScript(macro, false);
        }

        return rc;
    }
 public static Result ViewportResolution(RhinoDoc doc)
 {
     var active_viewport = doc.Views.ActiveView.ActiveViewport;
     RhinoApp.WriteLine("Name = {0}: Width = {1}, Height = {2}",
       active_viewport.Name, active_viewport.Size.Width, active_viewport.Size.Height);
     return Result.Success;
 }
    public static Result NurbsCurveIncreaseDegree(RhinoDoc doc)
    {
        ObjRef obj_ref;
        var rc = RhinoGet.GetOneObject(
          "Select curve", false, ObjectType.Curve, out obj_ref);
        if (rc != Result.Success) return rc;
        if (obj_ref == null) return Result.Failure;
        var curve = obj_ref.Curve();
        if (curve == null) return Result.Failure;
        var nurbs_curve = curve.ToNurbsCurve();

        int new_degree = -1;
        rc = RhinoGet.GetInteger(string.Format("New degree <{0}...11>", nurbs_curve.Degree), true, ref new_degree,
          nurbs_curve.Degree, 11);
        if (rc != Result.Success) return rc;

        rc = Result.Failure;
        if (nurbs_curve.IncreaseDegree(new_degree))
          if (doc.Objects.Replace(obj_ref.ObjectId, nurbs_curve))
        rc = Result.Success;

        RhinoApp.WriteLine("Result: {0}", rc.ToString());
        doc.Views.Redraw();
        return rc;
    }
Beispiel #16
0
 public void BakeGeometry(RhinoDoc doc, ObjectAttributes att, List<Guid> obj_ids)
 {
     List<Text3d>.Enumerator tag;
     if (att == null)
     {
     att = doc.CreateDefaultAttributes();
     }
     try
     {
     tag = this.m_tags.GetEnumerator();
     while (tag.MoveNext())
     {
         Text3d tag3d = tag.Current;
         Guid id = doc.Objects.AddText(tag3d, att);
         if (!(id == Guid.Empty))
         {
             obj_ids.Add(id);
         }
     }
     }
     finally
     {
        tag.Dispose();
     }
 }
 protected override Rhino.Commands.Result RunCommand(RhinoDoc doc, Rhino.Commands.RunMode mode)
 {
     // You don't have to override RunCommand if you don't need any user input. In
       // this case we want to get a key from the user. If you return something other
       // than Success, the selection is canceled
       return Rhino.Input.RhinoGet.GetString("key", true, ref m_key);
 }
    protected override Result RunCommand(RhinoDoc doc, RunMode mode)
    {
      var points = new List<Point3d>
      {
        new Point3d(0, 0, 0),
        new Point3d(0, 0, 1),
        new Point3d(0, 1, 0),
        new Point3d(0, 1, 1),
        new Point3d(1, 0, 0),
        new Point3d(1, 0, 1),
        new Point3d(1, 1, 0),
        new Point3d(1, 1, 1)
      };

      RhinoApp.WriteLine("Before sort ...");
      foreach (var point in points)
        RhinoApp.WriteLine("point: {0}", point);

      var sorted_points = Point3d.SortAndCullPointList(points, doc.ModelAbsoluteTolerance);

      RhinoApp.WriteLine("After sort ...");
      foreach (var point in sorted_points)
        RhinoApp.WriteLine("point: {0}", point);

      doc.Objects.AddPoints(sorted_points);
      doc.Views.Redraw();
      return Result.Success;
    }
    protected override Result RunCommand(RhinoDoc doc, RunMode mode)
    {
      var file_name = "";

      var bitmap = doc.Views.ActiveView.CaptureToBitmap(true, true, true);
      bitmap.MakeTransparent();

      // copy bitmap to clipboard
      Clipboard.SetImage(bitmap);

      // save bitmap to file
      var save_file_dialog = new Rhino.UI.SaveFileDialog
      {
        Filter = "*.bmp",
        InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
      };
      if (save_file_dialog.ShowDialog() == DialogResult.OK)
      {
        file_name = save_file_dialog.FileName;
      }

      if (file_name != "")
        bitmap.Save(file_name);

      return Rhino.Commands.Result.Success;
    }
    protected override Rhino.Commands.Result RunCommand(RhinoDoc doc, Rhino.Commands.RunMode mode)
    {
      var conduit = new PointsConduit(m_conduit_points);
      conduit.Enabled = true;

      var gp = new Rhino.Input.Custom.GetPoint();
      while (true)
      {
        gp.SetCommandPrompt("click location to create point. (<ESC> exit)");
        gp.AcceptNothing(true);
        gp.Get();
        if (gp.CommandResult() != Rhino.Commands.Result.Success)
          break;
        m_conduit_points.Add(new ConduitPoint(gp.Point()));
        doc.Views.Redraw();
      }

      var gcp = new GetConduitPoint(m_conduit_points);
      while (true)
      {
        gcp.SetCommandPrompt("select conduit point. (<ESC> to exit)");
        gcp.AcceptNothing(true);
        gcp.Get(true);
        doc.Views.Redraw();
        if (gcp.CommandResult() != Rhino.Commands.Result.Success)
          break;
      }

      return Rhino.Commands.Result.Success;
    }
    protected override Result RunCommand(RhinoDoc doc, RunMode mode)
    {
      Rhino.DocObjects.ObjRef objref;
      var rc = RhinoGet.GetOneObject("Select curve", true, ObjectType.Curve,out objref);
      if(rc!= Result.Success)
        return rc;
      var curve = objref.Curve();
      if( curve==null )
        return Result.Failure;

      var gp = new GetPoint();
      gp.SetCommandPrompt("Pick a location on the curve");
      gp.Constrain(curve, false);
      gp.Get();
      if (gp.CommandResult() != Result.Success)
        return gp.CommandResult();

      var point = gp.Point();
      double closest_point_param;
      if (curve.ClosestPoint(point, out closest_point_param))
      {
        RhinoApp.WriteLine("point: ({0}), parameter: {1}", point, closest_point_param);
        doc.Objects.AddPoint(point);
        doc.Views.Redraw();
      }
      return 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;
    }
    public static Result CopyGroups(RhinoDoc doc)
    {
        var go = new Rhino.Input.Custom.GetObject();
        go.SetCommandPrompt("Select objects to copy in place");
        go.GroupSelect = true;
        go.SubObjectSelect = false;
        go.GetMultiple(1, 0);
        if (go.CommandResult() != Result.Success)
          return go.CommandResult();

        var xform = Transform.Identity;
        var group_map = new Dictionary<int, int>();

        foreach (var obj_ref in go.Objects())
        {
          if (obj_ref != null)
          {
        var obj = obj_ref.Object();
        var duplicate = doc.Objects.Transform(obj_ref.ObjectId, xform, false);
        RhinoUpdateObjectGroups(ref obj, ref group_map);
          }
        }
        doc.Views.Redraw();
        return Result.Success;
    }
 protected override Result RunCommand(RhinoDoc doc, RunMode mode)
 {
     RcCore.It.EngineSettings.SaveDebugImages = !RcCore.It.EngineSettings.SaveDebugImages;
     var saving = RcCore.It.EngineSettings.SaveDebugImages ? "Saving" : "Not saving";
     RhinoApp.WriteLine($"{saving} debug images");
     return Result.Success;
 }
    public static Result CreateMeshFromBrep(RhinoDoc doc)
    {
        ObjRef obj_ref;
        var rc = RhinoGet.GetOneObject("Select surface or polysurface to mesh", true, ObjectType.Surface | ObjectType.PolysrfFilter, out obj_ref);
        if (rc != Result.Success)
          return rc;
        var brep = obj_ref.Brep();
        if (null == brep)
          return Result.Failure;

        // you could choose anyone of these for example
        var jagged_and_faster = MeshingParameters.Coarse;
        var smooth_and_slower = MeshingParameters.Smooth;
        var default_mesh_params = MeshingParameters.Default;
        var minimal = MeshingParameters.Minimal;

        var meshes = Mesh.CreateFromBrep(brep, smooth_and_slower);
        if (meshes == null || meshes.Length == 0)
          return Result.Failure;

        var brep_mesh = new Mesh();
        foreach (var mesh in meshes)
          brep_mesh.Append(mesh);
        doc.Objects.AddMesh(brep_mesh);
        doc.Views.Redraw();

        return Result.Success;
    }
    protected override Result RunCommand(RhinoDoc doc, RunMode mode)
    {
      // Get the name of the instance definition to rename
      string instance_definition_name = "";
      var rc = RhinoGet.GetString("Name of block to delete", true, ref instance_definition_name);
      if (rc != Result.Success)
        return rc;
      if (string.IsNullOrWhiteSpace(instance_definition_name))
        return Result.Nothing;
     
      // Verify instance definition exists
      var instance_definition = doc.InstanceDefinitions.Find(instance_definition_name, true);
      if (instance_definition == null) {
        RhinoApp.WriteLine("Block \"{0}\" not found.", instance_definition_name);
        return Result.Nothing;
      }

      // Verify instance definition can be deleted
      if (instance_definition.IsReference) {
        RhinoApp.WriteLine("Unable to delete block \"{0}\".", instance_definition_name);
        return Result.Nothing;
      }

      // delete block and all references
      if (!doc.InstanceDefinitions.Delete(instance_definition.Index, true, true)) {
        RhinoApp.WriteLine("Could not delete {0} block", instance_definition.Name);
        return Result.Failure;
      }

      return Result.Success;
    }
Beispiel #27
0
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            Plugin.InitialiseCSycles();
            if (doc.Views.ActiveView.ActiveViewport.DisplayMode.Id == Guid.Parse("69E0C7A5-1C6A-46C8-B98B-8779686CD181"))
            {
                var rvp = doc.Views.ActiveView.RealtimeDisplayMode as RenderedViewport;

                if (rvp != null)
                {
                    var getNumber = new GetInteger();
                    getNumber.SetLowerLimit(1, true);
                    getNumber.SetDefaultInteger(rvp.HudMaximumPasses()+100);
                    getNumber.SetCommandPrompt("Set new sample count");
                    var getRc = getNumber.Get();
                    if (getNumber.CommandResult() != Result.Success) return getNumber.CommandResult();
                    if (getRc == GetResult.Number)
                    {
                        var nr = getNumber.Number();
                        RhinoApp.WriteLine($"User changes samples to {nr}");
                        rvp.ChangeSamples(nr);
                        return Result.Success;
                    }
                }
            }

            RhinoApp.WriteLine("Active view isn't rendering with Cycles");

            return Result.Nothing;
        }
    public static Result Leader(RhinoDoc doc)
    {
        var points = new Point3d[]
        {
          new Point3d(1, 1, 0),
          new Point3d(5, 1, 0),
          new Point3d(5, 5, 0),
          new Point3d(9, 5, 0)
        };

        var xy_plane = Plane.WorldXY;

        var points2d = new List<Point2d>();
        foreach (var point3d in points)
        {
          double x, y;
          if (xy_plane.ClosestParameter(point3d, out x, out y))
          {
        var point2d = new Point2d(x, y);
        if (points2d.Count < 1 || point2d.DistanceTo(points2d.Last<Point2d>()) > RhinoMath.SqrtEpsilon)
          points2d.Add(point2d);
          }
        }

        doc.Objects.AddLeader(xy_plane, points2d);
        doc.Views.Redraw();
        return Result.Success;
    }
    public static Result PickPoint(RhinoDoc doc)
    {
        // this creates a point where the mouse is clicked.
        var gp = new GetPoint();
        gp.SetCommandPrompt("Click for new point");
        gp.Get();
        if (gp.CommandResult() != Result.Success)
          return gp.CommandResult();
        var point3d = gp.Point();
        doc.Objects.AddPoint(point3d);
        doc.Views.Redraw();

        // selects a point that already exists
        ObjRef obj_ref;
        var rc = RhinoGet.GetOneObject("Select point", false, ObjectType.Point, out obj_ref);
        if (rc != Result.Success)
          return rc;
        var point = obj_ref.Point();
        RhinoApp.WriteLine("Point: x:{0}, y:{1}, z:{2}",
          point.Location.X,
          point.Location.Y,
          point.Location.Z);
        doc.Objects.UnselectAll();

        // selects multiple points that already exist
        ObjRef[] obj_refs;
        rc = RhinoGet.GetMultipleObjects("Select point", false, ObjectType.Point, out obj_refs);
        if (rc != Result.Success)
          return rc;
        foreach (var o_ref in obj_refs)
        {
          point = o_ref.Point();
          RhinoApp.WriteLine("Point: x:{0}, y:{1}, z:{2}",
        point.Location.X,
        point.Location.Y,
        point.Location.Z);
        }
        doc.Objects.UnselectAll();

        // also selects a point that already exists.
        // Used when RhinoGet doesn't provide enough control
        var go = new GetObject();
        go.SetCommandPrompt("Select point");
        go.GeometryFilter = ObjectType.Point;
        go.GetMultiple(1, 0);
        if (go.CommandResult() != Result.Success)
          return go.CommandResult();
        foreach (var o_ref in  go.Objects())
        {
          point = o_ref.Point();
          if (point != null)
        RhinoApp.WriteLine("Point: x:{0}, y:{1}, z:{2}",
          point.Location.X,
          point.Location.Y,
          point.Location.Z);
        }

        doc.Views.Redraw();
        return Result.Success;
    }
    public static Result SelectObjectsInObjectGroups(RhinoDoc doc)
    {
        ObjRef obj_ref;
        var rs = RhinoGet.GetOneObject(
          "Select object", false, ObjectType.AnyObject, out obj_ref);
        if (rs != Result.Success)
          return rs;
        var rhino_object = obj_ref.Object();
        if (rhino_object == null)
          return Result.Failure;

        var rhino_object_groups = rhino_object.Attributes.GetGroupList().DefaultIfEmpty(-1);

        var selectable_objects= from obj in doc.Objects.GetObjectList(ObjectType.AnyObject)
                            where obj.IsSelectable(true, false, false, false)
                            select obj;

        foreach (var selectable_object in selectable_objects)
        {
          foreach (var group in selectable_object.Attributes.GetGroupList())
          {
        if (rhino_object_groups.Contains(group))
        {
            selectable_object.Select(true);
            continue;
        }
          }
        }
        doc.Views.Redraw();
        return Result.Success;
    }
Beispiel #31
0
        public static void DecomposeObj(RhinoDoc doc, Layer layer, RhinoObject obj, Brep brep, ref int progressCurrentIndex, ref int progressShowedPercent, int progressMax, bool beforeFixAllIssues, int objsInLayerCount = -1)
        {
            //if (objsInLayerCount == -1)
            //{
            //    objsInLayerCount = layer._GetObjsCount(doc, false, ObjectType.Brep);
            //}

            var newLayerIndex = GetNewLayer(doc, layer, obj, beforeFixAllIssues);
            int index         = 0;
            int nameLength    = 1;

            if (brep.Faces.Count >= 10)
            {
                nameLength = 2;
            }
            if (brep.Faces.Count >= 100)
            {
                nameLength = 3;
            }
            if (brep.Faces.Count >= 1000)
            {
                nameLength = 4;
            }
            if (brep.Faces.Count >= 10000)
            {
                nameLength = 5;
            }

            foreach (BrepFace face in brep.Faces_ThreadSafe())
            {
                index++;

                // Duplicate brep
                var face_copy = face.DuplicateFace(true);
                var id        = doc.Objects.AddBrep(face_copy, new ObjectAttributes()
                {
                    LayerIndex = newLayerIndex,
                    Visible    = true,
                    Name       = index.ToString("D" + nameLength),
                });

                // Add to group
                if (id != Guid.Empty && obj.GroupCount > 0)
                {
                    foreach (var groupId in obj.GetGroupList())
                    {
                        doc.Groups.AddToGroup(groupId, id);
                    }
                }

                // Show progress
                progressCurrentIndex++;
                var progressCurrentPercent = 100 - ((progressMax - progressCurrentIndex) * 100 / progressMax);
                if (progressCurrentPercent - progressShowedPercent >= 1)
                {
                    progressShowedPercent = progressCurrentPercent;
                    log.rawText(g.SolidNavigator, ".");
                }
            }

            obj._Delete();
        }
Beispiel #32
0
        /// <summary>
        /// Write rhino object to ArcGIS feature layer
        /// </summary>
        /// <param name="mapLayer"></param>
        /// <param name="ro"></param>
        public static async void ThrowItOverTheFence(BasicFeatureLayer mapLayer, RhinoObject ro, RhinoDoc rhinoDoc)
        {
            Mesh mesh = null;

            var createOperation = new EditOperation();

            var projection = mapLayer.GetSpatialReference();
            var origin     = getOrigin(rhinoDoc);

            switch (ro.Geometry.ObjectType)
            {
            case ObjectType.Point:
            {
                Point    pt = ro.Geometry as Point;
                MapPoint mp = ptToGis(pt.Location, origin);
                createOperation.Create(mapLayer, mp);
                await createOperation.ExecuteAsync();

                break;
            }

            case ObjectType.Surface:
            {
                Surface srf = ro.Geometry as Surface;
                if (!srf.IsPlanar())
                {
                    Console.Out.WriteLine($"Unable to send non-planar surfaces: Guid: ${ro.Id}");
                    break;
                }
                goto case ObjectType.Brep;
            }

            case ObjectType.Curve:
            {
                Curve c      = ro.Geometry as Curve;
                var   ptList = getPointsFromCurves(new List <Curve>()
                    {
                        c
                    });
                var gisPts   = ptList.Select(p => ptToGis(p, origin)).ToList();
                var polyline = PolylineBuilder.CreatePolyline(gisPts, projection);
                createOperation.Create(mapLayer, polyline);
                await createOperation.ExecuteAsync();

                break;
            }

            case ObjectType.Brep:
            {
                Brep brep = ro.Geometry as Brep;
                if (brep.IsSolid)
                {
                    mesh = Mesh.CreateFromBrep(brep, MeshingParameters.Default)[0];
                    goto case ObjectType.Mesh;
                }
                else
                {
                    var crvs = new List <Curve>();
                    foreach (BrepEdge ed in brep.Edges)
                    {
                        crvs.Add(ed.EdgeCurve);
                    }
                    var pts     = getPointsFromCurves(crvs);
                    var gisPts  = pts.Select(p => ptToGis(p, origin)).ToList();
                    var polygon = new PolygonBuilder(gisPts).ToGeometry();
                    createOperation.Create(mapLayer, polygon);
                    await createOperation.ExecuteAsync();

                    break;
                }
            }

            case ObjectType.Extrusion:
            {
                mesh = (ro.Geometry as Extrusion).GetMesh(MeshType.Default);
                goto case ObjectType.Mesh;
            }

            case ObjectType.Mesh:
            {
                mesh = mesh ?? ro.Geometry as Mesh;
                break;
            }

            default:
            {
                Console.Out.WriteLine($"Unable to send geometry type: ${ro.Geometry.ObjectType}");
                break;
            }
            }
        }
Beispiel #33
0
 public static void Zoom(RhinoDoc doc, IEnumerable<RhinoObject> objects, double fitFactor = 3, bool resetCameraPosition = false)
 {
     Zoom(doc, objects.Select(o => o.Geometry), fitFactor, resetCameraPosition);
 }
 internal Group(int index, RhinoDoc doc)
 {
     m_id      = UnsafeNativeMethods.CRhinoGroupTable_IdFromIndex(doc.RuntimeSerialNumber, index);
     m_doc     = doc;
     m__parent = m_doc;
 }
 internal GroupTable(RhinoDoc doc) : base(doc)
 {
 }
        /// <summary>
        /// Draws the perforation.
        /// </summary>
        /// <param name="boundaryCurve">The boundary curve.</param>
        /// <returns></returns>
        public override double drawPerforation(Curve boundaryCurve)
        {
            List <PointMap> pointMapList  = new List <PointMap>();
            Random          random        = new Random();
            PointMap        pointMapTool1 = new PointMap();
            int             tool0count    = 0;
            int             tool1count    = 0;
            int             tool2count    = 0;
            double          marginX;

            pointMapList.Add(pointMapTool1);

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

            double spanX = max.X - min.X;
            double spanY = max.Y - min.Y;

            double gap = xSpacing - punchingToolList[2].X;

            // Maximum punching qty
            int punchQtyX = ((int)((spanX - punchingToolList[2].X) / XSpacing)) + 1;

            // PunchQty need to add 1 if the last bit can fit the small rectangle
            if (spanX - (punchingToolList[2].X * punchQtyX) > (punchingToolList[0].X + gap))
            {
                punchQtyX = punchQtyX + 1;
            }

            // Find the location of the first punch
            if (spanX >= ((punchQtyX - 1) * XSpacing + punchingToolList[2].X))
            {
                marginX = (spanX - ((punchQtyX - 2) * XSpacing) - (punchingToolList[2].X) - gap) / 2;
            }
            else if (spanX >= ((punchQtyX - 1) * XSpacing + punchingToolList[1].X))
            {
                marginX = (spanX - ((punchQtyX - 2) * XSpacing) - (punchingToolList[1].X) - gap) / 2;
            }
            else
            {
                marginX = (spanX - ((punchQtyX - 2) * XSpacing) - (punchingToolList[0].X) - gap) / 2;
            }

            int punchQtyY = ((int)((spanY - punchingToolList[0].Y) / YSpacing)) + 1;

            double marginY = (spanY - ((punchQtyY - 1) * YSpacing)) / 2;

            Point3d point;

            RhinoDoc doc    = RhinoDoc.ActiveDoc;
            double   firstX = min.X + marginX;
            double   firstY = min.Y + marginY;

            // Record the current layer
            int currentLayer = doc.Layers.CurrentLayerIndex;

            // Create Perforation Layer
            //if (punchingToolList[0].ClusterTool.Enable == true)
            {
                doc.Layers.SetCurrentLayerIndex(currentLayer, true);
            }
            //else
            //{
            //    if (!MetrixUtilities.IsLayerFound("TemporaryPerfLayer"))
            //    {
            //        RhinoUtilities.SetActiveLayer(Properties.Settings.Default.ToolHitLayerName, System.Drawing.Color.Black);
            //    }
            //    else
            //    {
            //        RhinoUtilities.SetActiveLayer("TemporaryToolHit", System.Drawing.Color.Black);
            //    }
            //}

            // Random Engine

            RandomTiler randomTileEngine = new RandomTiler();

            int totalQty   = (punchQtyX + 1) * punchQtyY;
            int toolHitQty = (int)(totalQty * randomness);
            int blankQty   = totalQty - toolHitQty;

            List <int> tileCounts = new List <int>();

            tileCounts.Add(toolHitQty);
            tileCounts.Add(blankQty);
            int[,] tileMap = randomTileEngine.GetTileMap(tileCounts, punchQtyX + 1, punchQtyY);

            Point3d pointMedL;
            Point3d pointMedR;
            Point3d pointShortL;
            Point3d pointShortR;
            Point3d pointLeft, pointRight, pointTop, pointBottom;
            double  toolOffset = XSpacing / 6;
            double  rowOffset  = XSpacing / 3;


            for (int y = 0; y < punchQtyY; y++)
            {
                if (y % 3 == 0) // Long tool row
                {
                    // first X
                    firstX = min.X + marginX;
                }
                else if (y % 3 == 1) // Med tool row
                {
                    firstX = min.X + marginX - rowOffset;
                }
                else // short tool rows
                {
                    firstX = min.X + marginX - (2 * rowOffset);
                }

                bool isBorderPunch = false;

                for (int x = 0; x < punchQtyX + 1; x++)
                {
                    point       = new Point3d(firstX + x * XSpacing, firstY + y * YSpacing, 0);
                    pointMedL   = new Point3d(firstX + x * XSpacing - toolOffset, firstY + y * YSpacing, 0);
                    pointMedR   = new Point3d(firstX + x * XSpacing + toolOffset, firstY + y * YSpacing, 0);
                    pointShortL = new Point3d(firstX + x * XSpacing - 2 * toolOffset, firstY + y * YSpacing, 0);
                    pointShortR = new Point3d(firstX + x * XSpacing + 2 * toolOffset, firstY + y * YSpacing, 0);

                    pointLeft   = new Point3d(firstX + (x - 1) * XSpacing, firstY + y * YSpacing, 0);
                    pointRight  = new Point3d(firstX + (x + 1) * XSpacing, firstY + y * YSpacing, 0);
                    pointTop    = new Point3d(firstX + x * XSpacing, firstY + (y + 1) * YSpacing, 0);
                    pointBottom = new Point3d(firstX + (x + 1) * XSpacing, firstY + (y - 1) * YSpacing, 0);

                    // Test if the current punch is close to border
                    isBorderPunch = false;

                    if (punchingToolList[0].isInside(boundaryCurve, pointLeft) == false)
                    {
                        isBorderPunch = true;
                    }

                    if (punchingToolList[0].isInside(boundaryCurve, pointRight) == false)
                    {
                        isBorderPunch = true;
                    }

                    if (punchingToolList[0].isInside(boundaryCurve, pointTop) == false)
                    {
                        isBorderPunch = true;
                    }

                    if (punchingToolList[0].isInside(boundaryCurve, pointBottom) == false)
                    {
                        isBorderPunch = true;
                    }

                    if (isBorderPunch == true || tileMap[x, y] == 1)
                    {
                        if (punchingToolList[2].isInside(boundaryCurve, point) == true)
                        {
                            pointMapTool1.AddPoint(new PunchingPoint(point));
                            punchingToolList[2].drawTool(point);
                            tool2count++;
                        }
                        else if (punchingToolList[1].isInside(boundaryCurve, pointMedL) == true)
                        {
                            pointMapTool1.AddPoint(new PunchingPoint(pointMedL));
                            punchingToolList[1].drawTool(pointMedL);
                            tool1count++;
                        }
                        else if (punchingToolList[1].isInside(boundaryCurve, pointMedR) == true)
                        {
                            pointMapTool1.AddPoint(new PunchingPoint(pointMedR));
                            punchingToolList[1].drawTool(pointMedR);
                            tool1count++;
                        }
                        else if (punchingToolList[0].isInside(boundaryCurve, pointShortL) == true)
                        {
                            pointMapTool1.AddPoint(new PunchingPoint(pointShortL));
                            punchingToolList[0].drawTool(pointShortL);
                            tool0count++;
                        }
                        else if (punchingToolList[0].isInside(boundaryCurve, pointShortR) == true)
                        {
                            pointMapTool1.AddPoint(new PunchingPoint(pointShortR));
                            punchingToolList[0].drawTool(pointShortR);
                            tool0count++;
                        }
                    }
                }
            }

            // Display the open area calculation
            AreaMassProperties area = AreaMassProperties.Compute(boundaryCurve);

            RhinoApp.WriteLine("Total area: {0} mm^2", area.Area.ToString("#.##"));

            double tool0Area = punchingToolList[0].getArea() * tool0count;
            double tool1Area = punchingToolList[1].getArea() * tool1count;
            double tool2Area = punchingToolList[2].getArea() * tool2count;

            RhinoApp.WriteLine("Tool 1 area: {0} mm^2", tool0Area.ToString("#.##"));



            RhinoApp.WriteLine("Tool 2 area: {0} mm^2", tool1Area.ToString("#.##"));


            RhinoApp.WriteLine("Tool 3 area: {0} mm^2", tool2Area.ToString("#.##"));

            openArea = (tool0Area + tool1Area + tool2Area) * 100 / area.Area;

            RhinoApp.WriteLine("Open area: {0}%", openArea.ToString("#."));

            // Draw the cluster for each tool
            for (int i = 0; i < punchingToolList.Count; i++)
            {
                // Only draw cluster tool if it is enable
                if (punchingToolList[i].ClusterTool.Enable == true)
                {
                    // Draw the cluster tool
                    drawCluster(pointMapList[i], punchingToolList[i]);
                }
            }

            doc.Views.Redraw();

            doc.Layers.SetCurrentLayerIndex(currentLayer, true);
            return(openArea);
        }
Beispiel #37
0
        /// <summary>
        /// Draws the perforation.
        /// </summary>
        /// <returns></returns>
        public override double drawPerforation(Curve boundaryCurve)
        {
            List <PointMap> pointMapList  = new List <PointMap>();
            Random          random        = new Random();
            PointMap        pointMapTool0 = new PointMap();
            PointMap        pointMapTool1 = new PointMap();

            pointMapList.Add(pointMapTool0);
            pointMapList.Add(pointMapTool1);


            double marginX;

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

            double spanX = max.X - min.X;
            double spanY = max.Y - min.Y;

            int punchQtyX = ((int)((spanX - punchingToolList[0].X) / XSpacing)) + 1;

            double secondRowOffset = pitch * Math.Cos(Math.PI * 60 / 180);

            if (spanX >= ((punchQtyX - 1) * XSpacing + secondRowOffset + punchingToolList[0].X))
            {
                marginX = (spanX - ((punchQtyX - 1) * XSpacing) - secondRowOffset) / 2;
            }
            else
            {
                marginX = (spanX - ((punchQtyX - 1) * XSpacing)) / 2;
            }

            int punchQtyY = ((int)((spanY - punchingToolList[0].Y) / YSpacing)) + 1;

            double marginY = (spanY - ((punchQtyY - 1) * YSpacing)) / 2;

            Point3d point;

            RhinoDoc doc    = RhinoDoc.ActiveDoc;
            double   firstX = min.X + marginX;
            double   firstY = min.Y + marginY;

            // Record the current layer
            int currentLayer = doc.Layers.CurrentLayerIndex;

            // Create Perforation Layer
            //   if (punchingToolList[0].ClusterTool.Enable == true)
            {
                doc.Layers.SetCurrentLayerIndex(currentLayer, true);
            }
            //else
            //{
            //    if (!MetrixUtilities.IsLayerFound("TemporaryPerfLayer"))
            //    {
            //        RhinoUtilities.SetActiveLayer(Properties.Settings.Default.ToolHitLayerName, System.Drawing.Color.Black);
            //    }
            //    else
            //    {
            //        RhinoUtilities.SetActiveLayer("TemporaryToolHit", System.Drawing.Color.Black);
            //    }
            //}

            int  rightSide      = 0;
            bool hasSlot        = false;
            int  slotPercentage = 0;
            int  slotQty;

            for (int y = 0; y < punchQtyY; y++)
            {
                if (y % 3 == 1)
                {
                    hasSlot        = true;
                    slotPercentage = random.Next(10, 105);

                    if (slotPercentage > 100)
                    {
                        slotPercentage = 100;
                    }

                    rightSide++;

                    if (rightSide > 2)
                    {
                        rightSide = 0;
                    }
                }
                else
                {
                    hasSlot = false;
                }

                if (y % 2 == 0) // even rows
                {
                    // Slot propagate from the left
                    if (hasSlot == true && rightSide < 2)
                    {
                        slotQty = (int)(slotPercentage * punchQtyX / 100);
                        int x;

                        for (x = 1; x < slotQty; x += 3)
                        {
                            point = new Point3d(firstX + x * XSpacing, firstY + y * YSpacing, 0);

                            if (punchingToolList[1].isInside(boundaryCurve, point) == true)
                            {
                                pointMapList[1].AddPoint(new PunchingPoint(point));
                                punchingToolList[1].drawTool(point);
                            }
                        }

                        if (slotQty == punchQtyX && slotQty % 3 != 0)
                        {
                            x = punchQtyX - (punchQtyX % 3) + 1;
                        }

                        for (x = x - 1; x < punchQtyX; x++)
                        {
                            point = new Point3d(firstX + x * XSpacing, firstY + y * YSpacing, 0);

                            if (punchingToolList[0].isInside(boundaryCurve, point) == true)
                            {
                                pointMapList[0].AddPoint(new PunchingPoint(point));
                                punchingToolList[0].drawTool(point);
                            }
                        }
                    }
                    else if (hasSlot == true && rightSide == 2)
                    {
                        slotQty = (int)(slotPercentage * punchQtyX / 100);
                        int x;

                        int holeQty = punchQtyX - slotQty;

                        holeQty = (int)(holeQty / 3) * 3;

                        for (x = 0; x < holeQty; x++)
                        {
                            point = new Point3d(firstX + x * XSpacing, firstY + y * YSpacing, 0);

                            if (punchingToolList[0].isInside(boundaryCurve, point) == true)
                            {
                                pointMapList[0].AddPoint(new PunchingPoint(point));
                                punchingToolList[0].drawTool(point);
                            }
                        }

                        for (x = x + 1; x < punchQtyX; x += 3)
                        {
                            point = new Point3d(firstX + x * XSpacing, firstY + y * YSpacing, 0);

                            if (punchingToolList[1].isInside(boundaryCurve, point) == true)
                            {
                                pointMapList[1].AddPoint(new PunchingPoint(point));
                                punchingToolList[1].drawTool(point);
                            }
                        }

                        if (punchQtyX % 3 != 0)
                        {
                            x = punchQtyX - (punchQtyX % 3);
                        }

                        for (; x < punchQtyX; x++)
                        {
                            point = new Point3d(firstX + x * XSpacing, firstY + y * YSpacing, 0);

                            if (punchingToolList[0].isInside(boundaryCurve, point) == true)
                            {
                                pointMapList[0].AddPoint(new PunchingPoint(point));
                                punchingToolList[0].drawTool(point);
                            }
                        }
                    }
                    else
                    {
                        for (int x = 0; x < punchQtyX; x++)
                        {
                            point = new Point3d(firstX + x * XSpacing, firstY + y * YSpacing, 0);

                            if (punchingToolList[0].isInside(boundaryCurve, point) == true)
                            {
                                pointMapList[0].AddPoint(new PunchingPoint(point));
                                punchingToolList[0].drawTool(point);
                            }
                        }
                    }
                }
                else // odd rows
                {
                    // Slot propagate from the left
                    if (hasSlot == true && rightSide < 2)
                    {
                        slotQty = (int)(slotPercentage * punchQtyX / 100);
                        int x;

                        for (x = 1; x < slotQty; x += 3)
                        {
                            point = new Point3d(firstX + secondRowOffset + (x * XSpacing), firstY + y * YSpacing, 0);

                            if (punchingToolList[1].isInside(boundaryCurve, point) == true)
                            {
                                pointMapList[1].AddPoint(new PunchingPoint(point));
                                punchingToolList[1].drawTool(point);
                            }
                        }

                        if (slotQty == punchQtyX && slotQty % 3 != 0)
                        {
                            x = punchQtyX - (punchQtyX % 3) + 1;
                        }

                        for (x = x - 1; x < punchQtyX; x++)
                        {
                            point = new Point3d(firstX + secondRowOffset + (x * XSpacing), firstY + y * YSpacing, 0);

                            if (punchingToolList[0].isInside(boundaryCurve, point) == true)
                            {
                                pointMapList[0].AddPoint(new PunchingPoint(point));
                                punchingToolList[0].drawTool(point);
                            }
                        }
                    }
                    else if (hasSlot == true && rightSide == 2)
                    {
                        slotQty = (int)(slotPercentage * punchQtyX / 100);
                        int x;

                        int holeQty = punchQtyX - slotQty;

                        holeQty = (int)(holeQty / 3) * 3;

                        for (x = 0; x < holeQty; x++)
                        {
                            point = new Point3d(firstX + secondRowOffset + (x * XSpacing), firstY + y * YSpacing, 0);

                            if (punchingToolList[0].isInside(boundaryCurve, point) == true)
                            {
                                pointMapList[0].AddPoint(new PunchingPoint(point));
                                punchingToolList[0].drawTool(point);
                            }
                        }

                        for (x = x + 1; x < punchQtyX; x += 3)
                        {
                            point = new Point3d(firstX + secondRowOffset + (x * XSpacing), firstY + y * YSpacing, 0);

                            if (punchingToolList[1].isInside(boundaryCurve, point) == true)
                            {
                                pointMapList[1].AddPoint(new PunchingPoint(point));
                                punchingToolList[1].drawTool(point);
                            }
                        }

                        if (punchQtyX % 3 != 0)
                        {
                            x = punchQtyX - (punchQtyX % 3);
                        }

                        for (; x < punchQtyX; x++)
                        {
                            point = new Point3d(firstX + secondRowOffset + (x * XSpacing), firstY + y * YSpacing, 0);

                            if (punchingToolList[0].isInside(boundaryCurve, point) == true)
                            {
                                pointMapList[0].AddPoint(new PunchingPoint(point));
                                punchingToolList[0].drawTool(point);
                            }
                        }
                    }
                    else
                    {
                        for (int x = 0; x < punchQtyX; x++)
                        {
                            point = new Point3d(firstX + secondRowOffset + (x * XSpacing), firstY + y * YSpacing, 0);

                            if (punchingToolList[0].isInside(boundaryCurve, point) == true)
                            {
                                pointMapList[0].AddPoint(new PunchingPoint(point));
                                punchingToolList[0].drawTool(point);
                            }
                        }
                    }
                }
            }

            // Display the open area calculation
            AreaMassProperties area = AreaMassProperties.Compute(boundaryCurve);

            RhinoApp.WriteLine("Total area: {0} mm^2", area.Area.ToString("#.##"));

            double tool1Area = punchingToolList[0].getArea() * pointMapList[0].Count;

            RhinoApp.WriteLine("Tool 1 area: {0} mm^2", tool1Area.ToString("#.##"));

            double tool2Area = punchingToolList[1].getArea() * pointMapList[1].Count;

            RhinoApp.WriteLine("Tool 2 area: {0} mm^2", tool2Area.ToString("#.##"));

            openArea = (tool1Area + tool2Area) * 100 / area.Area;

            RhinoApp.WriteLine("Open area: {0}%", openArea.ToString("#."));

            // Draw the cluster for each tool
            for (int i = 0; i < punchingToolList.Count; i++)
            {
                // Only draw cluster tool if it is enable
                if (punchingToolList[i].ClusterTool.Enable == true)
                {
                    // Draw the cluster tool
                    drawCluster(pointMapList[i], punchingToolList[i]);
                }
            }

            doc.Views.Redraw();

            doc.Layers.SetCurrentLayerIndex(currentLayer, true);
            return(openArea);
        }
        internal static void AuditUnits(RhinoDoc doc)
        {
            if (Command.InScriptRunnerCommand())
            {
                return;
            }

            if (Revit.ActiveUIDocument?.Document is DB.Document revitDoc)
            {
                var units = revitDoc.GetUnits();
                var lengthFormatoptions        = units.GetFormatOptions(DB.UnitType.UT_Length);
                var RevitModelUnitSystem       = lengthFormatoptions.DisplayUnits.ToUnitSystem();
                var GrasshopperModelUnitSystem = GH.Guest.ModelUnitSystem != UnitSystem.Unset ? GH.Guest.ModelUnitSystem : doc.ModelUnitSystem;
                if (doc.ModelUnitSystem != RevitModelUnitSystem || doc.ModelUnitSystem != GrasshopperModelUnitSystem)
                {
                    var hasUnits        = doc.ModelUnitSystem != UnitSystem.Unset && doc.ModelUnitSystem != UnitSystem.None;
                    var expandedContent = doc.IsOpening ?
                                          $"The Rhino model you are opening is in {doc.ModelUnitSystem}{Environment.NewLine}Revit document '{revitDoc.Title}' length units are {RevitModelUnitSystem}" :
                                          string.Empty;

                    using
                    (
                        var taskDialog = new TaskDialog("Units")
                    {
                        MainIcon = External.UI.TaskDialogIcons.IconInformation,
                        TitleAutoPrefix = true,
                        AllowCancellation = hasUnits,
                        MainInstruction = hasUnits ? (doc.IsOpening ? "Model units mismatch." : "Model units mismatch warning.") : "Rhino model has no units.",
                        MainContent = doc.IsOpening ? "What units do you want to use?" : $"Revit document '{revitDoc.Title}' length units are {RevitModelUnitSystem}." + (hasUnits ? $"{Environment.NewLine}Rhino is working in {doc.ModelUnitSystem}." : string.Empty),
                        ExpandedContent = expandedContent,
                        FooterText = "Current version: " + Addin.DisplayVersion
                    }
                    )
                    {
                        if (!doc.IsOpening && hasUnits)
                        {
#if REVIT_2020
                            taskDialog.EnableDoNotShowAgain("RhinoInside.Revit.DocumentUnitsMismatch", true, "Do not show again");
#else
                            // Without the ability of checking DoNotShowAgain this may be too anoying.
                            return;
#endif
                        }
                        else
                        {
                            taskDialog.AddCommandLink(Autodesk.Revit.UI.TaskDialogCommandLinkId.CommandLink2, $"Use {RevitModelUnitSystem} like Revit", $"Scale Rhino model by {UnitScale(doc.ModelUnitSystem, RevitModelUnitSystem)}");
                            taskDialog.DefaultButton = Autodesk.Revit.UI.TaskDialogResult.CommandLink2;
                        }

                        if (hasUnits)
                        {
                            if (doc.IsOpening)
                            {
                                taskDialog.AddCommandLink(Autodesk.Revit.UI.TaskDialogCommandLinkId.CommandLink1, $"Continue in {doc.ModelUnitSystem}", $"Rhino and Grasshopper will work in {doc.ModelUnitSystem}");
                                taskDialog.DefaultButton = Autodesk.Revit.UI.TaskDialogResult.CommandLink1;
                            }
                            else
                            {
                                taskDialog.CommonButtons = Autodesk.Revit.UI.TaskDialogCommonButtons.Ok;
                                taskDialog.DefaultButton = Autodesk.Revit.UI.TaskDialogResult.Ok;
                            }
                        }

                        if (GH.Guest.ModelUnitSystem != UnitSystem.Unset)
                        {
                            taskDialog.ExpandedContent += $"{Environment.NewLine}Documents opened in Grasshopper were working in {GH.Guest.ModelUnitSystem}";
                            if (GrasshopperModelUnitSystem != doc.ModelUnitSystem && GrasshopperModelUnitSystem != RevitModelUnitSystem)
                            {
                                taskDialog.AddCommandLink(Autodesk.Revit.UI.TaskDialogCommandLinkId.CommandLink3, $"Adjust Rhino model to {GH.Guest.ModelUnitSystem} like Grasshopper", $"Scale Rhino model by {UnitScale(doc.ModelUnitSystem, GH.Guest.ModelUnitSystem)}");
                                taskDialog.DefaultButton = Autodesk.Revit.UI.TaskDialogResult.CommandLink3;
                            }
                        }

                        switch (taskDialog.Show())
                        {
                        case Autodesk.Revit.UI.TaskDialogResult.CommandLink2:
                            doc.ModelAngleToleranceRadians    = Revit.AngleTolerance;
                            doc.ModelDistanceDisplayPrecision = Clamp((int)-Log10(lengthFormatoptions.Accuracy), 0, 7);
                            doc.ModelAbsoluteTolerance        = Revit.VertexTolerance * UnitScale(UnitSystem.Feet, RevitModelUnitSystem);
                            doc.AdjustModelUnitSystem(RevitModelUnitSystem, true);
                            AdjustViewConstructionPlanes(doc);
                            break;

                        case Autodesk.Revit.UI.TaskDialogResult.CommandLink3:
                            doc.ModelAngleToleranceRadians    = Revit.AngleTolerance;
                            doc.ModelDistanceDisplayPrecision = Clamp(Grasshopper.CentralSettings.FormatDecimalDigits, 0, 7);
                            doc.ModelAbsoluteTolerance        = Revit.VertexTolerance * UnitScale(UnitSystem.Feet, GH.Guest.ModelUnitSystem);
                            doc.AdjustModelUnitSystem(GH.Guest.ModelUnitSystem, true);
                            AdjustViewConstructionPlanes(doc);
                            break;

                        default:
                            AuditTolerances(doc);
                            break;
                        }
                    }
                }
            }
        }
Beispiel #39
0
 public static object[] GetPanels(Guid panelId, uint documentRuntimeSerialNumber) => GetPanels(panelId, RhinoDoc.FromRuntimeSerialNumber(documentRuntimeSerialNumber));
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            //This command takes a Text annotation object which has an Object Name function associated with it (fx object name)
            //it then finds the object associated and creates a copy of it in the document with a new tag for the copy which
            //indexes the copy name as Object A > Object B > Object C.



            //Ask for a text object that's being used as a name tag
            var go = new GetObject()
            {
                GeometryFilter = ObjectType.Annotation
            };

            go.GeometryFilter = ObjectType.Annotation;
            go.SetCommandPrompt("Select Text with Object Name Function Applied");
            go.EnablePreSelect(false, true);
            go.GetMultiple(1, 0);

            if (go.Result() != GetResult.Object)
            {
                return(Result.Cancel);
            }



            foreach (var ro in go.Objects().Select(ob => ob.Object()).ToList())
            {
                //Deselect our input object and filter out anything that isnt a text annotation
                doc.Objects.Select(ro.Id, false);
                if (ro.Geometry.ObjectType != ObjectType.Annotation)
                {
                    continue;
                }
                if (!(ro.Geometry is TextEntity te))
                {
                    continue;
                }

                //See if the annotation contains the ingredients of a function
                var fx = te.RichText;
                if (!fx.Contains("%<") && !fx.Contains(">%"))
                {
                    continue;
                }

                //Find the original doc object guid that tag function is linked to
                var object_id = ExtractGuidFromString(fx);
                var isguid    = Guid.TryParse(object_id, out Guid obj_guid);
                if (!isguid)
                {
                    continue;
                }

                //Create a duplicate of the linked text object
                var copy_obj = doc.Objects.Find(obj_guid);
                if (copy_obj == null)
                {
                    continue;
                }

                //Duplicate the original objects geometry and attributes
                var duplicate  = copy_obj.DuplicateGeometry();
                var attributes = copy_obj.Attributes.Duplicate();
                attributes.Name = $"{copy_obj.Name} {GetNextIndexName(obj_guid, ref doc)}";

                //Tag the copy with a reference to the original so that we can figure out the next letter index easier
                attributes.SetUserString(".Dup", obj_guid.ToString());

                //Create a duplicate of the object in the doc
                var copied_obj_guid = doc.Objects.Add(duplicate, attributes);

                //Create a new tag for the duplicate with updated functions
                if (!(ro.DuplicateGeometry() is TextEntity dup_text))
                {
                    continue;
                }
                dup_text.RichText = ReplaceGuid(dup_text.RichText, copied_obj_guid);
                var tag_guid = doc.Objects.Add(dup_text);

                //Select the new objects to make moving them easier
                Guid[] selection = { tag_guid, copied_obj_guid };
                doc.Objects.Select(selection);
                doc.Views.Redraw();
            }

            return(Result.Success);
        }
Beispiel #41
0
 /// <since>5.0</since>
 public virtual Commands.Result RunScript(RhinoDoc doc, Commands.RunMode mode)
 {
     RhinoApp.WriteLine(Localization.LocalizeString("Scripting not supported for this option", 33));
     Dialogs.ShowMessage(Localization.LocalizeString("Scripting not supported for this option", 34), Localization.LocalizeString("Unsupported Option", 35));
     return(Commands.Result.Success);
 }
Beispiel #42
0
 public static T [] GetPanels <T> (uint documentRuntimeSerialNumber) where T : class => GetPanels <T> (RhinoDoc.FromRuntimeSerialNumber(documentRuntimeSerialNumber));
Beispiel #43
0
 /// <summary>
 /// Accesses the environment table.
 /// </summary>
 /// <param name="doc">A Rhino document.</param>
 /// <returns>The environments list.</returns>
 public static ContentList EnvironmentList(RhinoDoc doc)
 {
     return(new ContentList(RenderContentKind.Environment, doc));
 }
Beispiel #44
0
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            // TODO: start here modifying the behaviour of your command.
            // ---
            //RhinoApp.WriteLine("The {0} command will add a line right now.", EnglishName);



            GetObject getBreps = new GetObject();

            getBreps.SetCommandPrompt("Pick the breps to create a PolyhedralFrame");
            getBreps.GeometryFilter = Rhino.DocObjects.ObjectType.Brep;
            // set up options

            OptionDouble dblOptionCollapse = new Rhino.Input.Custom.OptionDouble(0.1, true, 0.0);
            OptionDouble dblOptionPlanar   = new Rhino.Input.Custom.OptionDouble(0.1, true, 0.0);
            OptionToggle togOptionReplace  = new OptionToggle(true, "Keep", "Replace");

            getBreps.AddOptionDouble("PointCollapseLimit", ref dblOptionCollapse);
            getBreps.AddOptionDouble("PlanarityMaxDeviation", ref dblOptionPlanar);

            getBreps.AddOptionToggle("ReplaceGeo", ref togOptionReplace);
            getBreps.AcceptNothing(false);

            while (true)
            {
                var r = getBreps.GetMultiple(1, 0);
                if (r == GetResult.Cancel)
                {
                    return(getBreps.CommandResult());
                }
                else if (r == GetResult.Object)
                {
                    break;
                }
            }

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

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

            var foam           = new PFoam();
            var deleteOriginal = false;

            try
            {
                foam.ProcessBFaces(Util.DecomposeG(ids), dblOptionCollapse.CurrentValue, dblOptionPlanar.CurrentValue);
                doc.Objects.UnselectAll();
                if (foam.Faces.Count > 2)
                {
                    foam.MakeCells();
                    Point3d newCentroid = foam.Centroid;
                    if (!togOptionReplace.CurrentValue)
                    {
                        Rhino.Input.RhinoGet.GetPoint("Place the PolyFrame", true, out newCentroid);
                    }
                    else
                    {
                        deleteOriginal = true;
                    }
                    //Rhino.RhinoDoc.ActiveDoc.Objects.Delete(ids, true);


                    foam.Offset(newCentroid - foam.Centroid);
                    foam.Show(true, true, false);
                    foam.ShowCells();


                    if (!foam.SaveToDocument())
                    {
                        foam.Hide();
                        return(Result.Cancel);
                    }


                    foam.Hide();

                    if (deleteOriginal)
                    {
                        Rhino.RhinoDoc.ActiveDoc.Objects.Delete(ids, true);
                    }
                    doc.Views.Redraw();
                    Rhino.RhinoApp.WriteLine($"Constructed a PolyFrame object with {foam.Cells.Count} cells, {foam.Faces.Count} half-faces, {foam.Edges.Count} half-edges and {foam.Vertices.Count} vertices.");

                    return(Result.Success);
                }
                else
                {
                    Rhino.RhinoApp.WriteLine("Not enough faces!");
                    return(Result.Failure);
                }
            }
            catch (Exception pfE)
            {
                RhinoApp.WriteLine(pfE.Message + " Press <Esc> to continue.");
                foam.Hide();
                return(Result.Failure);
            }
        }
Beispiel #45
0
 protected override Result RunCommand(RhinoDoc doc, RunMode mode)
 {
     return(Result.Success);
 }
Beispiel #46
0
 /// <summary>
 /// Accesses the texture table.
 /// </summary>
 /// <param name="doc">A Rhino document.</param>
 /// <returns>The textures list.</returns>
 public static ContentList TextureList(RhinoDoc doc)
 {
     return(new ContentList(RenderContentKind.Texture, doc));
 }
Beispiel #47
0
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            const ObjectType geometryFilter = ObjectType.Mesh;
            
            OptionDouble minEdgeLengthOption = new OptionDouble(minEdgeLength, 0.001, 200);
            OptionInteger maxTriangleCountOption = new OptionInteger(maxTriangleCount, 0, 100000000);
            
            GetObject go = new GetObject();
            go.SetCommandPrompt("Select meshes to reduce");
            go.GeometryFilter = geometryFilter;
            go.AddOptionDouble("MinEdge", ref minEdgeLengthOption);
            go.AddOptionInteger("MaxTriangle", ref maxTriangleCountOption);

            go.GroupSelect = true;
            go.SubObjectSelect = false;
            go.EnableClearObjectsOnEntry(false);
            go.EnableUnselectObjectsOnExit(false);
            go.DeselectAllBeforePostSelect = false;

            bool bHavePreselectedObjects = false;

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

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

                else if (go.CommandResult() != Result.Success)
                    return go.CommandResult();

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

                break;
            }

            maxTriangleCount = maxTriangleCountOption.CurrentValue;
            minEdgeLength = minEdgeLengthOption.CurrentValue;

            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++)
                {
                    RhinoObject rhinoObject = go.Object(i).Object();
                    if (null != rhinoObject)
                        rhinoObject.Select(false);
                }
                doc.Views.Redraw();
            }

            bool result = false;

            foreach (var obj in go.Objects())
            {
                var rhinoMesh = obj.Mesh();

                if (rhinoMesh == null || !rhinoMesh.IsValid)
                    continue;

                var mesh = GopherUtil.ConvertToD3Mesh(obj.Mesh());
                
                GopherUtil.ReduceMesh(mesh, (float)minEdgeLength, maxTriangleCount);

                double mine, maxe, avge;
                MeshQueries.EdgeLengthStats(mesh, out mine, out maxe, out avge);
                   RhinoApp.WriteLine("Edge length stats: {0} {1} {2}", mine, maxe, avge);

                var newRhinoMesh = GopherUtil.ConvertToRhinoMesh(mesh);

                if (newRhinoMesh != null && newRhinoMesh.IsValid)
                {
                    doc.Objects.Replace(obj, newRhinoMesh);
                }

                if (newRhinoMesh != null && newRhinoMesh.IsValid)
                {
                    result |= doc.Objects.Replace(obj, newRhinoMesh);
                }
            }

            doc.Views.Redraw();

            return Result.Success;
        }
Beispiel #48
0
 /// <summary>
 /// Accesses the material table.
 /// </summary>
 /// <param name="doc">A Rhino document.</param>
 /// <returns>The materials list.</returns>
 public static ContentList MaterialList(RhinoDoc doc)
 {
     return(new ContentList(RenderContentKind.Material, doc));
 }
Beispiel #49
0
        /// <summary>
        /// Draws the perforation.
        /// </summary>
        /// <returns></returns>
        public override double drawPerforation(Curve boundaryCurve)
        {
            PointMap pointMap = new PointMap();

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

            double spanX = max.X - min.X;
            double spanY = max.Y - min.Y;

            int    punchQtyX = ((int)((spanX - punchingToolList[0].X) / XSpacing)) + 1;
            double marginX   = (spanX - ((punchQtyX - 1) * XSpacing)) / 2;

            int    punchQtyY = ((int)((spanY - punchingToolList[0].Y) / YSpacing)) + 1;
            double marginY   = (spanY - ((punchQtyY - 1) * YSpacing)) / 2;

            Point3d  point;
            RhinoDoc doc = RhinoDoc.ActiveDoc;

            double  firstX = min.X + marginX;
            double  firstY = min.Y + marginY;
            Point3d origin = new Point3d(firstX, firstY, 0);

            // Record the current layer
            int currentLayer = doc.Layers.CurrentLayerIndex;

            // Create Perforation Layer
            //     if (punchingToolList[0].ClusterTool.Enable == true)
            {
                doc.Layers.SetCurrentLayerIndex(currentLayer, true);
            }
            //else
            //{
            //    if (!MetrixUtilities.IsLayerFound("TemporaryPerfLayer"))
            //    {
            //        RhinoUtilities.SetActiveLayer(Properties.Settings.Default.ToolHitLayerName, System.Drawing.Color.Black);
            //    }
            //    else
            //    {
            //        RhinoUtilities.SetActiveLayer("TemporaryToolHit", System.Drawing.Color.Black);
            //    }
            //}

            // Random Engine

            RandomTiler randomTileEngine = new RandomTiler();

            int totalQty   = punchQtyX * punchQtyY;
            int toolHitQty = (int)(totalQty * randomness);
            int blankQty   = totalQty - toolHitQty;

            List <int> tileCounts = new List <int>();

            tileCounts.Add(toolHitQty);
            tileCounts.Add(blankQty);
            int[,] tileMap = randomTileEngine.GetTileMap(tileCounts, punchQtyX, punchQtyY);

            // Add first point
            random = new Random();

            for (int y = 0; y < punchQtyY; y++)
            {
                for (int x = 0; x < punchQtyX; x++)
                {
                    point = new Point3d(firstX + x * XSpacing, firstY + y * YSpacing, 0);

                    if (punchingToolList[0].isInside(boundaryCurve, point) == true)
                    {
                        if (tileMap[x, y] == 1)
                        {
                            pointMap.AddPoint(new PunchingPoint(point));
                            punchingToolList[0].drawTool(point);
                        }
                    }
                }
            }

            // Display the open area calculation
            AreaMassProperties area = AreaMassProperties.Compute(boundaryCurve);

            RhinoApp.WriteLine("Total area: {0} mm^2", area.Area.ToString("#.##"));

            double toolArea = punchingToolList[0].getArea() * pointMap.Count;

            RhinoApp.WriteLine("Tool area: {0} mm^2", toolArea.ToString("#.##"));

            openArea = toolArea * 100 / area.Area;

            RhinoApp.WriteLine("Open area: {0}%", openArea.ToString("#."));

            // Draw the cluster for each tool
            for (int i = 0; i < punchingToolList.Count; i++)
            {
                // Only draw cluster tool if it is enable
                if (punchingToolList[i].ClusterTool.Enable == true)
                {
                    // Draw the cluster tool
                    drawCluster(pointMap, punchingToolList[i]);
                }
            }

            doc.Views.Redraw();

            doc.Layers.SetCurrentLayerIndex(currentLayer, true);
            return(openArea);
        }
Beispiel #50
0
        public static bool DoExport(string fileName, glTFExportOptions options, bool binary, RhinoDoc doc, IEnumerable <Rhino.DocObjects.RhinoObject> rhinoObjects, Rhino.Render.LinearWorkflow workflow)
        {
            RhinoDocGltfConverter converter = new RhinoDocGltfConverter(options, binary, doc, rhinoObjects, workflow);

            glTFLoader.Schema.Gltf gltf = converter.ConvertToGltf();

            if (binary)
            {
                byte[] bytes = converter.GetBinaryBuffer();
                glTFLoader.Interface.SaveBinaryModel(gltf, bytes.Length == 0 ? null : bytes, fileName);
            }
            else
            {
                glTFLoader.Interface.SaveModel(gltf, fileName);
            }

            RhinoApp.WriteLine("Successfully exported selected geometry to glTF(Binary).");
            return(true);
        }
Beispiel #51
0
 protected override Result RunCommand(RhinoDoc doc, RunMode mode)
 {
     RhinoApp.WriteLine("{0} plug-in loaded.", SampleCsWinFormsPlugIn.Instance.Name);
     return(Result.Success);
 }
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            GetObject go = new GetObject();

            go.SetCommandPrompt("Select curve to split");
            go.GeometryFilter          = ObjectType.Curve;
            go.GeometryAttributeFilter = GeometryAttributeFilter.OpenCurve;
            go.SubObjectSelect         = false;
            go.Get();
            if (go.CommandResult() != Result.Success)
            {
                return(go.CommandResult());
            }

            ObjRef      object_ref = go.Object(0);
            RhinoObject rh_object  = object_ref.Object();
            Curve       curve      = object_ref.Curve();

            if (null == rh_object || null == curve)
            {
                return(Result.Failure);
            }

            GetPoint gp = new GetPoint();

            gp.SetCommandPrompt("Point on curve to split at");
            gp.Constrain(curve, false);
            gp.Get();
            if (gp.CommandResult() != Result.Success)
            {
                return(gp.CommandResult());
            }

            Point3d point = gp.Point();
            double  t     = Rhino.RhinoMath.UnsetValue;

            if (!curve.ClosestPoint(point, out t))
            {
                return(Result.Failure);
            }

            List <double> curve_t = new List <double>(3);

            curve_t.Add(curve.Domain.Min);
            curve_t.Add(curve.Domain.Max);
            curve_t.Add(t);
            curve_t.Sort();

            List <double> culled_t = curve_t.Distinct().ToList();

            if (culled_t.Count < 3)
            {
                return(Result.Nothing);
            }

            ObjectAttributes attributes = rh_object.Attributes.Duplicate();

            attributes.ObjectId = Guid.Empty;

            for (int i = 0; i < culled_t.Count - 1; i++)
            {
                Interval domain = new Interval(culled_t[i], culled_t[i + 1]);
                if (curve.Domain.IncludesInterval(domain))
                {
                    Curve trim = curve.Trim(domain);
                    if (null != trim)
                    {
                        doc.Objects.Add(trim, attributes);
                    }
                }
            }

            doc.Objects.Delete(object_ref, false);
            doc.Views.Redraw();

            return(Result.Success);
        }
Beispiel #53
0
    private int runCount;                              //Legacy field.

    public override void InvokeRunScript(IGH_Component owner, object rhinoDocument, int iteration, List <object> inputs, IGH_DataAccess DA)
    {
        //Prepare for a new run...
        //1. Reset lists
        this.__out.Clear();
        this.__err.Clear();

        this.Component           = owner;
        this.Iteration           = iteration;
        this.GrasshopperDocument = owner.OnPingDocument();
        this.RhinoDocument       = rhinoDocument as Rhino.RhinoDoc;

        this.owner    = this.Component;
        this.runCount = this.Iteration;
        this.doc      = this.RhinoDocument;

        //2. Assign input parameters
        List <Plane> Pl = null;

        if (inputs[0] != null)
        {
            Pl = GH_DirtyCaster.CastToList <Plane>(inputs[0]);
        }
        List <int> id = null;

        if (inputs[1] != null)
        {
            id = GH_DirtyCaster.CastToList <int>(inputs[1]);
        }
        List <Polyline> body = null;

        if (inputs[2] != null)
        {
            body = GH_DirtyCaster.CastToList <Polyline>(inputs[2]);
        }


        //3. Declare output parameters
        object A = null;


        //4. Invoke RunScript
        RunScript(Pl, id, body, ref A);

        try
        {
            //5. Assign output parameters to component...
            if (A != null)
            {
                if (GH_Format.TreatAsCollection(A))
                {
                    IEnumerable __enum_A = (IEnumerable)(A);
                    DA.SetDataList(1, __enum_A);
                }
                else
                {
                    if (A is Grasshopper.Kernel.Data.IGH_DataTree)
                    {
                        //merge tree
                        DA.SetDataTree(1, (Grasshopper.Kernel.Data.IGH_DataTree)(A));
                    }
                    else
                    {
                        //assign direct
                        DA.SetData(1, A);
                    }
                }
            }
            else
            {
                DA.SetData(1, null);
            }
        }
        catch (Exception ex)
        {
            this.__err.Add(string.Format("Script exception: {0}", ex.Message));
        }
        finally
        {
            //Add errors and messages...
            if (owner.Params.Output.Count > 0)
            {
                if (owner.Params.Output[0] is Grasshopper.Kernel.Parameters.Param_String)
                {
                    List <string> __errors_plus_messages = new List <string>();
                    if (this.__err != null)
                    {
                        __errors_plus_messages.AddRange(this.__err);
                    }
                    if (this.__out != null)
                    {
                        __errors_plus_messages.AddRange(this.__out);
                    }
                    if (__errors_plus_messages.Count > 0)
                    {
                        DA.SetDataList(0, __errors_plus_messages);
                    }
                }
            }
        }
    }
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            GetObject go = new GetObject();

            go.SetCommandPrompt("Select surfaces, polysurfaces, or meshes");
            go.GeometryFilter  = ObjectType.Surface | ObjectType.PolysrfFilter | ObjectType.Mesh;
            go.GroupSelect     = true;
            go.SubObjectSelect = false;
            go.GetMultiple(1, 0);
            if (go.CommandResult() != Result.Success)
            {
                return(go.CommandResult());
            }

            List <Mesh>        InMeshes      = new List <Mesh>(go.ObjectCount);
            List <RhinoObject> InMeshObjects = new List <RhinoObject>(go.ObjectCount);
            List <RhinoObject> InObjects     = new List <RhinoObject>(go.ObjectCount);

            for (int i = 0; i < go.ObjectCount; i++)
            {
                ObjRef objRef = go.Object(i);
                Mesh   mesh   = objRef.Mesh();
                if (null == mesh)
                {
                    InObjects.Add(objRef.Object());
                }
                else
                {
                    InMeshes.Add(mesh);
                    InMeshObjects.Add(objRef.Object());
                }
            }

            ObjRef[] meshRefs = null;
            if (InObjects.Count > 0)
            {
                meshRefs = RhinoObject.GetRenderMeshes(InObjects, true, false);
                if (null != meshRefs)
                {
                    for (int i = 0; i < meshRefs.Length; i++)
                    {
                        Mesh mesh = meshRefs[i].Mesh();
                        if (null != mesh)
                        {
                            InMeshes.Add(mesh);
                        }
                    }
                }
            }

            RhinoViewport vp = doc.Views.ActiveView.ActiveViewport;

            for (int i = 0; i < InMeshes.Count; i++)
            {
                Polyline[] plines = InMeshes[i].GetOutlines(vp);
                if (null != plines)
                {
                    for (int j = 0; j < plines.Length; j++)
                    {
                        Rhino.Geometry.PolylineCurve plineCrv = new PolylineCurve(plines[j]);
                        plineCrv.RemoveShortSegments(RhinoMath.SqrtEpsilon);
                        if (plineCrv.IsValid)
                        {
                            Guid        objId = doc.Objects.AddCurve(plineCrv);
                            RhinoObject obj   = doc.Objects.Find(objId);
                            if (null != obj)
                            {
                                obj.Select(true);
                            }
                        }
                    }
                }
            }

            for (int i = 0; i < InObjects.Count; i++)
            {
                InObjects[i].Select(false);
            }
            for (int i = 0; i < InMeshObjects.Count; i++)
            {
                InMeshObjects[i].Select(false);
            }

            doc.Views.Redraw();

            return(Result.Success);
        }
Beispiel #55
0
        protected override bool ReadFile(string filename, int index, RhinoDoc doc, FileReadOptions options)
        {
            string line;

            // Read the file and display it line by line.
            StreamReader file   = new StreamReader(filename);
            var          obj    = new ASCObject();
            var          points = new List <Point3d>();
            var          y      = 0;

            while ((line = file.ReadLine()) != null)
            {
                string[] components = Regex.Split(line, @"\s+");
                if (components.Length == 2)
                {
                    var val = components[1];
                    switch (components[0])
                    {
                    case "ncols": obj.ncols = int.Parse(val); break;

                    case "nrows": obj.nrows = int.Parse(val); break;

                    case "xllcorner": obj.xllcorner = int.Parse(val); break;

                    case "yllcorner": obj.yllcorner = int.Parse(val); break;

                    case "cellsize": obj.cellsize = float.Parse(val); break;

                    case "NODATA_value": obj.NODATA_value = float.Parse(val); break;
                    }
                }
                else
                {
                    var x = 0;
                    foreach (var item in components)
                    {
                        float _x = obj.xllcorner + obj.cellsize * x;
                        float _y = obj.yllcorner - obj.cellsize * y + obj.cellsize * obj.nrows;
                        float _z = float.Parse(item);
                        points.Add(new Point3d(_x, _y, _z));
                        x += 1;
                    }
                    y++;
                }
            }

            var importAsPointCloud = true;
            var importAsMesh       = true;

            if (!Settings.TryGetBool(ASCImportOptionPageLayout.KEY_POINTCLOUD, out importAsPointCloud))
            {
                importAsPointCloud = false;
            }

            if (!Settings.TryGetBool(ASCImportOptionPageLayout.KEY_MESH, out importAsMesh))
            {
                importAsPointCloud = true;
            }

            if (importAsPointCloud)
            {
                var pc = new PointCloud(points);
                doc.Objects.AddPointCloud(pc);
            }

            if (importAsMesh)
            {
                int  faceCount = 0;
                Mesh mesh      = new Mesh();
                mesh.Vertices.AddVertices(points);

                for (int i = 0; i < obj.nrows * (obj.ncols - 1); i++)
                {
                    if (faceCount < (obj.nrows - 1))
                    {
                        var A    = i;
                        var B    = i + 1;
                        var C    = (i + obj.nrows) + 1;
                        var D    = (i + obj.nrows);
                        var face = new MeshFace(A, B, C, D);
                        mesh.Faces.AddFace(face);
                        faceCount += 1;
                    }
                    else
                    {
                        faceCount = 0;
                    }
                }
                mesh.FaceNormals.ComputeFaceNormals();
                mesh.Compact();
                doc.Objects.AddMesh(mesh);
            }

            doc.Views.Redraw();
            file.Close();
            return(true);
        }
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            m_tolerance = doc.ModelAbsoluteTolerance;

            // only use a custom geometry filter if no simpler filter does the job

            // only curves
            var gc = new GetObject();

            gc.SetCommandPrompt("select curve");
            gc.GeometryFilter = ObjectType.Curve;
            gc.DisablePreSelect();
            gc.SubObjectSelect = false;
            gc.Get();
            if (gc.CommandResult() != Result.Success)
            {
                return(gc.CommandResult());
            }
            if (null == gc.Object(0).Curve())
            {
                return(Result.Failure);
            }
            Rhino.RhinoApp.WriteLine("curve was selected");

            // only closed curves
            var gcc = new GetObject();

            gcc.SetCommandPrompt("select closed curve");
            gcc.GeometryFilter          = ObjectType.Curve;
            gcc.GeometryAttributeFilter = GeometryAttributeFilter.ClosedCurve;
            gcc.DisablePreSelect();
            gcc.SubObjectSelect = false;
            gcc.Get();
            if (gcc.CommandResult() != Result.Success)
            {
                return(gcc.CommandResult());
            }
            if (null == gcc.Object(0).Curve())
            {
                return(Result.Failure);
            }
            Rhino.RhinoApp.WriteLine("closed curve was selected");

            // only circles with a radius of 10
            var gcc10 = new GetObject();

            gcc10.SetCommandPrompt("select circle with radius of 10");
            gc.GeometryFilter = ObjectType.Curve;
            gcc10.SetCustomGeometryFilter(CircleWithRadiusOf10GeometryFilter); // custom geometry filter
            gcc10.DisablePreSelect();
            gcc10.SubObjectSelect = false;
            gcc10.Get();
            if (gcc10.CommandResult() != Result.Success)
            {
                return(gcc10.CommandResult());
            }
            if (null == gcc10.Object(0).Curve())
            {
                return(Result.Failure);
            }
            RhinoApp.WriteLine("circle with radius of 10 was selected");

            return(Result.Success);
        }
Beispiel #57
0
 protected override Result RunCommand(RhinoDoc doc, RunMode mode)
 {
     // TODO: complete command.
     return(Result.Success);
 }
Beispiel #58
0
        protected override Result RunCommand(RhinoDoc doc, RunMode mode)
        {
            // Locals
            Plane     plane;
            Point3d   base_point = Point3d.Unset;
            Point3d   ref_point  = Point3d.Unset;
            GetResult res        = GetResult.Nothing;
            Result    rc         = Result.Nothing;


            // Select objects to rotate
            TransformObjectList list = new TransformObjectList();

            rc = SelectObjects("Select objects to rotate", list);
            if (rc != Result.Success)
            {
                return(rc);
            }

            GetPoint gp = new GetPoint();

            gp.SetCommandPrompt("Center of rotation");
            gp.Get();
            if (gp.CommandResult() != Result.Success)
            {
                return(gp.CommandResult());
            }

            RhinoView view = gp.View();

            if (null == view)
            {
                return(Result.Failure);
            }

            base_point   = gp.Point();
            plane        = view.ActiveViewport.ConstructionPlane();
            plane.Origin = base_point;


            // Angle or first reference point
            GetReferencePoint gr = new GetReferencePoint(base_point);

            gr.SetCommandPrompt("Angle or first reference point");
            res = gr.Get();
            if (res == GetResult.Point)
            {
                view = gr.View();
                rc   = (null != view) ? Result.Success : Result.Failure;
                if (rc == Result.Success)
                {
                    plane        = view.ActiveViewport.ConstructionPlane();
                    plane.Origin = base_point;
                    ref_point    = plane.ClosestPoint(gr.Point());
                    if (base_point.DistanceTo(ref_point) <= RhinoMath.ZeroTolerance)
                    {
                        rc = Result.Nothing;
                    }
                }
                if (rc != Result.Success)
                {
                    return(rc);
                }
            }
            else if (res == GetResult.Number)
            {
                Transform xform = Transform.Rotation(Rhino.RhinoMath.ToRadians(gr.Number()), plane.Normal, base_point);
                rc = (xform.IsValid) ? Result.Success : Result.Failure;
                if (rc == Result.Success)
                {
                    TransformObjects(list, xform, false, false);
                    doc.Views.Redraw();
                }
                return(rc);
            }
            else
            {
                return(Result.Cancel);
            }


            // Second reference point
            GetRotationTransform gx = new GetRotationTransform(plane, base_point, ref_point);

            gx.SetCommandPrompt("Second reference point");
            gx.AddTransformObjects(list);
            res = gx.GetXform();
            if (res == GetResult.Point)
            {
                view = gx.View();
                rc   = (null != view) ? Result.Success : Result.Failure;
                if (rc == Result.Success)
                {
                    Transform xform = gx.CalculateTransform(view.ActiveViewport, gx.Point());
                    rc = (xform.IsValid) ? Result.Success : Result.Failure;
                    if (rc == Result.Success)
                    {
                        TransformObjects(list, xform, false, false);
                        doc.Views.Redraw();
                    }
                }
            }
            else if (res == GetResult.Number)
            {
                Transform xform = Transform.Rotation(Rhino.RhinoMath.ToRadians(gx.Number()), plane.Normal, base_point);
                rc = (xform.IsValid) ? Result.Success : Result.Failure;
                if (rc == Result.Success)
                {
                    TransformObjects(list, xform, false, false);
                    doc.Views.Redraw();
                }
            }
            else
            {
                rc = Result.Cancel;
            }

            return(rc);
        }
Beispiel #59
0
        public static void FloorOrientPosition(Point3d startPos, ref List <double> zPositions, RhinoDoc rhinoDocument)
        {
            RhinoObject[] byLayer = rhinoDocument.Objects.FindByLayer("#VR User Defined Floors");
            if (byLayer == null || byLayer.Length < 1)
            {
                return;
            }
            List <Brep> brepList1 = new List <Brep>();

            for (int index = 0; index < byLayer.Length; ++index)
            {
                ObjRef objRef = new ObjRef(byLayer[index]);
                if (objRef != null)
                {
                    Brep brep = objRef.Brep();
                    if (brep != null)
                    {
                        brepList1.Add(brep);
                    }
                }
            }
            List <Brep>    brepList2    = brepList1;
            List <Point3d> point3dList1 = new List <Point3d>();

            point3dList1.Add(startPos);
            List <Point3d> point3dList2      = point3dList1;
            Vector3d       vector3d          = new Vector3d(0.0, 0.0, -1.0);
            double         absoluteTolerance = rhinoDocument.ModelAbsoluteTolerance;

            Point3d[] breps = Intersection.ProjectPointsToBreps((IEnumerable <Brep>)brepList2, (IEnumerable <Point3d>)point3dList2, vector3d, absoluteTolerance);
            if (breps != null && breps.Length > 0)
            {
                foreach (Point3d point3d in breps)
                {
                    // ISSUE: explicit reference operation
                    double z = ((Point3d)@point3d).Z;
                    zPositions.Add(z + VR_PANEL.EyeHeight);
                }
            }
            else
            {
                // ISSUE: explicit reference operation
                zPositions.Add(((Point3d)@startPos).Z);
            }
        }
Beispiel #60
0
 protected override Result Render(RhinoDoc doc, RunMode mode, bool fastPreview)
 {
     RhinoApp.WriteLine("_Render command support not yet implemented");
     return(Result.Nothing);
 }