developer:sdksamples:sweep1


How To: Sweeping Surfaces using RhinoSweep1

C++, .NET

Version: Rhino 4

The following sample code demonstrates how to use the CArgsRhinoSweep1 class and the RhinoSweep1 SDK function. The definitions of these can be found in rhinoSdkSweep.h.

Note, this example does not perform any curve sorting or direction matching. This is the responsibility of the the SDK developer.

C++

CRhinoCommand::result CCommandTest::RunCommand( const CRhinoCommandContext& context )
{
  CRhinoGetObject go;
  go.SetCommandPrompt( L"Select rail curve" );
  go.SetGeometryFilter( CRhinoGetObject::curve_object );
  go.GetObjects(1,1);
  if( go.CommandResult() != success )
    return go.CommandResult();
 
  const CRhinoObjRef& rail_ref = go.Object(0);
  const CRhinoObject* rail_obj = rail_ref.Object();
  if( !rail_obj )
    return failure;
  const ON_Curve* rail_crv = rail_ref.Curve();
  if( !rail_crv )
    return failure;
 
  CRhinoGetObject gx;
  gx.SetCommandPrompt( L"Select cross section curves" );
  gx.SetGeometryFilter( CRhinoGetObject::curve_object );
  gx.EnablePreSelect( false );
  gx.EnableDeselectAllBeforePostSelect( false );
  gx.GetObjects(1,0);
  if( gx.CommandResult() != success )
    return gx.CommandResult();
 
  CRhinoPolyEdge edge;
  edge.Create( rail_crv, rail_obj );
 
  CArgsRhinoSweep1 args;
  args.m_rail_curve = edge.Duplicate();
  args.m_bHaveRailPickPoint = false;
  args.m_bClosed = rail_crv->IsClosed();
  args.m_bUsePivotPoint = false;
 
  int i;
  for( i = 0; i < gx.ObjectCount(); i++ )
  {
    const CRhinoObjRef& obj_ref = gx.Object(i);
    const ON_Curve* crv = obj_ref.Curve();
    if( crv )
    {
      ON_Curve* dup_crv = crv->DuplicateCurve();
 
      double t = 0;
      edge.GetClosestPoint( dup_crv->PointAtStart(), &t );
 
      args.m_shape_curves.Append( dup_crv );
      args.m_rail_params.Append( t );
      args.m_shape_objrefs.Append( obj_ref );
    }
  }
 
  // Start and end points
  args.m_bUsePoints[0] = 0;
  args.m_bUsePoints[1] = 0;
 
  // Point objects picked for endpoints
  args.m_bClosed = false; 
  args.m_style = 0;
  args.m_planar_up = ON_zaxis; // Don't need this, but set it anyway.. 
  args.m_simplify = 0; // Simplify method for shape curves
  args.m_rebuild_count = -1; // Sample point count for rebuilding shapes
  args.m_refit_tolerance = context.m_doc.AbsoluteTolerance();
  args.m_sweep_tolerance = context.m_doc.AbsoluteTolerance();
  args.m_angle_tolerance = context.m_doc.AngleToleranceRadians();
  args.m_miter_type = 0; // 0: don't miter
 
  ON_SimpleArray<ON_Brep*> breps;
  if( RhinoSweep1(args, breps) )
  {
    for( i = 0; i < breps.Count(); i++ )
    {
      context.m_doc.AddBrepObject( *breps[i] );
      delete breps[i];
    }
  }
 
  // Clean up
  delete args.m_rail_curve;
 
  for( i = 0; i < args.m_shape_curves.Count(); i++ )
    delete args.m_shape_curves[i];
 
  context.m_doc.Redraw();
 
  return success;
}

VB.NET

Public Overrides Function RunCommand(ByVal context As RhinoCommandContext) _
  As IRhinoCommand.result
  Dim go As New MRhinoGetObject()
  go.SetCommandPrompt("Select rail curve")
  go.SetGeometryFilter(IRhinoGetObject.GEOMETRY_TYPE_FILTER.curve_object)
  go.GetObjects(1, 1)
  If (go.CommandResult() <> IRhinoCommand.result.success) Then
    Return go.CommandResult()
  End If
 
  Dim rail_ref As MRhinoObjRef = go.Object(0)
  Dim rail_obj As IRhinoObject = rail_ref.Object()
  Dim rail_crv As IOnCurve = rail_ref.Curve()
  If (rail_obj Is Nothing Or rail_crv Is Nothing) Then
    Return IRhinoCommand.result.failure
  End If
 
  Dim gx As New MRhinoGetObject()
  gx.SetCommandPrompt("Select cross section curves")
  gx.SetGeometryFilter(IRhinoGetObject.GEOMETRY_TYPE_FILTER.curve_object)
  gx.EnablePreSelect(False)
  gx.EnableDeselectAllBeforePostSelect(False)
  gx.GetObjects(1, 0)
  If (gx.CommandResult() <> IRhinoCommand.result.success) Then
    Return gx.CommandResult()
  End If
 
  Dim edge As New MRhinoPolyEdge()
  edge.Create(rail_crv, rail_obj)
 
  Dim args As New MArgsRhinoSweep1()
  args.m_rail_curve = edge.Duplicate()
  args.m_bHaveRailPickPoint = False
  args.m_bClosed = rail_crv.IsClosed()
  args.m_bUsePivotPoint = False
 
  Dim curves As New System.Collections.Generic.List(Of OnCurve)()
 
  For i As Integer = 0 To gx.ObjectCount() - 1
    Dim obj_ref As MRhinoObjRef = gx.Object(i)
    Dim crv As IOnCurve = obj_ref.Curve()
    If (crv IsNot Nothing) Then
      Dim dup_crv As OnCurve = crv.DuplicateCurve()
      Dim t As Double = 0
      edge.GetClosestPoint(dup_crv.PointAtStart(), t)
      curves.Add(dup_crv)
      args.m_rail_params.Append(t)
      args.m_shape_objrefs.Append(obj_ref)
    End If
  Next
  args.m_shape_curves = curves.ToArray()
 
  ' Start and end points
  args.m_bUsePoints(0) = 0
  args.m_bUsePoints(1) = 0
 
  ' Point objects picked for endpoints
  args.m_bClosed = False
  args.m_style = 0
  args.m_planar_up = New On3dVector(OnUtil.On_zaxis)
  args.m_simplify = 0 'Simplify method for shape curves
  args.m_rebuild_count = -1 'Sample point count for rebuilding shapes
  args.m_refit_tolerance = context.m_doc.AbsoluteTolerance()
  args.m_sweep_tolerance = context.m_doc.AbsoluteTolerance()
  args.m_angle_tolerance = context.m_doc.AngleToleranceRadians()
  args.m_miter_type = 0 '0: don't miter

  Dim breps() As OnBrep = Nothing
  If (RhUtil.RhinoSweep1(args, breps)) Then
    For Each b As OnBrep In breps
      context.m_doc.AddBrepObject(b)
    Next
  End If
  context.m_doc.Redraw()
  Return IRhinoCommand.result.success
End Function

C#

public override IRhinoCommand.result RunCommand(IRhinoCommandContext context)
{
  MRhinoGetObject go = new MRhinoGetObject();
  go.SetCommandPrompt( "Select rail curve" );
  go.SetGeometryFilter( IRhinoGetObject.GEOMETRY_TYPE_FILTER.curve_object );
  go.GetObjects(1,1);
  if( go.CommandResult() != IRhinoCommand.result.success )
    return go.CommandResult();
 
  MRhinoObjRef rail_ref = go.Object(0);
  IRhinoObject rail_obj = rail_ref.Object();
  IOnCurve rail_crv = rail_ref.Curve();
  if( rail_obj == null | rail_crv == null )
    return IRhinoCommand.result.failure;
 
  MRhinoGetObject gx = new MRhinoGetObject();
  gx.SetCommandPrompt( "Select cross section curves" );
  gx.SetGeometryFilter( IRhinoGetObject.GEOMETRY_TYPE_FILTER.curve_object );
  gx.EnablePreSelect( false );
  gx.EnableDeselectAllBeforePostSelect( false );
  gx.GetObjects(1,0);
  if( gx.CommandResult() != IRhinoCommand.result.success )
    return gx.CommandResult();
 
  MRhinoPolyEdge edge = new MRhinoPolyEdge();
  edge.Create( rail_crv, rail_obj );
 
  MArgsRhinoSweep1 args = new MArgsRhinoSweep1();
  args.m_rail_curve = edge.Duplicate();
  args.m_bHaveRailPickPoint = false;
  args.m_bClosed = rail_crv.IsClosed();
  args.m_bUsePivotPoint = false;
 
  System.Collections.Generic.List<OnCurve> curves =
       new System.Collections.Generic.List<OnCurve>();
  for( int i=0; i<gx.ObjectCount(); i++ )
  {
    MRhinoObjRef obj_ref = gx.Object(i);
    IOnCurve crv = obj_ref.Curve();
    if( crv != null )
    {
      OnCurve dup_crv = crv.DuplicateCurve();
      double t = 0;
      edge.GetClosestPoint( dup_crv.PointAtStart(), ref t );
      curves.Add( dup_crv );
      args.m_rail_params.Append( t );
      args.m_shape_objrefs.Append( obj_ref );
    }
  }
  args.m_shape_curves = curves.ToArray();
 
  // Start and end points
  args.set_m_bUsePoints(0, 0);
  args.set_m_bUsePoints(1, 0);
 
  // Point objects picked for endpoints
  args.m_bClosed = false; 
  args.m_style = 0;
  // Don't need this, but set it anyway.. 
  args.m_planar_up = new On3dVector(OnUtil.On_zaxis);
  args.m_simplify = 0; // Simplify method for shape curves
  args.m_rebuild_count = -1; // Sample point count for rebuilding shapes
  args.m_refit_tolerance = context.m_doc.AbsoluteTolerance();
  args.m_sweep_tolerance = context.m_doc.AbsoluteTolerance();
  args.m_angle_tolerance = context.m_doc.AngleToleranceRadians();
  args.m_miter_type = 0; // 0: don't miter
 
  OnBrep[] breps = null;
  if( RhUtil.RhinoSweep1( ref args, out breps ) )
  {
    for( int i=0; i<breps.Length; i++ )
      context.m_doc.AddBrepObject( breps[i] );
  }
  context.m_doc.Redraw();
  return IRhinoCommand.result.success;
}
developer/sdksamples/sweep1.txt · Last modified: 2010/01/26 16:37 (external edit) Driven by DokuWiki Recent changes RSS feed

 © 1997-2010 

McNeel North America Europe Latin AmericaAsia