Salome HOME
updated copyright message
[plugins/netgenplugin.git] / src / NETGENPlugin / NETGENPlugin_NETGEN_2D_ONLY.cxx
index 7b08a3d29095b27c769b1f0e631c041560bb3d2e..3748c2ccc587f5c038f1cdb288174395e54a38cf 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2022  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2023  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
@@ -25,7 +25,6 @@
 
 #include "NETGENPlugin_Mesher.hxx"
 #include "NETGENPlugin_Hypothesis_2D.hxx"
-#include "NETGENPlugin_Provider.hxx"
 
 #include <SMDS_MeshElement.hxx>
 #include <SMDS_MeshNode.hxx>
@@ -65,7 +64,7 @@ namespace nglib {
 //#include <meshtype.hpp>
 namespace netgen {
   NETGENPLUGIN_DLL_HEADER
-  // extern MeshingParameters mparam;
+  extern MeshingParameters mparam;
 #ifdef NETGEN_V5
   extern void OCCSetLocalMeshSize(OCCGeometry & geom, Mesh & mesh);
 #endif
@@ -75,7 +74,6 @@ using namespace std;
 using namespace netgen;
 using namespace nglib;
 
-
 //=============================================================================
 /*!
  *
@@ -130,7 +128,6 @@ bool NETGENPlugin_NETGEN_2D_ONLY::CheckHypothesis (SMESH_Mesh&         aMesh,
   _hypParameters = 0;
   _progressByTic = -1;
 
-
   const list<const SMESHDS_Hypothesis*>& hyps = GetUsedHypothesis(aMesh, aShape, false);
 
   if (hyps.empty())
@@ -229,14 +226,6 @@ bool NETGENPlugin_NETGEN_2D_ONLY::CheckHypothesis (SMESH_Mesh&         aMesh,
 bool NETGENPlugin_NETGEN_2D_ONLY::Compute(SMESH_Mesh&         aMesh,
                                           const TopoDS_Shape& aShape)
 {
-  aMesh.Lock();
-  SMESH_Hypothesis::Hypothesis_Status hypStatus;
-  this->CheckHypothesis(aMesh, aShape, hypStatus);
-  aMesh.Unlock();
-
-  netgen::MeshingParameters mparam;
-  int id_mparam = mparam_provider.take(mparam);
-
   netgen::multithread.terminate = 0;
   //netgen::multithread.task = "Surface meshing";
 
@@ -244,14 +233,12 @@ bool NETGENPlugin_NETGEN_2D_ONLY::Compute(SMESH_Mesh&         aMesh,
   SMESH_MesherHelper helper(aMesh);
   helper.SetElementsOnShape( true );
 
-  NETGENPlugin_NetgenLibWrapper *ngLib;
-  int id_ngLib = nglib_provider.take(&ngLib);
-  ngLib->_isComputeOk = false;
+  NETGENPlugin_NetgenLibWrapper ngLib;
+  ngLib._isComputeOk = false;
 
   netgen::Mesh   ngMeshNoLocSize;
-  netgen::Mesh * ngMeshes[2] = { (netgen::Mesh*) ngLib->_ngMesh,  & ngMeshNoLocSize };
-  netgen::OCCGeometry *occgeoComm;
-  int id_occgeoComm = occgeom_provider.take(&occgeoComm);
+  netgen::Mesh * ngMeshes[2] = { (netgen::Mesh*) ngLib._ngMesh,  & ngMeshNoLocSize };
+  netgen::OCCGeometry occgeoComm;
 
   // min / max sizes are set as follows:
   // if ( _hypParameters )
@@ -265,37 +252,33 @@ bool NETGENPlugin_NETGEN_2D_ONLY::Compute(SMESH_Mesh&         aMesh,
   // else
   //    min = aMesher.GetDefaultMinSize()
   //    max = max segment len of a FACE
-  aMesh.Lock();
+
   NETGENPlugin_Mesher aMesher( &aMesh, aShape, /*isVolume=*/false);
-  // TODO: Only valid for NETGEN2D_Only
-  aMesher.SetDefaultParameters(mparam);
-  aMesher.SetParameters( _hypParameters, mparam ); // _hypParameters -> mparam
+  aMesher.SetParameters( _hypParameters ); // _hypParameters -> netgen::mparam
   const bool toOptimize = _hypParameters ? _hypParameters->GetOptimize() : true;
   if ( _hypMaxElementArea )
   {
-    mparam.maxh = sqrt( 2. * _hypMaxElementArea->GetMaxArea() / sqrt(3.0) );
+    netgen::mparam.maxh = sqrt( 2. * _hypMaxElementArea->GetMaxArea() / sqrt(3.0) );
   }
   if ( _hypQuadranglePreference )
-    mparam.quad = true;
+    netgen::mparam.quad = true;
 
   // local size is common for all FACEs in aShape?
-  const bool isCommonLocalSize = ( !_hypLengthFromEdges && !_hypMaxElementArea && mparam.uselocalh );
+  const bool isCommonLocalSize = ( !_hypLengthFromEdges && !_hypMaxElementArea && netgen::mparam.uselocalh );
   const bool isDefaultHyp = ( !_hypLengthFromEdges && !_hypMaxElementArea && !_hypParameters );
-  aMesh.Unlock();
-
 
   if ( isCommonLocalSize ) // compute common local size in ngMeshes[0]
   {
     //list< SMESH_subMesh* > meshedSM[4]; --> all sub-shapes are added to occgeoComm
-    aMesher.PrepareOCCgeometry( *occgeoComm, aShape, aMesh );//, meshedSM );
+    aMesher.PrepareOCCgeometry( occgeoComm, aShape, aMesh );//, meshedSM );
 
     // local size set at MESHCONST_ANALYSE step depends on
     // minh, face_maxh, grading and curvaturesafety; find minh if not set by the user
-    if ( !_hypParameters || mparam.minh < DBL_MIN )
+    if ( !_hypParameters || netgen::mparam.minh < DBL_MIN )
     {
       if ( !_hypParameters )
-        mparam.maxh = occgeoComm->GetBoundingBox().Diam() / 3.;
-      mparam.minh = aMesher.GetDefaultMinSize( aShape, mparam.maxh );
+        netgen::mparam.maxh = occgeoComm.GetBoundingBox().Diam() / 3.;
+      netgen::mparam.minh = aMesher.GetDefaultMinSize( aShape, netgen::mparam.maxh );
     }
     // set local size depending on curvature and NOT closeness of EDGEs
 #ifdef NETGEN_V6
@@ -303,19 +286,17 @@ bool NETGENPlugin_NETGEN_2D_ONLY::Compute(SMESH_Mesh&         aMesh,
 #else
     const double factor = netgen::occparam.resthcloseedgefac;
     netgen::occparam.resthcloseedgeenable = false;
-    netgen::occparam.resthcloseedgefac = 1.0 + mparam.grading;
+    netgen::occparam.resthcloseedgefac = 1.0 + netgen::mparam.grading;
 #endif
-    occgeoComm->face_maxh = mparam.maxh;
+    occgeoComm.face_maxh = netgen::mparam.maxh;
 #ifdef NETGEN_V6
     netgen::OCCParameters occparam;
-    netgen::OCCSetLocalMeshSize( *occgeoComm, *ngMeshes[0], mparam, occparam );
+    netgen::OCCSetLocalMeshSize( occgeoComm, *ngMeshes[0], netgen::mparam, occparam );
 #else
-    aMesh.Lock();
-    netgen::OCCSetLocalMeshSize( *occgeoComm, *ngMeshes[0] );
-    aMesh.Unlock();
+    netgen::OCCSetLocalMeshSize( occgeoComm, *ngMeshes[0] );
 #endif
-    occgeoComm->emap.Clear();
-    occgeoComm->vmap.Clear();
+    occgeoComm.emap.Clear();
+    occgeoComm.vmap.Clear();
 
     // set local size according to size of existing segments
     TopTools_IndexedMapOfShape edgeMap;
@@ -340,15 +321,16 @@ bool NETGENPlugin_NETGEN_2D_ONLY::Compute(SMESH_Mesh&         aMesh,
     }
 
     // set local size defined on shapes
-    aMesher.SetLocalSize( *occgeoComm, *ngMeshes[0] );
-    aMesher.SetLocalSizeForChordalError( *occgeoComm, *ngMeshes[0] );
+    aMesher.SetLocalSize( occgeoComm, *ngMeshes[0] );
+    aMesher.SetLocalSizeForChordalError( occgeoComm, *ngMeshes[0] );
     try {
       ngMeshes[0]->LoadLocalMeshSize( mparam.meshsizefilename );
     } catch (NgException & ex) {
       return error( COMPERR_BAD_PARMETERS, ex.What() );
     }
   }
-  mparam.uselocalh = toOptimize; // restore as it is used at surface optimization
+  netgen::mparam.uselocalh = toOptimize; // restore as it is used at surface optimization
+
   // ==================
   // Loop on all FACEs
   // ==================
@@ -414,7 +396,7 @@ bool NETGENPlugin_NETGEN_2D_ONLY::Compute(SMESH_Mesh&         aMesh,
         }
         if ( nbSegments )
           edgeLength /= double( nbSegments );
-        mparam.maxh = edgeLength;
+        netgen::mparam.maxh = edgeLength;
       }
       else if ( isDefaultHyp )
       {
@@ -434,29 +416,28 @@ bool NETGENPlugin_NETGEN_2D_ONLY::Compute(SMESH_Mesh&         aMesh,
           }
         }
         edgeLength = sqrt( maxSeg2 ) * 1.05;
-        mparam.maxh = edgeLength;
+        netgen::mparam.maxh = edgeLength;
       }
-      if ( mparam.maxh < DBL_MIN )
-        mparam.maxh = occgeoComm->GetBoundingBox().Diam();
+      if ( netgen::mparam.maxh < DBL_MIN )
+        netgen::mparam.maxh = occgeoComm.GetBoundingBox().Diam();
 
       if ( !isCommonLocalSize )
       {
-        mparam.minh = aMesher.GetDefaultMinSize( F, mparam.maxh );
+        netgen::mparam.minh = aMesher.GetDefaultMinSize( F, netgen::mparam.maxh );
       }
     }
 
     // prepare occgeom
-    netgen::OCCGeometry *occgeom;
-    int id_occgeom = occgeom_provider.take(&occgeom);
-    occgeom->shape = F;
-    occgeom->fmap.Add( F );
-    occgeom->CalcBoundingBox();
-    occgeom->facemeshstatus.SetSize(1);
-    occgeom->facemeshstatus = 0;
-    occgeom->face_maxh_modified.SetSize(1);
-    occgeom->face_maxh_modified = 0;
-    occgeom->face_maxh.SetSize(1);
-    occgeom->face_maxh = mparam.maxh;
+    netgen::OCCGeometry occgeom;
+    occgeom.shape = F;
+    occgeom.fmap.Add( F );
+    occgeom.CalcBoundingBox();
+    occgeom.facemeshstatus.SetSize(1);
+    occgeom.facemeshstatus = 0;
+    occgeom.face_maxh_modified.SetSize(1);
+    occgeom.face_maxh_modified = 0;
+    occgeom.face_maxh.SetSize(1);
+    occgeom.face_maxh = netgen::mparam.maxh;
 
     // -------------------------
     // Fill netgen mesh
@@ -479,11 +460,11 @@ bool NETGENPlugin_NETGEN_2D_ONLY::Compute(SMESH_Mesh&         aMesh,
       {
         ngMesh->SetGlobalH ( mparam.maxh );
         ngMesh->SetMinimalH( mparam.minh );
-        Box<3> bb = occgeom->GetBoundingBox();
+        Box<3> bb = occgeom.GetBoundingBox();
         bb.Increase (bb.Diam()/10);
         ngMesh->SetLocalH (bb.PMin(), bb.PMax(), mparam.grading);
-        aMesher.SetLocalSize( *occgeom, *ngMesh );
-        aMesher.SetLocalSizeForChordalError( *occgeoComm, *ngMesh );
+        aMesher.SetLocalSize( occgeom, *ngMesh );
+        aMesher.SetLocalSizeForChordalError( occgeoComm, *ngMesh );
         try {
           ngMesh->LoadLocalMeshSize( mparam.meshsizefilename );
         } catch (NgException & ex) {
@@ -492,7 +473,7 @@ bool NETGENPlugin_NETGEN_2D_ONLY::Compute(SMESH_Mesh&         aMesh,
       }
 
       nodeVec.clear();
-      faceErr = aMesher.AddSegmentsToMesh( *ngMesh, *occgeom, wires, helper, nodeVec,
+      faceErr = aMesher.AddSegmentsToMesh( *ngMesh, occgeom, wires, helper, nodeVec,
                                            /*overrideMinH=*/!_hypParameters);
       if ( faceErr && !faceErr->IsOK() )
         break;
@@ -510,7 +491,9 @@ bool NETGENPlugin_NETGEN_2D_ONLY::Compute(SMESH_Mesh&         aMesh,
       SMESH_Comment str;
       try {
         OCC_CATCH_SIGNALS;
-        err = ngLib->GenerateMesh(*occgeom, startWith, endWith, ngMesh, mparam);
+
+        err = ngLib.GenerateMesh(occgeom, startWith, endWith, ngMesh);
+
         if ( netgen::multithread.terminate )
           return false;
         if ( err )
@@ -532,12 +515,12 @@ bool NETGENPlugin_NETGEN_2D_ONLY::Compute(SMESH_Mesh&         aMesh,
       }
       if ( err )
       {
-        if ( aMesher.FixFaceMesh( *occgeom, *ngMesh, 1 ))
+        if ( aMesher.FixFaceMesh( occgeom, *ngMesh, 1 ))
           break;
         if ( iLoop == LOC_SIZE )
         {
-          mparam.minh = mparam.maxh;
-          mparam.maxh = 0;
+          netgen::mparam.minh = netgen::mparam.maxh;
+          netgen::mparam.maxh = 0;
           for ( size_t iW = 0; iW < wires.size(); ++iW )
           {
             StdMeshers_FaceSidePtr wire = wires[ iW ];
@@ -548,13 +531,13 @@ bool NETGENPlugin_NETGEN_2D_ONLY::Compute(SMESH_Mesh&         aMesh,
               netgen::Point3d np( p.X(),p.Y(),p.Z());
               double segLen = p.Distance( uvPtVec[ iP-1 ].node );
               double   size = ngMesh->GetH( np );
-              mparam.minh = Min( mparam.minh, size );
-              mparam.maxh = Max( mparam.maxh, segLen );
+              netgen::mparam.minh = Min( netgen::mparam.minh, size );
+              netgen::mparam.maxh = Max( netgen::mparam.maxh, segLen );
             }
           }
-          //cerr << "min " << mparam.minh << " max " << mparam.maxh << endl;
-          mparam.minh *= 0.9;
-          mparam.maxh *= 1.1;
+          //cerr << "min " << netgen::mparam.minh << " max " << netgen::mparam.maxh << endl;
+          netgen::mparam.minh *= 0.9;
+          netgen::mparam.maxh *= 1.1;
           continue;
         }
         else
@@ -563,10 +546,7 @@ bool NETGENPlugin_NETGEN_2D_ONLY::Compute(SMESH_Mesh&         aMesh,
         }
       }
 
-      occgeom_provider.release(id_occgeoComm, true);
-      occgeom_provider.release(id_occgeom, true);
-      mparam_provider.release(id_mparam);
-      aMesh.Lock();
+
       // ----------------------------------------------------
       // Fill the SMESHDS with the generated nodes and faces
       // ----------------------------------------------------
@@ -616,9 +596,6 @@ bool NETGENPlugin_NETGEN_2D_ONLY::Compute(SMESH_Mesh&         aMesh,
       break;
     } // two attempts
   } // loop on FACEs
-  aMesh.Unlock();
-  nglib_provider.release(id_ngLib, true);
-
 
   return true;
 }