Salome HOME
0020279: [CEA 334] control the "random" use when using mesh algorithms
authoreap <eap@opencascade.com>
Wed, 20 May 2009 15:45:54 +0000 (15:45 +0000)
committereap <eap@opencascade.com>
Wed, 20 May 2009 15:45:54 +0000 (15:45 +0000)
   fix for SIGSEGV on quadratic  mesh

src/StdMeshers/StdMeshers_Penta_3D.cxx

index 93bb7fd5c8560e8cb764f34b65f559ac94d06d9b..3ff7db018d29e5499a1d20906f5b195f4e756bd3 100644 (file)
@@ -34,7 +34,7 @@
 #include "SMDS_VolumeTool.hxx"
 #include "SMESHDS_SubMesh.hxx"
 #include "SMESH_Mesh.hxx"
-#include "SMESH_MeshEditor.hxx"
+#include "SMESH_MesherHelper.hxx"
 #include "SMESH_subMesh.hxx"
 #include "SMESH_subMeshEventListener.hxx"
 #include "SMESH_Comment.hxx"
@@ -103,10 +103,6 @@ bool StdMeshers_Penta_3D::Compute(SMESH_Mesh& aMesh,
     return bOK;
   }
 
-  SMESH_MesherHelper helper(aMesh);
-  myTool = &helper;
-  myCreateQuadratic = myTool->IsQuadraticSubMesh(aShape);
-
   //
   MakeBlock();
   if (!myErrorStatus->IsOK()) {
@@ -117,6 +113,12 @@ bool StdMeshers_Penta_3D::Compute(SMESH_Mesh& aMesh,
   if (!myErrorStatus->IsOK()) {
     return bOK;
   }
+
+  // now unnecessary faces removed, we can load medium nodes
+  SMESH_MesherHelper helper(aMesh);
+  myTool = &helper;
+  myCreateQuadratic = myTool->IsQuadraticSubMesh(aShape);
+
   //
   MakeNodes();
   if (!myErrorStatus->IsOK()) {
@@ -805,8 +807,6 @@ void StdMeshers_Penta_3D::MakeMeshOnFxy1()
     TopoDS::Face(myBlock.Shape(SMESH_Block::ID_Fxy0));
   const TopoDS_Face& aFxy1=
     TopoDS::Face(myBlock.Shape(SMESH_Block::ID_Fxy1));
-  SMESH_MesherHelper faceHelper( *GetMesh() );
-  faceHelper.IsQuadraticSubMesh(aFxy1);
   //
   SMESH_Mesh* pMesh = GetMesh();
   SMESHDS_Mesh * meshDS = pMesh->GetMeshDS();
@@ -861,10 +861,10 @@ void StdMeshers_Penta_3D::MakeMeshOnFxy1()
     SMDS_MeshFace * face = 0;
     switch ( aNbNodes ) {
     case 3:
-      face = faceHelper.AddFace(aNodes1[0], aNodes1[1], aNodes1[2]);
+      face = myTool->AddFace(aNodes1[0], aNodes1[1], aNodes1[2]);
       break;
     case 4:
-      face = faceHelper.AddFace(aNodes1[0], aNodes1[1], aNodes1[2], aNodes1[3]);
+      face = myTool->AddFace(aNodes1[0], aNodes1[1], aNodes1[2], aNodes1[3]);
       break;
     default:
       continue;
@@ -1067,7 +1067,7 @@ void StdMeshers_Penta_3D::MakeBlock()
       aElementType = pElement->GetType();
       if (aElementType==SMDSAbs_Face) {
        iNbNodes = pElement->NbNodes();
-       if ( iNbNodes==3 || (myCreateQuadratic && iNbNodes==6) ) {
+       if ( iNbNodes==3 || (pElement->IsQuadratic() && iNbNodes==6) ) {
          aFTr = aF;
          ++iCnt;
          if (iCnt>1) {