Sweeping Surfaces with Sweep1
Windows only
Demonstrates how to use the CArgsRhinoSweep1 class and the RhinoSweep1 function. The definitions of these can be found in rhinoSdkSweep.h.
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;
}