]> SALOME platform Git repositories - modules/geom.git/blob - src/RepairGUI/RepairGUI_GlueDlg.cxx
Salome HOME
0022746: [EDF] Improvement of Glue Faces and Glue Edges operations
[modules/geom.git] / src / RepairGUI / RepairGUI_GlueDlg.cxx
1 // Copyright (C) 2007-2014  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
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, or (at your option) any later version.
10 //
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.
15 //
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
19 //
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22
23 // GEOM RepairGUI : GUI for Geometry component
24 // File   : RepairGUI_GlueDlg.cxx
25 // Author : Lucien PIGNOLONI, Open CASCADE S.A.S.
26
27 #include "RepairGUI_GlueDlg.h"
28
29 #include <DlgRef.h>
30 #include <GeometryGUI.h>
31 #include <GEOMBase.h>
32 #include <SalomeApp_DoubleSpinBox.h>
33
34 #include <SalomeApp_Application.h>
35 #include <SalomeApp_Study.h>
36 #include <SalomeApp_Tools.h>
37 #include <LightApp_SelectionMgr.h>
38 #include <SUIT_Session.h>
39 #include <SUIT_Desktop.h>
40 #include <SUIT_MessageBox.h>
41 #include <SUIT_OverrideCursor.h>
42 #include <SUIT_ResourceMgr.h>
43 #include <SUIT_ViewWindow.h>
44 #include <SUIT_ViewManager.h>
45 #include <OCCViewer_ViewModel.h>
46 #include <SALOME_ListIO.hxx>
47
48 #include <GEOMImpl_Types.hxx>
49
50 #include <TCollection_AsciiString.hxx>
51
52 #define DEFAULT_TOLERANCE_VALUE 1e-07
53
54 //=================================================================================
55 // class    : RepairGUI_GlueDlg()
56 // purpose  : Constructs a RepairGUI_GlueDlg  which is a child of 'parent', with the
57 //            name 'name' and widget flags set to 'f'.
58 //            The dialog will by default be modeless, unless you set 'modal' to
59 //            TRUE to construct a modal dialog.
60 //=================================================================================
61 RepairGUI_GlueDlg::RepairGUI_GlueDlg(GeometryGUI* theGeometryGUI, QWidget* parent,
62                                      bool modal, TopAbs_ShapeEnum theGlueMode)
63   : GEOMBase_Skeleton(theGeometryGUI, parent, modal),
64     myCurrConstrId(-1), myGlueMode(theGlueMode)
65 {
66   QPixmap image0 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT")));
67   QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_GLUE_FACES")));
68   QPixmap image2 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_GLUE_FACES2")));
69   QPixmap image3 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_GLUE_EDGES")));
70   QPixmap image4 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_GLUE_EDGES2")));
71
72   QString aTitle;
73   if (theGlueMode == TopAbs_FACE)
74     aTitle = tr("GEOM_GLUE_FACES_TITLE");
75   else if (theGlueMode == TopAbs_EDGE)
76     aTitle = tr("GEOM_GLUE_EDGES_TITLE");
77   setWindowTitle(aTitle);
78
79   /***************************************************************/
80   mainFrame()->GroupConstructors->setTitle(aTitle);
81   if (theGlueMode == TopAbs_FACE) {
82     mainFrame()->RadioButton1->setIcon(image1);
83     mainFrame()->RadioButton2->setIcon(image2);
84   }
85   else if (theGlueMode == TopAbs_EDGE) {
86     mainFrame()->RadioButton1->setIcon(image3);
87     mainFrame()->RadioButton2->setIcon(image4);
88   }
89   mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose);
90   mainFrame()->RadioButton3->close();
91
92   GroupPoints = new DlgRef_1SelExt(centralWidget());
93   GroupPoints->GroupBox1->setTitle(tr("GEOM_GLUE"));
94   GroupPoints->TextLabel1->setText(tr("GEOM_SELECTED_SHAPES"));
95   GroupPoints->PushButton1->setIcon(image0);
96   GroupPoints->LineEdit1->setReadOnly(true);
97
98   QLabel* aTolLab = new QLabel(tr("GEOM_TOLERANCE"), GroupPoints->Box);
99   myTolEdt = new SalomeApp_DoubleSpinBox(GroupPoints->Box);
100   initSpinBox(myTolEdt, 0., 100., DEFAULT_TOLERANCE_VALUE, "len_tol_precision");
101   myTolEdt->setValue(DEFAULT_TOLERANCE_VALUE);
102
103   QGridLayout* boxLayout = new QGridLayout(GroupPoints->Box);
104   boxLayout->setMargin(0); boxLayout->setSpacing(6);
105   boxLayout->addWidget(aTolLab,  0, 0);
106   boxLayout->addWidget(myTolEdt, 0, 2);
107   /***************************************************************/
108
109   GroupPoints2 = new DlgRef_1SelExt(centralWidget());
110   GroupPoints2->GroupBox1->setTitle(tr("GEOM_GLUE"));
111   GroupPoints2->TextLabel1->setText(tr("GEOM_SELECTED_SHAPES"));
112   GroupPoints2->PushButton1->setIcon(image0);
113   GroupPoints2->LineEdit1->setReadOnly(true);
114
115   QLabel* aTolLab2 = new QLabel(tr("GEOM_TOLERANCE"), GroupPoints2->Box);
116   myTolEdt2 = new SalomeApp_DoubleSpinBox(GroupPoints2->Box);
117   initSpinBox(myTolEdt2, 0., 100., DEFAULT_TOLERANCE_VALUE, "len_tol_precision");
118   myTolEdt2->setValue(DEFAULT_TOLERANCE_VALUE);
119
120   QString aGlueString (" [%1]");
121   QString aSelString;
122   if (theGlueMode == TopAbs_FACE) {
123     aGlueString = aGlueString.arg(tr("GLUE_FACES"));
124     aSelString = tr("SELECT_FACES");
125   }
126   else if (theGlueMode == TopAbs_EDGE) {
127     aGlueString = aGlueString.arg(tr("GLUE_EDGES"));
128     aSelString = tr("SELECT_EDGES");
129   }
130   myDetectBtn = new QPushButton (tr("GEOM_DETECT") + aGlueString, GroupPoints2->Box);
131   mySubShapesChk = new QCheckBox (aSelString, GroupPoints2->Box);
132   myGlueAllEdgesChk = 0;
133
134   boxLayout = new QGridLayout(GroupPoints2->Box);
135   boxLayout->setMargin(0); boxLayout->setSpacing(6);
136   boxLayout->addWidget(aTolLab2,    0, 0);
137   boxLayout->addWidget(myTolEdt2,   0, 2);
138   boxLayout->addWidget(myDetectBtn, 1, 0, 1, 3);
139   boxLayout->addWidget(mySubShapesChk, 2, 0, 1, 3);
140
141   if (theGlueMode == TopAbs_FACE) {
142     myGlueAllEdgesChk = new QCheckBox (tr("GLUE_ALL_EDGES"), GroupPoints2->Box);
143     boxLayout->addWidget(myGlueAllEdgesChk, 3, 0, 1, 3);
144     myGlueAllEdgesChk->setChecked(false);
145   }
146
147   QVBoxLayout* layout = new QVBoxLayout(centralWidget());
148   layout->setMargin(0); layout->setSpacing(6);
149   layout->addWidget(GroupPoints);
150   layout->addWidget(GroupPoints2);
151
152   /***************************************************************/
153
154   QString aHelpFileName; 
155   switch ( myGlueMode ) {
156     case TopAbs_EDGE:
157       {
158         aHelpFileName = "glue_edges_operation_page.html";
159         break;
160       }
161     case TopAbs_FACE:
162       {
163         aHelpFileName = "glue_faces_operation_page.html";
164         break;
165       }
166   }
167   setHelpFileName(aHelpFileName);
168
169   // Disable second way of gluing if OCC viewer is not active one
170   if (myGeomGUI->getApp()->desktop()->activeWindow()->getViewManager()->getType()
171        != OCCViewer_Viewer::Type())
172     mainFrame()->RadioButton2->setEnabled(false);
173
174   Init();
175 }
176
177 //=================================================================================
178 // function : ~RepairGUI_GlueDlg()
179 // purpose  : Destroys the object and frees any allocated resources
180 //=================================================================================
181 RepairGUI_GlueDlg::~RepairGUI_GlueDlg()
182 {
183 }
184
185 //=================================================================================
186 // function : Init()
187 // purpose  :
188 //=================================================================================
189 void RepairGUI_GlueDlg::Init()
190 {
191   /* init variables */
192   myEditCurrentArgument = GroupPoints->LineEdit1;
193
194   myObjects.clear();
195
196   //myGeomGUI->SetState(0);
197   //globalSelection(GEOM_COMPOUND);
198
199   mainFrame()->GroupBoxPublish->show();
200   //Hide preview checkbox
201   mainFrame()->CheckBoxPreview->hide();
202
203   /* signals and slots connections */
204   connect(buttonOk(),    SIGNAL(clicked()), this, SLOT(ClickOnOk()));
205   connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply()));
206
207   connect(this,          SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int)));
208
209   connect(GroupPoints->PushButton1,  SIGNAL(clicked()),       this, SLOT(SetEditCurrentArgument()));
210   connect(GroupPoints->LineEdit1,    SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed()));
211
212   connect(GroupPoints2->PushButton1, SIGNAL(clicked()),       this, SLOT(SetEditCurrentArgument()));
213   connect(GroupPoints2->LineEdit1,   SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed()));
214   connect(myTolEdt2, SIGNAL(valueChanged(double)), this, SLOT(onTolerChanged(double)));
215   connect(mySubShapesChk, SIGNAL(stateChanged(int)), this, SLOT(onSubShapesChk()));
216
217   connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
218            this, SLOT(SelectionIntoArgument()));
219
220   connect(myDetectBtn, SIGNAL(clicked()), this, SLOT(onDetect()));
221
222   initName(tr("GLUE_NEW_OBJ_NAME"));
223
224   ConstructorsClicked(0);
225
226   activateSelection();
227   updateButtonState();
228 }
229
230 //=================================================================================
231 // function : ConstructorsClicked()
232 // purpose  : Radio button management
233 //=================================================================================
234 void RepairGUI_GlueDlg::ConstructorsClicked(int constructorId)
235 {
236   if (myCurrConstrId == constructorId)
237     return;
238
239   disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
240
241   switch (constructorId) {
242   case 0:
243     GroupPoints2->hide();
244     GroupPoints->show();
245     GroupPoints->LineEdit1->setText("");
246     myEditCurrentArgument = GroupPoints->LineEdit1;
247
248     if (myCurrConstrId >= 0) {
249       // i.e. it is not initialisation
250       // copy tolerance from previous tolerance field
251       myTolEdt->setValue(myTolEdt2->value());
252     }
253     break;
254   case 1:
255     GroupPoints->hide();
256     GroupPoints2->show();
257     GroupPoints->LineEdit1->setText("");
258     myEditCurrentArgument = GroupPoints2->LineEdit1;
259
260     if (myCurrConstrId >= 0) {
261       // i.e. it is not initialisation
262       // copy tolerance from previous tolerance field
263       myTolEdt2->setValue(myTolEdt->value());
264       mySubShapesChk->setChecked(false);
265       clearTemporary();
266     }
267     break;
268   }
269
270   myCurrConstrId = constructorId;
271
272   myEditCurrentArgument->setFocus();
273
274   connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
275            this, SLOT(SelectionIntoArgument()));
276
277   qApp->processEvents();
278   updateGeometry();
279   resize(minimumSizeHint());
280
281   processPreview();
282   updateButtonState();
283   activateSelection();
284   SelectionIntoArgument();
285 }
286
287 //=================================================================================
288 // function : ClickOnOk()
289 // purpose  : Same than click on apply but close this dialog.
290 //=================================================================================
291 void RepairGUI_GlueDlg::ClickOnOk()
292 {
293   setIsApplyAndClose(true);
294   if (ClickOnApply())
295     ClickOnCancel();
296 }
297
298 //=================================================================================
299 // function : ClickOnApply()
300 // purpose  :
301 //=================================================================================
302 bool RepairGUI_GlueDlg::ClickOnApply()
303 {
304   if (!onAcceptLocal())
305     return false;
306
307   initName();
308
309   //GroupPoints->LineEdit1->setText("");
310   //myObject = GEOM::GEOM_Object::_nil();
311
312   //globalSelection(GEOM_COMPOUND);
313
314   ConstructorsClicked(getConstructorId());
315
316   return true;
317 }
318
319
320 //=================================================================================
321 // function : SelectionIntoArgument()
322 // purpose  : Called when selection
323 //=================================================================================
324 void RepairGUI_GlueDlg::SelectionIntoArgument()
325 {
326   if (mySubShapesChk->isChecked() &&  getConstructorId() == 1) {
327     updateButtonState();
328     return;
329   }
330
331   erasePreview();
332   myEditCurrentArgument->setText("");
333   myObjects.clear();
334
335   myObjects = getSelected( TopAbs_SHAPE, -1 );
336
337   if ( !myObjects.isEmpty() ) {
338     QString aName = myObjects.count() > 1 ? QString( "%1_objects").arg( myObjects.count() ) : GEOMBase::GetName( myObjects[0].get() );
339     myEditCurrentArgument->setText( aName );
340   }
341   updateButtonState();
342 }
343
344 //=================================================================================
345 // function : SetEditCurrentArgument()
346 // purpose  :
347 //=================================================================================
348 void RepairGUI_GlueDlg::SetEditCurrentArgument()
349 {
350   const QObject* send = sender();
351   if (send == GroupPoints->PushButton1 || send == GroupPoints2->PushButton1)  {
352     myEditCurrentArgument->setFocus();
353     SelectionIntoArgument();
354   }
355 }
356
357 //=================================================================================
358 // function : LineEditReturnPressed()
359 // purpose  :
360 //=================================================================================
361 void RepairGUI_GlueDlg::LineEditReturnPressed()
362 {
363   const QObject* send = sender();
364   if (send == GroupPoints->LineEdit1) {
365     myEditCurrentArgument = GroupPoints->LineEdit1;
366     GEOMBase_Skeleton::LineEditReturnPressed();
367   }
368   else if (send == GroupPoints2->LineEdit1) {
369     myEditCurrentArgument = GroupPoints2->LineEdit1;
370     GEOMBase_Skeleton::LineEditReturnPressed();
371   }
372 }
373
374 //=================================================================================
375 // function : ActivateThisDialog()
376 // purpose  :
377 //=================================================================================
378 void RepairGUI_GlueDlg::ActivateThisDialog()
379 {
380   GEOMBase_Skeleton::ActivateThisDialog();
381   connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
382            this, SLOT(SelectionIntoArgument()));
383
384   //GroupPoints->LineEdit1->setText("");
385   //GroupPoints2->LineEdit1->setText("");
386   //myObject = GEOM::GEOM_Object::_nil();
387
388   //myGeomGUI->SetState(0);
389   //globalSelection(GEOM_COMPOUND);
390   activateSelection();
391 }
392
393 //=================================================================================
394 // function : enterEvent()
395 // purpose  : Mouse enter onto the dialog to activate it
396 //=================================================================================
397 void RepairGUI_GlueDlg::enterEvent(QEvent*)
398 {
399   if (!mainFrame()->GroupConstructors->isEnabled())
400     ActivateThisDialog();
401 }
402
403 //=================================================================================
404 // function : createOperation
405 // purpose  :
406 //=================================================================================
407 GEOM::GEOM_IOperations_ptr RepairGUI_GlueDlg::createOperation()
408 {
409   return getGeomEngine()->GetIShapesOperations(getStudyId());
410 }
411
412 //=================================================================================
413 // function : isValid
414 // purpose  :
415 //=================================================================================
416 bool RepairGUI_GlueDlg::isValid(QString& msg)
417 {
418   bool ok = true;
419   double v = 0;
420   switch (getConstructorId())
421   {
422   case 0:
423     v = myTolEdt->value();
424     ok = myTolEdt->isValid(msg, !IsPreview());
425     break;
426   case 1:
427     v = myTolEdt2->value();
428     ok = myTolEdt2->isValid(msg, !IsPreview());
429     break;
430   }
431   return !myObjects.isEmpty() && (IsPreview() || v > 0.) && ok;
432 }
433
434 //=================================================================================
435 // function : execute
436 // purpose  :
437 //=================================================================================
438 bool RepairGUI_GlueDlg::execute(ObjectList& objects)
439 {
440   bool aResult = false;
441   objects.clear();
442
443   GEOM::ListOfGO_var objList = new GEOM::ListOfGO;
444   objList->length( myObjects.count() );
445   for ( int i = 0; i < myObjects.count(); ++i )
446     objList[i] = myObjects[i].copy();
447
448   GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow(getOperation());
449   switch (getConstructorId()) {
450   case 0:
451     {
452       GEOM::GEOM_Object_var anObj;
453       if (myGlueMode == TopAbs_FACE)
454         anObj = anOper->MakeGlueFaces( objList, myTolEdt->value(), true);
455       else if (myGlueMode == TopAbs_EDGE)
456         anObj = anOper->MakeGlueEdges( objList, myTolEdt->value());
457
458       aResult = !anObj->_is_nil();
459       if (aResult && !IsPreview())
460       {
461         QStringList aParameters;
462         aParameters << myTolEdt->text();
463         anObj->SetParameters(aParameters.join(":").toLatin1().constData());
464
465         objects.push_back(anObj._retn());
466       }
467       break;
468     }
469   case 1:
470     {
471       if (IsPreview()) {
472         // if this method is used for displaying preview then we must detect glue faces/edges only
473         for (int i = 0; i < myTmpObjs.count(); i++) {
474           myTmpObjs[i].get()->Register(); // increment counter, since calling function will call UnRegister()
475           objects.push_back(myTmpObjs[i].copy());
476         }
477         return !myTmpObjs.isEmpty();
478       } // IsPreview
479
480       // Make glue faces/edges by list.
481       // Iterate through myTmpObjs and verifies where each object is currently selected or not.
482       QSet<QString> selected;
483
484       // Get names of selected objects
485       LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
486       SALOME_ListIO aSelList;
487       aSelMgr->selectedObjects(aSelList);
488
489       SALOME_ListIteratorOfListIO it (aSelList);
490       for (; it.More(); it.Next())
491         selected.insert(it.Value()->getName());
492
493       // Iterate through result and select objects with names from selection
494       // ObjectList toRemoveFromEnggine;
495
496       // make glue faces/edges
497       GEOM::ListOfGO_var aListForGlue = new GEOM::ListOfGO();
498       aListForGlue->length(myTmpObjs.count());
499       int added = 0;
500       for (int i = 0; i < myTmpObjs.count(); i++) {
501         CORBA::String_var tmpior = myGeomGUI->getApp()->orb()->object_to_string(myTmpObjs[i].get());
502         if (selected.contains(tmpior.in()))
503           aListForGlue[ added++ ] = myTmpObjs[i].copy();
504       }
505       aListForGlue->length(added);
506
507       GEOM::GEOM_Object_var anObj;
508       if (myGlueMode == TopAbs_FACE) {
509         bool doGlueAllEdges = myGlueAllEdgesChk->isChecked();
510         anObj = anOper->MakeGlueFacesByList( objList, myTolEdt2->value(), aListForGlue.in(),
511                                             true, doGlueAllEdges);
512       }
513       else if (myGlueMode == TopAbs_EDGE)
514         anObj = anOper->MakeGlueEdgesByList( objList, myTolEdt2->value(), aListForGlue.in());
515
516       aResult = !anObj->_is_nil();
517
518       if (aResult) {
519         if (!IsPreview()) {
520           QStringList aParameters;
521           aParameters << myTolEdt2->text();
522           anObj->SetParameters(aParameters.join(":").toLatin1().constData());
523         }
524         objects.push_back(anObj._retn());
525       }
526
527       // Remove from engine useless objects
528       clearTemporary();
529
530       updateButtonState();
531
532       break;
533     } // case 1
534   } // switch
535
536   return aResult;
537 }
538
539 //=================================================================================
540 // function : restoreSubShapes
541 // purpose  :
542 //=================================================================================
543 void RepairGUI_GlueDlg::restoreSubShapes(SALOMEDS::Study_ptr   theStudy,
544                                           SALOMEDS::SObject_ptr theSObject)
545 {
546   if (mainFrame()->CheckBoxRestoreSS->isChecked()) {
547     GEOM::find_shape_method aFindMethod = GEOM::FSM_GetInPlace;
548     if (getConstructorId() == 0) // MakeGlueFaces or MakeGlueEdges
549       aFindMethod = GEOM::FSM_GetInPlaceByHistory;
550
551     // empty list of arguments means that all arguments should be restored
552     getGeomEngine()->RestoreSubShapesSO(theStudy, theSObject, GEOM::ListOfGO(),
553                                          aFindMethod, /*theInheritFirstArg=*/true,
554                                          mainFrame()->CheckBoxAddPrefix->isChecked());
555   }
556 }
557
558 //================================================================
559 // Function : clearShapeBufferLocal
560 // Purpose  :
561 //================================================================
562 void RepairGUI_GlueDlg::clearShapeBufferLocal(GEOM::GEOM_Object_ptr theObj)
563 {
564   if (CORBA::is_nil(theObj))
565     return;
566
567   CORBA::String_var IOR = myGeomGUI->getApp()->orb()->object_to_string(theObj);
568   TCollection_AsciiString asciiIOR((char *)(IOR.in()));
569   myGeomGUI->GetShapeReader().RemoveShapeFromBuffer(asciiIOR);
570
571   if (!getStudy() || !(getStudy()->studyDS()))
572     return;
573
574   _PTR(Study) aStudy = getStudy()->studyDS();
575   _PTR(SObject) aSObj (aStudy->FindObjectIOR(std::string(IOR.in())));
576   if (!aSObj)
577     return;
578
579   _PTR(ChildIterator) anIt (aStudy->NewChildIterator(aSObj));
580   for (anIt->InitEx(true); anIt->More(); anIt->Next()) {
581     _PTR(GenericAttribute) anAttr;
582     if (anIt->Value()->FindAttribute(anAttr, "AttributeIOR")) {
583       _PTR(AttributeIOR) anIOR (anAttr);
584       TCollection_AsciiString asciiIOR((char*)anIOR->Value().c_str());
585       myGeomGUI->GetShapeReader().RemoveShapeFromBuffer(asciiIOR);
586     }
587   }
588 }
589
590 //================================================================
591 // Function : onAccept
592 // Purpose  : This method should be called from dialog's slots onOk() and onApply()
593 //            It perfroms user input validation, then it
594 //            performs a proper operation and manages transactions, etc.
595 //================================================================
596 bool RepairGUI_GlueDlg::onAcceptLocal()
597 {
598   if (!getStudy() || !(getStudy()->studyDS()))
599     return false;
600
601   _PTR(Study) aStudy = getStudy()->studyDS();
602
603   bool aLocked = aStudy->GetProperties()->IsLocked();
604   if (aLocked) {
605     MESSAGE("GEOMBase_Helper::onAccept - ActiveStudy is locked");
606     SUIT_MessageBox::warning(this, tr("WRN_WARNING"), tr("WRN_STUDY_LOCKED"), tr("BUT_OK"));
607     return false;
608   }
609
610   QString msg;
611   if (!isValid(msg)) {
612     showError(msg);
613     return false;
614   }
615
616   erasePreview(false);
617
618   try {
619     if (openCommand()) {
620       SUIT_OverrideCursor wc;
621
622       myGeomGUI->getApp()->putInfo("");
623       ObjectList objects;
624
625       if (!execute(objects)) {
626         wc.suspend();
627         abortCommand();
628         showError();
629       }
630       else {
631         const int nbObjs = objects.size();
632         for (ObjectList::iterator it = objects.begin(); it != objects.end(); ++it) {
633           QString aName = getNewObjectName();
634           if (nbObjs > 1) {
635             if (aName.isEmpty())
636               aName = getPrefix(*it);
637             aName = GEOMBase::GetDefaultName(aName);
638           }
639           else {
640             // PAL6521: use a prefix, if some dialog box doesn't reimplement getNewObjectName()
641             if (aName.isEmpty())
642               aName = GEOMBase::GetDefaultName(getPrefix(*it));
643           }
644           addInStudy(*it, aName.toLatin1().data());
645           display(*it, false);
646         }
647
648         if (nbObjs) {
649           commitCommand();
650           updateObjBrowser();
651           myGeomGUI->getApp()->putInfo(QObject::tr("GEOM_PRP_DONE"));
652         }
653         else {
654           abortCommand();
655         }
656
657         // JFA 28.12.2004 BEGIN // To enable warnings
658         GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow(getOperation());
659         if (!CORBA::is_nil(anOper) && !anOper->IsDone()) {
660           wc.suspend();
661           QString msgw = QObject::tr(anOper->GetErrorCode());
662           SUIT_MessageBox::warning(this, tr("WRN_WARNING"), msgw, tr("BUT_OK"));
663         }
664         // JFA 28.12.2004 END
665       }
666     }
667   }
668   catch(const SALOME::SALOME_Exception& e) {
669     SalomeApp_Tools::QtCatchCorbaException(e);
670     abortCommand();
671   }
672
673   updateViewer();
674   activateSelection();
675   updateButtonState();
676
677   return true;
678 }
679
680 //=================================================================================
681 // function : onDetect
682 // purpose  :
683 //=================================================================================
684 void RepairGUI_GlueDlg::onDetect()
685 {
686   clearTemporary();
687   QString msg;
688   if (!isValid(msg)) {
689     showError(msg);
690     return;
691   }
692
693   buttonOk()->setEnabled(false);
694   buttonApply()->setEnabled(false);
695   globalSelection(GEOM_ALLSHAPES);
696
697   GEOM::ListOfGO_var objList = new GEOM::ListOfGO;
698   objList->length( myObjects.count() );
699   for ( int i = 0; i < myObjects.count(); ++i )
700     objList[i] = myObjects[i].copy();
701
702   GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow(getOperation());
703   GEOM::ListOfGO_var aList;
704   if (myGlueMode == TopAbs_FACE)
705     aList = anOper->GetGlueFaces( objList, myTolEdt2->value());
706   else if (myGlueMode == TopAbs_EDGE)
707     aList = anOper->GetGlueEdges( objList, myTolEdt2->value());
708
709   for (int i = 0, n = aList->length(); i < n; i++)
710     myTmpObjs << GEOM::GeomObjPtr(aList[i].in());
711
712   if (!myTmpObjs.isEmpty()) {
713     if (myGlueMode == TopAbs_FACE)
714       msg = tr("FACES_FOR_GLUING_ARE_DETECTED").arg(myTmpObjs.count());
715     else if (myGlueMode == TopAbs_EDGE)
716       msg = tr("EDGES_FOR_GLUING_ARE_DETECTED").arg(myTmpObjs.count());
717     mySubShapesChk->setChecked(true);
718   }
719   else {
720     if (myGlueMode == TopAbs_FACE)
721       msg = tr("THERE_ARE_NO_FACES_FOR_GLUING");
722     else if (myGlueMode == TopAbs_EDGE)
723       msg = tr("THERE_ARE_NO_EDGES_FOR_GLUING");
724   }
725
726   connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
727           this, SLOT(SelectionIntoArgument())) ;
728   if ( myGlueMode == TopAbs_FACE )
729     SUIT_MessageBox::information(this, tr("GEOM_GLUE_FACES_DETECT_TITLE"), msg, tr("Close"));
730   else
731     SUIT_MessageBox::information(this, tr("GEOM_GLUE_EDGES_DETECT_TITLE"), msg, tr("Close"));
732   updateButtonState();
733   activateSelection();
734 }
735
736 //=================================================================================
737 // function : activateSelection
738 // purpose  : Redisplay preview and Activate selection
739 //=================================================================================
740 void RepairGUI_GlueDlg::activateSelection()
741 {
742   erasePreview(false);
743
744   int anId = getConstructorId();
745   if (anId == 0) {
746     // Case of whole gluing
747     disconnect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
748                 this, SLOT(SelectionIntoArgument()));
749
750     globalSelection(GEOM_ALLSHAPES);
751     if ( myObjects.isEmpty() )
752       SelectionIntoArgument();
753
754     connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
755              this, SLOT(SelectionIntoArgument()));
756   }
757   else {
758     // Second case of gluing
759     if (!mySubShapesChk->isChecked())
760       globalSelection(GEOM_ALLSHAPES);
761     else {
762       displayPreview(true, true, false, false, 2/*line width*/, 1/*display mode*/, Quantity_NOC_RED);
763       disconnect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
764                   this, SLOT(SelectionIntoArgument())) ;
765       globalSelection(GEOM_PREVIEW);
766       connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
767                this, SLOT(SelectionIntoArgument())) ;
768     }
769   }
770   updateViewer();
771 }
772
773 //=================================================================================
774 // function : updateButtonState
775 // purpose  : Update button state
776 //=================================================================================
777 void RepairGUI_GlueDlg::updateButtonState()
778 {
779   int anId = getConstructorId();
780   bool hasMainObj = !myObjects.isEmpty();
781   if (anId == 0) {
782     buttonOk()->setEnabled(hasMainObj);
783     buttonApply()->setEnabled(hasMainObj);
784   }
785   else
786   {
787     LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
788     SALOME_ListIO aSelList;
789     aSelMgr->selectedObjects(aSelList);
790
791     SALOME_ListIteratorOfListIO it (aSelList);
792     bool wasSelected = it.More() > 0;
793     bool wasDetected = !myTmpObjs.isEmpty();
794     buttonOk()->setEnabled(hasMainObj && wasDetected && wasSelected);
795     buttonApply()->setEnabled(hasMainObj && wasDetected && wasSelected);
796     mySubShapesChk->setEnabled(hasMainObj && wasDetected);
797     myDetectBtn->setEnabled(hasMainObj);
798     if (!hasMainObj || !wasDetected)
799       mySubShapesChk->setChecked(false);
800   }
801 }
802
803 //=================================================================================
804 // function : clearTemporary
805 // purpose  : Remove temporary objects from engine
806 //=================================================================================
807 void RepairGUI_GlueDlg::clearTemporary()
808 {
809   myTmpObjs.clear();
810 }
811
812 //=================================================================================
813 // function : onTolerChanged
814 // purpose  : Remove temporary objects from engine
815 //=================================================================================
816 void RepairGUI_GlueDlg::onTolerChanged(double /*theVal*/)
817 {
818   clearTemporary();
819   activateSelection();
820   updateButtonState();
821 }
822
823 //=================================================================================
824 // function : onSubShapesChk
825 // purpose  : Update selection mode
826 //=================================================================================
827 void RepairGUI_GlueDlg::onSubShapesChk()
828 {
829   if (!mySubShapesChk->isChecked())
830     clearTemporary();
831   activateSelection();
832   updateButtonState();
833 }
834
835 //=================================================================================
836 // function : ClickOnCancel
837 // purpose  : Remove temporary objects from engine and call method of base class
838 //=================================================================================
839 void RepairGUI_GlueDlg::ClickOnCancel()
840 {
841   clearTemporary();
842   GEOMBase_Skeleton::ClickOnCancel();
843 }