Site Tools


Differences

This shows you the differences between two versions of the page.

Link to this comparison view

developer:sdksamples:dimradius [2015/09/14] (current)
Line 1: Line 1:
 +====== Creating Radial Dimensions ======
 +====== .NET ======
 +> **Summary:​** //​Demonstrates how to create radial dimensions using the Rhino SDK.//
 +> **NOTICE:** //The Rhino.NET SDK is deprecated in Rhino 5.  This example adapted for the new RhinoCommon SDK is [[developer:​rhinocommonsamples:​addradialdimension|here]]//​
 +=====Question=====
 +I would like to create radial dimensions from my plug-in but I am not sure how. Can you help?
 +
 +=====Answer=====
 +To create a radial dimension, you must create a **MRhinoLinearDimension** object. The radial dimension'​s definition is **ON_RadialDimension2**. Here is the description of **ON_RadialDimension2** found in opennurbs_annotation.h:​
 +
 +
 +<code c++>
 +  The annotation'​s dimstyle controls the position of TEXT, and the size of the arrowheads.
 +
 +  In the picture below, [n] means ON_Annotation2::​m_points[n].
 +
 +  Radial dimensions do not permit user positioned text
 +
 +         knee
 +          [3]--------[2] TEXT
 +          /         ​(tail)
 +         /
 +        /
 +      [1] (arrow head here)
 +
 +  + [0] = (usually at (0,0) = center of circle)
 +
 +</​code>​
 +
 +> **where:** ////
 +
 +  * Arrow head [1] is usually a location the user picked on the curve that is being dimensioned.
 +  * Center [0] is based on the length and direction of the curvature vector at [0].
 +  * Knee [3] is usually the location the user picked constrained in the direction of the curvature vector at [0].
 +
 +The following example demonstrates how to create a radial dimension based on a curve picked by the user. This example differs from Rhino'​s **DimRadial** command in that it does not allow the user to pick the location of the knee point, and it does not orient the dimension'​s plane to be parallel with the active construction plane. But, the example should give you a good understanding of how to create radial dimensions.
 +
 +===== C# =====
 +<code c#>
 +public override IRhinoCommand.result RunCommand(IRhinoCommandContext context)
 +{
 +  // Select curve for radius dimension
 +  MRhinoGetObject go = new MRhinoGetObject();​
 +  go.SetCommandPrompt("​Select curve for radius dimension"​);​
 +  go.SetGeometryFilter(IRhinoGetObject.GEOMETRY_TYPE_FILTER.curve_object);​
 +  go.GetObjects(1,​ 1);
 +  if (go.CommandResult() != IRhinoCommand.result.success)
 +    return go.CommandResult();​
 +
 +  // Get the curve and the location on the curve where the user picked
 +  double t = 0;
 +  IOnCurve curve = go.Object(0).CurveParameter(ref t);
 +  if (curve == null)
 +    return IRhinoCommand.result.failure;​
 +
 +  // Make sure the curve is linear
 +  if (curve.IsLinear() | curve.IsPolyline() > 0)
 +  {
 +    RhUtil.RhinoApp().Print("​Curve must be non-linear.\n"​);​
 +    return IRhinoCommand.result.nothing;​
 +  }
 +
 +  // In this example, just deal with planar curves
 +  OnPlane plane = new OnPlane();
 +  if( !curve.IsPlanar(plane) )
 +  {
 +    RhUtil.RhinoApp().Print("​Curve must be planar.\n"​);​
 +    return IRhinoCommand.result.nothing;​
 +  }
 +
 +  // Get the curvature at the picked location
 +  On3dVector cv = new On3dVector(curve.CurvatureAt(t));​
 +  double len = cv.Length();​
 +  if (len < OnUtil.On_SQRT_EPSILON | len > 1e100)
 +  {
 +    cv.Set(0.0, 0.0, 0.0);
 +    len = 0.0;
 +  }
 +
 +  // Center point at end of radius vector
 +  if (len != 0.0)
 +  {
 +    cv.Unitize();​
 +    cv *= 1.0 / len;
 +  }
 +
 +  // Set dimension plane
 +  On3dPoint crv_pt = new On3dPoint(curve.PointAt(t));​
 +  On3dPoint origin = new On3dPoint(plane.ClosestPointTo(crv_pt + cv));
 +  plane.SetOrigin(origin);​
 +
 +  double u = 0.0, v = 0.0;
 +
 +  // Get arrow location
 +  plane.ClosestPointTo(crv_pt,​ ref u, ref v);
 +  On2dPoint arrow_pt = new On2dPoint(u,​ v);
 +
 +  // Get knee location
 +  plane.ClosestPointTo(crv_pt - cv, ref u, ref v);
 +  On2dPoint knee_pt = new On2dPoint(u,​ v);
 +
 +  // Create radial dimension
 +  MRhinoRadialDimension dim = new MRhinoRadialDimension();​
 +  dim.m_radial_dimension.m_type = IOn.eAnnotationType.dtDimRadius;​
 +  dim.SetUserText("<>"​);​
 +  dim.SetPlane(plane);​
 +  dim.UpdateDimPoints(ref arrow_pt, ref knee_pt);
 +  dim.UpdateText();​
 +
 +  // Add to document
 +  context.m_doc.AddObject(dim);​
 +  context.m_doc.Redraw();​
 +
 +  return IRhinoCommand.result.success;​
 +}
 +
 +</​code>​
 +
 +
 +{{tag>​Developer dotnet}}
  
developer/sdksamples/dimradius.txt ยท Last modified: 2015/09/14 (external edit)