# Differences

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

 — 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++===== + + + 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; + } + + ​ + You can use the above function as follows: + + + + 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; + } + ​ + + + {{tag>​Developer cplusplus}}