1 // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License.
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
22 // File : SMESHGUI_SelectionOp.cxx
23 // Author : Alexander SOLOVYOV
26 #include <SMESHGUI_SelectionOp.h>
27 #include <SMESHGUI_VTKUtils.h>
28 #include <SMESHGUI_MeshUtils.h>
29 #include <SMESHGUI_Selection.h>
31 #include <SUIT_SelectionFilter.h>
32 #include <SalomeApp_SelectionMgr.h>
33 #include <SalomeApp_Study.h>
34 #include <SalomeApp_VTKSelector.h>
35 #include <SVTK_ViewWindow.h>
36 #include <SVTK_ViewModel.h>
37 #include <SVTK_Selector.h>
38 #include <SMESH_Actor.h>
40 #include <SMDS_Mesh.hxx>
41 #include <SMDS_MeshNode.hxx>
43 #include CORBA_SERVER_HEADER(GEOM_Gen)
44 #include <SALOMEDS_SObject.hxx>
47 Class : SMESHGUI_SelectionOp
48 Description : Base operation for all operations using object selection in viewer or objectbrowser
49 through common widgets created by SalomeApp_Dialog::createObject
52 //=================================================================================
53 // name : SMESHGUI_SelectionOp
55 //=================================================================================
56 SMESHGUI_SelectionOp::SMESHGUI_SelectionOp( const Selection_Mode mode )
57 : SMESHGUI_Operation(),
58 myDefSelectionMode( mode )
62 //=================================================================================
63 // name : ~SMESHGUI_SelectionOp
65 //=================================================================================
66 SMESHGUI_SelectionOp::~SMESHGUI_SelectionOp()
68 Filters::const_iterator anIt = myFilters.begin(),
69 aLast = myFilters.end();
70 for( ; anIt!=aLast; anIt++ )
75 //=================================================================================
76 // name : startOperation
78 //=================================================================================
79 void SMESHGUI_SelectionOp::startOperation()
81 SMESHGUI_Operation::startOperation();
84 disconnect( dlg(), SIGNAL( objectActivated( int ) ), this, SLOT( onActivateObject( int ) ) );
85 disconnect( dlg(), SIGNAL( objectDeactivated( int ) ), this, SLOT( onDeactivateObject( int ) ) );
86 disconnect( dlg(), SIGNAL( selectionChanged( int ) ), this, SLOT( onSelectionChanged( int ) ) );
87 connect( dlg(), SIGNAL( objectActivated( int ) ), this, SLOT( onActivateObject( int ) ) );
88 connect( dlg(), SIGNAL( objectDeactivated( int ) ), this, SLOT( onDeactivateObject( int ) ) );
89 connect( dlg(), SIGNAL( selectionChanged( int ) ), this, SLOT( onSelectionChanged( int ) ) );
92 myOldSelectionMode = selectionMode();
93 setSelectionMode( myDefSelectionMode );
96 //=================================================================================
97 // name : removeCustomFilters
99 //=================================================================================
100 void SMESHGUI_SelectionOp::removeCustomFilters() const
102 SalomeApp_SelectionMgr* mgr = selectionMgr();
106 Filters::const_iterator anIt = myFilters.begin(),
107 aLast = myFilters.end();
108 for( ; anIt!=aLast; anIt++ )
110 mgr->removeFilter( anIt.data() );
113 //=================================================================================
114 // name : commitOperation
116 //=================================================================================
117 void SMESHGUI_SelectionOp::commitOperation()
119 removeCustomFilters();
120 setSelectionMode( myOldSelectionMode );
121 SMESHGUI_Operation::commitOperation();
124 //=================================================================================
125 // name : abortOperation
127 //=================================================================================
128 void SMESHGUI_SelectionOp::abortOperation()
130 removeCustomFilters();
131 setSelectionMode( myOldSelectionMode );
132 SMESHGUI_Operation::abortOperation();
135 //=================================================================================
136 // name : selectionDone
138 //=================================================================================
139 void SMESHGUI_SelectionOp::selectionDone()
144 if( selectionMode()!=ActorSelection )
147 selectionMgr()->selectedObjects( aList, SVTK_Viewer::Type() );
149 if( aList.Extent() != 1 ) //we can select nodes or elements only within one mesh
151 dlg()->clearSelection();
156 QStringList names, ids;
157 SalomeApp_Dialog::TypesList types;
158 selected( names, types, ids );
159 dlg()->selectObject( names, types, ids );
162 //=================================================================================
163 // name : createFilter
165 //=================================================================================
166 SUIT_SelectionFilter* SMESHGUI_SelectionOp::createFilter( const int ) const
171 //=================================================================================
172 // name : onActivateObject
174 //=================================================================================
175 void SMESHGUI_SelectionOp::onActivateObject( int id )
177 SalomeApp_SelectionMgr* mgr = selectionMgr();
181 if( !myFilters.contains( id ) )
182 myFilters[ id ] = createFilter( id );
184 if( myFilters[ id ] )
185 mgr->installFilter( myFilters[ id ] );
190 //=================================================================================
191 // name : onDeactivateObject
193 //=================================================================================
194 void SMESHGUI_SelectionOp::onDeactivateObject( int id )
196 SalomeApp_SelectionMgr* mgr = selectionMgr();
197 if( mgr && myFilters.contains( id ) && myFilters[ id ] )
198 mgr->removeFilter( myFilters[ id ] );
201 //=================================================================================
204 //=================================================================================
205 void SMESHGUI_SelectionOp::initDialog()
209 dlg()->clearSelection();
210 dlg()->deactivateAll();
214 //=================================================================================
217 //=================================================================================
218 void SMESHGUI_SelectionOp::onSelectionChanged( int )
222 //=======================================================================
223 // name : selectionMode
224 // Purpose : Returns selection mode
225 //=======================================================================
226 Selection_Mode SMESHGUI_SelectionOp::selectionMode() const
228 SVTK_ViewWindow* wnd = viewWindow();
230 return wnd->SelectionMode();
232 return ActorSelection;
235 //=======================================================================
236 // name : setSelectionMode
237 // Purpose : Set selection mode
238 //=======================================================================
239 void SMESHGUI_SelectionOp::setSelectionMode( const Selection_Mode mode )
241 SVTK_ViewWindow* wnd = viewWindow();
243 wnd->SetSelectionMode( mode );
246 //=======================================================================
248 // Purpose : Highlight object in 3d viewer
249 //=======================================================================
250 void SMESHGUI_SelectionOp::highlight( const Handle( SALOME_InteractiveObject )& obj,
251 const bool hilight, const bool immediately )
253 SVTK_ViewWindow* wnd = viewWindow();
255 wnd->highlight( obj, hilight, immediately );
258 //=======================================================================
259 // name : addOrRemoveIndex
260 // Purpose : Select/deselect cells of mesh
261 //=======================================================================
262 void SMESHGUI_SelectionOp::addOrRemoveIndex( const Handle( SALOME_InteractiveObject )& obj,
263 const TColStd_MapOfInteger& indices,
264 const bool isModeShift )
266 SVTK_Selector* sel = selector();
268 sel->AddOrRemoveIndex( obj, indices, isModeShift );
271 //=======================================================================
273 // Purpose : Get active view window
274 //=======================================================================
275 SVTK_ViewWindow* SMESHGUI_SelectionOp::viewWindow() const
277 return SMESH::GetViewWindow( getSMESHGUI() );
280 //=======================================================================
282 // Purpose : Get selector
283 //=======================================================================
284 SVTK_Selector* SMESHGUI_SelectionOp::selector() const
286 SVTK_ViewWindow* wnd = viewWindow();
287 return wnd ? wnd->GetSelector() : 0;
290 //=======================================================================
292 // Purpose : Find type by id
293 //=======================================================================
294 int SMESHGUI_SelectionOp::typeById( const QString& str, const EntityType objtype ) const
296 SalomeApp_Study* _study = dynamic_cast<SalomeApp_Study*>( study() );
300 _PTR( Study ) st = _study->studyDS();
303 if( objtype == Object )
305 SalomeApp_Study* _study = dynamic_cast<SalomeApp_Study*>( study() );
308 int t = SMESHGUI_Selection::type( str, _study->studyDS() );
311 //try to get GEOM type
312 _PTR( SObject ) sobj = st->FindObjectID( str.latin1() );
315 GEOM::GEOM_Object_var obj = GEOM::GEOM_Object::_narrow(
316 dynamic_cast<SALOMEDS_SObject*>( sobj.get() )->GetObject() );
317 if( !CORBA::is_nil( obj ) )
318 res = SMESHGUI_Dialog::prefix( "GEOM" ) + obj->GetType();
322 res = SMESHGUI_Dialog::prefix( "SMESH" ) + t;
327 int pos = str.find( idChar() );
328 QString entry = str.left( pos ),
329 _id = str.mid( pos+1 );
331 int id = _id.toInt( &ok );
334 _PTR( SObject ) sobj = st->FindObjectID( entry.latin1() );
335 SMESH::SMESH_Mesh_var mesh = SMESH::SMESH_Mesh::_narrow(
336 dynamic_cast<SALOMEDS_SObject*>( sobj.get() )->GetObject() );
337 SMESH::SMESH_subMesh_var submesh = SMESH::SMESH_subMesh::_narrow(
338 dynamic_cast<SALOMEDS_SObject*>( sobj.get() )->GetObject() );
339 if( !CORBA::is_nil( mesh ) )
340 res = SMESHGUI_Dialog::prefix( "SMESH element" ) +
341 mesh->GetElementType( id, objtype==MeshElement );
343 else if( !CORBA::is_nil( submesh ) )
344 res = SMESHGUI_Dialog::prefix( "SMESH element" ) +
345 submesh->GetElementType( id, objtype==MeshElement );
352 //=======================================================================
354 // Purpose : Get names, types and ids of selected objects
355 //=======================================================================
356 void SMESHGUI_SelectionOp::selected( QStringList& names,
357 SalomeApp_Dialog::TypesList& types,
358 QStringList& ids ) const
360 SUIT_DataOwnerPtrList list; selectionMgr()->selected( list );
361 SUIT_DataOwnerPtrList::const_iterator anIt = list.begin(),
363 for( ; anIt!=aLast; anIt++ )
365 SalomeApp_DataOwner* owner = dynamic_cast<SalomeApp_DataOwner*>( (*anIt).operator->() );
366 SalomeApp_SVTKDataOwner* vtkowner = dynamic_cast<SalomeApp_SVTKDataOwner*>( (*anIt).operator->() );
370 QString id_str = QString( "%1%2%3" ).arg( vtkowner->entry() ).arg( idChar() ), current_id_str;
371 Selection_Mode mode = vtkowner->GetMode();
372 EntityType objtype = mode == NodeSelection ? MeshNode : MeshElement;
373 const TColStd_IndexedMapOfInteger& ownerids = vtkowner->GetIds();
375 for( int i=1, n=ownerids.Extent(); i<=n; i++ )
377 int curid = ownerids( i );
378 current_id_str = id_str.arg( curid );
379 ids.append( current_id_str );
380 types.append( typeById( current_id_str, objtype ) );
381 names.append( QString( "%1" ).arg( curid ) );
387 QString id = owner->entry();
389 types.append( typeById( id, Object ) );
390 names.append( owner->IO()->getName() );
395 //=======================================================================
397 // Purpose : Char using to divide <entry> and <id> in string id representation. By default, '#'
398 //=======================================================================
399 QChar SMESHGUI_SelectionOp::idChar() const
404 //=================================================================================
407 //=================================================================================
408 SMESH::SMESH_Mesh_var SMESHGUI_SelectionOp::mesh() const
410 if( selectionMode()==ActorSelection )
411 return SMESH::SMESH_Mesh::_nil();
413 SALOME_ListIO sel; selectionMgr()->selectedObjects( sel, SVTK_Viewer::Type() );
414 if( sel.Extent()==1 )
415 return SMESH::GetMeshByIO( sel.First() );
417 return SMESH::SMESH_Mesh::_nil();
420 //=================================================================================
423 //=================================================================================
424 SMESH_Actor* SMESHGUI_SelectionOp::actor() const
426 SMESH::SMESH_Mesh_var m = mesh();
428 return SMESH::FindActorByObject( m.in() );
433 //=================================================================================
434 // name : onTextChanged
436 //=================================================================================
437 void SMESHGUI_SelectionOp::onTextChanged( int, const QStringList& list )
442 TColStd_MapOfInteger newIndices;
444 SALOME_ListIO sel; selectionMgr()->selectedObjects( sel );
445 SMESH_Actor* anActor = actor();
446 if( sel.Extent()==0 || !anActor )
449 SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh();
451 IdList ids; extractIds( list, ids, '\0' );
452 IdList::const_iterator anIt = ids.begin(),
454 for( ; anIt!=aLast; anIt++ )
455 if( const SMDS_MeshNode * n = aMesh->FindNode( *anIt ) )
456 newIndices.Add( n->GetID() );
458 selector()->AddOrRemoveIndex( sel.First(), newIndices, false );
459 highlight( sel.First(), true, true );
461 QStringList names, _ids; SalomeApp_Dialog::TypesList types;
462 selected( names, types, _ids );
463 dlg()->selectObject( names, types, _ids, false );
466 //=================================================================================
467 // name : selectedIds
469 //=================================================================================
470 void SMESHGUI_SelectionOp::selectedIds( const int id, IdList& list ) const
475 QStringList ids; dlg()->selectedObject( id, ids );
476 extractIds( ids, list );
479 //=================================================================================
482 //=================================================================================
483 void SMESHGUI_SelectionOp::extractIds( const QStringList& ids, IdList& list, const QChar idchar )
485 QStringList::const_iterator anIt = ids.begin(),
488 for( ; anIt!=aLast; anIt++ )
491 int pos = idchar=='\0' ? -1 : id_str.find( idchar );
493 if( idchar=='\0' || pos>=0 )
495 id = id_str.mid( pos+1 ).toInt();
501 //=================================================================================
504 //=================================================================================
505 void SMESHGUI_SelectionOp::extractIds( const QStringList& ids, IdList& list ) const
507 extractIds( ids, list, idChar() );