1 #include "SalomeApp_VTKSelector.h"
2 #include "SalomeApp_DataOwner.h"
4 #include "SVTK_ViewModel.h"
5 #include "SVTK_Selector.h"
6 #include "SVTK_ViewWindow.h"
7 #include "SVTK_Functor.h"
9 #include "SALOME_Actor.h"
10 #include "SALOME_ListIteratorOfListIO.hxx"
12 #include "VTKViewer_Algorithm.h"
14 #include <vtkRenderer.h>
16 #include "utilities.h"
19 static int MYDEBUG = 1;
21 static int MYDEBUG = 0;
24 SalomeApp_SVTKDataOwner
25 ::SalomeApp_SVTKDataOwner( const Handle(SALOME_InteractiveObject)& theIO,
26 const TColStd_IndexedMapOfInteger& theIds,
27 Selection_Mode theMode,
28 SALOME_Actor* theActor):
29 SalomeApp_DataOwner( theIO ),
30 mySelectionMode(theMode),
33 myIds = theIds; // workaround - there is no constructor copy for the container
36 SalomeApp_SVTKDataOwner
37 ::~SalomeApp_SVTKDataOwner()
42 SalomeApp_SVTKDataOwner
45 return myActor.GetPointer();
50 ::SalomeApp_VTKSelector( SVTK_Viewer* viewer,
51 SUIT_SelectionMgr* mgr ):
52 SUIT_Selector( mgr, viewer ),
56 connect( myViewer, SIGNAL( selectionChanged() ), this, SLOT( onSelectionChanged() ) );
60 ::~SalomeApp_VTKSelector()
75 return SVTK_Viewer::Type();
80 ::onSelectionChanged()
87 ::getSelection( SUIT_DataOwnerPtrList& aList ) const
90 if(SUIT_ViewManager* aViewMgr = myViewer->getViewManager()){
91 if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewMgr->getActiveView())){
92 if(SVTK_Selector* aSelector = aView->GetSelector()){
93 Selection_Mode aMode = aSelector->SelectionMode();
94 const SALOME_ListIO& aListIO = aSelector->StoredIObjects();
95 SALOME_ListIteratorOfListIO anIter(aListIO);
96 for(; anIter.More(); anIter.Next()){
97 Handle(SALOME_InteractiveObject) anIO = anIter.Value();
99 TColStd_IndexedMapOfInteger anIds;
100 aSelector->GetIndex(anIO,anIds);
101 SALOME_Actor* anActor = aSelector->GetActor(anIO);
103 anActor = VTK::Find<SALOME_Actor>(aView->getRenderer()->GetActors(),VTK::TIsSameIObject<SALOME_Actor>(anIO));
105 aList.append(new SalomeApp_SVTKDataOwner(anIO,anIds,aMode,anActor));
106 if(MYDEBUG) MESSAGE("VTKSelector::getSelection - "<<anIO->getEntry());
116 SalomeApp_VTKSelector
117 ::setSelection( const SUIT_DataOwnerPtrList& theList )
120 if(SUIT_ViewManager* aViewMgr = myViewer->getViewManager()){
121 if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewMgr->getActiveView())){
122 if(SVTK_Selector* aSelector = aView->GetSelector()){
123 SALOME_ListIO anAppendList;
124 const SALOME_ListIO& aStoredList = aSelector->StoredIObjects();
125 SUIT_DataOwnerPtrList::const_iterator anIter = theList.begin();
126 for(; anIter != theList.end(); ++anIter){
127 const SUIT_DataOwner* aDataOwner = (*anIter).get();
128 if(const SalomeApp_SVTKDataOwner* anOwner = dynamic_cast<const SalomeApp_SVTKDataOwner*>(aDataOwner)){
129 aSelector->SetSelectionMode(anOwner->GetMode());
130 Handle(SALOME_InteractiveObject) anIO = anOwner->IO();
132 if( anOwner->GetActor() )
133 aSelector->AddIObject( anOwner->GetActor() );
135 aSelector->AddIObject(anIO);
137 anAppendList.Append(anIO);
138 aSelector->AddOrRemoveIndex(anIO,anOwner->GetIds(),false);
139 if(MYDEBUG) MESSAGE("VTKSelector::setSelection - SVTKDataOwner - "<<anIO->getEntry());
140 }else if(const SalomeApp_DataOwner* anOwner = dynamic_cast<const SalomeApp_DataOwner*>(aDataOwner)){
141 Handle(SALOME_InteractiveObject) anIO =
142 new SALOME_InteractiveObject(anOwner->entry().latin1(),"");
143 aSelector->AddIObject(anIO);
144 anAppendList.Append(anIO);
145 if(MYDEBUG) MESSAGE("VTKSelector::setSelection - DataOwner - "<<anIO->getEntry());
148 // To remove IOs, which is not selected.
149 QMap< QString, Handle( SALOME_InteractiveObject )> toRemove;
150 SALOME_ListIteratorOfListIO anIt( aStoredList );
151 for( ; anIt.More(); anIt.Next() )
152 if( !anIt.Value().IsNull() )
153 toRemove[ anIt.Value()->getEntry() ] = anIt.Value();
155 anIt = SALOME_ListIteratorOfListIO(anAppendList);
156 for( ; anIt.More(); anIt.Next() )
157 toRemove.remove( anIt.Value()->getEntry() );
159 QMap< QString, Handle( SALOME_InteractiveObject )>::const_iterator RIt = toRemove.begin(),
160 REnd = toRemove.end();
161 for( ; RIt!=REnd; RIt++ )
162 aSelector->RemoveIObject( RIt.data() );
164 aView->onSelectionChanged();