X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FRepairGUI%2FRepairGUI_GlueDlg.cxx;h=77a027681e3287d70a5f5b81cb233fbf68ccfce9;hb=931cb7d1aee73f4b3691163ee74b73c38546295e;hp=e4f44624692b1d85936cd8854d03c06d79e43e51;hpb=004197ec827d52331f0d529202eb4e52a1c4388f;p=modules%2Fgeom.git diff --git a/src/RepairGUI/RepairGUI_GlueDlg.cxx b/src/RepairGUI/RepairGUI_GlueDlg.cxx index e4f446246..77a027681 100644 --- a/src/RepairGUI/RepairGUI_GlueDlg.cxx +++ b/src/RepairGUI/RepairGUI_GlueDlg.cxx @@ -1,29 +1,29 @@ -// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE // -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. // -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // // GEOM RepairGUI : GUI for Geometry component // File : RepairGUI_GlueDlg.cxx -// Author : Lucien PIGNOLONI, Open CASCADE S.A.S. -// +// Author : Lucien PIGNOLONI, Open CASCADE S.A.S. + #include "RepairGUI_GlueDlg.h" #include @@ -32,9 +32,9 @@ #include #include -#include #include #include +#include #include #include #include @@ -58,81 +58,122 @@ // The dialog will by default be modeless, unless you set 'modal' to // TRUE to construct a modal dialog. //================================================================================= -RepairGUI_GlueDlg::RepairGUI_GlueDlg( GeometryGUI* theGeometryGUI, QWidget* parent, - bool modal ) - : GEOMBase_Skeleton( theGeometryGUI, parent, modal ), - myCurrConstrId( -1 ) +RepairGUI_GlueDlg::RepairGUI_GlueDlg(GeometryGUI* theGeometryGUI, QWidget* parent, + bool modal, TopAbs_ShapeEnum theGlueMode) + : GEOMBase_Skeleton(theGeometryGUI, parent, modal), + myCurrConstrId(-1), myGlueMode(theGlueMode) { - QPixmap image0( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_GLUE_FACES" ) ) ); - QPixmap image2( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_GLUE_FACES2" ) )); - QPixmap image1( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) ); - - setWindowTitle( tr( "GEOM_GLUE_TITLE" ) ); + QPixmap image0 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); + QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_GLUE_FACES"))); + QPixmap image2 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_GLUE_FACES2"))); + QPixmap image3 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_GLUE_EDGES"))); + QPixmap image4 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_GLUE_EDGES2"))); + + QString aTitle; + if (theGlueMode == TopAbs_FACE) + aTitle = tr("GEOM_GLUE_FACES_TITLE"); + else if (theGlueMode == TopAbs_EDGE) + aTitle = tr("GEOM_GLUE_EDGES_TITLE"); + setWindowTitle(aTitle); /***************************************************************/ - mainFrame()->GroupConstructors->setTitle( tr( "GEOM_GLUE_TITLE" ) ); - mainFrame()->RadioButton1->setIcon( image0 ); - mainFrame()->RadioButton2->setIcon( image2 ); - mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose ); + mainFrame()->GroupConstructors->setTitle(aTitle); + if (theGlueMode == TopAbs_FACE) { + mainFrame()->RadioButton1->setIcon(image1); + mainFrame()->RadioButton2->setIcon(image2); + } + else if (theGlueMode == TopAbs_EDGE) { + mainFrame()->RadioButton1->setIcon(image3); + mainFrame()->RadioButton2->setIcon(image4); + } + mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose); mainFrame()->RadioButton3->close(); - GroupPoints = new DlgRef_1SelExt( centralWidget() ); - GroupPoints->GroupBox1->setTitle( tr( "GEOM_GLUE" ) ); - GroupPoints->TextLabel1->setText( tr( "GEOM_SELECTED_SHAPE" ) ); - GroupPoints->PushButton1->setIcon( image1 ); - GroupPoints->LineEdit1->setReadOnly( true ); - - QLabel* aTolLab = new QLabel( tr( "GEOM_TOLERANCE" ), GroupPoints->Box ); - myTolEdt = new SalomeApp_DoubleSpinBox( GroupPoints->Box ); - initSpinBox( myTolEdt, 0., 100., DEFAULT_TOLERANCE_VALUE, "len_tol_precision" ); - myTolEdt->setValue( DEFAULT_TOLERANCE_VALUE ); - - QGridLayout* boxLayout = new QGridLayout( GroupPoints->Box ); - boxLayout->setMargin( 0 ); boxLayout->setSpacing( 6 ); - boxLayout->addWidget( aTolLab, 0, 0 ); - boxLayout->addWidget( myTolEdt, 0, 2 ); + GroupPoints = new DlgRef_1SelExt(centralWidget()); + GroupPoints->GroupBox1->setTitle(tr("GEOM_GLUE")); + GroupPoints->TextLabel1->setText(tr("GEOM_SELECTED_SHAPE")); + GroupPoints->PushButton1->setIcon(image0); + GroupPoints->LineEdit1->setReadOnly(true); + + QLabel* aTolLab = new QLabel(tr("GEOM_TOLERANCE"), GroupPoints->Box); + myTolEdt = new SalomeApp_DoubleSpinBox(GroupPoints->Box); + initSpinBox(myTolEdt, 0., 100., DEFAULT_TOLERANCE_VALUE, "len_tol_precision"); + myTolEdt->setValue(DEFAULT_TOLERANCE_VALUE); + + QGridLayout* boxLayout = new QGridLayout(GroupPoints->Box); + boxLayout->setMargin(0); boxLayout->setSpacing(6); + boxLayout->addWidget(aTolLab, 0, 0); + boxLayout->addWidget(myTolEdt, 0, 2); /***************************************************************/ - GroupPoints2 = new DlgRef_1SelExt( centralWidget() ); - GroupPoints2->GroupBox1->setTitle( tr( "GEOM_GLUE" ) ); - GroupPoints2->TextLabel1->setText( tr( "GEOM_SELECTED_SHAPE" ) ); - GroupPoints2->PushButton1->setIcon( image1 ); - GroupPoints2->LineEdit1->setReadOnly( true ); - - QLabel* aTolLab2 = new QLabel( tr( "GEOM_TOLERANCE" ), GroupPoints2->Box ); - myTolEdt2 = new SalomeApp_DoubleSpinBox( GroupPoints2->Box ); - initSpinBox( myTolEdt2, 0., 100., DEFAULT_TOLERANCE_VALUE, "len_tol_precision" ); - myTolEdt2->setValue( DEFAULT_TOLERANCE_VALUE ); - - myDetectBtn = new QPushButton( tr( "GEOM_DETECT" ) + QString( " [%1]" ).arg( tr( "GLUE_FACES" ) ), - GroupPoints2->Box ); - mySubShapesChk = new QCheckBox( tr( "SELECT_FACES" ), GroupPoints2->Box ); - - boxLayout = new QGridLayout( GroupPoints2->Box ); - boxLayout->setMargin( 0 ); boxLayout->setSpacing( 6 ); - boxLayout->addWidget( aTolLab2, 0, 0 ); - boxLayout->addWidget( myTolEdt2, 0, 2 ); - boxLayout->addWidget( myDetectBtn, 1, 0, 1, 3 ); - boxLayout->addWidget( mySubShapesChk, 2, 0, 1, 3 ); - - QVBoxLayout* layout = new QVBoxLayout( centralWidget() ); - layout->setMargin( 0 ); layout->setSpacing( 6 ); - layout->addWidget( GroupPoints ); - layout->addWidget( GroupPoints2 ); + GroupPoints2 = new DlgRef_1SelExt(centralWidget()); + GroupPoints2->GroupBox1->setTitle(tr("GEOM_GLUE")); + GroupPoints2->TextLabel1->setText(tr("GEOM_SELECTED_SHAPE")); + GroupPoints2->PushButton1->setIcon(image0); + GroupPoints2->LineEdit1->setReadOnly(true); + + QLabel* aTolLab2 = new QLabel(tr("GEOM_TOLERANCE"), GroupPoints2->Box); + myTolEdt2 = new SalomeApp_DoubleSpinBox(GroupPoints2->Box); + initSpinBox(myTolEdt2, 0., 100., DEFAULT_TOLERANCE_VALUE, "len_tol_precision"); + myTolEdt2->setValue(DEFAULT_TOLERANCE_VALUE); + + QString aGlueString (" [%1]"); + QString aSelString; + if (theGlueMode == TopAbs_FACE) { + aGlueString = aGlueString.arg(tr("GLUE_FACES")); + aSelString = tr("SELECT_FACES"); + } + else if (theGlueMode == TopAbs_EDGE) { + aGlueString = aGlueString.arg(tr("GLUE_EDGES")); + aSelString = tr("SELECT_EDGES"); + } + myDetectBtn = new QPushButton (tr("GEOM_DETECT") + aGlueString, GroupPoints2->Box); + mySubShapesChk = new QCheckBox (aSelString, GroupPoints2->Box); + myGlueAllEdgesChk = 0; + + boxLayout = new QGridLayout(GroupPoints2->Box); + boxLayout->setMargin(0); boxLayout->setSpacing(6); + boxLayout->addWidget(aTolLab2, 0, 0); + boxLayout->addWidget(myTolEdt2, 0, 2); + boxLayout->addWidget(myDetectBtn, 1, 0, 1, 3); + boxLayout->addWidget(mySubShapesChk, 2, 0, 1, 3); + + if (theGlueMode == TopAbs_FACE) { + myGlueAllEdgesChk = new QCheckBox (tr("GLUE_ALL_EDGES"), GroupPoints2->Box); + boxLayout->addWidget(myGlueAllEdgesChk, 3, 0, 1, 3); + myGlueAllEdgesChk->setChecked(false); + } + + QVBoxLayout* layout = new QVBoxLayout(centralWidget()); + layout->setMargin(0); layout->setSpacing(6); + layout->addWidget(GroupPoints); + layout->addWidget(GroupPoints2); /***************************************************************/ - setHelpFileName( "glue_faces_operation_page.html" ); - + QString aHelpFileName; + switch ( myGlueMode ) { + case TopAbs_EDGE: + { + aHelpFileName = "glue_edges_operation_page.html"; + break; + } + case TopAbs_FACE: + { + aHelpFileName = "glue_faces_operation_page.html"; + break; + } + } + setHelpFileName(aHelpFileName); + // Disable second way of gluing if OCC viewer is not active one - if ( myGeomGUI->getApp()->desktop()->activeWindow()->getViewManager()->getType() - != OCCViewer_Viewer::Type() ) - mainFrame()->RadioButton2->setEnabled( false ); + if (myGeomGUI->getApp()->desktop()->activeWindow()->getViewManager()->getType() + != OCCViewer_Viewer::Type()) + mainFrame()->RadioButton2->setEnabled(false); Init(); } - //================================================================================= // function : ~RepairGUI_GlueDlg() // purpose : Destroys the object and frees any allocated resources @@ -141,7 +182,6 @@ RepairGUI_GlueDlg::~RepairGUI_GlueDlg() { } - //================================================================================= // function : Init() // purpose : @@ -153,115 +193,115 @@ void RepairGUI_GlueDlg::Init() myObject = GEOM::GEOM_Object::_nil(); - //myGeomGUI->SetState( 0 ); - //globalSelection( GEOM_COMPOUND ); + //myGeomGUI->SetState(0); + //globalSelection(GEOM_COMPOUND); mainFrame()->GroupBoxPublish->show(); + //Hide preview checkbox + mainFrame()->CheckBoxPreview->hide(); /* signals and slots connections */ - connect( buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); - connect( buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); + + connect(this, SIGNAL(constructorsClicked(int)), this, SLOT(ConstructorsClicked(int))); - connect( this, SIGNAL( constructorsClicked( int ) ), this, SLOT( ConstructorsClicked( int ) ) ); + connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); - connect( GroupPoints->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); - connect( GroupPoints->LineEdit1, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) ); + connect(GroupPoints2->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(GroupPoints2->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(myTolEdt2, SIGNAL(valueChanged(double)), this, SLOT(onTolerChanged(double))); + connect(mySubShapesChk, SIGNAL(stateChanged(int)), this, SLOT(onSubShapesChk())); - connect( GroupPoints2->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); - connect( GroupPoints2->LineEdit1, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) ); - connect( myTolEdt2, SIGNAL( valueChanged( double ) ), this, SLOT( onTolerChanged( double ) ) ); - connect( mySubShapesChk, SIGNAL( stateChanged( int ) ), this, SLOT( onSubShapesChk() ) ); + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); - connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), - this, SLOT( SelectionIntoArgument() ) ); + connect(myDetectBtn, SIGNAL(clicked()), this, SLOT(onDetect())); - connect( myDetectBtn, SIGNAL( clicked() ), this, SLOT( onDetect() ) ); + initName(tr("GLUE_NEW_OBJ_NAME")); - initName( tr( "GLUE_NEW_OBJ_NAME" ) ); + ConstructorsClicked(0); - ConstructorsClicked( 0 ); - activateSelection(); updateButtonState(); } - //================================================================================= // function : ConstructorsClicked() // purpose : Radio button management //================================================================================= -void RepairGUI_GlueDlg::ConstructorsClicked( int constructorId ) +void RepairGUI_GlueDlg::ConstructorsClicked(int constructorId) { - if ( myCurrConstrId == constructorId ) + if (myCurrConstrId == constructorId) return; - - disconnect( myGeomGUI->getApp()->selectionMgr(), 0, this, 0 ); - - switch ( constructorId ) { + + disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); + + switch (constructorId) { case 0: GroupPoints2->hide(); GroupPoints->show(); - GroupPoints->LineEdit1->setText( "" ); + GroupPoints->LineEdit1->setText(""); myEditCurrentArgument = GroupPoints->LineEdit1; - - if ( myCurrConstrId >= 0 ) { + + if (myCurrConstrId >= 0) { // i.e. it is not initialisation // copy tolerance from previous tolerance field - myTolEdt->setValue( myTolEdt2->value() ); + myTolEdt->setValue(myTolEdt2->value()); } break; case 1: GroupPoints->hide(); GroupPoints2->show(); - GroupPoints->LineEdit1->setText( "" ); + GroupPoints->LineEdit1->setText(""); myEditCurrentArgument = GroupPoints2->LineEdit1; - - if ( myCurrConstrId >= 0 ) { + + if (myCurrConstrId >= 0) { // i.e. it is not initialisation // copy tolerance from previous tolerance field - myTolEdt2->setValue( myTolEdt->value() ); - mySubShapesChk->setChecked( false ); + myTolEdt2->setValue(myTolEdt->value()); + mySubShapesChk->setChecked(false); clearTemporary(); } break; } - + myCurrConstrId = constructorId; myEditCurrentArgument->setFocus(); - connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), - this, SLOT( SelectionIntoArgument() ) ); + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); qApp->processEvents(); updateGeometry(); - resize( minimumSizeHint() ); + resize(minimumSizeHint()); - displayPreview(); + processPreview(); updateButtonState(); activateSelection(); SelectionIntoArgument(); } - //================================================================================= // function : ClickOnOk() // purpose : Same than click on apply but close this dialog. //================================================================================= void RepairGUI_GlueDlg::ClickOnOk() { - if ( ClickOnApply() ) + setIsApplyAndClose(true); + if (ClickOnApply()) ClickOnCancel(); } - //================================================================================= // function : ClickOnApply() // purpose : //================================================================================= bool RepairGUI_GlueDlg::ClickOnApply() { - if ( !onAcceptLocal() ) + if (!onAcceptLocal()) return false; initName(); @@ -269,9 +309,9 @@ bool RepairGUI_GlueDlg::ClickOnApply() //GroupPoints->LineEdit1->setText(""); //myObject = GEOM::GEOM_Object::_nil(); - //globalSelection( GEOM_COMPOUND ); + //globalSelection(GEOM_COMPOUND); - ConstructorsClicked( getConstructorId() ); + ConstructorsClicked(getConstructorId()); return true; } @@ -283,25 +323,24 @@ bool RepairGUI_GlueDlg::ClickOnApply() //================================================================================= void RepairGUI_GlueDlg::SelectionIntoArgument() { - if ( mySubShapesChk->isChecked() && getConstructorId() == 1 ) { + if (mySubShapesChk->isChecked() && getConstructorId() == 1) { updateButtonState(); return; } - + erasePreview(); - myEditCurrentArgument->setText( "" ); + myEditCurrentArgument->setText(""); myObject = GEOM::GEOM_Object::_nil(); LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); SALOME_ListIO aSelList; aSelMgr->selectedObjects(aSelList); - if ( aSelList.Extent() == 1 ) { + if (aSelList.Extent() == 1) { Handle(SALOME_InteractiveObject) anIO = aSelList.First(); - Standard_Boolean aRes; - myObject = GEOMBase::ConvertIOinGEOMObject( anIO, aRes ); - if ( aRes ) - myEditCurrentArgument->setText( GEOMBase::GetName( myObject ) ); + myObject = GEOMBase::ConvertIOinGEOMObject(anIO); + if (!CORBA::is_nil(myObject)) + myEditCurrentArgument->setText(GEOMBase::GetName(myObject)); } updateButtonState(); } @@ -313,13 +352,12 @@ void RepairGUI_GlueDlg::SelectionIntoArgument() void RepairGUI_GlueDlg::SetEditCurrentArgument() { const QObject* send = sender(); - if ( send == GroupPoints->PushButton1 || send == GroupPoints2->PushButton1 ) { + if (send == GroupPoints->PushButton1 || send == GroupPoints2->PushButton1) { myEditCurrentArgument->setFocus(); SelectionIntoArgument(); } } - //================================================================================= // function : LineEditReturnPressed() // purpose : @@ -327,17 +365,16 @@ void RepairGUI_GlueDlg::SetEditCurrentArgument() void RepairGUI_GlueDlg::LineEditReturnPressed() { const QObject* send = sender(); - if ( send == GroupPoints->LineEdit1 ) { + if (send == GroupPoints->LineEdit1) { myEditCurrentArgument = GroupPoints->LineEdit1; GEOMBase_Skeleton::LineEditReturnPressed(); } - else if ( send == GroupPoints2->LineEdit1 ) { + else if (send == GroupPoints2->LineEdit1) { myEditCurrentArgument = GroupPoints2->LineEdit1; GEOMBase_Skeleton::LineEditReturnPressed(); } } - //================================================================================= // function : ActivateThisDialog() // purpose : @@ -345,99 +382,103 @@ void RepairGUI_GlueDlg::LineEditReturnPressed() void RepairGUI_GlueDlg::ActivateThisDialog() { GEOMBase_Skeleton::ActivateThisDialog(); - connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), - this, SLOT( SelectionIntoArgument() ) ); + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); //GroupPoints->LineEdit1->setText(""); //GroupPoints2->LineEdit1->setText(""); //myObject = GEOM::GEOM_Object::_nil(); - //myGeomGUI->SetState( 0 ); - //globalSelection( GEOM_COMPOUND ); + //myGeomGUI->SetState(0); + //globalSelection(GEOM_COMPOUND); activateSelection(); } - //================================================================================= // function : enterEvent() // purpose : Mouse enter onto the dialog to activate it //================================================================================= -void RepairGUI_GlueDlg::enterEvent( QEvent* ) +void RepairGUI_GlueDlg::enterEvent(QEvent*) { - if ( !mainFrame()->GroupConstructors->isEnabled() ) + if (!mainFrame()->GroupConstructors->isEnabled()) ActivateThisDialog(); } - //================================================================================= // function : createOperation // purpose : //================================================================================= GEOM::GEOM_IOperations_ptr RepairGUI_GlueDlg::createOperation() { - return getGeomEngine()->GetIShapesOperations( getStudyId() ); + return getGeomEngine()->GetIShapesOperations(getStudyId()); } //================================================================================= // function : isValid // purpose : //================================================================================= -bool RepairGUI_GlueDlg::isValid( QString& msg ) +bool RepairGUI_GlueDlg::isValid(QString& msg) { bool ok = true; double v = 0; - switch ( getConstructorId() ) + switch (getConstructorId()) { case 0: v = myTolEdt->value(); - ok = myTolEdt->isValid( msg, !IsPreview() ); + ok = myTolEdt->isValid(msg, !IsPreview()); break; case 1: - v = myTolEdt2->value(); - ok = myTolEdt2->isValid( msg, !IsPreview() ); + v = myTolEdt2->value(); + ok = myTolEdt2->isValid(msg, !IsPreview()); break; } - return !myObject->_is_nil() && ( IsPreview() || v > 0. ) && ok; + return !myObject->_is_nil() && (IsPreview() || v > 0.) && ok; } //================================================================================= // function : execute // purpose : //================================================================================= -bool RepairGUI_GlueDlg::execute( ObjectList& objects ) +bool RepairGUI_GlueDlg::execute(ObjectList& objects) { bool aResult = false; objects.clear(); - GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow( getOperation() ); - switch ( getConstructorId() ) { + GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow(getOperation()); + switch (getConstructorId()) { case 0: { - GEOM::GEOM_Object_var anObj = anOper->MakeGlueFaces( myObject, myTolEdt->value(), true ); + GEOM::GEOM_Object_var anObj; + if (myGlueMode == TopAbs_FACE) + anObj = anOper->MakeGlueFaces(myObject, myTolEdt->value(), true); + else if (myGlueMode == TopAbs_EDGE) + anObj = anOper->MakeGlueEdges(myObject, myTolEdt->value()); + aResult = !anObj->_is_nil(); - if ( aResult && !IsPreview() ) + if (aResult && !IsPreview()) { QStringList aParameters; aParameters << myTolEdt->text(); anObj->SetParameters(aParameters.join(":").toLatin1().constData()); - objects.push_back( anObj._retn() ); + objects.push_back(anObj._retn()); } break; } case 1: { - if ( IsPreview() ) { - // if this method is used for displaying preview then we must detect glue faces only - ObjectList::iterator anIter; - for ( anIter = myTmpObjs.begin(); anIter != myTmpObjs.end(); ++anIter ) - objects.push_back( GEOM::GEOM_Object::_duplicate( *anIter ) ); - return myTmpObjs.size() ? true : false; + if (IsPreview()) { + // if this method is used for displaying preview then we must detect glue faces/edges only + for (int i = 0; i < myTmpObjs.count(); i++) { + myTmpObjs[i].get()->Register(); // increment counter, since calling function will call UnRegister() + objects.push_back(myTmpObjs[i].copy()); + } + return !myTmpObjs.isEmpty(); } // IsPreview - // Make glue face by list. + // Make glue faces/edges by list. // Iterate through myTmpObjs and verifies where each object is currently selected or not. - QMap selected; + QSet selected; // Get names of selected objects LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); @@ -445,37 +486,41 @@ bool RepairGUI_GlueDlg::execute( ObjectList& objects ) aSelMgr->selectedObjects(aSelList); SALOME_ListIteratorOfListIO it (aSelList); - for (; it.More(); it.Next()) - selected.insert(it.Value()->getName(), 0); + for (; it.More(); it.Next()) + selected.insert(it.Value()->getName()); // Iterate through result and select objects with names from selection // ObjectList toRemoveFromEnggine; - ObjectList toGlue; - ObjectList::iterator anIter; - for ( anIter = myTmpObjs.begin(); anIter != myTmpObjs.end(); ++anIter ) { - if ( selected.contains( myGeomGUI->getApp()->orb()->object_to_string(*anIter) ) ) - toGlue.push_back( *anIter ); - } - - // make glue faces + + // make glue faces/edges GEOM::ListOfGO_var aListForGlue = new GEOM::ListOfGO(); - aListForGlue->length( toGlue.size() ); - ObjectList::iterator anIter3 = toGlue.begin(); - for ( int i = 0; anIter3 != toGlue.end(); ++anIter3, ++i ) - aListForGlue[ i ] = *anIter3; - GEOM::GEOM_Object_var anObj = anOper->MakeGlueFacesByList( myObject, myTolEdt2->value(), aListForGlue, true ); + aListForGlue->length(myTmpObjs.count()); + int added = 0; + for (int i = 0; i < myTmpObjs.count(); i++) { + CORBA::String_var tmpior = myGeomGUI->getApp()->orb()->object_to_string(myTmpObjs[i].get()); + if (selected.contains(tmpior.in())) + aListForGlue[ added++ ] = myTmpObjs[i].copy(); + } + aListForGlue->length(added); + + GEOM::GEOM_Object_var anObj; + if (myGlueMode == TopAbs_FACE) { + bool doGlueAllEdges = myGlueAllEdgesChk->isChecked(); + anObj = anOper->MakeGlueFacesByList(myObject, myTolEdt2->value(), aListForGlue.in(), + true, doGlueAllEdges); + } + else if (myGlueMode == TopAbs_EDGE) + anObj = anOper->MakeGlueEdgesByList(myObject, myTolEdt2->value(), aListForGlue.in()); aResult = !anObj->_is_nil(); - if ( aResult ) - { - if ( !IsPreview() ) - { + if (aResult) { + if (!IsPreview()) { QStringList aParameters; aParameters << myTolEdt2->text(); anObj->SetParameters(aParameters.join(":").toLatin1().constData()); } - objects.push_back( anObj._retn() ); + objects.push_back(anObj._retn()); } // Remove from engine useless objects @@ -494,49 +539,49 @@ bool RepairGUI_GlueDlg::execute( ObjectList& objects ) // function : restoreSubShapes // purpose : //================================================================================= -void RepairGUI_GlueDlg::restoreSubShapes( SALOMEDS::Study_ptr theStudy, - SALOMEDS::SObject_ptr theSObject ) +void RepairGUI_GlueDlg::restoreSubShapes(SALOMEDS::Study_ptr theStudy, + SALOMEDS::SObject_ptr theSObject) { - if ( mainFrame()->CheckBoxRestoreSS->isChecked() ) { + if (mainFrame()->CheckBoxRestoreSS->isChecked()) { GEOM::find_shape_method aFindMethod = GEOM::FSM_GetInPlace; - if ( getConstructorId() == 0 ) // MakeGlueFaces + if (getConstructorId() == 0) // MakeGlueFaces or MakeGlueEdges aFindMethod = GEOM::FSM_GetInPlaceByHistory; // empty list of arguments means that all arguments should be restored - getGeomEngine()->RestoreSubShapesSO( theStudy, theSObject, GEOM::ListOfGO(), + getGeomEngine()->RestoreSubShapesSO(theStudy, theSObject, GEOM::ListOfGO(), aFindMethod, /*theInheritFirstArg=*/true, - mainFrame()->CheckBoxAddPrefix->isChecked() ); + mainFrame()->CheckBoxAddPrefix->isChecked()); } } //================================================================ // Function : clearShapeBufferLocal -// Purpose : +// Purpose : //================================================================ -void RepairGUI_GlueDlg::clearShapeBufferLocal( GEOM::GEOM_Object_ptr theObj ) +void RepairGUI_GlueDlg::clearShapeBufferLocal(GEOM::GEOM_Object_ptr theObj) { - if ( CORBA::is_nil( theObj ) ) + if (CORBA::is_nil(theObj)) return; - CORBA::String_var IOR = myGeomGUI->getApp()->orb()->object_to_string( theObj ); - TCollection_AsciiString asciiIOR( (char *)( IOR.in() ) ); - myGeomGUI->GetShapeReader().RemoveShapeFromBuffer( asciiIOR ); + CORBA::String_var IOR = myGeomGUI->getApp()->orb()->object_to_string(theObj); + TCollection_AsciiString asciiIOR((char *)(IOR.in())); + myGeomGUI->GetShapeReader().RemoveShapeFromBuffer(asciiIOR); - if ( !getStudy() || !( getStudy()->studyDS() ) ) + if (!getStudy() || !(getStudy()->studyDS())) return; _PTR(Study) aStudy = getStudy()->studyDS(); - _PTR(SObject) aSObj ( aStudy->FindObjectIOR( std::string( IOR.in() ) ) ); - if ( !aSObj ) + _PTR(SObject) aSObj (aStudy->FindObjectIOR(std::string(IOR.in()))); + if (!aSObj) return; - _PTR(ChildIterator) anIt ( aStudy->NewChildIterator( aSObj ) ); - for ( anIt->InitEx( true ); anIt->More(); anIt->Next() ) { + _PTR(ChildIterator) anIt (aStudy->NewChildIterator(aSObj)); + for (anIt->InitEx(true); anIt->More(); anIt->Next()) { _PTR(GenericAttribute) anAttr; - if ( anIt->Value()->FindAttribute(anAttr, "AttributeIOR") ) { - _PTR(AttributeIOR) anIOR ( anAttr ); - TCollection_AsciiString asciiIOR( (char*)anIOR->Value().c_str() ); - myGeomGUI->GetShapeReader().RemoveShapeFromBuffer( asciiIOR ); + if (anIt->Value()->FindAttribute(anAttr, "AttributeIOR")) { + _PTR(AttributeIOR) anIOR (anAttr); + TCollection_AsciiString asciiIOR((char*)anIOR->Value().c_str()); + myGeomGUI->GetShapeReader().RemoveShapeFromBuffer(asciiIOR); } } } @@ -544,83 +589,83 @@ void RepairGUI_GlueDlg::clearShapeBufferLocal( GEOM::GEOM_Object_ptr theObj ) //================================================================ // Function : onAccept // Purpose : This method should be called from dialog's slots onOk() and onApply() -// It perfroms user input validation, then it +// It perfroms user input validation, then it // performs a proper operation and manages transactions, etc. //================================================================ bool RepairGUI_GlueDlg::onAcceptLocal() { - if ( !getStudy() || !( getStudy()->studyDS() ) ) + if (!getStudy() || !(getStudy()->studyDS())) return false; _PTR(Study) aStudy = getStudy()->studyDS(); bool aLocked = aStudy->GetProperties()->IsLocked(); - if ( aLocked ) { + if (aLocked) { MESSAGE("GEOMBase_Helper::onAccept - ActiveStudy is locked"); - SUIT_MessageBox::warning( this, tr( "WRN_WARNING" ), tr( "WRN_STUDY_LOCKED" ), tr( "BUT_OK" ) ); + SUIT_MessageBox::warning(this, tr("WRN_WARNING"), tr("WRN_STUDY_LOCKED"), tr("BUT_OK")); return false; } QString msg; - if ( !isValid( msg ) ) { - showError( msg ); + if (!isValid(msg)) { + showError(msg); return false; } - erasePreview( false ); + erasePreview(false); try { - if ( openCommand() ) { + if (openCommand()) { SUIT_OverrideCursor wc; - - myGeomGUI->getApp()->putInfo( "" ); + + myGeomGUI->getApp()->putInfo(""); ObjectList objects; - - if ( !execute( objects ) ) { + + if (!execute(objects)) { wc.suspend(); abortCommand(); showError(); } else { const int nbObjs = objects.size(); - for ( ObjectList::iterator it = objects.begin(); it != objects.end(); ++it ) { + for (ObjectList::iterator it = objects.begin(); it != objects.end(); ++it) { QString aName = getNewObjectName(); - if ( nbObjs > 1 ) { - if ( aName.isEmpty() ) - aName = getPrefix( *it ); - aName = GEOMBase::GetDefaultName( aName ); + if (nbObjs > 1) { + if (aName.isEmpty()) + aName = getPrefix(*it); + aName = GEOMBase::GetDefaultName(aName); } else { // PAL6521: use a prefix, if some dialog box doesn't reimplement getNewObjectName() - if ( aName.isEmpty() ) - aName = GEOMBase::GetDefaultName( getPrefix( *it ) ); + if (aName.isEmpty()) + aName = GEOMBase::GetDefaultName(getPrefix(*it)); } - addInStudy( *it, aName.toLatin1().data() ); - display( *it, false ); + addInStudy(*it, aName.toLatin1().data()); + display(*it, false); } - - if ( nbObjs ) { + + if (nbObjs) { commitCommand(); updateObjBrowser(); - myGeomGUI->getApp()->putInfo( QObject::tr("GEOM_PRP_DONE") ); + myGeomGUI->getApp()->putInfo(QObject::tr("GEOM_PRP_DONE")); } else { abortCommand(); } // JFA 28.12.2004 BEGIN // To enable warnings - GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow( getOperation() ); - if ( !CORBA::is_nil(anOper) && !anOper->IsDone() ) { + GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow(getOperation()); + if (!CORBA::is_nil(anOper) && !anOper->IsDone()) { wc.suspend(); - QString msgw = QObject::tr( anOper->GetErrorCode() ); - SUIT_MessageBox::warning( this, tr( "WRN_WARNING" ), msgw, tr( "BUT_OK" ) ); + QString msgw = QObject::tr(anOper->GetErrorCode()); + SUIT_MessageBox::warning(this, tr("WRN_WARNING"), msgw, tr("BUT_OK")); } // JFA 28.12.2004 END } } } - catch( const SALOME::SALOME_Exception& e ) { - SalomeApp_Tools::QtCatchCorbaException( e ); + catch(const SALOME::SALOME_Exception& e) { + SalomeApp_Tools::QtCatchCorbaException(e); abortCommand(); } @@ -631,7 +676,6 @@ bool RepairGUI_GlueDlg::onAcceptLocal() return true; } - //================================================================================= // function : onDetect // purpose : @@ -640,32 +684,42 @@ void RepairGUI_GlueDlg::onDetect() { clearTemporary(); QString msg; - if ( !isValid( msg ) ) { - showError( msg ); + if (!isValid(msg)) { + showError(msg); return; } - buttonOk()->setEnabled( false ); - buttonApply()->setEnabled( false ); - globalSelection( GEOM_ALLSHAPES ); - - GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow( getOperation() ); - GEOM::ListOfGO_var aList = anOper->GetGlueFaces( myObject, myTolEdt2->value() ); - - for ( int i = 0, n = aList->length(); i < n; i++ ) - myTmpObjs.push_back(GEOM::GEOM_Object::_duplicate(aList[i])); - - if ( myTmpObjs.size() > 0 ) { - msg = tr( "FACES_FOR_GLUING_ARE_DETECTED" ).arg( myTmpObjs.size() ); - mySubShapesChk->setChecked( true ); + buttonOk()->setEnabled(false); + buttonApply()->setEnabled(false); + globalSelection(GEOM_ALLSHAPES); + + GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow(getOperation()); + GEOM::ListOfGO_var aList; + if (myGlueMode == TopAbs_FACE) + aList = anOper->GetGlueFaces(myObject.in(), myTolEdt2->value()); + else if (myGlueMode == TopAbs_EDGE) + aList = anOper->GetGlueEdges(myObject.in(), myTolEdt2->value()); + + for (int i = 0, n = aList->length(); i < n; i++) + myTmpObjs << GEOM::GeomObjPtr(aList[i].in()); + + if (!myTmpObjs.isEmpty()) { + if (myGlueMode == TopAbs_FACE) + msg = tr("FACES_FOR_GLUING_ARE_DETECTED").arg(myTmpObjs.count()); + else if (myGlueMode == TopAbs_EDGE) + msg = tr("EDGES_FOR_GLUING_ARE_DETECTED").arg(myTmpObjs.count()); + mySubShapesChk->setChecked(true); } else { - msg = tr( "THERE_ARE_NO_FACES_FOR_GLUING" ); + if (myGlueMode == TopAbs_FACE) + msg = tr("THERE_ARE_NO_FACES_FOR_GLUING"); + else if (myGlueMode == TopAbs_EDGE) + msg = tr("THERE_ARE_NO_EDGES_FOR_GLUING"); } - - connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), - this, SLOT( SelectionIntoArgument() ) ) ; - SUIT_MessageBox::information( this, tr( "GEOM_FREE_BOUNDS_TLT" ), msg, tr( "Close" ) ); + + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())) ; + SUIT_MessageBox::information(this, tr("GEOM_FREE_BOUNDS_TLT"), msg, tr("Close")); updateButtonState(); activateSelection(); } @@ -676,48 +730,48 @@ void RepairGUI_GlueDlg::onDetect() //================================================================================= void RepairGUI_GlueDlg::activateSelection() { - erasePreview( false ); - + erasePreview(false); + int anId = getConstructorId(); - if ( anId == 0 ) { + if (anId == 0) { // Case of whole gluing - disconnect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), - this, SLOT( SelectionIntoArgument() ) ); - - globalSelection( GEOM_ALLSHAPES ); - if ( myObject->_is_nil()) + disconnect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); + + globalSelection(GEOM_ALLSHAPES); + if (myObject->_is_nil()) SelectionIntoArgument(); - connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), - this, SLOT( SelectionIntoArgument() ) ); - } + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); + } else { // Second case of gluing - if ( !mySubShapesChk->isChecked() ) - globalSelection( GEOM_ALLSHAPES ); + if (!mySubShapesChk->isChecked()) + globalSelection(GEOM_ALLSHAPES); else { - displayPreview( true, false, false, 2/*line width*/, 1/*display mode*/, Quantity_NOC_RED ); - disconnect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), - this, SLOT( SelectionIntoArgument() ) ) ; - globalSelection( GEOM_PREVIEW ); - connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), - this, SLOT( SelectionIntoArgument() ) ) ; - } + displayPreview(true, true, false, false, 2/*line width*/, 1/*display mode*/, Quantity_NOC_RED); + disconnect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())) ; + globalSelection(GEOM_PREVIEW); + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())) ; + } } updateViewer(); } //================================================================================= // function : updateButtonState -// purpose : Update button state +// purpose : Update button state //================================================================================= void RepairGUI_GlueDlg::updateButtonState() { int anId = getConstructorId(); bool hasMainObj = !myObject->_is_nil(); - if ( anId == 0 ) { - buttonOk()->setEnabled( hasMainObj ); - buttonApply()->setEnabled( hasMainObj ); + if (anId == 0) { + buttonOk()->setEnabled(hasMainObj); + buttonApply()->setEnabled(hasMainObj); } else { @@ -725,17 +779,15 @@ void RepairGUI_GlueDlg::updateButtonState() SALOME_ListIO aSelList; aSelMgr->selectedObjects(aSelList); - bool wasSelected = false; SALOME_ListIteratorOfListIO it (aSelList); - if (it.More() > 0) - wasSelected = true; - bool wasDetected = myTmpObjs.size() ? true : false; - buttonOk()->setEnabled( hasMainObj && wasDetected && wasSelected ); - buttonApply()->setEnabled( hasMainObj && wasDetected && wasSelected ); - mySubShapesChk->setEnabled( hasMainObj && wasDetected ); - myDetectBtn->setEnabled( hasMainObj ); - if ( !hasMainObj || !wasDetected ) - mySubShapesChk->setChecked( false ); + bool wasSelected = it.More() > 0; + bool wasDetected = !myTmpObjs.isEmpty(); + buttonOk()->setEnabled(hasMainObj && wasDetected && wasSelected); + buttonApply()->setEnabled(hasMainObj && wasDetected && wasSelected); + mySubShapesChk->setEnabled(hasMainObj && wasDetected); + myDetectBtn->setEnabled(hasMainObj); + if (!hasMainObj || !wasDetected) + mySubShapesChk->setChecked(false); } } @@ -745,10 +797,6 @@ void RepairGUI_GlueDlg::updateButtonState() //================================================================================= void RepairGUI_GlueDlg::clearTemporary() { - ObjectList::iterator anIter; - for ( anIter = myTmpObjs.begin(); anIter != myTmpObjs.end(); ++anIter ) - getGeomEngine()->RemoveObject(*anIter); - myTmpObjs.clear(); } @@ -756,7 +804,7 @@ void RepairGUI_GlueDlg::clearTemporary() // function : onTolerChanged // purpose : Remove temporary objects from engine //================================================================================= -void RepairGUI_GlueDlg::onTolerChanged( double /*theVal*/ ) +void RepairGUI_GlueDlg::onTolerChanged(double /*theVal*/) { clearTemporary(); activateSelection(); @@ -769,7 +817,7 @@ void RepairGUI_GlueDlg::onTolerChanged( double /*theVal*/ ) //================================================================================= void RepairGUI_GlueDlg::onSubShapesChk() { - if ( !mySubShapesChk->isChecked() ) + if (!mySubShapesChk->isChecked()) clearTemporary(); activateSelection(); updateButtonState();