- // get vertices of theBaseEdge
- TopoDS_Vertex vfb, vlb, vft; // first and last, bottom and top vertices
- TopoDS_Edge eFrw = TopoDS::Edge( theBaseEdge.Oriented( TopAbs_FORWARD ));
- TopExp::Vertices( eFrw, vfb, vlb );
-
- // find the other edges of theFace and orientation of e1
- TopoDS_Edge e1, e2, eTop;
- bool rev1, CumOri = false;
- TopExp_Explorer exp( theFace, TopAbs_EDGE );
- int nbEdges = 0;
- for ( ; exp.More(); exp.Next() ) {
- if ( ++nbEdges > 4 ) {
- return false; // more than 4 edges in theFace
- }
- TopoDS_Edge e = TopoDS::Edge( exp.Current() );
- if ( theBaseEdge.IsSame( e ))
- continue;
- TopoDS_Vertex vCommon;
- if ( !TopExp::CommonVertex( theBaseEdge, e, vCommon ))
- eTop = e;
- else if ( vCommon.IsSame( vfb )) {
- e1 = e;
- vft = TopExp::LastVertex( e1, CumOri );
- rev1 = vfb.IsSame( vft );
- if ( rev1 )
- vft = TopExp::FirstVertex( e1, CumOri );
- }
- else
- e2 = e;
- }
- if ( nbEdges < 4 ) {
- return false; // less than 4 edges in theFace
- }
- if ( e2.IsNull() && vfb.IsSame( vlb ))
- e2 = e1;
-
- // submeshes corresponding to shapes
- SMESHDS_SubMesh* smFace = theMesh->MeshElements( theFace );
- SMESHDS_SubMesh* smb = theMesh->MeshElements( theBaseEdge );
- SMESHDS_SubMesh* smt = theMesh->MeshElements( eTop );
- SMESHDS_SubMesh* sm1 = theMesh->MeshElements( e1 );
- SMESHDS_SubMesh* sm2 = theMesh->MeshElements( e2 );
- SMESHDS_SubMesh* smVfb = theMesh->MeshElements( vfb );
- SMESHDS_SubMesh* smVlb = theMesh->MeshElements( vlb );
- SMESHDS_SubMesh* smVft = theMesh->MeshElements( vft );
- if (!smFace || !smb || !smt || !sm1 || !sm2 || !smVfb || !smVlb || !smVft ) {
- RETURN_BAD_RESULT( "NULL submesh " <<smFace<<" "<<smb<<" "<<smt<<" "<<
- sm1<<" "<<sm2<<" "<<smVfb<<" "<<smVlb<<" "<<smVft);
- }
- if ( smb->NbNodes() != smt->NbNodes() || sm1->NbNodes() != sm2->NbNodes() ) {
- RETURN_BAD_RESULT(" Diff nb of nodes on opposite edges" );
- }
- if (smVfb->NbNodes() != 1 || smVlb->NbNodes() != 1 || smVft->NbNodes() != 1) {
- RETURN_BAD_RESULT("Empty submesh of vertex");
- }
- // define whether mesh is quadratic
- bool isQuadraticMesh = false;
- SMDS_ElemIteratorPtr eIt = smFace->GetElements();
- if ( !eIt->more() ) {
- RETURN_BAD_RESULT("No elements on the face");
- }
- const SMDS_MeshElement* e = eIt->next();
- isQuadraticMesh = e->IsQuadratic();
-
- if ( sm1->NbNodes() * smb->NbNodes() != smFace->NbNodes() ) {
- // check quadratic case
- if ( isQuadraticMesh ) {
- // what if there are quadrangles and triangles mixed?
-// int n1 = sm1->NbNodes()/2;
-// int n2 = smb->NbNodes()/2;
-// int n3 = sm1->NbNodes() - n1;
-// int n4 = smb->NbNodes() - n2;
-// int nf = sm1->NbNodes()*smb->NbNodes() - n3*n4;
-// if( nf != smFace->NbNodes() ) {
-// MESSAGE( "Wrong nb face nodes: " <<
-// sm1->NbNodes()<<" "<<smb->NbNodes()<<" "<<smFace->NbNodes());
-// return false;
-// }
- }
- else {
- RETURN_BAD_RESULT( "Wrong nb face nodes: " <<
- sm1->NbNodes()<<" "<<smb->NbNodes()<<" "<<smFace->NbNodes());
- }
- }
- // IJ size
- int vsize = sm1->NbNodes() + 2;
- int hsize = smb->NbNodes() + 2;
- if(isQuadraticMesh) {
- vsize = vsize - sm1->NbNodes()/2 -1;
- hsize = hsize - smb->NbNodes()/2 -1;
- }
-
- // load nodes from theBaseEdge
-
- std::set<const SMDS_MeshNode*> loadedNodes;
- const SMDS_MeshNode* nullNode = 0;