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