22313: EDF 2538 SMESH: Face with layers with ViscousLayer3D Hypothesis

This commit is contained in:
eap 2014-01-09 10:29:44 +00:00
parent 3c3543845e
commit b67b2447f1
9 changed files with 318 additions and 180 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 50 KiB

View File

@ -81,29 +81,29 @@ computations.
<li><b>Number of layers</b> - defines the number of element layers.</li> <li><b>Number of layers</b> - defines the number of element layers.</li>
<li><b>Stretch factor</b> - defines the growth factor of element height <li><b>Stretch factor</b> - defines the growth factor of element height
from the mesh boundary inwards.</li> from the mesh boundary inwards.</li>
<li><b>Specified Edges are</b> - defines how the shapes specified by <li><b>Specified Faces/Edges are</b> - defines how the shapes specified by
the next parameter are used. the next parameter are used.
<li><b>Faces without layers</b> and <b>Edges with/without layers</b> - <li><b> Faces/Edges with/without layers</b> -
in the 3D case it defines geometrical faces on which element layers defines geometrical faces or edges on which element layers
should not be constructed; in the 2D case it defines geometrical edges either should be or should not be constructed, depending on the
on which element layers either should be or should not be value of the previous parameter (<b>Specified Faces/Edges are</b>).
constructed, depending on the value of the previous parameter Faces (or edges) can be selected either in the Object Browser or in
(<b>Specified Edges are</b>). the VTK Viewer.
\note A mesh shown in the 3D Viewer can prevent selection of faces \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 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 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 (edges) shown at a time is limited by the value of "Sub-shapes
preview chunk size" preference (in Preferences/Mesh/General tab).<br> preview chunk size" preference (in Preferences/Mesh/General tab).<br>
Whatever shapes are specified by this If faces/edges without layers are specified, the element layers are
parameter, the element layers are not constructed on geometrical not constructed on geometrical faces shared by several solids in 3D
faces shared by several solids in 3D case and edges shared by case and edges shared by several faces in 2D case. In other words,
several faces in 2D case. In other words the element layers can be in this mode the element layers can be constructed on boundary faces
constructed on boundary faces and edges, and are not constructed on and edges only, and are not constructed on internal faces and
internal faces and edges. There is an exception to this rule in 2D edges. There is an exception to this rule: if a hypothesis is
case: if "Viscous Layers 2D" hypothesis is assigned to a sub-mesh, assigned to a sub-mesh, the element layers can be constructed on
the element layers can be constructed on boundary edges of the shape boundary faces/edges of the shape of this sub-mesh, at same time
of this sub-mesh. 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. \image html viscous_layers_on_submesh.png 2D viscous layers constructed on boundary edges of a sub-mesh on a disk face.
</li> </li>
@ -114,5 +114,4 @@ computations.
<br><b>See also</b> a sample TUI script of a \ref tui_viscous_layers <br><b>See also</b> a sample TUI script of a \ref tui_viscous_layers
"Viscous layers construction". "Viscous layers construction".
*/ */

View File

@ -871,6 +871,14 @@ module StdMeshers
void SetIgnoreFaces(in SMESH::long_array faceIDs) raises (SALOME::SALOME_Exception); void SetIgnoreFaces(in SMESH::long_array faceIDs) raises (SALOME::SALOME_Exception);
SMESH::long_array GetIgnoreFaces(); 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 * Set total thickness of layers of prisms
*/ */

View File

@ -267,21 +267,26 @@ class Mesh_Algorithm:
# @param thickness total thickness of layers of prisms # @param thickness total thickness of layers of prisms
# @param numberOfLayers number 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 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 # @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): if not isinstance(self.algo, SMESH._objref_SMESH_3D_Algo):
raise TypeError, "ViscousLayers are supported by 3D algorithms only" raise TypeError, "ViscousLayers are supported by 3D algorithms only"
if not "ViscousLayers" in self.GetCompatibleHypothesis(): if not "ViscousLayers" in self.GetCompatibleHypothesis():
raise TypeError, "ViscousLayers are not supported by %s"%self.algo.GetName() raise TypeError, "ViscousLayers are not supported by %s"%self.algo.GetName()
if ignoreFaces and isinstance( ignoreFaces[0], geomBuilder.GEOM._objref_GEOM_Object ): if faces and isinstance( faces[0], geomBuilder.GEOM._objref_GEOM_Object ):
ignoreFaces = [ self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f) for f in ignoreFaces ] faces = [ self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f) for f in faces ]
hyp = self.Hypothesis("ViscousLayers", hyp = self.Hypothesis("ViscousLayers",
[thickness, numberOfLayers, stretchFactor, ignoreFaces]) [thickness, numberOfLayers, stretchFactor, faces])
hyp.SetTotalThickness(thickness) hyp.SetTotalThickness(thickness)
hyp.SetNumberLayers(numberOfLayers) hyp.SetNumberLayers(numberOfLayers)
hyp.SetStretchFactor(stretchFactor) hyp.SetStretchFactor(stretchFactor)
hyp.SetIgnoreFaces(ignoreFaces) hyp.SetFaces(faces, isFacesToIgnore)
return hyp return hyp
## Defines "ViscousLayers2D" hypothesis to give parameters of layers of quadrilateral ## 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 thickness total thickness of layers of quadrilaterals
# @param numberOfLayers number of layers # @param numberOfLayers number of layers
# @param stretchFactor factor (>1.0) of growth of layer thickness towards inside of mesh # @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 # 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 # @param isEdgesToIgnore if \c True, the Viscous layers are not generated on the
# edges specified by the previous parameter (\a edges). # edges specified by the previous parameter (\a edges).
# @ingroup l3_hypos_additi # @ingroup l3_hypos_additi

View File

@ -35,6 +35,7 @@
#include "SMESH_ControlsDef.hxx" #include "SMESH_ControlsDef.hxx"
#include "SMESH_Gen.hxx" #include "SMESH_Gen.hxx"
#include "SMESH_Group.hxx" #include "SMESH_Group.hxx"
#include "SMESH_HypoFilter.hxx"
#include "SMESH_Mesh.hxx" #include "SMESH_Mesh.hxx"
#include "SMESH_MeshAlgos.hxx" #include "SMESH_MeshAlgos.hxx"
#include "SMESH_MesherHelper.hxx" #include "SMESH_MesherHelper.hxx"
@ -63,6 +64,7 @@
#include <TopExp.hxx> #include <TopExp.hxx>
#include <TopExp_Explorer.hxx> #include <TopExp_Explorer.hxx>
#include <TopTools_IndexedMapOfShape.hxx> #include <TopTools_IndexedMapOfShape.hxx>
#include <TopTools_ListOfShape.hxx>
#include <TopTools_MapOfShape.hxx> #include <TopTools_MapOfShape.hxx>
#include <TopoDS.hxx> #include <TopoDS.hxx>
#include <TopoDS_Edge.hxx> #include <TopoDS_Edge.hxx>
@ -382,8 +384,10 @@ namespace VISCOUS_3D
{ {
TopoDS_Shape _solid; TopoDS_Shape _solid;
const StdMeshers_ViscousLayers* _hyp; const StdMeshers_ViscousLayers* _hyp;
TopoDS_Shape _hypShape;
_MeshOfSolid* _proxyMesh; _MeshOfSolid* _proxyMesh;
set<TGeomID> _reversedFaceIds; set<TGeomID> _reversedFaceIds;
set<TGeomID> _ignoreFaceIds;
double _stepSize, _stepSizeCoeff; double _stepSize, _stepSizeCoeff;
const SMDS_MeshNode* _stepSizeNodes[2]; const SMDS_MeshNode* _stepSizeNodes[2];
@ -393,10 +397,10 @@ namespace VISCOUS_3D
// iteration over the map is 5 time longer than over the vector // iteration over the map is 5 time longer than over the vector
vector< _LayerEdge* > _edges; vector< _LayerEdge* > _edges;
// key: an id of shape (EDGE or VERTEX) shared by a FACE with // key: an id of shape (EDGE or VERTEX) shared by a FACE with
// layers and a FACE w/o layers // layers and a FACE w/o layers
// value: the shape (FACE or EDGE) to shrink mesh on. // 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; map< TGeomID, TopoDS_Shape > _shrinkShape2Shape;
// FACE's WOL, srink on which is forbiden due to algo on the adjacent SOLID // 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(), _SolidData(const TopoDS_Shape& s=TopoDS_Shape(),
const StdMeshers_ViscousLayers* h=0, 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(); ~_SolidData();
Handle(Geom_Curve) CurveForSmooth( const TopoDS_Edge& E, Handle(Geom_Curve) CurveForSmooth( const TopoDS_Edge& E,
@ -513,7 +519,6 @@ namespace VISCOUS_3D
SMESH_ComputeErrorPtr _error; SMESH_ComputeErrorPtr _error;
vector< _SolidData > _sdVec; vector< _SolidData > _sdVec;
set<TGeomID> _ignoreShapeIds;
int _tmpFaceID; 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) StdMeshers_ViscousLayers::StdMeshers_ViscousLayers(int hypId, int studyId, SMESH_Gen* gen)
:SMESH_Hypothesis(hypId, studyId, 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(); _name = StdMeshers_ViscousLayers::GetHypType();
_param_algo_dim = -3; // auxiliary hyp used by 3D algos _param_algo_dim = -3; // auxiliary hyp used by 3D algos
@ -644,7 +649,7 @@ std::ostream & StdMeshers_ViscousLayers::SaveTo(std::ostream & save)
<< " " << _thickness << " " << _thickness
<< " " << _stretchFactor << " " << _stretchFactor
<< " " << _shapeIds.size(); << " " << _shapeIds.size();
for ( unsigned i = 0; i < _shapeIds.size(); ++i ) for ( size_t i = 0; i < _shapeIds.size(); ++i )
save << " " << _shapeIds[i]; save << " " << _shapeIds[i];
save << " " << !_isToIgnoreShapes; // negate to keep the behavior in old studies. save << " " << !_isToIgnoreShapes; // negate to keep the behavior in old studies.
return save; return save;
@ -746,7 +751,7 @@ namespace
// get average dir of edges going fromV // get average dir of edges going fromV
gp_XYZ edgeDir; gp_XYZ edgeDir;
//if ( edges.size() > 1 ) //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 ); edgeDir = getEdgeDir( edges[i], fromV );
double size2 = edgeDir.SquareModulus(); double size2 = edgeDir.SquareModulus();
@ -867,13 +872,13 @@ namespace
py = new ofstream(fname); py = new ofstream(fname);
*py << "import SMESH" << endl *py << "import SMESH" << endl
<< "from salome.smesh import smeshBuilder" << 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 << "meshSO = smesh.GetCurrentStudy().FindObjectID('0:1:2:3')" << endl
<< "mesh = smesh.Mesh( meshSO.GetObject() )"<<endl; << "mesh = smesh.Mesh( meshSO.GetObject() )"<<endl;
} }
void Finish() { void Finish() {
if (py) if (py)
*py << "mesh.MakeGroup('Viscous Prisms',VOLUME,FT_ElemGeomType,'=',Geom_PENTA)"<<endl; *py << "mesh.MakeGroup('Viscous Prisms',SMESH.VOLUME,SMESH.FT_ElemGeomType,'=',SMESH.Geom_PENTA)"<<endl;
delete py; py=0; delete py; py=0;
} }
~PyDump() { Finish(); } ~PyDump() { Finish(); }
@ -1027,7 +1032,7 @@ SMESH_ComputeErrorPtr _ViscousBuilder::Compute(SMESH_Mesh& theMesh,
if ( !findFacesWithLayers() ) if ( !findFacesWithLayers() )
return _error; return _error;
for ( unsigned i = 0; i < _sdVec.size(); ++i ) for ( size_t i = 0; i < _sdVec.size(); ++i )
{ {
if ( ! makeLayer(_sdVec[i]) ) if ( ! makeLayer(_sdVec[i]) )
return _error; return _error;
@ -1066,6 +1071,7 @@ bool _ViscousBuilder::findSolidsWithLayers()
_sdVec.reserve( allSolids.Extent()); _sdVec.reserve( allSolids.Extent());
SMESH_Gen* gen = _mesh->GetGen(); SMESH_Gen* gen = _mesh->GetGen();
SMESH_HypoFilter filter;
for ( int i = 1; i <= allSolids.Extent(); ++i ) for ( int i = 1; i <= allSolids.Extent(); ++i )
{ {
// find StdMeshers_ViscousLayers hyp assigned to the i-th solid // find StdMeshers_ViscousLayers hyp assigned to the i-th solid
@ -1080,10 +1086,14 @@ bool _ViscousBuilder::findSolidsWithLayers()
viscHyp = dynamic_cast<const StdMeshers_ViscousLayers*>( *hyp ); viscHyp = dynamic_cast<const StdMeshers_ViscousLayers*>( *hyp );
if ( viscHyp ) if ( viscHyp )
{ {
TopoDS_Shape hypShape;
filter.Init( filter.Is( viscHyp ));
_mesh->GetHypothesis( allSolids(i), filter, true, &hypShape );
_MeshOfSolid* proxyMesh = _ViscousListener::GetSolidMesh( _mesh, _MeshOfSolid* proxyMesh = _ViscousListener::GetSolidMesh( _mesh,
allSolids(i), allSolids(i),
/*toCreate=*/true); /*toCreate=*/true);
_sdVec.push_back( _SolidData( allSolids(i), viscHyp, proxyMesh )); _sdVec.push_back( _SolidData( allSolids(i), viscHyp, hypShape, proxyMesh ));
_sdVec.back()._index = getMeshDS()->ShapeToIndex( allSolids(i)); _sdVec.back()._index = getMeshDS()->ShapeToIndex( allSolids(i));
} }
} }
@ -1102,44 +1112,69 @@ bool _ViscousBuilder::findSolidsWithLayers()
bool _ViscousBuilder::findFacesWithLayers() bool _ViscousBuilder::findFacesWithLayers()
{ {
// collect all faces to ignore defined by hyp
vector<TopoDS_Shape> ignoreFaces;
for ( unsigned i = 0; i < _sdVec.size(); ++i )
{
vector<TGeomID> ids = _sdVec[i]._hyp->GetBndShapes();
for ( unsigned i = 0; i < ids.size(); ++i )
{
const TopoDS_Shape& s = getMeshDS()->IndexToShape( ids[i] );
if ( !s.IsNull() && s.ShapeType() == TopAbs_FACE )
{
_ignoreShapeIds.insert( ids[i] );
ignoreFaces.push_back( s );
}
}
}
// ignore internal faces
SMESH_MesherHelper helper( *_mesh ); SMESH_MesherHelper helper( *_mesh );
TopExp_Explorer exp; TopExp_Explorer exp;
for ( unsigned i = 0; i < _sdVec.size(); ++i ) TopTools_IndexedMapOfShape solids;
// collect all faces to ignore defined by hyp
for ( size_t i = 0; i < _sdVec.size(); ++i )
{ {
exp.Init( _sdVec[i]._solid.Oriented( TopAbs_FORWARD ), TopAbs_FACE ); solids.Add( _sdVec[i]._solid );
for ( ; exp.More(); exp.Next() )
vector<TGeomID> ids = _sdVec[i]._hyp->GetBndShapes();
if ( _sdVec[i]._hyp->IsToIgnoreShapes() ) // FACEs to ignore are given
{ {
TGeomID faceInd = getMeshDS()->ShapeToIndex( exp.Current() ); for ( size_t ii = 0; ii < ids.size(); ++ii )
if ( helper.NbAncestors( exp.Current(), *_mesh, TopAbs_SOLID ) > 1 ) {
{ const TopoDS_Shape& s = getMeshDS()->IndexToShape( ids[ii] );
_ignoreShapeIds.insert( faceInd ); if ( !s.IsNull() && s.ShapeType() == TopAbs_FACE )
ignoreFaces.push_back( exp.Current() ); _sdVec[i]._ignoreFaceIds.insert( ids[ii] );
if ( helper.IsReversedSubMesh( TopoDS::Face( exp.Current() ))) }
}
else // FACEs with layers are given
{
exp.Init( _sdVec[i]._solid, TopAbs_FACE );
for ( ; exp.More(); exp.Next() )
{
TGeomID faceInd = getMeshDS()->ShapeToIndex( exp.Current() );
if ( find( ids.begin(), ids.end(), faceInd ) == ids.end() )
_sdVec[i]._ignoreFaceIds.insert( faceInd );
}
}
// ignore internal FACEs if inlets and outlets are specified
{
TopTools_IndexedDataMapOfShapeListOfShape solidsOfFace;
if ( _sdVec[i]._hyp->IsToIgnoreShapes() )
TopExp::MapShapesAndAncestors( _sdVec[i]._hypShape,
TopAbs_FACE, TopAbs_SOLID, solidsOfFace);
exp.Init( _sdVec[i]._solid.Oriented( TopAbs_FORWARD ), TopAbs_FACE );
for ( ; exp.More(); exp.Next() )
{
const TopoDS_Face& face = TopoDS::Face( exp.Current() );
if ( helper.NbAncestors( face, *_mesh, TopAbs_SOLID ) < 2 )
continue;
const TGeomID faceInd = getMeshDS()->ShapeToIndex( face );
if ( _sdVec[i]._hyp->IsToIgnoreShapes() )
{
int nbSolids = solidsOfFace.FindFromKey( face ).Extent();
if ( nbSolids > 1 )
_sdVec[i]._ignoreFaceIds.insert( faceInd );
}
if ( helper.IsReversedSubMesh( face ))
{
_sdVec[i]._reversedFaceIds.insert( faceInd ); _sdVec[i]._reversedFaceIds.insert( faceInd );
}
} }
} }
} }
// Find faces to shrink mesh on (solution 2 in issue 0020832); // Find faces to shrink mesh on (solution 2 in issue 0020832);
TopTools_IndexedMapOfShape shapes; TopTools_IndexedMapOfShape shapes;
for ( unsigned i = 0; i < _sdVec.size(); ++i ) for ( size_t i = 0; i < _sdVec.size(); ++i )
{ {
shapes.Clear(); shapes.Clear();
TopExp::MapShapes(_sdVec[i]._solid, TopAbs_EDGE, shapes); TopExp::MapShapes(_sdVec[i]._solid, TopAbs_EDGE, shapes);
@ -1159,18 +1194,35 @@ bool _ViscousBuilder::findFacesWithLayers()
// check presence of layers on them // check presence of layers on them
int ignore[2]; int ignore[2];
for ( int j = 0; j < 2; ++j ) for ( int j = 0; j < 2; ++j )
ignore[j] = _ignoreShapeIds.count ( getMeshDS()->ShapeToIndex( FF[j] )); ignore[j] = _sdVec[i]._ignoreFaceIds.count ( getMeshDS()->ShapeToIndex( FF[j] ));
if ( ignore[0] == ignore[1] ) continue; // nothing interesting if ( ignore[0] == ignore[1] )
continue; // nothing interesting
TopoDS_Shape fWOL = FF[ ignore[0] ? 0 : 1 ]; TopoDS_Shape fWOL = FF[ ignore[0] ? 0 : 1 ];
// check presence of layers on fWOL within an adjacent SOLID
PShapeIteratorPtr sIt = helper.GetAncestors( fWOL, *_mesh, TopAbs_SOLID );
while ( const TopoDS_Shape* solid = sIt->next() )
if ( !solid->IsSame( _sdVec[i]._solid ))
{
int iSolid = solids.FindIndex( *solid );
int iFace = getMeshDS()->ShapeToIndex( fWOL );
if ( iSolid > 0 && !_sdVec[ iSolid-1 ]._ignoreFaceIds.count( iFace ))
{
_sdVec[i]._noShrinkFaces.insert( iFace );
fWOL.Nullify();
}
}
// add edge to maps // add edge to maps
TGeomID edgeInd = getMeshDS()->ShapeToIndex( edge ); if ( !fWOL.IsNull())
_sdVec[i]._shrinkShape2Shape.insert( make_pair( edgeInd, fWOL )); {
TGeomID edgeInd = getMeshDS()->ShapeToIndex( edge );
_sdVec[i]._shrinkShape2Shape.insert( make_pair( edgeInd, fWOL ));
}
} }
} }
// Exclude from _shrinkShape2Shape FACE's that can't be shrinked since // Exclude from _shrinkShape2Shape FACE's that can't be shrinked since
// the algo of the SOLID sharing the FACE does not support it // the algo of the SOLID sharing the FACE does not support it
set< string > notSupportAlgos; notSupportAlgos.insert("Hexa_3D"); set< string > 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; TopTools_MapOfShape noShrinkVertices;
map< TGeomID, TopoDS_Shape >::iterator e2f = _sdVec[i]._shrinkShape2Shape.begin(); 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 ); SMESH_Algo* algo = _mesh->GetGen()->GetAlgo( *_mesh, *solid );
if ( !algo || !notSupportAlgos.count( algo->GetName() )) continue; if ( !algo || !notSupportAlgos.count( algo->GetName() )) continue;
notShrinkFace = true; 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]._solid.IsSame( *solid ) )
if ( _sdVec[j]._shrinkShape2Shape.count( edgeID )) if ( _sdVec[j]._shrinkShape2Shape.count( edgeID ))
@ -1220,10 +1272,10 @@ bool _ViscousBuilder::findFacesWithLayers()
} }
} }
} }
// Find the SHAPE along which to inflate _LayerEdge based on VERTEX // 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(); shapes.Clear();
TopExp::MapShapes(_sdVec[i]._solid, TopAbs_VERTEX, shapes); TopExp::MapShapes(_sdVec[i]._solid, TopAbs_VERTEX, shapes);
@ -1237,11 +1289,12 @@ bool _ViscousBuilder::findFacesWithLayers()
while ( fIt->more()) while ( fIt->more())
{ {
const TopoDS_Shape* f = fIt->next(); const TopoDS_Shape* f = fIt->next();
const int fID = getMeshDS()->ShapeToIndex( *f );
if ( helper.IsSubShape( *f, _sdVec[i]._solid ) ) if ( helper.IsSubShape( *f, _sdVec[i]._solid ) )
{ {
totalNbFaces++; 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 ); facesWOL.push_back( *f );
} }
} }
@ -1251,42 +1304,42 @@ bool _ViscousBuilder::findFacesWithLayers()
switch ( facesWOL.size() ) switch ( facesWOL.size() )
{ {
case 1: case 1:
{
helper.SetSubShape( facesWOL[0] );
if ( helper.IsRealSeam( vInd )) // inflate along a seam edge?
{ {
helper.SetSubShape( facesWOL[0] ); TopoDS_Shape seamEdge;
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
PShapeIteratorPtr eIt = helper.GetAncestors(vertex, *_mesh, TopAbs_EDGE); PShapeIteratorPtr eIt = helper.GetAncestors(vertex, *_mesh, TopAbs_EDGE);
while ( eIt->more()) while ( eIt->more() && seamEdge.IsNull() )
{ {
const TopoDS_Shape* e = eIt->next(); const TopoDS_Shape* e = eIt->next();
if ( helper.IsSubShape( *e, facesWOL[0]) && if ( helper.IsRealSeam( *e ) )
helper.IsSubShape( *e, facesWOL[1])) seamEdge = *e;
{ }
_sdVec[i]._shrinkShape2Shape.insert( make_pair( vInd, *e )); break; 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: default:
return error("Not yet supported case", _sdVec[i]._index); return error("Not yet supported case", _sdVec[i]._index);
} }
@ -1309,10 +1362,10 @@ bool _ViscousBuilder::makeLayer(_SolidData& data)
subIds = data._noShrinkFaces; subIds = data._noShrinkFaces;
TopExp_Explorer exp( data._solid, TopAbs_FACE ); TopExp_Explorer exp( data._solid, TopAbs_FACE );
for ( ; exp.More(); exp.Next() ) for ( ; exp.More(); exp.Next() )
if ( ! _ignoreShapeIds.count( getMeshDS()->ShapeToIndex( exp.Current() )))
{ {
SMESH_subMesh* fSubM = _mesh->GetSubMesh( 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 = SMESH_subMeshIteratorPtr subIt =
fSubM->getDependsOnIterator(/*includeSelf=*/true, /*complexShapeFirst=*/false); fSubM->getDependsOnIterator(/*includeSelf=*/true, /*complexShapeFirst=*/false);
while ( subIt->more() ) while ( subIt->more() )
@ -1326,7 +1379,7 @@ bool _ViscousBuilder::makeLayer(_SolidData& data)
for (; s2s != data._shrinkShape2Shape.end(); ++s2s ) for (; s2s != data._shrinkShape2Shape.end(); ++s2s )
{ {
TGeomID shapeInd = s2s->first; 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; if ( _sdVec[i]._index == data._index ) continue;
map< TGeomID, TopoDS_Shape >::iterator s2s2 = _sdVec[i]._shrinkShape2Shape.find( shapeInd ); 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 // Set target nodes into _Simplex and _2NearEdges
TNode2Edge::iterator n2e; 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()) if ( data._edges[i]->IsOnEdge())
for ( int j = 0; j < 2; ++j ) for ( int j = 0; j < 2; ++j )
@ -1447,7 +1500,7 @@ bool _ViscousBuilder::makeLayer(_SolidData& data)
data._edges[i]->_2neibors->_edges[j] = n2e->second; data._edges[i]->_2neibors->_edges[j] = n2e->second;
} }
else 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]; _Simplex& s = data._edges[i]->_simplices[j];
s._nNext = data._n2eMap[ s._nNext ]->_nodes.back(); s._nNext = data._n2eMap[ s._nNext ]->_nodes.back();
@ -1531,7 +1584,7 @@ bool _ViscousBuilder::sortEdges( _SolidData& data,
SMESH_MesherHelper helper( *_mesh ); SMESH_MesherHelper helper( *_mesh );
bool ok = true; 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]; vector<_LayerEdge*>& eS = edgesByGeom[iS];
if ( eS.empty() ) continue; if ( eS.empty() ) continue;
@ -1575,7 +1628,7 @@ bool _ViscousBuilder::sortEdges( _SolidData& data,
if ( eE.empty() ) continue; if ( eE.empty() ) continue;
if ( eE[0]->_sWOL.IsNull() ) 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 ); needSmooth = ( eE[i]->_cosin > 0.1 );
} }
else else
@ -1583,7 +1636,7 @@ bool _ViscousBuilder::sortEdges( _SolidData& data,
const TopoDS_Face& F1 = TopoDS::Face( S ); const TopoDS_Face& F1 = TopoDS::Face( S );
const TopoDS_Face& F2 = TopoDS::Face( eE[0]->_sWOL ); const TopoDS_Face& F2 = TopoDS::Face( eE[0]->_sWOL );
const TopoDS_Edge& E = TopoDS::Edge( eExp.Current() ); 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 dir1 = getFaceDir( F1, E, eE[i]->_nodes[0], helper, ok );
gp_Vec dir2 = getFaceDir( F2, 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 // 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]; vector<_LayerEdge*>& eVec = edgesByGeom[iS];
data._edges.insert( data._edges.end(), eVec.begin(), eVec.end() ); data._edges.insert( data._edges.end(), eVec.begin(), eVec.end() );
@ -1799,9 +1852,9 @@ bool _ViscousBuilder::setEdgeData(_LayerEdge& edge,
if ( posType == SMDS_TOP_FACE ) if ( posType == SMDS_TOP_FACE )
{ {
getSimplices( node, edge._simplices, _ignoreShapeIds, &data ); getSimplices( node, edge._simplices, data._ignoreFaceIds, &data );
double avgNormProj = 0, avgLen = 0; 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 ); gp_XYZ vec = edge._pos.back() - SMESH_TNodeXYZ( edge._simplices[i]._nPrev );
avgNormProj += edge._normal * vec; avgNormProj += edge._normal * vec;
@ -1993,7 +2046,7 @@ void _ViscousBuilder::getSimplices( const SMDS_MeshNode* node,
const TGeomID shapeInd = f->getshapeId(); const TGeomID shapeInd = f->getshapeId();
if ( ingnoreShapes.count( shapeInd )) continue; if ( ingnoreShapes.count( shapeInd )) continue;
const int nbNodes = f->NbCornerNodes(); 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* nPrev = f->GetNode( SMESH_MesherHelper::WrapIndex( srcInd-1, nbNodes ));
const SMDS_MeshNode* nNext = 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 )); 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() void _ViscousBuilder::makeGroupOfLE()
{ {
#ifdef _DEBUG_ #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; if ( _sdVec[i]._edges.empty() ) continue;
// string name = SMESH_Comment("_LayerEdge's_") << i; // string name = SMESH_Comment("_LayerEdge's_") << i;
@ -2041,10 +2094,10 @@ void _ViscousBuilder::makeGroupOfLE()
// SMESHDS_Mesh* mDS = _mesh->GetMeshDS(); // SMESHDS_Mesh* mDS = _mesh->GetMeshDS();
dumpFunction( SMESH_Comment("make_LayerEdge_") << i ); 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]; _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([ ") <<le->_nodes[iN-1]->GetID() dumpCmd(SMESH_Comment("mesh.AddEdge([ ") <<le->_nodes[iN-1]->GetID()
<< ", " << le->_nodes[iN]->GetID() <<"])"); << ", " << le->_nodes[iN]->GetID() <<"])");
//gDS->SMDSGroup().Add( mDS->AddEdge( le->_nodes[iN-1], le->_nodes[iN])); //gDS->SMDSGroup().Add( mDS->AddEdge( le->_nodes[iN-1], le->_nodes[iN]));
@ -2052,7 +2105,7 @@ void _ViscousBuilder::makeGroupOfLE()
dumpFunctionEnd(); dumpFunctionEnd();
dumpFunction( SMESH_Comment("makeNormals") << i ); 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]; _LayerEdge& edge = *_sdVec[i]._edges[j];
SMESH_TNodeXYZ nXYZ( edge._nodes[0] ); SMESH_TNodeXYZ nXYZ( edge._nodes[0] );
@ -2106,7 +2159,7 @@ bool _ViscousBuilder::inflate(_SolidData& data)
auto_ptr<SMESH_ElementSearcher> searcher auto_ptr<SMESH_ElementSearcher> searcher
( SMESH_MeshAlgos::GetElementSearcher( *getMeshDS(), ( SMESH_MeshAlgos::GetElementSearcher( *getMeshDS(),
data._proxyMesh->GetFaces( data._solid )) ); 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; if ( data._edges[i]->IsOnEdge() ) continue;
data._edges[i]->FindIntersection( *searcher, intersecDist, data._epsilon ); data._edges[i]->FindIntersection( *searcher, intersecDist, data._epsilon );
@ -2141,7 +2194,7 @@ bool _ViscousBuilder::inflate(_SolidData& data)
// Elongate _LayerEdge's // Elongate _LayerEdge's
dumpFunction(SMESH_Comment("inflate")<<data._index<<"_step"<<nbSteps); // debug dumpFunction(SMESH_Comment("inflate")<<data._index<<"_step"<<nbSteps); // debug
for ( unsigned i = 0; i < data._edges.size(); ++i ) for ( size_t i = 0; i < data._edges.size(); ++i )
{ {
data._edges[i]->SetNewLength( curThick, helper ); data._edges[i]->SetNewLength( curThick, helper );
} }
@ -2157,7 +2210,7 @@ bool _ViscousBuilder::inflate(_SolidData& data)
if ( nbSteps > 0 ) if ( nbSteps > 0 )
{ {
dumpFunction(SMESH_Comment("invalidate")<<data._index<<"_step"<<nbSteps); // debug dumpFunction(SMESH_Comment("invalidate")<<data._index<<"_step"<<nbSteps); // debug
for ( unsigned i = 0; i < data._edges.size(); ++i ) for ( size_t i = 0; i < data._edges.size(); ++i )
{ {
data._edges[i]->InvalidateStep( nbSteps+1 ); data._edges[i]->InvalidateStep( nbSteps+1 );
} }
@ -2169,7 +2222,7 @@ bool _ViscousBuilder::inflate(_SolidData& data)
// Evaluate achieved thickness // Evaluate achieved thickness
avgThick = 0; 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[i]->_len;
avgThick /= data._edges.size(); avgThick /= data._edges.size();
#ifdef __myDEBUG #ifdef __myDEBUG
@ -2217,7 +2270,7 @@ bool _ViscousBuilder::smoothAndCheck(_SolidData& data,
TopoDS_Face F; TopoDS_Face F;
int iBeg, iEnd = 0; 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; iBeg = iEnd;
iEnd = data._endEdgeToSmooth[ iS ]; iEnd = data._endEdgeToSmooth[ iS ];
@ -2283,7 +2336,7 @@ bool _ViscousBuilder::smoothAndCheck(_SolidData& data,
{ {
_LayerEdge* edge = data._edges[i]; _LayerEdge* edge = data._edges[i];
SMESH_TNodeXYZ tgtXYZ( edge->_nodes.back() ); 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 )) if ( !edge->_simplices[j].IsForward( edge->_nodes[0], &tgtXYZ ))
{ {
cout << "Bad simplex ( " << edge->_nodes[0]->GetID()<< " "<< tgtXYZ._node->GetID() cout << "Bad simplex ( " << edge->_nodes[0]->GetID()<< " "<< tgtXYZ._node->GetID()
@ -2312,7 +2365,7 @@ bool _ViscousBuilder::smoothAndCheck(_SolidData& data,
const SMDS_MeshElement* closestFace = 0; const SMDS_MeshElement* closestFace = 0;
int iLE = 0; int iLE = 0;
#endif #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 )) if ( data._edges[i]->FindIntersection( *searcher, dist, data._epsilon, &intFace ))
return false; return false;
@ -2623,7 +2676,7 @@ bool _ViscousBuilder::updateNormals( _SolidData& data,
vector< const SMDS_MeshNode*> nodes(4); // of a tmp mesh face vector< const SMDS_MeshNode*> nodes(4); // of a tmp mesh face
dumpFunction(SMESH_Comment("makeTmpFacesOnEdges")<<data._index); dumpFunction(SMESH_Comment("makeTmpFacesOnEdges")<<data._index);
for ( unsigned i = 0; i < data._edges.size(); ++i ) for ( size_t i = 0; i < data._edges.size(); ++i )
{ {
_LayerEdge* edge = data._edges[i]; _LayerEdge* edge = data._edges[i];
if ( !edge->IsOnEdge() || !edge->_sWOL.IsNull() ) continue; if ( !edge->IsOnEdge() || !edge->_sWOL.IsNull() ) continue;
@ -2640,7 +2693,7 @@ bool _ViscousBuilder::updateNormals( _SolidData& data,
} }
// look for a _LayerEdge containg tgt2 // look for a _LayerEdge containg tgt2
// _LayerEdge* neiborEdge = 0; // _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() ) // while ( !neiborEdge && ++di <= data._edges.size() )
// { // {
// if ( i+di < data._edges.size() && data._edges[i+di]->_nodes.back() == tgt2 ) // if ( i+di < data._edges.size() && data._edges[i+di]->_nodes.back() == tgt2 )
@ -2679,7 +2732,7 @@ bool _ViscousBuilder::updateNormals( _SolidData& data,
TLEdge2LEdgeSet edge2CloseEdge; TLEdge2LEdgeSet edge2CloseEdge;
const double eps = data._epsilon * data._epsilon; 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]; _LayerEdge* edge = data._edges[i];
if ( !edge->IsOnEdge() || !edge->_sWOL.IsNull() ) continue; if ( !edge->IsOnEdge() || !edge->_sWOL.IsNull() ) continue;
@ -2850,7 +2903,7 @@ bool _ViscousBuilder::updateNormals( _SolidData& data,
// 2) Check absence of intersections // 2) Check absence of intersections
// TODO? // TODO?
for ( unsigned i = 0 ; i < tmpFaces.size(); ++i ) for ( size_t i = 0 ; i < tmpFaces.size(); ++i )
delete tmpFaces[i]; delete tmpFaces[i];
return true; return true;
@ -2876,7 +2929,7 @@ bool _LayerEdge::FindIntersection( SMESH_ElementSearcher& searcher,
bool segmentIntersected = false; bool segmentIntersected = false;
distance = Precision::Infinite(); distance = Precision::Infinite();
int iFace = -1; // intersected face 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]; const SMDS_MeshElement* face = suspectFaces[j];
if ( face->GetNodeIndex( _nodes.back() ) >= 0 || if ( face->GetNodeIndex( _nodes.back() ) >= 0 ||
@ -3164,7 +3217,7 @@ bool _LayerEdge::Smooth(int& badNb)
// compute new position for the last _pos // compute new position for the last _pos
gp_XYZ newPos (0,0,0); 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 += SMESH_TNodeXYZ( _simplices[i]._nPrev );
newPos /= _simplices.size(); newPos /= _simplices.size();
@ -3187,11 +3240,11 @@ bool _LayerEdge::Smooth(int& badNb)
// count quality metrics (orientation) of tetras around _tgtNode // count quality metrics (orientation) of tetras around _tgtNode
int nbOkBefore = 0; int nbOkBefore = 0;
SMESH_TNodeXYZ tgtXYZ( _nodes.back() ); 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 ); nbOkBefore += _simplices[i].IsForward( _nodes[0], &tgtXYZ );
int nbOkAfter = 0; 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 ); nbOkAfter += _simplices[i].IsForward( _nodes[0], &newPos );
if ( nbOkAfter < nbOkBefore ) if ( nbOkAfter < nbOkBefore )
@ -3317,14 +3370,14 @@ bool _ViscousBuilder::refine(_SolidData& data)
gp_XY uv; gp_XY uv;
bool isOnEdge; 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]; _LayerEdge& edge = *data._edges[i];
// get accumulated length of segments // get accumulated length of segments
vector< double > segLen( edge._pos.size() ); vector< double > segLen( edge._pos.size() );
segLen[0] = 0.0; 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(); segLen[j] = segLen[j-1] + (edge._pos[j-1] - edge._pos[j] ).Modulus();
// allocate memory for new nodes if it is not yet refined // allocate memory for new nodes if it is not yet refined
@ -3372,8 +3425,8 @@ bool _ViscousBuilder::refine(_SolidData& data)
// create intermediate nodes // create intermediate nodes
double hSum = 0, hi = h0/f; double hSum = 0, hi = h0/f;
unsigned iSeg = 1; size_t iSeg = 1;
for ( unsigned iStep = 1; iStep < edge._nodes.size(); ++iStep ) for ( size_t iStep = 1; iStep < edge._nodes.size(); ++iStep )
{ {
// compute an intermediate position // compute an intermediate position
hi *= f; hi *= f;
@ -3440,7 +3493,7 @@ bool _ViscousBuilder::refine(_SolidData& data)
if ( !getMeshDS()->IsEmbeddedMode() ) if ( !getMeshDS()->IsEmbeddedMode() )
// Log node movement // 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]; _LayerEdge& edge = *data._edges[i];
SMESH_TNodeXYZ p ( edge._nodes.back() ); SMESH_TNodeXYZ p ( edge._nodes.back() );
@ -3454,7 +3507,7 @@ bool _ViscousBuilder::refine(_SolidData& data)
TopExp_Explorer exp( data._solid, TopAbs_FACE ); TopExp_Explorer exp( data._solid, TopAbs_FACE );
for ( ; exp.More(); exp.Next() ) for ( ; exp.More(); exp.Next() )
{ {
if ( _ignoreShapeIds.count( getMeshDS()->ShapeToIndex( exp.Current() ))) if ( data._ignoreFaceIds.count( getMeshDS()->ShapeToIndex( exp.Current() )))
continue; continue;
SMESHDS_SubMesh* fSubM = getMeshDS()->MeshElements( exp.Current() ); SMESHDS_SubMesh* fSubM = getMeshDS()->MeshElements( exp.Current() );
SMDS_ElemIteratorPtr fIt = fSubM->GetElements(); 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 // make map of (ids of FACEs to shrink mesh on) to (_SolidData containing _LayerEdge's
// inflated along FACE or EDGE) // inflated along FACE or EDGE)
map< TGeomID, _SolidData* > f2sdMap; 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]; _SolidData& data = _sdVec[i];
TopTools_MapOfShape FFMap; TopTools_MapOfShape FFMap;
@ -3606,7 +3659,7 @@ bool _ViscousBuilder::shrink()
// Replace source nodes by target nodes in mesh faces to shrink // Replace source nodes by target nodes in mesh faces to shrink
const SMDS_MeshNode* nodes[20]; 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]; _LayerEdge& edge = *lEdges[i];
const SMDS_MeshNode* srcNode = edge._nodes[0]; const SMDS_MeshNode* srcNode = edge._nodes[0];
@ -3635,7 +3688,7 @@ bool _ViscousBuilder::shrink()
{ {
dumpFunction(SMESH_Comment("beforeShrinkFace")<<f2sd->first); // debug dumpFunction(SMESH_Comment("beforeShrinkFace")<<f2sd->first); // debug
const bool sortSimplices = isConcaveFace; 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]; const SMDS_MeshNode* n = smoothNodes[i];
nodesToSmooth[ i ]._node = n; nodesToSmooth[ i ]._node = n;
@ -3652,7 +3705,7 @@ bool _ViscousBuilder::shrink()
// Find EDGE's to shrink // Find EDGE's to shrink
set< _Shrinker1D* > eShri1D; set< _Shrinker1D* > eShri1D;
{ {
for ( unsigned i = 0; i < lEdges.size(); ++i ) for ( size_t i = 0; i < lEdges.size(); ++i )
{ {
_LayerEdge* edge = lEdges[i]; _LayerEdge* edge = lEdges[i];
if ( edge->_sWOL.ShapeType() == TopAbs_EDGE ) if ( edge->_sWOL.ShapeType() == TopAbs_EDGE )
@ -3684,7 +3737,7 @@ bool _ViscousBuilder::shrink()
// ----------------------------------------------- // -----------------------------------------------
dumpFunction(SMESH_Comment("moveBoundaryOnF")<<f2sd->first<<"_st"<<shriStep ); // debug dumpFunction(SMESH_Comment("moveBoundaryOnF")<<f2sd->first<<"_st"<<shriStep ); // debug
shrinked = false; shrinked = false;
for ( unsigned i = 0; i < lEdges.size(); ++i ) for ( size_t i = 0; i < lEdges.size(); ++i )
{ {
shrinked |= lEdges[i]->SetNewLength2d( surface,F,helper ); shrinked |= lEdges[i]->SetNewLength2d( surface,F,helper );
} }
@ -3708,7 +3761,7 @@ bool _ViscousBuilder::shrink()
int oldBadNb = badNb; int oldBadNb = badNb;
badNb = 0; badNb = 0;
moved = false; 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, moved |= nodesToSmooth[i].Smooth( badNb,surface,helper,refSign,
smoothType, /*set3D=*/isConcaveFace); smoothType, /*set3D=*/isConcaveFace);
@ -3737,7 +3790,7 @@ bool _ViscousBuilder::shrink()
for ( int st = /*highQuality ? 10 :*/ 3; st; --st ) for ( int st = /*highQuality ? 10 :*/ 3; st; --st )
{ {
dumpFunction(SMESH_Comment("shrinkFace")<<f2sd->first<<"_st"<<++smooStep); // debug dumpFunction(SMESH_Comment("shrinkFace")<<f2sd->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, nodesToSmooth[i].Smooth( badNb,surface,helper,refSign,
smoothType,/*set3D=*/st==1 ); smoothType,/*set3D=*/st==1 );
@ -3750,7 +3803,7 @@ bool _ViscousBuilder::shrink()
if ( !getMeshDS()->IsEmbeddedMode() ) if ( !getMeshDS()->IsEmbeddedMode() )
// Log node movement // 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 ); SMESH_TNodeXYZ p ( nodesToSmooth[i]._node );
getMeshDS()->MoveNode( nodesToSmooth[i]._node, p.X(), p.Y(), p.Z() ); getMeshDS()->MoveNode( nodesToSmooth[i]._node, p.X(), p.Y(), p.Z() );
@ -3804,7 +3857,7 @@ bool _ViscousBuilder::prepareEdgeToShrink( _LayerEdge& edge,
if ( faceSubMesh->Contains( f )) if ( faceSubMesh->Contains( f ))
faces.push_back( 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(); const int nbNodes = faces[i]->NbCornerNodes();
for ( int j = 0; j < nbNodes; ++j ) 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 kSafe = 0.8;
const double minStepSize = uvLen / 10; const double minStepSize = uvLen / 10;
double stepSize = uvLen; 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 }; const SMDS_MeshNode* nn[2] = { _simplices[i]._nPrev, _simplices[i]._nNext };
for ( int j = 0; j < 2; ++j ) 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 // count quality metrics (orientation) of triangles around the node
int nbOkBefore = 0; int nbOkBefore = 0;
gp_XY tgtUV = helper.GetNodeUV( face, _node ); 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 ); nbOkBefore += _simplices[i].IsForward( tgtUV, _node, face, helper, refSign );
int nbOkAfter = 0; 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 ); nbOkAfter += _simplices[i].IsForward( newPos, _node, face, helper, refSign );
if ( nbOkAfter < nbOkBefore ) if ( nbOkAfter < nbOkBefore )
@ -4341,7 +4394,7 @@ gp_XY _SmoothNode::computeAngularPos(vector<gp_XY>& uv,
_SolidData::~_SolidData() _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 ) if ( _edges[i] && _edges[i]->_2neibors )
delete _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 // remove target node of the _LayerEdge from _nodes
int nbFound = 0; 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 ) if ( !_nodes[i] || _nodes[i] == tgtNode0 || _nodes[i] == tgtNode1 )
_nodes[i] = 0, nbFound++; _nodes[i] = 0, nbFound++;
if ( nbFound == _nodes.size() ) 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() ); l = helper.GetNodeU( E, _edges[1]->_nodes.back(), _nodes.back() );
double totLen = GCPnts_AbscissaPoint::Length( aCurve, f, l ); 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; if ( !_nodes[i] ) continue;
double len = totLen * _normPar[i]; double len = totLen * _normPar[i];
@ -4474,7 +4527,7 @@ void _Shrinker1D::Compute(bool set3D, SMESH_MesherHelper& helper)
if ( _edges[1] ) if ( _edges[1] )
l = helper.GetNodeU( E, _edges[1]->_nodes.back(), _nodes.back() ); 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; if ( !_nodes[i] ) continue;
double u = f * ( 1-_normPar[i] ) + l * _normPar[i]; double u = f * ( 1-_normPar[i] ) + l * _normPar[i];
@ -4493,7 +4546,7 @@ void _Shrinker1D::Compute(bool set3D, SMESH_MesherHelper& helper)
void _Shrinker1D::RestoreParams() void _Shrinker1D::RestoreParams()
{ {
if ( _done ) if ( _done )
for ( unsigned i = 0; i < _nodes.size(); ++i ) for ( size_t i = 0; i < _nodes.size(); ++i )
{ {
if ( !_nodes[i] ) continue; if ( !_nodes[i] ) continue;
SMDS_EdgePosition* pos = static_cast<SMDS_EdgePosition*>( _nodes[i]->GetPosition() ); SMDS_EdgePosition* pos = static_cast<SMDS_EdgePosition*>( _nodes[i]->GetPosition() );
@ -4546,7 +4599,7 @@ bool _ViscousBuilder::addBoundaryElements()
{ {
SMESH_MesherHelper helper( *_mesh ); 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]; _SolidData& data = _sdVec[i];
TopTools_IndexedMapOfShape geomEdges; TopTools_IndexedMapOfShape geomEdges;
@ -4617,7 +4670,7 @@ bool _ViscousBuilder::addBoundaryElements()
{ {
const TopoDS_Shape* pF = fIt->next(); const TopoDS_Shape* pF = fIt->next();
if ( helper.IsSubShape( *pF, data._solid) && if ( helper.IsSubShape( *pF, data._solid) &&
!_ignoreShapeIds.count( e2f->first )) !data._ignoreFaceIds.count( e2f->first ))
F = *pF; F = *pF;
} }
} }
@ -4633,7 +4686,7 @@ bool _ViscousBuilder::addBoundaryElements()
// Make faces // Make faces
const int dj1 = reverse ? 0 : 1; const int dj1 = reverse ? 0 : 1;
const int dj2 = reverse ? 1 : 0; 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*>& nn1 = ledges[j-dj1]->_nodes;
vector< const SMDS_MeshNode*>& nn2 = ledges[j-dj2]->_nodes; vector< const SMDS_MeshNode*>& nn2 = ledges[j-dj2]->_nodes;

View File

@ -721,9 +721,9 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const
h->SetStretchFactor ( params[2].myValue.toDouble() ); h->SetStretchFactor ( params[2].myValue.toDouble() );
if ( StdMeshersGUI_SubShapeSelectorWdg* idsWg = 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" ) else if( hypType()=="ViscousLayers2D" )
@ -1244,7 +1244,19 @@ bool StdMeshersGUI_StdHypothesisCreator::stdParams( ListOfStdParams& p ) const
QString aMainEntry = SMESHGUI_GenericHypothesisCreator::getMainShapeEntry(); QString aMainEntry = SMESHGUI_GenericHypothesisCreator::getMainShapeEntry();
if ( !aMainEntry.isEmpty() ) 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 ); p.append( item );
StdMeshersGUI_SubShapeSelectorWdg* idsWg = StdMeshersGUI_SubShapeSelectorWdg* idsWg =
@ -1252,7 +1264,7 @@ bool StdMeshersGUI_StdHypothesisCreator::stdParams( ListOfStdParams& p ) const
idsWg->SetGeomShapeEntry( aMainEntry ); idsWg->SetGeomShapeEntry( aMainEntry );
idsWg->SetMainShapeEntry( aMainEntry ); idsWg->SetMainShapeEntry( aMainEntry );
idsWg->SetListOfIDs( h->GetIgnoreFaces() ); idsWg->SetListOfIDs( h->GetFaces() );
idsWg->showPreview( true ); idsWg->showPreview( true );
customWidgets()->append ( idsWg ); customWidgets()->append ( idsWg );
} }
@ -1656,12 +1668,15 @@ void StdMeshersGUI_StdHypothesisCreator::valueChanged( QWidget* paramWidget)
toCopyGroups->setEnabled( true ); toCopyGroups->setEnabled( true );
} }
} }
else if ( hypType() == "ViscousLayers2D" && paramWidget->inherits("QButtonGroup")) else if ( hypType().startsWith( "ViscousLayers" ) && paramWidget->inherits("QButtonGroup"))
{ {
if ( QLabel* label = getLabel(4) ) if ( QLabel* label = getLabel(4) )
{ {
bool toIgnore = widget< StdMeshersGUI_RadioButtonsGrpWdg >( 3 )->checkedId(); 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" ));
} }
} }
} }

View File

@ -15,6 +15,18 @@
<source>TO_IGNORE_EDGES</source> <source>TO_IGNORE_EDGES</source>
<translation>Edges without layers (inlets and oulets)</translation> <translation>Edges without layers (inlets and oulets)</translation>
</message> </message>
<message>
<source>TO_IGNORE_FACES_OR_NOT</source>
<translation>Specified faces are</translation>
</message>
<message>
<source>NOT_TO_IGNORE_FACES</source>
<translation>Faces with layers (walls)</translation>
</message>
<message>
<source>TO_IGNORE_FACES</source>
<translation>Faces without layers (inlets and oulets)</translation>
</message>
</context> </context>
<context> <context>
<name>@default</name> <name>@default</name>

View File

@ -78,15 +78,34 @@ StdMeshers_ViscousLayers_i::~StdMeshers_ViscousLayers_i()
*/ */
//================================================================================ //================================================================================
void StdMeshers_ViscousLayers_i::SetIgnoreFaces(const ::SMESH::long_array& faceIDs) void StdMeshers_ViscousLayers_i::SetFaces(const ::SMESH::long_array& faceIDs,
throw ( SALOME::SALOME_Exception ) CORBA::Boolean toIgnore)
throw ( SALOME::SALOME_Exception )
{ {
vector<int> ids( faceIDs.length() ); vector<int> ids( faceIDs.length() );
for ( unsigned i = 0; i < ids.size(); ++i ) for ( unsigned i = 0; i < ids.size(); ++i )
if (( ids[i] = faceIDs[i] ) < 1 ) if (( ids[i] = faceIDs[i] ) < 1 )
THROW_SALOME_CORBA_EXCEPTION( "Invalid face id", SALOME::BAD_PARAM ); 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<int> 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* StdMeshers_ViscousLayers_i::GetIgnoreFaces()
{ {
SMESH::long_array_var ids = new SMESH::long_array;
if ( GetImpl()->IsToIgnoreShapes() ) if ( GetImpl()->IsToIgnoreShapes() )
{ return this->GetFaces();
vector<int> idsVec = GetImpl()->GetBndShapes(); return new SMESH::long_array;
ids->length( idsVec.size() ); }
for ( unsigned i = 0; i < idsVec.size(); ++i )
ids[i] = idsVec[i]; //================================================================================
} /*!
return ids._retn(); * \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<int> 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 << " )";
} }
//================================================================================ //================================================================================

View File

@ -51,6 +51,11 @@ class STDMESHERS_I_EXPORT StdMeshers_ViscousLayers_i:
void SetIgnoreFaces(const ::SMESH::long_array& faceIDs) throw ( SALOME::SALOME_Exception ); void SetIgnoreFaces(const ::SMESH::long_array& faceIDs) throw ( SALOME::SALOME_Exception );
SMESH::long_array* GetIgnoreFaces(); 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 ); void SetTotalThickness(::CORBA::Double thickness) throw ( SALOME::SALOME_Exception );
::CORBA::Double GetTotalThickness(); ::CORBA::Double GetTotalThickness();