Salome HOME
Join modifications from BR_Dev_For_4_0 tag V4_1_1.
[modules/geom.git] / src / RepairGUI / RepairGUI_FreeBoundDlg.cxx
1 //  GEOM GEOMGUI : GUI for Geometry component
2 //
3 //  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
5 // 
6 //  This library is free software; you can redistribute it and/or 
7 //  modify it under the terms of the GNU Lesser General Public 
8 //  License as published by the Free Software Foundation; either 
9 //  version 2.1 of the License. 
10 // 
11 //  This library is distributed in the hope that it will be useful, 
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of 
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
14 //  Lesser General Public License for more details. 
15 // 
16 //  You should have received a copy of the GNU Lesser General Public 
17 //  License along with this library; if not, write to the Free Software 
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
19 // 
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 //
23 //
24 //  File   : RepairGUI_FreeBoundDlg.cxx
25 //  Author : Sergey LITONIN
26 //  Module : GEOM
27 //  $Header$
28
29 #include "RepairGUI_FreeBoundDlg.h"
30 #include "GEOMBase.h"
31 #include "GeometryGUI.h"
32 #include "GEOM_Displayer.h"
33 #include "GEOMImpl_Types.hxx"
34
35 #include "SalomeApp_Application.h"
36 #include "LightApp_Application.h"
37 #include "LightApp_SelectionMgr.h"
38 #include "SUIT_MessageBox.h"
39 #include "SUIT_Session.h"
40
41 #include <TColStd_MapOfInteger.hxx>
42
43 #include <qlineedit.h>
44 #include <qlabel.h>
45 #include <qlayout.h>
46 #include <qgroupbox.h>
47 #include <qpushbutton.h>
48
49 #define SPACING 5
50 #define MARGIN 10
51
52 /*!
53   Class       : RepairGUI_FreeBoundDlg
54   Description : Dialog for displaying free boundaries of selected face, shell or solid
55 */
56
57 //=================================================================================
58 // function : RepairGUI_FreeBoundDlg
59 // purpose  : Constructor
60 //=================================================================================
61 RepairGUI_FreeBoundDlg::RepairGUI_FreeBoundDlg(GeometryGUI* theGUI, QWidget* theParent, const char*)
62 : QDialog( theParent, "RepairGUI_FreeBoundDlg", false,
63            WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose ),
64   GEOMBase_Helper( dynamic_cast<SUIT_Desktop*>( theParent ) ),
65   myGeomGUI( theGUI )
66 {
67   setCaption( tr( "CAPTION" ) );
68
69   QPixmap iconSelect( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM",tr( "ICON_SELECT" ) ) );
70   
71   QGroupBox* aMainGrp = new QGroupBox( 1, Qt::Horizontal, tr( "FREE_BOUND" ), this );
72   
73   QGroupBox* aSelGrp = new QGroupBox( 1, Qt::Vertical, aMainGrp );
74   aSelGrp->setInsideMargin( 0 );
75   aSelGrp->setFrameStyle( QFrame::NoFrame );
76   new QLabel( tr( "GEOM_OBJECT" ), aSelGrp );
77   ( new QPushButton( aSelGrp ) )->setPixmap( iconSelect );
78   myEdit = new QLineEdit( aSelGrp );
79   myEdit->setReadOnly( true );
80   myEdit->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
81
82   myClosedLbl = new QLabel( tr( "NUMBER_CLOSED" ), aMainGrp );
83   myOpenLbl = new QLabel( tr( "NUMBER_OPEN" ), aMainGrp );
84
85   QFrame* aFrame = new QFrame( this );
86   aFrame->setFrameStyle( QFrame::Box | QFrame::Sunken );
87   QPushButton* aCloseBtn = new QPushButton( tr( "GEOM_BUT_CLOSE" ), aFrame );
88   QPushButton* aHelpBtn = new QPushButton( tr( "GEOM_BUT_HELP" ), aFrame );
89   QHBoxLayout* aBtnLay = new QHBoxLayout( aFrame, MARGIN, SPACING );
90   aBtnLay->addWidget( aCloseBtn );
91   aBtnLay->addItem( new QSpacerItem( 0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum ) );
92   aBtnLay->addWidget( aHelpBtn );
93
94   QVBoxLayout* aLay = new QVBoxLayout( this );
95   aLay->setSpacing( SPACING );
96   aLay->setMargin( MARGIN );
97   aLay->addWidget( aMainGrp );
98   aLay->addWidget( aFrame );
99
100   //myHelpFileName = "files/salome2_sp3_measuregui_functions.htm#free_boundaries";
101   myHelpFileName = "using_measurement_tools_page.html#boundaries_anchor";
102
103   connect( aCloseBtn, SIGNAL( clicked() ), SLOT( onClose() ) );
104   connect( aHelpBtn, SIGNAL( clicked() ), SLOT( onHelp() ) );
105
106   Init();
107 }
108
109 //=================================================================================
110 // function : ~RepairGUI_FreeBoundDlg
111 // purpose  : Destructor
112 //=================================================================================
113 RepairGUI_FreeBoundDlg::~RepairGUI_FreeBoundDlg()
114 {
115 }
116
117 //=================================================================================
118 // function : onClose
119 // purpose  : SLOT. Called when "close" button pressed. Close dialog
120 //=================================================================================
121 void RepairGUI_FreeBoundDlg::onClose()
122 {
123   globalSelection();
124   disconnect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0 );
125   myGeomGUI->SetActiveDialogBox( 0 );
126   reject();
127   erasePreview();
128 }
129
130 //=================================================================================
131 // function : onHelp()
132 // purpose  :
133 //=================================================================================
134 void RepairGUI_FreeBoundDlg::onHelp()
135 {
136   LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
137   if (app)
138     app->onHelpContextModule(myGeomGUI ? app->moduleName(myGeomGUI->moduleName()) : QString(""), myHelpFileName);
139   else {
140                 QString platform;
141 #ifdef WIN32
142                 platform = "winapplication";
143 #else
144                 platform = "application";
145 #endif
146     SUIT_MessageBox::warn1
147       (0, tr("WRN_WARNING"), tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
148        arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(myHelpFileName),
149        tr("BUT_OK"));
150   }
151 }
152
153 //=================================================================================
154 // function : onDeactivate
155 // purpose  : Deactivate this dialog
156 //=================================================================================
157 void RepairGUI_FreeBoundDlg::onDeactivate()
158 {
159   setEnabled(false);
160   globalSelection();
161   disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
162   myGeomGUI->SetActiveDialogBox( 0 );
163 }
164
165 //=================================================================================
166 // function : onActivate
167 // purpose  : Activate this dialog
168 //=================================================================================
169 void RepairGUI_FreeBoundDlg::onActivate()
170 {
171   myGeomGUI->EmitSignalDeactivateDialog();
172   setEnabled( true );
173   myGeomGUI->SetActiveDialogBox( this );
174   connect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 
175            SIGNAL( currentSelectionChanged() ), SLOT( onSelectionDone() ) );
176   activateSelection();
177   onSelectionDone();
178 }
179
180 //=================================================================================
181 // function : onSelectionDone
182 // purpose  : SLOT. Called when selection changed.
183 //=================================================================================
184 void RepairGUI_FreeBoundDlg::onSelectionDone()
185 {
186   if( IObjectCount() != 1 )
187     return;
188
189   Standard_Boolean isOk = Standard_False;
190   GEOM::GEOM_Object_var anObj =
191     GEOMBase::ConvertIOinGEOMObject( firstIObject(), isOk );
192
193   if ( !isOk || anObj->_is_nil() || !GEOMBase::IsShape( anObj ) )
194     return;
195   else
196   {
197     myObj = anObj;
198     displayPreview( false, true, true, 3 );
199   }
200 }
201
202 //=================================================================================
203 // function : Init
204 // purpose  : Initialize dialog fields
205 //=================================================================================
206 void RepairGUI_FreeBoundDlg::Init()
207 {
208   myNbClosed = myNbOpen = 0;
209   myObj = GEOM::GEOM_Object::_nil();
210
211   connect( myGeomGUI, SIGNAL( SignalDeactivateActiveDialog() ), SLOT  ( onDeactivate() ) );
212   connect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 
213            SIGNAL( currentSelectionChanged() ), SLOT( onSelectionDone() ) );
214
215   activateSelection();
216   onSelectionDone();
217 }
218
219 //=================================================================================
220 // function : enterEvent
221 // purpose  : Activate dialog
222 //=================================================================================
223 void RepairGUI_FreeBoundDlg::enterEvent( QEvent* e )
224 {
225   onActivate();
226 }
227
228 //=================================================================================
229 // function : closeEvent
230 // purpose  : Close dialog
231 //=================================================================================
232 void RepairGUI_FreeBoundDlg::closeEvent( QCloseEvent* e )
233 {
234   onClose();
235 }
236
237 //=================================================================================
238 // function : activateSelection
239 // purpose  : activate selection of faces, shells, and solids
240 //=================================================================================
241 void RepairGUI_FreeBoundDlg::activateSelection()
242 {
243   TColStd_MapOfInteger aMap;
244   aMap.Add( GEOM_FACE );
245   aMap.Add( GEOM_SHELL );
246   aMap.Add( GEOM_SOLID );
247   aMap.Add( GEOM_COMPOUND );
248   globalSelection( aMap );
249 }
250
251 //=================================================================================
252 // function : createOperation
253 // purpose  : Create operation
254 //=================================================================================
255 GEOM::GEOM_IOperations_ptr RepairGUI_FreeBoundDlg::createOperation()
256 {
257   return getGeomEngine()->GetIHealingOperations( getStudyId() );
258 }
259
260 //=================================================================================
261 // function : isValid
262 // purpose  :
263 //=================================================================================
264 bool RepairGUI_FreeBoundDlg::isValid( QString& msg )
265 {
266   return !myObj->_is_nil();
267 }
268
269 //=================================================================================
270 // function : execute
271 // purpose  : Get free boundaries
272 //=================================================================================
273 bool RepairGUI_FreeBoundDlg::execute( ObjectList& objects )
274 {
275   if ( !IsPreview() || myObj->_is_nil() )
276     return false;
277
278   GEOM::ListOfGO_var aClosed, anOpen;
279
280   bool result = GEOM::GEOM_IHealingOperations::_narrow(
281     getOperation() )->GetFreeBoundary( myObj, aClosed, anOpen );
282
283   if ( result )
284   {
285     myNbClosed = aClosed->length();
286     myNbOpen = anOpen->length();
287     int i;
288     for ( i = 0; i < myNbClosed; i++ )
289       objects.push_back( aClosed[i]._retn() );
290     for ( i = 0; i < myNbOpen; i++ )
291       objects.push_back( anOpen[i]._retn() );
292
293     myEdit->setText( GEOMBase::GetName( myObj ) );
294     QString aLabelText = tr( "NUMBER_CLOSED" ) + QString( "%1" ).arg( myNbClosed );
295     myClosedLbl->setText( aLabelText );
296     aLabelText = tr( "NUMBER_OPEN" ) + QString( "%1" ).arg( myNbOpen );
297     myOpenLbl->setText( aLabelText );
298   }
299   else
300   {
301     myEdit->setText( GEOMBase::GetName( myObj ) );
302     myClosedLbl->setText( tr( "NUMBER_CLOSED" ) );
303     myOpenLbl->setText( tr( "NUMBER_OPEN" ) );
304   }
305
306   return result;
307 }
308
309 //=================================================================================
310 // function : keyPressEvent()
311 // purpose  :
312 //=================================================================================
313 void RepairGUI_FreeBoundDlg::keyPressEvent( QKeyEvent* e )
314 {
315   QDialog::keyPressEvent( e );
316   if ( e->isAccepted() )
317     return;
318
319   if ( e->key() == Key_F1 )
320     {
321       e->accept();
322       onHelp();
323     }
324 }