Salome HOME
untabify and
[modules/smesh.git] / src / StdMeshers / StdMeshers_ViscousLayers2D.cxx
index 4e4d0ed8e28e716e8e9c84a69667af733c7ecac9..2a98af19e42e9bfebef50798ef09775803a89e7f 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2013  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
@@ -442,7 +442,7 @@ StdMeshers_ViscousLayers2D::Compute(SMESH_Mesh&        theMesh,
       theMesh.GetSubMesh( theFace )->GetComputeError() = error;
     else if ( !pm )
       pm.reset( new SMESH_ProxyMesh( theMesh ));
-    if ( getenv("ONLY_VL2D"))
+    if ( getenv("__ONLY__VL2D__"))
       pm.reset();
   }
   else
@@ -495,7 +495,7 @@ _ViscousBuilder2D::_ViscousBuilder2D(SMESH_Mesh&                       theMesh,
   _mesh( &theMesh ), _face( theFace ), _hyp( theHyp ), _helper( theMesh )
 {
   _helper.SetSubShape( _face );
-  _helper.SetElementsOnShape(true);
+  _helper.SetElementsOnShape( true );
 
   //_face.Orientation( TopAbs_FORWARD );
   _surface = BRep_Tool::Surface( _face );
@@ -522,7 +522,6 @@ bool _ViscousBuilder2D::error(const string& text )
       _error->myAlgo = smError->myAlgo;
     smError = _error;
   }
-  //makeGroupOfLE(); // debug
 
   return false;
 }
@@ -573,15 +572,31 @@ bool _ViscousBuilder2D::findEdgesWithLayers()
 {
   // collect all EDGEs to ignore defined by hyp
   int nbMyEdgesIgnored = 0;
-  vector<TGeomID> ids = _hyp->GetBndShapesToIgnore();
-  for ( size_t i = 0; i < ids.size(); ++i )
+  vector<TGeomID> ids = _hyp->GetBndShapes();
+  if ( _hyp->IsToIgnoreShapes() ) // EDGEs to ignore are given
   {
-    const TopoDS_Shape& s = getMeshDS()->IndexToShape( ids[i] );
-    if ( !s.IsNull() && s.ShapeType() == TopAbs_EDGE ) {
-      _ignoreShapeIds.insert( ids[i] );
-      nbMyEdgesIgnored += ( _helper.IsSubShape( s, _face ));
+    for ( size_t i = 0; i < ids.size(); ++i )
+    {
+      const TopoDS_Shape& s = getMeshDS()->IndexToShape( ids[i] );
+      if ( !s.IsNull() && s.ShapeType() == TopAbs_EDGE ) {
+        _ignoreShapeIds.insert( ids[i] );
+        nbMyEdgesIgnored += ( _helper.IsSubShape( s, _face ));
+      }
     }
   }
+  else // EDGEs to to make the Viscous Layers on are given
+  {
+    for ( size_t iWire = 0; iWire < _faceSideVec.size(); ++iWire )
+    {
+      StdMeshers_FaceSidePtr wire = _faceSideVec[ iWire ];
+      for ( int iE = 0; iE < wire->NbEdges(); ++iE )
+        _ignoreShapeIds.insert( wire->EdgeID( iE ));
+    }
+    for ( size_t i = 0; i < ids.size(); ++i )
+      _ignoreShapeIds.erase( ids[i] );
+
+    nbMyEdgesIgnored = _ignoreShapeIds.size();
+  }
 
   // check all EDGEs of the _face
   int totalNbEdges = 0;
@@ -613,7 +628,7 @@ bool _ViscousBuilder2D::findEdgesWithLayers()
 
           set<TGeomID> neighbourIgnoreEdges;
           if (viscHyp) {
-            vector<TGeomID> ids = _hyp->GetBndShapesToIgnore();
+            vector<TGeomID> ids = _hyp->GetBndShapes();
             neighbourIgnoreEdges.insert( ids.begin(), ids.end() );
           }
           for ( int iV = 0; iV < 2; ++iV )
@@ -773,7 +788,8 @@ bool _ViscousBuilder2D::makePolyLines()
         }
       }
     }
-    _thickness = Min( _hyp->GetTotalThickness(), maxPossibleThick );
+    if ( maxPossibleThick > 0. )
+      _thickness = Min( _hyp->GetTotalThickness(), maxPossibleThick );
   }
 
   // Adjust _LayerEdge's at _PolyLine's extremities
@@ -1834,13 +1850,14 @@ bool _ViscousBuilder2D::refine()
       normPar[ i - L._firstPntInd ] = ( points[i].normParam - normF ) / normDist;
 
     // Create layers of faces
-
+    
     bool hasLeftNode  = ( !L._leftLine->_rightNodes.empty() && leftEdgeShared  );
     bool hasRightNode = ( !L._rightLine->_leftNodes.empty() && rightEdgeShared );
     bool hasOwnLeftNode  = ( !L._leftNodes.empty() );
     bool hasOwnRightNode = ( !L._rightNodes.empty() );
+    bool isClosedEdge = ( outerNodes.front() == outerNodes.back() );
     size_t iS,
-      iN0 = ( hasLeftNode || hasOwnLeftNode || _polyLineVec.size() == 1 ),
+      iN0 = ( hasLeftNode || hasOwnLeftNode || isClosedEdge ),
       nbN = innerNodes.size() - ( hasRightNode || hasOwnRightNode );
     L._leftNodes .reserve( _hyp->GetNumberLayers() );
     L._rightNodes.reserve( _hyp->GetNumberLayers() );
@@ -1872,7 +1889,7 @@ bool _ViscousBuilder2D::refine()
       else if ( hasLeftNode )  innerNodes.front() = L._leftLine->_rightNodes[ iF ];
       if ( hasOwnRightNode )   innerNodes.back()  = L._rightNodes[ iF ];
       else if ( hasRightNode ) innerNodes.back()  = L._rightLine->_leftNodes[ iF ];
-      if ( _polyLineVec.size() == 1 ) innerNodes.front() = innerNodes.back(); // circle
+      if ( isClosedEdge )      innerNodes.front() = innerNodes.back(); // circle
       if ( !hasOwnLeftNode )  L._leftNodes.push_back( innerNodes.front() );
       if ( !hasOwnRightNode ) L._rightNodes.push_back( innerNodes.back() );