X-Git-Url: http://git.salome-platform.org/gitweb/?p=modules%2Fsmesh.git;a=blobdiff_plain;f=src%2FSMESHGUI%2FSMESHGUI_VTKUtils.cxx;h=eb7a7e5bfe006b415fc318cba4554f059a288510;hp=ac471b318511730397ea3b093537c16183a05c96;hb=HEAD;hpb=98e8c177214dcc9d7b48f00048f165526aeca06e diff --git a/src/SMESHGUI/SMESHGUI_VTKUtils.cxx b/src/SMESHGUI/SMESHGUI_VTKUtils.cxx index ac471b318..ece3b31ba 100644 --- a/src/SMESHGUI/SMESHGUI_VTKUtils.cxx +++ b/src/SMESHGUI/SMESHGUI_VTKUtils.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2024 CEA, EDF, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -77,7 +77,7 @@ namespace SMESH { - typedef std::map TVisualObjCont; + typedef std::map TVisualObjCont; static TVisualObjCont VISUAL_OBJ_CONT; //============================================================================= @@ -137,17 +137,13 @@ namespace SMESH } } - if (aViewManager ) { - int aStudyId = aViewManager->study()->id(); - TVisualObjCont::key_type aKey(aStudyId,theEntry); - TVisualObjCont::iterator anIter = VISUAL_OBJ_CONT.find(aKey); - if(anIter != VISUAL_OBJ_CONT.end()) { - // for unknown reason, object destructor is not called, so clear object manually - anIter->second->GetUnstructuredGrid()->SetCells(0,0,0,0,0); - anIter->second->GetUnstructuredGrid()->SetPoints(0); - } - VISUAL_OBJ_CONT.erase(aKey); + TVisualObjCont::iterator anIter = VISUAL_OBJ_CONT.find(theEntry); + if(anIter != VISUAL_OBJ_CONT.end()) { + // for unknown reason, object destructor is not called, so clear object manually + anIter->second->GetUnstructuredGrid()->SetCells(0,0,0,0,0); + anIter->second->GetUnstructuredGrid()->SetPoints(0); } + VISUAL_OBJ_CONT.erase(theEntry); if(actorRemoved) aStudy->setVisibilityState(theEntry, Qtx::HiddenState); @@ -200,7 +196,7 @@ namespace SMESH */ //================================================================================ - void RemoveVisuData(int studyID) + void RemoveVisuData() { SalomeApp_Application* app = dynamic_cast ( SUIT_Session::session()->activeApplication() ); @@ -208,8 +204,7 @@ namespace SMESH ViewManagerList viewMgrs = app->viewManagers(); for ( int iM = 0; iM < viewMgrs.count(); ++iM ) { SUIT_ViewManager* aViewManager = viewMgrs.at( iM ); - if ( aViewManager && aViewManager->getType() == SVTK_Viewer::Type() && - aViewManager->study()->id() == studyID ) { + if ( aViewManager && aViewManager->getType() == SVTK_Viewer::Type() ) { QVector views = aViewManager->getViews(); for ( int iV = 0; iV < views.count(); ++iV ) { if(SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(views[iV])) { @@ -230,17 +225,91 @@ namespace SMESH } TVisualObjCont::iterator anIter = VISUAL_OBJ_CONT.begin(); for ( ; anIter != VISUAL_OBJ_CONT.end(); ) { - int curId = anIter->first.first; - if ( curId == studyID ) { - // for unknown reason, object destructor is not called, so clear object manually - anIter->second->GetUnstructuredGrid()->SetCells(0,0,0,0,0); - anIter->second->GetUnstructuredGrid()->SetPoints(0); - VISUAL_OBJ_CONT.erase( anIter++ ); // anIter++ returns a copy of self before incrementing - } - else { - anIter++; + // for unknown reason, object destructor is not called, so clear object manually + anIter->second->GetUnstructuredGrid()->SetCells(0,0,0,0,0); + anIter->second->GetUnstructuredGrid()->SetPoints(0); + VISUAL_OBJ_CONT.erase( anIter++ ); // anIter++ returns a copy of self before incrementing + } + } + + //================================================================================ + /*! + * \brief Remove/update actors while module activation + * \param [in] wnd - window + * + * At module activation, groups and sub-meshes can be removed on engine side due + * to modification of meshed geometry, while their actors can remain. + * Here we remove/update SMESH_Actor's of changed objects. State (emptiness) of objects + * is defined by their icons in the Object Browser + */ + //================================================================================ + + void UpdateActorsAfterUpdateStudy( SUIT_ViewWindow* theWindow ) + { + const char* emptyIcon = "ICON_SMESH_TREE_MESH_WARN"; + _PTR(Study) aStudy = SMESH::getStudy(); + + if ( SVTK_ViewWindow* aViewWindow = GetVtkViewWindow( theWindow )) + { + vtkRenderer *aRenderer = aViewWindow->getRenderer(); + VTK::ActorCollectionCopy aCopy(aRenderer->GetActors()); + vtkActorCollection *aCollection = aCopy.GetActors(); + aCollection->InitTraversal(); + while ( vtkActor *actor = aCollection->GetNextActor() ) { + if ( SMESH_Actor *smeshActor = dynamic_cast( actor )) + { + if ( !smeshActor->hasIO() ) + continue; + Handle(SALOME_InteractiveObject) io = smeshActor->getIO(); + if ( !io->hasEntry() ) + continue; + _PTR(SObject) so = aStudy->FindObjectID( io->getEntry() ); + if ( !so ) + continue; // seems impossible + + CORBA::Object_var obj = SMESH::SObjectToObject( so ); + if ( CORBA::is_nil( obj )) // removed object + { + RemoveActor( theWindow, smeshActor ); + continue; + } + + bool toShow = smeshActor->GetVisibility(); + _PTR(GenericAttribute) attr; + if ( toShow && so->FindAttribute( attr, "AttributePixMap" )) // check emptiness + { + _PTR(AttributePixMap) pixMap = attr; + toShow = ( pixMap->GetPixMap() != emptyIcon ); + } + //smeshActor->Update(); + UpdateView( theWindow, toShow ? eDisplay : eErase, io->getEntry() ); + } } } + return; + } + + //================================================================================ + /*! + * \brief Remove/update actors while module activation + * + * At module activation, groups and sub-meshes can be removed on engine side due + * to modification of meshed geometry, while their actors can remain. + * Here we remove/update SMESH_Actor's of changed objects. State (emptiness) of objects + * is defined by their icons in the Object Browser + */ + //================================================================================ + + void UpdateActorsAfterUpdateStudy() + { + SUIT_Study* study = SMESH::GetActiveStudy(); + if ( SUIT_Desktop* desk = study->application()->desktop() ) + { + QList wndList = desk->windows(); + SUIT_ViewWindow* wnd; + foreach ( wnd, wndList ) + SMESH::UpdateActorsAfterUpdateStudy(wnd); + } } //================================================================================ @@ -279,18 +348,17 @@ namespace SMESH */ //================================================================================ - TVisualObjPtr GetVisualObj(int theStudyId, const char* theEntry, bool nulData){ + TVisualObjPtr GetVisualObj(const char* theEntry, bool nulData){ TVisualObjPtr aVisualObj; - TVisualObjCont::key_type aKey(theStudyId,theEntry); try{ OCC_CATCH_SIGNALS; - TVisualObjCont::iterator anIter = VISUAL_OBJ_CONT.find(aKey); + TVisualObjCont::iterator anIter = VISUAL_OBJ_CONT.find(theEntry); if(anIter != VISUAL_OBJ_CONT.end()){ aVisualObj = anIter->second; }else{ SalomeApp_Application* app = dynamic_cast( SMESHGUI::activeStudy()->application() ); - _PTR(Study) aStudy = SMESHGUI::activeStudy()->studyDS(); + _PTR(Study) aStudy = SMESH::getStudy(); _PTR(SObject) aSObj = aStudy->FindObjectID(theEntry); if(aSObj){ _PTR(GenericAttribute) anAttr; @@ -303,7 +371,7 @@ namespace SMESH SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow(anObj); if(!aMesh->_is_nil()){ aVisualObj.reset(new SMESH_MeshObj(aMesh)); - TVisualObjCont::value_type aValue(aKey,aVisualObj); + TVisualObjCont::value_type aValue(theEntry,aVisualObj); VISUAL_OBJ_CONT.insert(aValue); } //Try narrow to SMESH_Group interface @@ -314,10 +382,10 @@ namespace SMESH aFatherSObj = aFatherSObj->GetFather(); if(!aFatherSObj) return aVisualObj; CORBA::String_var anEntry = aFatherSObj->GetID().c_str(); - TVisualObjPtr aVisObj = GetVisualObj(theStudyId,anEntry.in()); + TVisualObjPtr aVisObj = GetVisualObj(anEntry.in()); if(SMESH_MeshObj* aMeshObj = dynamic_cast(aVisObj.get())){ aVisualObj.reset(new SMESH_GroupObj(aGroup,aMeshObj)); - TVisualObjCont::value_type aValue(aKey,aVisualObj); + TVisualObjCont::value_type aValue(theEntry,aVisualObj); VISUAL_OBJ_CONT.insert(aValue); } } @@ -329,10 +397,10 @@ namespace SMESH aFatherSObj = aFatherSObj->GetFather(); if(!aFatherSObj) return aVisualObj; CORBA::String_var anEntry = aFatherSObj->GetID().c_str(); - TVisualObjPtr aVisObj = GetVisualObj(theStudyId,anEntry.in()); + TVisualObjPtr aVisObj = GetVisualObj(anEntry.in()); if(SMESH_MeshObj* aMeshObj = dynamic_cast(aVisObj.get())){ aVisualObj.reset(new SMESH_subMeshObj(aSubMesh,aMeshObj)); - TVisualObjCont::value_type aValue(aKey,aVisualObj); + TVisualObjCont::value_type aValue(theEntry,aVisualObj); VISUAL_OBJ_CONT.insert(aValue); } } @@ -554,7 +622,7 @@ namespace SMESH return NULL; if(!CORBA::is_nil(theObject)){ - _PTR(Study) aStudy = GetActiveStudyDocument(); + _PTR(Study) aStudy = getStudy(); CORBA::String_var anIOR = app->orb()->object_to_string( theObject ); _PTR(SObject) aSObject = aStudy->FindObjectIOR(anIOR.in()); if(aSObject){ @@ -566,14 +634,12 @@ namespace SMESH } - SMESH_Actor* CreateActor(_PTR(Study) theStudy, - const char* theEntry, + SMESH_Actor* CreateActor(const char* theEntry, int theIsClear) { SMESH_Actor *anActor = NULL; - CORBA::Long anId = theStudy->StudyId(); - if(TVisualObjPtr aVisualObj = GetVisualObj(anId,theEntry)){ - _PTR(SObject) aSObj = theStudy->FindObjectID(theEntry); + if(TVisualObjPtr aVisualObj = GetVisualObj(theEntry)){ + _PTR(SObject) aSObj = getStudy()->FindObjectID(theEntry); if(aSObj){ _PTR(GenericAttribute) anAttr; if(aSObj->FindAttribute(anAttr,"AttributeName")){ @@ -626,6 +692,7 @@ namespace SMESH try { OCC_CATCH_SIGNALS; //MESSAGE("DisplayActor " << theActor); + theActor->SetPointRepresentation(false); vtkWnd->AddActor(theActor); vtkWnd->Repaint(); } @@ -646,10 +713,7 @@ namespace SMESH Handle(SALOME_InteractiveObject) anIO = theActor->getIO(); if(anIO->hasEntry()){ std::string anEntry = anIO->getEntry(); - SalomeApp_Study* aStudy = dynamic_cast( vtkWnd->getViewManager()->study() ); - int aStudyId = aStudy->id(); - TVisualObjCont::key_type aKey(aStudyId,anEntry); - VISUAL_OBJ_CONT.erase(aKey); + VISUAL_OBJ_CONT.erase(anEntry); } } theActor->Delete(); @@ -663,9 +727,10 @@ namespace SMESH */ //================================================================================ - bool noSmeshActors(SUIT_ViewWindow *theWnd) + bool NoSmeshActors(SUIT_ViewWindow *theWnd) { - if(SVTK_ViewWindow* aViewWindow = GetVtkViewWindow(theWnd)) { + SUIT_ViewWindow* aWnd = ( theWnd == nullptr ) ? GetActiveWindow() : theWnd; + if(SVTK_ViewWindow* aViewWindow = GetVtkViewWindow(aWnd)) { vtkRenderer *aRenderer = aViewWindow->getRenderer(); VTK::ActorCollectionCopy aCopy(aRenderer->GetActors()); vtkActorCollection *aCollection = aCopy.GetActors(); @@ -694,6 +759,7 @@ namespace SMESH if (!aStudy) return OK; + SUIT_ResourceMgr* resMgr; { OK = true; vtkRenderer *aRenderer = aViewWnd->getRenderer(); @@ -729,6 +795,7 @@ namespace SMESH } aStudy->setVisibilityStateForAll(Qtx::HiddenState); } + // fall through default: { if (SMESH_Actor *anActor = FindActorByEntry(theWnd,theEntry)) { switch (theAction) { @@ -739,6 +806,10 @@ namespace SMESH anActor->SetVisibility(true); if (theAction == eDisplayOnly) aRenderer->ResetCameraClippingRange(); aStudy->setVisibilityState(theEntry, Qtx::ShownState); + if (( theAction == eDisplayOnly ) && + ( resMgr = SMESHGUI::resourceMgr() ) && + ( resMgr->booleanValue( "SMESH", "fitall_on_displayonly", false ))) + FitAll(); // PAL23615 break; case eErase: //MESSAGE("--- erase " << anActor); @@ -754,20 +825,25 @@ namespace SMESH { //MESSAGE("---"); SalomeApp_Study* aStudy = dynamic_cast(theWnd->getViewManager()->study()); - _PTR(Study) aDocument = aStudy->studyDS(); - // Pass non-visual objects (hypotheses, etc.), return true in this case - CORBA::Long anId = aDocument->StudyId(); TVisualObjPtr aVisualObj; - if ( (aVisualObj = GetVisualObj(anId,theEntry)) && aVisualObj->IsValid()) + if ( (aVisualObj = GetVisualObj(theEntry)) && aVisualObj->IsValid()) { - if ((anActor = CreateActor(aDocument,theEntry,true))) { - bool needFitAll = noSmeshActors(theWnd); // fit for the first object only + if ((anActor = CreateActor(theEntry,true))) { + bool needFitAll = NoSmeshActors(theWnd); // fit for the first object only DisplayActor(theWnd,anActor); anActor->SetVisibility(true); aStudy->setVisibilityState(theEntry, Qtx::ShownState); // FitAll(); - PAL16770(Display of a group performs an automatic fit all) - if (needFitAll) FitAll(); - } else { + if (( !needFitAll ) && + ( theAction == eDisplayOnly ) && + ( resMgr = SMESHGUI::resourceMgr() )) + { + needFitAll = resMgr->booleanValue( "SMESH", "fitall_on_displayonly", false ); + } + if ( needFitAll ) + FitAll(); + } + else { OK = false; } } @@ -810,7 +886,7 @@ namespace SMESH if(SMESH_Actor *anActor = dynamic_cast(anAct)){ if(anActor->hasIO()) if (!Update(anActor->getIO(),anActor->GetVisibility())) - break; // avoid multiple warinings if visu failed + break; // avoid multiple warnings if visu failed } } } @@ -821,7 +897,7 @@ namespace SMESH { Handle(SALOME_InteractiveObject) anIO = anIter.Value(); if ( !Update( anIO, true )) - break; // avoid multiple warinings if visu failed + break; // avoid multiple warnings if visu failed if ( withChildrenOfSelected ) // update all visible children { @@ -853,9 +929,7 @@ namespace SMESH bool Update(const Handle(SALOME_InteractiveObject)& theIO, bool theDisplay) { //MESSAGE("Update"); - _PTR(Study) aStudy = GetActiveStudyDocument(); - CORBA::Long anId = aStudy->StudyId(); - if ( TVisualObjPtr aVisualObj = SMESH::GetVisualObj(anId,theIO->getEntry())) { + if ( TVisualObjPtr aVisualObj = SMESH::GetVisualObj(theIO->getEntry())) { if ( theDisplay ) UpdateView(SMESH::eDisplay,theIO->getEntry()); return true; @@ -866,9 +940,7 @@ namespace SMESH bool UpdateNulData(const Handle(SALOME_InteractiveObject)& theIO, bool theDisplay) { //MESSAGE("UpdateNulData"); - _PTR(Study) aStudy = GetActiveStudyDocument(); - CORBA::Long anId = aStudy->StudyId(); - if ( TVisualObjPtr aVisualObj = SMESH::GetVisualObj(anId,theIO->getEntry(), true)) { + if ( TVisualObjPtr aVisualObj = SMESH::GetVisualObj(theIO->getEntry(), true)) { if ( theDisplay ) UpdateView(SMESH::eDisplay,theIO->getEntry()); return true; @@ -907,7 +979,7 @@ namespace SMESH SMESH_ActorProps::props()->reset(); QColor - aHiColor = mgr->colorValue( "SMESH", "selection_object_color", Qt::white ), + //aHiColor = mgr->colorValue( "SMESH", "selection_object_color", Qt::white ), aSelColor = mgr->colorValue( "SMESH", "selection_element_color", Qt::yellow ), aPreColor = mgr->colorValue( "SMESH", "highlight_color", Qt::cyan ); @@ -947,7 +1019,7 @@ namespace SMESH aCollection->InitTraversal(); while ( vtkActor *anAct = aCollection->GetNextActor() ) { if ( SMESH_Actor *anActor = dynamic_cast(anAct) ) { - anActor->UpdateSelectionProps(); + anActor->UpdateSelectionProps(); } } } @@ -1123,7 +1195,7 @@ namespace SMESH QString& theName) { theName = ""; - TColStd_IndexedMapOfInteger aMapIndex; + SVTK_TIndexedMapOfVtkId aMapIndex; theSelector->GetIndex(theIO,aMapIndex); for(int i = 1; i <= aMapIndex.Extent(); i++) @@ -1137,10 +1209,10 @@ namespace SMESH QString& theName) { theName = ""; - TColStd_IndexedMapOfInteger aMapIndex; + SVTK_TIndexedMapOfVtkId aMapIndex; theSelector->GetIndex(theIO,aMapIndex); - typedef std::set TIdContainer; + typedef std::set TIdContainer; TIdContainer anIdContainer; for( int i = 1; i <= aMapIndex.Extent(); i++) anIdContainer.insert(aMapIndex(i)); @@ -1155,8 +1227,8 @@ namespace SMESH int GetEdgeNodes(SVTK_Selector* theSelector, const TVisualObjPtr& theVisualObject, - int& theId1, - int& theId2) + ::smIdType& theId1, + ::smIdType& theId2) { const SALOME_ListIO& selected = theSelector->StoredIObjects(); @@ -1167,14 +1239,14 @@ namespace SMESH if ( anIO.IsNull() || !anIO->hasEntry() ) return -1; - TColStd_IndexedMapOfInteger aMapIndex; + SVTK_TIndexedMapOfVtkId aMapIndex; theSelector->GetIndex( anIO, aMapIndex ); if ( aMapIndex.Extent() != 2 ) return -1; - int anObjId = -1, anEdgeNum = -1; - for ( int i = 1; i <= aMapIndex.Extent(); i++ ) { - int aVal = aMapIndex( i ); + ::smIdType anObjId = -1, anEdgeNum = -1; + for ( ::smIdType i = 1; i <= aMapIndex.Extent(); i++ ) { + ::smIdType aVal = aMapIndex( i ); if ( aVal > 0 ) anObjId = aVal; else @@ -1256,7 +1328,7 @@ namespace SMESH int GetSelected(LightApp_SelectionMgr* theMgr, TColStd_IndexedMapOfInteger& theMap, - const bool theIsElement) + const bool /*theIsElement*/) { theMap.Clear(); SALOME_ListIO selected; theMgr->selectedObjects( selected ); @@ -1272,7 +1344,7 @@ namespace SMESH } - int GetEdgeNodes( LightApp_SelectionMgr* theMgr, int& theId1, int& theId2 ) + int GetEdgeNodes( LightApp_SelectionMgr* theMgr, ::smIdType& theId1, ::smIdType& theId2 ) { SALOME_ListIO selected; theMgr->selectedObjects( selected ); @@ -1292,9 +1364,9 @@ namespace SMESH if ( aMapIndex.Extent() != 2 ) return -1; - int anObjId = -1, anEdgeNum = -1; - for ( int i = 1; i <= aMapIndex.Extent(); i++ ) { - int aVal = aMapIndex( i ); + ::smIdType anObjId = -1, anEdgeNum = -1; + for ( ::smIdType i = 1; i <= aMapIndex.Extent(); i++ ) { + ::smIdType aVal = aMapIndex( i ); if ( aVal > 0 ) anObjId = aVal; else @@ -1444,7 +1516,7 @@ namespace SMESH //================================================================================ /*! * \brief Find all SMESH_Actor's in the View Window. - * If actor constains Plot2d_Histogram object remove it from each Plot2d Viewer. + * If actor contains Plot2d_Histogram object remove it from each Plot2d Viewer. */ //================================================================================