McNeel Wiki
Creating Aligned Dimensions
edit · print · help · all topics
Main Pages

AccuRender

Bongo

Brazil r/s

Developer

Flamingo

Penguin

Rhino Blogs

Rhino

Rhino Labs

Search

Languages

Česky

Deutsch

English

Español

Français

Italiano

Polish

日本語

한국어

中文(繁體)

中文(简体)

 
.
Developer.NET
SummaryDemonstrates how to create linear dimensions lined up with two points using the Rhino SDK.

Question

I would like to create aligned dimensions from my plug-in but I am not sure how. Can you help?

Answer

There are two ways you can create aligned dimensions. You can use the MArgsRhinoDimLinear class and the RhinoGetDimLinear function to interactively create a MRhinoLinearDimension object. Or, if you know the dimension points in advance, just create the MRhinoLinearDimension object by hand.

To interactivly create an aligned dimension, you can do something like the following:

C#

  public override IRhinoCommand.result RunCommand(IRhinoCommandContext context)
  {
    MArgsRhinoDimLinear args = new MArgsRhinoDimLinear();
    args.SetFirstPointPrompt( "First dimension point" );
    args.SetSecondPointPrompt( "Second dimension point" );
    args.SetDragPointPrompt( "Dimension location" );
    args.SetStyle( IArgsRhinoDimLinear.eStyle.aligned );
    args.SetIsInteractive( context.IsInteractive() ? true : false );


    MRhinoLinearDimension dim = new MRhinoLinearDimension();
    IRhinoCommand.result rc = RhUtil.RhinoGetDimLinear( ref args, out dim );
    if (rc == IRhinoCommand.result.success)
    {
      context.m_doc.AddObject( dim );
      context.m_doc.Redraw();
    }


    return rc;
  }

If you know the dimension points in advance, you can create an aligned dimension by hand as follows:

C#

  public override IRhinoCommand.result RunCommand(IRhinoCommandContext context)
  {
    // Get the active view
    MRhinoView view = RhUtil.RhinoApp().ActiveView();
    if (view == null)
      return IRhinoCommand.result.failure;


    // Our hard-coded 3-D dimension points
    On3dPoint p0 = new On3dPoint(1, 1, 0);
    On3dPoint p2 = new On3dPoint(11, 11, 0);
    On3dPoint pt = new On3dPoint((p2.x-p0.x)/2.0, 3, 0);


    // Calculate the dimension plane
    OnPlane plane = new OnPlane(view.ActiveViewport().ConstructionPlane().m_plane);
    plane.SetOrigin(p0);


    // Calculate rotation angle
    double[] u = new double[2] { 0.0, 0.0 };
    double[] v = new double[2] { 0.0, 0.0 };
    plane.ClosestPointTo(p0, ref u[0], ref v[0]);
    plane.ClosestPointTo(p2, ref u[1], ref v[1]);
    On2dVector angle = new On2dVector(u[1]-u[0], v[1]-v[0]);
    angle.Unitize();


    // Rotate the plane
    plane.Rotate(angle.y, angle.x, plane.Normal());


    // Create new linear (aligned) dimension
    MRhinoLinearDimension dim = new MRhinoLinearDimension();
    dim.m_linear_dimension.m_type = IOn.eAnnotationType.dtDimAligned;


    // Set the dimension plane
    dim.SetPlane(plane);


    // Set the first plane-based point
    dim.SetPoint(0, new On2dPoint(0.0, 0.0));


    // Set the second plane-based point
    double s = 0, t = 0;
    plane.ClosestPointTo(p2, ref s, ref t);
    dim.SetPoint(2, new On2dPoint(s, t));


    // Set the remaining plane-based point
    plane.ClosestPointTo(pt, ref s, ref t);
    On2dPoint pt2d = new On2dPoint(s, t);
    dim.UpdateDimPoints(ref pt2d);


    // Calculate text location and format string
    dim.UpdateText();


    // Add to document
    context.m_doc.AddObject( dim );
    context.m_doc.Redraw();


    return IRhinoCommand.result.success;
  }
Last Modified [10/8/2008] rename · changes · history · subscriptions · references · file upload