From b67b2447f1e6bb8e295e431191578594e8c881b2 Mon Sep 17 00:00:00 2001 From: eap Date: Thu, 9 Jan 2014 10:29:44 +0000 Subject: [PATCH] 22313: EDF 2538 SMESH: Face with layers with ViscousLayer3D Hypothesis --- .../gui/SMESH/images/viscous_layers_hyp.png | Bin 46476 -> 50788 bytes .../gui/SMESH/input/additional_hypo.doc | 33 +- idl/SMESH_BasicHypothesis.idl | 8 + src/SMESH_SWIG/smesh_algorithm.py | 21 +- src/StdMeshers/StdMeshers_ViscousLayers.cxx | 327 ++++++++++-------- .../StdMeshersGUI_StdHypothesisCreator.cxx | 27 +- src/StdMeshersGUI/StdMeshers_msg_en.ts | 12 + .../StdMeshers_ViscousLayers_i.cxx | 65 +++- .../StdMeshers_ViscousLayers_i.hxx | 5 + 9 files changed, 318 insertions(+), 180 deletions(-) diff --git a/doc/salome/gui/SMESH/images/viscous_layers_hyp.png b/doc/salome/gui/SMESH/images/viscous_layers_hyp.png index 9c99303174b63c523c1b60e0786734da882b99af..717819138f562b963c2216308af12346e1f883cd 100644 GIT binary patch literal 50788 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�!ew#3e~wEJbXx# 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 Pji9BjtCmYTdF_7y-vm63 diff --git a/doc/salome/gui/SMESH/input/additional_hypo.doc b/doc/salome/gui/SMESH/input/additional_hypo.doc index 95bc0405c..adccc49aa 100644 --- a/doc/salome/gui/SMESH/input/additional_hypo.doc +++ b/doc/salome/gui/SMESH/input/additional_hypo.doc @@ -81,29 +81,29 @@ computations.
  • Number of layers - defines the number of element layers.
  • Stretch factor - defines the growth factor of element height from the mesh boundary inwards.
  • -
  • Specified Edges are - defines how the shapes specified by +
  • Specified Faces/Edges are - defines how the shapes specified by the next parameter are used. -
  • Faces without layers and Edges with/without layers - - in the 3D case it defines geometrical faces on which element layers - should not be constructed; in the 2D case it defines geometrical edges - on which element layers either should be or should not be - constructed, depending on the value of the previous parameter - (Specified Edges are). +
  • Faces/Edges with/without layers - + defines geometrical faces or edges on which element layers + either should be or should not be constructed, depending on the + value of the previous parameter (Specified Faces/Edges are). + Faces (or edges) can be selected either in the Object Browser or in + the VTK Viewer. \note A mesh shown in the 3D Viewer can prevent selection of faces and edges, just hide the mesh to avoid this. To avoid a long wait when a geometry with many faces (or edges) is displayed, the number of faces (edges) shown at a time is limited by the value of "Sub-shapes preview chunk size" preference (in Preferences/Mesh/General tab).
    - Whatever shapes are specified by this - parameter, the element layers are not constructed on geometrical - faces shared by several solids in 3D case and edges shared by - several faces in 2D case. In other words the element layers can be - constructed on boundary faces and edges, and are not constructed on - internal faces and edges. There is an exception to this rule in 2D - case: if "Viscous Layers 2D" hypothesis is assigned to a sub-mesh, - the element layers can be constructed on boundary edges of the shape - of this sub-mesh. + If faces/edges without layers are specified, the element layers are + not constructed on geometrical faces shared by several solids in 3D + case and edges shared by several faces in 2D case. In other words, + in this mode the element layers can be constructed on boundary faces + and edges only, and are not constructed on internal faces and + edges. There is an exception to this rule: if a hypothesis is + assigned to a sub-mesh, the element layers can be constructed on + boundary faces/edges of the shape of this sub-mesh, at same time + possibly being internal faces/edges within the whole model. \image html viscous_layers_on_submesh.png 2D viscous layers constructed on boundary edges of a sub-mesh on a disk face.
  • @@ -114,5 +114,4 @@ computations.
    See also a sample TUI script of a \ref tui_viscous_layers "Viscous layers construction". - */ diff --git a/idl/SMESH_BasicHypothesis.idl b/idl/SMESH_BasicHypothesis.idl index 6cea399d4..186b06681 100644 --- a/idl/SMESH_BasicHypothesis.idl +++ b/idl/SMESH_BasicHypothesis.idl @@ -871,6 +871,14 @@ module StdMeshers void SetIgnoreFaces(in SMESH::long_array faceIDs) raises (SALOME::SALOME_Exception); SMESH::long_array GetIgnoreFaces(); + /*! + * Set faces either to exclude from treatment or to make the Viscous Layers on. + */ + void SetFaces(in SMESH::long_array faceIDs, + in boolean toIgnore) raises (SALOME::SALOME_Exception); + SMESH::long_array GetFaces(); + boolean GetIsToIgnoreFaces(); + /*! * Set total thickness of layers of prisms */ diff --git a/src/SMESH_SWIG/smesh_algorithm.py b/src/SMESH_SWIG/smesh_algorithm.py index a81f825a6..6640dc6f9 100644 --- a/src/SMESH_SWIG/smesh_algorithm.py +++ b/src/SMESH_SWIG/smesh_algorithm.py @@ -267,21 +267,26 @@ class Mesh_Algorithm: # @param thickness total thickness of layers of prisms # @param numberOfLayers number of layers of prisms # @param stretchFactor factor (>1.0) of growth of layer thickness towards inside of mesh - # @param ignoreFaces list of geometrical faces (or their ids) not to generate layers on + # @param faces list of geometrical faces (or their ids). + # Viscous layers are either generated on these faces or not, depending on + # the value of \a isFacesToIgnore parameter. + # @param isFacesToIgnore if \c True, the Viscous layers are not generated on the + # faces specified by the previous parameter (\a faces). # @ingroup l3_hypos_additi - def ViscousLayers(self, thickness, numberOfLayers, stretchFactor, ignoreFaces=[]): + def ViscousLayers(self, thickness, numberOfLayers, stretchFactor, + faces=[], isFacesToIgnore=True ): if not isinstance(self.algo, SMESH._objref_SMESH_3D_Algo): raise TypeError, "ViscousLayers are supported by 3D algorithms only" if not "ViscousLayers" in self.GetCompatibleHypothesis(): raise TypeError, "ViscousLayers are not supported by %s"%self.algo.GetName() - if ignoreFaces and isinstance( ignoreFaces[0], geomBuilder.GEOM._objref_GEOM_Object ): - ignoreFaces = [ self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f) for f in ignoreFaces ] + if faces and isinstance( faces[0], geomBuilder.GEOM._objref_GEOM_Object ): + faces = [ self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f) for f in faces ] hyp = self.Hypothesis("ViscousLayers", - [thickness, numberOfLayers, stretchFactor, ignoreFaces]) + [thickness, numberOfLayers, stretchFactor, faces]) hyp.SetTotalThickness(thickness) hyp.SetNumberLayers(numberOfLayers) hyp.SetStretchFactor(stretchFactor) - hyp.SetIgnoreFaces(ignoreFaces) + hyp.SetFaces(faces, isFacesToIgnore) return hyp ## Defines "ViscousLayers2D" hypothesis to give parameters of layers of quadrilateral @@ -290,9 +295,9 @@ class Mesh_Algorithm: # @param thickness total thickness of layers of quadrilaterals # @param numberOfLayers number of layers # @param stretchFactor factor (>1.0) of growth of layer thickness towards inside of mesh - # @param edges list of geometrical edge (or their ids). + # @param edges list of geometrical edges (or their ids). # Viscous layers are either generated on these edges or not, depending on - # the values of \a isEdgesToIgnore parameter. + # the value of \a isEdgesToIgnore parameter. # @param isEdgesToIgnore if \c True, the Viscous layers are not generated on the # edges specified by the previous parameter (\a edges). # @ingroup l3_hypos_additi diff --git a/src/StdMeshers/StdMeshers_ViscousLayers.cxx b/src/StdMeshers/StdMeshers_ViscousLayers.cxx index 6a6d871c4..d7ea8bca1 100644 --- a/src/StdMeshers/StdMeshers_ViscousLayers.cxx +++ b/src/StdMeshers/StdMeshers_ViscousLayers.cxx @@ -35,6 +35,7 @@ #include "SMESH_ControlsDef.hxx" #include "SMESH_Gen.hxx" #include "SMESH_Group.hxx" +#include "SMESH_HypoFilter.hxx" #include "SMESH_Mesh.hxx" #include "SMESH_MeshAlgos.hxx" #include "SMESH_MesherHelper.hxx" @@ -63,6 +64,7 @@ #include #include #include +#include #include #include #include @@ -382,8 +384,10 @@ namespace VISCOUS_3D { TopoDS_Shape _solid; const StdMeshers_ViscousLayers* _hyp; + TopoDS_Shape _hypShape; _MeshOfSolid* _proxyMesh; set _reversedFaceIds; + set _ignoreFaceIds; double _stepSize, _stepSizeCoeff; const SMDS_MeshNode* _stepSizeNodes[2]; @@ -393,10 +397,10 @@ namespace VISCOUS_3D // iteration over the map is 5 time longer than over the vector vector< _LayerEdge* > _edges; - // key: an id of shape (EDGE or VERTEX) shared by a FACE with - // layers and a FACE w/o layers + // key: an id of shape (EDGE or VERTEX) shared by a FACE with + // layers and a FACE w/o layers // value: the shape (FACE or EDGE) to shrink mesh on. - // _LayerEdge's basing on nodes on key shape are inflated along the value shape + // _LayerEdge's basing on nodes on key shape are inflated along the value shape map< TGeomID, TopoDS_Shape > _shrinkShape2Shape; // FACE's WOL, srink on which is forbiden due to algo on the adjacent SOLID @@ -414,7 +418,9 @@ namespace VISCOUS_3D _SolidData(const TopoDS_Shape& s=TopoDS_Shape(), const StdMeshers_ViscousLayers* h=0, - _MeshOfSolid* m=0) :_solid(s), _hyp(h), _proxyMesh(m) {} + const TopoDS_Shape& hs=TopoDS_Shape(), + _MeshOfSolid* m=0) + :_solid(s), _hyp(h), _hypShape(hs), _proxyMesh(m) {} ~_SolidData(); Handle(Geom_Curve) CurveForSmooth( const TopoDS_Edge& E, @@ -513,7 +519,6 @@ namespace VISCOUS_3D SMESH_ComputeErrorPtr _error; vector< _SolidData > _sdVec; - set _ignoreShapeIds; int _tmpFaceID; }; //-------------------------------------------------------------------------------- @@ -575,7 +580,7 @@ virtual SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type) const // StdMeshers_ViscousLayers::StdMeshers_ViscousLayers(int hypId, int studyId, SMESH_Gen* gen) :SMESH_Hypothesis(hypId, studyId, gen), - _isToIgnoreShapes(18), _nbLayers(1), _thickness(1), _stretchFactor(1) + _isToIgnoreShapes(1), _nbLayers(1), _thickness(1), _stretchFactor(1) { _name = StdMeshers_ViscousLayers::GetHypType(); _param_algo_dim = -3; // auxiliary hyp used by 3D algos @@ -644,7 +649,7 @@ std::ostream & StdMeshers_ViscousLayers::SaveTo(std::ostream & save) << " " << _thickness << " " << _stretchFactor << " " << _shapeIds.size(); - for ( unsigned i = 0; i < _shapeIds.size(); ++i ) + for ( size_t i = 0; i < _shapeIds.size(); ++i ) save << " " << _shapeIds[i]; save << " " << !_isToIgnoreShapes; // negate to keep the behavior in old studies. return save; @@ -746,7 +751,7 @@ namespace // get average dir of edges going fromV gp_XYZ edgeDir; //if ( edges.size() > 1 ) - for ( unsigned i = 0; i < edges.size(); ++i ) + for ( size_t i = 0; i < edges.size(); ++i ) { edgeDir = getEdgeDir( edges[i], fromV ); double size2 = edgeDir.SquareModulus(); @@ -867,13 +872,13 @@ namespace py = new ofstream(fname); *py << "import SMESH" << endl << "from salome.smesh import smeshBuilder" << endl - << "smesh = smeshBuilder.New(salome.myStudy)" << endl + << "smesh = smeshBuilder.New(salome.myStudy)" << endl << "meshSO = smesh.GetCurrentStudy().FindObjectID('0:1:2:3')" << endl - << "mesh = smesh.Mesh( meshSO.GetObject() )"< notSupportAlgos; notSupportAlgos.insert("Hexa_3D"); - for ( unsigned i = 0; i < _sdVec.size(); ++i ) + for ( size_t i = 0; i < _sdVec.size(); ++i ) { TopTools_MapOfShape noShrinkVertices; map< TGeomID, TopoDS_Shape >::iterator e2f = _sdVec[i]._shrinkShape2Shape.begin(); @@ -1187,7 +1239,7 @@ bool _ViscousBuilder::findFacesWithLayers() SMESH_Algo* algo = _mesh->GetGen()->GetAlgo( *_mesh, *solid ); if ( !algo || !notSupportAlgos.count( algo->GetName() )) continue; notShrinkFace = true; - for ( unsigned j = 0; j < _sdVec.size(); ++j ) + for ( size_t j = 0; j < _sdVec.size(); ++j ) { if ( _sdVec[j]._solid.IsSame( *solid ) ) if ( _sdVec[j]._shrinkShape2Shape.count( edgeID )) @@ -1220,10 +1272,10 @@ bool _ViscousBuilder::findFacesWithLayers() } } } - + // Find the SHAPE along which to inflate _LayerEdge based on VERTEX - for ( unsigned i = 0; i < _sdVec.size(); ++i ) + for ( size_t i = 0; i < _sdVec.size(); ++i ) { shapes.Clear(); TopExp::MapShapes(_sdVec[i]._solid, TopAbs_VERTEX, shapes); @@ -1237,11 +1289,12 @@ bool _ViscousBuilder::findFacesWithLayers() while ( fIt->more()) { const TopoDS_Shape* f = fIt->next(); - const int fID = getMeshDS()->ShapeToIndex( *f ); if ( helper.IsSubShape( *f, _sdVec[i]._solid ) ) { totalNbFaces++; - if ( _ignoreShapeIds.count ( fID ) && ! _sdVec[i]._noShrinkFaces.count( fID )) + const int fID = getMeshDS()->ShapeToIndex( *f ); + if ( _sdVec[i]._ignoreFaceIds.count ( fID ) && + !_sdVec[i]._noShrinkFaces.count( fID )) facesWOL.push_back( *f ); } } @@ -1251,42 +1304,42 @@ bool _ViscousBuilder::findFacesWithLayers() switch ( facesWOL.size() ) { case 1: + { + helper.SetSubShape( facesWOL[0] ); + if ( helper.IsRealSeam( vInd )) // inflate along a seam edge? { - helper.SetSubShape( facesWOL[0] ); - if ( helper.IsRealSeam( vInd )) // inflate along a seam edge? - { - TopoDS_Shape seamEdge; - PShapeIteratorPtr eIt = helper.GetAncestors(vertex, *_mesh, TopAbs_EDGE); - while ( eIt->more() && seamEdge.IsNull() ) - { - const TopoDS_Shape* e = eIt->next(); - if ( helper.IsRealSeam( *e ) ) - seamEdge = *e; - } - if ( !seamEdge.IsNull() ) - { - _sdVec[i]._shrinkShape2Shape.insert( make_pair( vInd, seamEdge )); - break; - } - } - _sdVec[i]._shrinkShape2Shape.insert( make_pair( vInd, facesWOL[0] )); - break; - } - case 2: - { - // find an edge shared by 2 faces + TopoDS_Shape seamEdge; PShapeIteratorPtr eIt = helper.GetAncestors(vertex, *_mesh, TopAbs_EDGE); - while ( eIt->more()) + while ( eIt->more() && seamEdge.IsNull() ) { const TopoDS_Shape* e = eIt->next(); - if ( helper.IsSubShape( *e, facesWOL[0]) && - helper.IsSubShape( *e, facesWOL[1])) - { - _sdVec[i]._shrinkShape2Shape.insert( make_pair( vInd, *e )); break; - } + if ( helper.IsRealSeam( *e ) ) + seamEdge = *e; + } + if ( !seamEdge.IsNull() ) + { + _sdVec[i]._shrinkShape2Shape.insert( make_pair( vInd, seamEdge )); + break; } - break; } + _sdVec[i]._shrinkShape2Shape.insert( make_pair( vInd, facesWOL[0] )); + break; + } + case 2: + { + // find an edge shared by 2 faces + PShapeIteratorPtr eIt = helper.GetAncestors(vertex, *_mesh, TopAbs_EDGE); + while ( eIt->more()) + { + const TopoDS_Shape* e = eIt->next(); + if ( helper.IsSubShape( *e, facesWOL[0]) && + helper.IsSubShape( *e, facesWOL[1])) + { + _sdVec[i]._shrinkShape2Shape.insert( make_pair( vInd, *e )); break; + } + } + break; + } default: return error("Not yet supported case", _sdVec[i]._index); } @@ -1309,10 +1362,10 @@ bool _ViscousBuilder::makeLayer(_SolidData& data) subIds = data._noShrinkFaces; TopExp_Explorer exp( data._solid, TopAbs_FACE ); for ( ; exp.More(); exp.Next() ) - if ( ! _ignoreShapeIds.count( getMeshDS()->ShapeToIndex( exp.Current() ))) { SMESH_subMesh* fSubM = _mesh->GetSubMesh( exp.Current() ); - faceIds.insert( fSubM->GetId() ); + if ( ! data._ignoreFaceIds.count( getMeshDS()->ShapeToIndex( exp.Current() ))) + faceIds.insert( fSubM->GetId() ); SMESH_subMeshIteratorPtr subIt = fSubM->getDependsOnIterator(/*includeSelf=*/true, /*complexShapeFirst=*/false); while ( subIt->more() ) @@ -1326,7 +1379,7 @@ bool _ViscousBuilder::makeLayer(_SolidData& data) for (; s2s != data._shrinkShape2Shape.end(); ++s2s ) { TGeomID shapeInd = s2s->first; - for ( unsigned i = 0; i < _sdVec.size(); ++i ) + for ( size_t i = 0; i < _sdVec.size(); ++i ) { if ( _sdVec[i]._index == data._index ) continue; map< TGeomID, TopoDS_Shape >::iterator s2s2 = _sdVec[i]._shrinkShape2Shape.find( shapeInd ); @@ -1433,7 +1486,7 @@ bool _ViscousBuilder::makeLayer(_SolidData& data) // Set target nodes into _Simplex and _2NearEdges TNode2Edge::iterator n2e; - for ( unsigned i = 0; i < data._edges.size(); ++i ) + for ( size_t i = 0; i < data._edges.size(); ++i ) { if ( data._edges[i]->IsOnEdge()) for ( int j = 0; j < 2; ++j ) @@ -1447,7 +1500,7 @@ bool _ViscousBuilder::makeLayer(_SolidData& data) data._edges[i]->_2neibors->_edges[j] = n2e->second; } else - for ( unsigned j = 0; j < data._edges[i]->_simplices.size(); ++j ) + for ( size_t j = 0; j < data._edges[i]->_simplices.size(); ++j ) { _Simplex& s = data._edges[i]->_simplices[j]; s._nNext = data._n2eMap[ s._nNext ]->_nodes.back(); @@ -1531,7 +1584,7 @@ bool _ViscousBuilder::sortEdges( _SolidData& data, SMESH_MesherHelper helper( *_mesh ); bool ok = true; - for ( unsigned iS = 0; iS < edgesByGeom.size(); ++iS ) + for ( size_t iS = 0; iS < edgesByGeom.size(); ++iS ) { vector<_LayerEdge*>& eS = edgesByGeom[iS]; if ( eS.empty() ) continue; @@ -1575,7 +1628,7 @@ bool _ViscousBuilder::sortEdges( _SolidData& data, if ( eE.empty() ) continue; if ( eE[0]->_sWOL.IsNull() ) { - for ( unsigned i = 0; i < eE.size() && !needSmooth; ++i ) + for ( size_t i = 0; i < eE.size() && !needSmooth; ++i ) needSmooth = ( eE[i]->_cosin > 0.1 ); } else @@ -1583,7 +1636,7 @@ bool _ViscousBuilder::sortEdges( _SolidData& data, const TopoDS_Face& F1 = TopoDS::Face( S ); const TopoDS_Face& F2 = TopoDS::Face( eE[0]->_sWOL ); const TopoDS_Edge& E = TopoDS::Edge( eExp.Current() ); - for ( unsigned i = 0; i < eE.size() && !needSmooth; ++i ) + for ( size_t i = 0; i < eE.size() && !needSmooth; ++i ) { gp_Vec dir1 = getFaceDir( F1, E, eE[i]->_nodes[0], helper, ok ); gp_Vec dir2 = getFaceDir( F2, E, eE[i]->_nodes[0], helper, ok ); @@ -1622,7 +1675,7 @@ bool _ViscousBuilder::sortEdges( _SolidData& data, } // then the rest _LayerEdge's - for ( unsigned iS = 0; iS < edgesByGeom.size(); ++iS ) + for ( size_t iS = 0; iS < edgesByGeom.size(); ++iS ) { vector<_LayerEdge*>& eVec = edgesByGeom[iS]; data._edges.insert( data._edges.end(), eVec.begin(), eVec.end() ); @@ -1799,9 +1852,9 @@ bool _ViscousBuilder::setEdgeData(_LayerEdge& edge, if ( posType == SMDS_TOP_FACE ) { - getSimplices( node, edge._simplices, _ignoreShapeIds, &data ); + getSimplices( node, edge._simplices, data._ignoreFaceIds, &data ); double avgNormProj = 0, avgLen = 0; - for ( unsigned i = 0; i < edge._simplices.size(); ++i ) + for ( size_t i = 0; i < edge._simplices.size(); ++i ) { gp_XYZ vec = edge._pos.back() - SMESH_TNodeXYZ( edge._simplices[i]._nPrev ); avgNormProj += edge._normal * vec; @@ -1993,7 +2046,7 @@ void _ViscousBuilder::getSimplices( const SMDS_MeshNode* node, const TGeomID shapeInd = f->getshapeId(); if ( ingnoreShapes.count( shapeInd )) continue; const int nbNodes = f->NbCornerNodes(); - int srcInd = f->GetNodeIndex( node ); + const int srcInd = f->GetNodeIndex( node ); const SMDS_MeshNode* nPrev = f->GetNode( SMESH_MesherHelper::WrapIndex( srcInd-1, nbNodes )); const SMDS_MeshNode* nNext = f->GetNode( SMESH_MesherHelper::WrapIndex( srcInd+1, nbNodes )); const SMDS_MeshNode* nOpp = f->GetNode( SMESH_MesherHelper::WrapIndex( srcInd+2, nbNodes )); @@ -2031,7 +2084,7 @@ void _ViscousBuilder::getSimplices( const SMDS_MeshNode* node, void _ViscousBuilder::makeGroupOfLE() { #ifdef _DEBUG_ - for ( unsigned i = 0 ; i < _sdVec.size(); ++i ) + for ( size_t i = 0 ; i < _sdVec.size(); ++i ) { if ( _sdVec[i]._edges.empty() ) continue; // string name = SMESH_Comment("_LayerEdge's_") << i; @@ -2041,10 +2094,10 @@ void _ViscousBuilder::makeGroupOfLE() // SMESHDS_Mesh* mDS = _mesh->GetMeshDS(); dumpFunction( SMESH_Comment("make_LayerEdge_") << i ); - for ( unsigned j = 0 ; j < _sdVec[i]._edges.size(); ++j ) + for ( size_t j = 0 ; j < _sdVec[i]._edges.size(); ++j ) { _LayerEdge* le = _sdVec[i]._edges[j]; - for ( unsigned iN = 1; iN < le->_nodes.size(); ++iN ) + for ( size_t iN = 1; iN < le->_nodes.size(); ++iN ) dumpCmd(SMESH_Comment("mesh.AddEdge([ ") <_nodes[iN-1]->GetID() << ", " << le->_nodes[iN]->GetID() <<"])"); //gDS->SMDSGroup().Add( mDS->AddEdge( le->_nodes[iN-1], le->_nodes[iN])); @@ -2052,7 +2105,7 @@ void _ViscousBuilder::makeGroupOfLE() dumpFunctionEnd(); dumpFunction( SMESH_Comment("makeNormals") << i ); - for ( unsigned j = 0 ; j < _sdVec[i]._edges.size(); ++j ) + for ( size_t j = 0 ; j < _sdVec[i]._edges.size(); ++j ) { _LayerEdge& edge = *_sdVec[i]._edges[j]; SMESH_TNodeXYZ nXYZ( edge._nodes[0] ); @@ -2106,7 +2159,7 @@ bool _ViscousBuilder::inflate(_SolidData& data) auto_ptr searcher ( SMESH_MeshAlgos::GetElementSearcher( *getMeshDS(), data._proxyMesh->GetFaces( data._solid )) ); - for ( unsigned i = 0; i < data._edges.size(); ++i ) + for ( size_t i = 0; i < data._edges.size(); ++i ) { if ( data._edges[i]->IsOnEdge() ) continue; data._edges[i]->FindIntersection( *searcher, intersecDist, data._epsilon ); @@ -2141,7 +2194,7 @@ bool _ViscousBuilder::inflate(_SolidData& data) // Elongate _LayerEdge's dumpFunction(SMESH_Comment("inflate")<SetNewLength( curThick, helper ); } @@ -2157,7 +2210,7 @@ bool _ViscousBuilder::inflate(_SolidData& data) if ( nbSteps > 0 ) { dumpFunction(SMESH_Comment("invalidate")<InvalidateStep( nbSteps+1 ); } @@ -2169,7 +2222,7 @@ bool _ViscousBuilder::inflate(_SolidData& data) // Evaluate achieved thickness avgThick = 0; - for ( unsigned i = 0; i < data._edges.size(); ++i ) + for ( size_t i = 0; i < data._edges.size(); ++i ) avgThick += data._edges[i]->_len; avgThick /= data._edges.size(); #ifdef __myDEBUG @@ -2217,7 +2270,7 @@ bool _ViscousBuilder::smoothAndCheck(_SolidData& data, TopoDS_Face F; int iBeg, iEnd = 0; - for ( unsigned iS = 0; iS < data._endEdgeToSmooth.size(); ++iS ) + for ( size_t iS = 0; iS < data._endEdgeToSmooth.size(); ++iS ) { iBeg = iEnd; iEnd = data._endEdgeToSmooth[ iS ]; @@ -2283,7 +2336,7 @@ bool _ViscousBuilder::smoothAndCheck(_SolidData& data, { _LayerEdge* edge = data._edges[i]; SMESH_TNodeXYZ tgtXYZ( edge->_nodes.back() ); - for ( unsigned j = 0; j < edge->_simplices.size(); ++j ) + for ( size_t j = 0; j < edge->_simplices.size(); ++j ) if ( !edge->_simplices[j].IsForward( edge->_nodes[0], &tgtXYZ )) { cout << "Bad simplex ( " << edge->_nodes[0]->GetID()<< " "<< tgtXYZ._node->GetID() @@ -2312,7 +2365,7 @@ bool _ViscousBuilder::smoothAndCheck(_SolidData& data, const SMDS_MeshElement* closestFace = 0; int iLE = 0; #endif - for ( unsigned i = 0; i < data._edges.size(); ++i ) + for ( size_t i = 0; i < data._edges.size(); ++i ) { if ( data._edges[i]->FindIntersection( *searcher, dist, data._epsilon, &intFace )) return false; @@ -2623,7 +2676,7 @@ bool _ViscousBuilder::updateNormals( _SolidData& data, vector< const SMDS_MeshNode*> nodes(4); // of a tmp mesh face dumpFunction(SMESH_Comment("makeTmpFacesOnEdges")<IsOnEdge() || !edge->_sWOL.IsNull() ) continue; @@ -2640,7 +2693,7 @@ bool _ViscousBuilder::updateNormals( _SolidData& data, } // look for a _LayerEdge containg tgt2 // _LayerEdge* neiborEdge = 0; -// unsigned di = 0; // check _edges[i+di] and _edges[i-di] +// size_t di = 0; // check _edges[i+di] and _edges[i-di] // while ( !neiborEdge && ++di <= data._edges.size() ) // { // if ( i+di < data._edges.size() && data._edges[i+di]->_nodes.back() == tgt2 ) @@ -2679,7 +2732,7 @@ bool _ViscousBuilder::updateNormals( _SolidData& data, TLEdge2LEdgeSet edge2CloseEdge; const double eps = data._epsilon * data._epsilon; - for ( unsigned i = 0; i < data._edges.size(); ++i ) + for ( size_t i = 0; i < data._edges.size(); ++i ) { _LayerEdge* edge = data._edges[i]; if ( !edge->IsOnEdge() || !edge->_sWOL.IsNull() ) continue; @@ -2850,7 +2903,7 @@ bool _ViscousBuilder::updateNormals( _SolidData& data, // 2) Check absence of intersections // TODO? - for ( unsigned i = 0 ; i < tmpFaces.size(); ++i ) + for ( size_t i = 0 ; i < tmpFaces.size(); ++i ) delete tmpFaces[i]; return true; @@ -2876,7 +2929,7 @@ bool _LayerEdge::FindIntersection( SMESH_ElementSearcher& searcher, bool segmentIntersected = false; distance = Precision::Infinite(); int iFace = -1; // intersected face - for ( unsigned j = 0 ; j < suspectFaces.size() && !segmentIntersected; ++j ) + for ( size_t j = 0 ; j < suspectFaces.size() && !segmentIntersected; ++j ) { const SMDS_MeshElement* face = suspectFaces[j]; if ( face->GetNodeIndex( _nodes.back() ) >= 0 || @@ -3164,7 +3217,7 @@ bool _LayerEdge::Smooth(int& badNb) // compute new position for the last _pos gp_XYZ newPos (0,0,0); - for ( unsigned i = 0; i < _simplices.size(); ++i ) + for ( size_t i = 0; i < _simplices.size(); ++i ) newPos += SMESH_TNodeXYZ( _simplices[i]._nPrev ); newPos /= _simplices.size(); @@ -3187,11 +3240,11 @@ bool _LayerEdge::Smooth(int& badNb) // count quality metrics (orientation) of tetras around _tgtNode int nbOkBefore = 0; SMESH_TNodeXYZ tgtXYZ( _nodes.back() ); - for ( unsigned i = 0; i < _simplices.size(); ++i ) + for ( size_t i = 0; i < _simplices.size(); ++i ) nbOkBefore += _simplices[i].IsForward( _nodes[0], &tgtXYZ ); int nbOkAfter = 0; - for ( unsigned i = 0; i < _simplices.size(); ++i ) + for ( size_t i = 0; i < _simplices.size(); ++i ) nbOkAfter += _simplices[i].IsForward( _nodes[0], &newPos ); if ( nbOkAfter < nbOkBefore ) @@ -3317,14 +3370,14 @@ bool _ViscousBuilder::refine(_SolidData& data) gp_XY uv; bool isOnEdge; - for ( unsigned i = 0; i < data._edges.size(); ++i ) + for ( size_t i = 0; i < data._edges.size(); ++i ) { _LayerEdge& edge = *data._edges[i]; // get accumulated length of segments vector< double > segLen( edge._pos.size() ); segLen[0] = 0.0; - for ( unsigned j = 1; j < edge._pos.size(); ++j ) + for ( size_t j = 1; j < edge._pos.size(); ++j ) segLen[j] = segLen[j-1] + (edge._pos[j-1] - edge._pos[j] ).Modulus(); // allocate memory for new nodes if it is not yet refined @@ -3372,8 +3425,8 @@ bool _ViscousBuilder::refine(_SolidData& data) // create intermediate nodes double hSum = 0, hi = h0/f; - unsigned iSeg = 1; - for ( unsigned iStep = 1; iStep < edge._nodes.size(); ++iStep ) + size_t iSeg = 1; + for ( size_t iStep = 1; iStep < edge._nodes.size(); ++iStep ) { // compute an intermediate position hi *= f; @@ -3440,7 +3493,7 @@ bool _ViscousBuilder::refine(_SolidData& data) if ( !getMeshDS()->IsEmbeddedMode() ) // Log node movement - for ( unsigned i = 0; i < data._edges.size(); ++i ) + for ( size_t i = 0; i < data._edges.size(); ++i ) { _LayerEdge& edge = *data._edges[i]; SMESH_TNodeXYZ p ( edge._nodes.back() ); @@ -3454,7 +3507,7 @@ bool _ViscousBuilder::refine(_SolidData& data) TopExp_Explorer exp( data._solid, TopAbs_FACE ); for ( ; exp.More(); exp.Next() ) { - if ( _ignoreShapeIds.count( getMeshDS()->ShapeToIndex( exp.Current() ))) + if ( data._ignoreFaceIds.count( getMeshDS()->ShapeToIndex( exp.Current() ))) continue; SMESHDS_SubMesh* fSubM = getMeshDS()->MeshElements( exp.Current() ); SMDS_ElemIteratorPtr fIt = fSubM->GetElements(); @@ -3505,7 +3558,7 @@ bool _ViscousBuilder::shrink() // make map of (ids of FACEs to shrink mesh on) to (_SolidData containing _LayerEdge's // inflated along FACE or EDGE) map< TGeomID, _SolidData* > f2sdMap; - for ( unsigned i = 0 ; i < _sdVec.size(); ++i ) + for ( size_t i = 0 ; i < _sdVec.size(); ++i ) { _SolidData& data = _sdVec[i]; TopTools_MapOfShape FFMap; @@ -3606,7 +3659,7 @@ bool _ViscousBuilder::shrink() // Replace source nodes by target nodes in mesh faces to shrink const SMDS_MeshNode* nodes[20]; - for ( unsigned i = 0; i < lEdges.size(); ++i ) + for ( size_t i = 0; i < lEdges.size(); ++i ) { _LayerEdge& edge = *lEdges[i]; const SMDS_MeshNode* srcNode = edge._nodes[0]; @@ -3635,7 +3688,7 @@ bool _ViscousBuilder::shrink() { dumpFunction(SMESH_Comment("beforeShrinkFace")<first); // debug const bool sortSimplices = isConcaveFace; - for ( unsigned i = 0; i < smoothNodes.size(); ++i ) + for ( size_t i = 0; i < smoothNodes.size(); ++i ) { const SMDS_MeshNode* n = smoothNodes[i]; nodesToSmooth[ i ]._node = n; @@ -3652,7 +3705,7 @@ bool _ViscousBuilder::shrink() // Find EDGE's to shrink set< _Shrinker1D* > eShri1D; { - for ( unsigned i = 0; i < lEdges.size(); ++i ) + for ( size_t i = 0; i < lEdges.size(); ++i ) { _LayerEdge* edge = lEdges[i]; if ( edge->_sWOL.ShapeType() == TopAbs_EDGE ) @@ -3684,7 +3737,7 @@ bool _ViscousBuilder::shrink() // ----------------------------------------------- dumpFunction(SMESH_Comment("moveBoundaryOnF")<first<<"_st"<SetNewLength2d( surface,F,helper ); } @@ -3708,7 +3761,7 @@ bool _ViscousBuilder::shrink() int oldBadNb = badNb; badNb = 0; moved = false; - for ( unsigned i = 0; i < nodesToSmooth.size(); ++i ) + for ( size_t i = 0; i < nodesToSmooth.size(); ++i ) { moved |= nodesToSmooth[i].Smooth( badNb,surface,helper,refSign, smoothType, /*set3D=*/isConcaveFace); @@ -3737,7 +3790,7 @@ bool _ViscousBuilder::shrink() for ( int st = /*highQuality ? 10 :*/ 3; st; --st ) { dumpFunction(SMESH_Comment("shrinkFace")<first<<"_st"<<++smooStep); // debug - for ( unsigned i = 0; i < nodesToSmooth.size(); ++i ) + for ( size_t i = 0; i < nodesToSmooth.size(); ++i ) { nodesToSmooth[i].Smooth( badNb,surface,helper,refSign, smoothType,/*set3D=*/st==1 ); @@ -3750,7 +3803,7 @@ bool _ViscousBuilder::shrink() if ( !getMeshDS()->IsEmbeddedMode() ) // Log node movement - for ( unsigned i = 0; i < nodesToSmooth.size(); ++i ) + for ( size_t i = 0; i < nodesToSmooth.size(); ++i ) { SMESH_TNodeXYZ p ( nodesToSmooth[i]._node ); getMeshDS()->MoveNode( nodesToSmooth[i]._node, p.X(), p.Y(), p.Z() ); @@ -3804,7 +3857,7 @@ bool _ViscousBuilder::prepareEdgeToShrink( _LayerEdge& edge, if ( faceSubMesh->Contains( f )) faces.push_back( f ); } - for ( unsigned i = 0; i < faces.size(); ++i ) + for ( size_t i = 0; i < faces.size(); ++i ) { const int nbNodes = faces[i]->NbCornerNodes(); for ( int j = 0; j < nbNodes; ++j ) @@ -4087,7 +4140,7 @@ bool _LayerEdge::SetNewLength2d( Handle(Geom_Surface)& surface, const double kSafe = 0.8; const double minStepSize = uvLen / 10; double stepSize = uvLen; - for ( unsigned i = 0; i < _simplices.size(); ++i ) + for ( size_t i = 0; i < _simplices.size(); ++i ) { const SMDS_MeshNode* nn[2] = { _simplices[i]._nPrev, _simplices[i]._nNext }; for ( int j = 0; j < 2; ++j ) @@ -4240,11 +4293,11 @@ bool _SmoothNode::Smooth(int& badNb, // count quality metrics (orientation) of triangles around the node int nbOkBefore = 0; gp_XY tgtUV = helper.GetNodeUV( face, _node ); - for ( unsigned i = 0; i < _simplices.size(); ++i ) + for ( size_t i = 0; i < _simplices.size(); ++i ) nbOkBefore += _simplices[i].IsForward( tgtUV, _node, face, helper, refSign ); int nbOkAfter = 0; - for ( unsigned i = 0; i < _simplices.size(); ++i ) + for ( size_t i = 0; i < _simplices.size(); ++i ) nbOkAfter += _simplices[i].IsForward( newPos, _node, face, helper, refSign ); if ( nbOkAfter < nbOkBefore ) @@ -4341,7 +4394,7 @@ gp_XY _SmoothNode::computeAngularPos(vector& uv, _SolidData::~_SolidData() { - for ( unsigned i = 0; i < _edges.size(); ++i ) + for ( size_t i = 0; i < _edges.size(); ++i ) { if ( _edges[i] && _edges[i]->_2neibors ) delete _edges[i]->_2neibors; @@ -4414,7 +4467,7 @@ void _Shrinker1D::AddEdge( const _LayerEdge* e, SMESH_MesherHelper& helper ) { // remove target node of the _LayerEdge from _nodes int nbFound = 0; - for ( unsigned i = 0; i < _nodes.size(); ++i ) + for ( size_t i = 0; i < _nodes.size(); ++i ) if ( !_nodes[i] || _nodes[i] == tgtNode0 || _nodes[i] == tgtNode1 ) _nodes[i] = 0, nbFound++; if ( nbFound == _nodes.size() ) @@ -4452,7 +4505,7 @@ void _Shrinker1D::Compute(bool set3D, SMESH_MesherHelper& helper) l = helper.GetNodeU( E, _edges[1]->_nodes.back(), _nodes.back() ); double totLen = GCPnts_AbscissaPoint::Length( aCurve, f, l ); - for ( unsigned i = 0; i < _nodes.size(); ++i ) + for ( size_t i = 0; i < _nodes.size(); ++i ) { if ( !_nodes[i] ) continue; double len = totLen * _normPar[i]; @@ -4474,7 +4527,7 @@ void _Shrinker1D::Compute(bool set3D, SMESH_MesherHelper& helper) if ( _edges[1] ) l = helper.GetNodeU( E, _edges[1]->_nodes.back(), _nodes.back() ); - for ( unsigned i = 0; i < _nodes.size(); ++i ) + for ( size_t i = 0; i < _nodes.size(); ++i ) { if ( !_nodes[i] ) continue; double u = f * ( 1-_normPar[i] ) + l * _normPar[i]; @@ -4493,7 +4546,7 @@ void _Shrinker1D::Compute(bool set3D, SMESH_MesherHelper& helper) void _Shrinker1D::RestoreParams() { if ( _done ) - for ( unsigned i = 0; i < _nodes.size(); ++i ) + for ( size_t i = 0; i < _nodes.size(); ++i ) { if ( !_nodes[i] ) continue; SMDS_EdgePosition* pos = static_cast( _nodes[i]->GetPosition() ); @@ -4546,7 +4599,7 @@ bool _ViscousBuilder::addBoundaryElements() { SMESH_MesherHelper helper( *_mesh ); - for ( unsigned i = 0; i < _sdVec.size(); ++i ) + for ( size_t i = 0; i < _sdVec.size(); ++i ) { _SolidData& data = _sdVec[i]; TopTools_IndexedMapOfShape geomEdges; @@ -4617,7 +4670,7 @@ bool _ViscousBuilder::addBoundaryElements() { const TopoDS_Shape* pF = fIt->next(); if ( helper.IsSubShape( *pF, data._solid) && - !_ignoreShapeIds.count( e2f->first )) + !data._ignoreFaceIds.count( e2f->first )) F = *pF; } } @@ -4633,7 +4686,7 @@ bool _ViscousBuilder::addBoundaryElements() // Make faces const int dj1 = reverse ? 0 : 1; const int dj2 = reverse ? 1 : 0; - for ( unsigned j = 1; j < ledges.size(); ++j ) + for ( size_t j = 1; j < ledges.size(); ++j ) { vector< const SMDS_MeshNode*>& nn1 = ledges[j-dj1]->_nodes; vector< const SMDS_MeshNode*>& nn2 = ledges[j-dj2]->_nodes; diff --git a/src/StdMeshersGUI/StdMeshersGUI_StdHypothesisCreator.cxx b/src/StdMeshersGUI/StdMeshersGUI_StdHypothesisCreator.cxx index 84d06b807..342f66fc4 100644 --- a/src/StdMeshersGUI/StdMeshersGUI_StdHypothesisCreator.cxx +++ b/src/StdMeshersGUI/StdMeshersGUI_StdHypothesisCreator.cxx @@ -721,9 +721,9 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const h->SetStretchFactor ( params[2].myValue.toDouble() ); if ( StdMeshersGUI_SubShapeSelectorWdg* idsWg = - widget< StdMeshersGUI_SubShapeSelectorWdg >( 3 )) + widget< StdMeshersGUI_SubShapeSelectorWdg >( 4 )) { - h->SetIgnoreFaces( idsWg->GetListOfIDs() ); + h->SetFaces( idsWg->GetListOfIDs(), params[3].myValue.toInt() ); } } else if( hypType()=="ViscousLayers2D" ) @@ -1244,7 +1244,19 @@ bool StdMeshersGUI_StdHypothesisCreator::stdParams( ListOfStdParams& p ) const QString aMainEntry = SMESHGUI_GenericHypothesisCreator::getMainShapeEntry(); if ( !aMainEntry.isEmpty() ) { - item.myName = tr( "SMESH_FACES_WO_LAYERS" ); + item.myName = tr( "TO_IGNORE_FACES_OR_NOT" ); + p.append( item ); + + StdMeshersGUI_RadioButtonsGrpWdg* ignoreWdg = new StdMeshersGUI_RadioButtonsGrpWdg(""); + ignoreWdg->setButtonLabels ( QStringList() + << tr("NOT_TO_IGNORE_FACES") + << tr("TO_IGNORE_FACES") ); + ignoreWdg->setChecked( h->GetIsToIgnoreFaces() ); + connect(ignoreWdg->getButtonGroup(),SIGNAL(buttonClicked(int)),this,SLOT(onValueChanged())); + customWidgets()->append( ignoreWdg ); + + item.myName = + tr( h->GetIsToIgnoreFaces() ? "SMESH_FACES_WO_LAYERS" : "SMESH_FACES_WITH_LAYERS" ); p.append( item ); StdMeshersGUI_SubShapeSelectorWdg* idsWg = @@ -1252,7 +1264,7 @@ bool StdMeshersGUI_StdHypothesisCreator::stdParams( ListOfStdParams& p ) const idsWg->SetGeomShapeEntry( aMainEntry ); idsWg->SetMainShapeEntry( aMainEntry ); - idsWg->SetListOfIDs( h->GetIgnoreFaces() ); + idsWg->SetListOfIDs( h->GetFaces() ); idsWg->showPreview( true ); customWidgets()->append ( idsWg ); } @@ -1656,12 +1668,15 @@ void StdMeshersGUI_StdHypothesisCreator::valueChanged( QWidget* paramWidget) toCopyGroups->setEnabled( true ); } } - else if ( hypType() == "ViscousLayers2D" && paramWidget->inherits("QButtonGroup")) + else if ( hypType().startsWith( "ViscousLayers" ) && paramWidget->inherits("QButtonGroup")) { if ( QLabel* label = getLabel(4) ) { bool toIgnore = widget< StdMeshersGUI_RadioButtonsGrpWdg >( 3 )->checkedId(); - label->setText( tr( toIgnore ? "SMESH_EDGES_WO_LAYERS" : "SMESH_EDGES_WITH_LAYERS" )); + if ( hypType() == "ViscousLayers2D" ) + label->setText( tr( toIgnore ? "SMESH_EDGES_WO_LAYERS" : "SMESH_EDGES_WITH_LAYERS" )); + else + label->setText( tr( toIgnore ? "SMESH_FACES_WO_LAYERS" : "SMESH_FACES_WITH_LAYERS" )); } } } diff --git a/src/StdMeshersGUI/StdMeshers_msg_en.ts b/src/StdMeshersGUI/StdMeshers_msg_en.ts index 49510a032..f2ccb30f8 100644 --- a/src/StdMeshersGUI/StdMeshers_msg_en.ts +++ b/src/StdMeshersGUI/StdMeshers_msg_en.ts @@ -15,6 +15,18 @@ TO_IGNORE_EDGES Edges without layers (inlets and oulets) + + TO_IGNORE_FACES_OR_NOT + Specified faces are + + + NOT_TO_IGNORE_FACES + Faces with layers (walls) + + + TO_IGNORE_FACES + Faces without layers (inlets and oulets) + @default diff --git a/src/StdMeshers_I/StdMeshers_ViscousLayers_i.cxx b/src/StdMeshers_I/StdMeshers_ViscousLayers_i.cxx index 5ad82c7ec..8b3050421 100644 --- a/src/StdMeshers_I/StdMeshers_ViscousLayers_i.cxx +++ b/src/StdMeshers_I/StdMeshers_ViscousLayers_i.cxx @@ -78,15 +78,34 @@ StdMeshers_ViscousLayers_i::~StdMeshers_ViscousLayers_i() */ //================================================================================ -void StdMeshers_ViscousLayers_i::SetIgnoreFaces(const ::SMESH::long_array& faceIDs) -throw ( SALOME::SALOME_Exception ) +void StdMeshers_ViscousLayers_i::SetFaces(const ::SMESH::long_array& faceIDs, + CORBA::Boolean toIgnore) + throw ( SALOME::SALOME_Exception ) { vector ids( faceIDs.length() ); for ( unsigned i = 0; i < ids.size(); ++i ) if (( ids[i] = faceIDs[i] ) < 1 ) THROW_SALOME_CORBA_EXCEPTION( "Invalid face id", SALOME::BAD_PARAM ); - GetImpl()->SetBndShapes( ids, /*toIgnore=*/true ); - SMESH::TPythonDump() << _this() << ".SetIgnoreFaces( " << faceIDs << " )"; + + GetImpl()->SetBndShapes( ids, toIgnore ); + + SMESH::TPythonDump() << _this() << ".SetFaces( " << faceIDs << ", " << toIgnore << " )"; +} + +//================================================================================ +/*! + * \brief + */ +//================================================================================ + +SMESH::long_array* StdMeshers_ViscousLayers_i::GetFaces() +{ + vector idsVec = GetImpl()->GetBndShapes(); + SMESH::long_array_var ids = new SMESH::long_array; + ids->length( idsVec.size() ); + for ( unsigned i = 0; i < idsVec.size(); ++i ) + ids[i] = idsVec[i]; + return ids._retn(); } //================================================================================ @@ -97,15 +116,37 @@ throw ( SALOME::SALOME_Exception ) SMESH::long_array* StdMeshers_ViscousLayers_i::GetIgnoreFaces() { - SMESH::long_array_var ids = new SMESH::long_array; if ( GetImpl()->IsToIgnoreShapes() ) - { - vector idsVec = GetImpl()->GetBndShapes(); - ids->length( idsVec.size() ); - for ( unsigned i = 0; i < idsVec.size(); ++i ) - ids[i] = idsVec[i]; - } - return ids._retn(); + return this->GetFaces(); + return new SMESH::long_array; +} + +//================================================================================ +/*! + * \brief + */ +//================================================================================ + +CORBA::Boolean StdMeshers_ViscousLayers_i::GetIsToIgnoreFaces() +{ + return GetImpl()->IsToIgnoreShapes(); +} + +//================================================================================ +/*! + * \brief + */ +//================================================================================ + +void StdMeshers_ViscousLayers_i::SetIgnoreFaces(const ::SMESH::long_array& faceIDs) +throw ( SALOME::SALOME_Exception ) +{ + vector ids( faceIDs.length() ); + for ( unsigned i = 0; i < ids.size(); ++i ) + if (( ids[i] = faceIDs[i] ) < 1 ) + THROW_SALOME_CORBA_EXCEPTION( "Invalid face id", SALOME::BAD_PARAM ); + GetImpl()->SetBndShapes( ids, /*toIgnore=*/true ); + SMESH::TPythonDump() << _this() << ".SetIgnoreFaces( " << faceIDs << " )"; } //================================================================================ diff --git a/src/StdMeshers_I/StdMeshers_ViscousLayers_i.hxx b/src/StdMeshers_I/StdMeshers_ViscousLayers_i.hxx index 59c8d324c..9a6b760e3 100644 --- a/src/StdMeshers_I/StdMeshers_ViscousLayers_i.hxx +++ b/src/StdMeshers_I/StdMeshers_ViscousLayers_i.hxx @@ -51,6 +51,11 @@ class STDMESHERS_I_EXPORT StdMeshers_ViscousLayers_i: void SetIgnoreFaces(const ::SMESH::long_array& faceIDs) throw ( SALOME::SALOME_Exception ); SMESH::long_array* GetIgnoreFaces(); + void SetFaces(const SMESH::long_array& faceIDs, + CORBA::Boolean toIgnore) throw (SALOME::SALOME_Exception); + SMESH::long_array* GetFaces(); + CORBA::Boolean GetIsToIgnoreFaces(); + void SetTotalThickness(::CORBA::Double thickness) throw ( SALOME::SALOME_Exception ); ::CORBA::Double GetTotalThickness();