X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH%2FSMESH_Gen.cxx;h=b7e50f2091b64b0e28f617f55e58b365d33d6d0c;hp=01d864c6f3747157c2a7e939eb07c647f6642727;hb=4ff5bd61540272713e48de1eee75625028c32155;hpb=ed456586bfb1411c5bff73b221658766689a6253 diff --git a/src/SMESH/SMESH_Gen.cxx b/src/SMESH/SMESH_Gen.cxx index 01d864c6f..b7e50f209 100644 --- a/src/SMESH/SMESH_Gen.cxx +++ b/src/SMESH/SMESH_Gen.cxx @@ -28,6 +28,7 @@ #include "SMESH_Gen.hxx" #include "SMESH_subMesh.hxx" +#include "SMESH_HypoFilter.hxx" #include "SMDS_MeshElement.hxx" #include "SMDS_MeshNode.hxx" @@ -101,33 +102,24 @@ SMESH_Gen::~SMESH_Gen() */ //============================================================================= -SMESH_Mesh* SMESH_Gen::CreateMesh(int studyId) -throw(SALOME_Exception) +SMESH_Mesh* SMESH_Gen::CreateMesh(int theStudyId, bool theIsEmbeddedMode) + throw(SALOME_Exception) { - Unexpect aCatch(SalomeException); - MESSAGE("SMESH_Gen::CreateMesh"); -// if (aShape.ShapeType() == TopAbs_COMPOUND) -// { -// INFOS("Mesh Compound not yet implemented!"); -// throw(SALOME_Exception(LOCALIZED("Mesh Compound not yet implemented!"))); -// } + Unexpect aCatch(SalomeException); + MESSAGE("SMESH_Gen::CreateMesh"); - // Get studyContext, create it if it does'nt exist, with a SMESHDS_Document - - StudyContextStruct *myStudyContext = GetStudyContext(studyId); - - // create a new SMESH_mesh object + // Get studyContext, create it if it does'nt exist, with a SMESHDS_Document + StudyContextStruct *aStudyContext = GetStudyContext(theStudyId); - SMESH_Mesh *mesh = new SMESH_Mesh(_localId++, - studyId, - this, - myStudyContext->myDocument); - myStudyContext->mapMesh[_localId] = mesh; + // create a new SMESH_mesh object + SMESH_Mesh *aMesh = new SMESH_Mesh(_localId++, + theStudyId, + this, + theIsEmbeddedMode, + aStudyContext->myDocument); + aStudyContext->mapMesh[_localId] = aMesh; - // associate a TopoDS_Shape to the mesh - -//mesh->ShapeToMesh(aShape); - return mesh; + return aMesh; } //============================================================================= @@ -166,6 +158,9 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape) SMESH_subMesh *sm = aMesh.GetSubMesh(aShape); + if ( sm->GetComputeState() == SMESH_subMesh::COMPUTE_OK ) + return true; // already computed + // ----------------------------------------------------------------- // apply algos that do not require descretized boundaries, starting // from the most complex shapes @@ -255,7 +250,8 @@ static bool checkConformIgnoredAlgos(SMESH_Mesh& aMesh, const SMESH_Algo* aGlobIgnoAlgo, const SMESH_Algo* aLocIgnoAlgo, bool & checkConform, - map& aCheckedMap) + map& aCheckedMap, + list< SMESH_Gen::TAlgoStateError > & theErrors) { ASSERT( aSubMesh ); if ( aSubMesh->GetSubShape().ShapeType() == TopAbs_VERTEX) @@ -304,16 +300,18 @@ static bool checkConformIgnoredAlgos(SMESH_Mesh& aMesh, INFOS( "ERROR: Local <" << algo->GetName() << "> would produce not conform mesh: " " hypotesis is missing"); + theErrors.push_back( SMESH_Gen::TAlgoStateError() ); + theErrors.back().Set( SMESH_Gen::NOT_CONFORM_MESH, algo, false ); } // sub-algos will be hidden by a local const map& smMap = aSubMesh->DependsOn(); map::const_reverse_iterator revItSub; bool checkConform2 = false; - for ( revItSub = smMap.rbegin(); revItSub != smMap.rend(); revItSub++) + for ( revItSub = smMap.rbegin(); revItSub != smMap.rend(); revItSub++) { checkConformIgnoredAlgos (aMesh, (*revItSub).second, aGlobIgnoAlgo, - algo, checkConform2, aCheckedMap); + algo, checkConform2, aCheckedMap, theErrors); int key = (*revItSub).first; SMESH_subMesh* sm = (*revItSub).second; if ( aCheckedMap.find( key ) == aCheckedMap.end() ) @@ -340,7 +338,8 @@ static bool checkMissing(SMESH_Gen* aGen, const int aTopAlgoDim, bool* globalChecked, const bool checkNoAlgo, - map& aCheckedMap) + map& aCheckedMap, + list< SMESH_Gen::TAlgoStateError > & theErrors) { if ( aSubMesh->GetSubShape().ShapeType() == TopAbs_VERTEX) return true; @@ -361,6 +360,8 @@ static bool checkMissing(SMESH_Gen* aGen, { INFOS( "ERROR: " << shapeDim << "D algorithm is missing" ); ret = false; + theErrors.push_back( SMESH_Gen::TAlgoStateError() ); + theErrors.back().Set( SMESH_Gen::MISSING_ALGO, shapeDim, true ); } } return ret; @@ -369,13 +370,15 @@ static bool checkMissing(SMESH_Gen* aGen, // notify if an algo missing hyp is attached to aSubMesh algo = aGen->GetAlgo( aMesh, aSubMesh->GetSubShape() ); ASSERT( algo ); - bool isGlobalAlgo = aGen->IsGlobalAlgo( algo, aMesh ); - if (!isGlobalAlgo || !globalChecked[ algo->GetDim() ]) + bool IsGlobalHypothesis = aGen->IsGlobalHypothesis( algo, aMesh ); + if (!IsGlobalHypothesis || !globalChecked[ algo->GetDim() ]) { - INFOS( "ERROR: " << (isGlobalAlgo ? "Global " : "Local ") + INFOS( "ERROR: " << (IsGlobalHypothesis ? "Global " : "Local ") << "<" << algo->GetName() << "> misses some hypothesis"); - if (isGlobalAlgo) + if (IsGlobalHypothesis) globalChecked[ algo->GetDim() ] = true; + theErrors.push_back( SMESH_Gen::TAlgoStateError() ); + theErrors.back().Set( SMESH_Gen::MISSING_HYPO, algo, IsGlobalHypothesis ); } ret = false; break; @@ -391,7 +394,7 @@ static bool checkMissing(SMESH_Gen* aGen, // re-start checking NO_ALGO state ASSERT (algo); bool isTopLocalAlgo = - ( aTopAlgoDim <= algo->GetDim() && !aGen->IsGlobalAlgo( algo, aMesh )); + ( aTopAlgoDim <= algo->GetDim() && !aGen->IsGlobalHypothesis( algo, aMesh )); if (!algo->NeedDescretBoundary() || isTopLocalAlgo) { bool checkNoAlgo2 = ( algo->NeedDescretBoundary() ); @@ -410,7 +413,7 @@ static bool checkMissing(SMESH_Gen* aGen, //check algo on sub-meshes int aTopAlgoDim2 = algo->GetDim(); if (!checkMissing (aGen, aMesh, sm, aTopAlgoDim2, - globalChecked, checkNoAlgo2, aCheckedMap)) + globalChecked, checkNoAlgo2, aCheckedMap, theErrors)) { ret = false; if (sm->GetAlgoState() == SMESH_subMesh::NO_ALGO ) @@ -429,14 +432,29 @@ static bool checkMissing(SMESH_Gen* aGen, //======================================================================= bool SMESH_Gen::CheckAlgoState(SMESH_Mesh& aMesh, const TopoDS_Shape& aShape) +{ + list< TAlgoStateError > errors; + return GetAlgoState( aMesh, aShape, errors ); +} + +//======================================================================= +//function : GetAlgoState +//purpose : notify on bad state of attached algos, return false +// if Compute() would fail because of some algo bad state +// theErrors list contains problems description +//======================================================================= + +bool SMESH_Gen::GetAlgoState(SMESH_Mesh& theMesh, + const TopoDS_Shape& theShape, + list< TAlgoStateError > & theErrors) { //MESSAGE("SMESH_Gen::CheckAlgoState"); bool ret = true; bool hasAlgo = false; - SMESH_subMesh* sm = aMesh.GetSubMesh(aShape); - const SMESHDS_Mesh* meshDS = aMesh.GetMeshDS(); + SMESH_subMesh* sm = theMesh.GetSubMesh(theShape); + const SMESHDS_Mesh* meshDS = theMesh.GetMeshDS(); TopoDS_Shape mainShape = meshDS->ShapeToMesh(); // ----------------- @@ -485,19 +503,19 @@ bool SMESH_Gen::CheckAlgoState(SMESH_Mesh& aMesh, const TopoDS_Shape& aShape) const map& smMap = sm->DependsOn(); map::const_reverse_iterator revItSub = smMap.rbegin(); map aCheckedMap; - bool checkConform = ( !aMesh.IsNotConformAllowed() ); + bool checkConform = ( !theMesh.IsNotConformAllowed() ); int aKey = 1; SMESH_subMesh* smToCheck = sm; - // loop on aShape and its sub-shapes + // loop on theShape and its sub-shapes while ( smToCheck ) { if ( smToCheck->GetSubShape().ShapeType() == TopAbs_VERTEX) break; if ( aCheckedMap.find( aKey ) == aCheckedMap.end() ) - if (!checkConformIgnoredAlgos (aMesh, smToCheck, aGlobIgnoAlgo, - 0, checkConform, aCheckedMap)) + if (!checkConformIgnoredAlgos (theMesh, smToCheck, aGlobIgnoAlgo, + 0, checkConform, aCheckedMap, theErrors)) ret = false; if ( smToCheck->GetAlgoState() != SMESH_subMesh::NO_ALGO ) @@ -540,15 +558,15 @@ bool SMESH_Gen::CheckAlgoState(SMESH_Mesh& aMesh, const TopoDS_Shape& aShape) bool checkNoAlgo = (bool) aTopAlgoDim; bool globalChecked[] = { false, false, false, false }; - // loop on aShape and its sub-shapes + // loop on theShape and its sub-shapes while ( smToCheck ) { if ( smToCheck->GetSubShape().ShapeType() == TopAbs_VERTEX) break; if ( aCheckedMap.find( aKey ) == aCheckedMap.end() ) - if (!checkMissing (this, aMesh, smToCheck, aTopAlgoDim, - globalChecked, checkNoAlgo, aCheckedMap)) + if (!checkMissing (this, theMesh, smToCheck, aTopAlgoDim, + globalChecked, checkNoAlgo, aCheckedMap, theErrors)) { ret = false; if (smToCheck->GetAlgoState() == SMESH_subMesh::NO_ALGO ) @@ -566,62 +584,25 @@ bool SMESH_Gen::CheckAlgoState(SMESH_Mesh& aMesh, const TopoDS_Shape& aShape) smToCheck = 0; } - if ( !hasAlgo ) + if ( !hasAlgo ) { + ret = false; INFOS( "None algorithm attached" ); + theErrors.push_back( TAlgoStateError() ); + theErrors.back().Set( MISSING_ALGO, 1, true ); + } - return ( ret && hasAlgo ); + return ret; } //======================================================================= -//function : IsGlobalAlgo +//function : IsGlobalHypothesis //purpose : check if theAlgo is attached to the main shape //======================================================================= -bool SMESH_Gen::IsGlobalAlgo(const SMESH_Algo* theAlgo, SMESH_Mesh& aMesh) -{ - const SMESHDS_Mesh* meshDS = aMesh.GetMeshDS(); - TopoDS_Shape mainShape = meshDS->ShapeToMesh(); - const list& listHyp = meshDS->GetHypothesis( mainShape ); - list::const_iterator it=listHyp.begin(); - for ( ; it != listHyp.end(); it++) - if ( *it == theAlgo ) - return true; - - return false; -} - - -//======================================================================= -//function : getAlgoId -//purpose : return algo ID or -1 if not found -//======================================================================= - -static int getAlgo(const list& theHypList, - const int theAlgoDim, - const int theAlgoShapeType) +bool SMESH_Gen::IsGlobalHypothesis(const SMESH_Hypothesis* theHyp, SMESH_Mesh& aMesh) { - list::const_iterator it = theHypList.begin(); - - int nb_algo = 0; - int algo_id = -1; - - while (it!=theHypList.end()) - { - const SMESH_Hypothesis *anHyp = static_cast< const SMESH_Hypothesis *>( *it ); - if (anHyp->GetType() > SMESHDS_Hypothesis::PARAM_ALGO && - anHyp->GetDim() == theAlgoDim && - ((anHyp->GetShapeType()) & (1 << theAlgoShapeType))) - { - nb_algo++; - algo_id = anHyp->GetID(); - break; - } - - //if (nb_algo > 1) return -1; // more than one algo - it++; - } - - return algo_id; + SMESH_HypoFilter filter( SMESH_HypoFilter::Is( theHyp )); + return aMesh.GetHypothesis( aMesh.GetMeshDS()->ShapeToMesh(), filter, false ); } //============================================================================= @@ -634,111 +615,25 @@ SMESH_Algo *SMESH_Gen::GetAlgo(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape) { // MESSAGE("SMESH_Gen::GetAlgo"); - const SMESHDS_Mesh * meshDS = aMesh.GetMeshDS(); - int dim = GetShapeDim( aShape ); - int shape_type = aShape.ShapeType(); - int algo_id = -1; + SMESH_HypoFilter filter( SMESH_HypoFilter::IsAlgo() ); + filter.And( filter.IsApplicableTo( aShape )); - algo_id = getAlgo( meshDS->GetHypothesis( aShape ), dim, shape_type ); + list algoList; + aMesh.GetHypotheses( aShape, filter, algoList, true ); - if (algo_id < 0) - { - // try ansestors - TopTools_ListIteratorOfListOfShape ancIt( aMesh.GetAncestors( aShape )); - for (; ancIt.More(); ancIt.Next()) - { - const TopoDS_Shape& ancestor = ancIt.Value(); - algo_id = getAlgo( meshDS->GetHypothesis( ancestor ), dim, shape_type ); - if ( algo_id >= 0 ) - break; - } - if (algo_id < 0) return NULL; - } + if ( algoList.empty() ) + return NULL; - ASSERT(_mapAlgo.find(algo_id) != _mapAlgo.end()); - - return _mapAlgo[algo_id]; - -// const SMESHDS_Hypothesis *theHyp = NULL; -// SMESH_Algo *algo = NULL; -// const SMESHDS_Mesh * meshDS = aMesh.GetMeshDS(); -// int hypType; -// int hypId; -// int algoDim; - -// // try shape first, then main shape - -// TopoDS_Shape mainShape = meshDS->ShapeToMesh(); -// const TopoDS_Shape *shapeToTry[2] = { &aShape, &mainShape }; - -// for (int iShape = 0; iShape < 2; iShape++) -// { -// TopoDS_Shape tryShape = (*shapeToTry[iShape]); - -// const list& listHyp = -// meshDS->GetHypothesis(tryShape); -// list::const_iterator it=listHyp.begin(); - -// int nb_algo = 0; -// int shapeDim = GetShapeDim(aShape); -// int typeOfShape = aShape.ShapeType(); - -// while (it!=listHyp.end()) -// { -// const SMESHDS_Hypothesis *anHyp = *it; -// hypType = anHyp->GetType(); -// //SCRUTE(hypType); -// if (hypType > SMESHDS_Hypothesis::PARAM_ALGO) -// { -// switch (hypType) -// { -// case SMESHDS_Hypothesis::ALGO_1D: -// algoDim = 1; -// break; -// case SMESHDS_Hypothesis::ALGO_2D: -// algoDim = 2; -// break; -// case SMESHDS_Hypothesis::ALGO_3D: -// algoDim = 3; -// break; -// default: -// algoDim = 0; -// break; -// } -// //SCRUTE(algoDim); -// //SCRUTE(shapeDim); -// //SCRUTE(typeOfShape); -// if (shapeDim == algoDim) // count only algos of shape dim. -// { // discard algos for subshapes -// hypId = anHyp->GetID(); // (of lower dim.) -// ASSERT(_mapAlgo.find(hypId) != _mapAlgo.end()); -// SMESH_Algo *anAlgo = _mapAlgo[hypId]; -// //SCRUTE(anAlgo->GetShapeType()); -// //if (anAlgo->GetShapeType() == typeOfShape) -// if ((anAlgo->GetShapeType()) & (1 << typeOfShape)) -// { // only specific TopoDS_Shape -// nb_algo++; -// theHyp = anHyp; -// } -// } -// } -// if (nb_algo > 1) return NULL; // more than one algo -// it++; -// } -// if (nb_algo == 1) // one algo found : OK -// break; // do not try a parent shape -// } - -// if (!theHyp) -// return NULL; // no algo found - -// hypType = theHyp->GetType(); -// hypId = theHyp->GetID(); - -// ASSERT(_mapAlgo.find(hypId) != _mapAlgo.end()); -// algo = _mapAlgo[hypId]; -// //MESSAGE("Algo found " << algo->GetName() << " Id " << hypId); -// return algo; + // Now it is checked in SMESH_Mesh::GetHypotheses() +// if (algoList.size() > 1 ) { // check if there is one algo several times +// list ::iterator algo = algoList.begin(); +// for ( ; algo != algoList.end(); ++algo ) +// if ( (*algo) != algoList.front() && +// (*algo)->GetName() != algoList.front()->GetName() ) +// return NULL; +// } + + return const_cast ( static_cast( algoList.front() )); } //============================================================================= @@ -799,37 +694,20 @@ void SMESH_Gen::Close(int studyId) int SMESH_Gen::GetShapeDim(const TopAbs_ShapeEnum & aShapeType) { - int shapeDim = -1; // Shape dimension: 0D, 1D, 2D, 3D - int type = aShapeType;//.ShapeType(); - switch (type) - { - case TopAbs_COMPOUND: - case TopAbs_COMPSOLID: - case TopAbs_SOLID: - case TopAbs_SHELL: - { - shapeDim = 3; - break; - } - // case TopAbs_SHELL: - case TopAbs_FACE: - { - shapeDim = 2; - break; - } - case TopAbs_WIRE: - case TopAbs_EDGE: - { - shapeDim = 1; - break; - } - case TopAbs_VERTEX: - { - shapeDim = 0; - break; - } - } - return shapeDim; + static vector dim; + if ( dim.empty() ) + { + dim.resize( TopAbs_SHAPE, -1 ); + dim[ TopAbs_COMPOUND ] = 3; + dim[ TopAbs_COMPSOLID ] = 3; + dim[ TopAbs_SOLID ] = 3; + dim[ TopAbs_SHELL ] = 3; + dim[ TopAbs_FACE ] = 2; + dim[ TopAbs_WIRE ] = 1; + dim[ TopAbs_EDGE ] = 1; + dim[ TopAbs_VERTEX ] = 0; + } + return dim[ aShapeType ]; } //=============================================================================