+ //================================================================================
+ /*!
+ * \brief Return angle between mesh segments of given EDGEs meeting at theVertexNode
+ */
+ //================================================================================
+
+ double getAngleByNodes( const int theE1Index,
+ const int theE2Index,
+ const SMDS_MeshNode* theVertexNode,
+ const StdMeshers_FaceSide& theFaceSide,
+ const gp_Vec& theFaceNormal)
+ {
+ int eID1 = theFaceSide.EdgeID( theE1Index );
+ int eID2 = theFaceSide.EdgeID( theE2Index );
+
+ const SMDS_MeshNode *n1 = 0, *n2 = 0;
+ bool is1st;
+ SMDS_ElemIteratorPtr segIt = theVertexNode->GetInverseElementIterator( SMDSAbs_Edge );
+ while ( segIt->more() )
+ {
+ const SMDS_MeshElement* seg = segIt->next();
+ int shapeID = seg->GetShapeID();
+ if ( shapeID == eID1 )
+ is1st = true;
+ else if ( shapeID == eID2 )
+ is1st = false;
+ else
+ continue;
+ ( is1st ? n1 : n2 ) = seg->GetNodeWrap( 1 + seg->GetNodeIndex( theVertexNode ));
+ }
+
+ if ( !n1 || !n2 )
+ {
+ std::vector<const SMDS_MeshNode*> nodes;
+ for ( int is2nd = 0; is2nd < 2; ++is2nd )
+ {
+ const SMDS_MeshNode* & n = is2nd ? n2 : n1;
+ if ( n ) continue;
+ nodes.clear();
+ if ( is2nd ) theFaceSide.GetEdgeNodes( theE2Index, nodes );
+ else theFaceSide.GetEdgeNodes( theE1Index, nodes );
+ if ( nodes.size() >= 2 )
+ {
+ if ( nodes[0] == theVertexNode )
+ n = nodes[1];
+ else
+ n = nodes[ nodes.size() - 2 ];
+ }
+ }
+ }
+ double angle = -2 * M_PI;
+ if ( n1 && n2 )
+ {
+ SMESH_NodeXYZ p1 = n1, p2 = theVertexNode, p3 = n2;
+ gp_Vec v1( p1, p2 ), v2( p2, p3 );
+ try
+ {
+ angle = v1.AngleWithRef( v2, theFaceNormal );
+ }
+ catch(...)
+ {
+ }
+ if ( std::isnan( angle ))
+ angle = -2 * M_PI;
+ }
+ return angle;
+ }
+