Grasshopper

algorithmic modeling for Rhino

is it possible to exent the Rhinocommon sdk with custom classes?

Hi

is it possible to exend the RhinoCommon sdk with custom classes und functions within the namespace?

thanxs in advance.

Michael

Views: 718

Replies to This Discussion

Hi Michael,

You can write extension methods, is that the sort of thing you were looking for? What exactly are you trying to accomplish?

--

David Rutten

david@mcneel.com

Poprad, Slovakia

Hi David,

I have some functions and own libaries which I often use. I do not want to always attach them as assembly but simply have a kind of dummy .dll with exents the Rhinocommon.dll and the Rhino namespace.... somekind of playground which you can manipulate your way but is a standard part of rhinocommon.

Ah and what would be also very cool is a conduit which can be selected like a curve,brep etc. but does something totaly different (somethin you can modify) Till now I have a custom selector which is totally crap. I want to build a own contrained parametric sketcher for grasshopper. This is only some testing code.

I will send you something. As a idea....

  private void RunScript(List<GeometryBase> x, object y, ref object A, ref object B)
  {
    Rhino.Geometry.GeometryBase geobase_result;
    List<Rhino.Geometry.GeometryBase> geobase_ll = x;


    Point3d point = new Point3d(12, 12, 12);
    GetPointAtCursorPos(ref point, geobase_ll, out geobase_result);

    A = point;
    B = geobase_result;
  }

Custom additional code::

  [System.Runtime.InteropServices.DllImport("user32.dll")]
  public static extern bool GetCursorPos(out System.Drawing.Point pt);

  [System.Runtime.InteropServices.DllImport("user32.dll")]
  public static extern bool ScreenToClient(IntPtr hWnd, ref System.Drawing.Point pt);



  public static bool GetPointAtCursorPos(ref Point3d point, List<Rhino.Geometry.GeometryBase> geobase_in, out GeometryBase geobase_out)
  {
    geobase_out = null;
    bool rc = false;
    Rhino.Display.RhinoView view = RhinoDoc.ActiveDoc.Views.ActiveView;
    if (view != null)
    {
      System.Drawing.Point pt;

      if (GetCursorPos(out pt) && ScreenToClient(view.Handle, ref pt))
      {
        Transform xform = Transform.Unset;
        xform = view.ActiveViewport.GetTransform(Rhino.DocObjects.CoordinateSystem.Screen, Rhino.DocObjects.CoordinateSystem.World);
        point = new Point3d(pt.X, pt.Y, 0.0);
        point.Transform(xform);

        //


        Vector3d camera_vector = view.ActiveViewport.CameraDirection;
        Rhino.Geometry.Ray3d my_ray = new Rhino.Geometry.Ray3d(point, camera_vector);
        Line ray_line = new Line(my_ray.Position, my_ray.Direction * 2000000);
        Curve ray_curve = ray_line.ToNurbsCurve();
        int int_sel;
        Point3d pt_crv = Point3d.Unset;
        Point3d pt_obj = Point3d.Unset;

        ray_curve.ClosestPoints(geobase_in, out pt_crv, out pt_obj, out int_sel);

        if (theshold() > pt_crv.DistanceTo(pt_obj))
        {
          geobase_out = geobase_in[int_sel];
        }

        else {geobase_out = null;}
        //


        rc = true;
      }
    }
    return rc;
  }


  public static double theshold()
  {
    Point3d[] rec_pt = RhinoDoc.ActiveDoc.Views.ActiveView.ActiveViewport.GetNearRect();

    double aspect = rec_pt[0].DistanceTo(rec_pt[2]);
    return aspect / 100;
  }

If you want to use types and methods defined in a specific assembly, you must reference that assembly at compiletime. You could do these things via reflection or dynamic, but it's going to be a major pain in the behind real soon compared to proper referenced assemblies.

--

David Rutten

david@mcneel.com

Poprad, Slovakia

RSS

About

Translate

Search

Photos

  • Add Photos
  • View All

Videos

  • Add Videos
  • View All

© 2024   Created by Scott Davidson.   Powered by

Badges  |  Report an Issue  |  Terms of Service