Salome HOME
Copyrights update 2013
[samples/sierpinsky.git] / src / SierpinskyGUI / SierpinskyGUI_RunDlg.cxx
1 // Copyright (C) 2005-2013  OPEN CASCADE
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 ///////////////////////////////////////////////////////////
21 // File    : SierpinskyGUI_RunDlg.cxx
22 // Author  : Vadim SANDLER (OCN)
23 // Created : 13/07/05
24 ///////////////////////////////////////////////////////////
25
26 #include "SierpinskyGUI_RunDlg.h"
27 #include "SierpinskyGUI.h"
28 #include "SALOME_LifeCycleCORBA.hxx"
29 #include "SalomeApp_Application.h"
30
31 #include <QLabel>
32 #include <QLineEdit>
33 #include <QLayout>
34 #include <QPushButton>
35 #include <QGroupBox>
36 #include <QCheckBox>
37 #include <QSpinBox>
38 #include <QThread>
39 #include <QProgressBar>
40 #include <QApplication>
41
42 #include <SUIT_Application.h>
43 #include <SUIT_Desktop.h>
44 #include <SUIT_FileDlg.h>
45 #include <QtxDoubleSpinBox.h>
46 #include <SUIT_MessageBox.h>
47
48 #include <SALOMEconfig.h>
49 #include CORBA_SERVER_HEADER(Sierpinsky)
50 #include CORBA_CLIENT_HEADER(Randomizer)
51 #include CORBA_CLIENT_HEADER(SALOMEDS)
52 #include CORBA_CLIENT_HEADER(VISU_Gen)
53
54 /*!
55  * Get Randomizer component engine
56  */
57 static RANDOMIZER_ORB::RANDOMIZER_var getRandomizerEngine()
58 {
59   static RANDOMIZER_ORB::RANDOMIZER_var aGen;
60   if( CORBA::is_nil( aGen ) ) {
61     try{
62       SALOME_LifeCycleCORBA aLCC(SalomeApp_Application::namingService());
63       Engines::EngineComponent_var aComponent = aLCC.FindOrLoad_Component("FactoryServerPy","RANDOMIZER");
64       aGen = RANDOMIZER_ORB::RANDOMIZER::_narrow( aComponent );
65     }
66     catch (CORBA::Exception&){
67       MESSAGE("Caught CORBA::Exception.");
68     }
69     catch (...){
70       MESSAGE("Caught unknown exception.");
71     }
72   }
73   return aGen;
74 }
75
76 /*!
77  * Get Sierpinsky component engine
78  */
79 static SIERPINSKY_ORB::SIERPINSKY_var getSierpinskyEngine()
80 {
81   static SIERPINSKY_ORB::SIERPINSKY_var aGen;
82   if( CORBA::is_nil( aGen ) ) {
83     try{
84       SALOME_LifeCycleCORBA aLCC(SalomeApp_Application::namingService());
85       Engines::EngineComponent_var aComponent = aLCC.FindOrLoad_Component("FactoryServer","SIERPINSKY");
86       aGen = SIERPINSKY_ORB::SIERPINSKY::_narrow( aComponent );
87     }
88     catch (CORBA::Exception&){
89       MESSAGE("Caught CORBA::Exception.");
90     }
91     catch (...){
92       MESSAGE("Caught unknown exception.");
93     }
94   }
95   return aGen;
96 }
97
98 /*!
99  * Get VISU component engine
100  */
101 static VISU::VISU_Gen_var getVisuEngine()
102 {
103   static VISU::VISU_Gen_var aGen;
104   if( CORBA::is_nil( aGen ) ) {
105     try{
106       SALOME_LifeCycleCORBA aLCC(SalomeApp_Application::namingService());
107       Engines::EngineComponent_var aComponent = aLCC.FindOrLoad_Component("FactoryServer","VISU");
108       aGen = VISU::VISU_Gen::_narrow( aComponent );
109     }
110     catch (CORBA::Exception&){
111       MESSAGE("Caught CORBA::Exception.");
112     }
113     catch (...){
114       MESSAGE("Caught unknown exception.");
115     }
116
117   }
118   return aGen;
119 }
120
121 #define MY_EVENT QEvent::User + 555
122 class MyEvent : public QEvent
123 {
124 public:
125   MyEvent( const int iter ) : QEvent( (QEvent::Type)(MY_EVENT) ), myIter( iter ) {}
126   int iter() const { return myIter; }
127
128 private:
129   int myIter;
130 };
131
132 /*!
133  * Progress thread class
134  */
135 class MyThread : public QThread
136 {
137 public:
138   MyThread( SierpinskyGUI_RunDlg* parent, const double x, const double y, const int nbIter ) :
139     myParent( parent ), myStopped( false ), myX( x ), myY( y ), myNbIter( nbIter ) { start(); }
140
141   void init( const double x, const double y, const int nbIter ) 
142   {
143     myX = x; myY = y;
144     myNbIter = nbIter;
145     myStopped = false;
146     start();
147   }
148   void stop() { myStopped = true; }
149
150 protected:
151   void run() 
152   {
153     while ( !myStopped && myNbIter-- ) {
154       int ni = getRandomizerEngine()->NextIteration();
155       getSierpinskyEngine()->NextPoint( myX, myY, ni, myX, myY );
156       QApplication::postEvent( myParent, new MyEvent( myNbIter ) );
157       msleep( 50 );
158     }
159   }
160
161 private:
162   SierpinskyGUI_RunDlg* myParent;
163   bool                  myStopped;
164   double                myX;
165   double                myY;
166   int                   myNbIter;
167 };
168
169 #define MARGIN_SIZE  11
170 #define SPACING_SIZE  6
171
172 /*!
173  * Constructor
174  */
175 SierpinskyGUI_RunDlg::SierpinskyGUI_RunDlg( QWidget* parent, SierpinskyGUI* module )
176      : QDialog( parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint ),
177        myThread( 0 ), myModule( module )
178 {
179   setAttribute( Qt::WA_DeleteOnClose );
180
181   setObjectName("SierpinskyGUI_RunDlg");
182   setModal(true);
183
184   setWindowTitle( tr( "CAPTION" ) );
185   setSizeGripEnabled( true );
186   
187   QGridLayout* topLayout = new QGridLayout( this ); 
188   topLayout->setMargin( MARGIN_SIZE ); topLayout->setSpacing( SPACING_SIZE );
189
190   // start point group
191   box1 = new QGroupBox( tr( "START_POINT" ), this );
192   QGridLayout* box1Layout = new QGridLayout( box1 );
193   box1Layout->setAlignment( Qt::AlignTop );
194   box1Layout->setMargin( MARGIN_SIZE );
195   box1Layout->setSpacing( SPACING_SIZE );
196
197   QLabel* labX = new QLabel( "X:", box1 );
198   myStartX = new QtxDoubleSpinBox( 0.0, 1.0, 0.1 ,box1);
199   myStartX->setMinimumWidth( 150 );
200
201   QLabel* labY = new QLabel( "Y:", box1 );
202   myStartY = new QtxDoubleSpinBox( 0.0, 1.0, 0.1 ,box1);
203   myStartY->setMinimumWidth( 150 );
204
205   myStartRandom = new QCheckBox( tr( "RANDOM" ), box1 );
206
207   box1Layout->addWidget( labX,          0, 0 );
208   box1Layout->addWidget( myStartX,      0, 1 );
209   box1Layout->addWidget( labY,          0, 2 );
210   box1Layout->addWidget( myStartY,      0, 3 );
211   box1Layout->addWidget( myStartRandom, 1, 1 );
212
213   // base points group
214   box2 = new QGroupBox( tr( "BASE_POINTS" ), this );
215   QGridLayout* box2Layout = new QGridLayout( box2 );
216   box2Layout->setAlignment( Qt::AlignTop );
217   box2Layout->setMargin( MARGIN_SIZE );
218   box2Layout->setSpacing( SPACING_SIZE );
219
220   QLabel* labX1 = new QLabel( "X1:", box2 );
221   myX1 = new QtxDoubleSpinBox( 0.0, 1.0, 0.1 , box2);
222   myX1->setMinimumWidth( 150 );
223
224   QLabel* labY1 = new QLabel( "Y1:", box2 );
225   myY1 = new QtxDoubleSpinBox( 0.0, 1.0, 0.1 , box2);
226   myY1->setMinimumWidth( 150 );
227
228   QLabel* labX2 = new QLabel( "X2:", box2 );
229   myX2 = new QtxDoubleSpinBox( 0.0, 1.0, 0.1 , box2);
230   myX2->setMinimumWidth( 150 );
231
232   QLabel* labY2 = new QLabel( "Y2:", box2 );
233   myY2 = new QtxDoubleSpinBox( 0.0, 1.0, 0.1, box2);
234   myY2->setMinimumWidth( 150 );
235
236   QLabel* labX3 = new QLabel( "X3:", box2 );
237   myX3 = new QtxDoubleSpinBox( 0.0, 1.0, 0.1, box2);
238   myX3->setMinimumWidth( 150 );
239
240   QLabel* labY3 = new QLabel( "Y3:", box2 );
241   myY3 = new QtxDoubleSpinBox( 0.0, 1.0, 0.1, box2);
242   myY3->setMinimumWidth( 150 );
243
244   myBaseRandom  = new QCheckBox( tr( "RANDOM" ), box2 );
245   myBaseDefault = new QCheckBox( tr( "DEFAULT" ), box2 );
246
247   box2Layout->addWidget( labX1,         0, 0 );
248   box2Layout->addWidget( myX1,          0, 1 );
249   box2Layout->addWidget( labY1,         0, 2 );
250   box2Layout->addWidget( myY1,          0, 3 );
251   box2Layout->addWidget( labX2,         1, 0 );
252   box2Layout->addWidget( myX2,          1, 1 );
253   box2Layout->addWidget( labY2,         1, 2 );
254   box2Layout->addWidget( myY2,          1, 3 );
255   box2Layout->addWidget( labX3,         2, 0 );
256   box2Layout->addWidget( myX3,          2, 1 );
257   box2Layout->addWidget( labY3,         2, 2 );
258   box2Layout->addWidget( myY3,          2, 3 );
259   box2Layout->addWidget( myBaseRandom,  3, 1 );
260   box2Layout->addWidget( myBaseDefault, 3, 3 );
261
262   // number of iterations
263   QLabel* labIter = new QLabel( tr( "NB_ITERATIONS" ), this );
264   myIter = new QSpinBox( this );
265   myIter->setMinimum(1);
266   myIter->setMaximum(100000);
267   myIter->setSingleStep(1);
268
269   // results
270   box3 = new QGroupBox( tr( "RESULTS" ), this );
271   QGridLayout* box3Layout = new QGridLayout( box3 );
272   box3Layout->setAlignment( Qt::AlignTop );
273   box3Layout->setMargin( MARGIN_SIZE );
274   box3Layout->setSpacing( SPACING_SIZE );
275
276   myJpegCheck = new QCheckBox( tr( "EXPORT_2_JPEG" ), box3 );
277   myJpegFile = new QLineEdit( box3 );
278   myJpegFile->setMinimumWidth( 300 );
279
280   myJpegBtn = new QPushButton( "...", box3 );
281   myJpegBtn->setFixedSize( 20, 20 );
282
283   QLabel* labJpeg = new QLabel( tr( "IMAGE_SIZE" ), box3 );
284   myJpegSize = new QSpinBox( box3 );
285   myJpegSize->setMinimum(0);
286   myJpegSize->setMaximum(1280);
287   myJpegSize->setSingleStep(10);
288   myJpegSize->setMinimumWidth( 150 );
289
290   QFrame* line = new QFrame( box3 );
291   line->setFrameStyle( QFrame::HLine | QFrame::Sunken );
292
293   myMedCheck = new QCheckBox( tr( "EXPORT_2_MED" ), box3 );
294   myMedFile = new QLineEdit( box3 );
295   myMedFile->setMinimumWidth( 300 );
296
297   myMedBtn = new QPushButton( "...", box3 );
298   myMedBtn->setFixedSize( 20, 20 );
299
300   QLabel* labMed = new QLabel( tr( "MESH_SIZE" ), box3 );
301   myMedSize = new QtxDoubleSpinBox( 0.0, 1000, 1.0, box3);
302   myMedSize->setMinimumWidth( 150 );
303
304   myVisuCheck = new QCheckBox( tr( "IMPORT_MED_2_VISU" ), box3 );
305
306   box3Layout->addWidget( myJpegCheck, 0, 0, 1, 4 );
307   box3Layout->addWidget( myJpegFile,  1, 0, 1, 3 );
308   box3Layout->addWidget( myJpegBtn,   1, 3 );
309   box3Layout->addWidget( labJpeg,     2, 0 );
310   box3Layout->addWidget( myJpegSize,  2, 1 );
311   box3Layout->addWidget( line,        3, 0, 1, 4 );
312   box3Layout->addWidget( myMedCheck,  4, 0, 1, 4 );
313   box3Layout->addWidget( myMedFile,   5, 0, 1, 3 );
314   box3Layout->addWidget( myMedBtn,    5, 3 );
315   box3Layout->addWidget( labMed,      6, 0 );
316   box3Layout->addWidget( myMedSize,   6, 1 );
317   box3Layout->addWidget( myVisuCheck, 7, 0, 1, 4 );
318
319   // progress bar
320   myProgress = new QProgressBar( this );
321   myProgress->setTextVisible( false );
322   myProgress->setFixedHeight( 10 );
323  
324   // common buttons
325   myStartBtn  = new QPushButton( tr( "START_BTN" ),  this );
326   myCancelBtn = new QPushButton( tr( "CANCEL_BTN" ), this );
327   QHBoxLayout* btnLayout = new QHBoxLayout;
328   btnLayout->addWidget( myStartBtn ); 
329   btnLayout->addStretch();
330   btnLayout->addWidget( myCancelBtn );
331
332   topLayout->addWidget( box1,       0, 0, 1, 2 );
333   topLayout->addWidget( box2,       1, 0, 1, 2 );
334   topLayout->addWidget( labIter,    2, 0 );
335   topLayout->addWidget( myIter,     2, 1 );
336   topLayout->addWidget( box3,       3, 0, 1, 2 );
337   topLayout->addWidget( myProgress, 4, 0, 1, 2 );
338   topLayout->addLayout( btnLayout,  5, 0, 1, 2 );
339
340   // signals and slots connections
341   connect( myJpegBtn,     SIGNAL( clicked() ), this, SLOT( onBrowse() ) );
342   connect( myMedBtn,      SIGNAL( clicked() ), this, SLOT( onBrowse() ) );
343   connect( myStartRandom, SIGNAL( clicked() ), this, SLOT( updateState() ) );
344   connect( myBaseRandom,  SIGNAL( clicked() ), this, SLOT( toggled() ) );
345   connect( myBaseDefault, SIGNAL( clicked() ), this, SLOT( toggled() ) );
346   connect( myJpegCheck,   SIGNAL( clicked() ), this, SLOT( updateState() ) );
347   connect( myMedCheck,    SIGNAL( clicked() ), this, SLOT( updateState() ) );
348   connect( myStartBtn,    SIGNAL( clicked() ), this, SLOT( accept() ) );
349   connect( myCancelBtn,   SIGNAL( clicked() ), this, SLOT( close() ) );
350
351   // initial state
352   myStartX->setValue( 0.0 ); myStartY->setValue( 0.0 );
353   myStartRandom->setChecked( true );
354   myX1->setValue( 0.5 ); myY1->setValue( 1.0 );
355   myX2->setValue( 0.0 ); myY2->setValue( 0.0 );
356   myX3->setValue( 1.0 ); myY3->setValue( 0.0 );
357   myBaseRandom->setChecked( false );
358   myBaseDefault->setChecked( true );
359   myIter->setValue( 1000 );
360   myJpegCheck->setChecked( false );
361   myJpegSize->setValue( 200 );
362   myMedCheck->setChecked( false );
363   myMedSize->setValue( 100 );
364   myVisuCheck->setChecked( true );
365   updateState();
366 }
367
368 /*!
369  * Destructor
370  */
371 SierpinskyGUI_RunDlg::~SierpinskyGUI_RunDlg()
372 {
373   if ( myThread ) {
374     myThread->stop();
375     myThread->wait();
376     delete myThread;
377   }
378 }
379
380 /*!
381  * Browse file 
382  */
383 void SierpinskyGUI_RunDlg::onBrowse()
384 {
385   const QObject* snd = sender();
386   bool jpg = snd == myJpegBtn;
387   QString aFileName = SUIT_FileDlg::getFileName( this, 
388                                                  jpg ? myJpegFile->text() : myMedFile->text(), 
389                                                  (jpg ? tr( "JPEG_FILES") : tr( "MED_FILES" )).split( ":", QString::SkipEmptyParts ),
390                                                  jpg ? tr( "EXPORT_JPEG_FILE" ) : tr( "EXPORT_MED_FILE" ),
391                                                  false );
392   if ( !aFileName.isEmpty() ) {
393     jpg ? myJpegFile->setText( aFileName ) : myMedFile->setText( aFileName );
394   }
395 }
396
397 /*!
398  * Update widgets state
399  */
400 void SierpinskyGUI_RunDlg::updateState()
401 {
402   myStartX->setEnabled( !myStartRandom->isChecked() );
403   myStartY->setEnabled( !myStartRandom->isChecked() );
404
405   myX1->setEnabled( !myBaseRandom->isChecked() && !myBaseDefault->isChecked() );
406   myY1->setEnabled( !myBaseRandom->isChecked() && !myBaseDefault->isChecked() );
407   myX2->setEnabled( !myBaseRandom->isChecked() && !myBaseDefault->isChecked() );
408   myY2->setEnabled( !myBaseRandom->isChecked() && !myBaseDefault->isChecked() );
409   myX3->setEnabled( !myBaseRandom->isChecked() && !myBaseDefault->isChecked() );
410   myY3->setEnabled( !myBaseRandom->isChecked() && !myBaseDefault->isChecked() );
411
412   myJpegFile->setEnabled( myJpegCheck->isChecked() );
413   myJpegBtn->setEnabled( myJpegCheck->isChecked() );
414   myJpegSize->setEnabled( myJpegCheck->isChecked() );
415
416   myMedFile->setEnabled( myMedCheck->isChecked() );
417   myMedBtn->setEnabled( myMedCheck->isChecked() );
418   myMedSize->setEnabled( myMedCheck->isChecked() );
419   myVisuCheck->setEnabled( myMedCheck->isChecked() );
420 }
421
422 /*!
423  * Toggle 'Base points' mode
424  */
425 void SierpinskyGUI_RunDlg::toggled()
426 {
427   const QObject* snd = sender();
428   if ( snd == myBaseRandom  &&  myBaseRandom->isChecked() ) myBaseDefault->setChecked( false );
429   if ( snd == myBaseDefault && myBaseDefault->isChecked() ) myBaseRandom->setChecked( false );
430   updateState();
431 }
432
433 /*!
434  * Called when user presses 'Start' button
435  */
436 void SierpinskyGUI_RunDlg::accept()
437 {
438   RANDOMIZER_ORB::RANDOMIZER_var aRandGen  = getRandomizerEngine();
439   SIERPINSKY_ORB::SIERPINSKY_var aSierpGen = getSierpinskyEngine();
440
441   if( CORBA::is_nil( aRandGen ) || CORBA::is_nil( aSierpGen ) ) {
442     SUIT_MessageBox::critical( this,
443                                tr( "ERR_ERROR" ),
444                                tr( "EXEC_ERROR" ),
445                                tr( "OK_BTN") );
446     return;
447   }
448
449   // JPEG file
450   QString aJPEGFile;
451   int aJPEGSize = 0;
452   if ( myJpegCheck->isChecked() ) {
453     aJPEGFile = myJpegFile->text().trimmed();
454     aJPEGSize = myJpegSize->value();
455     if ( aJPEGFile.isEmpty() || aJPEGSize <= 0 ) {
456       int res = SUIT_MessageBox::warning( this,
457                                           tr( "WRN_WARNING" ),
458                                           tr( "JPEG_PARAMETERS_ERROR" ),
459                                           tr( "YES_BTN"), tr( "NO_BTN" ), 0, 1, 0 );
460       if ( res ) return;
461     }
462   }
463
464   // MED file
465   QString aMEDFile;
466   double aMEDSize = 0;
467   if ( myMedCheck->isChecked() ) {
468     aMEDFile = myMedFile->text().trimmed();
469     aMEDSize = myMedSize->value();
470     if ( aMEDFile.isEmpty() || aMEDSize <= 0 ) {
471       int res = SUIT_MessageBox::warning( this,
472                                           tr( "WRN_WARNING" ),
473                                           tr( "MED_PARAMETERS_ERROR" ),
474                                           tr( "YES_BTN"), tr( "NO_BTN" ), 0, 1, 0 );
475       if ( res ) return;
476     }
477   }
478
479   // start point
480   double x = myStartX->value();
481   double y = myStartY->value();
482   if ( myStartRandom->isChecked() )
483     aRandGen->InitPoint( x, y );
484
485   // base points
486   if ( myBaseDefault->isChecked() ) {
487     aSierpGen->Reset();  // use default values from engine
488   }
489   else { 
490     double x1 = myX1->value();
491     double y1 = myY1->value();
492     double x2 = myX2->value();
493     double y2 = myY2->value();
494     double x3 = myX3->value();
495     double y3 = myY3->value();
496     if ( myBaseRandom->isChecked() ) {
497       aRandGen->InitPoint( x1, y1 );
498       aRandGen->InitPoint( x2, y2 );
499       aRandGen->InitPoint( x3, y3 );
500     }
501     aSierpGen->Init( x1, y1, x2, y2, x3, y3 );
502   }
503
504   // nb of iterations
505   int iter = myIter->value();
506
507   // start execution
508   myProgress->setMaximum( iter );
509   myProgress->setValue( 0 );
510   if ( !myThread )
511     myThread = new MyThread( this, x, y, iter );
512   else
513     myThread->init( x, y, iter );
514   disconnect( myStartBtn, SIGNAL( clicked() ), this, SLOT( accept() ) );
515   connect(    myStartBtn, SIGNAL( clicked() ), this, SLOT( stop() ) );
516   myStartBtn->setText( tr( "STOP_BTN" ) );
517   box1->setEnabled( false );
518   box2->setEnabled( false );
519   box3->setEnabled( false );
520   myIter->setEnabled( false );
521 }
522
523 /*!
524  * Called when user presses 'Stop' button
525  */
526 void SierpinskyGUI_RunDlg::stop()
527 {
528   myThread->stop();
529   disconnect( myStartBtn, SIGNAL( clicked() ), this, SLOT( stop() ) );
530   connect(    myStartBtn, SIGNAL( clicked() ), this, SLOT( accept() ) );
531   myStartBtn->setText( tr( "START_BTN" ) );
532   myProgress->setValue( 0 );
533   box1->setEnabled( true );
534   box2->setEnabled( true );
535   box3->setEnabled( true );
536   myIter->setEnabled( true );
537 }
538
539 /*!
540  * Progress thread calls this method to update progress bar state
541  */
542 void SierpinskyGUI_RunDlg::nextStep( const int step )
543 {
544   if ( !step ) {
545     disconnect( myStartBtn, SIGNAL( clicked() ), this, SLOT( stop() ) );
546     connect(    myStartBtn, SIGNAL( clicked() ), this, SLOT( accept() ) );
547     myStartBtn->setText( tr( "START_BTN" ) );
548     myProgress->setValue( 0 );
549     box1->setEnabled( true );
550     box2->setEnabled( true );
551     box3->setEnabled( true );
552     myIter->setEnabled( true );
553
554     // export to JPEG
555     if ( myJpegCheck->isChecked() ) {
556       QString aJPEGFile = myJpegFile->text().trimmed();
557       int aJPEGSize = myJpegSize->value();
558       if ( !aJPEGFile.isEmpty() && aJPEGSize > 0 ) {
559         bool res = getSierpinskyEngine()->ExportToJPEG( aJPEGFile.toLatin1().data(), aJPEGSize );
560         if ( !res ) {
561           // error: can't create JPEG image
562         }
563       }
564     }
565     // export to MED
566     if ( myMedCheck->isChecked() ) {
567       QString aMEDFile = myMedFile->text().trimmed();
568       double aMEDSize = myMedSize->value();
569       if ( !aMEDFile.isEmpty() && aMEDSize > 0 ) {
570         bool res = getSierpinskyEngine()->ExportToMED( aMEDFile.toLatin1().data(), aMEDSize );
571         if ( res && myVisuCheck->isChecked() ) {
572           VISU::VISU_Gen_var aVisuGen = getVisuEngine();
573           if ( !CORBA::is_nil( aVisuGen ) ) {
574             VISU::Result_var aResult = aVisuGen->ImportFile( aMEDFile.toLatin1().data() );
575             if ( !CORBA::is_nil( aResult ) )
576               aVisuGen->MeshOnEntity( aResult, "Sierpinsky", VISU::NODE );
577             myModule->getApp()->updateObjectBrowser( true );
578           }
579         }
580       }
581     }
582   }
583   else {
584     myProgress->setValue( myProgress->maximum() - step );
585   }
586 }
587
588 /*!
589  *  Process progress event
590  */
591 void SierpinskyGUI_RunDlg::customEvent( QEvent* e )
592 {
593   if ( e->type() == MY_EVENT ) {
594     MyEvent* me = (MyEvent*)e;
595     nextStep( me->iter() );
596   }
597 }