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_AddSubMeshDlg.cxx
25 // Author : Nicolas REJNERI
29 #include "SMESHGUI_AddSubMeshDlg.h"
32 #include "SMESHGUI_Utils.h"
33 #include "SMESHGUI_GEOMGenUtils.h"
34 #include "SMESHGUI_HypothesesUtils.h"
36 #include "SMESH_TypeFilter.hxx"
37 #include "SMESH_NumberFilter.hxx"
41 #include "SUIT_Session.h"
42 #include "SUIT_MessageBox.h"
43 #include "SUIT_OverrideCursor.h"
44 #include "SUIT_Operation.h"
45 #include "SUIT_Desktop.h"
47 #include "SALOMEDSClient_Study.hxx"
48 #include "SALOMEDS_SObject.hxx"
49 #include "SALOME_ListIO.hxx"
50 #include "SALOME_ListIteratorOfListIO.hxx"
51 #include "SalomeApp_Tools.h"
53 #include "SVTK_ViewModel.h"
55 #include "utilities.h"
58 #include <qgroupbox.h>
60 #include <qlineedit.h>
61 #include <qpushbutton.h>
68 SMESH::SMESH_subMesh_var AddSubMesh (SMESH::SMESH_Mesh_ptr theMesh,
69 GEOM::GEOM_Object_ptr theShapeObject,
70 const char* theMeshName)
72 SMESH::SMESH_subMesh_var aSubMesh;
74 if (!theMesh->_is_nil() && !theShapeObject->_is_nil())
75 aSubMesh = theMesh->GetSubMesh(theShapeObject, theMeshName);
76 } catch (const SALOME::SALOME_Exception& S_ex) {
77 SalomeApp_Tools::QtCatchCorbaException(S_ex);
79 return aSubMesh._retn();
83 //=================================================================================
84 // function : SMESHGUI_AddSubMeshDlg()
85 // purpose : Constructs a SMESHGUI_AddSubMeshDlg which is a child of 'parent', with the
86 // name 'name' and widget flags set to 'f'.
87 // The dialog will by default be modeless, unless you set 'modal' to
88 // TRUE to construct a modal dialog.
89 //=================================================================================
90 SMESHGUI_AddSubMeshDlg::SMESHGUI_AddSubMeshDlg( SMESHGUI* theModule, const char* name,
91 bool modal, WFlags fl)
92 : QDialog( SMESH::GetDesktop( theModule ), name, modal, WStyle_Customize | WStyle_NormalBorder |
93 WStyle_Title | WStyle_SysMenu | WDestructiveClose),
94 mySMESHGUI( theModule ),
95 mySelectionMgr( SMESH::GetSelectionMgr( theModule ) )
97 QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT")));
99 setName("SMESHGUI_AddSubMeshDlg");
100 setCaption(tr("SMESH_ADD_SUBMESH"));
101 setSizeGripEnabled(TRUE);
102 QGridLayout* SMESHGUI_AddSubMeshDlgLayout = new QGridLayout(this);
103 SMESHGUI_AddSubMeshDlgLayout->setSpacing(6);
104 SMESHGUI_AddSubMeshDlgLayout->setMargin(11);
106 /***************************************************************/
107 GroupC1 = new QGroupBox (tr("SMESH_ARGUMENTS"), this, "GroupC1");
108 GroupC1->setColumnLayout(0, Qt::Vertical);
109 GroupC1->layout()->setSpacing(0);
110 GroupC1->layout()->setMargin(0);
111 QGridLayout* GroupC1Layout = new QGridLayout (GroupC1->layout());
112 GroupC1Layout->setAlignment(Qt::AlignTop);
113 GroupC1Layout->setSpacing(6);
114 GroupC1Layout->setMargin(11);
116 TextLabel_NameMesh = new QLabel (tr("SMESH_NAME"), GroupC1, "TextLabel_NameMesh");
117 GroupC1Layout->addWidget(TextLabel_NameMesh, 0, 0);
118 LineEdit_NameMesh = new QLineEdit (GroupC1, "LineEdit_NameMesh");
119 GroupC1Layout->addWidget(LineEdit_NameMesh, 0, 2);
121 TextLabelC1A1 = new QLabel (tr("SMESH_OBJECT_MESH"), GroupC1, "TextLabelC1A1");
122 GroupC1Layout->addWidget(TextLabelC1A1, 1, 0);
123 SelectButtonC1A1 = new QPushButton (GroupC1, "SelectButtonC1A1");
124 SelectButtonC1A1->setPixmap(image0);
125 SelectButtonC1A1->setToggleButton(FALSE);
126 GroupC1Layout->addWidget(SelectButtonC1A1, 1, 1);
127 LineEditC1A1 = new QLineEdit (GroupC1, "LineEditC1A1");
128 LineEditC1A1->setReadOnly(true);
129 GroupC1Layout->addWidget(LineEditC1A1, 1, 2);
131 TextLabelC1A2 = new QLabel(tr("SMESH_OBJECT_GEOM"), GroupC1, "TextLabelC1A2");
132 GroupC1Layout->addWidget(TextLabelC1A2, 2, 0);
133 SelectButtonC1A2 = new QPushButton(GroupC1, "SelectButtonC1A2");
134 SelectButtonC1A2->setPixmap(image0);
135 SelectButtonC1A2->setToggleButton(FALSE);
136 GroupC1Layout->addWidget(SelectButtonC1A2, 2, 1);
137 LineEditC1A2 = new QLineEdit(GroupC1, "LineEditC1A2");
138 LineEditC1A2->setReadOnly(true);
139 GroupC1Layout->addWidget(LineEditC1A2, 2, 2);
141 TextLabelC1A1Hyp = new QLabel(tr("SMESH_OBJECT_HYPOTHESIS"), GroupC1, "TextLabelC1A1Hyp");
142 GroupC1Layout->addWidget(TextLabelC1A1Hyp, 3, 0);
143 SelectButtonC1A1Hyp = new QPushButton(GroupC1, "SelectButtonC1A1Hyp");
144 SelectButtonC1A1Hyp->setPixmap(image0);
145 GroupC1Layout->addWidget(SelectButtonC1A1Hyp, 3, 1);
146 LineEditC1A1Hyp = new QLineEdit(GroupC1, "LineEditC1A1Hyp");
147 LineEditC1A1Hyp->setReadOnly(true);
148 GroupC1Layout->addWidget(LineEditC1A1Hyp, 3, 2);
150 TextLabelC1A1Algo = new QLabel(tr("SMESH_OBJECT_ALGORITHM"), GroupC1, "TextLabelC1A1Algo");
151 GroupC1Layout->addWidget(TextLabelC1A1Algo, 4, 0);
152 SelectButtonC1A1Algo = new QPushButton(GroupC1, "SelectButtonC1A1Algo");
153 SelectButtonC1A1Algo->setPixmap(image0);
154 GroupC1Layout->addWidget(SelectButtonC1A1Algo, 4, 1);
155 LineEditC1A1Algo = new QLineEdit(GroupC1, "LineEditC1A1Algo");
156 LineEditC1A1Algo->setReadOnly(true);
157 GroupC1Layout->addWidget(LineEditC1A1Algo, 4, 2);
159 SMESHGUI_AddSubMeshDlgLayout->addWidget(GroupC1, 1, 0);
161 /***************************************************************/
162 GroupButtons = new QGroupBox(this, "GroupButtons");
163 GroupButtons->setColumnLayout(0, Qt::Vertical);
164 GroupButtons->layout()->setSpacing(0);
165 GroupButtons->layout()->setMargin(0);
166 QGridLayout* GroupButtonsLayout = new QGridLayout(GroupButtons->layout());
167 GroupButtonsLayout->setAlignment(Qt::AlignTop);
168 GroupButtonsLayout->setSpacing(6);
169 GroupButtonsLayout->setMargin(11);
171 buttonOk = new QPushButton(tr("SMESH_BUT_OK"), GroupButtons, "buttonOk");
172 buttonOk->setAutoDefault(TRUE);
173 buttonOk->setDefault(TRUE);
174 GroupButtonsLayout->addWidget(buttonOk, 0, 0);
176 buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons, "buttonApply");
177 buttonApply->setAutoDefault(TRUE);
178 GroupButtonsLayout->addWidget(buttonApply, 0, 1);
180 GroupButtonsLayout->addItem(new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum), 0, 2);
182 buttonCancel = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons, "buttonCancel");
183 buttonCancel->setAutoDefault(TRUE);
184 GroupButtonsLayout->addWidget(buttonCancel, 0, 3);
186 SMESHGUI_AddSubMeshDlgLayout->addWidget(GroupButtons, 2, 0);
188 /***************************************************************/
192 //=================================================================================
193 // function : ~SMESHGUI_AddSubMeshDlg()
194 // purpose : Destroys the object and frees any allocated resources
195 //=================================================================================
196 SMESHGUI_AddSubMeshDlg::~SMESHGUI_AddSubMeshDlg()
198 // no need to delete child widgets, Qt does it all for us
201 //=================================================================================
204 //=================================================================================
205 void SMESHGUI_AddSubMeshDlg::Init ()
207 mySMESHGUI->SetActiveDialogBox((QDialog*)this);
209 //myGeomFilter = new SALOME_TypeFilter("GEOM");
210 TColStd_MapOfInteger allTypesMap;
211 for (int i = 0; i < 10; i++)
213 myGeomFilter = new SMESH_NumberFilter ("GEOM", TopAbs_SHAPE, 0, allTypesMap);
214 myMeshFilter = new SMESH_TypeFilter (MESH);
215 myAlgorithmFilter = new SMESH_TypeFilter (ALGORITHM);
216 myHypothesisFilter = new SMESH_TypeFilter (HYPOTHESIS);
218 /* signals and slots connections */
219 connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk()));
220 connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply()));
221 connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel()));
223 connect(SelectButtonC1A1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
224 connect(SelectButtonC1A2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
225 connect(SelectButtonC1A1Hyp, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
226 connect(SelectButtonC1A1Algo, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
228 connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
229 connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
230 connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel()));
233 mySMESHGUI->DefineDlgPosition(this, x, y);
237 LineEdit_NameMesh->setText(tr("SMESH_SUBMESH"));
238 LineEdit_NameMesh->setFocus();
239 myEditCurrentArgument = LineEditC1A1;
240 mySelectionMgr->clearFilters();
241 mySelectionMgr->installFilter(myMeshFilter);
243 SelectionIntoArgument();
246 //=================================================================================
247 // function : ClickOnOk()
249 //=================================================================================
250 void SMESHGUI_AddSubMeshDlg::ClickOnOk()
252 if (this->ClickOnApply())
253 this->ClickOnCancel();
256 //=================================================================================
257 // function : ClickOnApply()
259 //=================================================================================
260 bool SMESHGUI_AddSubMeshDlg::ClickOnApply()
262 if (mySMESHGUI->isActiveStudyLocked())
265 QString myNameSubMesh = LineEdit_NameMesh->text().stripWhiteSpace();
266 if (myNameSubMesh.isEmpty()) {
267 SUIT_MessageBox::warn1(this, tr("SMESH_WRN_WARNING"),
268 tr("SMESH_WRN_EMPTY_NAME"), tr("SMESH_BUT_OK"));
272 if (myMesh->_is_nil() || myGeomShape->_is_nil() ||
273 (!HypoList.count() && !AlgoList.count()))
276 _PTR(SObject) aMeshSO = SMESH::FindSObject(myMesh);
277 GEOM::GEOM_Object_var myMainShape = SMESH::GetShapeOnMeshOrSubMesh(aMeshSO);
278 if (myMainShape->_is_nil())
281 SUIT_OverrideCursor wc;
284 new SUIT_Operation (SUIT_Session::session()->activeApplication());
290 SMESH::SMESH_subMesh_var aSubMesh = SMESH::AddSubMesh(myMesh, myGeomShape, myNameSubMesh);
293 if (!aSubMesh->_is_nil()) {
295 int nbAlgo = AlgoList.count();
296 int nbHyps = HypoList.count() + nbAlgo;
297 for (int i = 0; i < nbHyps; i++) {
298 _PTR(SObject) aHypSOClient =
299 SMESH::GetActiveStudyDocument()->FindObjectID
300 (i < nbAlgo ? AlgoList[i].latin1() : HypoList[i-nbAlgo].latin1());
302 CORBA::Object_var anObject = _CAST(SObject,aHypSOClient)->GetObject();
303 if (!CORBA::is_nil(anObject)) {
304 SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow(anObject);
305 if (!aHyp->_is_nil())
306 if (SMESH::AddHypothesisOnSubMesh(aSubMesh, aHyp))
309 SCRUTE(CORBA::is_nil(anObject));
312 SCRUTE(!aHypSOClient);
316 SCRUTE(aSubMesh->_is_nil());
319 // commit transaction
321 mySMESHGUI->updateObjBrowser();
322 return (nbSuccess > 0);
325 //=================================================================================
326 // function : ClickOnCancel()
328 //=================================================================================
329 void SMESHGUI_AddSubMeshDlg::ClickOnCancel()
334 //=================================================================================
335 // function : IsFatherOf()
337 //=================================================================================
338 static bool IsFatherOf (_PTR(SObject) SO, _PTR(SObject) fatherSO)
340 if (SO && fatherSO) {
341 _PTR(SObject) aSO = SO->GetFather();
342 //while (strlen(aSO->GetID()) >= strlen(fatherSO->GetID())) {
343 while (aSO->GetID().length() >= fatherSO->GetID().length()) {
344 //if (QString(aSO->GetID()) == QString(fatherSO->GetID()))
345 if (aSO->GetID() == fatherSO->GetID())
347 aSO = aSO->GetFather();
353 //=================================================================================
354 // function : SelectionIntoArgument()
355 // purpose : Called when selection as changed or other case
356 //=================================================================================
357 void SMESHGUI_AddSubMeshDlg::SelectionIntoArgument()
359 QString aString = "";
362 mySelectionMgr->selectedObjects(aList, SVTK_Viewer::Type());
363 int nbSel = SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
365 if (myEditCurrentArgument == LineEditC1A1) {
368 myMesh = SMESH::SMESH_Mesh::_nil();
371 Handle(SALOME_InteractiveObject) IO = aList.First();
372 myMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IO);
373 if (myMesh->_is_nil()) {
377 myGeomShape = GEOM::GEOM_Object::_nil();
378 LineEditC1A2->setText("");
380 } else if (myEditCurrentArgument == LineEditC1A2) {
383 myGeomShape = GEOM::GEOM_Object::_nil();
386 Handle(SALOME_InteractiveObject) IO = aList.First();
387 myGeomShape = SMESH::IObjectToInterface<GEOM::GEOM_Object>(IO);
388 if (myGeomShape->_is_nil() || !GEOMBase::IsShape(myGeomShape)) {
389 myGeomShape = GEOM::GEOM_Object::_nil();
392 if (!myMesh->_is_nil()) {
393 _PTR(SObject) aMeshSO = SMESH::FindSObject(myMesh);
394 GEOM::GEOM_Object_var aMainGeomShape = SMESH::GetShapeOnMeshOrSubMesh(aMeshSO);
395 _PTR(SObject) aMainGeomShapeSO = SMESH::FindSObject(aMainGeomShape);
396 if (!aMainGeomShapeSO ||
397 !IsFatherOf(SMESH::GetActiveStudyDocument()->FindObjectID
398 (IO->getEntry()), aMainGeomShapeSO)) {
399 myGeomShape = GEOM::GEOM_Object::_nil();
404 } else if (myEditCurrentArgument == LineEditC1A1Hyp) {
408 SALOME_ListIteratorOfListIO Itinit (aList);
409 for (; Itinit.More(); Itinit.Next()) {
410 HypoList.append(Itinit.Value()->getEntry());
413 aString = tr("%1 Hypothesis").arg(nbSel);
417 } else if (myEditCurrentArgument == LineEditC1A1Algo) {
421 SALOME_ListIteratorOfListIO Itinit (aList);
422 for (; Itinit.More(); Itinit.Next()) {
423 AlgoList.append(Itinit.Value()->getEntry());
426 aString = tr("%1 Algorithms").arg(nbSel);
433 myEditCurrentArgument->setText(aString);
434 myEditCurrentArgument->setCursorPosition( 0 );
436 UpdateControlState();
439 //=================================================================================
440 // function : SetEditCurrentArgument()
442 //=================================================================================
443 void SMESHGUI_AddSubMeshDlg::SetEditCurrentArgument()
445 QPushButton* send = (QPushButton*)sender();
446 if(send == SelectButtonC1A1) {
447 LineEditC1A1->setFocus();
448 mySelectionMgr->clearFilters();
449 mySelectionMgr->installFilter(myMeshFilter);
450 myEditCurrentArgument = LineEditC1A1;
451 } else if (send == SelectButtonC1A2) {
452 LineEditC1A2->setFocus();
453 mySelectionMgr->clearFilters();
454 mySelectionMgr->installFilter(myGeomFilter);
455 myEditCurrentArgument = LineEditC1A2;
456 } else if(send == SelectButtonC1A1Hyp) {
457 LineEditC1A1Hyp->setFocus();
458 mySelectionMgr->clearFilters();
459 mySelectionMgr->installFilter(myHypothesisFilter);
460 myEditCurrentArgument = LineEditC1A1Hyp;
461 } else if(send == SelectButtonC1A1Algo) {
462 LineEditC1A1Algo->setFocus();
463 mySelectionMgr->clearFilters();
464 mySelectionMgr->installFilter(myAlgorithmFilter);
465 myEditCurrentArgument = LineEditC1A1Algo;
467 SelectionIntoArgument();
470 //=================================================================================
471 // function : DeactivateActiveDialog()
473 //=================================================================================
474 void SMESHGUI_AddSubMeshDlg::DeactivateActiveDialog()
476 if (GroupC1->isEnabled()) {
477 disconnect(mySelectionMgr, 0, this, 0);
478 GroupC1->setEnabled(false);
479 GroupButtons->setEnabled(false);
483 //=================================================================================
484 // function : ActivateThisDialog()
486 //=================================================================================
487 void SMESHGUI_AddSubMeshDlg::ActivateThisDialog()
489 mySMESHGUI->EmitSignalDeactivateDialog();
490 GroupC1->setEnabled(true);
491 GroupButtons->setEnabled(true);
492 connect (mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
495 //=================================================================================
496 // function : enterEvent()
498 //=================================================================================
499 void SMESHGUI_AddSubMeshDlg::enterEvent (QEvent*)
501 if (!GroupC1->isEnabled())
502 ActivateThisDialog();
505 //=================================================================================
506 // function : closeEvent()
508 //=================================================================================
509 void SMESHGUI_AddSubMeshDlg::closeEvent (QCloseEvent* e)
511 disconnect(mySelectionMgr, 0, this, 0);
512 mySMESHGUI->ResetState();
513 mySelectionMgr->clearFilters();
514 QDialog::closeEvent(e);
517 //=================================================================================
518 // function : UpdateControlState()
520 //=================================================================================
521 void SMESHGUI_AddSubMeshDlg::UpdateControlState()
523 bool isEnabled = (!myMesh->_is_nil() &&
524 !myGeomShape->_is_nil() &&
525 (HypoList.count() || AlgoList.count()));
526 bool isImportedMesh = false;
527 if (!myMesh->_is_nil()) {
528 _PTR(SObject) aMeshSO = SMESH::FindSObject(myMesh);
529 GEOM::GEOM_Object_var myGeomShape = SMESH::GetShapeOnMeshOrSubMesh(aMeshSO);
530 isImportedMesh = myGeomShape->_is_nil();
533 buttonOk ->setEnabled(isEnabled && !isImportedMesh);
534 buttonApply->setEnabled(isEnabled && !isImportedMesh);