Salome HOME
Merge multi-study removal branch.
[modules/smesh.git] / src / StdMeshers / StdMeshers_Prism_3D.cxx
index ae8ccc430a69ed587bd7c3e8b6f890e3ad4204f2..d326cd157684bc09e383b123d6c0ac6a1fc6fed8 100644 (file)
@@ -96,15 +96,14 @@ namespace {
    */
   struct TQuadrangleAlgo : public StdMeshers_Quadrangle_2D
   {
-    TQuadrangleAlgo(int studyId, SMESH_Gen* gen)
-      : StdMeshers_Quadrangle_2D( gen->GetANewId(), studyId, gen)
+    TQuadrangleAlgo(SMESH_Gen* gen)
+      : StdMeshers_Quadrangle_2D( gen->GetANewId(), gen)
     {
     }
     static StdMeshers_Quadrangle_2D* instance( SMESH_Algo*         fatherAlgo,
                                                SMESH_MesherHelper* helper=0)
     {
-      static TQuadrangleAlgo* algo = new TQuadrangleAlgo( fatherAlgo->GetStudyId(),
-                                                          fatherAlgo->GetGen() );
+      static TQuadrangleAlgo* algo = new TQuadrangleAlgo( fatherAlgo->GetGen() );
       if ( helper &&
            algo->myProxyMesh &&
            algo->myProxyMesh->GetMesh() != helper->GetMesh() )
@@ -126,16 +125,15 @@ namespace {
   {
     StdMeshers_ProjectionSource1D myHyp;
 
-    TProjction1dAlgo(int studyId, SMESH_Gen* gen)
-      : StdMeshers_Projection_1D( gen->GetANewId(), studyId, gen),
-        myHyp( gen->GetANewId(), studyId, gen)
+    TProjction1dAlgo(SMESH_Gen* gen)
+      : StdMeshers_Projection_1D( gen->GetANewId(), gen),
+        myHyp( gen->GetANewId(), gen)
     {
       StdMeshers_Projection_1D::_sourceHypo = & myHyp;
     }
     static TProjction1dAlgo* instance( SMESH_Algo* fatherAlgo )
     {
-      static TProjction1dAlgo* algo = new TProjction1dAlgo( fatherAlgo->GetStudyId(),
-                                                            fatherAlgo->GetGen() );
+      static TProjction1dAlgo* algo = new TProjction1dAlgo( fatherAlgo->GetGen() );
       return algo;
     }
   };
@@ -147,16 +145,15 @@ namespace {
   {
     StdMeshers_ProjectionSource2D myHyp;
 
-    TProjction2dAlgo(int studyId, SMESH_Gen* gen)
-      : StdMeshers_Projection_1D2D( gen->GetANewId(), studyId, gen),
-        myHyp( gen->GetANewId(), studyId, gen)
+    TProjction2dAlgo(SMESH_Gen* gen)
+      : StdMeshers_Projection_1D2D( gen->GetANewId(), gen),
+        myHyp( gen->GetANewId(), gen)
     {
       StdMeshers_Projection_2D::_sourceHypo = & myHyp;
     }
     static TProjction2dAlgo* instance( SMESH_Algo* fatherAlgo )
     {
-      static TProjction2dAlgo* algo = new TProjction2dAlgo( fatherAlgo->GetStudyId(),
-                                                            fatherAlgo->GetGen() );
+      static TProjction2dAlgo* algo = new TProjction2dAlgo( fatherAlgo->GetGen() );
       return algo;
     }
     const NSProjUtils::TNodeNodeMap& GetNodesMap()
@@ -567,8 +564,8 @@ namespace {
 //purpose  : 
 //=======================================================================
 
-StdMeshers_Prism_3D::StdMeshers_Prism_3D(int hypId, int studyId, SMESH_Gen* gen)
-  :SMESH_3D_Algo(hypId, studyId, gen)
+StdMeshers_Prism_3D::StdMeshers_Prism_3D(int hypId, SMESH_Gen* gen)
+  :SMESH_3D_Algo(hypId, gen)
 {
   _name                    = "Prism_3D";
   _shapeType               = (1 << TopAbs_SOLID); // 1 bit per shape type
@@ -1200,8 +1197,8 @@ bool StdMeshers_Prism_3D::compute(const Prism_3D::TPrismTopo& thePrism)
         sweeper.myBndColumns.push_back( & u2colIt->second );
     }
     // load node columns inside the bottom FACE
-    TNode2ColumnMap::iterator bot_column = myBotToColumnMap.begin();
     sweeper.myIntColumns.reserve( myBotToColumnMap.size() );
+    TNode2ColumnMap::iterator bot_column = myBotToColumnMap.begin();
     for ( ; bot_column != myBotToColumnMap.end(); ++bot_column )
       sweeper.myIntColumns.push_back( & bot_column->second );
 
@@ -1242,6 +1239,14 @@ bool StdMeshers_Prism_3D::compute(const Prism_3D::TPrismTopo& thePrism)
       // column nodes; middle part of the column are zero pointers
       TNodeColumn& column = bot_column->second;
 
+      // check if a column is already computed using non-block approach
+      size_t i;
+      for ( i = 0; i < column.size(); ++i )
+        if ( !column[ i ])
+          break;
+      if ( i == column.size() )
+        continue; // all nodes created
+
       gp_XYZ botParams, topParams;
       if ( !tBotNode.HasParams() )
       {
@@ -2282,7 +2287,7 @@ bool StdMeshers_Prism_3D::assocOrProjBottom2Top( const gp_Trsf & bottomToTopTrsf
     TNode2ColumnMap::iterator bN_col =
       myBotToColumnMap.insert( make_pair ( bN, TNodeColumn() )).first;
     TNodeColumn & column = bN_col->second;
-    column.resize( zSize );
+    column.resize( zSize, 0 );
     column.front() = botNode;
     column.back()  = topNode;
   }
@@ -4962,8 +4967,7 @@ bool StdMeshers_Sweeper::ComputeNodesByTrsf( const double tol,
 
   // for each internal column find boundary nodes whose error to use for correction
   prepareTopBotDelaunay();
-  if ( !findDelaunayTriangles())
-    return false;
+  bool isErrorCorrectable = findDelaunayTriangles();
 
   // compute coordinates of internal nodes by projecting (transfroming) src and tgt
   // nodes towards the central layer
@@ -5021,6 +5025,22 @@ bool StdMeshers_Sweeper::ComputeNodesByTrsf( const double tol,
     fromSrcBndPnts.swap( toSrcBndPnts );
   }
 
+  // Evaluate an error of boundary points
+
+  if ( !isErrorCorrectable && !allowHighBndError )
+  {
+    for ( size_t iP = 0; iP < myBndColumns.size(); ++iP )
+    {
+      double sumError = 0;
+      for ( size_t z = 1; z < zS; ++z ) // loop on layers
+        sumError += ( bndError[ z-1     ][ iP ].Modulus() +
+                      bndError[ zSize-z ][ iP ].Modulus() );
+
+      if ( sumError > tol )
+        return false;
+    }
+  }
+
   // Compute two projections of internal points to the central layer
   // in order to evaluate an error of internal points
 
@@ -5080,7 +5100,6 @@ bool StdMeshers_Sweeper::ComputeNodesByTrsf( const double tol,
     }
   }
 
-  //centerIntErrorIsSmall = true; // 3D_mesh_Extrusion_00/A3
   if ( !centerIntErrorIsSmall )
   {
     // Compensate the central error; continue adding projection
@@ -5289,7 +5308,7 @@ bool StdMeshers_Sweeper::ComputeNodesOnStraight()
       return false;
 
     // create nodes along a line
-    SMESH_NodeXYZ botP( botNode ), topP( topNode);
+    SMESH_NodeXYZ botP( botNode ), topP( topNode );
     for ( size_t iZ = 0; iZ < myZColumns[0].size(); ++iZ )
     {
       // use barycentric coordinates as weight of Z of boundary columns
@@ -5426,7 +5445,10 @@ bool StdMeshers_Sweeper::findDelaunayTriangles()
   }
 
   if ( myBotDelaunay->NbVisitedNodes() < nbInternalNodes )
+  {
+    myTopBotTriangles.clear();
     return false;
+  }
 
   myBotDelaunay.reset();
   myTopDelaunay.reset();