Split Brep Edges
Windows only
Demonstrates how to split the edges of breps.
/*
Description:
Splits a brep edge into two edges.
Parameters:
brep - [in/out] The brep to modify.
edge_index - [in] The index of the edge to split.
edge_t - [in] The parameter on the edge to split at.
Returns:
True if successful, false otherwise.
*/
static bool SplitBrepEdge( ON_Brep& brep, int edge_index, double edge_t )
{
bool rc = true;
const ON_BrepEdge& edge = brep.m_E[edge_index];
int trim_count = edge.TrimCount();
ON_SimpleArray<double> trim_t( trim_count );
trim_t.SetCount( trim_count );
int i;
for( i = 0; i < trim_count; i++ )
{
// Given a trim and parameter on the corresponding 3d edge,
// get the corresponding parameter on the 2d trim curve.
double t = 0.0;
rc = brep.GetTrimParameter( edge.m_ti[i], edge_t, &t );
if( rc )
trim_t[i] = t;
else
break;
}
if( rc )
{
// Splits an edge into two edges. The input edge
// becomes the left portion and a new edge is created
// for the right portion.
rc = brep.SplitEdge( edge_index, edge_t, trim_t, -1 );
// Delete any unreferenced objects from the brep arrays,
// reindexes as needed, and shrinks arrays to minimum required size.
brep.Compact();
// Set the brep's vertex tolerances.
brep.SetVertexTolerances( true );
}
return rc;
}
CRhinoCommand::result CCommandTest::RunCommand( const CRhinoCommandContext& context )
{
// Don't split kinky surfaces...
CRhinoKeepKinkySurfaces keep_kinky_srfs;
CRhinoGetObject go;
go.SetCommandPrompt( L"Select edge to split" );
go.SetGeometryFilter( CRhinoGetObject::curve_object );
go.SetGeometryAttributeFilter( CRhinoGetObject::edge_curve );
go.EnableReferenceObjectSelect( false );
go.GetObjects( 1, 1 );
if( go.CommandResult() != success )
return go.CommandResult();
const CRhinoObjRef objref = go.Object(0);
const CRhinoObject* obj = objref.Object();
const ON_BrepEdge* edge = objref.Edge();
const ON_Brep* brep = objref.Brep();
if( 0 == obj | 0 == edge | 0 == brep )
return failure;
CRhinoGetPoint gp;
gp.SetCommandPrompt( L"Point to split edge" );
gp.Constrain( *edge );
gp.GetPoint();
if( gp.CommandResult() != success )
return gp.CommandResult();
const ON_BrepTrim* trim = 0;
double edge_t = 0;
edge = gp.PointOnEdge( &edge_t, trim );
if( edge )
{
ON_Brep newbrep( *brep );
if( SplitBrepEdge(newbrep, edge->m_edge_index, edge_t) )
{
context.m_doc.ReplaceObject( CRhinoObjRef(obj), newbrep );
context.m_doc.Redraw();
}
}
return success;
}