X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH%2FSMESH_Mesh.cxx;h=d630792175db9a40c38d1601cbd30248dd95772d;hp=b43a419619be3b80125541453de90b07237f659a;hb=e0f019ccf9e53e6751aa85445acf2cf2831a8c24;hpb=68683b462f8cdd2e24260a31211aadd65a37bea9 diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx index b43a41961..d63079217 100644 --- a/src/SMESH/SMESH_Mesh.cxx +++ b/src/SMESH/SMESH_Mesh.cxx @@ -592,19 +592,9 @@ SMESH_Hypothesis::Hypothesis_Status if ( !subMesh || !subMesh->GetId()) return SMESH_Hypothesis::HYP_BAD_SUBSHAPE; - StudyContextStruct *sc = _gen->GetStudyContext(_studyId); - if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end()) - { - if(MYDEBUG) MESSAGE("Hypothesis ID does not give an hypothesis"); - if(MYDEBUG) { - SCRUTE(_studyId); - SCRUTE(anHypId); - } + SMESH_Hypothesis *anHyp = GetHypothesis( anHypId ); + if ( !anHyp ) throw SALOME_Exception(LOCALIZED("hypothesis does not exist")); - } - - SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId]; - MESSAGE( "SMESH_Mesh::AddHypothesis " << anHyp->GetName() ); bool isGlobalHyp = IsMainShape( aSubShape ); @@ -682,8 +672,7 @@ SMESH_Hypothesis::Hypothesis_Status SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId]; if(MYDEBUG) { - int hypType = anHyp->GetType(); - SCRUTE(hypType); + SCRUTE(anHyp->GetType()); } // shape @@ -813,7 +802,8 @@ const SMESH_Hypothesis * SMESH_Mesh::GetHypothesis(const TopoDS_Shape & aSubS int SMESH_Mesh::GetHypotheses(const TopoDS_Shape & aSubShape, const SMESH_HypoFilter& aFilter, list & aHypList, - const bool andAncestors) const + const bool andAncestors, + list< TopoDS_Shape > * assignedTo/*=0*/) const { set hypTypes; // to exclude same type hypos from the result list int nbHyps = 0; @@ -842,6 +832,7 @@ int SMESH_Mesh::GetHypotheses(const TopoDS_Shape & aSubShape, nbHyps++; if ( !cSMESH_Hyp(*hyp)->IsAuxiliary() ) mainHypFound = true; + if ( assignedTo ) assignedTo->push_back( aSubShape ); } } @@ -868,12 +859,29 @@ int SMESH_Mesh::GetHypotheses(const TopoDS_Shape & aSubShape, nbHyps++; if ( !cSMESH_Hyp(*hyp)->IsAuxiliary() ) mainHypFound = true; + if ( assignedTo ) assignedTo->push_back( curSh ); } } } return nbHyps; } +//================================================================================ +/*! + * \brief Return a hypothesis by its ID + */ +//================================================================================ + +SMESH_Hypothesis * SMESH_Mesh::GetHypothesis(const int anHypId) const +{ + StudyContextStruct *sc = _gen->GetStudyContext(_studyId); + if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end()) + return false; + + SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId]; + return anHyp; +} + //============================================================================= /*! * @@ -918,10 +926,9 @@ SMESH_subMesh *SMESH_Mesh::GetSubMesh(const TopoDS_Shape & aSubShape) if ( it.More() ) { index = _myMeshDS->AddCompoundSubmesh( aSubShape, it.Value().ShapeType() ); - if ( index > _nbSubShapes ) _nbSubShapes = index; // not to create sm for this group again - // fill map of Ancestors - fillAncestorsMap(aSubShape); + while ( _nbSubShapes < index ) + fillAncestorsMap( _myMeshDS->IndexToShape( ++_nbSubShapes )); } } // if ( !index ) @@ -1247,19 +1254,21 @@ void SMESH_Mesh::ExportMED(const char * file, const char* theMeshName, bool theAutoGroups, int theVersion, - const SMESHDS_Mesh* meshPart) + const SMESHDS_Mesh* meshPart, + bool theAutoDimension) throw(SALOME_Exception) { Unexpect aCatch(SalomeException); DriverMED_W_SMESHDS_Mesh myWriter; - myWriter.SetFile ( file, MED::EVersion(theVersion) ); - myWriter.SetMesh ( meshPart ? (SMESHDS_Mesh*) meshPart : _myMeshDS ); + myWriter.SetFile ( file, MED::EVersion(theVersion) ); + myWriter.SetMesh ( meshPart ? (SMESHDS_Mesh*) meshPart : _myMeshDS ); + myWriter.SetAutoDimension( theAutoDimension ); if ( !theMeshName ) - myWriter.SetMeshId ( _id ); + myWriter.SetMeshId ( _id ); else { - myWriter.SetMeshId ( -1 ); - myWriter.SetMeshName( theMeshName ); + myWriter.SetMeshId ( -1 ); + myWriter.SetMeshName ( theMeshName ); } if ( theAutoGroups ) { @@ -1298,6 +1307,12 @@ void SMESH_Mesh::ExportMED(const char * file, myWriter.Perform(); } +//================================================================================ +/*! + * \brief Export the mesh to a SAUV file + */ +//================================================================================ + void SMESH_Mesh::ExportSAUV(const char *file, const char* theMeshName, bool theAutoGroups) @@ -1442,6 +1457,61 @@ void SMESH_Mesh::ExportGMF(const char * file, myWriter.Perform(); } +//================================================================================ +/*! + * \brief Return a ratio of "compute cost" of computed sub-meshes to the whole + * "compute cost". + */ +//================================================================================ + +double SMESH_Mesh::GetComputeProgress() const +{ + double totalCost = 1e-100, computedCost = 0; + const SMESH_subMesh* curSM = _gen->GetCurrentSubMesh(); + + // get cost of already treated sub-meshes + if ( SMESH_subMesh* mainSM = GetSubMeshContaining( 1 )) + { + SMESH_subMeshIteratorPtr smIt = mainSM->getDependsOnIterator(/*includeSelf=*/true); + while ( smIt->more() ) + { + SMESH_subMesh* sm = smIt->next(); + if ( sm->GetComputeState() != SMESH_subMesh::NOT_READY ) + { + const int smCost = sm->GetComputeCost(); + totalCost += smCost; + if ( sm != curSM && + ( !sm->IsEmpty() || + sm->GetComputeState() == SMESH_subMesh::FAILED_TO_COMPUTE )) + { + computedCost += smCost; + } + } + } + } + // get progress of a current algo + if ( curSM ) + if ( SMESH_Algo* algo = curSM->GetAlgo() ) + { + double rate = algo->GetProgress(); + if ( 0. < rate && rate < 1.001 ) + { + //cout << " rate: " << rate << " cost " << algo->GetComputeCost() << endl; + computedCost += rate * algo->GetComputeCost(); + } + else if ( curSM->IsEmpty() ) + { + computedCost += algo->GetProgressByTic() * algo->GetComputeCost(); + } + else + { + computedCost += 0.99 * algo->GetComputeCost(); + } + } + //cout << "Total: " << totalCost << " progress: " << computedCost / totalCost << endl; + return computedCost / totalCost; +} + //================================================================================ /*! * \brief Return number of nodes in the mesh