1 // Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 // GEOM GEOMGUI : GUI for Geometry component
23 // File : GroupGUI_GroupDlg.cxx
24 // Author : Sergey ANIKIN, Open CASCADE S.A.S. (sergey.anikin@opencascade.com)
26 #include "GroupGUI_GroupDlg.h"
28 #include <LightApp_SelectionMgr.h>
29 #include <SUIT_ResourceMgr.h>
30 #include <SUIT_Desktop.h>
31 #include <SUIT_OverrideCursor.h>
32 #include <SUIT_Session.h>
33 #include <SalomeApp_Application.h>
34 #include <SalomeApp_Study.h>
38 #include <GeometryGUI.h>
39 #include <GEOMImpl_Types.hxx>
40 #include <GEOM_Displayer.h>
43 #include <QListWidget>
47 #include <TColStd_IndexedMapOfInteger.hxx>
48 #include <TColStd_MapOfInteger.hxx>
49 #include <TColStd_DataMapIteratorOfDataMapOfIntegerInteger.hxx>
51 enum { ALL_SUBSHAPES = 0, GET_IN_PLACE, SUBSHAPES_OF_SHAPE2, SUBSHAPES_OF_INVISIBLE_SHAPE2 };
53 GroupGUI_GroupDlg::GroupGUI_GroupDlg( Mode mode, GeometryGUI* theGeometryGUI, QWidget* parent )
54 : GEOMBase_Skeleton( theGeometryGUI, parent, false ),
57 myIsShapeType( false )
59 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
61 QPixmap image0 ( resMgr->loadPixmap( "GEOM", tr( "ICON_OBJBROWSER_VERTEX" ) ) );
62 QPixmap image1 ( resMgr->loadPixmap( "GEOM", tr( "ICON_OBJBROWSER_EDGE" ) ) );
63 QPixmap image2 ( resMgr->loadPixmap( "GEOM", tr( "ICON_OBJBROWSER_FACE" ) ) );
64 QPixmap image3 ( resMgr->loadPixmap( "GEOM", tr( "ICON_OBJBROWSER_SOLID" ) ) );
65 QPixmap iconSelect ( resMgr->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) );
67 setWindowTitle( myMode == CreateGroup ? tr( "CREATE_GROUP_TITLE" ) : tr( "EDIT_GROUP_TITLE" ) );
69 // Shape type button group
70 mainFrame()->GroupConstructors->setEnabled( myMode == CreateGroup );
71 mainFrame()->GroupConstructors->setTitle( tr( "SHAPE_TYPE" ) );
72 mainFrame()->RadioButton1->setIcon( image0 );
73 mainFrame()->RadioButton2->setIcon( image1 );
74 mainFrame()->RadioButton3->setIcon( image2 );
75 mainFrame()->RadioButton4->setIcon( image3 );
76 mainFrame()->RadioButton4->show();
79 mainFrame()->GroupBoxName->setTitle( tr( "GROUP_NAME" ) );
81 // Main shape and sub-shapes
82 QGroupBox* GroupMedium = new QGroupBox( tr( "MAIN_SUB_SHAPES" ), centralWidget() );
83 QGridLayout* aMedLayout = new QGridLayout( GroupMedium );
84 aMedLayout->setMargin( 9 );
85 aMedLayout->setSpacing( 6 );
87 QLabel* aMainLabel = new QLabel( tr( "MAIN_SHAPE" ), GroupMedium );
89 mySelBtn = new QPushButton( GroupMedium );
90 mySelBtn->setIcon( iconSelect );
91 mySelBtn->setEnabled( myMode == CreateGroup );
93 myMainName = new QLineEdit( GroupMedium );
94 myMainName->setReadOnly( true );
95 myMainName->setEnabled( myMode == CreateGroup );
97 QLabel* aSecondLabel = new QLabel( tr( "SECOND_SHAPE" ), GroupMedium );
99 mySelBtn2 = new QPushButton( GroupMedium );
100 mySelBtn2->setIcon( iconSelect );
101 mySelBtn2->setEnabled( false );
103 myShape2Name = new QLineEdit( GroupMedium );
104 myShape2Name->setReadOnly( true );
105 myShape2Name->setEnabled( false );
107 mySelectionWayGroupBox = new QGroupBox( tr("SHAPE_SEL_RESTR"), GroupMedium );
108 mySelectionWayGroup = new QButtonGroup( mySelectionWayGroupBox );
109 QRadioButton* allSubs = new QRadioButton( tr( "NO_RESTR" ) , mySelectionWayGroupBox );
110 QRadioButton* inPlaceSubs = new QRadioButton( tr( "GEOM_PARTS_OF_SHAPE2" ), mySelectionWayGroupBox );
111 QRadioButton* shape2Subs = new QRadioButton( tr( "SUBSHAPES_OF_SHAPE2" ) , mySelectionWayGroupBox );
112 QVBoxLayout* mySelWayLayout = new QVBoxLayout( mySelectionWayGroupBox );
113 mySelWayLayout->setMargin( 9 );
114 mySelWayLayout->setSpacing( 6 );
115 mySelWayLayout->addWidget( allSubs );
116 mySelWayLayout->addWidget( inPlaceSubs );
117 mySelWayLayout->addWidget( shape2Subs );
118 mySelectionWayGroup->addButton( allSubs, ALL_SUBSHAPES );
119 mySelectionWayGroup->addButton( inPlaceSubs, GET_IN_PLACE );
120 mySelectionWayGroup->addButton( shape2Subs, SUBSHAPES_OF_SHAPE2 );
121 allSubs->setChecked( true );
123 mySelAllBtn = new QPushButton( tr( "SELECT_ALL" ), GroupMedium );
124 myAddBtn = new QPushButton( tr( "ADD" ), GroupMedium );
125 myRemBtn = new QPushButton( tr( "REMOVE" ), GroupMedium );
126 myIdList = new QListWidget( GroupMedium );
128 myIdList->setSelectionMode( QAbstractItemView::ExtendedSelection );
129 myIdList->setFlow( QListView::TopToBottom );
130 myIdList->setWrapping( true );
132 aMedLayout->addWidget( aMainLabel, 0, 0 );
133 aMedLayout->addWidget( mySelBtn, 0, 1 );
134 aMedLayout->addWidget( myMainName, 0, 2, 1, 2 );
135 aMedLayout->addWidget( aSecondLabel, 1, 0 );
136 aMedLayout->addWidget( mySelBtn2, 1, 1 );
137 aMedLayout->addWidget( myShape2Name, 1, 2, 1, 2 );
138 aMedLayout->addWidget( mySelectionWayGroupBox, 2, 0, 3, 3 );
139 aMedLayout->addWidget( mySelAllBtn, 2, 3 );
140 aMedLayout->addWidget( myAddBtn, 3, 3 );
141 aMedLayout->addWidget( myRemBtn, 4, 3 );
142 aMedLayout->addWidget( myIdList, 5, 0, 1, 4 );
143 aMedLayout->setRowStretch( 5, 1 );
145 QVBoxLayout* layout = new QVBoxLayout( centralWidget() );
146 layout->setMargin( 0 ); layout->setSpacing( 6 );
147 layout->addWidget( GroupMedium );
149 setHelpFileName( "work_with_groups_page.html" );
154 GroupGUI_GroupDlg::~GroupGUI_GroupDlg()
158 //=================================================================================
161 //=================================================================================
162 void GroupGUI_GroupDlg::Init()
164 // san -- TODO: clear selected sub-shapes...
165 //mySelSubBtn->setChecked( true );
166 LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
168 //unset shape type to avoid preparation of selection before exact user shape type selection
169 //setConstructorId( -1 ); //non valid shape type
170 unsetConstructorId();
171 myIsShapeType = false;
173 if ( myMode == CreateGroup ) {
174 initName( tr( "GROUP_PREFIX" ) );
176 // Get ready for main shape selection
177 myEditCurrentArgument = myMainName;
179 connect( this, SIGNAL( constructorsClicked( int ) ), this, SLOT( ConstructorsClicked( int ) ) );
180 connect( mySelBtn, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) );
181 connect( mySelBtn2, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) );
183 else if (myMode == EditGroup) {
184 SALOME_ListIO aSelList;
185 aSelMgr->selectedObjects(aSelList);
187 if (aSelList.Extent()) {
188 Standard_Boolean aResult = Standard_False;
189 GEOM::GEOM_Object_var anObj =
190 GEOMBase::ConvertIOinGEOMObject(aSelList.First(), aResult);
192 if ( aResult && !CORBA::is_nil( anObj ) && anObj->GetType() == GEOM_GROUP ) {
195 mainFrame()->ResultName->setText( GEOMBase::GetName( myGroup ) );
197 GEOM::GEOM_IGroupOperations_var anOper = GEOM::GEOM_IGroupOperations::_narrow( getOperation() );
198 myMainObj = anOper->GetMainShape( myGroup );
199 if ( !CORBA::is_nil( myMainObj ) )
200 myMainName->setText( GEOMBase::GetName( myMainObj ) );
202 setShapeType( (TopAbs_ShapeEnum)anOper->GetType( myGroup ) );
204 GEOM::ListOfLong_var aCurrList = anOper->GetObjects( myGroup );
205 for ( int i = 0, n = aCurrList->length(); i < n; i++ )
206 myIdList->addItem( new QListWidgetItem( QString( "%1" ).arg( aCurrList[i] ) ) );
208 myEditCurrentArgument = 0;
210 connect( mySelBtn2, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) );
214 connect( aSelMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()) );
216 connect( buttonOk(), SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) );
217 connect( buttonApply(), SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) );
219 connect( mySelectionWayGroup, SIGNAL( buttonClicked( int ) ), this, SLOT( SetEditCurrentArgument() ) );
220 connect( mySelAllBtn, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) );
221 connect( myAddBtn, SIGNAL( clicked() ), this, SLOT( add() ) );
222 connect( myRemBtn, SIGNAL( clicked() ), this, SLOT( remove() ) );
223 connect( myIdList, SIGNAL( itemSelectionChanged() ), this, SLOT( selectionChanged() ) );
225 setInPlaceObj(GEOM::GEOM_Object::_nil());
227 myBusy = true; // just activate but do not select in the list
232 //=================================================================================
233 // function : enterEvent()
235 //=================================================================================
236 void GroupGUI_GroupDlg::enterEvent( QEvent* e )
238 if ( !buttonCancel()->isEnabled() )
239 ActivateThisDialog();
242 //=======================================================================
243 //function : closeEvent
244 //purpose : remove temporary geom object
245 //=======================================================================
247 void GroupGUI_GroupDlg::closeEvent( QCloseEvent* e )
249 setInPlaceObj( GEOM::GEOM_Object::_nil() );
251 GEOMBase_Skeleton::closeEvent( e );
254 //=================================================================================
255 // function : ClickOnOk()
257 //=================================================================================
258 void GroupGUI_GroupDlg::ClickOnOk()
260 if ( ClickOnApply() )
264 //=================================================================================
265 // function : ClickOnApply()
267 //=================================================================================
268 bool GroupGUI_GroupDlg::ClickOnApply()
270 if ( !onAccept( myMode == CreateGroup, true ) )
273 if ( myMode == CreateGroup )
277 ConstructorsClicked( getConstructorId() );
284 //=================================================================================
285 // function : ActivateThisDialog()
287 //=================================================================================
288 void GroupGUI_GroupDlg::ActivateThisDialog()
290 GEOMBase_Skeleton::ActivateThisDialog();
292 connect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(),
293 SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) );
298 //=================================================================================
299 // function : LineEditReturnPressed()
301 //=================================================================================
302 void GroupGUI_GroupDlg::LineEditReturnPressed()
304 QLineEdit* send = ( QLineEdit* )sender();
306 if ( send == myMainName && !myEditCurrentArgument ) {
307 myEditCurrentArgument = myMainName;
311 GEOMBase_Skeleton::LineEditReturnPressed();
316 //=================================================================================
317 // function : SetEditCurrentArgument()
319 //=================================================================================
320 void GroupGUI_GroupDlg::SetEditCurrentArgument()
322 QPushButton* send = (QPushButton*)sender();
324 if ( send == mySelBtn ) {
325 myEditCurrentArgument = myMainName;
326 myShape2Name->setText( "" );
328 else if ( /*(QRadioButton*)sender() == mySelSubBtn ||*/ send == mySelAllBtn )
329 myEditCurrentArgument = 0;
330 else if ( send == mySelBtn2 || sender() == mySelectionWayGroup ) {
331 setInPlaceObj( GEOM::GEOM_Object::_nil() );
332 //if ( myPlaceCheckBox->isChecked() )
333 myShape2Name->setText( "" );
334 if ( subSelectionWay() != ALL_SUBSHAPES )
336 myEditCurrentArgument = myShape2Name;
339 //myEditCurrentArgument = myMainName;
340 myEditCurrentArgument = 0;
346 if ( send == mySelAllBtn ) {
347 // myShape2Name->setText( "" );
348 // myPlaceCheckBox->setChecked( false );
349 // mySelBtn2->setEnabled( false );
350 // myShape2Name->setEnabled( false );
351 selectAllSubShapes();
357 //=================================================================================
358 // function : onGetInPlace()
360 //=================================================================================
361 void GroupGUI_GroupDlg::onGetInPlace()
363 setInPlaceObj( GEOM::GEOM_Object::_nil() );
364 myEditCurrentArgument->setText( "" );
366 bool isBlocked = myIdList->signalsBlocked();
367 myIdList->blockSignals( true );
368 myIdList->clearSelection();
369 myIdList->blockSignals( isBlocked );
371 LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
372 SALOME_ListIO aSelList;
373 aSelMgr->selectedObjects(aSelList);
375 if (aSelList.Extent() != 1)
378 Standard_Boolean aResult = Standard_False;
379 GEOM::GEOM_Object_var anObj =
380 GEOMBase::ConvertIOinGEOMObject(aSelList.First(), aResult);
381 if (aResult && !anObj->_is_nil() && GEOMBase::IsShape(anObj)) {
382 if (!anObj->_is_equivalent(myMainObj) && !anObj->_is_equivalent(myGroup)) {
383 SUIT_OverrideCursor wc;
384 myEditCurrentArgument->setText(GEOMBase::GetName(anObj));
385 GEOM::GEOM_IShapesOperations_var aShapesOp =
386 getGeomEngine()->GetIShapesOperations(getStudyId());
387 if ( subSelectionWay() == GET_IN_PLACE ) {
388 GEOM::GEOM_Object_var aGetInPlaceObj = aShapesOp->GetInPlace(myMainObj, anObj);
389 setInPlaceObj( aGetInPlaceObj );
392 bool isVisible = true;
393 if ( SALOME_View* view = GEOM_Displayer::GetActiveView() )
394 isVisible = view->isVisible( aSelList.First() );
395 setInPlaceObj( anObj, isVisible );
397 myEditCurrentArgument = 0;
398 //myBusy = true; // just activate but do not select in the list
405 //=======================================================================
406 //function : setInPlaceObj
407 //purpose : temporarily add an object to study and remove old InPlaceObj
408 //=======================================================================
410 void GroupGUI_GroupDlg::setInPlaceObj( GEOM::GEOM_Object_var theObj, const bool isVisible )
412 if ( ! myInPlaceObj->_is_equivalent( theObj ) )
414 const char* tmpName = "__InPlaceObj__";
415 // remove old InPlaceObj
416 if ( !myInPlaceObj->_is_nil() ) {
417 if ( myInPlaceObjSelectState == GET_IN_PLACE ||
418 myInPlaceObjSelectState == SUBSHAPES_OF_INVISIBLE_SHAPE2 ) {
419 // hide temporary object or initially invisible shape 2 (issue 0014047)
420 GEOM_Displayer aDisplayer(getStudy());
421 aDisplayer.Erase( myInPlaceObj, true );
423 if (_PTR(SObject) SO = getStudy()->studyDS()->FindObject( tmpName )) {
424 getStudy()->studyDS()->NewBuilder()->RemoveObjectWithChildren( SO );
425 getGeomEngine()->RemoveObject(myInPlaceObj);
428 // publish InPlaceObj to enable localSelection(InPlaceObj)
429 if ( !theObj->_is_nil() && subSelectionWay() == GET_IN_PLACE ) {
430 SALOMEDS::Study_var aStudyDS = GeometryGUI::ClientStudyToStudy(getStudy()->studyDS());
431 SALOMEDS::SObject_var aSO =
432 getGeomEngine()->AddInStudy(aStudyDS, theObj, tmpName, myMainObj);
434 myInPlaceObj = theObj;
436 // build map of indices
437 myMain2InPlaceIndices.Clear();
438 if ( !myInPlaceObj->_is_nil() ) {
439 GEOM::GEOM_IShapesOperations_var aShapesOp = getGeomEngine()->GetIShapesOperations( getStudyId() );
440 GEOM::GEOM_ILocalOperations_var aLocOp = getGeomEngine()->GetILocalOperations( getStudyId() );
442 GEOM::ListOfGO_var aSubObjects = aShapesOp->MakeExplode( myInPlaceObj, getShapeType(), false);
443 for (int i = 0; i < aSubObjects->length(); i++)
445 CORBA::Long aMainIndex = aLocOp->GetSubShapeIndex( myMainObj, aSubObjects[i] );
446 CORBA::Long aPlaceIndex = aLocOp->GetSubShapeIndex( myInPlaceObj, aSubObjects[i] );
447 if ( aMainIndex >= 0 && aPlaceIndex > 0)
448 myMain2InPlaceIndices.Bind( aMainIndex, aPlaceIndex );
451 myInPlaceObjSelectState = subSelectionWay();
452 if ( myInPlaceObjSelectState == SUBSHAPES_OF_SHAPE2 && !isVisible )
453 myInPlaceObjSelectState = SUBSHAPES_OF_INVISIBLE_SHAPE2;
456 //=================================================================================
457 // function : SelectionIntoArgument()
458 // purpose : Called when selection has changed
459 //=================================================================================
460 void GroupGUI_GroupDlg::SelectionIntoArgument()
462 // if (myPlaceCheckBox->isChecked() && myEditCurrentArgument == myShape2Name )
463 if (subSelectionWay() != ALL_SUBSHAPES && myEditCurrentArgument == myShape2Name) {
468 LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
469 SALOME_ListIO aSelList;
470 aSelMgr->selectedObjects(aSelList);
472 if (myEditCurrentArgument == myMainName) { // Selection of a main shape is active
473 myEditCurrentArgument->setText("");
476 if (aSelList.Extent() == 1) {
477 Standard_Boolean aResult = Standard_False;
478 GEOM::GEOM_Object_var anObj =
479 GEOMBase::ConvertIOinGEOMObject(aSelList.First(), aResult);
481 if ( aResult && !anObj->_is_nil() && GEOMBase::IsShape( anObj ) ) {
483 myEditCurrentArgument->setText( GEOMBase::GetName( anObj ) );
484 // activate subshapes selection by default
485 myEditCurrentArgument = 0;
492 myMainObj = GEOM::GEOM_Object::_nil();
494 else { // an attempt to synchronize list box selection with 3d viewer
499 bool isBlocked = myIdList->signalsBlocked();
500 myIdList->blockSignals( true );
501 myIdList->clearSelection();
503 TColStd_IndexedMapOfInteger aMapIndex;
505 LightApp_SelectionMgr::MapEntryOfMapOfInteger aMap;
506 aSelMgr->selectedSubOwners( aMap );
507 if ( aMap.Size() == 1 )
508 aMapIndex = LightApp_SelectionMgr::MapEntryOfMapOfInteger::Iterator( aMap ).Value();
509 bool subselected = aMapIndex.Extent();
511 // convert inPlace indices to main indices
512 //if ( subselected && myPlaceCheckBox->isChecked() )
513 if ( subselected && subSelectionWay() != ALL_SUBSHAPES )
515 TColStd_IndexedMapOfInteger aMapIndex2;
517 TColStd_DataMapIteratorOfDataMapOfIntegerInteger m2ip( myMain2InPlaceIndices );
518 for ( ; m2ip.More(); m2ip.Next() ) {
519 int inPlaceId = m2ip.Value();
520 if ( aMapIndex.Contains( inPlaceId )) {
521 aMapIndex2.Add( m2ip.Key() );
524 aMapIndex = aMapIndex2;
527 // try to find out and process the object browser selection
528 if ( !subselected ) {
529 globalSelection( GEOM_ALLSHAPES );
531 GEOM::ListOfGO anObjects;
532 GEOMBase::ConvertListOfIOInListOfGO(aSelList, anObjects);
534 GEOM::GEOM_ILocalOperations_var aLocOp = getGeomEngine()->GetILocalOperations( getStudyId() );
535 GEOM::GEOM_IShapesOperations_var aShapesOp = getGeomEngine()->GetIShapesOperations( getStudyId() );
537 for (int i = 0; i < anObjects.length(); i++)
539 GEOM::GEOM_Object_var aGeomObj = anObjects[i];
540 GEOM::ListOfGO_var aSubObjects = new GEOM::ListOfGO();
542 if ( GEOMBase::GetShape(aGeomObj, aShape, getShapeType()) )
544 aSubObjects->length(1);
545 aSubObjects[0] = aGeomObj;
547 else if (aGeomObj->GetType() == GEOM_GROUP)
548 aSubObjects = aShapesOp->MakeExplode( aGeomObj, getShapeType(), false);
552 for (int i = 0; i < aSubObjects->length(); i++)
555 if ( GEOMBase::GetShape(aSubObjects[i], aShape, getShapeType()) )
558 anIndex = aLocOp->GetSubShapeIndex( myMainObj, aSubObjects[i] );
559 if ( anIndex >= 0 ) {
560 //if ( myPlaceCheckBox->isChecked() && ! myMain2InPlaceIndices.IsBound( anIndex ))
561 if ( subSelectionWay() != ALL_SUBSHAPES &&
562 ! myMain2InPlaceIndices.IsBound( anIndex ))
564 aMapIndex.Add( anIndex );
569 if ( !myMainObj->_is_nil() && myIsShapeType/*&& mySelSubBtn->isChecked()*/)
570 if ( subSelectionWay() == ALL_SUBSHAPES )
571 localSelection( myMainObj, getShapeType() );
572 else if ( !myInPlaceObj->_is_nil() )
573 localSelection( myInPlaceObj, getShapeType() );
576 if (aMapIndex.Extent() >= 1) {
578 for ( int i = 0, n = myIdList->count(); i < n; i++ )
579 aMap.insert( myIdList->item( i )->text().toInt(), i );
581 for ( int ii = 1, nn = aMapIndex.Extent(); ii <= nn; ii++ ) {
582 if ( aMap.contains( aMapIndex( ii ) ) )
583 myIdList->item( aMap[aMapIndex( ii )])->setSelected( true );
586 myIdList->blockSignals( isBlocked );
592 //=================================================================================
593 // function : ConstructorsClicked()
594 // purpose : Radio button management
595 //=================================================================================
596 void GroupGUI_GroupDlg::ConstructorsClicked( int constructorId )
598 if (!myIsShapeType && getConstructorId() != constructorId)
599 setConstructorId( constructorId );
600 myIsShapeType = true;
604 setInPlaceObj( myInPlaceObj ); // to rebuild myMain2InPlaceIndices
607 //=================================================================================
608 // function : selectAllSubShapes
610 //=================================================================================
611 void GroupGUI_GroupDlg::selectAllSubShapes()
613 if ( CORBA::is_nil( myMainObj ) || !myIsShapeType )
616 GEOM::ListOfLong_var aSubShapes;
618 // if ( !myPlaceCheckBox->isChecked() )
619 if ( subSelectionWay() == ALL_SUBSHAPES )
621 if ( !myIsShapeType )
624 GEOM::GEOM_IShapesOperations_var aShOp = getGeomEngine()->GetIShapesOperations( getStudyId() );
625 aSubShapes = aShOp->SubShapeAllIDs(myMainObj, getShapeType(), false);
627 if ( !aShOp->IsDone() )
632 aSubShapes = new GEOM::ListOfLong();
633 aSubShapes->length( myMain2InPlaceIndices.Extent() );
634 TColStd_DataMapIteratorOfDataMapOfIntegerInteger m2ip( myMain2InPlaceIndices );
635 for ( int i = 0; m2ip.More(); i++, m2ip.Next() )
636 aSubShapes[ i ] = m2ip.Key();
638 bool isBlocked = myIdList->signalsBlocked();
639 myIdList->blockSignals( true );
641 for ( int i = 0, n = aSubShapes->length(); i < n; i++ ) {
642 CORBA::Long anIndex = aSubShapes[i];
646 QListWidgetItem* anItem = 0;
647 QString text = QString( "%1" ).arg( anIndex );
648 if ( !myInPlaceObj->_is_nil() ) {
649 QList<QListWidgetItem*> found = myIdList->findItems( text, Qt::MatchExactly );
650 if ( found.count() ) anItem = found[0];
653 anItem = new QListWidgetItem( text );
654 myIdList->addItem( anItem );
656 anItem->setSelected( true );
659 myIdList->blockSignals( isBlocked );
660 highlightSubShapes();
663 //=================================================================================
666 //=================================================================================
667 void GroupGUI_GroupDlg::add()
669 TColStd_MapOfInteger aMap;
670 for ( int i = 0, n = myIdList->count(); i < n; i++ )
671 aMap.Add( myIdList->item( i )->text().toInt() );
673 TColStd_IndexedMapOfInteger aMapIndex;
675 SALOME_ListIO aSelIOs;
676 SalomeApp_Application* app = myGeomGUI->getApp();
678 LightApp_SelectionMgr* aSelMgr = app->selectionMgr();
680 LightApp_SelectionMgr::MapEntryOfMapOfInteger aMap;
681 aSelMgr->selectedSubOwners( aMap );
682 if ( aMap.Size() == 1 )
683 aMapIndex = LightApp_SelectionMgr::MapEntryOfMapOfInteger::Iterator( aMap ).Value();
684 else { // selected the same subshape as the main object
685 SALOME_ListIO aSelList;
686 TColStd_IndexedMapOfInteger aMap;
687 aSelMgr->selectedObjects(aSelList);
688 if (aSelList.Extent() == 1) {
689 Standard_Boolean aRes = Standard_False;
690 GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject(aSelList.First(), aRes);
691 if ( aSelectedObject->_is_equivalent(myMainObj) )
692 aMapIndex.Add(1); // add index of the only subshape of selected type
697 GEOM::ListOfGO anObjects;
698 // get selected sub-shapes of myInPlaceObj
699 if ( aMapIndex.Extent() > 0 && !myInPlaceObj->_is_nil() )
701 GEOM::GEOM_IShapesOperations_var aShapesOp = getGeomEngine()->GetIShapesOperations( getStudyId() );
703 anObjects.length( aMapIndex.Extent() );
704 for ( int i = 1; i <= aMapIndex.Extent(); i++ )
705 anObjects[ i-1 ] = aShapesOp->GetSubShape( myInPlaceObj, aMapIndex( i ));
710 // try to find out and process the object browser selection or InPlace sub-shapes
711 if ( !aMapIndex.Extent() )
713 if ( anObjects.length() == 0 )
714 GEOMBase::ConvertListOfIOInListOfGO(aSelIOs, anObjects);
716 GEOM::GEOM_ILocalOperations_var aLocOp = getGeomEngine()->GetILocalOperations( getStudyId() );
717 GEOM::GEOM_IShapesOperations_var aShapesOp = getGeomEngine()->GetIShapesOperations( getStudyId() );
719 for (int i = 0; i < anObjects.length(); i++)
721 GEOM::GEOM_Object_var aGeomObj = anObjects[i];
722 GEOM::ListOfGO_var aSubObjects = new GEOM::ListOfGO();
724 if ( GEOMBase::GetShape(aGeomObj, aShape, getShapeType()) )
726 aSubObjects->length(1);
727 aSubObjects[0] = aGeomObj;
729 else if (aGeomObj->GetType() == GEOM_GROUP)
730 aSubObjects = aShapesOp->MakeExplode( aGeomObj, getShapeType(), false);
734 for (int i = 0; i < aSubObjects->length(); i++)
737 if ( GEOMBase::GetShape(aSubObjects[i], aShape, getShapeType()) )
740 anIndex = aLocOp->GetSubShapeIndex( myMainObj, aSubObjects[i] );
742 aMapIndex.Add( anIndex );
748 if ( aMapIndex.Extent() >= 1 ) {
749 bool isBlocked = myIdList->signalsBlocked();
750 myIdList->blockSignals( true );
752 for ( int i = 1, n = aMapIndex.Extent(); i <= n; i++ ) {
753 if ( aMap.Contains( aMapIndex( i ) ) )
756 QListWidgetItem* anItem = new QListWidgetItem( QString( "%1" ).arg( aMapIndex( i ) ) );
757 myIdList->addItem( anItem );
758 anItem->setSelected( true );
761 myIdList->blockSignals( isBlocked );
767 //=================================================================================
770 //=================================================================================
771 void GroupGUI_GroupDlg::remove()
773 bool isBlocked = myIdList->signalsBlocked();
774 myIdList->blockSignals( true );
776 QListIterator<QListWidgetItem*> it( myIdList->selectedItems() );
777 while ( it.hasNext() )
780 myIdList->blockSignals( isBlocked );
782 highlightSubShapes();
785 //=======================================================================
786 //function : subSelectionWay
788 //=======================================================================
790 int GroupGUI_GroupDlg::subSelectionWay() const
792 return mySelectionWayGroup->checkedId();
795 //=================================================================================
796 // function : getShapeType()
798 //=================================================================================
799 TopAbs_ShapeEnum GroupGUI_GroupDlg::getShapeType() const
801 switch ( getConstructorId() ) {
802 case 0: return TopAbs_VERTEX;
803 case 1: return TopAbs_EDGE;
804 case 2: return TopAbs_FACE;
805 case 3: return TopAbs_SOLID;
806 default: return TopAbs_SHAPE;
810 //=================================================================================
811 // function : setShapeType()
813 //=================================================================================
814 void GroupGUI_GroupDlg::setShapeType( const TopAbs_ShapeEnum theType )
818 case TopAbs_VERTEX: anId = 0; break;
819 case TopAbs_EDGE: anId = 1; break;
820 case TopAbs_FACE: anId = 2; break;
821 case TopAbs_SOLID: anId = 3; break;
823 setConstructorId( anId );
826 myIsShapeType = true;
827 // workaround top avoid set checked button 0
828 setConstructorId( anId );
833 //=================================================================================
834 // function : activateSelection
835 // purpose : Activate selection in accordance with myEditCurrentArgument
836 //=================================================================================
837 void GroupGUI_GroupDlg::activateSelection()
839 globalSelection( GEOM_ALLSHAPES );
842 if ( !myMainObj->_is_nil() && !myEditCurrentArgument/* && mySelSubBtn->isChecked()*/
843 && myIsShapeType) { // check if shape type is already choosen by user
845 // if ( !myPlaceCheckBox->isChecked() )
846 if ( subSelectionWay() == ALL_SUBSHAPES )
847 localSelection( myMainObj, getShapeType() );
848 else if ( !myInPlaceObj->_is_nil() )
849 localSelection( myInPlaceObj, getShapeType() );
852 SelectionIntoArgument();
855 //=================================================================================
856 // function : updateState
858 //=================================================================================
859 void GroupGUI_GroupDlg::updateState()
863 TColStd_IndexedMapOfInteger aMapIndex;
865 SALOME_ListIO aSelIOs;
866 SalomeApp_Application* app = myGeomGUI->getApp();
868 LightApp_SelectionMgr* aSelMgr = app->selectionMgr();
870 LightApp_SelectionMgr::MapEntryOfMapOfInteger aMap;
871 aSelMgr->selectedSubOwners( aMap );
872 if ( aMap.Size() == 1 )
873 aMapIndex = LightApp_SelectionMgr::MapEntryOfMapOfInteger::Iterator( aMap ).Value();
874 else { // selected the same subshape as the main object
875 SALOME_ListIO aSelList;
876 aSelMgr->selectedObjects(aSelList);
877 if (aSelList.Extent() == 1) {
879 Standard_Boolean aRes = Standard_False;
880 GEOM::GEOM_Object_var aSelectedObject = GEOMBase::ConvertIOinGEOMObject(aSelList.First(), aRes);
881 if ( aSelectedObject->_is_equivalent(myMainObj) ) {
882 aMapIndex.Add(1); // add index of the only subshape of selected type
883 TColStd_MapOfInteger anIds; // higlight selected index
885 aSelMgr->AddOrRemoveIndex(aSelList.First(), anIds, false);
893 // try to find out and process the object browser selection
894 if ( !aMapIndex.Extent() && !CORBA::is_nil( myMainObj ) ) {
895 GEOM::ListOfGO anObjects;
896 //GEOMBase::ConvertListOfIOInListOfGO(selectedIO(), anObjects);
897 GEOMBase::ConvertListOfIOInListOfGO(aSelIOs, anObjects);
899 GEOM::GEOM_ILocalOperations_var aLocOp = getGeomEngine()->GetILocalOperations( getStudyId() );
900 GEOM::GEOM_IShapesOperations_var aShapesOp = getGeomEngine()->GetIShapesOperations( getStudyId() );
904 for (int i = 0; i < anObjects.length(); i++)
906 GEOM::GEOM_Object_var aGeomObj = anObjects[i];
907 GEOM::ListOfGO_var aSubObjects = new GEOM::ListOfGO();
909 if ( GEOMBase::GetShape(aGeomObj, aShape, getShapeType()) ) {
910 aSubObjects->length(1);
911 aSubObjects[0] = aGeomObj;
913 else if (aGeomObj->GetType() == GEOM_GROUP) {
914 aSubObjects = aShapesOp->MakeExplode( aGeomObj, getShapeType(), false);
921 for (int i = 0; i < aSubObjects->length(); i++)
925 if ( GEOMBase::GetShape(aSubObjects[i], aShape, getShapeType()) )
928 anIndex = aLocOp->GetSubShapeIndex( myMainObj, aSubObjects[i] );
930 aMapIndex.Add( anIndex );
949 isAdd = aMapIndex.Extent() > 0;
951 myAddBtn->setEnabled( !myEditCurrentArgument && !CORBA::is_nil( myMainObj ) && isAdd );
952 bool hasSel = myIdList->selectedItems().count() > 0;
953 myRemBtn->setEnabled( hasSel );
954 //mySelSubBtn->setEnabled( !CORBA::is_nil( myMainObj ) );
955 //myPlaceCheckBox->setEnabled( !CORBA::is_nil( myMainObj ) );
956 mySelectionWayGroupBox->setEnabled( !CORBA::is_nil( myMainObj ) );
957 mySelAllBtn->setEnabled( !CORBA::is_nil( myMainObj ) );
958 // mySelBtn2->setEnabled( myPlaceCheckBox->isChecked() );
959 // myShape2Name->setEnabled( myPlaceCheckBox->isChecked() );
960 mySelBtn2->setEnabled( subSelectionWay() != ALL_SUBSHAPES );
961 myShape2Name->setEnabled( subSelectionWay() != ALL_SUBSHAPES );
962 // if ( !myPlaceCheckBox->isChecked() )
963 if ( subSelectionWay() == ALL_SUBSHAPES )
964 setInPlaceObj( GEOM::GEOM_Object::_nil() );
967 //=================================================================================
968 // function : selectionChanged
970 //=================================================================================
971 void GroupGUI_GroupDlg::selectionChanged()
973 highlightSubShapes();
976 //=================================================================================
977 // function : highlightSubShapes
979 //=================================================================================
980 void GroupGUI_GroupDlg::highlightSubShapes()
982 if ( CORBA::is_nil( myMainObj ) )
985 Standard_Boolean isOk;
988 if ( myInPlaceObj->_is_nil() )
989 objIOR = GEOMBase::GetIORFromObject( myMainObj );
991 objIOR = GEOMBase::GetIORFromObject( myInPlaceObj );
993 Handle(GEOM_AISShape) aSh = GEOMBase::ConvertIORinGEOMAISShape( objIOR, isOk, true );
995 if ( !isOk || aSh.IsNull() )
998 TColStd_MapOfInteger anIds;
1002 int ii = 0, nn = myIdList->count();
1003 for ( ; ii < nn; ii++ )
1005 if ( myIdList->item( ii )->isSelected() ) {
1006 int id = myIdList->item( ii )->text().toInt();
1007 // if ( myPlaceCheckBox->isChecked() )
1008 if ( subSelectionWay() != ALL_SUBSHAPES )
1010 if ( myMain2InPlaceIndices.IsBound( id ) )
1011 id = myMain2InPlaceIndices( id );
1013 myIdList->item( ii )->setSelected( false );
1020 SalomeApp_Application* app = myGeomGUI->getApp();
1021 LightApp_SelectionMgr* aSelMgr = app->selectionMgr();
1022 aSelMgr->clearSelected();
1024 aSelMgr->AddOrRemoveIndex(aSh->getIO(), anIds, false);
1031 myAddBtn->setEnabled( true );
1032 myRemBtn->setEnabled( true );
1036 //=================================================================================
1037 // function : createOperation
1039 //=================================================================================
1040 GEOM::GEOM_IOperations_ptr GroupGUI_GroupDlg::createOperation()
1042 return getGeomEngine()->GetIGroupOperations( getStudyId() );
1045 #define RETURN_WITH_MSG(a, b) \
1047 theMessage += (b); \
1051 //=================================================================================
1052 // function : isValid()
1053 // purpose : Verify validity of input data
1054 //=================================================================================
1055 bool GroupGUI_GroupDlg::isValid( QString& theMessage )
1057 SalomeApp_Study* study = getStudy();
1059 RETURN_WITH_MSG ( !study->studyDS()->GetProperties()->IsLocked(), tr( "GEOM_STUDY_LOCKED" ) )
1061 if ( myMode == CreateGroup ) {
1062 RETURN_WITH_MSG( !CORBA::is_nil( myMainObj ), tr( "NO_MAIN_OBJ" ) )
1065 RETURN_WITH_MSG( !CORBA::is_nil( myMainObj ), tr( "NO_GROUP" ) )
1068 QString aName (getNewObjectName());
1069 RETURN_WITH_MSG ( !aName.trimmed().isEmpty(), tr( "EMPTY_NAME" ) )
1071 RETURN_WITH_MSG ( myIdList->count(), tr( "EMPTY_LIST" ) )
1075 //=================================================================================
1076 // function : execute
1078 //=================================================================================
1079 bool GroupGUI_GroupDlg::execute( ObjectList& objects )
1081 setInPlaceObj( GEOM::GEOM_Object::_nil() );
1083 GEOM::GEOM_IGroupOperations_var anOper = GEOM::GEOM_IGroupOperations::_narrow(getOperation());
1085 GEOM::GEOM_Object_var aGroup;
1086 if (myMode == CreateGroup)
1087 aGroup = anOper->CreateGroup(myMainObj, getShapeType());
1088 else if (myMode == EditGroup)
1091 if (CORBA::is_nil(aGroup) || (myMode == CreateGroup && !anOper->IsDone()))
1094 GEOM::ListOfLong_var aCurrList = anOper->GetObjects(aGroup);
1095 if (!anOper->IsDone())
1098 if (aCurrList->length() > 0)
1100 anOper->DifferenceIDs(aGroup, aCurrList);
1101 if (!anOper->IsDone())
1105 int ii, nn = myIdList->count();
1108 GEOM::ListOfLong_var aNewList = new GEOM::ListOfLong;
1109 aNewList->length(nn);
1110 for (ii = 0; ii < nn; ii++) {
1111 aNewList[ii] = myIdList->item(ii)->text().toInt();
1113 anOper->UnionIDs(aGroup, aNewList);
1114 if (!anOper->IsDone())
1118 SalomeApp_Study* study = getStudy();
1120 char* objIOR = GEOMBase::GetIORFromObject( aGroup );
1121 std::string IOR( objIOR );
1124 _PTR(SObject) SO ( study->studyDS()->FindObjectIOR( IOR ) );
1126 _PTR(StudyBuilder) aBuilder (study->studyDS()->NewBuilder());
1127 aBuilder->SetName( SO, getNewObjectName().toLatin1().constData() );
1132 objects.push_back( aGroup._retn() );
1137 //================================================================
1138 // Function : getFather
1139 // Purpose : Get father object for object to be added in study
1140 // ( called with addInStudy method )
1141 //================================================================
1142 GEOM::GEOM_Object_ptr GroupGUI_GroupDlg::getFather( GEOM::GEOM_Object_ptr theObj )
1144 GEOM::GEOM_Object_var aFatherObj;
1145 if ( theObj->GetType() == GEOM_GROUP ) {
1146 GEOM::GEOM_IGroupOperations_var anOper = GEOM::GEOM_IGroupOperations::_narrow( getOperation() );
1147 aFatherObj = anOper->GetMainShape( theObj );
1149 return aFatherObj._retn();