diff --git a/doc/salome/gui/GEOM/images/repair10.png b/doc/salome/gui/GEOM/images/repair10.png index ccdebd77b..9c67419a5 100755 Binary files a/doc/salome/gui/GEOM/images/repair10.png and b/doc/salome/gui/GEOM/images/repair10.png differ diff --git a/doc/salome/gui/GEOM/input/free_faces.doc b/doc/salome/gui/GEOM/input/free_faces.doc index a5996032b..f51ece8b2 100644 --- a/doc/salome/gui/GEOM/input/free_faces.doc +++ b/doc/salome/gui/GEOM/input/free_faces.doc @@ -8,6 +8,8 @@ A free face is a face, which is not shared between several sub-shapes of the sha \image html repair10.png +Press \b Apply or Apply and Close button to publish the corresponding faces in the study. + TUI Command: GetFreeFacesIDs(Shape), where \em Shape is a shape to be checked. @@ -15,4 +17,4 @@ a shape to be checked. See also a \ref tui_free_faces_page "TUI example". -*/ \ No newline at end of file +*/ diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index 89480676b..bd50af4ce 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -836,6 +836,10 @@ Please, select face, shell or solid and try again GEOM_FREE_FACES Free faces + + GEOM_FREE_FACES_NAME + Free_face + GEOM_FREE_FACES_TITLE Free faces diff --git a/src/RepairGUI/RepairGUI_FreeFacesDlg.cxx b/src/RepairGUI/RepairGUI_FreeFacesDlg.cxx index ae77997a0..00e08c13a 100644 --- a/src/RepairGUI/RepairGUI_FreeFacesDlg.cxx +++ b/src/RepairGUI/RepairGUI_FreeFacesDlg.cxx @@ -26,38 +26,35 @@ // #include "RepairGUI_FreeFacesDlg.h" -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - +#include +#include #include #include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include #include +#include -#include -#include -#include - -#include -#include #include -#include #include +#include +#include +#include +#include #include -#include + #define SPACING 6 #define MARGIN 9 @@ -71,27 +68,32 @@ // TRUE to construct a modal dialog. //================================================================================= RepairGUI_FreeFacesDlg::RepairGUI_FreeFacesDlg( GeometryGUI* GUI, QWidget* parent, - bool modal ) - : QDialog( parent, 0 ), - GEOMBase_Helper( dynamic_cast( parent ) ), - myGeomGUI( GUI ), - myDisplayer( 0 ) + bool modal) + : GEOMBase_Skeleton(GUI, parent, modal), + myDisplayer (0), + myEdit (0) { - setAttribute( Qt::WA_DeleteOnClose ); - - setSizeGripEnabled( true ); - + QPixmap image0 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_FREE_FACES"))); QPixmap image1( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) ); setWindowTitle( tr( "GEOM_FREE_FACES_TITLE" ) ); /***************************************************************/ + mainFrame()->GroupConstructors->setTitle(tr("GEOM_FREE_FACES")); + mainFrame()->RadioButton1->setIcon(image0); + mainFrame()->RadioButton2->setAttribute(Qt::WA_DeleteOnClose); + mainFrame()->RadioButton2->close(); + mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose); + mainFrame()->RadioButton3->close(); + + mainFrame()->GroupBoxName->hide(); + QGroupBox* aMainGrp = new QGroupBox( tr( "GEOM_SELECTED_SHAPE" ), this ); QLabel* lab = new QLabel( tr( "GEOM_OBJECT" ), aMainGrp ); - mySelBtn = new QPushButton( aMainGrp ); - mySelBtn->setIcon( image1 ); + QPushButton *aSelBtn = new QPushButton( aMainGrp ); + aSelBtn->setIcon( image1 ); myEdit = new QLineEdit( aMainGrp ); myEdit->setReadOnly( true ); myEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); @@ -101,37 +103,19 @@ RepairGUI_FreeFacesDlg::RepairGUI_FreeFacesDlg( GeometryGUI* GUI, QWidget* paren aMainLay->setSpacing( SPACING ); aMainLay->setMargin( MARGIN ); aMainLay->addWidget( lab ); - aMainLay->addWidget( mySelBtn ); + aMainLay->addWidget( aSelBtn ); aMainLay->addWidget( myEdit ); - QFrame* aFrame = new QFrame( this ); - aFrame->setFrameStyle( QFrame::Box | QFrame::Sunken ); - QPushButton* aCloseBtn = new QPushButton( tr( "GEOM_BUT_CLOSE" ), aFrame ); - QPushButton* aHelpBtn = new QPushButton( tr( "GEOM_BUT_HELP" ), aFrame ); + QVBoxLayout* aLay = new QVBoxLayout (centralWidget()); + aLay->setSpacing(SPACING); + aLay->setMargin(MARGIN); + aLay->addWidget(aMainGrp); - QHBoxLayout* aBtnLay = new QHBoxLayout( aFrame ); - aBtnLay->setSpacing( SPACING ); - aBtnLay->setMargin( MARGIN ); - aBtnLay->addWidget( aCloseBtn ); - aBtnLay->addSpacing( SPACING ); - aBtnLay->addStretch(); - aBtnLay->addWidget( aHelpBtn ); - - QVBoxLayout* aLay = new QVBoxLayout( this ); - aLay->setSpacing( SPACING ); - aLay->setMargin( MARGIN ); - aLay->addWidget( aMainGrp ); - aLay->addStretch(); - aLay->addWidget( aFrame ); + resize(minimumSizeHint()); + /***************************************************************/ myHelpFileName = "using_measurement_tools_page.html#faces_anchor"; - connect( aCloseBtn, SIGNAL( clicked() ), SLOT( onClose() ) ); - connect( aHelpBtn, SIGNAL( clicked() ), SLOT( onHelp() ) ); - connect( mySelBtn, SIGNAL( clicked() ), - this, SLOT ( onSetEditCurrentArgument() ) ); - /***************************************************************/ - Init(); } @@ -145,70 +129,6 @@ RepairGUI_FreeFacesDlg::~RepairGUI_FreeFacesDlg() } -//================================================================================= -// function : onClose -// purpose : SLOT. Called when "close" button pressed. Close dialog -//================================================================================= -void RepairGUI_FreeFacesDlg::onClose() -{ - globalSelection(); - disconnect( ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr(), 0, this, 0 ); - myGeomGUI->SetActiveDialogBox( 0 ); - reject(); - erasePreview(); -} - -//================================================================================= -// function : onHelp() -// purpose : -//================================================================================= -void RepairGUI_FreeFacesDlg::onHelp() -{ - LightApp_Application* app = (LightApp_Application*)( SUIT_Session::session()->activeApplication() ); - if ( app ) - app->onHelpContextModule( myGeomGUI ? app->moduleName( myGeomGUI->moduleName() ) : QString(""), myHelpFileName ); - else { - QString platform; -#ifdef WIN32 - platform = "winapplication"; -#else - platform = "application"; -#endif - SUIT_MessageBox::warning( this, - tr( "WRN_WARNING" ), - tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ). - arg( app->resourceMgr()->stringValue( "ExternalBrowser", - platform ) ). - arg( myHelpFileName ) ); - } -} - -//================================================================================= -// function : onDeactivate -// purpose : Deactivate this dialog -//================================================================================= -void RepairGUI_FreeFacesDlg::onDeactivate() -{ - setEnabled( false ); - globalSelection(); - disconnect( ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr(), 0, this, 0 ); - myGeomGUI->SetActiveDialogBox( 0 ); -} - -//================================================================================= -// function : onActivate -// purpose : Activate this dialog -//================================================================================= -void RepairGUI_FreeFacesDlg::onActivate() -{ - myGeomGUI->EmitSignalDeactivateDialog(); - setEnabled( true ); - myGeomGUI->SetActiveDialogBox( this ); - connect( ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr(), - SIGNAL( currentSelectionChanged() ), SLOT( onSelectionDone() ) ); - activateSelection(); -} - //================================================================================= // function : Init() // purpose : @@ -216,22 +136,76 @@ void RepairGUI_FreeFacesDlg::onActivate() void RepairGUI_FreeFacesDlg::Init() { myObj = GEOM::GEOM_Object::_nil(); + myEditCurrentArgument = myEdit; - /* signals and slots connections */ - connect( myGeomGUI, SIGNAL( SignalDeactivateActiveDialog() ), SLOT ( onDeactivate() ) ); - connect( ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr(), - SIGNAL( currentSelectionChanged() ), SLOT ( onSelectionDone() ) ); + connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); + initName(tr("GEOM_FREE_FACES_NAME")); + buttonOk()->setEnabled(false); + buttonApply()->setEnabled(false); activateSelection(); - onSelectionDone(); + SelectionIntoArgument(); } //================================================================================= -// function : onSelectionDone +// function : ClickOnOk() +// purpose : +//================================================================================= +void RepairGUI_FreeFacesDlg::ClickOnOk() +{ + if (ClickOnApply()) + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool RepairGUI_FreeFacesDlg::ClickOnApply() +{ + if (!onAccept()) + return false; + + initName(); + return true; +} + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void RepairGUI_FreeFacesDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + + connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); + + activateSelection(); + displayPreview(true); +} + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void RepairGUI_FreeFacesDlg::enterEvent(QEvent*) +{ + if (!mainFrame()->GroupConstructors->isEnabled()) + ActivateThisDialog(); +} + +//================================================================================= +// function : SelectionIntoArgument // purpose : SLOT. Called when selection changed. //================================================================================= -void RepairGUI_FreeFacesDlg::onSelectionDone() +void RepairGUI_FreeFacesDlg::SelectionIntoArgument() { + myEditCurrentArgument->setText(""); + myObj = GEOM::GEOM_Object::_nil(); erasePreview(); LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); @@ -239,7 +213,8 @@ void RepairGUI_FreeFacesDlg::onSelectionDone() aSelMgr->selectedObjects(aSelList); if ( aSelList.Extent() != 1 ) { - myEdit->setText( "" ); + buttonOk()->setEnabled(false); + buttonApply()->setEnabled(false); return; } @@ -247,27 +222,19 @@ void RepairGUI_FreeFacesDlg::onSelectionDone() GEOMBase::ConvertIOinGEOMObject( aSelList.First() ); if ( !GEOMBase::IsShape( anObj ) ) { - myEdit->setText( "" ); + buttonOk()->setEnabled(false); + buttonApply()->setEnabled(false); return; - } - else { + } else { myObj = anObj; + myEditCurrentArgument->setText(GEOMBase::GetName(myObj)); displayPreview( true, false, true, true, 3 ); } } -//================================================================================= -// function : enterEvent() -// purpose : Mouse enter onto the dialog to activate it -//================================================================================= -void RepairGUI_FreeFacesDlg::enterEvent( QEvent* ) -{ - onActivate(); -} - //================================================================================= // function : activateSelection -// purpose : activate selection of faces, shells, and solids +// purpose : activate selection of solids //================================================================================= void RepairGUI_FreeFacesDlg::activateSelection() { @@ -277,15 +244,6 @@ void RepairGUI_FreeFacesDlg::activateSelection() globalSelection( aMap ); } -//================================================================================= -// function : closeEvent() -// purpose : -//================================================================================= -void RepairGUI_FreeFacesDlg::closeEvent( QCloseEvent* ) -{ - onClose(); -} - //================================================================================= // function : createOperation // purpose : @@ -316,11 +274,15 @@ bool RepairGUI_FreeFacesDlg::execute( ObjectList& objects ) TopoDS_Shape aSelShape; TopoDS_Shape aFace; TopTools_IndexedMapOfShape anIndices; + int aNbObj = 0; + if ( !myObj->_is_nil() && GEOMBase::GetShape( myObj, aSelShape ) ) { myEdit->setText( GEOMBase::GetName( myObj ) ); QString aMess; if ( !isValid( aMess ) ) { erasePreview( true ); + buttonOk()->setEnabled(false); + buttonApply()->setEnabled(false); return false; } @@ -349,8 +311,11 @@ bool RepairGUI_FreeFacesDlg::execute( ObjectList& objects ) } } } - - for ( int i = 0, n = aFaceLst->length(); i < n; i++ ) { + + int i; + int n = aFaceLst->length(); + + for (i = 0; i < n; i++ ) { aFace = anIndices.FindKey( aFaceLst[i] ); try { getDisplayer()->SetColor( Quantity_NOC_RED ); @@ -363,9 +328,27 @@ bool RepairGUI_FreeFacesDlg::execute( ObjectList& objects ) catch( const SALOME::SALOME_Exception& e ) { SalomeApp_Tools::QtCatchCorbaException( e ); + buttonOk()->setEnabled(false); + buttonApply()->setEnabled(false); + return false; } } + + // Create sub-objects + GEOM::ListOfGO_var aList = anOper->MakeSubShapes(myObj, aFaceLst); + + aNbObj = aList->length(); + + for (i = 0; i < aNbObj; i++) { + objects.push_back(GEOM::GEOM_Object::_duplicate(aList[i])); + } + + aResult = true; } + + buttonOk()->setEnabled(aNbObj > 0); + buttonApply()->setEnabled(aNbObj > 0); + return aResult; } @@ -380,28 +363,12 @@ GEOM_Displayer* RepairGUI_FreeFacesDlg::getDisplayer() return myDisplayer; } -//================================================================================= -// function : SetEditCurrentArgument -// purpose : -//================================================================================= -void RepairGUI_FreeFacesDlg::onSetEditCurrentArgument() +//================================================================ +// Function : getFather +// Purpose : Get father object for object to be added in study +// (called with addInStudy method) +//================================================================ +GEOM::GEOM_Object_ptr RepairGUI_FreeFacesDlg::getFather (GEOM::GEOM_Object_ptr) { - myEdit->setFocus(); - onSelectionDone(); -} - -//================================================================================= -// function : keyPressEvent() -// purpose : -//================================================================================= -void RepairGUI_FreeFacesDlg::keyPressEvent( QKeyEvent* e ) -{ - QDialog::keyPressEvent( e ); - if ( e->isAccepted() ) - return; - - if ( e->key() == Qt::Key_F1 ) { - e->accept(); - onHelp(); - } + return myObj; } diff --git a/src/RepairGUI/RepairGUI_FreeFacesDlg.h b/src/RepairGUI/RepairGUI_FreeFacesDlg.h index 160d4bffa..2e3f12f7f 100644 --- a/src/RepairGUI/RepairGUI_FreeFacesDlg.h +++ b/src/RepairGUI/RepairGUI_FreeFacesDlg.h @@ -27,11 +27,9 @@ #ifndef REPAIRGUI_FREEFACESDLG_H #define REPAIRGUI_FREEFACESDLG_H -#include -#include +#include class GEOM_Displayer; -class QPushButton; class QLineEdit; class GeometryGUI; @@ -39,8 +37,7 @@ class GeometryGUI; // class : RepairGUI_FreeFacesDlg // purpose : //================================================================================= -class RepairGUI_FreeFacesDlg : public QDialog, - public GEOMBase_Helper +class RepairGUI_FreeFacesDlg : public GEOMBase_Skeleton { Q_OBJECT @@ -53,30 +50,24 @@ protected: virtual GEOM::GEOM_IOperations_ptr createOperation(); virtual bool isValid( QString& ); virtual bool execute( ObjectList& ); - + virtual GEOM::GEOM_Object_ptr getFather (GEOM::GEOM_Object_ptr); + private: void Init(); void enterEvent( QEvent* ); - void closeEvent( QCloseEvent* ); - void keyPressEvent( QKeyEvent* ); void activateSelection(); GEOM_Displayer* getDisplayer(); private slots: - void onClose(); - void onHelp(); - void onDeactivate(); - void onActivate(); - void onSelectionDone(); - void onSetEditCurrentArgument(); + void ClickOnOk(); + bool ClickOnApply(); + void SelectionIntoArgument(); + void ActivateThisDialog(); private: GEOM_Displayer* myDisplayer; GEOM::GEOM_Object_var myObj; - QPushButton* mySelBtn; QLineEdit* myEdit; - GeometryGUI* myGeomGUI; - QString myHelpFileName; }; #endif // REPAIRGUI_FREEFACESDLG_H