static bool ChangeTrimBdryToSing( ON_Brep& brep, ON_BrepTrim& trim, ON_BrepTrim* prevtrim, ON_BrepTrim* nexttrim ) { if ( trim.m_vi[0] == trim.m_vi[1] ) return false; if ( trim.m_type == ON_BrepTrim::singular ) return false; if ( trim.m_ei < 0 ) return false; int vi0 = trim.m_vi[0]; int vi1 = trim.m_vi[1]; int sing_vi = vi0; ON_BrepVertex* v0 = brep.Vertex(vi0); if ( v0 ) v0->m_tolerance = ON_UNSET_VALUE; ON_BrepVertex* v1 = brep.Vertex(vi1); if ( v1 ) v1->m_tolerance = ON_UNSET_VALUE; ON_BrepEdge* edge = brep.Edge(trim.m_ei); if ( edge ) { for ( int eti = 0; eti < edge->m_ti.Count(); eti++ ) { if ( edge->m_ti[eti] == trim.m_trim_index ) { edge->m_ti.Remove(eti); break; } } trim.m_ei = -1; if ( 0 == edge->m_ti.Count() ) { brep.DeleteEdge( *edge, true ); } else if ( 1 == edge->m_ti.Count() && ON_BrepTrim::seam == trim.m_type ) { // change neighbor trim type ON_BrepTrim* other_trim = brep.Trim(edge->m_ti[0]); if ( 0 != other_trim && ON_BrepTrim::seam == other_trim->m_type ) { other_trim->m_type = ON_BrepTrim::boundary; int j = (trim.m_bRev3d == other_trim->m_bRev3d) ? 0 : 1; if ( trim.m_vi[0] == other_trim->m_vi[j] && trim.m_vi[1] == other_trim->m_vi[1-j] ) { // we need a new singular vertex sing_vi = brep.NewVertex(ON_UNSET_POINT).m_vertex_index; } } } } trim.m_vi[0] = sing_vi; trim.m_vi[1] = sing_vi; trim.m_type = ON_BrepTrim::singular; trim.m_bRev3d = false; if ( nexttrim ) ChangeTrimVertex( brep,*nexttrim,0,vi1,sing_vi,true,true); if ( prevtrim ) ChangeTrimVertex( brep,*prevtrim,1,vi0,sing_vi,true,true); return true; }