Salome HOME
IPAL21363 Compute hangs up on Hypothesis Distribution of Layers.
[modules/smesh.git] / src / StdMeshers / StdMeshers_RadialQuadrangle_1D2D.cxx
index 95423e861795c5e0a07542c5d66bf2aa99a26033..fdb026293d54ea0d58b250f3d6f789d1b8ae8f00 100644 (file)
@@ -206,6 +206,9 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh,
   TopoDS_Face F = TopoDS::Face(aShape);
   Handle(Geom_Surface) S = BRep_Tool::Surface(F);
 
+  // orientation
+  bool IsForward = F.Orientation()==TopAbs_FORWARD;
+
   //cout<<"RadialQuadrangle_1D2D::Compute   nbe = "<<nbe<<endl;
   TopoDS_Edge CircEdge, LinEdge1, LinEdge2;
   if(nbe==1) {
@@ -218,20 +221,23 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh,
     bool ok = _gen->Compute( aMesh, CircEdge, false, MeshDim_1D );
     if( !ok ) return false;
     std::map< double, const SMDS_MeshNode* > theNodes;
-    GetSortedNodesOnEdge(aMesh.GetMeshDS(),CircEdge,true,theNodes);
+    ok = GetSortedNodesOnEdge(aMesh.GetMeshDS(),CircEdge,true,theNodes);
+    if( !ok ) return false;
 
     CNodes.clear();
     std::map< double, const SMDS_MeshNode* >::iterator itn = theNodes.begin();
     const SMDS_MeshNode* NF = (*itn).second;
     CNodes.push_back( (*itn).second );
     double fang = (*itn).first;
-    itn++;
-    for(; itn != theNodes.end(); itn++ ) {
-      CNodes.push_back( (*itn).second );
-      double ang = (*itn).first - fang;
-      if( ang>PI ) ang = ang - 2*PI;
-      if( ang<-PI ) ang = ang + 2*PI;
-      Angles.Append( ang );
+    if ( itn != theNodes.end() ) {
+      itn++;
+      for(; itn != theNodes.end(); itn++ ) {
+        CNodes.push_back( (*itn).second );
+        double ang = (*itn).first - fang;
+        if( ang>PI ) ang = ang - 2*PI;
+        if( ang<-PI ) ang = ang + 2*PI;
+        Angles.Append( ang ); 
+      }
     }
     P1 = gp_Pnt( NF->X(), NF->Y(), NF->Z() );
     P0 = aCirc->Location();
@@ -600,7 +606,7 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh,
       if(ME) meshDS->SetMeshElementOnShape(ME, edgeID);
     }
     // LinEdge2
-    edgeID = meshDS->ShapeToIndex(LinEdge1);
+    edgeID = meshDS->ShapeToIndex(LinEdge2);
     aVec = gp_Vec(P0,P2);
     // check orientation
     Crv = BRep_Tool::Curve(LinEdge2,fp,lp);
@@ -683,12 +689,21 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh,
     tmpNodes[Points.Length()] = CNodes[i];
     // quad
     for(j=0; j<Nodes1.size()-1; j++) {
-      SMDS_MeshFace* MF = myHelper->AddFace( tmpNodes[j], Nodes1[j],
-                                             Nodes1[j+1], tmpNodes[j+1] );
+      SMDS_MeshFace* MF;
+      if(IsForward)
+        MF = myHelper->AddFace( tmpNodes[j], Nodes1[j],
+                                Nodes1[j+1], tmpNodes[j+1] );
+      else
+        MF = myHelper->AddFace( tmpNodes[j], tmpNodes[j+1],
+                                Nodes1[j+1], Nodes1[j] );
       if(MF) meshDS->SetMeshElementOnShape(MF, faceID);
     }
     // tria
-    SMDS_MeshFace* MF = myHelper->AddFace( NC, Nodes1[0], tmpNodes[0] );
+    SMDS_MeshFace* MF;
+    if(IsForward)
+      MF = myHelper->AddFace( NC, Nodes1[0], tmpNodes[0] );
+    else
+      MF = myHelper->AddFace( NC, tmpNodes[0], Nodes1[0] );
     if(MF) meshDS->SetMeshElementOnShape(MF, faceID);
     for(j=0; j<Nodes1.size(); j++) {
       Nodes1[j] = tmpNodes[j];
@@ -697,12 +712,21 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh,
   // create last faces
   // quad
   for(i=0; i<Nodes1.size()-1; i++) {
-    SMDS_MeshFace* MF = myHelper->AddFace( Nodes2[i], Nodes1[i],
-                                           Nodes1[i+1], Nodes2[i+1] );
+    SMDS_MeshFace* MF;
+    if(IsForward)
+      MF = myHelper->AddFace( Nodes2[i], Nodes1[i],
+                              Nodes1[i+1], Nodes2[i+1] );
+    else
+      MF = myHelper->AddFace( Nodes2[i],  Nodes2[i+1],
+                              Nodes1[i+1], Nodes1[i] );
     if(MF) meshDS->SetMeshElementOnShape(MF, faceID);
   }
   // tria
-  SMDS_MeshFace* MF = myHelper->AddFace( NC, Nodes1[0], Nodes2[0] );
+  SMDS_MeshFace* MF;
+  if(IsForward)
+    MF = myHelper->AddFace( NC, Nodes1[0], Nodes2[0] );
+  else
+    MF = myHelper->AddFace( NC, Nodes2[0], Nodes1[0] );
   if(MF) meshDS->SetMeshElementOnShape(MF, faceID);