Back to index

salome-geom  6.5.0
RepairGUI_FreeFacesDlg.cxx
Go to the documentation of this file.
00001 // Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
00002 //
00003 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
00004 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
00005 //
00006 // This library is free software; you can redistribute it and/or
00007 // modify it under the terms of the GNU Lesser General Public
00008 // License as published by the Free Software Foundation; either
00009 // version 2.1 of the License.
00010 //
00011 // This library is distributed in the hope that it will be useful,
00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014 // Lesser General Public License for more details.
00015 //
00016 // You should have received a copy of the GNU Lesser General Public
00017 // License along with this library; if not, write to the Free Software
00018 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
00019 //
00020 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
00021 //
00022 
00023 // GEOM GEOMGUI : GUI for Geometry component
00024 // File   : RepairGUI_FreeFacesDlg.cxx
00025 // Author : Vladimir KLYACHIN, Open CASCADE S.A.S. (vladimir.klyachin@opencascade.com)
00026 //
00027 #include "RepairGUI_FreeFacesDlg.h"
00028 
00029 #include <LightApp_Application.h>
00030 #include <LightApp_SelectionMgr.h>
00031 #include <SalomeApp_Application.h>
00032 #include <SalomeApp_Tools.h>
00033 
00034 #include <SUIT_MessageBox.h>
00035 #include <SUIT_Session.h>
00036 #include <SUIT_OverrideCursor.h>
00037 #include <SUIT_Desktop.h>
00038 #include <SUIT_ResourceMgr.h>
00039 
00040 #include <GEOMImpl_Types.hxx>
00041 
00042 #include <TopTools_IndexedMapOfShape.hxx>
00043 #include <TColStd_MapOfInteger.hxx>
00044 #include <TopExp.hxx>
00045 
00046 #include <GEOMBase.h>
00047 #include <GeometryGUI.h>
00048 #include <GEOM_Displayer.h>
00049 
00050 #include <QLineEdit>
00051 #include <QLabel>
00052 #include <QGroupBox>
00053 #include <QPushButton>
00054 #include <QHBoxLayout>
00055 #include <QVBoxLayout>
00056 #include <QKeyEvent>
00057 
00058 #define SPACING 6
00059 #define MARGIN  9
00060 #define MIN_WIDTH 200
00061 
00062 //=================================================================================
00063 // class    : RepairGUI_FreeFacesDlg()
00064 // purpose  : Constructs a RepairGUI_FreeFacesDlg  which is a child of 'parent', with the
00065 //            name 'name' and widget flags set to 'f'.
00066 //            The dialog will by default be modeless, unless you set 'modal' to
00067 //            TRUE to construct a modal dialog.
00068 //=================================================================================
00069 RepairGUI_FreeFacesDlg::RepairGUI_FreeFacesDlg( GeometryGUI* GUI, QWidget* parent,
00070                                                 bool modal )
00071   : QDialog( parent, 0 ),
00072     GEOMBase_Helper( dynamic_cast<SUIT_Desktop*>( parent ) ),
00073     myGeomGUI( GUI ), 
00074     myDisplayer( 0 )
00075 {
00076   setAttribute( Qt::WA_DeleteOnClose );
00077 
00078   setSizeGripEnabled( true );
00079 
00080   QPixmap image1( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_SELECT" ) ) );
00081 
00082   setWindowTitle( tr( "GEOM_FREE_FACES_TITLE" ) );
00083 
00084   /***************************************************************/
00085 
00086   QGroupBox* aMainGrp = new QGroupBox( tr( "GEOM_SELECTED_SHAPE" ), this );
00087   
00088   QLabel* lab = new QLabel( tr( "GEOM_OBJECT" ), aMainGrp );
00089   mySelBtn = new QPushButton( aMainGrp );
00090   mySelBtn->setIcon( image1 );
00091   myEdit = new QLineEdit( aMainGrp );
00092   myEdit->setReadOnly( true );
00093   myEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
00094   myEdit->setMinimumWidth( MIN_WIDTH );
00095 
00096   QHBoxLayout* aMainLay = new QHBoxLayout( aMainGrp );
00097   aMainLay->setSpacing( SPACING );
00098   aMainLay->setMargin( MARGIN );
00099   aMainLay->addWidget( lab );
00100   aMainLay->addWidget( mySelBtn );
00101   aMainLay->addWidget( myEdit );
00102 
00103   QFrame* aFrame = new QFrame( this );
00104   aFrame->setFrameStyle( QFrame::Box | QFrame::Sunken );
00105   QPushButton* aCloseBtn = new QPushButton( tr( "GEOM_BUT_CLOSE" ), aFrame );
00106   QPushButton* aHelpBtn = new QPushButton( tr( "GEOM_BUT_HELP" ), aFrame );
00107 
00108   QHBoxLayout* aBtnLay = new QHBoxLayout( aFrame );
00109   aBtnLay->setSpacing( SPACING );
00110   aBtnLay->setMargin( MARGIN );
00111   aBtnLay->addWidget( aCloseBtn );
00112   aBtnLay->addSpacing( SPACING );
00113   aBtnLay->addStretch();
00114   aBtnLay->addWidget( aHelpBtn );
00115 
00116   QVBoxLayout* aLay = new QVBoxLayout( this );
00117   aLay->setSpacing( SPACING );
00118   aLay->setMargin( MARGIN );
00119   aLay->addWidget( aMainGrp );
00120   aLay->addStretch();
00121   aLay->addWidget( aFrame );
00122 
00123   myHelpFileName = "using_measurement_tools_page.html#faces_anchor";
00124 
00125   connect( aCloseBtn, SIGNAL( clicked() ), SLOT( onClose() ) );
00126   connect( aHelpBtn,  SIGNAL( clicked() ), SLOT( onHelp() ) );
00127   connect( mySelBtn,  SIGNAL( clicked() ),
00128            this,      SLOT  ( onSetEditCurrentArgument() ) );
00129   /***************************************************************/
00130 
00131   Init();
00132 }
00133 
00134 
00135 //=================================================================================
00136 // function : ~RepairGUI_FreeFacesDlg()
00137 // purpose  : Destroys the object and frees any allocated resources
00138 //=================================================================================
00139 RepairGUI_FreeFacesDlg::~RepairGUI_FreeFacesDlg()
00140 {
00141 }
00142 
00143 
00144 //=================================================================================
00145 // function : onClose
00146 // purpose  : SLOT. Called when "close" button pressed. Close dialog
00147 //=================================================================================
00148 void RepairGUI_FreeFacesDlg::onClose()
00149 {
00150   globalSelection();
00151   disconnect( ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr(), 0, this, 0 );
00152   myGeomGUI->SetActiveDialogBox( 0 );
00153   reject();
00154   erasePreview();
00155 }
00156 
00157 //=================================================================================
00158 // function : onHelp()
00159 // purpose  :
00160 //=================================================================================
00161 void RepairGUI_FreeFacesDlg::onHelp()
00162 {
00163   LightApp_Application* app = (LightApp_Application*)( SUIT_Session::session()->activeApplication() );
00164   if ( app )
00165     app->onHelpContextModule( myGeomGUI ? app->moduleName( myGeomGUI->moduleName() ) : QString(""), myHelpFileName );
00166   else {
00167     QString platform;
00168 #ifdef WIN32
00169     platform = "winapplication";
00170 #else
00171     platform = "application";
00172 #endif
00173     SUIT_MessageBox::warning( this, 
00174                               tr( "WRN_WARNING" ),
00175                               tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ).
00176                               arg( app->resourceMgr()->stringValue( "ExternalBrowser", 
00177                                                                     platform ) ).
00178                               arg( myHelpFileName ) );
00179   }
00180 }
00181 
00182 //=================================================================================
00183 // function : onDeactivate
00184 // purpose  : Deactivate this dialog
00185 //=================================================================================
00186 void RepairGUI_FreeFacesDlg::onDeactivate()
00187 {
00188   setEnabled( false );
00189   globalSelection();
00190   disconnect( ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr(), 0, this, 0 );
00191   myGeomGUI->SetActiveDialogBox( 0 );
00192 }
00193 
00194 //=================================================================================
00195 // function : onActivate
00196 // purpose  : Activate this dialog
00197 //=================================================================================
00198 void RepairGUI_FreeFacesDlg::onActivate()
00199 {
00200   myGeomGUI->EmitSignalDeactivateDialog();
00201   setEnabled( true );
00202   myGeomGUI->SetActiveDialogBox( this );
00203   connect( ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr(), 
00204            SIGNAL( currentSelectionChanged() ), SLOT( onSelectionDone() ) );
00205   activateSelection();
00206 }
00207 
00208 //=================================================================================
00209 // function : Init()
00210 // purpose  :
00211 //=================================================================================
00212 void RepairGUI_FreeFacesDlg::Init()
00213 {
00214   myObj = GEOM::GEOM_Object::_nil();
00215 
00216   /* signals and slots connections */
00217   connect( myGeomGUI, SIGNAL( SignalDeactivateActiveDialog() ), SLOT  ( onDeactivate() ) );
00218   connect( ( (SalomeApp_Application*)( SUIT_Session::session()->activeApplication() ) )->selectionMgr(), 
00219            SIGNAL( currentSelectionChanged() ), SLOT  ( onSelectionDone() ) );
00220 
00221   activateSelection();
00222   onSelectionDone();
00223 }
00224 
00225 //=================================================================================
00226 // function : onSelectionDone
00227 // purpose  : SLOT. Called when selection changed.
00228 //=================================================================================
00229 void RepairGUI_FreeFacesDlg::onSelectionDone()
00230 {
00231   erasePreview();
00232 
00233   LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
00234   SALOME_ListIO aSelList;
00235   aSelMgr->selectedObjects(aSelList);
00236 
00237   if ( aSelList.Extent() != 1 ) {
00238     myEdit->setText( "" );
00239     return;
00240   }
00241 
00242   GEOM::GEOM_Object_var anObj =
00243     GEOMBase::ConvertIOinGEOMObject( aSelList.First() );
00244 
00245   if ( !GEOMBase::IsShape( anObj ) ) {
00246     myEdit->setText( "" );
00247     return;
00248   }
00249   else {
00250     myObj = anObj;
00251     displayPreview( true, false, true, true, 3 );
00252   }
00253 }
00254 
00255 //=================================================================================
00256 // function : enterEvent()
00257 // purpose  : Mouse enter onto the dialog to activate it
00258 //=================================================================================
00259 void RepairGUI_FreeFacesDlg::enterEvent( QEvent* )
00260 {
00261   onActivate();
00262 }
00263 
00264 //=================================================================================
00265 // function : activateSelection
00266 // purpose  : activate selection of faces, shells, and solids
00267 //=================================================================================
00268 void RepairGUI_FreeFacesDlg::activateSelection()
00269 {
00270   TColStd_MapOfInteger aMap;
00271   aMap.Add( GEOM_SOLID );
00272   aMap.Add( GEOM_COMPOUND );
00273   globalSelection( aMap );
00274 }
00275 
00276 //=================================================================================
00277 // function : closeEvent()
00278 // purpose  :
00279 //=================================================================================
00280 void RepairGUI_FreeFacesDlg::closeEvent( QCloseEvent* )
00281 {
00282   onClose();
00283 }
00284 
00285 //=================================================================================
00286 // function : createOperation
00287 // purpose  :
00288 //=================================================================================
00289 GEOM::GEOM_IOperations_ptr RepairGUI_FreeFacesDlg::createOperation()
00290 {
00291   return getGeomEngine()->GetIShapesOperations( getStudyId() );
00292 }
00293 
00294 //=================================================================================
00295 // function : isValid
00296 // purpose  :
00297 //=================================================================================
00298 bool RepairGUI_FreeFacesDlg::isValid( QString& )
00299 {
00300   return !myObj->_is_nil() ;
00301 }
00302 
00303 //=================================================================================
00304 // function : execute
00305 // purpose  :
00306 //=================================================================================
00307 bool RepairGUI_FreeFacesDlg::execute( ObjectList& objects )
00308 {
00309   bool aResult = false;
00310   GEOM::GEOM_IShapesOperations_var anOper = GEOM::GEOM_IShapesOperations::_narrow( getOperation() );
00311   GEOM::ListOfLong_var aFaceLst = anOper->GetFreeFacesIDs( myObj );
00312   TopoDS_Shape aSelShape;
00313   TopoDS_Shape aFace; 
00314   TopTools_IndexedMapOfShape anIndices;
00315   if ( !myObj->_is_nil() && GEOMBase::GetShape( myObj, aSelShape ) ) {
00316     myEdit->setText( GEOMBase::GetName( myObj ) );
00317     QString aMess;
00318     if ( !isValid( aMess ) ) {
00319       erasePreview( true );
00320       return false;
00321     }
00322     
00323     SUIT_OverrideCursor();
00324 
00325     TopExp::MapShapes( aSelShape, anIndices);
00326     SALOME_Prs* aPrs = 0;
00327     
00328     for ( int i = 0, n = aFaceLst->length(); i < n; i++ ) {
00329       aFace = anIndices.FindKey( aFaceLst[i] );
00330       try {
00331         getDisplayer()->SetColor( Quantity_NOC_RED );
00332         getDisplayer()->SetToActivate( false );
00333         aPrs = !aFace.IsNull() ? getDisplayer()->BuildPrs( aFace ) : 0;
00334         if ( aPrs )
00335           displayPreview( aPrs, true );
00336       }
00337       catch( const SALOME::SALOME_Exception& e )
00338       {
00339         SalomeApp_Tools::QtCatchCorbaException( e );
00340       }
00341     }
00342   }
00343   return aResult;
00344 }
00345 
00346 //================================================================
00347 // Function : getDisplayer
00348 // Purpose  :
00349 //================================================================
00350 GEOM_Displayer* RepairGUI_FreeFacesDlg::getDisplayer()
00351 {
00352   if ( !myDisplayer )
00353     myDisplayer = new GEOM_Displayer( getStudy() );
00354   return myDisplayer;
00355 }
00356 
00357 //=================================================================================
00358 // function : SetEditCurrentArgument
00359 // purpose  :
00360 //=================================================================================
00361 void RepairGUI_FreeFacesDlg::onSetEditCurrentArgument()
00362 {
00363   myEdit->setFocus();
00364   onSelectionDone();
00365 }
00366 
00367 //=================================================================================
00368 // function : keyPressEvent()
00369 // purpose  :
00370 //=================================================================================
00371 void RepairGUI_FreeFacesDlg::keyPressEvent( QKeyEvent* e )
00372 {
00373   QDialog::keyPressEvent( e );
00374   if ( e->isAccepted() )
00375     return;
00376 
00377   if ( e->key() == Qt::Key_F1 ) {
00378     e->accept();
00379     onHelp();
00380   }
00381 }