X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESH%2FSMESH_Mesh.cxx;h=3f16ab7dd58be1869e0428e07ca8e675e4cb8a9b;hp=0e2b961ea89b5ee73dc2a7ee317a325e99f55595;hb=49ff23c94f469a0bd9de9981fb709eef8a8c4417;hpb=04f997252152407f9180e03f0af428ab2ca6f4be diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx index 0e2b961ea..3f16ab7dd 100644 --- a/src/SMESH/SMESH_Mesh.cxx +++ b/src/SMESH/SMESH_Mesh.cxx @@ -106,7 +106,6 @@ class SMESH_Mesh::SubMeshHolder : public SMESHDS_TSubMeshHolder< SMESH_subMesh > //============================================================================= SMESH_Mesh::SMESH_Mesh(int theLocalId, - int theStudyId, SMESH_Gen* theGen, bool theIsEmbeddedMode, SMESHDS_Document* theDocument): @@ -114,7 +113,6 @@ SMESH_Mesh::SMESH_Mesh(int theLocalId, { if(MYDEBUG) MESSAGE("SMESH_Mesh::SMESH_Mesh(int localId)"); _id = theLocalId; - _studyId = theStudyId; _gen = theGen; _myDocument = theDocument; _myMeshDS = theDocument->NewMesh(theIsEmbeddedMode,theLocalId); @@ -135,7 +133,6 @@ SMESH_Mesh::SMESH_Mesh(int theLocalId, SMESH_Mesh::SMESH_Mesh(): _id(-1), - _studyId(-1), _groupId( 0 ), _nbSubShapes( 0 ), _isShapeToMesh( false ), @@ -208,7 +205,7 @@ SMESH_Mesh::~SMESH_Mesh() // remove self from studyContext if ( _gen ) { - StudyContextStruct * studyContext = _gen->GetStudyContext( _studyId ); + StudyContextStruct * studyContext = _gen->GetStudyContext(); studyContext->mapMesh.erase( _id ); } if ( _myDocument ) @@ -248,7 +245,7 @@ SMESH_Mesh* SMESH_Mesh::FindMesh( int meshId ) const if ( _id == meshId ) return (SMESH_Mesh*) this; - if ( StudyContextStruct *aStudyContext = _gen->GetStudyContext( _studyId )) + if ( StudyContextStruct *aStudyContext = _gen->GetStudyContext()) { std::map < int, SMESH_Mesh * >::iterator i_m = aStudyContext->mapMesh.find( meshId ); if ( i_m != aStudyContext->mapMesh.end() ) @@ -450,7 +447,7 @@ void SMESH_Mesh::Clear() void SMESH_Mesh::ClearSubMesh(const int theShapeId) { - // clear sub-meshes; get ready to re-compute as a side-effect + // clear sub-meshes; get ready to re-compute as a side-effect if ( SMESH_subMesh *sm = GetSubMeshContaining( theShapeId ) ) { SMESH_subMeshIteratorPtr smIt = sm->getDependsOnIterator(/*includeSelf=*/true, @@ -458,7 +455,7 @@ void SMESH_Mesh::ClearSubMesh(const int theShapeId) while ( smIt->more() ) { sm = smIt->next(); - TopAbs_ShapeEnum shapeType = sm->GetSubShape().ShapeType(); + TopAbs_ShapeEnum shapeType = sm->GetSubShape().ShapeType(); if ( shapeType == TopAbs_VERTEX || shapeType < TopAbs_SOLID ) // all other shapes depends on vertices so they are already cleaned sm->ComputeStateEngine( SMESH_subMesh::CLEAN ); @@ -470,7 +467,7 @@ void SMESH_Mesh::ClearSubMesh(const int theShapeId) //======================================================================= //function : UNVToMesh -//purpose : +//purpose : //======================================================================= int SMESH_Mesh::UNVToMesh(const char* theFileName) @@ -485,32 +482,19 @@ int SMESH_Mesh::UNVToMesh(const char* theFileName) myReader.SetMeshId(-1); myReader.Perform(); - if ( SMDS_MeshGroup* aGroup = (SMDS_MeshGroup*) myReader.GetGroup() ) + TGroupNamesMap& aGroupNames = myReader.GetGroupNamesMap(); + TGroupNamesMap::iterator gr2names; + int anId = 1 + ( _mapGroup.empty() ? 0 : _mapGroup.rbegin()->first ); + for ( gr2names = aGroupNames.begin(); gr2names != aGroupNames.end(); ++gr2names ) { - TGroupNamesMap aGroupNames = myReader.GetGroupNamesMap(); - aGroup->InitSubGroupsIterator(); - while (aGroup->MoreSubGroups()) - { - SMDS_MeshGroup* aSubGroup = (SMDS_MeshGroup*) aGroup->NextSubGroup(); - string aName = aGroupNames[aSubGroup]; - int aId; - if ( SMESH_Group* aSMESHGroup = AddGroup( aSubGroup->GetType(), aName.c_str(), aId )) - { - SMESHDS_Group* aGroupDS = dynamic_cast( aSMESHGroup->GetGroupDS() ); - if ( aGroupDS ) { - aGroupDS->SetStoreName(aName.c_str()); - aSubGroup->InitIterator(); - const SMDS_MeshElement* aElement = 0; - while ( aSubGroup->More() ) - if (( aElement = aSubGroup->Next() )) - aGroupDS->SMDSGroup().Add( aElement ); - - if (aElement) - aGroupDS->SetType( aElement->GetType() ); - } - } - } + SMDS_MeshGroup* aGroup = gr2names->first; + const std::string& aName = gr2names->second; + SMESHDS_Group* aGroupDS = new SMESHDS_Group( anId++, _myMeshDS, aGroup->GetType() ); + aGroupDS->SMDSGroup() = std::move( *aGroup ); + aGroupDS->SetStoreName( aName.c_str() ); + AddGroup( aGroupDS ); } + return 1; } @@ -551,12 +535,16 @@ int SMESH_Mesh::MEDToMesh(const char* theFileName, const char* theMeshName) } } } + + _myMeshDS->Modified(); + _myMeshDS->CompactMesh(); + return (int) status; } //======================================================================= //function : STLToMesh -//purpose : +//purpose : //======================================================================= std::string SMESH_Mesh::STLToMesh(const char* theFileName) @@ -661,7 +649,7 @@ SMESH_Mesh::AddHypothesis(const TopoDS_Shape & aSubShape, string hypName = anHyp->GetName(); if ( hypName == "NotConformAllowed" ) { - if(MYDEBUG) MESSAGE( "Hypotesis can be only global" ); + if(MYDEBUG) MESSAGE( "Hypothesis can be only global" ); return SMESH_Hypothesis::HYP_INCOMPATIBLE; } } @@ -698,13 +686,13 @@ SMESH_Mesh::AddHypothesis(const TopoDS_Shape & aSubShape, } // check concurrent hypotheses on ancestors - if (ret < SMESH_Hypothesis::HYP_CONCURENT && !isGlobalHyp ) + if (ret < SMESH_Hypothesis::HYP_CONCURRENT && !isGlobalHyp ) { SMESH_subMeshIteratorPtr smIt = subMesh->getDependsOnIterator(false,false); while ( smIt->more() ) { SMESH_subMesh* sm = smIt->next(); - if ( sm->IsApplicableHypotesis( anHyp )) { - ret2 = sm->CheckConcurentHypothesis( anHyp->GetType() ); + if ( sm->IsApplicableHypothesis( anHyp )) { + ret2 = sm->CheckConcurrentHypothesis( anHyp->GetType() ); if (ret2 > ret) { ret = ret2; break; @@ -734,7 +722,7 @@ SMESH_Mesh::RemoveHypothesis(const TopoDS_Shape & aSubShape, Unexpect aCatch(SalomeException); if(MYDEBUG) MESSAGE("SMESH_Mesh::RemoveHypothesis"); - StudyContextStruct *sc = _gen->GetStudyContext(_studyId); + StudyContextStruct *sc = _gen->GetStudyContext(); if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end()) throw SALOME_Exception(LOCALIZED("hypothesis does not exist")); @@ -751,10 +739,10 @@ SMESH_Mesh::RemoveHypothesis(const TopoDS_Shape & aSubShape, SMESH_Hypothesis::Hypothesis_Status ret = subMesh->AlgoStateEngine(event, anHyp); // there may appear concurrent hyps that were covered by the removed hyp - if (ret < SMESH_Hypothesis::HYP_CONCURENT && - subMesh->IsApplicableHypotesis( anHyp ) && - subMesh->CheckConcurentHypothesis( anHyp->GetType() ) != SMESH_Hypothesis::HYP_OK) - ret = SMESH_Hypothesis::HYP_CONCURENT; + if (ret < SMESH_Hypothesis::HYP_CONCURRENT && + subMesh->IsApplicableHypothesis( anHyp ) && + subMesh->CheckConcurrentHypothesis( anHyp->GetType() ) != SMESH_Hypothesis::HYP_OK) + ret = SMESH_Hypothesis::HYP_CONCURRENT; // sub-shapes if (!SMESH_Hypothesis::IsStatusFatal(ret) && @@ -768,13 +756,13 @@ SMESH_Mesh::RemoveHypothesis(const TopoDS_Shape & aSubShape, ret = ret2; // check concurrent hypotheses on ancestors - if (ret < SMESH_Hypothesis::HYP_CONCURENT && !IsMainShape( aSubShape ) ) + if (ret < SMESH_Hypothesis::HYP_CONCURRENT && !IsMainShape( aSubShape ) ) { SMESH_subMeshIteratorPtr smIt = subMesh->getDependsOnIterator(false,false); while ( smIt->more() ) { SMESH_subMesh* sm = smIt->next(); - if ( sm->IsApplicableHypotesis( anHyp )) { - ret2 = sm->CheckConcurentHypothesis( anHyp->GetType() ); + if ( sm->IsApplicableHypothesis( anHyp )) { + ret2 = sm->CheckConcurrentHypothesis( anHyp->GetType() ); if (ret2 > ret) { ret = ret2; break; @@ -995,7 +983,7 @@ int SMESH_Mesh::GetHypotheses(const SMESH_subMesh * aSubMesh, SMESH_Hypothesis * SMESH_Mesh::GetHypothesis(const int anHypId) const { - StudyContextStruct *sc = _gen->GetStudyContext(_studyId); + StudyContextStruct *sc = _gen->GetStudyContext(); if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end()) return NULL; @@ -1169,7 +1157,7 @@ bool SMESH_Mesh::IsUsedHypothesis(SMESHDS_Hypothesis * anHyp, SMESH_Hypothesis* hyp = static_cast(anHyp); // check if anHyp can be used to mesh aSubMesh - if ( !aSubMesh || !aSubMesh->IsApplicableHypotesis( hyp )) + if ( !aSubMesh || !aSubMesh->IsApplicableHypothesis( hyp )) return false; SMESH_Algo *algo = aSubMesh->GetAlgo(); @@ -1232,7 +1220,7 @@ void SMESH_Mesh::NotifySubMeshesHypothesisModification(const SMESH_Hypothesis* h { const TopoDS_Shape & aSubShape = aSubMesh->GetSubShape(); - if (( aSubMesh->IsApplicableHypotesis( hyp )) && + if (( aSubMesh->IsApplicableHypothesis( hyp )) && ( algo = aSubMesh->GetAlgo() ) && ( compatibleHypoKind = algo->GetCompatibleHypoFilter( !hyp->IsAuxiliary() )) && ( compatibleHypoKind->IsOk( hyp, aSubShape ))) @@ -1348,6 +1336,41 @@ bool SMESH_Mesh::HasModificationsToDiscard() const return false; } +//============================================================================= +/*! + * \brief Return true if all sub-meshes are computed OK - to update an icon + */ +//============================================================================= + +bool SMESH_Mesh::IsComputedOK() +{ + if ( NbNodes() == 0 ) + return false; + + if ( !HasShapeToMesh() ) + return true; + + if ( SMESH_subMesh* mainSM = GetSubMeshContaining( 1 )) + { + SMESH_subMeshIteratorPtr smIt = mainSM->getDependsOnIterator(/*includeSelf=*/true); + while ( smIt->more() ) + { + const SMESH_subMesh* sm = smIt->next(); + if ( !sm->IsAlwaysComputed() ) + switch ( sm->GetComputeState() ) + { + case SMESH_subMesh::NOT_READY: + case SMESH_subMesh::COMPUTE_OK: + continue; // ok + case SMESH_subMesh::FAILED_TO_COMPUTE: + case SMESH_subMesh::READY_TO_COMPUTE: + return false; + } + } + } + return true; +} + //================================================================================ /*! * \brief Check if any groups of the same type have equal names @@ -1379,7 +1402,10 @@ bool SMESH_Mesh::HasDuplicatedGroupNamesMED() * \param [in] theAutoGroups - boolean parameter for creating/not creating * the groups Group_On_All_Nodes, Group_On_All_Faces, ... ; * the typical use is auto_groups=false. - * \param [in] theVersion - defines the version of format of MED file, that will be created + * \param [in] theMinor - define the minor version (y, where version is x.y.z) of MED file format. + * The theMinor must be between 0 and the current minor version of MED file library. + * If theMinor is equal to -1, the minor version is not changed (default). + * The major version (x, where version is x.y.z) cannot be changed. * \param [in] meshPart - mesh data to export * \param [in] theAutoDimension - if \c true, a space dimension of a MED mesh can be either * - 1D if all mesh nodes lie on OX coordinate axis, or @@ -1395,7 +1421,7 @@ bool SMESH_Mesh::HasDuplicatedGroupNamesMED() void SMESH_Mesh::ExportMED(const char * file, const char* theMeshName, bool theAutoGroups, - int theVersion, + int theMinor, const SMESHDS_Mesh* meshPart, bool theAutoDimension, bool theAddODOnVertices, @@ -1406,7 +1432,7 @@ void SMESH_Mesh::ExportMED(const char * file, SMESH_TRY; DriverMED_W_SMESHDS_Mesh myWriter; - myWriter.SetFile ( file, MED::EVersion(theVersion) ); + myWriter.SetFile ( file , theMinor); myWriter.SetMesh ( meshPart ? (SMESHDS_Mesh*) meshPart : _myMeshDS ); myWriter.SetAutoDimension( theAutoDimension ); myWriter.AddODOnVertices ( theAddODOnVertices ); @@ -1476,19 +1502,19 @@ void SMESH_Mesh::ExportSAUV(const char *file, #ifdef WIN32 cmd = "%PYTHONBIN% "; #else - cmd = "python "; + cmd = "python3 "; #endif cmd += "-c \""; cmd += "from medutilities import my_remove ; my_remove(r'" + medfilename + "')"; cmd += "\""; system(cmd.c_str()); - ExportMED(medfilename.c_str(), theMeshName, theAutoGroups, /*theVersion=*/1, + ExportMED(medfilename.c_str(), theMeshName, theAutoGroups, /*meshPart=*/NULL, /*theAutoDimension=*/false, /*theAddODOnVertices=*/false, /*theAllElemsToGroup=*/true ); // theAllElemsToGroup is for PAL0023413 #ifdef WIN32 cmd = "%PYTHONBIN% "; #else - cmd = "python "; + cmd = "python3 "; #endif cmd += "-c \""; cmd += "from medutilities import convert ; convert(r'" + medfilename + "', 'MED', 'GIBI', 1, r'" + file + "')"; @@ -1497,7 +1523,7 @@ void SMESH_Mesh::ExportSAUV(const char *file, #ifdef WIN32 cmd = "%PYTHONBIN% "; #else - cmd = "python "; + cmd = "python3 "; #endif cmd += "-c \""; cmd += "from medutilities import my_remove ; my_remove(r'" + medfilename + "')";