Rhino C++ API
8.10
|
#include <opennurbs_brep.h>
Public Member Functions | |
ON_BrepEdge () | |
ON_BrepEdge (int) | |
edge index More... | |
ON_Brep * | Brep () const |
bool | ChangeEdgeCurve (int c3i) |
ON_COMPONENT_INDEX | ComponentIndex () const override |
virtual ON_Geometry::ComponentIndex() override More... | |
ON__UINT32 | DataCRC (ON__UINT32 current_remainder) const override |
virtual ON_Object::DataCRC override More... | |
void | Dump (ON_TextLog &) const override |
virtual ON_Object::Dump() override More... | |
int | EdgeCurveIndexOf () const |
Implementation. More... | |
const ON_Curve * | EdgeCurveOf () const |
bool | Get3dVectorsIntoFaces (double edge_t, ON_SimpleArray< ON_3dVector > &V, ON_SimpleArray< ON_3dVector > &N) const |
bool | IsClosed () const override |
virtual ON_Curve::IsClosed override More... | |
bool | IsSmoothManifoldEdge (double angle_tolerance=ON_DEFAULT_ANGLE_TOLERANCE) const |
bool | IsValid (class ON_TextLog *text_log=nullptr) const override |
ON::object_type | ObjectType () const override |
ON_BrepEdge & | operator= (const ON_BrepEdge &) |
unsigned int | ProxyBrepSubDEdgeId () const |
bool | Read (ON_BinaryArchive &) override |
virtual ON_Object::Read() override More... | |
bool | Reverse () override |
virtual ON_Curve::Reverse override More... | |
unsigned int | SizeOf () const override |
virtual ON_Object::SizeOf override More... | |
ON_BrepTrim * | Trim (int eti) const |
int | TrimCount () const |
void | UnsetPlineEdgeParameters () |
ON_BrepVertex * | Vertex (int evi) const |
bool | Write (ON_BinaryArchive &) const override |
virtual ON_Object::Write() override More... | |
![]() | |
ON_CurveProxy () ON_NOEXCEPT | |
ON_CurveProxy (const ON_Curve *) | |
ON_CurveProxy (const ON_Curve *, ON_Interval) | |
ON_CurveProxy (const ON_CurveProxy &) | |
virtual | ~ON_CurveProxy () |
ON__UINT32 | DataCRC (ON__UINT32 current_remainder) const override |
virtual ON_Object::DataCRC override More... | |
int | Degree () const override |
void | DestroyRuntimeCache (bool bDelete=true) override |
virtual ON_Object::DestroyRuntimeCache override More... | |
int | Dimension () const override |
ON_Geometry overrides. More... | |
ON_Interval | Domain () const override |
ON_Curve overrides. More... | |
void | Dump (ON_TextLog &) const override |
for debugging More... | |
ON_Curve * | DuplicateCurve () const override |
bool | Evaluate (double, int, int, double *, int=0, int *=0) const override |
Domain changes from [a,b] to [-b,-a]. More... | |
bool | GetBBox (double *boxmin, double *boxmax, bool bGrowBox=false) const override |
virtual ON_Geometry GetBBox override More... | |
bool | GetClosestPoint (const ON_3dPoint &, double *, double=0.0, const ON_Interval *=nullptr) const override |
bool | GetCurveParameterFromNurbFormParameter (double, double *) const override |
virtual ON_Curve::GetCurveParameterFromNurbFormParameter override More... | |
bool | GetLength (double *, double=1.0e-8, const ON_Interval *=nullptr) const override |
bool | GetLocalClosestPoint (const ON_3dPoint &, double, double *, const ON_Interval *=nullptr) const override |
bool | GetNextDiscontinuity (ON::continuity c, double t0, double t1, double *t, int *hint=nullptr, int *dtype=nullptr, double cos_angle_tolerance=ON_DEFAULT_ANGLE_TOLERANCE_COSINE, double curvature_tolerance=ON_SQRT_EPSILON) const override |
bool | GetNormalizedArcLengthPoint (double s, double *t, double fractional_tolerance=1.0e-8, const ON_Interval *sub_domain=nullptr) const override |
bool | GetNormalizedArcLengthPoints (int count, const double *s, double *t, double absolute_tolerance=0.0, double fractional_tolerance=1.0e-8, const ON_Interval *sub_domain=nullptr) const override |
int | GetNurbForm (ON_NurbsCurve &, double=0.0, const ON_Interval *=nullptr) const override |
bool | GetNurbFormParameterFromCurveParameter (double, double *) const override |
virtual ON_Curve::GetNurbFormParameterFromCurveParameter override More... | |
bool | GetParameterTolerance (double, double *, double *) const override |
(optional - override if curve is piecewise smooth) More... | |
bool | GetSpanVector (double *) const override |
int | HasNurbForm () const override |
bool | IsArc (const ON_Plane *=nullptr, ON_Arc *=nullptr, double=ON_ZERO_TOLERANCE) const override |
bool | IsClosed (void) const override |
bool | IsContinuous (ON::continuity c, double t, int *hint=nullptr, double point_tolerance=ON_ZERO_TOLERANCE, double d1_tolerance=ON_ZERO_TOLERANCE, double d2_tolerance=ON_ZERO_TOLERANCE, double cos_angle_tolerance=ON_DEFAULT_ANGLE_TOLERANCE_COSINE, double curvature_tolerance=ON_SQRT_EPSILON) const override |
bool | IsInPlane (const ON_Plane &, double=ON_ZERO_TOLERANCE) const override |
bool | IsLinear (double=ON_ZERO_TOLERANCE) const override |
bool | IsPeriodic (void) const override |
periodic.) More... | |
bool | IsPlanar (ON_Plane *=nullptr, double=ON_ZERO_TOLERANCE) const override |
int | IsPolyline (ON_SimpleArray< ON_3dPoint > *pline_points=nullptr, ON_SimpleArray< double > *pline_t=nullptr) const override |
virtual override of ON_Curve::IsPolyline More... | |
bool | IsShort (double tolerance, const ON_Interval *sub_domain=0, double *length_estimate=0) const override |
bool | IsValid (class ON_TextLog *text_log=nullptr) const override |
ON_Object overrides. More... | |
ON_CurveProxy & | operator= (const ON_CurveProxy &) |
const ON_Curve * | ProxyCurve () const |
ON_Interval | ProxyCurveDomain () const |
bool | ProxyCurveIsReversed () const |
bool | Read (ON_BinaryArchive &) override |
double | RealCurveParameter (double t) const |
bool | Reverse () override |
bool | SetDomain (double t0, double t1) override |
bool | SetDomain (ON_Interval domain) |
void | SetProxyCurve (const ON_Curve *real_curve) |
void | SetProxyCurve (const ON_Curve *real_curve, ON_Interval real_curve_subdomain) |
bool | SetProxyCurveDomain (ON_Interval proxy_curve_subdomain) |
unsigned int | SizeOf () const override |
virtual ON_Object::SizeOf override More... | |
int | SpanCount () const override |
number of smooth spans in curve More... | |
bool | Split (double t, ON_Curve *&left_side, ON_Curve *&right_side) const override |
override of virtual ON_Curve::Split More... | |
double | ThisCurveParameter (double real_curve_parameter) const |
bool | Transform (const ON_Xform &) override |
bool | Trim (const ON_Interval &domain) override |
override of virtual ON_Curve::Trim More... | |
bool | Write (ON_BinaryArchive &) const override |
![]() | |
ON_Curve () ON_NOEXCEPT | |
ON_Curve (const ON_Curve &) | |
virtual | ~ON_Curve () |
bool | AreaMassProperties (ON_3dPoint base_point, ON_3dVector plane_normal, ON_MassProperties &mp, bool bArea=true, bool bFirstMoments=true, bool bSecondMoments=true, bool bProductMoments=true, double rel_tol=1.0e-6, double abs_tol=1.0e-6) const |
virtual bool | ChangeClosedCurveSeam (double t) |
bool | ChangeClosedCurveSeam (double t, double min_dist) |
virtual bool | ChangeDimension (int desired_dimension) |
virtual class ON_CurveTree * | CreateCurveTree () const |
ON_3dVector | CurvatureAt (double t) const |
const class ON_CurveTree * | CurveTree () const |
ON_3dVector | DerivativeAt (double t) const |
void | DestroyCurveTree () |
bool | Ev1Der (double t, ON_3dPoint &point, ON_3dVector &first_derivative, int side=0, int *hint=0) const |
bool | Ev2Der (double t, ON_3dPoint &point, ON_3dVector &first_derivative, ON_3dVector &second_derivative, int side=0, int *hint=0) const |
bool | EvaluatePoint (const class ON_ObjRef &objref, ON_3dPoint &P) const override |
virtual ON_Geometry override More... | |
bool | EvCurvature (double t, ON_3dPoint &point, ON_3dVector &tangent, ON_3dVector &kappa, int side=0, int *hint=0) const |
bool | EvPoint (double t, ON_3dPoint &point, int side=0, int *hint=0) const |
bool | EvSignedCurvature (double t, ON_3dPoint &point, ON_3dVector &tangent, double &kappa, const ON_3dVector *normal=nullptr, int side=0, int *hint=0) const |
bool | EvTangent (double t, ON_3dPoint &point, ON_3dVector &tangent, int side=0, int *hint=0) const |
virtual bool | Extend (const ON_Interval &domain) |
bool | FirstSpanIsLinear (double min_length, double tolerance) const |
bool | FirstSpanIsLinear (double min_length, double tolerance, ON_Line *span_line) const |
bool | FrameAt (double t, ON_Plane &plane) const |
bool | GetDomain (double *t0, double *t1) const |
curve interface More... | |
virtual bool | GetSpanVectorIndex (double t, int side, int *span_vector_index, ON_Interval *span_domain) const |
bool | GetTightBoundingBox (class ON_BoundingBox &tight_bbox, bool bGrowBox=false, const class ON_Xform *xform=nullptr) const override |
virtual ON_Geometry GetTightBoundingBox override More... | |
int | IntersectCurve (const ON_Curve *curveB, ON_SimpleArray< ON_X_EVENT > &x, double intersection_tolerance=0.0, double overlap_tolerance=0.0, const ON_Interval *curveA_domain=0, const ON_Interval *curveB_domain=0) const |
int | IntersectPlane (ON_PlaneEquation plane_equation, ON_SimpleArray< ON_X_EVENT > &x, double intersection_tolerance=0.0, double overlap_tolerance=0.0, const ON_Interval *curve_domain=0) const |
virtual int | IntersectSelf (ON_SimpleArray< ON_X_EVENT > &x, double intersection_tolerance=0.0, const ON_Interval *curve_domain=0) const |
int | IntersectSurface (const ON_Surface *surfaceB, ON_SimpleArray< ON_X_EVENT > &x, double intersection_tolerance=0.0, double overlap_tolerance=0.0, const ON_Interval *curveA_domain=0, const ON_Interval *surfaceB_udomain=0, const ON_Interval *surfaceB_vdomain=0) const |
bool | IsArcAt (double t, const ON_Plane *plane=0, ON_Arc *arc=0, double tolerance=ON_ZERO_TOLERANCE, double *t0=0, double *t1=0) const |
bool | IsClosable (double tolerance, double min_abs_size=0.0, double min_rel_size=10.0) const |
virtual bool | IsEllipse (const ON_Plane *plane=nullptr, ON_Ellipse *ellipse=nullptr, double tolerance=ON_ZERO_TOLERANCE) const |
bool | LastSpanIsLinear (double min_length, double tolerance) const |
bool | LastSpanIsLinear (double min_length, double tolerance, ON_Line *span_line) const |
bool | LengthMassProperties (class ON_MassProperties &mp, bool bLength=true, bool bFirstMoments=true, bool bSecondMoments=true, bool bProductMoments=true, double rel_tol=1.0e-6, double abs_tol=1.0e-6) const |
class ON_PolylineCurve * | MeshCurve (ON_MeshCurveParameters &mp, ON_PolylineCurve *polyline, bool bSkipFirstPoint, const ON_Interval *domain) const |
ON_NurbsCurve * | NurbsCurve (ON_NurbsCurve *pNurbsCurve=nullptr, double tolerance=0.0, const ON_Interval *subdomain=nullptr) const |
ON::object_type | ObjectType () const override |
ON_Curve & | operator= (const ON_Curve &) |
ON_3dPoint | PointAt (double t) const |
ON_3dPoint | PointAtEnd () const |
ON_3dPoint | PointAtStart () const |
virtual bool | RemoveShortSegments (double tolerance, bool bRemoveShortSegments=true) |
bool | SetDomain (ON_Interval domain) |
virtual bool | SetEndPoint (ON_3dPoint end_point) |
virtual bool | SetStartPoint (ON_3dPoint start_point) |
double | SignedCurvatureAt (double t, const ON_3dVector *plane_normal=nullptr) const |
ON_3dVector | TangentAt (double t) const |
![]() | |
ON_Geometry ()=default | |
ON_Geometry (const ON_Geometry &)=default | |
~ON_Geometry ()=default | |
ON_BoundingBox | BoundingBox () const |
virtual class ON_Brep * | BrepForm (class ON_Brep *brep=nullptr) const |
virtual void | ClearBoundingBox () |
bool | GetBoundingBox (ON_3dPoint &bbox_min, ON_3dPoint &bbox_max, bool bGrowBox=false) const |
bool | GetBoundingBox (ON_BoundingBox &bbox, bool bGrowBox=false) const |
virtual bool | HasBrepForm () const |
virtual bool | IsDeformable () const |
virtual bool | IsMorphable () const |
bool | IsValid (class ON_TextLog *text_log=nullptr) const override |
virtual bool | MakeDeformable () |
virtual bool | Morph (const class ON_SpaceMorph &morph) |
ON_Geometry & | operator= (const ON_Geometry &)=default |
bool | Rotate (double rotation_angle, const ON_3dVector &rotation_axis, const ON_3dPoint &rotation_center) |
bool | Rotate (double sin_angle, double cos_angle, const ON_3dVector &rotation_axis, const ON_3dPoint &rotation_center) |
bool | Scale (double scale_factor) |
virtual bool | SwapCoordinates (int i, int j) |
const ON_BoundingBox | TightBoundingBox () const |
bool | Translate (const ON_3dVector &translation_vector) |
![]() | |
ON_Object () ON_NOEXCEPT | |
ON_Object (const ON_Object &) | |
virtual | ~ON_Object () |
virtual ON_AggregateComponentStatus | AggregateComponentStatus () const |
bool | AttachUserData (class ON_UserData *pUserData) |
unsigned int | ClearAllComponentStates () const |
virtual unsigned int | ClearComponentStates (ON_COMPONENT_INDEX component_index, ON_ComponentStatus states_to_clear) const |
virtual unsigned int | ClearComponentStates (ON_ComponentStatus states_to_clear) const |
void | CopyUserData (const ON_Object &source_object) |
unsigned int | CopyUserData (const ON_Object &source_object, ON_UUID source_userdata_item_id, ON_Object::UserDataConflictResolution userdata_conflict_resolution) |
virtual bool | DeleteComponents (const ON_COMPONENT_INDEX *ci_list, size_t ci_count) |
bool | DetachUserData (class ON_UserData *pUserData) |
void | EmergencyDestroy () |
class ON_UserData * | FirstUserData () const |
virtual unsigned int | GetComponentsWithSetStates (ON_ComponentStatus states_filter, bool bAllEqualStates, ON_SimpleArray< ON_COMPONENT_INDEX > &components) const |
class ON_UserData * | GetUserData (const ON_UUID &userdata_uuid) const |
bool | GetUserString (const wchar_t *key, ON_wString &string_value) const |
int | GetUserStringKeys (ON_ClassArray< ON_wString > &user_string_keys) const |
int | GetUserStrings (ON_ClassArray< ON_UserString > &user_strings) const |
bool | IsCorrupt (bool bRepair, bool bSilentError, class ON_TextLog *text_log) const |
bool | IsKindOf (const ON_ClassId *pClassId) const |
virtual void | MarkAggregateComponentStatusAsNotCurrent () const |
virtual void | MemoryRelocate () |
virtual ON_UUID | ModelObjectId () const |
void | MoveUserData (ON_Object &source_object) |
unsigned int | MoveUserData (ON_Object &source_object, ON_UUID source_userdata_item_id, ON_Object::UserDataConflictResolution userdata_conflict_resolution, bool bDeleteAllSourceItems) |
ON_Object & | operator= (const ON_Object &) |
void | PurgeUserData () |
virtual unsigned int | SetComponentStates (ON_COMPONENT_INDEX component_index, ON_ComponentStatus states_to_set) const |
virtual unsigned int | SetComponentStatus (ON_COMPONENT_INDEX component_index, ON_ComponentStatus status_to_copy) const |
bool | SetUserString (const wchar_t *key, const wchar_t *string_value) |
int | SetUserStrings (int count, const ON_UserString *user_strings, bool bReplace) |
bool | ThisIsNullptr (bool bSilentError) const |
void | TransformUserData (const class ON_Xform &xform) |
virtual bool | UpdateReferencedComponents (const class ON_ComponentManifest &source_manifest, const class ON_ComponentManifest &destination_manifest, const class ON_ManifestMap &manifest_map) |
int | UserStringCount () const |
Public Attributes | |
int | m_c3i = -1 |
int | m_edge_index = -1 |
index of edge in ON_Brep.m_E[] array More... | |
ON_U | m_edge_user |
ON_ComponentStatus | m_status = ON_ComponentStatus::NoneSet |
ON_SimpleArray< int > | m_ti |
indices of Trims that use this edge More... | |
double | m_tolerance = ON_UNSET_VALUE |
int | m_vi [2] |
Friends | |
class | ON_Brep |
Description: Brep edge information is stored in ON_BrepEdge classes. ON_Brep.m_E[] is an array of all the edges in the brep.
An ON_BrepEdge is derived from ON_CurveProxy so the the edge can supply easy to use evaluation tools via the ON_Curve virtual member functions.
Note well that the domains and orientations of the curve m_C3[edge.m_c3i] and the edge as a curve may not agree. April 24, 2017 Dale Lear ON_Curve::Trim(const ON_Interval&) is a virtual function and ON_BrepEdge derives from ON_CurveProxy which derives from ON_Curve. The ON_Brep::Trim(int) function was added and mistakenly named "Trim". This all happened about twenty years ago.
Both the virtual ON_Curve::Trim(const ON_Interval&) and ON_BrepEdge::Trim(int) functions are widely used. At some point the functionON_Brep::Trim() will be deprecated and the 4263 warning ON_Brep::Trim(int) generates will be disabled for the definition of class ON_BrepEdge. In version 7, ON_Brep::Trim(int) will be deleted and the warning will no longer be disabled.
ON_BrepEdge::ON_BrepEdge | ( | ) |
Construction
In general, you should not directly create ON_BrepEdge classes. Use ON_Brep::NewVertex instead.
ON_BrepEdge::ON_BrepEdge | ( | int | ) |
edge index
ON_Brep* ON_BrepEdge::Brep | ( | ) | const |
Returns: Brep this edge belongs to.
bool ON_BrepEdge::ChangeEdgeCurve | ( | int | c3i | ) |
Description: Expert user tool that replaces the 3d curve geometry of an edge Parameters; c3i - [in] brep 3d curve index of new curve Returns: True if successful. Example:
ON_Curve* pCurve = ...; int c3i = brep.AddEdgeCurve(pCurve); edge.ChangeEdgeCurve(c3i);
Remarks: Sets m_c3i, calls SetProxyCurve, cleans runtime caches.
|
overridevirtual |
virtual ON_Geometry::ComponentIndex() override
Reimplemented from ON_Geometry.
|
overridevirtual |
virtual ON_Object::DataCRC override
Reimplemented from ON_Object.
|
overridevirtual |
int ON_BrepEdge::EdgeCurveIndexOf | ( | ) | const |
Implementation.
Returns: brep.m_C3[] index of the 3d curve geometry used by this edge or -1.
const ON_Curve* ON_BrepEdge::EdgeCurveOf | ( | ) | const |
Returns: 3d curve geometry used by this edge or nullptr.
bool ON_BrepEdge::Get3dVectorsIntoFaces | ( | double | edge_t, |
ON_SimpleArray< ON_3dVector > & | V, | ||
ON_SimpleArray< ON_3dVector > & | N | ||
) | const |
Description: For each trim at this edge, find the 3d unit vector at the edge parameter in the trim's surface tan plane, perpendicular to the edge, which points to the active side of the trim Parameters: edge_t - [in] parameter of this edge. V - [out] 3d vectors pointing into the faces. One for each trim, in order of m_ti. N - [out] Surface normals at edge_t. Parallel to V. Returns: True if vectors can be found. False if edge tangent or surface normals can't be found, or if input is bad.
|
overridevirtual |
virtual ON_Curve::IsClosed override
Reimplemented from ON_Curve.
bool ON_BrepEdge::IsSmoothManifoldEdge | ( | double | angle_tolerance = ON_DEFAULT_ANGLE_TOLERANCE | ) | const |
Not necessary. Base class does the right thing. ON_CurveProxy does not have an override. / virtual ON_Curve::SetStartPoint override bool SetStartPoint( ON_3dPoint start_point );
/ virtual ON_Curve::SetEndPoint override bool SetEndPoint( ON_3dPoint end_point ); Description: For a manifold, non-boundary edge, decides whether or not the two surfaces on either side meet smoothly. Parameters: angle_tolerance - [in] used to decide if surface normals on either side are parallel. Returns: true if edge is manifold, has exactly 2 trims, and surface normals on either side agree to within angle_tolerance.
|
overridevirtual |
Description: Tests an object to see if its data members are correctly initialized. Parameters: text_log - [in] if the object is not valid and text_log is not nullptr, then a brief english description of the reason the object is not valid is appended to the log. The information appended to text_log is suitable for low-level debugging purposes by programmers and is not intended to be useful as a high level user interface tool. Returns: @untitled table true object is valid false object is invalid, uninitialized, etc.
Reimplemented from ON_Object.
|
overridevirtual |
virtual ON_Object function The ON_BrepEdge override returns ON::curve_object.
Reimplemented from ON_Object.
ON_BrepEdge& ON_BrepEdge::operator= | ( | const ON_BrepEdge & | ) |
unsigned int ON_BrepEdge::ProxyBrepSubDEdgeId | ( | ) | const |
Returns: If this edge is part of a brep created by ON_SubD::ProxyBrep(), then the subd component id of the corresponding SubD edge is returned. Otherwise 0 is returned.
|
overridevirtual |
virtual ON_Object::Read() override
Reimplemented from ON_Object.
|
overridevirtual |
virtual ON_Curve::Reverse override
Implements ON_Curve.
|
overridevirtual |
virtual ON_Object::SizeOf override
Reimplemented from ON_Object.
ON_BrepTrim* ON_BrepEdge::Trim | ( | int | eti | ) | const |
Parameters: eti - [in] index into the edge's m_ti[] array. Returns: The trim brep.m_T[edge.m_ti[eti]]; Remarks: This version of "Trim" hides the virtual function ON_CurveProxy::Trim(const ON_Interval&), which is a good thing. Special care must be taken when changing the geometry of a brep edge to insure vertex, trim, and edge information remains valid.
int ON_BrepEdge::TrimCount | ( | ) | const |
Returns: Number of trims attached to this edge.
void ON_BrepEdge::UnsetPlineEdgeParameters | ( | ) |
Description: When an edge is modified, the m_pline[].e values need to be set to ON_UNSET_VALUE by calling UnsetPlineEdgeParameters().
ON_BrepVertex* ON_BrepEdge::Vertex | ( | int | evi | ) | const |
Parameters: evi - [in] 0 or 1 Returns: Brep vertex at specified end of the edge.
|
overridevirtual |
virtual ON_Object::Write() override
Reimplemented from ON_Object.
|
friend |
int ON_BrepEdge::m_c3i = -1 |
index of 3d curve in m_C3[] array (edge.m_curve also points to m_C3[m_c3i])
int ON_BrepEdge::m_edge_index = -1 |
index of edge in ON_Brep.m_E[] array
|
mutable |
Union available for application use. The constructor zeros m_edge_user. The value is of m_edge_user is not saved in 3DM archives and may be changed by some computations.
|
mutable |
ON_SimpleArray<int> ON_BrepEdge::m_ti |
indices of Trims that use this edge
double ON_BrepEdge::m_tolerance = ON_UNSET_VALUE |
accuracy of edge curve (>=0.0 or ON_UNSET_VALUE)
A value of ON_UNSET_VALUE indicates that the tolerance should be computed.
The maximum distance from the edge's 3d curve to any surface of a face that has this edge as a portion of its boundary must be <= this tolerance.
int ON_BrepEdge::m_vi[2] |
indices of starting/ending vertex
For closed edges, m_vi[0] = m_vi[1] and m_edge_index appears twice in the m_V[m_vi[0]].m_ei[] array. The first occurrence of m_edge_index in m_V[m_vi[0]].m_ei[] is for the closed edge starting the vertex. The second occurrence of m_edge_index in m_V[m_vi[0]].m_ei[] is for the closed edge edge ending at the vertex. C.f. ON_Brep::Next/PrevEdge().