]> SALOME platform Git repositories - plugins/netgenplugin.git/blobdiff - src/NETGENPlugin/NETGENPlugin_Mesher.hxx
Salome HOME
Correction for random error with NETGEN when multiple computation run at the same...
[plugins/netgenplugin.git] / src / NETGENPlugin / NETGENPlugin_Mesher.hxx
index 48ea1ec6f03edb6755e5d0a36460855748b16471..4de1ec9f29ae298c4bc5e86ce9356f97cdf07050 100644 (file)
@@ -35,6 +35,7 @@
 #include <SMDS_MeshElement.hxx>
 #include <SMESH_Algo.hxx>
 #include <SMESH_ProxyMesh.hxx>
+#include <SALOMEDS_Tool.hxx>
 
 #include <TopTools_IndexedMapOfShape.hxx>
 
@@ -59,6 +60,32 @@ namespace netgen {
   class OCCGeometry;
   class Mesh;
 }
+
+// Class for temporary folder switching
+class ChdirRAII
+{
+  public:
+#ifndef WIN32
+    ChdirRAII(const std::string& wd):_wd(wd) { if(_wd.empty()) return ; char *pwd(get_current_dir_name()); _od = pwd; free(pwd); chdir(_wd.c_str()); }
+    ~ChdirRAII() { if(_od.empty()) return ; chdir(_od.c_str()); }
+#else
+    ChdirRAII(const std::string& wd) : _wd(wd) {
+      if (_wd.empty())
+        return;
+      TCHAR pwd[MAX_PATH];
+      GetCurrentDirectory(sizeof(pwd), pwd);
+      _od = Kernel_Utils::utf8_encode_s(pwd);
+      SetCurrentDirectory(Kernel_Utils::utf8_decode_s(_wd).c_str());
+    }
+    ~ChdirRAII() {
+      if (_od.empty()) return;
+      SetCurrentDirectory(Kernel_Utils::utf8_decode_s(_od).c_str());
+    }
+#endif
+  private:
+    std::string _wd;
+    std::string _od;
+};
 //=============================================================================
 /*!
  * \brief Struct storing nb of entities in netgen mesh
@@ -92,21 +119,28 @@ struct NETGENPLUGIN_EXPORT NETGENPlugin_NetgenLibWrapper
   void setMesh( nglib::Ng_Mesh* mesh );
   nglib::Ng_Mesh* ngMesh() { return (nglib::Ng_Mesh*)(void*)_ngMesh; }
 
+
+
   static int GenerateMesh(netgen::OCCGeometry& occgeo, int startWith, int endWith,
                           netgen::Mesh* & ngMesh);
   int GenerateMesh(netgen::OCCGeometry& occgeo, int startWith, int endWith )
   {
     return GenerateMesh( occgeo, startWith, endWith, _ngMesh );
   }
+
   static void CalcLocalH( netgen::Mesh * ngMesh );
 
   static void RemoveTmpFiles();
   static int& instanceCounter();
+  void setOutputFile(std::string);
 
  private:
   std::string getOutputFileName();
   void        removeOutputFile();
   std::string _outputFileName;
+  // This will change current directory when the class is instanciated and switch
+  ChdirRAII _tmpDir;
+
 
   ostream *       _ngcout;
   ostream *       _ngcerr;
@@ -119,7 +153,7 @@ struct NETGENPLUGIN_EXPORT NETGENPlugin_NetgenLibWrapper
  */
 //=============================================================================
 
-class NETGENPLUGIN_EXPORT NETGENPlugin_Mesher 
+class NETGENPLUGIN_EXPORT NETGENPlugin_Mesher
 {
  public:
   // ---------- PUBLIC METHODS ----------
@@ -272,7 +306,7 @@ public:
   bool isShapeToPrecompute(const TopoDS_Shape& s);
 
   // 2D meshing
-  // edges 
+  // edges
   bool hasInternalEdges() const { return !_e2face.empty(); }
   bool isInternalEdge( int id ) const { return _e2face.count( id ); }
   const std::map<int,int>& getEdgesAndVerticesWithFaces() const { return _e2face; }