Site Tools


Differences

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

Link to this comparison view

developer:sdksamples:splitedge [2015/09/14] (current)
Line 1: Line 1:
 +====== Splitting Brep Edges ======
 +> **Developer:​ ** //​[[developer:​cplusplusplugins|C++]]//​
 +> **Summary:​** //​Demonstrates how to split the edges of breps using the Rhino SDK.//
 +=====Question=====
 +I use the **SplitEdge** command to divide the edges of a surface at designated locations. Is there a way to do this from a plug-in?
 +
 +=====Answer=====
 +The following function will split the edge of a brep at at a given location.
 +
 +=====C++=====
 +
 +<code c++>
 +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;
 +}
 +
 +</​code>​
 +You can use the above function as follows:
 +
 +
 +<code c++>
 +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;
 +}
 +</​code>​
 +
 +
 +{{tag>​Developer cplusplus}}
  
developer/sdksamples/splitedge.txt ยท Last modified: 2015/09/14 (external edit)