Salome HOME
projects
/
modules
/
smesh.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
54122: Bad quality prismatic mesh
[modules/smesh.git]
/
src
/
SMESH
/
SMESH_Gen.cxx
diff --git
a/src/SMESH/SMESH_Gen.cxx
b/src/SMESH/SMESH_Gen.cxx
index 8fadef162a25872a02eecbf736d6c2c076b0ccc7..bd5654c89588eb1bd05ddde3ae963e978e7cd8eb 100644
(file)
--- a/
src/SMESH/SMESH_Gen.cxx
+++ b/
src/SMESH/SMESH_Gen.cxx
@@
-1,4
+1,4
@@
-// Copyright (C) 2007-201
5
CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-201
6
CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@
-35,6
+35,7
@@
#include "SMDS_MeshNode.hxx"
#include "SMESHDS_Document.hxx"
#include "SMESH_HypoFilter.hxx"
#include "SMDS_MeshNode.hxx"
#include "SMESHDS_Document.hxx"
#include "SMESH_HypoFilter.hxx"
+#include "SMESH_Mesh.hxx"
#include "SMESH_MesherHelper.hxx"
#include "SMESH_subMesh.hxx"
#include "SMESH_MesherHelper.hxx"
#include "SMESH_subMesh.hxx"
@@
-64,16
+65,27
@@
using namespace std;
SMESH_Gen::SMESH_Gen()
{
SMESH_Gen::SMESH_Gen()
{
- MESSAGE("SMESH_Gen::SMESH_Gen");
_localId = 0;
_hypId = 0;
_segmentation = _nbSegments = 10;
SMDS_Mesh::_meshList.clear();
_localId = 0;
_hypId = 0;
_segmentation = _nbSegments = 10;
SMDS_Mesh::_meshList.clear();
- MESSAGE(SMDS_Mesh::_meshList.size());
_compute_canceled = false;
//vtkDebugLeaks::SetExitError(0);
}
_compute_canceled = false;
//vtkDebugLeaks::SetExitError(0);
}
+namespace
+{
+ // a structure used to nullify SMESH_Gen field of SMESH_Hypothesis,
+ // which is needed for SMESH_Hypothesis not deleted before ~SMESH_Gen()
+ struct _Hyp : public SMESH_Hypothesis
+ {
+ void NullifyGen()
+ {
+ _gen = 0;
+ }
+ };
+}
+
//=============================================================================
/*!
* Destructor
//=============================================================================
/*!
* Destructor
@@
-82,13
+94,19
@@
SMESH_Gen::SMESH_Gen()
SMESH_Gen::~SMESH_Gen()
{
SMESH_Gen::~SMESH_Gen()
{
- MESSAGE("SMESH_Gen::~SMESH_Gen");
std::map < int, StudyContextStruct * >::iterator i_sc = _mapStudyContext.begin();
for ( ; i_sc != _mapStudyContext.end(); ++i_sc )
{
std::map < int, StudyContextStruct * >::iterator i_sc = _mapStudyContext.begin();
for ( ; i_sc != _mapStudyContext.end(); ++i_sc )
{
- delete i_sc->second->myDocument;
- delete i_sc->second;
- }
+ StudyContextStruct* context = i_sc->second;
+ std::map < int, SMESH_Hypothesis * >::iterator i_hyp = context->mapHypothesis.begin();
+ for ( ; i_hyp != context->mapHypothesis.end(); ++i_hyp )
+ {
+ if ( _Hyp* h = static_cast< _Hyp*>( i_hyp->second ))
+ h->NullifyGen();
+ }
+ delete context->myDocument;
+ delete context;
+ }
}
//=============================================================================
}
//=============================================================================
@@
-102,7
+120,6
@@
SMESH_Mesh* SMESH_Gen::CreateMesh(int theStudyId, bool theIsEmbeddedMode)
throw(SALOME_Exception)
{
Unexpect aCatch(SalomeException);
throw(SALOME_Exception)
{
Unexpect aCatch(SalomeException);
- MESSAGE("SMESH_Gen::CreateMesh");
// Get studyContext, create it if it does'nt exist, with a SMESHDS_Document
StudyContextStruct *aStudyContext = GetStudyContext(theStudyId);
// Get studyContext, create it if it does'nt exist, with a SMESHDS_Document
StudyContextStruct *aStudyContext = GetStudyContext(theStudyId);
@@
-126,14
+143,16
@@
SMESH_Mesh* SMESH_Gen::CreateMesh(int theStudyId, bool theIsEmbeddedMode)
bool SMESH_Gen::Compute(SMESH_Mesh & aMesh,
const TopoDS_Shape & aShape,
bool SMESH_Gen::Compute(SMESH_Mesh & aMesh,
const TopoDS_Shape & aShape,
- const bool aShapeOnly /*=false*/,
- const bool anUpward /*=false*/,
+ const int aFlags /*= COMPACT_MESH*/,
const ::MeshDimension aDim /*=::MeshDim_3D*/,
TSetOfInt* aShapesId /*=0*/)
{
const ::MeshDimension aDim /*=::MeshDim_3D*/,
TSetOfInt* aShapesId /*=0*/)
{
- MESSAGE("SMESH_Gen::Compute");
MEMOSTAT;
MEMOSTAT;
+ const bool aShapeOnly = aFlags & SHAPE_ONLY;
+ const bool anUpward = aFlags & UPWARD;
+ const bool aCompactMesh = aFlags & COMPACT_MESH;
+
bool ret = true;
SMESH_subMesh *sm = aMesh.GetSubMesh(aShape);
bool ret = true;
SMESH_subMesh *sm = aMesh.GetSubMesh(aShape);
@@
-145,10
+164,12
@@
bool SMESH_Gen::Compute(SMESH_Mesh & aMesh,
SMESH_subMeshIteratorPtr smIt;
// Fix of Issue 22150. Due to !BLSURF->OnlyUnaryInput(), BLSURF computes edges
SMESH_subMeshIteratorPtr smIt;
// Fix of Issue 22150. Due to !BLSURF->OnlyUnaryInput(), BLSURF computes edges
- // that must be computed by Projection 1D-2D wh
en
Projection asks to compute
+ // that must be computed by Projection 1D-2D wh
ile the
Projection asks to compute
// one face only.
SMESH_subMesh::compute_event computeEvent =
aShapeOnly ? SMESH_subMesh::COMPUTE_SUBMESH : SMESH_subMesh::COMPUTE;
// one face only.
SMESH_subMesh::compute_event computeEvent =
aShapeOnly ? SMESH_subMesh::COMPUTE_SUBMESH : SMESH_subMesh::COMPUTE;
+ if ( !aMesh.HasShapeToMesh() )
+ computeEvent = SMESH_subMesh::COMPUTE_NOGEOM; // if several algos and no geometry
if ( anUpward ) // is called from the below code in this method
{
if ( anUpward ) // is called from the below code in this method
{
@@
-335,7
+356,8
@@
bool SMESH_Gen::Compute(SMESH_Mesh & aMesh,
SMESH_Hypothesis::Hypothesis_Status status;
if ( subAlgo->CheckHypothesis( aMesh, aSubShape, status ))
// mesh a lower smToCompute starting from vertices
SMESH_Hypothesis::Hypothesis_Status status;
if ( subAlgo->CheckHypothesis( aMesh, aSubShape, status ))
// mesh a lower smToCompute starting from vertices
- Compute( aMesh, aSubShape, aShapeOnly, /*anUpward=*/true, aDim, aShapesId );
+ Compute( aMesh, aSubShape, aFlags | SHAPE_ONLY_UPWARD, aDim, aShapesId );
+ // Compute( aMesh, aSubShape, aShapeOnly, /*anUpward=*/true, aDim, aShapesId );
}
}
}
}
}
}
@@
-366,18
+388,14
@@
bool SMESH_Gen::Compute(SMESH_Mesh & aMesh,
// -----------------------------------------------
// mesh the rest sub-shapes starting from vertices
// -----------------------------------------------
// -----------------------------------------------
// mesh the rest sub-shapes starting from vertices
// -----------------------------------------------
- ret = Compute( aMesh, aShape, a
ShapeOnly, /*anUpward=*/true
, aDim, aShapesId );
+ ret = Compute( aMesh, aShape, a
Flags | UPWARD
, aDim, aShapesId );
}
}
- MESSAGE( "VSR - SMESH_Gen::Compute() finished, OK = " << ret);
MEMOSTAT;
MEMOSTAT;
- SMESHDS_Mesh *myMesh = aMesh.GetMeshDS();
- MESSAGE("*** compactMesh after compute");
- myMesh->compactMesh();
-
// fix quadratic mesh by bending iternal links near concave boundary
// fix quadratic mesh by bending iternal links near concave boundary
- if ( aShape.IsSame( aMesh.GetShapeToMesh() ) &&
+ if ( aCompactMesh && // a final compute
+ aShape.IsSame( aMesh.GetShapeToMesh() ) &&
!aShapesId && // not preview
ret ) // everything is OK
{
!aShapesId && // not preview
ret ) // everything is OK
{
@@
-387,6
+405,10
@@
bool SMESH_Gen::Compute(SMESH_Mesh & aMesh,
aHelper.FixQuadraticElements( sm->GetComputeError() );
}
}
aHelper.FixQuadraticElements( sm->GetComputeError() );
}
}
+
+ if ( aCompactMesh )
+ aMesh.GetMeshDS()->compactMesh();
+
return ret;
}
return ret;
}
@@
-441,7
+463,8
@@
void SMESH_Gen::setCurrentSubMesh(SMESH_subMesh* sm)
{
if ( sm )
_sm_current.push_back( sm );
{
if ( sm )
_sm_current.push_back( sm );
- else
+
+ else if ( !_sm_current.empty() )
_sm_current.pop_back();
}
_sm_current.pop_back();
}
@@
-462,8
+485,6
@@
bool SMESH_Gen::Evaluate(SMESH_Mesh & aMesh,
const bool anUpward,
TSetOfInt* aShapesId)
{
const bool anUpward,
TSetOfInt* aShapesId)
{
- MESSAGE("SMESH_Gen::Evaluate");
-
bool ret = true;
SMESH_subMesh *sm = aMesh.GetSubMesh(aShape);
bool ret = true;
SMESH_subMesh *sm = aMesh.GetSubMesh(aShape);
@@
-585,7
+606,6
@@
bool SMESH_Gen::Evaluate(SMESH_Mesh & aMesh,
ret = Evaluate( aMesh, aShape, aResMap, /*anUpward=*/true, aShapesId );
}
ret = Evaluate( aMesh, aShape, aResMap, /*anUpward=*/true, aShapesId );
}
- MESSAGE( "VSR - SMESH_Gen::Evaluate() finished, OK = " << ret);
return ret;
}
return ret;
}
@@
-706,8
+726,6
@@
static bool checkMissing(SMESH_Gen* aGen,
if ( aCheckedMap.count( aSubMesh ))
return true;
if ( aCheckedMap.count( aSubMesh ))
return true;
- //MESSAGE("=====checkMissing");
-
int ret = true;
SMESH_Algo* algo = 0;
int ret = true;
SMESH_Algo* algo = 0;
@@
-828,8
+846,6
@@
bool SMESH_Gen::GetAlgoState(SMESH_Mesh& theMesh,
const TopoDS_Shape& theShape,
list< TAlgoStateError > & theErrors)
{
const TopoDS_Shape& theShape,
list< TAlgoStateError > & theErrors)
{
- //MESSAGE("SMESH_Gen::CheckAlgoState");
-
bool ret = true;
bool hasAlgo = false;
bool ret = true;
bool hasAlgo = false;
@@
-907,8
+923,6
@@
bool SMESH_Gen::GetAlgoState(SMESH_Mesh& theMesh,
// well defined
// ----------------------------------------------------------------
// well defined
// ----------------------------------------------------------------
- //MESSAGE( "---info on missing hypothesis and find out if all needed algos are");
-
// find max dim of global algo
int aTopAlgoDim = 0;
for (dim = 3; dim > 0; dim--)
// find max dim of global algo
int aTopAlgoDim = 0;
for (dim = 3; dim > 0; dim--)
@@
-943,7
+957,7
@@
bool SMESH_Gen::GetAlgoState(SMESH_Mesh& theMesh,
if ( !hasAlgo ) {
ret = false;
theErrors.push_back( TAlgoStateError() );
if ( !hasAlgo ) {
ret = false;
theErrors.push_back( TAlgoStateError() );
- theErrors.back().Set( SMESH_Hypothesis::HYP_MISSING,
1
, true );
+ theErrors.back().Set( SMESH_Hypothesis::HYP_MISSING,
theMesh.HasShapeToMesh() ? 1 : 3
, true );
}
return ret;
}
return ret;
@@
-1065,7
+1079,8
@@
SMESH_Algo *SMESH_Gen::GetAlgo(SMESH_subMesh * aSubMesh,
SMESH_Mesh& aMesh = *aSubMesh->GetFather();
SMESH_HypoFilter filter( SMESH_HypoFilter::IsAlgo() );
SMESH_Mesh& aMesh = *aSubMesh->GetFather();
SMESH_HypoFilter filter( SMESH_HypoFilter::IsAlgo() );
- filter.And( filter.IsApplicableTo( aShape ));
+ if ( aMesh.HasShapeToMesh() )
+ filter.And( filter.IsApplicableTo( aShape ));
typedef SMESH_Algo::Features AlgoData;
typedef SMESH_Algo::Features AlgoData;
@@
-1173,7
+1188,7
@@
int SMESH_Gen::GetShapeDim(const TopAbs_ShapeEnum & aShapeType)
//=============================================================================
/*!
//=============================================================================
/*!
- * Genarate a new id unique within
g
this Gen
+ * Genarate a new id unique within this Gen
*/
//=============================================================================
*/
//=============================================================================