-// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2021 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
}
}
+ //================================================================================
+ /*!
+ * \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<SMESH_Actor*>( 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<SUIT_ViewWindow*> wndList = desk->windows();
+ SUIT_ViewWindow* wnd;
+ foreach ( wnd, wndList )
+ SMESH::UpdateActorsAfterUpdateStudy(wnd);
+ }
+ }
+
//================================================================================
/*!
* \brief Notify the user on problems during visualization
*/
//================================================================================
- 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();
if (!aStudy)
return OK;
+ SUIT_ResourceMgr* resMgr;
{
OK = true;
vtkRenderer *aRenderer = aViewWnd->getRenderer();
}
aStudy->setVisibilityStateForAll(Qtx::HiddenState);
}
+ // fall through
default: {
if (SMESH_Actor *anActor = FindActorByEntry(theWnd,theEntry)) {
switch (theAction) {
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);
if ( (aVisualObj = GetVisualObj(theEntry)) && aVisualObj->IsValid())
{
if ((anActor = CreateActor(theEntry,true))) {
- bool needFitAll = noSmeshActors(theWnd); // fit for the first object only
+ 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;
}
}
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 );
aCollection->InitTraversal();
while ( vtkActor *anAct = aCollection->GetNextActor() ) {
if ( SMESH_Actor *anActor = dynamic_cast<SMESH_Actor*>(anAct) ) {
- anActor->UpdateSelectionProps();
+ anActor->UpdateSelectionProps();
}
}
}
QString& theName)
{
theName = "";
- TColStd_IndexedMapOfInteger aMapIndex;
+ SVTK_TIndexedMapOfVtkId aMapIndex;
theSelector->GetIndex(theIO,aMapIndex);
for(int i = 1; i <= aMapIndex.Extent(); i++)
QString& theName)
{
theName = "";
- TColStd_IndexedMapOfInteger aMapIndex;
+ SVTK_TIndexedMapOfVtkId aMapIndex;
theSelector->GetIndex(theIO,aMapIndex);
- typedef std::set<int> TIdContainer;
+ typedef std::set<vtkIdType> TIdContainer;
TIdContainer anIdContainer;
for( int i = 1; i <= aMapIndex.Extent(); i++)
anIdContainer.insert(aMapIndex(i));
int GetEdgeNodes(SVTK_Selector* theSelector,
const TVisualObjPtr& theVisualObject,
- int& theId1,
- int& theId2)
+ ::smIdType& theId1,
+ ::smIdType& theId2)
{
const SALOME_ListIO& selected = theSelector->StoredIObjects();
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
int GetSelected(LightApp_SelectionMgr* theMgr,
TColStd_IndexedMapOfInteger& theMap,
- const bool theIsElement)
+ const bool /*theIsElement*/)
{
theMap.Clear();
SALOME_ListIO selected; theMgr->selectedObjects( selected );
}
- int GetEdgeNodes( LightApp_SelectionMgr* theMgr, int& theId1, int& theId2 )
+ int GetEdgeNodes( LightApp_SelectionMgr* theMgr, ::smIdType& theId1, ::smIdType& theId2 )
{
SALOME_ListIO selected; theMgr->selectedObjects( selected );
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