From d2681a122cd708f8ddb5c75005b6b2aa30c5f844 Mon Sep 17 00:00:00 2001 From: eap Date: Fri, 10 Jan 2020 14:33:42 +0300 Subject: [PATCH] #17927: EDF 20035 - perfs of mesh creation --- src/SMESH/SMESH_Mesh.cxx | 13 ++++---- src/SMESH/SMESH_Mesh.hxx | 7 +++-- src/SMESH_I/SMESH_Gen_i.hxx | 1 + src/SMESH_I/SMESH_Gen_i_1.cxx | 22 +++++++++++++ src/SMESH_I/SMESH_Mesh_i.cxx | 59 ++++++++++++++++++++++++----------- src/SMESH_I/SMESH_Mesh_i.hxx | 7 ++--- 6 files changed, 77 insertions(+), 32 deletions(-) diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx index 7201c5280..77d19984f 100644 --- a/src/SMESH/SMESH_Mesh.cxx +++ b/src/SMESH/SMESH_Mesh.cxx @@ -1191,11 +1191,11 @@ void SMESH_Mesh::NotifySubMeshesHypothesisModification(const SMESH_Hypothesis* h if ( !GetMeshDS()->IsUsedHypothesis( hyp )) return; - bool toCallBack = true; - if ( _callUp && hyp && NbNodes() == 0 ) // for not loaded mesh (#16648) + int nbEntities = ( _myMeshDS->NbNodes() + _myMeshDS->NbElements() ); + if ( hyp && _callUp && !_callUp->IsLoaded() ) // for not loaded mesh (#16648) { - _callUp->HypothesisModified( hyp->GetID() ); - toCallBack = ( NbNodes() > 0 ); + _callUp->HypothesisModified( hyp->GetID(), /*updateIcons=*/true ); + nbEntities = ( _myMeshDS->NbNodes() + _myMeshDS->NbElements() ); // after loading mesh } SMESH_Algo *algo; @@ -1265,8 +1265,9 @@ void SMESH_Mesh::NotifySubMeshesHypothesisModification(const SMESH_Hypothesis* h HasModificationsToDiscard(); // to reset _isModified flag if mesh becomes empty GetMeshDS()->Modified(); - if ( _callUp && hyp && toCallBack ) - _callUp->HypothesisModified( hyp->GetID() ); + int newNbEntities = ( _myMeshDS->NbNodes() + _myMeshDS->NbElements() ); + if ( hyp && _callUp ) + _callUp->HypothesisModified( hyp->GetID(), newNbEntities != nbEntities ); } //============================================================================= diff --git a/src/SMESH/SMESH_Mesh.hxx b/src/SMESH/SMESH_Mesh.hxx index 87eaf832f..94531ddf7 100644 --- a/src/SMESH/SMESH_Mesh.hxx +++ b/src/SMESH/SMESH_Mesh.hxx @@ -335,9 +335,10 @@ class SMESH_EXPORT SMESH_Mesh struct TCallUp // callback from SMESH to SMESH_I level { - virtual void RemoveGroup (const int theGroupID)=0; - virtual void HypothesisModified (int theHypID)=0; - virtual void Load ()=0; + virtual void RemoveGroup( const int theGroupID )=0; + virtual void HypothesisModified( int hypID, bool updateIcons )=0; + virtual void Load()=0; + virtual bool IsLoaded()=0; virtual ~TCallUp() {} }; void SetCallUp( TCallUp * upCaller ); diff --git a/src/SMESH_I/SMESH_Gen_i.hxx b/src/SMESH_I/SMESH_Gen_i.hxx index 52cd172b4..3338b41dc 100644 --- a/src/SMESH_I/SMESH_Gen_i.hxx +++ b/src/SMESH_I/SMESH_Gen_i.hxx @@ -523,6 +523,7 @@ public: const char* theName = 0); void UpdateIcons(SMESH::SMESH_Mesh_ptr theMesh); void HighLightInvalid(CORBA::Object_ptr theObject, bool isInvalid); + bool IsInvalid(SALOMEDS::SObject_ptr theObject); bool AddHypothesisToShape(SMESH::SMESH_Mesh_ptr theMesh, GEOM::GEOM_Object_ptr theShapeObject, SMESH::SMESH_Hypothesis_ptr theHyp); diff --git a/src/SMESH_I/SMESH_Gen_i_1.cxx b/src/SMESH_I/SMESH_Gen_i_1.cxx index 1d7301ffe..af7abc3d5 100644 --- a/src/SMESH_I/SMESH_Gen_i_1.cxx +++ b/src/SMESH_I/SMESH_Gen_i_1.cxx @@ -1030,6 +1030,28 @@ void SMESH_Gen_i::highLightInvalid( SALOMEDS::SObject_ptr theSObject, bool isInv } } +//======================================================================= +//function : IsInvalid +//purpose : Check object validity == absence of AttributeTextColor=(178,34,34) +//======================================================================= + +bool SMESH_Gen_i::IsInvalid( SALOMEDS::SObject_ptr theSObject ) +{ + bool isValid = true; + if ( !theSObject->_is_nil() ) + { + SALOMEDS::GenericAttribute_wrap attr; + SALOMEDS::StudyBuilder_var studyBuilder = getStudyServant()->NewBuilder(); + if ( studyBuilder->FindAttribute( theSObject, attr.inout(), "AttributeTextColor" )) + { + SALOMEDS::AttributeTextColor_wrap colorAttr = attr; + SALOMEDS::Color color = colorAttr->TextColor(); + isValid = ( color.R != 178 || color.G != 34 || color.B != 34 ); + } + } + return isValid; +} + //======================================================================= //function : GetMeshOrSubmeshByShape //purpose : diff --git a/src/SMESH_I/SMESH_Mesh_i.cxx b/src/SMESH_I/SMESH_Mesh_i.cxx index f0dfcda69..8329b0cc2 100644 --- a/src/SMESH_I/SMESH_Mesh_i.cxx +++ b/src/SMESH_I/SMESH_Mesh_i.cxx @@ -113,6 +113,7 @@ SMESH_Mesh_i::SMESH_Mesh_i( PortableServer::POA_ptr thePOA, _impl = NULL; _gen_i = gen_i; _id = _idGenerator++; + _nbInvalidHypos= -1; _editor = NULL; _previewEditor = NULL; _preMeshInfo = NULL; @@ -647,6 +648,8 @@ SMESH_Mesh_i::AddHypothesis(GEOM::GEOM_Object_ptr aSubShape, if ( _preMeshInfo ) _preMeshInfo->ForgetOrLoad(); + const int prevNbMeshEnt = _impl->NbNodes() + _impl->GetMeshDS()->NbElements(); + std::string error; SMESH_Hypothesis::Hypothesis_Status status = addHypothesis( aSubShape, anHyp, &error ); anErrorText = error.c_str(); @@ -655,7 +658,10 @@ SMESH_Mesh_i::AddHypothesis(GEOM::GEOM_Object_ptr aSubShape, if ( !SMESH_Hypothesis::IsStatusFatal(status) ) { _gen_i->AddHypothesisToShape( mesh, aSubShape, anHyp ); - _gen_i->UpdateIcons( mesh ); + + int newNbMeshEnt = _impl->NbNodes() + _impl->GetMeshDS()->NbElements(); + if ( newNbMeshEnt != prevNbMeshEnt ) + _gen_i->UpdateIcons( mesh ); } if(MYDEBUG) MESSAGE( " AddHypothesis(): status = " << status ); @@ -3072,40 +3078,55 @@ namespace SMESH_Mesh_i* _mesh; TCallUp_i(SMESH_Mesh_i* mesh):_mesh(mesh) {} virtual void RemoveGroup (const int theGroupID) { _mesh->removeGroup( theGroupID ); } - virtual void HypothesisModified (int theHypID) { _mesh->onHypothesisModified( theHypID ); } + virtual void HypothesisModified( int hypID, + bool updIcons) { _mesh->onHypothesisModified( hypID, + updIcons ); } virtual void Load () { _mesh->Load(); } + virtual bool IsLoaded() { return _mesh->IsLoaded(); } }; } //================================================================================ /*! - * \brief callback from _impl to forget not loaded mesh data (issue 0021208) + * \brief callback from _impl to + * 1) forget not loaded mesh data (issue 0021208) + * 2) mark hypothesis as valid */ //================================================================================ -void SMESH_Mesh_i::onHypothesisModified(int theHypID) +void SMESH_Mesh_i::onHypothesisModified(int theHypID, bool theUpdateIcons) { if ( _preMeshInfo ) _preMeshInfo->ForgetOrLoad(); - SMESH::SMESH_Mesh_var mesh = _this(); - _gen_i->UpdateIcons( mesh ); - - // mark a hypothesis as valid after edition - SALOMEDS::SComponent_wrap smeshComp = _gen_i->PublishComponent(); - SALOMEDS::SObject_wrap hypRoot; - if ( !smeshComp->_is_nil() && - smeshComp->FindSubObject( _gen_i->GetHypothesisRootTag(), hypRoot.inout() )) + if ( theUpdateIcons ) { - SALOMEDS::ChildIterator_wrap anIter = _gen_i->getStudyServant()->NewChildIterator( hypRoot ); - for ( ; anIter->More(); anIter->Next() ) + SMESH::SMESH_Mesh_var mesh = _this(); + _gen_i->UpdateIcons( mesh ); + } + + if ( _nbInvalidHypos != 0 ) + { + // mark a hypothesis as valid after edition + int nbInvalid = 0; + SALOMEDS::SComponent_wrap smeshComp = _gen_i->PublishComponent(); + SALOMEDS::SObject_wrap hypRoot; + if ( !smeshComp->_is_nil() && + smeshComp->FindSubObject( _gen_i->GetHypothesisRootTag(), hypRoot.inout() )) { - SALOMEDS::SObject_wrap hypSO = anIter->Value(); - CORBA::Object_var obj = _gen_i->SObjectToObject( hypSO ); - SMESH::SMESH_Hypothesis_var hyp = SMESH::SMESH_Hypothesis::_narrow( obj ); - if ( !hyp->_is_nil() && hyp->GetId() == theHypID ) - _gen_i->HighLightInvalid( hyp, false ); + SALOMEDS::ChildIterator_wrap anIter = _gen_i->getStudyServant()->NewChildIterator( hypRoot ); + for ( ; anIter->More(); anIter->Next() ) + { + SALOMEDS::SObject_wrap hypSO = anIter->Value(); + CORBA::Object_var obj = _gen_i->SObjectToObject( hypSO ); + SMESH::SMESH_Hypothesis_var hyp = SMESH::SMESH_Hypothesis::_narrow( obj ); + if ( !hyp->_is_nil() && hyp->GetId() == theHypID ) + _gen_i->HighLightInvalid( hyp, false ); + else + nbInvalid += _gen_i->IsInvalid( hypSO ); + } } + _nbInvalidHypos = nbInvalid; } } diff --git a/src/SMESH_I/SMESH_Mesh_i.hxx b/src/SMESH_I/SMESH_Mesh_i.hxx index 27c6142b5..d29b1eea1 100644 --- a/src/SMESH_I/SMESH_Mesh_i.hxx +++ b/src/SMESH_I/SMESH_Mesh_i.hxx @@ -452,11 +452,9 @@ public: const std::map& getGroups() { return _mapGroups; } // return existing group objects - void onHypothesisModified(int theHypID); + void onHypothesisModified(int theHypID, bool updateIcons); // callback from _impl to forget not loaded mesh data (issue 0021208) - void checkMeshLoaded(); - /*! * \brief Update data if geometry changes * @@ -724,12 +722,13 @@ private: */ TListOfListOfInt findConcurrentSubMeshes(); -private: + private: static int _idGenerator; ::SMESH_Mesh* _impl; // :: force no namespace here SMESH_Gen_i* _gen_i; int _id; // id given by creator (unique within the creator instance) + int _nbInvalidHypos; std::map _mapSubMeshIor; std::map _mapGroups; std::map _mapHypo;