Salome HOME
PAL13330( When mesh generation does not success, trace where )
[modules/smesh.git] / src / StdMeshers / StdMeshers_MEFISTO_2D.cxx
index 942f5fa74d0a476cfce382aa33edc8be9009e0f2..cb4e61fc161b2a9531355add902b62fcc010982a 100644 (file)
@@ -34,6 +34,7 @@
 #include "SMESH_subMesh.hxx"
 #include "SMESH_Block.hxx"
 #include "SMESH_MesherHelper.hxx"
+#include "SMESH_Comment.hxx"
 
 #include "StdMeshers_FaceSide.hxx"
 #include "StdMeshers_MaxElementArea.hxx"
@@ -179,6 +180,12 @@ bool StdMeshers_MEFISTO_2D::Compute(SMESH_Mesh & aMesh, const TopoDS_Shape & aSh
 
   TopoDS_Face F = TopoDS::Face(aShape.Oriented(TopAbs_FORWARD));
 
+  // helper builds quadratic mesh if necessary
+  SMESH_MesherHelper helper(aMesh);
+  myTool = &helper;
+  _quadraticMesh = myTool->IsQuadraticSubMesh(aShape);
+  const bool ignoreMediumNodes = _quadraticMesh;
+
   // get all edges of a face
   TopoDS_Vertex V1;
   list< TopoDS_Edge > edges;
@@ -203,28 +210,23 @@ bool StdMeshers_MEFISTO_2D::Compute(SMESH_Mesh & aMesh, const TopoDS_Shape & aSh
     {
       wireEdges.splice(wireEdges.end(), wireEdges,
                        wireEdges.begin(), ++wireEdges.begin());
-      if ( from->IsSame( wireEdges.front() )) {
-        MESSAGE( "No nodes on vertices on wire " << iW+1);
-        return false;
-      }
+      if ( from->IsSame( wireEdges.front() ))
+        return error(COMPERR_BAD_INPUT_MESH,"No nodes on vertices");
     }
-    StdMeshers_FaceSide* wire = new StdMeshers_FaceSide( F, wireEdges, &aMesh, true );
+    StdMeshers_FaceSide* wire = new StdMeshers_FaceSide( F, wireEdges, &aMesh,
+                                                         true, ignoreMediumNodes);
     wires[ iW ] = StdMeshers_FaceSidePtr( wire );
     if (_hypLengthFromEdges && wire->NbSegments() )
       _edgeLength += wire->Length() / wire->NbSegments();
     from = to;
   }
   if ( wires[0]->NbSegments() < 3 ) // ex: a circle with 2 segments
-    return false;
+    return error(COMPERR_BAD_INPUT_MESH,
+                 SMESH_Comment("Too few segments")<<wires[0]->NbSegments());
 
   if (_hypLengthFromEdges && _edgeLength < DBL_MIN )
     _edgeLength = 100;
 
-  // helper builds a quadratic mesh if necessary
-  myTool = new SMESH_MesherHelper(aMesh);
-  auto_ptr<SMESH_MesherHelper> helperDeleter( myTool );
-  _quadraticMesh = myTool->IsQuadraticSubMesh(aShape);
-
   Z nblf;                 //nombre de lignes fermees (enveloppe en tete)
   Z *nudslf = NULL;       //numero du dernier sommet de chaque ligne fermee
   R2 *uvslf = NULL;       
@@ -251,7 +253,7 @@ bool StdMeshers_MEFISTO_2D::Compute(SMESH_Mesh & aMesh, const TopoDS_Shape & aSh
   // count nb of input points
   for ( int iW = 0; iW < nbWires; ++iW )
   {
-    nbpnt += wires[iW]->NbSegments();
+    nbpnt += wires[iW]->NbPoints() - 1;
     nudslf[iw++] = nbpnt;
   }
 
@@ -281,7 +283,7 @@ bool StdMeshers_MEFISTO_2D::Compute(SMESH_Mesh & aMesh, const TopoDS_Shape & aSh
     }
     else
     {
-      MESSAGE("Error in Triangulation");
+      error(ierr,"Error in Triangulation (aptrte())");
     }
   }
   if (nudslf != NULL) delete[]nudslf;
@@ -495,7 +497,7 @@ bool StdMeshers_MEFISTO_2D::LoadPoints(TWireVector &                 wires,
     TopExp::MapShapesAndAncestors( F, TopAbs_VERTEX, TopAbs_WIRE, VWMap );
     int nbVertices = 0;
     for ( int iW = 0; iW < wires.size(); ++iW )
-      nbVertices += wires[ iW ]->NbSegments();
+      nbVertices += wires[ iW ]->NbEdges();
     if ( nbVertices == VWMap.Extent() )
       VWMap.Clear(); // wires have no common vertices
   }
@@ -510,8 +512,12 @@ bool StdMeshers_MEFISTO_2D::LoadPoints(TWireVector &                 wires,
   {
     const vector<UVPtStruct>& uvPtVec = wires[ iW ]->GetUVPtStruct(isXConst,constValue);
     if ( uvPtVec.size() != wires[ iW ]->NbPoints() ) {
-      MESSAGE("Wrong nb UVPtStruct: "<<uvPtVec.size()<<" != "<<wires[ iW ]->NbPoints());
-      return false;
+      return error(COMPERR_BAD_INPUT_MESH,SMESH_Comment("Unexpected nb of points on wire ")
+                   << iW << uvPtVec.size()<<" != "<<wires[ iW ]->NbPoints());
+    }
+    if ( m + uvPtVec.size()-1 > mefistoToDS.size() ) {
+      MESSAGE("Wrong mefistoToDS.size: "<<mefistoToDS.size()<<" < "<<m + uvPtVec.size()-1);
+      return error(dfltErr(),"Internal error");
     }
 
     vector<UVPtStruct>::const_iterator uvPt = uvPtVec.begin();