]> SALOME platform Git repositories - plugins/ghs3dplugin.git/commitdiff
Salome HOME
Merge from V6_3_BR BR_ENFORCED_MESH
authorgdd <gdd>
Mon, 2 May 2011 16:14:25 +0000 (16:14 +0000)
committergdd <gdd>
Mon, 2 May 2011 16:14:25 +0000 (16:14 +0000)
configure.ac
src/GHS3DPlugin/GHS3DPlugin_GHS3D.cxx
src/GHS3DPlugin/GHS3DPlugin_GHS3D.hxx

index 5bf9edfe0f64c9963047069a43fbfa81f629200c..78ddc3bbabb2b544642d879ea60c5beb6b80c801 100644 (file)
@@ -27,7 +27,7 @@
 # Modified by : Marc Tajchman (CEA)
 # Created from configure.in.base
 #
-AC_INIT([Salome2 Project GHS3DPLUGIN module],[6.2.0], [webmaster.salome@opencascade.com], [SalomeGHS3DPLUGIN])
+AC_INIT([Salome2 Project GHS3DPLUGIN module],[6.3.0], [webmaster.salome@opencascade.com], [SalomeGHS3DPLUGIN])
 AC_CONFIG_AUX_DIR(adm_local/unix/config_files)
 AC_CANONICAL_HOST
 AC_CANONICAL_TARGET
@@ -389,6 +389,10 @@ if test "X$GMAKE" = "Xyes"; then
 else
    AC_SUBST(SETX) SETX="set -x"
 fi
+
+dnl Build with SMESH cancel compute feature
+AC_DEFINE(WITH_SMESH_CANCEL_COMPUTE)
+
 echo
 echo ---------------------------------------------
 echo generating Makefiles and configure files
index 10dc94c55aae1b7f8d719e138fccc193578a8061..4c5ced2362864d83778b79e6eae7d9b0eb11dfe4 100644 (file)
@@ -139,6 +139,9 @@ GHS3DPlugin_GHS3D::GHS3DPlugin_GHS3D(int hypId, int studyId, SMESH_Gen* gen)
   _compatibleHypothesis.push_back("GHS3D_Parameters");
   _compatibleHypothesis.push_back( StdMeshers_ViscousLayers::GetHypType() );
   _requireShape = false; // can work without shape
+#ifdef WITH_SMESH_CANCEL_COMPUTE
+  _compute_canceled = false;
+#endif
 }
 
 //=============================================================================
@@ -962,10 +965,14 @@ void getShape(Mesh* mesh, Shape shape, Tab *t_Shape) {
 //=======================================================================
 
 
-static bool readGMFFile(const char* theFile, SMESH_MesherHelper*   theHelper,
-                        TIDSortedNodeSet &                  theEnforcedNodes,
-                        TIDSortedElemSet &              theEnforcedTriangles,
-                        TIDSortedElemSet &             theEnforcedQuadrangles)
+static bool readGMFFile(const char* theFile,
+#ifdef WITH_SMESH_CANCEL_COMPUTE
+                        GHS3DPlugin_GHS3D*  theAlgo,
+#endif 
+                        SMESH_MesherHelper* theHelper,
+                        TIDSortedNodeSet &  theEnforcedNodes,
+                        TIDSortedElemSet &  theEnforcedTriangles,
+                        TIDSortedElemSet &  theEnforcedQuadrangles)
 {
   SMESHDS_Mesh* theMesh = theHelper->GetMeshDS();
 
@@ -1003,6 +1010,14 @@ static bool readGMFFile(const char* theFile, SMESH_MesherHelper*   theHelper,
   std::map <GmfKwdCod,int>::const_iterator it = tabRef.begin();
   for ( ; it != tabRef.end() ; ++it)
   {
+#ifdef WITH_SMESH_CANCEL_COMPUTE
+    if(theAlgo->computeCanceled()) {
+      GmfCloseMesh(InpMsh);
+      delete [] GMFNode;
+      delete [] nodeAssigne;
+      return false;
+    }
+#endif
     int dummy;
     GmfKwdCod token = it->first;
     nbRef    = it->second;
@@ -1026,6 +1041,14 @@ static bool readGMFFile(const char* theFile, SMESH_MesherHelper*   theHelper,
       SMDS_MeshNode * aGMFNode;
 
       for ( int iElem = 0; iElem < nbElem; iElem++ ) {
+#ifdef WITH_SMESH_CANCEL_COMPUTE
+        if(theAlgo->computeCanceled()) {
+          GmfCloseMesh(InpMsh);
+          delete [] GMFNode;
+          delete [] nodeAssigne;
+          return false;
+        }
+#endif
         aGMFID = iElem + 1;
         if (ver == GmfFloat) {
           GmfGetLin(InpMsh, token, &VerTab_f[nbElem][0], &VerTab_f[nbElem][1], &VerTab_f[nbElem][2], &dummy);
@@ -1091,6 +1114,14 @@ static bool readGMFFile(const char* theFile, SMESH_MesherHelper*   theHelper,
 
       for ( int iElem = 0; iElem < nbElem; iElem++ )
       {
+#ifdef WITH_SMESH_CANCEL_COMPUTE
+        if(theAlgo->computeCanceled()) {
+          GmfCloseMesh(InpMsh);
+          delete [] GMFNode;
+          delete [] nodeAssigne;
+          return false;
+        }
+#endif
         for ( int iRef = 0; iRef < nbRef; iRef++ )
         {
           aGMFNodeID = id[iElem*tabRef[token]+iRef]; // read nbRef aGMFNodeID
@@ -1127,9 +1158,18 @@ static bool readGMFFile(const char* theFile, SMESH_MesherHelper*   theHelper,
   }
 
   shapeID = theHelper->GetSubShapeID();
-  for ( int i = 0; i < nbVertices; ++i )
+  for ( int i = 0; i < nbVertices; ++i ) {
+#ifdef WITH_SMESH_CANCEL_COMPUTE
+    if(theAlgo->computeCanceled()) {
+      GmfCloseMesh(InpMsh);
+      delete [] GMFNode;
+      delete [] nodeAssigne;
+      return false;
+    }
+#endif
     if ( !nodeAssigne[ i+1 ])
       theMesh->SetNodeInVolume( GMFNode[ i+1 ], shapeID );
+  }
 
   GmfCloseMesh(InpMsh);
   delete [] GMFNode;
@@ -2213,6 +2253,10 @@ static bool writePoints (ofstream &                       theFile,
   int nbEnforcedVertices = theEnforcedVertices.size();
   int nbEnforcedNodes    = theEnforcedNodes.size();
 
+  int aGhs3dID = 1;
+  SMDS_NodeIteratorPtr it = theMesh->nodesIterator();
+  const SMDS_MeshNode* node;
+
   // Issue 020674: EDF 870 SMESH: Mesh generated by Netgen not usable by GHS3D
   // The problem is in nodes on degenerated edges, we need to skip them
   if ( theHelper.HasDegeneratedEdges() )
@@ -2228,13 +2272,26 @@ static bool writePoints (ofstream &                       theFile,
       }
     }
   }
+
+  const bool isQuadMesh = 
+    theHelper.GetMesh()->NbEdges( ORDER_QUADRATIC ) ||
+    theHelper.GetMesh()->NbFaces( ORDER_QUADRATIC ) ||
+    theHelper.GetMesh()->NbVolumes( ORDER_QUADRATIC );
+  if ( isQuadMesh )
+  {
+    // descrease nbNodes by nb of medium nodes
+    while ( it->more() )
+    {
+      node = it->next();
+      if ( !theHelper.IsDegenShape( node->getshapeId() ))
+        nbNodes -= int( theHelper.IsMedium( node ));
+    }
+    it = theMesh->nodesIterator();
+  }
+
   const char* space    = "  ";
   const int   dummyint = 0;
 
-  int aGhs3dID = 1;
-  SMDS_NodeIteratorPtr it = theMesh->nodesIterator();
-  const SMDS_MeshNode* node;
-
   // NB_NODES
   std::cout << std::endl;
   std::cout << "The initial 2D mesh contains :" << std::endl;
@@ -2253,8 +2310,8 @@ static bool writePoints (ofstream &                       theFile,
   while ( it->more() )
   {
     node = it->next();
-    if ( node->GetPosition()->GetTypeOfPosition() == SMDS_TOP_EDGE &&
-         theHelper.IsDegenShape( node->getshapeId() )) // Issue 020674
+    if (( isQuadMesh && theHelper.IsMedium( node )) || // Issue 0021238
+        theHelper.IsDegenShape( node->getshapeId() )) // Issue 0020674
       continue;
 
     theSmdsToGhs3dIdMap.insert( make_pair( node->GetID(), aGhs3dID ));
@@ -2361,6 +2418,9 @@ static bool writePoints (ofstream &                       theFile,
 static bool readResultFile(const int                       fileOpen,
 #ifdef WNT
                            const char*                     fileName,
+#endif
+#ifdef WITH_SMESH_CANCEL_COMPUTE
+                           GHS3DPlugin_GHS3D*              theAlgo,
 #endif
                            SMESH_MesherHelper&             theMesh,
 //                            SMESH_Mesh&                     theMesh,
@@ -2388,7 +2448,7 @@ static bool readResultFile(const int                       fileOpen,
 
   int fileStat;
   int nbElems, nbNodes, nbInputNodes;
-  int nodeId/*, triangleId*/;
+  int nodeId;
   int nbTriangle;
   int ID, shapeID, ghs3dShapeID;
   int IdShapeRef = 1;
@@ -2400,7 +2460,6 @@ static bool readResultFile(const int                       fileOpen,
   const SMDS_MeshNode **node;
 
   tab    = new int[3];
-  //tabID  = new int[nbShape];
   nodeID = new int[4];
   coord  = new double[3];
   node   = new const SMDS_MeshNode*[4];
@@ -2449,6 +2508,10 @@ static bool readResultFile(const int                       fileOpen,
   MESSAGE("nbEnforcedVertices: "<<nbEnforcedVertices);
   // Reading the nodeCoor and update the nodeMap
   for (int iNode=1; iNode <= nbNodes; iNode++) {
+#ifdef WITH_SMESH_CANCEL_COMPUTE
+    if(theAlgo->computeCanceled())
+      return false;
+#endif
     for (int iCoor=0; iCoor < 3; iCoor++)
       coord[ iCoor ] = strtod(ptr, &ptr);
     nodeAssigne[ iNode ] = 1;
@@ -2468,6 +2531,10 @@ static bool readResultFile(const int                       fileOpen,
 
   tabID = new int[nbTriangle];
   for (int i=0; i < nbTriangle; i++) {
+#ifdef WITH_SMESH_CANCEL_COMPUTE
+    if(theAlgo->computeCanceled())
+      return false;
+#endif
     tabID[i] = 0;
     // find the solid corresponding to GHS3D sub-domain following
     // the technique proposed in GHS3D manual in chapter
@@ -2520,6 +2587,10 @@ static bool readResultFile(const int                       fileOpen,
   // Associating the tetrahedrons to the shapes
   shapeID = compoundID;
   for (int iElem = 0; iElem < nbElems; iElem++) {
+#ifdef WITH_SMESH_CANCEL_COMPUTE
+    if(theAlgo->computeCanceled())
+      return false;
+#endif
     for (int iNode = 0; iNode < 4; iNode++) {
       ID = strtol(tetraPtr, &tetraPtr, 10);
       itOnNode = theGhs3dIdToNodeMap.find(ID);
@@ -2571,7 +2642,8 @@ static bool readResultFile(const int                       fileOpen,
       }
     }
     if ( toMeshHoles || shapeID != HOLE_ID ) {
-      aTet = theMeshDS->AddVolume( node[1], node[0], node[2], node[3] );
+      aTet = theMesh.AddVolume( node[1], node[0], node[2], node[3],
+                                  /*id=*/0, /*force3d=*/false);
       theMeshDS->SetMeshElementOnShape( aTet, shapeID );
     }
 #ifdef _DEBUG_
@@ -2831,6 +2903,10 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh&         theMesh,
   std::cout << "Ghs3d execution..." << std::endl;
   std::cout << cmd << std::endl;
 
+#ifdef WITH_SMESH_CANCEL_COMPUTE
+  _compute_canceled = false;
+#endif
+
   system( cmd.ToCString() ); // run
 
   std::cout << std::endl;
@@ -2853,9 +2929,18 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh&         theMesh,
     Ok = false;
   }
   else {
+    bool toMeshHoles =
+      _hyp ? _hyp->GetToMeshHoles(true) : GHS3DPlugin_Hypothesis::DefaultMeshHoles();
+
+    helper.IsQuadraticSubMesh( theShape );
+    helper.SetElementsOnShape( false );
+
     Ok = readResultFile( fileOpen,
 #ifdef WNT
                          aResultFileName.ToCString(),
+#endif
+#ifdef WITH_SMESH_CANCEL_COMPUTE
+                         this,
 #endif
                          /*theMesh, */helper, tabShape, tabBox, _nbShape, aGhs3dIdToNodeMap,
                          toMeshHoles, 
@@ -2922,7 +3007,12 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh&         theMesh,
 // #endif
     removeFile( aSmdsToGhs3dIdMapFileName );
   // The output .mesh file does not contain yet the subdomain-info (Ghs3D 4.2)
-    removeFile( aResultFileName );
+
+#ifdef WITH_SMESH_CANCEL_COMPUTE
+    if (! Ok)
+      if(_compute_canceled)
+        removeFile( aLogFileName );
+#endif
   }
   std::cout << "<" << aResultFileName.ToCString() << "> GHS3D output file ";
   if ( !Ok )
@@ -2943,12 +3033,12 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh&         theMesh,
  */
 //=============================================================================
 bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh&         theMesh,
-                                SMESH_MesherHelper* aHelper)
+                                SMESH_MesherHelper* theHelper)
 {
   MESSAGE("GHS3DPlugin_GHS3D::Compute()");
 
   //SMESHDS_Mesh* meshDS = theMesh.GetMeshDS();
-  TopoDS_Shape theShape = aHelper->GetSubShape();
+  TopoDS_Shape theShape = theHelper->GetSubShape();
 
   // a unique working file name
   // to avoid access to the same files by eg different users
@@ -2958,27 +3048,27 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh&         theMesh,
   TCollection_AsciiString aLogFileName    = aGenericName + ".log";    // log
   TCollection_AsciiString aResultFileName;
   bool Ok;
-#if GHS3D_VERSION < 42
-  TCollection_AsciiString aFacesFileName, aPointsFileName;
-  TCollection_AsciiString aBadResFileName, aBbResFileName;
-  aFacesFileName  = aGenericName + ".faces";  // in faces
-  aPointsFileName = aGenericName + ".points"; // in points
-  aResultFileName = aGenericName + ".noboite";// out points and volumes
-  aBadResFileName = aGenericName + ".boite";  // out bad result
-  aBbResFileName  = aGenericName + ".bb";     // out vertex stepsize
-
-  // -----------------
-  // make input files
-  // -----------------
-
-  ofstream aFacesFile  ( aFacesFileName.ToCString()  , ios::out);
-  ofstream aPointsFile  ( aPointsFileName.ToCString()  , ios::out);
-  Ok = aFacesFile.rdbuf()->is_open() && aPointsFile.rdbuf()->is_open();
-  if (!Ok) {
-    INFOS( "Can't write into " << aFacesFileName);
-    return error( SMESH_Comment("Can't write into ") << aFacesFileName);
-  }
-#else
+// #if GHS3D_VERSION < 42
+//   TCollection_AsciiString aFacesFileName, aPointsFileName;
+//   TCollection_AsciiString aBadResFileName, aBbResFileName;
+//   aFacesFileName  = aGenericName + ".faces";  // in faces
+//   aPointsFileName = aGenericName + ".points"; // in points
+//   aResultFileName = aGenericName + ".noboite";// out points and volumes
+//   aBadResFileName = aGenericName + ".boite";  // out bad result
+//   aBbResFileName  = aGenericName + ".bb";     // out vertex stepsize
+// 
+//   // -----------------
+//   // make input files
+//   // -----------------
+// 
+//   ofstream aFacesFile  ( aFacesFileName.ToCString()  , ios::out);
+//   ofstream aPointsFile  ( aPointsFileName.ToCString()  , ios::out);
+//   Ok = aFacesFile.rdbuf()->is_open() && aPointsFile.rdbuf()->is_open();
+//   if (!Ok) {
+//     INFOS( "Can't write into " << aFacesFileName);
+//     return error( SMESH_Comment("Can't write into ") << aFacesFileName);
+//   }
+// #else
   TCollection_AsciiString aGMFFileName, aRequiredVerticesFileName, aSolFileName;
 #ifdef _DEBUG_
   aGMFFileName    = aGenericName + ".mesh"; // GMF mesh file
@@ -2991,7 +3081,7 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh&         theMesh,
   aRequiredVerticesFileName    = aGenericName + "_required.meshb"; // GMF required vertices mesh file
   aSolFileName    = aGenericName + ".solb"; // GMF solution file
 #endif
-#endif
+// #endif
   
   std::map <int, int> nodeID2nodeIndexMap;
   GHS3DPlugin_Hypothesis::TEnforcedVertexValues enforcedVertices = GHS3DPlugin_Hypothesis::GetEnforcedVertices(_hyp);
@@ -3010,58 +3100,62 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh&         theMesh,
       aQuad2Trias->Compute( theMesh );
       proxyMesh.reset( aQuad2Trias );
     }
-#if GHS3D_VERSION < 42
-    Ok = (writeFaces ( aFacesFile, *proxyMesh, &theMesh, aNodeByGhs3dId, anEnforcedNodeByGhs3dId,
-                       enforcedEdges, enforcedTriangles, enforcedQuadrangles ) &&
-          writePoints( aPointsFile, &theMesh, aNodeByGhs3dId, anEnforcedNodeByGhs3dId,
-                       nodeIDToSizeMap, enforcedVertices, enforcedNodes));
-    int nbEnforcedVertices = enforcedVertices.size();
-    int nbEnforcedNodes = enforcedNodes.size();
-#else
+// #if GHS3D_VERSION < 42
+//     Ok = (writeFaces ( aFacesFile, *proxyMesh, &theMesh, aNodeByGhs3dId, anEnforcedNodeByGhs3dId,
+//                        enforcedEdges, enforcedTriangles, enforcedQuadrangles ) &&
+//           writePoints( aPointsFile, &theMesh, aNodeByGhs3dId, anEnforcedNodeByGhs3dId,
+//                        nodeIDToSizeMap, enforcedVertices, enforcedNodes));
+//     int nbEnforcedVertices = enforcedVertices.size();
+//     int nbEnforcedNodes = enforcedNodes.size();
+// #else
     Ok = writeGMFFile(aGMFFileName.ToCString(), aRequiredVerticesFileName.ToCString(), aSolFileName.ToCString(),
                       *proxyMesh, &theMesh,
                       aNodeByGhs3dId, anEnforcedNodeByGhs3dId,
                       enforcedNodes, enforcedEdges, enforcedTriangles, enforcedQuadrangles,
                       enforcedVertices);
-#endif
+// #endif
   }
   
   TIDSortedNodeSet enforcedNodesFromEnforcedElem;
   for (int i=0;i<anEnforcedNodeByGhs3dId.size();i++)
     enforcedNodesFromEnforcedElem.insert(anEnforcedNodeByGhs3dId[i]);
 
-#if GHS3D_VERSION < 42
-  aFacesFile.close();
-  aPointsFile.close();
-  
-  if ( ! Ok ) {
-    if ( !_keepFiles ) {
-      removeFile( aFacesFileName );
-      removeFile( aPointsFileName );
-    }
-    return error(COMPERR_BAD_INPUT_MESH);
-  }
-  removeFile( aResultFileName ); // needed for boundary recovery module usage
-#endif
+// #if GHS3D_VERSION < 42
+//   aFacesFile.close();
+//   aPointsFile.close();
+//   
+//   if ( ! Ok ) {
+//     if ( !_keepFiles ) {
+//       removeFile( aFacesFileName );
+//       removeFile( aPointsFileName );
+//     }
+//     return error(COMPERR_BAD_INPUT_MESH);
+//   }
+//   removeFile( aResultFileName ); // needed for boundary recovery module usage
+// #endif
 
   // -----------------
   // run ghs3d mesher
   // -----------------
 
   TCollection_AsciiString cmd = TCollection_AsciiString((char*)GHS3DPlugin_Hypothesis::CommandToRun( _hyp, false ).c_str());
-#if GHS3D_VERSION < 42
-  cmd += TCollection_AsciiString(" -f ") + aGenericName;  // file to read
-#else
+// #if GHS3D_VERSION < 42
+//   cmd += TCollection_AsciiString(" -f ") + aGenericName;  // file to read
+// #else
   cmd += TCollection_AsciiString(" --in ") + aGenericName;
 //   cmd += TCollection_AsciiString(" --required_vertices ") + aRequiredVerticesFileName;
   cmd += TCollection_AsciiString(" --out ") + aResultFileName;
-#endif
+// #endif
   cmd += TCollection_AsciiString(" 1>" ) + aLogFileName;  // dump into file
 
   std::cout << std::endl;
   std::cout << "Ghs3d execution..." << std::endl;
   std::cout << cmd << std::endl;
   
+#ifdef WITH_SMESH_CANCEL_COMPUTE
+  _compute_canceled = false;
+#endif
+
   system( cmd.ToCString() ); // run
 
   std::cout << std::endl;
@@ -3070,28 +3164,35 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh&         theMesh,
   // --------------
   // read a result
   // --------------
-#if GHS3D_VERSION < 42
-  int fileOpen = open( aResultFileName.ToCString(), O_RDONLY);
-  if ( fileOpen < 0 ) {
-    std::cout << std::endl;
-    std::cout << "Error when opening the " << aResultFileName.ToCString() << " file" << std::endl;
-    std::cout << "Log: " << aLogFileName << std::endl;
-    std::cout << std::endl;
-    Ok = false;
-  }
-  else {
-    Ok = readResultFile( fileOpen,
-#ifdef WNT
-                         aResultFileName.ToCString(),
+// #if GHS3D_VERSION < 42
+//   int fileOpen = open( aResultFileName.ToCString(), O_RDONLY);
+//   if ( fileOpen < 0 ) {
+//     std::cout << std::endl;
+//     std::cout << "Error when opening the " << aResultFileName.ToCString() << " file" << std::endl;
+//     std::cout << "Log: " << aLogFileName << std::endl;
+//     std::cout << std::endl;
+//     Ok = false;
+//   }
+//   else {
+//     Ok = readResultFile( fileOpen,
+// #ifdef WNT
+//                          aResultFileName.ToCString(),
+// #endif
+// #ifdef WITH_SMESH_CANCEL_COMPUTE
+//                          this,
+// #endif
+//                          theMesh, theShape ,aNodeByGhs3dId, anEnforcedNodeByGhs3dId,
+//                          nbEnforcedVertices, nbEnforcedNodes, 
+//                          enforcedEdges, enforcedTriangles, enforcedQuadrangles );
+//   }
+// #else
+  Ok = readGMFFile(aResultFileName.ToCString(),
+#ifdef WITH_SMESH_CANCEL_COMPUTE
+                   this,
 #endif
-                         theMesh, theShape ,aNodeByGhs3dId, anEnforcedNodeByGhs3dId,
-                         nbEnforcedVertices, nbEnforcedNodes, 
-                         enforcedEdges, enforcedTriangles, enforcedQuadrangles );
-  }
-#else
-  Ok = readGMFFile(aResultFileName.ToCString(), aHelper, 
+                   theHelper, 
                    enforcedNodesFromEnforcedElem, enforcedTriangles, enforcedQuadrangles);
-#endif
+// #endif
   
   // ---------------------
   // remove working files
@@ -3114,19 +3215,40 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh&         theMesh,
     INFOS( "GHS3D Error, command '" << cmd.ToCString() << "' failed" );
     error(COMPERR_ALGO_FAILED, "ghs3d: command not found" );
   }
-#if GHS3D_VERSION < 42
+// #if GHS3D_VERSION < 42
   if ( !_keepFiles )
   {
-    removeFile( aFacesFileName );
-    removeFile( aPointsFileName );
-    removeFile( aResultFileName );
-    removeFile( aBadResFileName );
-    removeFile( aBbResFileName );
-  }
+#ifdef WITH_SMESH_CANCEL_COMPUTE
+    if (! Ok)
+      if(_compute_canceled)
+        removeFile( aLogFileName );
 #endif
+//     removeFile( aFacesFileName );
+//     removeFile( aPointsFileName );
+//     removeFile( aResultFileName );
+//     removeFile( aBadResFileName );
+//     removeFile( aBbResFileName );
+  }
+// #endif
   return Ok;
 }
 
+#ifdef WITH_SMESH_CANCEL_COMPUTE
+void GHS3DPlugin_GHS3D::CancelCompute()
+{
+  _compute_canceled = true;
+#ifdef WNT
+#else
+  TCollection_AsciiString aGenericName
+    = (char*) GHS3DPlugin_Hypothesis::GetFileName(_hyp).c_str();
+  TCollection_AsciiString cmd =
+    TCollection_AsciiString("ps ux | grep ") + aGenericName;
+  cmd += TCollection_AsciiString(" | grep -v grep | awk '{print $2}' | xargs kill -9 > /dev/null 2>&1");
+  system( cmd.ToCString() );
+#endif
+}
+#endif
+
 //================================================================================
 /*!
  * \brief Provide human readable text by error code reported by ghs3d
@@ -3312,6 +3434,10 @@ static char* getIds( char* ptr, int nbIds, vector<int>& ids )
 bool GHS3DPlugin_GHS3D::storeErrorDescription(const TCollection_AsciiString& logFile,
                                               const _Ghs2smdsConvertor &     toSmdsConvertor )
 {
+#ifdef WITH_SMESH_CANCEL_COMPUTE
+  if(_compute_canceled)
+    return error(SMESH_Comment("interruption initiated by user"));
+#endif
   // open file
 #ifdef WNT
   int file = ::_open (logFile.ToCString(), _O_RDONLY|_O_BINARY);
@@ -3708,5 +3834,9 @@ bool GHS3DPlugin_GHS3D::importGMFMesh(const char* theGMFFileName, SMESH_Mesh& th
   SMESH_MesherHelper* helper = new SMESH_MesherHelper(theMesh );
   TIDSortedElemSet dummyElemSet;
   TIDSortedNodeSet dummyNodeSet;
-  return readGMFFile(theGMFFileName, helper, dummyNodeSet , dummyElemSet, dummyElemSet);
+  return readGMFFile(theGMFFileName, 
+#ifdef WITH_SMESH_CANCEL_COMPUTE
+                   this,
+#endif
+                   helper, dummyNodeSet , dummyElemSet, dummyElemSet);
 }
index 7c8358fa74f6b77ee4edf5335d146fe44e544dea..3888942eb37be55059d1483a20300ff7ed93db6e 100644 (file)
@@ -62,6 +62,11 @@ public:
   virtual bool Compute(SMESH_Mesh&         aMesh,
                        const TopoDS_Shape& aShape);
 
+#ifdef WITH_SMESH_CANCEL_COMPUTE
+    virtual void CancelCompute();
+    bool computeCanceled() { return _compute_canceled;};
+#endif
+
   virtual bool Evaluate(SMESH_Mesh& aMesh, const TopoDS_Shape& aShape,
                         MapShapeNbElems& aResMap);
 
@@ -80,6 +85,11 @@ private:
   bool _keepFiles;
   const GHS3DPlugin_Hypothesis* _hyp;
   const StdMeshers_ViscousLayers* _viscousLayersHyp;
+
+#ifdef WITH_SMESH_CANCEL_COMPUTE
+  volatile bool _compute_canceled;
+#endif
+
 };
 
 /*!