1 // Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // GEOM RepairGUI : GUI for Geometry component
24 // File : RepairGUI_GlueDlg.cxx
25 // Author : Lucien PIGNOLONI, Open CASCADE S.A.S.
27 #include "RepairGUI_GlueDlg.h"
30 #include <GeometryGUI.h>
32 #include <SalomeApp_DoubleSpinBox.h>
33 #include "utilities.h"
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 #include "utilities.h"
50 #include <GEOMImpl_Types.hxx>
52 #include <TCollection_AsciiString.hxx>
54 #define DEFAULT_TOLERANCE_VALUE 1e-07
56 //=================================================================================
57 // class : RepairGUI_GlueDlg()
58 // purpose : Constructs a RepairGUI_GlueDlg which is a child of 'parent', with the
59 // name 'name' and widget flags set to 'f'.
60 // The dialog will by default be modeless, unless you set 'modal' to
61 // TRUE to construct a modal dialog.
62 //=================================================================================
63 RepairGUI_GlueDlg::RepairGUI_GlueDlg(GeometryGUI* theGeometryGUI, QWidget* parent,
64 bool modal, TopAbs_ShapeEnum theGlueMode)
65 : GEOMBase_Skeleton(theGeometryGUI, parent, modal),
66 myCurrConstrId(-1), myGlueMode(theGlueMode)
68 QPixmap image0 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT")));
69 QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_GLUE_FACES")));
70 QPixmap image2 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_GLUE_FACES2")));
71 QPixmap image3 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_GLUE_EDGES")));
72 QPixmap image4 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_GLUE_EDGES2")));
75 if (theGlueMode == TopAbs_FACE)
76 aTitle = tr("GEOM_GLUE_FACES_TITLE");
77 else if (theGlueMode == TopAbs_EDGE)
78 aTitle = tr("GEOM_GLUE_EDGES_TITLE");
79 setWindowTitle(aTitle);
81 /***************************************************************/
82 mainFrame()->GroupConstructors->setTitle(aTitle);
83 if (theGlueMode == TopAbs_FACE) {
84 mainFrame()->RadioButton1->setIcon(image1);
85 mainFrame()->RadioButton2->setIcon(image2);
87 else if (theGlueMode == TopAbs_EDGE) {
88 mainFrame()->RadioButton1->setIcon(image3);
89 mainFrame()->RadioButton2->setIcon(image4);
91 mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose);
92 mainFrame()->RadioButton3->close();
94 GroupPoints = new DlgRef_1SelExt(centralWidget());
95 GroupPoints->GroupBox1->setTitle(tr("GEOM_GLUE"));
96 GroupPoints->TextLabel1->setText(tr("GEOM_SELECTED_SHAPES"));
97 GroupPoints->PushButton1->setIcon(image0);
98 GroupPoints->LineEdit1->setReadOnly(true);
100 QLabel* aTolLab = new QLabel(tr("GEOM_TOLERANCE"), GroupPoints->Box);
101 myTolEdt = new SalomeApp_DoubleSpinBox(GroupPoints->Box);
102 initSpinBox(myTolEdt, 0., 100., DEFAULT_TOLERANCE_VALUE, "len_tol_precision");
103 myTolEdt->setValue(DEFAULT_TOLERANCE_VALUE);
105 QGridLayout* boxLayout = new QGridLayout(GroupPoints->Box);
106 boxLayout->setMargin(0); boxLayout->setSpacing(6);
107 boxLayout->addWidget(aTolLab, 0, 0);
108 boxLayout->addWidget(myTolEdt, 0, 2);
109 /***************************************************************/
111 GroupPoints2 = new DlgRef_1SelExt(centralWidget());
112 GroupPoints2->GroupBox1->setTitle(tr("GEOM_GLUE"));
113 GroupPoints2->TextLabel1->setText(tr("GEOM_SELECTED_SHAPES"));
114 GroupPoints2->PushButton1->setIcon(image0);
115 GroupPoints2->LineEdit1->setReadOnly(true);
117 QLabel* aTolLab2 = new QLabel(tr("GEOM_TOLERANCE"), GroupPoints2->Box);
118 myTolEdt2 = new SalomeApp_DoubleSpinBox(GroupPoints2->Box);
119 initSpinBox(myTolEdt2, 0., 100., DEFAULT_TOLERANCE_VALUE, "len_tol_precision");
120 myTolEdt2->setValue(DEFAULT_TOLERANCE_VALUE);
122 QString aGlueString (" [%1]");
124 if (theGlueMode == TopAbs_FACE) {
125 aGlueString = aGlueString.arg(tr("GLUE_FACES"));
126 aSelString = tr("SELECT_FACES");
128 else if (theGlueMode == TopAbs_EDGE) {
129 aGlueString = aGlueString.arg(tr("GLUE_EDGES"));
130 aSelString = tr("SELECT_EDGES");
132 myDetectBtn = new QPushButton (tr("GEOM_DETECT") + aGlueString, GroupPoints2->Box);
133 mySubShapesChk = new QCheckBox (aSelString, GroupPoints2->Box);
134 myGlueAllEdgesChk = 0;
136 boxLayout = new QGridLayout(GroupPoints2->Box);
137 boxLayout->setMargin(0); boxLayout->setSpacing(6);
138 boxLayout->addWidget(aTolLab2, 0, 0);
139 boxLayout->addWidget(myTolEdt2, 0, 2);
140 boxLayout->addWidget(myDetectBtn, 1, 0, 1, 3);
141 boxLayout->addWidget(mySubShapesChk, 2, 0, 1, 3);
143 if (theGlueMode == TopAbs_FACE) {
144 myGlueAllEdgesChk = new QCheckBox (tr("GLUE_ALL_EDGES"), GroupPoints2->Box);
145 boxLayout->addWidget(myGlueAllEdgesChk, 3, 0, 1, 3);
146 myGlueAllEdgesChk->setChecked(false);
149 QVBoxLayout* layout = new QVBoxLayout(centralWidget());
150 layout->setMargin(0); layout->setSpacing(6);
151 layout->addWidget(GroupPoints);
152 layout->addWidget(GroupPoints2);
154 /***************************************************************/
156 QString aHelpFileName;
157 switch ( myGlueMode ) {
160 aHelpFileName = "glue_edges_operation_page.html";
165 aHelpFileName = "glue_faces_operation_page.html";
169 setHelpFileName(aHelpFileName);
171 // Disable second way of gluing if OCC viewer is not active one
172 if (myGeomGUI->getApp()->desktop()->activeWindow()->getViewManager()->getType()
173 != OCCViewer_Viewer::Type())
174 mainFrame()->RadioButton2->setEnabled(false);
179 //=================================================================================
180 // function : ~RepairGUI_GlueDlg()
181 // purpose : Destroys the object and frees any allocated resources
182 //=================================================================================
183 RepairGUI_GlueDlg::~RepairGUI_GlueDlg()
187 //=================================================================================
190 //=================================================================================
191 void RepairGUI_GlueDlg::Init()
194 myEditCurrentArgument = GroupPoints->LineEdit1;
198 //myGeomGUI->SetState(0);
199 //globalSelection(GEOM_COMPOUND);
201 mainFrame()->GroupBoxPublish->show();
202 //Hide preview checkbox
203 mainFrame()->CheckBoxPreview->hide();
205 /* signals and slots connections */
206 connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk()));
207 connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply()));
209 connect(this, SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int)));
211 connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
212 connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed()));
214 connect(GroupPoints2->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
215 connect(GroupPoints2->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed()));
216 connect(myTolEdt2, SIGNAL(valueChanged(double)), this, SLOT(onTolerChanged(double)));
217 connect(mySubShapesChk, SIGNAL(stateChanged(int)), this, SLOT(onSubShapesChk()));
219 connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
220 this, SLOT(SelectionIntoArgument()));
222 connect(myDetectBtn, SIGNAL(clicked()), this, SLOT(onDetect()));
224 initName(tr("GLUE_NEW_OBJ_NAME"));
226 ConstructorsClicked(0);
232 //=================================================================================
233 // function : ConstructorsClicked()
234 // purpose : Radio button management
235 //=================================================================================
236 void RepairGUI_GlueDlg::ConstructorsClicked(int constructorId)
238 if (myCurrConstrId == constructorId)
241 disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
243 switch (constructorId) {
245 GroupPoints2->hide();
247 GroupPoints->LineEdit1->setText("");
248 myEditCurrentArgument = GroupPoints->LineEdit1;
250 if (myCurrConstrId >= 0) {
251 // i.e. it is not initialisation
252 // copy tolerance from previous tolerance field
253 myTolEdt->setValue(myTolEdt2->value());
258 GroupPoints2->show();
259 GroupPoints->LineEdit1->setText("");
260 myEditCurrentArgument = GroupPoints2->LineEdit1;
262 if (myCurrConstrId >= 0) {
263 // i.e. it is not initialisation
264 // copy tolerance from previous tolerance field
265 myTolEdt2->setValue(myTolEdt->value());
266 mySubShapesChk->setChecked(false);
272 myCurrConstrId = constructorId;
274 myEditCurrentArgument->setFocus();
276 connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
277 this, SLOT(SelectionIntoArgument()));
279 qApp->processEvents();
281 resize(minimumSizeHint());
286 SelectionIntoArgument();
289 //=================================================================================
290 // function : ClickOnOk()
291 // purpose : Same than click on apply but close this dialog.
292 //=================================================================================
293 void RepairGUI_GlueDlg::ClickOnOk()
295 setIsApplyAndClose(true);
300 //=================================================================================
301 // function : ClickOnApply()
303 //=================================================================================
304 bool RepairGUI_GlueDlg::ClickOnApply()
306 if (!onAcceptLocal())
311 //GroupPoints->LineEdit1->setText("");
312 //myObject = GEOM::GEOM_Object::_nil();
314 //globalSelection(GEOM_COMPOUND);
316 ConstructorsClicked(getConstructorId());
322 //=================================================================================
323 // function : SelectionIntoArgument()
324 // purpose : Called when selection
325 //=================================================================================
326 void RepairGUI_GlueDlg::SelectionIntoArgument()
328 if (mySubShapesChk->isChecked() && getConstructorId() == 1) {
334 myEditCurrentArgument->setText("");
337 myObjects = getSelected( TopAbs_SHAPE, -1 );
339 if ( !myObjects.isEmpty() ) {
340 QString aName = myObjects.count() > 1 ? QString( "%1_objects").arg( myObjects.count() ) : GEOMBase::GetName( myObjects[0].get() );
341 myEditCurrentArgument->setText( aName );
346 //=================================================================================
347 // function : SetEditCurrentArgument()
349 //=================================================================================
350 void RepairGUI_GlueDlg::SetEditCurrentArgument()
352 const QObject* send = sender();
353 if (send == GroupPoints->PushButton1 || send == GroupPoints2->PushButton1) {
354 myEditCurrentArgument->setFocus();
355 SelectionIntoArgument();
359 //=================================================================================
360 // function : LineEditReturnPressed()
362 //=================================================================================
363 void RepairGUI_GlueDlg::LineEditReturnPressed()
365 const QObject* send = sender();
366 if (send == GroupPoints->LineEdit1) {
367 myEditCurrentArgument = GroupPoints->LineEdit1;
368 GEOMBase_Skeleton::LineEditReturnPressed();
370 else if (send == GroupPoints2->LineEdit1) {
371 myEditCurrentArgument = GroupPoints2->LineEdit1;
372 GEOMBase_Skeleton::LineEditReturnPressed();
376 //=================================================================================
377 // function : ActivateThisDialog()
379 //=================================================================================
380 void RepairGUI_GlueDlg::ActivateThisDialog()
382 GEOMBase_Skeleton::ActivateThisDialog();
383 connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
384 this, SLOT(SelectionIntoArgument()));
386 //GroupPoints->LineEdit1->setText("");
387 //GroupPoints2->LineEdit1->setText("");
388 //myObject = GEOM::GEOM_Object::_nil();
390 //myGeomGUI->SetState(0);
391 //globalSelection(GEOM_COMPOUND);
395 //=================================================================================
396 // function : enterEvent()
397 // purpose : Mouse enter onto the dialog to activate it
398 //=================================================================================
399 void RepairGUI_GlueDlg::enterEvent(QEvent*)
401 if (!mainFrame()->GroupConstructors->isEnabled())
402 ActivateThisDialog();
405 //=================================================================================
406 // function : createOperation
408 //=================================================================================
409 GEOM::GEOM_IOperations_ptr RepairGUI_GlueDlg::createOperation()
411 return getGeomEngine()->GetIShapesOperations(getStudyId());
414 //=================================================================================
415 // function : isValid
417 //=================================================================================
418 bool RepairGUI_GlueDlg::isValid(QString& msg)
422 switch (getConstructorId())
425 v = myTolEdt->value();
426 ok = myTolEdt->isValid(msg, !IsPreview());
429 v = myTolEdt2->value();
430 ok = myTolEdt2->isValid(msg, !IsPreview());
433 return !myObjects.isEmpty() && (IsPreview() || v > 0.) && ok;
436 //=================================================================================
437 // function : execute
439 //=================================================================================
440 bool RepairGUI_GlueDlg::execute(ObjectList& objects)
442 bool aResult = false;
445 GEOM::ListOfGO_var objList = new GEOM::ListOfGO;
446 objList->length( myObjects.count() );
447 for ( int i = 0; i < myObjects.count(); ++i )
448 objList[i] = myObjects[i].copy();
450 GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow(getOperation());
451 switch (getConstructorId()) {
454 GEOM::GEOM_Object_var anObj;
455 if (myGlueMode == TopAbs_FACE)
456 anObj = anOper->MakeGlueFaces( objList, myTolEdt->value(), true);
457 else if (myGlueMode == TopAbs_EDGE)
458 anObj = anOper->MakeGlueEdges( objList, myTolEdt->value());
460 aResult = !anObj->_is_nil();
461 if (aResult && !IsPreview())
463 QStringList aParameters;
464 aParameters << myTolEdt->text();
465 anObj->SetParameters(aParameters.join(":").toLatin1().constData());
467 objects.push_back(anObj._retn());
474 // if this method is used for displaying preview then we must detect glue faces/edges only
475 for (int i = 0; i < myTmpObjs.count(); i++) {
476 myTmpObjs[i].get()->Register(); // increment counter, since calling function will call UnRegister()
477 objects.push_back(myTmpObjs[i].copy());
479 return !myTmpObjs.isEmpty();
482 // Make glue faces/edges by list.
483 // Iterate through myTmpObjs and verifies where each object is currently selected or not.
484 QSet<QString> selected;
486 // Get names of selected objects
487 LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
488 SALOME_ListIO aSelList;
489 aSelMgr->selectedObjects(aSelList);
491 SALOME_ListIteratorOfListIO it (aSelList);
492 for (; it.More(); it.Next())
493 selected.insert(it.Value()->getName());
495 // Iterate through result and select objects with names from selection
496 // ObjectList toRemoveFromEnggine;
498 // make glue faces/edges
499 GEOM::ListOfGO_var aListForGlue = new GEOM::ListOfGO();
500 aListForGlue->length(myTmpObjs.count());
502 for (int i = 0; i < myTmpObjs.count(); i++) {
503 CORBA::String_var tmpior = myGeomGUI->getApp()->orb()->object_to_string(myTmpObjs[i].get());
504 if (selected.contains(tmpior.in()))
505 aListForGlue[ added++ ] = myTmpObjs[i].copy();
507 aListForGlue->length(added);
509 GEOM::GEOM_Object_var anObj;
510 if (myGlueMode == TopAbs_FACE) {
511 bool doGlueAllEdges = myGlueAllEdgesChk->isChecked();
512 anObj = anOper->MakeGlueFacesByList( objList, myTolEdt2->value(), aListForGlue.in(),
513 true, doGlueAllEdges);
515 else if (myGlueMode == TopAbs_EDGE)
516 anObj = anOper->MakeGlueEdgesByList( objList, myTolEdt2->value(), aListForGlue.in());
518 aResult = !anObj->_is_nil();
522 QStringList aParameters;
523 aParameters << myTolEdt2->text();
524 anObj->SetParameters(aParameters.join(":").toLatin1().constData());
526 objects.push_back(anObj._retn());
529 // Remove from engine useless objects
541 //=================================================================================
542 // function : restoreSubShapes
544 //=================================================================================
545 void RepairGUI_GlueDlg::restoreSubShapes(SALOMEDS::Study_ptr theStudy,
546 SALOMEDS::SObject_ptr theSObject)
548 if (mainFrame()->CheckBoxRestoreSS->isChecked()) {
549 GEOM::find_shape_method aFindMethod = GEOM::FSM_GetInPlace;
550 if (getConstructorId() == 0) // MakeGlueFaces or MakeGlueEdges
551 aFindMethod = GEOM::FSM_GetInPlaceByHistory;
553 // empty list of arguments means that all arguments should be restored
554 getGeomEngine()->RestoreSubShapesSO(theStudy, theSObject, GEOM::ListOfGO(),
555 aFindMethod, /*theInheritFirstArg=*/true,
556 mainFrame()->CheckBoxAddPrefix->isChecked());
560 //================================================================
561 // Function : clearShapeBufferLocal
563 //================================================================
564 void RepairGUI_GlueDlg::clearShapeBufferLocal(GEOM::GEOM_Object_ptr theObj)
566 if (CORBA::is_nil(theObj))
569 CORBA::String_var IOR = myGeomGUI->getApp()->orb()->object_to_string(theObj);
570 TCollection_AsciiString asciiIOR((char *)(IOR.in()));
571 myGeomGUI->GetShapeReader().RemoveShapeFromBuffer(asciiIOR);
573 if (!getStudy() || !(getStudy()->studyDS()))
576 _PTR(Study) aStudy = getStudy()->studyDS();
577 _PTR(SObject) aSObj (aStudy->FindObjectIOR(std::string(IOR.in())));
581 _PTR(ChildIterator) anIt (aStudy->NewChildIterator(aSObj));
582 for (anIt->InitEx(true); anIt->More(); anIt->Next()) {
583 _PTR(GenericAttribute) anAttr;
584 if (anIt->Value()->FindAttribute(anAttr, "AttributeIOR")) {
585 _PTR(AttributeIOR) anIOR (anAttr);
586 TCollection_AsciiString asciiIOR((char*)anIOR->Value().c_str());
587 myGeomGUI->GetShapeReader().RemoveShapeFromBuffer(asciiIOR);
592 //================================================================
593 // Function : onAccept
594 // Purpose : This method should be called from dialog's slots onOk() and onApply()
595 // It perfroms user input validation, then it
596 // performs a proper operation and manages transactions, etc.
597 //================================================================
598 bool RepairGUI_GlueDlg::onAcceptLocal()
600 if (!getStudy() || !(getStudy()->studyDS()))
603 _PTR(Study) aStudy = getStudy()->studyDS();
605 bool aLocked = aStudy->GetProperties()->IsLocked();
607 MESSAGE("GEOMBase_Helper::onAccept - ActiveStudy is locked");
608 SUIT_MessageBox::warning(this, tr("WRN_WARNING"), tr("WRN_STUDY_LOCKED"), tr("BUT_OK"));
620 SUIT_OverrideCursor wc;
622 myGeomGUI->getApp()->putInfo("");
625 if (!execute(objects)) {
631 const int nbObjs = objects.size();
632 for (ObjectList::iterator it = objects.begin(); it != objects.end(); ++it) {
633 QString aName = getNewObjectName();
636 aName = getPrefix(*it);
637 aName = GEOMBase::GetDefaultName(aName);
640 // PAL6521: use a prefix, if some dialog box doesn't reimplement getNewObjectName()
642 aName = GEOMBase::GetDefaultName(getPrefix(*it));
644 addInStudy(*it, aName.toLatin1().data());
651 myGeomGUI->getApp()->putInfo(QObject::tr("GEOM_PRP_DONE"));
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()) {
661 QString msgw = QObject::tr(anOper->GetErrorCode());
662 SUIT_MessageBox::warning(this, tr("WRN_WARNING"), msgw, tr("BUT_OK"));
664 // JFA 28.12.2004 END
668 catch(const SALOME::SALOME_Exception& e) {
669 SalomeApp_Tools::QtCatchCorbaException(e);
682 //=================================================================================
683 // function : onDetect
685 //=================================================================================
686 void RepairGUI_GlueDlg::onDetect()
695 buttonOk()->setEnabled(false);
696 buttonApply()->setEnabled(false);
697 globalSelection(GEOM_ALLSHAPES);
699 GEOM::ListOfGO_var objList = new GEOM::ListOfGO;
700 objList->length( myObjects.count() );
701 for ( int i = 0; i < myObjects.count(); ++i )
702 objList[i] = myObjects[i].copy();
704 GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow(getOperation());
705 GEOM::ListOfGO_var aList;
706 if (myGlueMode == TopAbs_FACE)
707 aList = anOper->GetGlueFaces( objList, myTolEdt2->value());
708 else if (myGlueMode == TopAbs_EDGE)
709 aList = anOper->GetGlueEdges( objList, myTolEdt2->value());
711 for (int i = 0, n = aList->length(); i < n; i++)
712 myTmpObjs << GEOM::GeomObjPtr(aList[i].in());
714 if (!myTmpObjs.isEmpty()) {
715 if (myGlueMode == TopAbs_FACE)
716 msg = tr("FACES_FOR_GLUING_ARE_DETECTED").arg(myTmpObjs.count());
717 else if (myGlueMode == TopAbs_EDGE)
718 msg = tr("EDGES_FOR_GLUING_ARE_DETECTED").arg(myTmpObjs.count());
719 mySubShapesChk->setChecked(true);
722 if (myGlueMode == TopAbs_FACE)
723 msg = tr("THERE_ARE_NO_FACES_FOR_GLUING");
724 else if (myGlueMode == TopAbs_EDGE)
725 msg = tr("THERE_ARE_NO_EDGES_FOR_GLUING");
728 connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
729 this, SLOT(SelectionIntoArgument())) ;
730 if ( myGlueMode == TopAbs_FACE )
731 SUIT_MessageBox::information(this, tr("GEOM_GLUE_FACES_DETECT_TITLE"), msg, tr("Close"));
733 SUIT_MessageBox::information(this, tr("GEOM_GLUE_EDGES_DETECT_TITLE"), msg, tr("Close"));
738 //=================================================================================
739 // function : activateSelection
740 // purpose : Redisplay preview and Activate selection
741 //=================================================================================
742 void RepairGUI_GlueDlg::activateSelection()
746 int anId = getConstructorId();
748 // Case of whole gluing
749 disconnect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
750 this, SLOT(SelectionIntoArgument()));
752 globalSelection(GEOM_ALLSHAPES);
753 if ( myObjects.isEmpty() )
754 SelectionIntoArgument();
756 connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
757 this, SLOT(SelectionIntoArgument()));
760 // Second case of gluing
761 if (!mySubShapesChk->isChecked())
762 globalSelection(GEOM_ALLSHAPES);
764 displayPreview(true, true, false, false, 2/*line width*/, 1/*display mode*/, Quantity_NOC_RED);
765 disconnect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
766 this, SLOT(SelectionIntoArgument())) ;
767 globalSelection(GEOM_PREVIEW);
768 connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
769 this, SLOT(SelectionIntoArgument())) ;
775 //=================================================================================
776 // function : updateButtonState
777 // purpose : Update button state
778 //=================================================================================
779 void RepairGUI_GlueDlg::updateButtonState()
781 int anId = getConstructorId();
782 bool hasMainObj = !myObjects.isEmpty();
784 buttonOk()->setEnabled(hasMainObj);
785 buttonApply()->setEnabled(hasMainObj);
789 LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
790 SALOME_ListIO aSelList;
791 aSelMgr->selectedObjects(aSelList);
793 SALOME_ListIteratorOfListIO it (aSelList);
794 bool wasSelected = it.More() > 0;
795 bool wasDetected = !myTmpObjs.isEmpty();
796 buttonOk()->setEnabled(hasMainObj && wasDetected && wasSelected);
797 buttonApply()->setEnabled(hasMainObj && wasDetected && wasSelected);
798 mySubShapesChk->setEnabled(hasMainObj && wasDetected);
799 myDetectBtn->setEnabled(hasMainObj);
800 if (!hasMainObj || !wasDetected)
801 mySubShapesChk->setChecked(false);
805 //=================================================================================
806 // function : clearTemporary
807 // purpose : Remove temporary objects from engine
808 //=================================================================================
809 void RepairGUI_GlueDlg::clearTemporary()
814 //=================================================================================
815 // function : onTolerChanged
816 // purpose : Remove temporary objects from engine
817 //=================================================================================
818 void RepairGUI_GlueDlg::onTolerChanged(double /*theVal*/)
825 //=================================================================================
826 // function : onSubShapesChk
827 // purpose : Update selection mode
828 //=================================================================================
829 void RepairGUI_GlueDlg::onSubShapesChk()
831 if (!mySubShapesChk->isChecked())
837 //=================================================================================
838 // function : ClickOnCancel
839 // purpose : Remove temporary objects from engine and call method of base class
840 //=================================================================================
841 void RepairGUI_GlueDlg::ClickOnCancel()
844 GEOMBase_Skeleton::ClickOnCancel();
847 //=================================================================================
848 // function : getSourceObjects
849 // purpose : virtual method to get source objects
850 //=================================================================================
851 QList<GEOM::GeomObjPtr> RepairGUI_GlueDlg::getSourceObjects()
853 QList<GEOM::GeomObjPtr> res(myObjects);
854 for (int i = 0; i < myTmpObjs.count(); i++)