Salome HOME
Merging with WPdev
[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 = "check_free_boundaries.htm";
101
102   connect( aCloseBtn, SIGNAL( clicked() ), SLOT( onClose() ) );
103   connect( aHelpBtn, SIGNAL( clicked() ), SLOT( onHelp() ) );
104
105   Init();
106 }
107
108 //=================================================================================
109 // function : ~RepairGUI_FreeBoundDlg
110 // purpose  : Destructor
111 //=================================================================================
112 RepairGUI_FreeBoundDlg::~RepairGUI_FreeBoundDlg()
113 {
114 }
115
116 //=================================================================================
117 // function : onClose
118 // purpose  : SLOT. Called when "close" button pressed. Close dialog
119 //=================================================================================
120 void RepairGUI_FreeBoundDlg::onClose()
121 {
122   globalSelection();
123   disconnect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 0, this, 0 );
124   myGeomGUI->SetActiveDialogBox( 0 );
125   reject();
126   erasePreview();
127 }
128
129 //=================================================================================
130 // function : onHelp()
131 // purpose  :
132 //=================================================================================
133 void RepairGUI_FreeBoundDlg::onHelp()
134 {
135   LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
136   if (app)
137     app->onHelpContextModule(myGeomGUI ? app->moduleName(myGeomGUI->moduleName()) : QString(""), myHelpFileName);
138   else {
139                 QString platform;
140 #ifdef WIN32
141                 platform = "winapplication";
142 #else
143                 platform = "application";
144 #endif
145     SUIT_MessageBox::warn1
146       (0, tr("WRN_WARNING"), tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
147        arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(myHelpFileName),
148        tr("BUT_OK"));
149   }
150 }
151
152 //=================================================================================
153 // function : onDeactivate
154 // purpose  : Deactivate this dialog
155 //=================================================================================
156 void RepairGUI_FreeBoundDlg::onDeactivate()
157 {
158   setEnabled(false);
159   globalSelection();
160   disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
161   myGeomGUI->SetActiveDialogBox( 0 );
162 }
163
164 //=================================================================================
165 // function : onActivate
166 // purpose  : Activate this dialog
167 //=================================================================================
168 void RepairGUI_FreeBoundDlg::onActivate()
169 {
170   myGeomGUI->EmitSignalDeactivateDialog();
171   setEnabled( true );
172   myGeomGUI->SetActiveDialogBox( this );
173   connect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 
174            SIGNAL( currentSelectionChanged() ), SLOT( onSelectionDone() ) );
175   activateSelection();
176   onSelectionDone();
177 }
178
179 //=================================================================================
180 // function : onSelectionDone
181 // purpose  : SLOT. Called when selection changed.
182 //=================================================================================
183 void RepairGUI_FreeBoundDlg::onSelectionDone()
184 {
185   if( IObjectCount() != 1 )
186     return;
187
188   Standard_Boolean isOk = Standard_False;
189   GEOM::GEOM_Object_var anObj =
190     GEOMBase::ConvertIOinGEOMObject( firstIObject(), isOk );
191
192   if ( !isOk || anObj->_is_nil() || !GEOMBase::IsShape( anObj ) )
193     return;
194   else
195   {
196     myObj = anObj;
197     displayPreview( false, true, true, 3 );
198   }
199 }
200
201 //=================================================================================
202 // function : Init
203 // purpose  : Initialize dialog fields
204 //=================================================================================
205 void RepairGUI_FreeBoundDlg::Init()
206 {
207   myNbClosed = myNbOpen = 0;
208   myObj = GEOM::GEOM_Object::_nil();
209
210   connect( myGeomGUI, SIGNAL( SignalDeactivateActiveDialog() ), SLOT  ( onDeactivate() ) );
211   connect( ((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 
212            SIGNAL( currentSelectionChanged() ), SLOT( onSelectionDone() ) );
213
214   activateSelection();
215   onSelectionDone();
216 }
217
218 //=================================================================================
219 // function : enterEvent
220 // purpose  : Activate dialog
221 //=================================================================================
222 void RepairGUI_FreeBoundDlg::enterEvent( QEvent* e )
223 {
224   onActivate();
225 }
226
227 //=================================================================================
228 // function : closeEvent
229 // purpose  : Close dialog
230 //=================================================================================
231 void RepairGUI_FreeBoundDlg::closeEvent( QCloseEvent* e )
232 {
233   onClose();
234 }
235
236 //=================================================================================
237 // function : activateSelection
238 // purpose  : activate selection of faces, shells, and solids
239 //=================================================================================
240 void RepairGUI_FreeBoundDlg::activateSelection()
241 {
242   TColStd_MapOfInteger aMap;
243   aMap.Add( GEOM_FACE );
244   aMap.Add( GEOM_SHELL );
245   aMap.Add( GEOM_SOLID );
246   aMap.Add( GEOM_COMPOUND );
247   globalSelection( aMap );
248 }
249
250 //=================================================================================
251 // function : createOperation
252 // purpose  : Create operation
253 //=================================================================================
254 GEOM::GEOM_IOperations_ptr RepairGUI_FreeBoundDlg::createOperation()
255 {
256   return getGeomEngine()->GetIHealingOperations( getStudyId() );
257 }
258
259 //=================================================================================
260 // function : isValid
261 // purpose  :
262 //=================================================================================
263 bool RepairGUI_FreeBoundDlg::isValid( QString& msg )
264 {
265   return !myObj->_is_nil();
266 }
267
268 //=================================================================================
269 // function : execute
270 // purpose  : Get free boundaries
271 //=================================================================================
272 bool RepairGUI_FreeBoundDlg::execute( ObjectList& objects )
273 {
274   if ( !IsPreview() || myObj->_is_nil() )
275     return false;
276
277   GEOM::ListOfGO_var aClosed, anOpen;
278
279   bool result = GEOM::GEOM_IHealingOperations::_narrow(
280     getOperation() )->GetFreeBoundary( myObj, aClosed, anOpen );
281
282   if ( result )
283   {
284     myNbClosed = aClosed->length();
285     myNbOpen = anOpen->length();
286     int i;
287     for ( i = 0; i < myNbClosed; i++ )
288       objects.push_back( aClosed[i]._retn() );
289     for ( i = 0; i < myNbOpen; i++ )
290       objects.push_back( anOpen[i]._retn() );
291
292     myEdit->setText( GEOMBase::GetName( myObj ) );
293     QString aLabelText = tr( "NUMBER_CLOSED" ) + QString( "%1" ).arg( myNbClosed );
294     myClosedLbl->setText( aLabelText );
295     aLabelText = tr( "NUMBER_OPEN" ) + QString( "%1" ).arg( myNbOpen );
296     myOpenLbl->setText( aLabelText );
297   }
298   else
299   {
300     myEdit->setText( GEOMBase::GetName( myObj ) );
301     myClosedLbl->setText( tr( "NUMBER_CLOSED" ) );
302     myOpenLbl->setText( tr( "NUMBER_OPEN" ) );
303   }
304
305   return result;
306 }
307
308 //=================================================================================
309 // function : keyPressEvent()
310 // purpose  :
311 //=================================================================================
312 void RepairGUI_FreeBoundDlg::keyPressEvent( QKeyEvent* e )
313 {
314   QDialog::keyPressEvent( e );
315   if ( e->isAccepted() )
316     return;
317
318   if ( e->key() == Key_F1 )
319     {
320       e->accept();
321       onHelp();
322     }
323 }