1 // SMESH SMESHGUI : GUI for SMESH component
3 // Copyright (C) 2003 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
24 // File : SMESHGUI_GroupOpDlg.cxx
25 // Author : Sergey LITONIN
28 #include "SMESHGUI_GroupOpDlg.h"
31 #include "SMESHGUI_Utils.h"
32 #include "SMESHGUI_VTKUtils.h"
34 #include "SMESH_TypeFilter.hxx"
36 #include "SUIT_ResourceMgr.h"
37 #include "SUIT_Desktop.h"
39 #include "LightApp_SelectionMgr.h"
40 #include "SVTK_Selection.h"
41 #include "SVTK_ViewWindow.h"
42 #include "SVTK_Selector.h"
43 #include "SALOME_ListIO.hxx"
48 #include <qpushbutton.h>
49 #include <qgroupbox.h>
52 #include <qlineedit.h>
53 #include <qmessagebox.h>
59 * Class : SMESHGUI_GroupOpDlg
60 * Description : Perform boolean operations on groups
63 //=======================================================================
64 // name : SMESHGUI_GroupOpDlg::SMESHGUI_GroupOpDlg
65 // Purpose : Constructor
66 //=======================================================================
67 SMESHGUI_GroupOpDlg::SMESHGUI_GroupOpDlg( SMESHGUI* theModule, const int theMode )
68 : QDialog( SMESH::GetDesktop( theModule ), "SMESHGUI_GroupOpDlg", false,
69 WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ),
70 mySMESHGUI( theModule ),
71 mySelectionMgr( SMESH::GetSelectionMgr( theModule ) )
75 if (myMode == UNION) setCaption(tr("UNION_OF_TWO_GROUPS"));
76 else if (myMode == INTERSECT) setCaption(tr("INTERSECTION_OF_TWO_GROUPS"));
77 else setCaption(tr("CUT_OF_TWO_GROUPS"));
79 mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector();
81 QVBoxLayout* aDlgLay = new QVBoxLayout (this, MARGIN, SPACING);
83 QFrame* aMainFrame = createMainFrame (this);
84 QFrame* aBtnFrame = createButtonFrame(this);
86 aDlgLay->addWidget(aMainFrame);
87 aDlgLay->addWidget(aBtnFrame);
89 aDlgLay->setStretchFactor(aMainFrame, 1);
94 //=======================================================================
95 // name : SMESHGUI_GroupOpDlg::createMainFrame
96 // Purpose : Create frame containing dialog's input fields
97 //=======================================================================
98 QFrame* SMESHGUI_GroupOpDlg::createMainFrame (QWidget* theParent)
100 QGroupBox* aMainGrp = new QGroupBox(1, Qt::Horizontal, theParent);
101 aMainGrp->setFrameStyle(QFrame::NoFrame);
102 aMainGrp->setInsideMargin(0);
104 QGroupBox* aNameGrp = new QGroupBox(1, Qt::Vertical, tr("NAME"), aMainGrp);
105 new QLabel(tr("RESULT_NAME"), aNameGrp);
106 myNameEdit = new QLineEdit(aNameGrp);
108 QGroupBox* anArgGrp = new QGroupBox(3, Qt::Horizontal, tr("ARGUMENTS"), aMainGrp);
110 new QLabel(myMode == CUT ? tr("MAIN_OBJECT") :tr("OBJECT_1"), anArgGrp);
111 myBtn1 = new QPushButton(anArgGrp);
112 myEdit1 = new QLineEdit(anArgGrp);
113 myEdit1->setAlignment( Qt::AlignLeft );
115 new QLabel(myMode == CUT ? tr("TOOL_OBJECT") :tr("OBJECT_2"), anArgGrp);
116 myBtn2 = new QPushButton(anArgGrp);
117 myEdit2 = new QLineEdit(anArgGrp);
118 myEdit2->setAlignment( Qt::AlignLeft );
120 myEdit1->setReadOnly(true);
121 myEdit2->setReadOnly(true);
123 QPixmap aPix (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT")));
124 myBtn1->setPixmap(aPix);
125 myBtn2->setPixmap(aPix);
130 //=======================================================================
131 // name : SMESHGUI_GroupOpDlg::createButtonFrame
132 // Purpose : Create frame containing buttons
133 //=======================================================================
134 QFrame* SMESHGUI_GroupOpDlg::createButtonFrame (QWidget* theParent)
136 QFrame* aFrame = new QFrame(theParent);
137 aFrame->setFrameStyle(QFrame::Box | QFrame::Sunken);
139 myOkBtn = new QPushButton(tr("SMESH_BUT_OK" ), aFrame);
140 myApplyBtn = new QPushButton(tr("SMESH_BUT_APPLY"), aFrame);
141 myCloseBtn = new QPushButton(tr("SMESH_BUT_CLOSE"), aFrame);
143 QSpacerItem* aSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum);
145 QHBoxLayout* aLay = new QHBoxLayout(aFrame, MARGIN, SPACING);
147 aLay->addWidget(myOkBtn);
148 aLay->addWidget(myApplyBtn);
149 aLay->addItem(aSpacer);
150 aLay->addWidget(myCloseBtn);
152 // connect signals and slots
153 connect(myOkBtn, SIGNAL(clicked()), SLOT(onOk()));
154 connect(myCloseBtn, SIGNAL(clicked()), SLOT(onClose()));
155 connect(myApplyBtn, SIGNAL(clicked()), SLOT(onApply()));
160 //=======================================================================
161 // name : SMESHGUI_GroupOpDlg::~SMESHGUI_GroupOpDlg
162 // Purpose : Destructor
163 //=======================================================================
164 SMESHGUI_GroupOpDlg::~SMESHGUI_GroupOpDlg()
168 //=======================================================================
169 // name : SMESHGUI_GroupOpDlg::Init
170 // Purpose : Init dialog fields, connect signals and slots, show dialog
171 //=======================================================================
172 void SMESHGUI_GroupOpDlg::Init()
174 mySMESHGUI->SetActiveDialogBox((QDialog*)this);
177 myGroup1 = SMESH::SMESH_GroupBase::_nil();
178 myGroup2 = SMESH::SMESH_GroupBase::_nil();
180 // selection and SMESHGUI
181 connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), SLOT(onSelectionDone()));
182 connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), SLOT(onDeactivate()));
183 connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), SLOT(ClickOnClose()));
185 connect(myBtn1, SIGNAL(clicked()), this, SLOT(onFocusChanged()));
186 connect(myBtn2, SIGNAL(clicked()), this, SLOT(onFocusChanged()));
190 // set selection mode
191 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
192 aViewWindow->SetSelectionMode(ActorSelection);
193 mySelectionMgr->installFilter(new SMESH_TypeFilter (GROUP));
198 //=======================================================================
199 // name : SMESHGUI_GroupOpDlg::isValid
200 // Purpose : Verify validity of input data
201 //=======================================================================
202 bool SMESHGUI_GroupOpDlg::isValid()
204 // Verify validity of group name
205 if (myNameEdit->text() == "") {
206 QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_INSUFFICIENT_DATA"),
207 tr("EMPTY_NAME"), QMessageBox::Ok);
211 // Verufy wheter arguments speciffiyed
212 if (myGroup1->_is_nil() || myGroup2->_is_nil()) {
213 QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_INSUFFICIENT_DATA"),
214 tr("INCORRECT_ARGUMENTS"), QMessageBox::Ok);
218 // Verify whether arguments belongs to same mesh
219 SMESH::SMESH_Mesh_ptr aMesh1 = myGroup1->GetMesh();
220 SMESH::SMESH_Mesh_ptr aMesh2 = myGroup2->GetMesh();
222 int aMeshId1 = !aMesh1->_is_nil() ? aMesh1->GetId() : -1;
223 int aMeshId2 = !aMesh2->_is_nil() ? aMesh2->GetId() : -1;
225 if (aMeshId1 != aMeshId2 || aMeshId1 == -1) {
226 QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_INSUFFICIENT_DATA"),
227 tr("DIFF_MESHES"), QMessageBox::Ok);
231 // Verify whether groups have same types of entities
232 if (myGroup1->GetType() != myGroup2->GetType()) {
233 QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_INSUFFICIENT_DATA"),
234 tr("DIFF_TYPES"), QMessageBox::Ok);
241 //=======================================================================
242 // name : SMESHGUI_GroupOpDlg::onApply
243 // Purpose : SLOT called when "Apply" button pressed.
244 //=======================================================================
245 bool SMESHGUI_GroupOpDlg::onApply()
247 if (!isValid() || mySMESHGUI->isActiveStudyLocked())
250 SMESH::SMESH_Mesh_ptr aMesh = myGroup1->GetMesh();
251 QString aName = myNameEdit->text();
252 SMESH::SMESH_Group_ptr aNewGrp = SMESH::SMESH_Group::_nil();
254 if (myMode == UNION) aNewGrp = aMesh->UnionGroups(myGroup1, myGroup2, aName.latin1());
255 else if (myMode == INTERSECT) aNewGrp = aMesh->IntersectGroups(myGroup1, myGroup2, aName.latin1());
256 else aNewGrp = aMesh->CutGroups(myGroup1, myGroup2, aName.latin1());
258 if (!aNewGrp->_is_nil()) {
259 mySMESHGUI->updateObjBrowser(true);
263 QMessageBox::critical(SMESHGUI::desktop(), tr("SMESH_ERROR"),
264 tr("SMESH_OPERATION_FAILED"), "OK");
269 //=======================================================================
270 // name : SMESHGUI_GroupOpDlg::onOk
271 // Purpose : SLOT called when "Ok" button pressed.
272 //=======================================================================
273 void SMESHGUI_GroupOpDlg::onOk()
279 //=======================================================================
280 // name : SMESHGUI_GroupOpDlg::onClose
281 // Purpose : SLOT called when "Close" button pressed. Close dialog
282 //=======================================================================
283 void SMESHGUI_GroupOpDlg::onClose()
285 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
286 aViewWindow->SetSelectionMode(ActorSelection);
287 disconnect(mySelectionMgr, 0, this, 0);
288 disconnect(mySMESHGUI, 0, this, 0);
289 mySMESHGUI->ResetState();
290 mySelectionMgr->clearFilters();
294 //=======================================================================
295 // name : SMESHGUI_GroupOpDlg::onSelectionDone
296 // Purpose : SLOT called when selection changed
297 //=======================================================================
298 void SMESHGUI_GroupOpDlg::onSelectionDone()
300 if (myFocusWg == myEdit1)
301 myGroup1 = SMESH::SMESH_GroupBase::_nil();
303 myGroup2 = SMESH::SMESH_GroupBase::_nil();
305 myFocusWg->setText("");
308 mySelectionMgr->selectedObjects(aList);
310 if (aList.Extent() == 1) {
311 SMESH::SMESH_GroupBase_var aGroup =
312 SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(aList.First());
314 if (!aGroup->_is_nil())
316 myFocusWg->setText(aGroup->GetName());
317 myFocusWg->setCursorPosition( 0 );
319 if (myFocusWg == myEdit1)
327 //=======================================================================
328 // name : SMESHGUI_GroupOpDlg::onDeactivate
329 // Purpose : SLOT called when dialog must be deativated
330 //=======================================================================
331 void SMESHGUI_GroupOpDlg::onDeactivate()
334 mySelectionMgr->clearFilters();
337 //=======================================================================
338 // name : SMESHGUI_GroupOpDlg::enterEvent
339 // Purpose : Event filter
340 //=======================================================================
341 void SMESHGUI_GroupOpDlg::enterEvent (QEvent*)
343 mySMESHGUI->EmitSignalDeactivateDialog();
345 if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
346 aViewWindow->SetSelectionMode(ActorSelection);
347 mySelectionMgr->installFilter(new SMESH_TypeFilter (GROUP));
350 //=======================================================================
351 // name : SMESHGUI_GroupOpDlg::closeEvent
353 //=======================================================================
354 void SMESHGUI_GroupOpDlg::closeEvent (QCloseEvent*)
359 //=======================================================================
360 // name : SMESHGUI_GroupOpDlg::onFocusChanged
361 // Purpose : SLOT. Called when "Select" button pressed.
362 //=======================================================================
363 void SMESHGUI_GroupOpDlg::onFocusChanged()
365 const QObject* aSender = sender();
366 myFocusWg = aSender == myBtn1 ? myEdit1 : myEdit2;
370 //=======================================================================
371 // name : SMESHGUI_GroupOpDlg::reset
372 // Purpose : Rest state of dialog
373 //=======================================================================
374 void SMESHGUI_GroupOpDlg::reset()
376 myNameEdit->setText("");
377 myEdit1->setText("");
378 myEdit2->setText("");
380 myNameEdit->setFocus();