Salome HOME
Improve interface
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_HomardAdaptDlg.cxx
1 // Copyright (C) 2011-2021  CEA/DEN, EDF R&D
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, or (at your option) any later version.
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 #include "SMESHGUI_HomardAdaptDlg.h"
21
22 #include "SMESHGUI.h"
23 #include "SMESHGUI_HomardBoundaryDlg.h"
24 #include "SMESHGUI_HomardUtils.h"
25 #include "SMESHGUI_Utils.h"
26 #include "SMESHGUI_VTKUtils.h"
27 #include "SMESHGUI_MeshUtils.h"
28 #include "SMESH_TryCatch.hxx"
29
30 #include <SalomeApp_Tools.h>
31 #include <SalomeApp_Module.h>
32 #include <SalomeApp_Application.h>
33 #include <LightApp_SelectionMgr.h>
34 #include <SUIT_MessageBox.h>
35 #include <SUIT_OverrideCursor.h>
36 #include <SUIT_FileDlg.h>
37 #include <SUIT_Desktop.h>
38 #include <SUIT_Session.h>
39 #include <SVTK_ViewWindow.h>
40
41 #include <QFileDialog>
42 #include <QMessageBox>
43 #include <QButtonGroup>
44
45 #include <utilities.h>
46
47 #ifdef WIN32
48 #include <direct.h>
49 #endif
50
51 using namespace std;
52
53 // La gestion des repertoires
54 #ifndef CHDIR
55   #ifdef WIN32
56     #define CHDIR _chdir
57   #else
58     #define CHDIR chdir
59   #endif
60 #endif
61
62 const int SPACING = 6;            // layout spacing
63 const int MARGIN  = 9;            // layout margin
64
65 //================================================================================
66 /*!
67  * \brief Constructor
68  */
69 //================================================================================
70 SMESHGUI_HomardAdaptDlg::SMESHGUI_HomardAdaptDlg(SMESHHOMARD::HOMARD_Gen_ptr myHomardGen0)
71   : QDialog(SMESHGUI::desktop())
72 {
73   MESSAGE("Debut du constructeur de SMESHGUI_HomardAdaptDlg");
74   myHomardGen = SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen0);
75   //myHomardGen = SMESHGUI::GetSMESHGen()->CreateHOMARD_ADAPT();
76   myHomardGen->Register();
77
78   setModal(false);
79   setAttribute( Qt::WA_DeleteOnClose, true );
80   setWindowTitle( tr( "ADAPT_WITH_HOMARD" ) );
81   setSizeGripEnabled( true );
82
83   QTabWidget* myTabWidget = new QTabWidget( this );
84
85   // Arguments
86   myArgs = new SMESHGUI_HomardAdaptArguments(myTabWidget);
87
88   // Advanced options
89   myAdvOpt = new SMESHGUI_HomardAdaptAdvanced(myTabWidget);
90
91   myTabWidget->addTab( myArgs, tr( "Args" ) );
92   myTabWidget->addTab( myAdvOpt, tr( "ADVOP" ) );
93
94   myAdvOpt->logGroupBox               ->setTitle(tr( "LOG_GROUP_TITLE" ));
95   myAdvOpt->workingDirectoryLabel     ->setText (tr( "WORKING_DIR" ));
96   myAdvOpt->workingDirectoryPushButton->setText (tr( "SELECT_DIR" ));
97   myAdvOpt->verboseLevelLabel         ->setText (tr( "VERBOSE_LEVEL" ));
98   myAdvOpt->logInFileCheck            ->setText (tr( "LOG_IN_FILE" ));
99   myAdvOpt->removeLogOnSuccessCheck   ->setText (tr( "REMOVE_LOG_ON_SUCCESS" ));
100   myAdvOpt->keepWorkingFilesCheck     ->setText (tr( "KEEP_WORKING_FILES" ));
101
102   //myAdvOpt->logInFileCheck->setChecked(true);
103   //myAdvOpt->removeLogOnSuccessCheck->setChecked(false);
104
105   // Working directory
106   QString aWorkingDir = QDir::tempPath();
107   char *aTmp_dir = getenv("SALOME_TMP_DIR");
108   if (aTmp_dir != NULL) {
109     QDir aTmpDir (aTmp_dir);
110     if (aTmpDir.exists()) {
111       aWorkingDir = aTmpDir.absolutePath();
112     }
113   }
114   myAdvOpt->workingDirectoryLineEdit->setText(aWorkingDir);
115
116   // Out med file and/or mesh publication
117   myArgs->myOutMedFileChk->setChecked(true);
118   myArgs->myOutPublishChk->setChecked(true);
119
120   // buttons
121   QHBoxLayout* btnLayout = new QHBoxLayout;
122   btnLayout->setSpacing( 6 );
123   btnLayout->setMargin( 0 );
124
125   buttonOk = new QPushButton(tr("SMESH_BUT_APPLY_AND_CLOSE"), this);
126   buttonOk->setAutoDefault(false);
127   btnLayout->addWidget(buttonOk);
128   btnLayout->addStretch( 10 );
129
130   buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), this);
131   buttonApply->setAutoDefault(false);
132   btnLayout->addWidget(buttonApply);
133   btnLayout->addStretch( 10 );
134
135   buttonCancel = new QPushButton(tr( "SMESH_BUT_CANCEL" ), this);
136   buttonCancel->setAutoDefault(false);
137   btnLayout->addWidget(buttonCancel);
138   btnLayout->addStretch( 10 );
139
140   buttonHelp = new QPushButton(tr( "SMESH_BUT_HELP" ), this);
141   buttonHelp->setAutoDefault(false);
142   btnLayout->addWidget(buttonHelp);
143
144   // dialog layout
145   QVBoxLayout* l = new QVBoxLayout ( this );
146   l->setMargin( 9 );
147   l->setSpacing( 6 );
148   l->addWidget( myTabWidget );
149   l->addStretch();
150   l->addLayout( btnLayout );
151
152   // dialog name and size
153   resize(600, 1150);
154   QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
155   sizePolicy.setHorizontalStretch(0);
156   sizePolicy.setVerticalStretch(0);
157   sizePolicy.setHeightForWidth(this->sizePolicy().hasHeightForWidth());
158   setSizePolicy(sizePolicy);
159   //setMinimumSize(QSize(600, 320));
160   setMinimumSize(QSize(500, 320));
161   setSizeIncrement(QSize(1, 1));
162   setBaseSize(QSize(600, 600));
163   setAutoFillBackground(true);
164
165   SetBoundaryNo();
166   InitConnect();
167
168   myArgs->GBBoundaryC->setVisible(0);
169   myArgs->GBBoundaryN->setVisible(0);
170   myArgs->GBBoundaryA->setVisible(0);
171   myArgs->GBBoundaryD->setVisible(0);
172
173   adjustSize();
174
175   //MESSAGE("Fin du constructeur de SMESHGUI_HomardAdaptDlg");
176 }
177
178 //=================================================================================
179 // function : ~SMESHGUI_HomardAdaptDlg()
180 // purpose  : Destroys the object and frees any allocated resources
181 //=================================================================================
182 SMESHGUI_HomardAdaptDlg::~SMESHGUI_HomardAdaptDlg()
183 {
184   // no need to delete child widgets, Qt does it all for us
185   myHomardGen->CleanCase();
186 }
187
188 //=================================================================================
189 // function : InitConnect
190 // purpose  : 
191 //=================================================================================
192 void SMESHGUI_HomardAdaptDlg::InitConnect()
193 {
194   connect( myArgs->mySelectInMedFileButton, SIGNAL(pressed()), this, SLOT(SetFileName()));
195
196   connect( myArgs->RBBoundaryNo,      SIGNAL(clicked()), this, SLOT(SetBoundaryNo()));
197   connect( myArgs->RBBoundaryCAO,     SIGNAL(clicked()), this, SLOT(SetBoundaryCAO()));
198   connect( myArgs->RBBoundaryNonCAO,  SIGNAL(clicked()), this, SLOT(SetBoundaryNonCAO()));
199
200   connect( myArgs->PBBoundaryCAONew,  SIGNAL(pressed()), this, SLOT(PushBoundaryCAONew()));
201   connect( myArgs->PBBoundaryCAOEdit, SIGNAL(pressed()), this, SLOT(PushBoundaryCAOEdit()) );
202   connect( myArgs->PBBoundaryCAOHelp, SIGNAL(pressed()), this, SLOT(PushBoundaryCAOHelp()) );
203   connect( myArgs->CBBoundaryD,       SIGNAL(stateChanged(int)), this, SLOT(SetBoundaryD()));
204   connect( myArgs->PBBoundaryDiNew,   SIGNAL(pressed()), this, SLOT(PushBoundaryDiNew()));
205   connect( myArgs->PBBoundaryDiEdit,  SIGNAL(pressed()), this, SLOT(PushBoundaryDiEdit()) );
206   connect( myArgs->PBBoundaryDiHelp,  SIGNAL(pressed()), this, SLOT(PushBoundaryDiHelp()) );
207   connect( myArgs->CBBoundaryA,       SIGNAL(stateChanged(int)), this, SLOT(SetBoundaryA()));
208   connect( myArgs->PBBoundaryAnNew,   SIGNAL(pressed()), this, SLOT(PushBoundaryAnNew()));
209   connect( myArgs->PBBoundaryAnEdit,  SIGNAL(pressed()), this, SLOT(PushBoundaryAnEdit()) );
210   connect( myArgs->PBBoundaryAnHelp,  SIGNAL(pressed()), this, SLOT(PushBoundaryAnHelp()) );
211
212   connect( buttonOk,       SIGNAL(pressed()), this, SLOT(PushOnOK()));
213   connect( buttonApply,    SIGNAL(pressed()), this, SLOT(PushOnApply()));
214   connect( buttonCancel,   SIGNAL(pressed()), this, SLOT(close()));
215   connect( buttonHelp,     SIGNAL(pressed()), this, SLOT(PushOnHelp()));
216
217   connect(myArgs, SIGNAL(updateSelection()), this, SLOT(updateSelection()));
218 }
219
220 //=================================================================================
221 // function : InitBoundarys
222 // purpose  : Initialisation des menus avec les frontieres deja enregistrees
223 //=================================================================================
224 void SMESHGUI_HomardAdaptDlg::InitBoundarys()
225 {
226   MESSAGE("InitBoundarys");
227   //myArgs->TWBoundary->clearContents();
228   //myArgs->TWBoundary->clear();
229   // Pour les frontieres analytiques : la colonne des groupes
230   SMESHHOMARD::ListGroupType_var _listeGroupesCas = myCase->GetGroups();
231   QTableWidgetItem *__colItem = new QTableWidgetItem();
232   __colItem->setText(tr(""));
233   myArgs->TWBoundary->setHorizontalHeaderItem(0, __colItem);
234   for ( int i = 0; i < (int)_listeGroupesCas->length(); i++ ) {
235     myArgs->TWBoundary->insertRow(i);
236     myArgs->TWBoundary->setItem( i, 0, new QTableWidgetItem(QString((_listeGroupesCas)[i]).trimmed()));
237     myArgs->TWBoundary->item( i, 0 )->setFlags(Qt::ItemIsEnabled |Qt::ItemIsSelectable );
238   }
239   // Pour les frontieres CAO : la liste a saisir
240   // Pour les frontieres discretes : la liste a saisir
241   // Pour les frontieres analytiques : les colonnes de chaque frontiere
242   SMESHHOMARD::HOMARD_Boundary_var myBoundary ;
243   SMESHHOMARD::listeBoundarys_var  mesBoundarys = myHomardGen->GetAllBoundarysName();
244   //MESSAGE("Nombre de frontieres enregistrees : "<<mesBoundarys->length());
245   for (int i=0; i < (int)mesBoundarys->length(); i++) {
246     myBoundary = myHomardGen->GetBoundary(mesBoundarys[i]);
247     int type_obj = myBoundary->GetType() ;
248     if ( type_obj==-1 )     { myArgs->CBBoundaryCAO->addItem(QString(mesBoundarys[i])); }
249     else if ( type_obj==0 ) { myArgs->CBBoundaryDi->addItem(QString(mesBoundarys[i])); }
250     else                    { AddBoundaryAn(QString(mesBoundarys[i])); }
251   }
252   // Ajustement
253   myArgs->TWBoundary->resizeColumnsToContents();
254   myArgs->TWBoundary->resizeRowsToContents();
255   myArgs->TWBoundary->clearSelection();
256 }
257
258 //=================================================================================
259 // function : CheckCase
260 // purpose  : 
261 //=================================================================================
262 bool SMESHGUI_HomardAdaptDlg::CheckCase(bool fixCase)
263 {
264   MESSAGE("CheckCase");
265
266   QString aWorkingDir = myAdvOpt->workingDirectoryLineEdit->text().trimmed();
267   if (aWorkingDir == QString("")) {
268     QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
269                               QObject::tr("HOM_CASE_DIRECTORY_1") );
270     return false;
271   }
272
273   if (CHDIR(aWorkingDir.toStdString().c_str()) != 0) {
274     QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
275                               QObject::tr("HOM_CASE_DIRECTORY_3") );
276     return false;
277   }
278
279   QString aMeshName, aFileName;
280   if (myArgs->myInMedFileRadio->isChecked()) {
281     aFileName = myArgs->mySelectInMedFileLineEdit->text().trimmed();
282     if (aFileName == QString("")) {
283       QMessageBox::critical(0, QObject::tr("HOM_ERROR"), QObject::tr("HOM_CASE_MESH"));
284       return false;
285     }
286
287     // In mesh name
288     aMeshName = SMESH_HOMARD_QT_COMMUN::LireNomMaillage(aFileName);
289     if (aMeshName == "") {
290       QMessageBox::critical(0, QObject::tr("HOM_ERROR"), QObject::tr("HOM_MED_FILE_2"));
291       return false;
292     }
293   }
294   else {
295     aMeshName = myArgs->myInBrowserObject->text();
296     if (aMeshName == "" || myMesh->_is_nil()) {
297       QMessageBox::critical(0, QObject::tr("HOM_ERROR"),
298                             QObject::tr("Mesh object is not selected"));
299       return false;
300     }
301   }
302
303   // On verifie qu'un groupe n'est pas associe a deux frontieres differentes
304   if (myArgs->CBBoundaryA->isChecked()) {
305     QStringList ListeGroup;
306     QString NomGroup;
307     int nbcol = myArgs->TWBoundary->columnCount();
308     int nbrow = myArgs->TWBoundary->rowCount();
309     for ( int col=1; col< nbcol; col++) {
310       for ( int row=0; row< nbrow; row++) {
311         if ( myArgs->TWBoundary->item( row, col )->checkState() ==  Qt::Checked ) {
312           // Group name
313           NomGroup = QString(myArgs->TWBoundary->item(row, 0)->text()) ;
314           for ( int nugr = 0 ; nugr < ListeGroup.size(); nugr++) {
315             if ( NomGroup == ListeGroup[nugr] ) {
316               QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
317                                         QObject::tr("HOM_CASE_GROUP").arg(NomGroup) );
318               return false;
319             }
320           }
321           ListeGroup.insert(0, NomGroup );
322         }
323       }
324     }
325   }
326
327   if (!fixCase) return true;
328
329   // Creation du cas
330   if (myCase->_is_nil()) {
331     try {
332       if (myArgs->myInMedFileRadio->isChecked()) {
333         // create case from MED file
334         myCase = myHomardGen->CreateCase
335           (CORBA::string_dup(aMeshName.toStdString().c_str()),
336            CORBA::string_dup(aFileName.toStdString().c_str()),
337            aWorkingDir.toStdString().c_str());
338       }
339       else {
340         // create case from SMESH_Mesh
341         myCase = myHomardGen->CreateCaseOnMesh
342           (CORBA::string_dup(aMeshName.toStdString().c_str()),
343            myMesh,
344            aWorkingDir.toStdString().c_str());
345       }
346     }
347     catch( SALOME::SALOME_Exception& S_ex ) {
348       QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
349                              QObject::tr(CORBA::string_dup(S_ex.details.text)) );
350       return false;
351     }
352     // Prevent changing case data
353     myArgs->myInMedFileRadio->setEnabled(false);
354     myArgs->myInBrowserRadio->setEnabled(false);
355     myArgs->mySelectInMedFileLineEdit->setReadOnly(true);
356     myArgs->mySelectInMedFileButton->setEnabled(false);
357     myArgs->myInBrowserObject->setReadOnly(true);
358     myAdvOpt->workingDirectoryLineEdit->setReadOnly(true);
359     myAdvOpt->workingDirectoryPushButton->setEnabled(false);
360     InitBoundarys();
361   }
362
363   // Menage des eventuelles frontieres deja enregistrees
364   myCase->SupprBoundaryGroup();
365
366   return true;
367 }
368
369 //=================================================================================
370 // function : PushOnApply
371 // purpose  : 
372 //=================================================================================
373 bool SMESHGUI_HomardAdaptDlg::PushOnApply()
374 {
375   MESSAGE("PushOnApply");
376
377   // Check data, create Case if not yet
378   if (!CheckCase(true))
379     return false;
380
381   // Create boundaries
382   if (myArgs->RBBoundaryCAO->isChecked()) {
383     QString monBoundaryCAOName = myArgs->CBBoundaryCAO->currentText();
384     if (monBoundaryCAOName != "" ) {
385       myCase->AddBoundary(monBoundaryCAOName.toStdString().c_str());
386     }
387   }
388   if (myArgs->CBBoundaryD->isChecked()) {
389     QString monBoundaryDiName = myArgs->CBBoundaryDi->currentText();
390     if (monBoundaryDiName != "" ) {
391       myCase->AddBoundary(monBoundaryDiName.toStdString().c_str());
392     }
393   }
394   if (myArgs->CBBoundaryA->isChecked()) {
395     QString NomGroup;
396     int nbcol = myArgs->TWBoundary->columnCount();
397     int nbrow = myArgs->TWBoundary->rowCount();
398     for ( int col = 1; col < nbcol; col++) {
399       for ( int row = 0; row < nbrow; row++) {
400         if ( myArgs->TWBoundary->item( row, col )->checkState() == Qt::Checked ) {
401           // Nom du groupe
402           NomGroup = QString(myArgs->TWBoundary->item(row, 0)->text()) ;
403           // Nom de la frontiere
404           QTableWidgetItem *__colItem = myArgs->TWBoundary->horizontalHeaderItem(col);
405           myCase->AddBoundaryGroup(QString(__colItem->text()).toStdString().c_str(),
406                                    NomGroup.toStdString().c_str());
407         }
408       }
409     }
410   }
411
412   // Output MED and MESH parameters
413   myHomardGen->SetKeepMedOUT(myArgs->myOutMedFileChk->isChecked());
414   myHomardGen->SetPublishMeshOUT(myArgs->myOutPublishChk->isChecked());
415   QString anOutMeshName = myArgs->myOutMeshNameLineEdit->text();
416   if (anOutMeshName.isEmpty()) anOutMeshName = "DEFAULT_MESH_NAME";
417   myHomardGen->SetMeshNameOUT(anOutMeshName.toStdString().c_str());
418
419   std::string aMeshFileOUT;
420   if (myArgs->myOutMedFileChk->isChecked()) {
421     QString anOutMed = myArgs->mySelectOutMedFileLineEdit->text();
422     if (anOutMed.isEmpty()) {
423       // store in working directory and with default name
424       QString aWorkingDir = myAdvOpt->workingDirectoryLineEdit->text().trimmed();
425       QFileInfo aFileInfo (QDir(aWorkingDir), "Uniform_R.med");
426       anOutMed = aFileInfo.absoluteFilePath();
427       // show it
428       myArgs->mySelectOutMedFileLineEdit->setText(anOutMed);
429     }
430     else {
431       QFileInfo aFileInfo (anOutMed);
432       anOutMed = aFileInfo.absoluteFilePath();
433     }
434     aMeshFileOUT = anOutMed.toStdString();
435   }
436   else {
437     // Set file name without path for it to be created in current directory
438     // (it will be iteration's dir, and it will be destroyed after)
439     aMeshFileOUT = "Uniform_R.med";
440   }
441   myHomardGen->SetMeshFileOUT(aMeshFileOUT.c_str());
442
443   // Conformity type
444   myHomardGen->SetConfType(myArgs->RBConforme->isChecked() ? 0 : 1);
445
446   // Advanced options
447   myHomardGen->SetVerboseLevel(myAdvOpt->verboseLevelSpin->value());
448   myHomardGen->SetKeepWorkingFiles(myAdvOpt->keepWorkingFilesCheck->isChecked());
449   myHomardGen->SetLogInFile(myAdvOpt->logInFileCheck->isChecked());
450   myHomardGen->SetRemoveLogOnSuccess(myAdvOpt->removeLogOnSuccessCheck->isChecked());
451
452   // Log file
453   if (myAdvOpt->logInFileCheck->isChecked()) {
454     // Write log file in the working dir
455     QString aLogBaseName;
456     if (myArgs->myInMedFileRadio->isChecked()) {
457       // Name of log file will be "<name_of_input_med_file>_Uniform_R.log"
458       QString aMedFileIn = myArgs->mySelectInMedFileLineEdit->text().trimmed();
459       QFileInfo aFileInfoIn (aMedFileIn);
460       aLogBaseName = aFileInfoIn.fileName();
461     }
462     else {
463       // Name of log file will be "SMESH_Mesh_<name_of_input_mesh>_Uniform_R.log"
464       aLogBaseName = "SMESH_Mesh_";
465       aLogBaseName += myArgs->myInBrowserObject->text();
466     }
467     QString aWorkingDir = myAdvOpt->workingDirectoryLineEdit->text().trimmed();
468     QFileInfo aFileInfo (QDir(aWorkingDir), aLogBaseName + "_Uniform_R.log");
469     QString anOutLog = aFileInfo.absoluteFilePath();
470     MESSAGE("myHomardGen->SetLogFile(" << anOutLog.toStdString().c_str() << ")");
471     myHomardGen->SetLogFile(anOutLog.toStdString().c_str());
472   }
473
474   // Compute and publish
475   bool isSuccess = true;
476   try {
477     SUIT_OverrideCursor aWaitCursor;
478     isSuccess = myHomardGen->Compute() == 0;
479   }
480   catch( SALOME::SALOME_Exception& S_ex ) {
481     QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
482                            QObject::tr(CORBA::string_dup(S_ex.details.text)) );
483     isSuccess = false;
484   }
485
486   // Update Object Browser
487   if (isSuccess) {
488     SMESHGUI::GetSMESHGUI()->updateObjBrowser();
489
490     // Clean case, as it is deleted after successful Compute
491     myCase = SMESHHOMARD::HOMARD_Cas::_nil();
492   }
493
494   // Enable new case data selection
495   myArgs->myInMedFileRadio->setEnabled(true);
496   myArgs->myInBrowserRadio->setEnabled(true);
497   myArgs->mySelectInMedFileLineEdit->setReadOnly(false);
498   myArgs->mySelectInMedFileButton->setEnabled(true);
499   myArgs->myInBrowserObject->setReadOnly(false);
500   myAdvOpt->workingDirectoryLineEdit->setReadOnly(false);
501   myAdvOpt->workingDirectoryPushButton->setEnabled(true);
502
503   return isSuccess;
504 }
505
506 //=================================================================================
507 // function : PushOnOK
508 // purpose  : 
509 //=================================================================================
510 void SMESHGUI_HomardAdaptDlg::PushOnOK()
511 {
512   bool bOK = PushOnApply();
513   if ( bOK ) this->close();
514 }
515
516 void SMESHGUI_HomardAdaptDlg::PushOnHelp()
517 {
518   SMESH::ShowHelpFile("adaptation.html#_homard_adapt_anchor");
519 }
520
521 void SMESHGUI_HomardAdaptDlg::updateSelection()
522 {
523   LightApp_SelectionMgr *selMgr = SMESHGUI::selectionMgr();
524   disconnect(selMgr, 0, this, 0);
525   selMgr->clearFilters();
526
527   if (!myArgs->myInBrowserRadio->isChecked())
528     return;
529
530   SMESH::SetPointRepresentation(false);
531   if (SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow())
532     aViewWindow->SetSelectionMode(ActorSelection);
533   if (myArgs->myInBrowserRadio->isChecked()) {
534     connect(selMgr, SIGNAL(currentSelectionChanged()), this, SLOT(selectionChanged()));
535     selectionChanged();
536   }
537 }
538
539 void SMESHGUI_HomardAdaptDlg::selectionChanged()
540 {
541   if (!myArgs->myInBrowserRadio->isChecked())
542     return;
543
544   //SUIT_OverrideCursor aWaitCursor;
545   LightApp_SelectionMgr *selMgr = SMESHGUI::selectionMgr();
546
547   // get selected mesh
548   SALOME_ListIO aList;
549   selMgr->selectedObjects(aList);
550   QString aMeshName = "";
551
552   if (aList.Extent() == 1) {
553     Handle(SALOME_InteractiveObject) IO = aList.First();
554     myMesh = SMESH::GetMeshByIO(IO);
555     SMESH::GetNameOfSelectedIObjects(selMgr, aMeshName);
556     if (aMeshName.isEmpty()) aMeshName = " ";
557     else                     aMeshName = aMeshName.trimmed();
558   }
559   else {
560     myMesh = SMESH::SMESH_Mesh::_nil();
561   }
562
563   myArgs->myInBrowserObject->setText(aMeshName);
564
565   // Out mesh name default value
566   myArgs->myOutMeshNameLineEdit->setText(aMeshName + "_Uniform_R");
567
568   // Output med file default value
569   // Construct it from Input mesh name and working directory
570   //if (myArgs->myOutMedFileChk->isChecked()) {
571   if (aMeshName.isEmpty()) {
572     myArgs->mySelectOutMedFileLineEdit->setText("");
573   }
574   else {
575     QString aWorkingDir = myAdvOpt->workingDirectoryLineEdit->text().trimmed();
576     QFileInfo aFileInfo (QDir(aWorkingDir), aMeshName + QString("_Uniform_R.med"));
577     for (int ii = 1; aFileInfo.exists(); ii++) {
578       QString anUniqueName = QString("%1_Uniform_R_%2.med").arg(aMeshName).arg(ii);
579       aFileInfo.setFile(QDir(aWorkingDir), anUniqueName);
580     }
581     myArgs->mySelectOutMedFileLineEdit->setText(aFileInfo.absoluteFilePath());
582   }
583   //}
584
585   // Check data
586   if (!aMeshName.isEmpty())
587     CheckCase(false);
588 }
589
590 void SMESHGUI_HomardAdaptDlg::SetFileName()
591 {
592   // Input med file
593   QString fileName0 = myArgs->mySelectInMedFileLineEdit->text().trimmed();
594   QString fileName = SMESH_HOMARD_QT_COMMUN::PushNomFichier(false, QString("med"));
595   //SUIT_OverrideCursor aWaitCursor;
596   if (fileName.isEmpty()) {
597     fileName = fileName0;
598     if (fileName.isEmpty()) return;
599   }
600   QFileInfo aFileInInfo (fileName);
601   fileName = aFileInInfo.absoluteFilePath();
602   myArgs->mySelectInMedFileLineEdit->setText(fileName);
603
604   // Out mesh name default value
605   QString aMeshName = SMESH_HOMARD_QT_COMMUN::LireNomMaillage(fileName);
606   myArgs->myOutMeshNameLineEdit->setText(aMeshName + "_Uniform_R");
607
608   // Output med file default value
609   // Construct it from Input med file name and path
610   //if (myArgs->myOutMedFileChk->isChecked()) {
611   std::string fname = fileName.toStdString();
612   size_t lastdot = fname.find_last_of(".");
613   if (lastdot != std::string::npos)
614     fname = fname.substr(0, lastdot);
615   QString fileNameOut = fname.c_str();
616   QFileInfo aFileInfo (fileNameOut + QString("_Uniform_R.med"));
617   for (int ii = 1; aFileInfo.exists(); ii++) {
618     QString anUniqueName = QString("%1_Uniform_R_%2.med").arg(fileNameOut).arg(ii);
619     aFileInfo.setFile(anUniqueName);
620   }
621   myArgs->mySelectOutMedFileLineEdit->setText(aFileInfo.absoluteFilePath());
622   //}
623
624   // Check data
625   CheckCase(false);
626 }
627
628 // ------------------------------------------------------------------------
629 void SMESHGUI_HomardAdaptDlg::SetBoundaryNo()
630 {
631   myArgs->GBBoundaryC->setVisible(0);
632   myArgs->GBBoundaryN->setVisible(0);
633   adjustSize();
634 }
635
636 // ------------------------------------------------------------------------
637 void SMESHGUI_HomardAdaptDlg::SetBoundaryCAO()
638 {
639   if (CheckCase(true)) {
640     myArgs->GBBoundaryC->setVisible(1);
641     myArgs->GBBoundaryN->setVisible(0);
642     adjustSize();
643   }
644 }
645 // ------------------------------------------------------------------------
646 void SMESHGUI_HomardAdaptDlg::SetBoundaryNonCAO()
647 {
648   myArgs->GBBoundaryC->setVisible(0);
649   myArgs->GBBoundaryN->setVisible(1);
650   adjustSize();
651 }
652 // ------------------------------------------------------------------------
653 void SMESHGUI_HomardAdaptDlg::AddBoundaryCAO(QString newBoundary)
654 // ------------------------------------------------------------------------
655 {
656   myArgs->CBBoundaryCAO->insertItem(0,newBoundary);
657   myArgs->CBBoundaryCAO->setCurrentIndex(0);
658 }
659 // ------------------------------------------------------------------------
660 void SMESHGUI_HomardAdaptDlg::PushBoundaryCAONew()
661 // ------------------------------------------------------------------------
662 {
663    SMESH_CreateBoundaryCAO *BoundaryDlg = new SMESH_CreateBoundaryCAO
664      (this, true, SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen), "Case_1", "");
665    BoundaryDlg->show();
666 }
667 // ------------------------------------------------------------------------
668 void SMESHGUI_HomardAdaptDlg::PushBoundaryCAOEdit()
669 // ------------------------------------------------------------------------
670 {
671   if (myArgs->CBBoundaryCAO->currentText() == QString(""))  return;
672   SMESH_EditBoundaryCAO *BoundaryDlg = new SMESH_EditBoundaryCAO
673     (this, true, SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen),
674      "Case_1", myArgs->CBBoundaryCAO->currentText());
675   BoundaryDlg->show();
676 }
677
678 // ------------------------------------------------------------------------
679 void SMESHGUI_HomardAdaptDlg::PushBoundaryCAOHelp()
680 {
681   SMESH::ShowHelpFile(QString("homard_create_boundary.html#cao-boundary"));
682 }
683
684 // ------------------------------------------------------------------------
685 void SMESHGUI_HomardAdaptDlg::SetBoundaryD()
686 {
687   MESSAGE("Debut de SetBoundaryD ");
688   if (myArgs->CBBoundaryD->isChecked()) {
689     bool bOK = CheckCase(true);
690     if (bOK) {
691       myArgs->GBBoundaryD->setVisible(1);
692     }
693     else {
694       myArgs->GBBoundaryD->setVisible(0);
695       myArgs->CBBoundaryD->setChecked(0);
696       myArgs->CBBoundaryD->setCheckState(Qt::Unchecked);
697     }
698   }
699   else {
700     myArgs->GBBoundaryD->setVisible(0);
701   }
702
703   //myArgs->mySelectInMedFileLineEdit->setReadOnly(true);
704   //myArgs->mySelectInMedFileButton->hide();
705
706   adjustSize();
707 }
708 // ------------------------------------------------------------------------
709 void SMESHGUI_HomardAdaptDlg::AddBoundaryDi(QString newBoundary)
710 // ------------------------------------------------------------------------
711 {
712   myArgs->CBBoundaryDi->insertItem(0,newBoundary);
713   myArgs->CBBoundaryDi->setCurrentIndex(0);
714 }
715 // ------------------------------------------------------------------------
716 void SMESHGUI_HomardAdaptDlg::PushBoundaryDiNew()
717 // ------------------------------------------------------------------------
718 {
719    SMESH_CreateBoundaryDi *BoundaryDlg = new SMESH_CreateBoundaryDi(this, true,
720                 SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen), "Case_1", "");
721    BoundaryDlg->show();
722 }
723 // ------------------------------------------------------------------------
724 void SMESHGUI_HomardAdaptDlg::PushBoundaryDiEdit()
725 // ------------------------------------------------------------------------
726 {
727   if (myArgs->CBBoundaryDi->currentText() == QString(""))  return;
728   SMESH_EditBoundaryDi *BoundaryDlg = new SMESH_EditBoundaryDi
729     (this, true, SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen),
730      "Case_1", myArgs->CBBoundaryDi->currentText());
731   BoundaryDlg->show();
732 }
733
734 // ------------------------------------------------------------------------
735 void SMESHGUI_HomardAdaptDlg::PushBoundaryDiHelp()
736 {
737   SMESH::ShowHelpFile(QString("homard_create_boundary.html#discrete-boundary"));
738 }
739
740 // ------------------------------------------------------------------------
741 void SMESHGUI_HomardAdaptDlg::SetBoundaryA()
742 {
743   MESSAGE("Debut de SetBoundaryA ");
744   if (myArgs->CBBoundaryA->isChecked()) {
745     bool bOK = CheckCase(true);
746     if (bOK) {
747       myArgs->GBBoundaryA->setVisible(1);
748     }
749     else {
750       myArgs->GBBoundaryA->setVisible(0);
751       myArgs->CBBoundaryA->setChecked(0);
752       myArgs->CBBoundaryA->setCheckState(Qt::Unchecked);
753     }
754   }
755   else {
756     myArgs->GBBoundaryA->setVisible(0);
757   }
758
759   //myArgs->mySelectInMedFileLineEdit->setReadOnly(true);
760   //myArgs->mySelectInMedFileButton->hide();
761
762   adjustSize();
763 }
764 // ------------------------------------------------------------------------
765 void SMESHGUI_HomardAdaptDlg::AddBoundaryAn(QString newBoundary)
766 // ------------------------------------------------------------------------
767 {
768   MESSAGE("Debut de AddBoundaryAn ");
769 // Ajout d'une nouvelle colonne
770   int nbcol = myArgs->TWBoundary->columnCount();
771 //   MESSAGE("nbcol " <<  nbcol);
772   nbcol += 1 ;
773   myArgs->TWBoundary->setColumnCount ( nbcol ) ;
774   QTableWidgetItem *__colItem = new QTableWidgetItem();
775   __colItem->setText(tr(newBoundary.toStdString().c_str()));
776   myArgs->TWBoundary->setHorizontalHeaderItem(nbcol-1, __colItem);
777 /*  TWBoundary->horizontalHeaderItem(nbcol-1)->setFlags( Qt::ItemIsSelectable|Qt::ItemIsEnabled );*/
778 // Chaque case est a cocher
779   int nbrow = myArgs->TWBoundary->rowCount();
780 //   MESSAGE("nbrow " <<  nbrow);
781   for ( int i = 0; i < nbrow; i++ )
782   {
783     myArgs->TWBoundary->setItem( i, nbcol-1, new QTableWidgetItem( QString ("") ) );
784     myArgs->TWBoundary->item( i, nbcol-1 )->setFlags( 0 );
785     myArgs->TWBoundary->item( i, nbcol-1 )->setFlags( Qt::ItemIsUserCheckable|Qt::ItemIsEnabled  );
786     myArgs->TWBoundary->item( i, nbcol-1 )->setCheckState( Qt::Unchecked );
787   }
788   myArgs->TWBoundary->resizeColumnToContents(nbcol-1);
789 //   TWBoundary->resizeRowsToContents();
790 //   MESSAGE("Fin de AddBoundaryAn ");
791 }
792 // ------------------------------------------------------------------------
793 void SMESHGUI_HomardAdaptDlg::PushBoundaryAnNew()
794 // ------------------------------------------------------------------------
795 {
796    SMESH_CreateBoundaryAn *BoundaryDlg = new SMESH_CreateBoundaryAn
797      (this, true, SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen), "Case_1");
798    BoundaryDlg->show();
799 }
800 // ------------------------------------------------------------------------
801 void SMESHGUI_HomardAdaptDlg::PushBoundaryAnEdit()
802 // ------------------------------------------------------------------------
803 {
804   QString nom="";
805   int nbcol = myArgs->TWBoundary->columnCount();
806   for ( int i = 1; i < nbcol; i++ ) {
807     QTableWidgetItem *__colItem = new QTableWidgetItem();
808     __colItem = myArgs->TWBoundary->horizontalHeaderItem(i);
809     nom = QString(__colItem->text()) ;
810     MESSAGE("nom "<<nom.toStdString().c_str());
811     if (nom != QString("")) {
812       SMESH_EditBoundaryAn *BoundaryDlg = new SMESH_EditBoundaryAn
813         (this, true, SMESHHOMARD::HOMARD_Gen::_duplicate(myHomardGen), "Case_1", nom);
814       BoundaryDlg->show();
815     }
816   }
817 }
818 // ------------------------------------------------------------------------
819 void SMESHGUI_HomardAdaptDlg::PushBoundaryAnHelp()
820 // ------------------------------------------------------------------------
821 {
822   SMESH::ShowHelpFile(QString("homard_create_boundary.html#analytical-boundary"));
823 }
824
825 //=================================================================================
826 // function : SMESHGUI_HomardAdaptArguments()
827 // purpose  :
828 //=================================================================================
829 SMESHGUI_HomardAdaptArguments::SMESHGUI_HomardAdaptArguments(QWidget* parent)
830   : QWidget(parent)
831 {
832   setupUi();
833 }
834
835 SMESHGUI_HomardAdaptArguments::~SMESHGUI_HomardAdaptArguments()
836 {
837 }
838
839 void SMESHGUI_HomardAdaptArguments::setupUi()
840 {
841   // Mesh in
842   QGroupBox* aMeshIn    = new QGroupBox( tr( "MeshIn" ), this );
843   myInMedFileRadio      = new QRadioButton( tr( "MEDFile" ), aMeshIn );
844   myInBrowserRadio      = new QRadioButton( tr( "Browser" ), aMeshIn );
845   myInBrowserObject     = new QLineEdit( aMeshIn );
846   mySelectInMedFileButton   = new QPushButton("...", aMeshIn);
847   mySelectInMedFileLineEdit = new QLineEdit( aMeshIn );
848
849   QGridLayout* meshIn = new QGridLayout( aMeshIn );
850
851   meshIn->setMargin( 9 );
852   meshIn->setSpacing( 6 );
853   meshIn->addWidget( myInMedFileRadio,          0, 0, 1, 1 );
854   meshIn->addWidget( myInBrowserRadio,          0, 1, 1, 1 );
855   meshIn->addWidget( mySelectInMedFileButton,   1, 0, 1, 1 );
856   meshIn->addWidget( mySelectInMedFileLineEdit, 1, 1, 1, 2 );
857   meshIn->addWidget( myInBrowserObject,         0, 2, 1, 1 );
858
859   myInMeshGroup = new QButtonGroup( this );
860   myInMeshGroup->addButton( myInMedFileRadio, 0 );
861   myInMeshGroup->addButton( myInBrowserRadio, 1 );
862
863   // Mesh out
864   QGroupBox* aMeshOut = new QGroupBox( tr( "MeshOut" ), this );
865   QLabel* meshName = new QLabel(tr("MeshName"), aMeshOut);
866   QSpacerItem* secondHspacer = new QSpacerItem(100, 30);
867   myOutMeshNameLineEdit = new QLineEdit(aMeshOut);
868   myOutMedFileChk = new QCheckBox(tr("MEDFile"), aMeshOut);
869   mySelectOutMedFileButton = new QPushButton("...", aMeshOut);
870   mySelectOutMedFileLineEdit = new QLineEdit(aMeshOut);
871   myOutPublishChk = new QCheckBox(tr("Publish_MG_ADAPT"), aMeshOut);
872
873   QGridLayout* meshOut = new QGridLayout( aMeshOut );
874
875   meshOut->setMargin( 9 );
876   meshOut->setSpacing( 6 );
877   meshOut->addWidget( meshName,  0, 0, 1,1 );
878   meshOut->addItem( secondHspacer,  0, 1, 1, 1 );
879   meshOut->addWidget( myOutMeshNameLineEdit, 0, 2,1,1);
880   meshOut->addWidget( myOutMedFileChk,  1, 0,1,1 );
881   meshOut->addWidget( mySelectOutMedFileButton,  1, 1,1,1 );
882   meshOut->addWidget( mySelectOutMedFileLineEdit,  1, 2,1,1);
883   meshOut->addWidget( myOutPublishChk,  2, 0,1,1 );
884
885   // Conformity type
886   QGroupBox *GBTypeConf = new QGroupBox(tr("Conformity type"), this);
887   RBConforme = new QRadioButton(tr("Conformal"), GBTypeConf);
888   RBNonConforme = new QRadioButton(tr("Non conformal"), GBTypeConf);
889   RBConforme->setChecked(true);
890
891   QHBoxLayout *hboxLayout2 = new QHBoxLayout(GBTypeConf);
892   hboxLayout2->setSpacing(6);
893   hboxLayout2->setContentsMargins(9, 9, 9, 9);
894   hboxLayout2->addWidget(RBConforme);
895   hboxLayout2->addWidget(RBNonConforme);
896
897   // Boundary type
898   GBTypeBoun = new QGroupBox(tr("Boundary type"), this);
899
900   RBBoundaryNo     = new QRadioButton(tr("No boundary"), GBTypeBoun);
901   RBBoundaryCAO    = new QRadioButton(tr("CAO"), GBTypeBoun);
902   RBBoundaryNonCAO = new QRadioButton(tr("Non CAO"), GBTypeBoun);
903   RBBoundaryNo->setChecked(true);
904
905   //     CAO
906   GBBoundaryC = new QGroupBox(tr("CAO"), GBTypeBoun);
907   QSizePolicy sizePolicy1(QSizePolicy::Fixed, QSizePolicy::Fixed);
908   sizePolicy1.setHorizontalStretch(0);
909   sizePolicy1.setVerticalStretch(0);
910   sizePolicy1.setHeightForWidth(GBBoundaryC->sizePolicy().hasHeightForWidth());
911   GBBoundaryC->setSizePolicy(sizePolicy1);
912
913   CBBoundaryCAO = new QComboBox(GBBoundaryC);
914   CBBoundaryCAO->setSizeAdjustPolicy(QComboBox::AdjustToContents);
915
916   PBBoundaryCAONew = new QPushButton(tr("New"), GBBoundaryC);
917   PBBoundaryCAOEdit = new QPushButton(tr("Edit"), GBBoundaryC);
918   PBBoundaryCAOHelp = new QPushButton(tr("Help"), GBBoundaryC);
919
920   PBBoundaryCAONew->setAutoDefault(false);
921   PBBoundaryCAOEdit->setAutoDefault(false);
922   PBBoundaryCAOHelp->setAutoDefault(false);
923
924   _2 = new QGridLayout(GBBoundaryC);
925   _2->setSpacing(6);
926   _2->setContentsMargins(9, 9, 9, 9);
927   _2->addWidget(CBBoundaryCAO, 0, 0, 1, 1);
928   QSpacerItem* spacerItem3 = new QSpacerItem(40, 13, QSizePolicy::Fixed, QSizePolicy::Minimum);
929   _2->addItem(spacerItem3, 0, 1, 1, 1);
930   _2->addWidget(PBBoundaryCAONew, 0, 2, 1, 1);
931   _2->addWidget(PBBoundaryCAOEdit, 0, 3, 1, 1);
932   _2->addWidget(PBBoundaryCAOHelp, 0, 4, 1, 1);
933
934   //     Non CAO (discrete / analytical)
935   GBBoundaryN = new QGroupBox(GBTypeBoun);
936   CBBoundaryD = new QCheckBox(tr("Discrete boundary"), GBBoundaryN);
937   CBBoundaryA = new QCheckBox(tr("Analytical boundary"), GBBoundaryN);
938
939   //hboxLayout3 = new QHBoxLayout(GBBoundaryN);
940   //hboxLayout3->setSpacing(6);
941   //hboxLayout3->setContentsMargins(0, 0, 0, 0);
942   //hboxLayout3->addWidget(CBBoundaryD);
943   //hboxLayout3->addWidget(CBBoundaryA);
944
945   //          discrete
946   GBBoundaryD = new QGroupBox(tr("Discrete boundary"), GBBoundaryN);
947   sizePolicy1.setHeightForWidth(GBBoundaryD->sizePolicy().hasHeightForWidth());
948   GBBoundaryD->setSizePolicy(sizePolicy1);
949   gridLayout = new QGridLayout(GBBoundaryD);
950   gridLayout->setSpacing(6);
951   gridLayout->setContentsMargins(9, 9, 9, 9);
952   CBBoundaryDi = new QComboBox(GBBoundaryD);
953   CBBoundaryDi->setSizeAdjustPolicy(QComboBox::AdjustToContents);
954
955   gridLayout->addWidget(CBBoundaryDi, 0, 0, 1, 1);
956
957   QSpacerItem* spacerItem5 = new QSpacerItem(40, 13, QSizePolicy::Fixed, QSizePolicy::Minimum);
958   gridLayout->addItem(spacerItem5, 0, 1, 1, 1);
959
960   PBBoundaryDiNew  = new QPushButton(tr("New"), GBBoundaryD);
961   PBBoundaryDiEdit = new QPushButton(tr("Edit"), GBBoundaryD);
962   PBBoundaryDiHelp = new QPushButton(tr("Help"), GBBoundaryD);
963
964   PBBoundaryDiNew->setAutoDefault(false);
965   PBBoundaryDiEdit->setAutoDefault(false);
966   PBBoundaryDiHelp->setAutoDefault(false);
967
968   gridLayout->addWidget(PBBoundaryDiNew,  0, 2, 1, 1);
969   gridLayout->addWidget(PBBoundaryDiEdit, 0, 3, 1, 1);
970   gridLayout->addWidget(PBBoundaryDiHelp, 0, 4, 1, 1);
971
972   //          analytical
973   GBBoundaryA = new QGroupBox(tr("Analytical boundary"), GBBoundaryN);
974   GBBoundaryA->setMinimumSize(QSize(548, 200));
975   formLayout = new QFormLayout(GBBoundaryA);
976   TWBoundary = new QTableWidget(GBBoundaryA);
977   if (TWBoundary->columnCount() < 1)
978     TWBoundary->setColumnCount(1);
979   QTableWidgetItem *__qtablewidgetitem = new QTableWidgetItem();
980   TWBoundary->setHorizontalHeaderItem(0, __qtablewidgetitem);
981   TWBoundary->setEditTriggers(QAbstractItemView::AnyKeyPressed|QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked);
982   TWBoundary->setShowGrid(true);
983   TWBoundary->setRowCount(0);
984   TWBoundary->setColumnCount(1);
985
986   formLayout->setWidget(0, QFormLayout::LabelRole, TWBoundary);
987
988   gridLayout1 = new QGridLayout();
989   gridLayout1->setSpacing(6);
990   gridLayout1->setContentsMargins(0, 0, 0, 0);
991
992   PBBoundaryAnNew  = new QPushButton(tr("New"), GBBoundaryA);
993   PBBoundaryAnEdit = new QPushButton(tr("Edit"), GBBoundaryA);
994   PBBoundaryAnHelp = new QPushButton(tr("Help"), GBBoundaryA);
995
996   PBBoundaryAnNew->setAutoDefault(false);
997   PBBoundaryAnEdit->setAutoDefault(false);
998   PBBoundaryAnHelp->setAutoDefault(false);
999
1000   gridLayout1->addWidget(PBBoundaryAnNew,  0, 0, 1, 1);
1001   gridLayout1->addWidget(PBBoundaryAnEdit, 1, 0, 1, 1);
1002   gridLayout1->addWidget(PBBoundaryAnHelp, 2, 0, 1, 1);
1003
1004   formLayout->setLayout(0, QFormLayout::FieldRole, gridLayout1);
1005
1006   // Boundary No Layout
1007   QGridLayout* aBoundaryNoLayout = new QGridLayout(GBBoundaryN);
1008   //aBoundaryNoLayout->addLayout(hboxLayout3, 0, 0);
1009   aBoundaryNoLayout->addWidget(CBBoundaryD, 0, 0);
1010   aBoundaryNoLayout->addWidget(CBBoundaryA, 0, 1);
1011   aBoundaryNoLayout->addWidget(GBBoundaryD, 1, 0, 1, 2);
1012   aBoundaryNoLayout->addWidget(GBBoundaryA, 2, 0, 1, 2);
1013
1014   // Boundary type Layout
1015   QGridLayout* aBoundTypeLayout = new QGridLayout(GBTypeBoun);
1016   aBoundTypeLayout->addWidget(RBBoundaryNo,     0, 0);
1017   aBoundTypeLayout->addWidget(RBBoundaryCAO,    0, 1);
1018   aBoundTypeLayout->addWidget(RBBoundaryNonCAO, 0, 2);
1019
1020   aBoundTypeLayout->addWidget(GBBoundaryC, 1, 0, 1, 3);
1021   aBoundTypeLayout->addWidget(GBBoundaryN, 2, 0, 1, 3);
1022
1023   // Arguments layout
1024   QGridLayout *argumentsLayout = new QGridLayout(this);
1025   argumentsLayout->addWidget(aMeshIn,     0, 0, 1, 3);
1026   argumentsLayout->addWidget(aMeshOut,    1, 0, 1, 3);
1027   argumentsLayout->addWidget(GBTypeConf,  2, 0, 1, 3);
1028   argumentsLayout->addWidget(GBTypeBoun,  3, 0, 1, 3);
1029   argumentsLayout->setColumnStretch( 1, 5 );
1030   argumentsLayout->setRowStretch( 4, 5 );
1031
1032   QTableWidgetItem *___qtablewidgetitem = TWBoundary->horizontalHeaderItem(0);
1033   ___qtablewidgetitem->setText(tr("a_virer"));
1034
1035   // Initial state
1036   myInMedFileRadio->setChecked( true );
1037   modeInChanged( MedFile );
1038   RBBoundaryNo->setChecked( true );
1039   //SetBoundaryNo();
1040
1041   myOutMedFileChk->setChecked(true);
1042   CBBoundaryCAO->setCurrentIndex(-1);
1043   CBBoundaryDi->setCurrentIndex(-1);
1044
1045   // Connections
1046   connect(myInMeshGroup,            SIGNAL(buttonClicked(int)), this, SLOT(modeInChanged(int)));
1047   connect(myOutMedFileChk,          SIGNAL(stateChanged(int)),  this, SLOT(onOutMedFileChk(int)));
1048   connect(myOutPublishChk,          SIGNAL(stateChanged(int)),  this, SLOT(onOutPublishChk(int)));
1049   connect(mySelectOutMedFileButton, SIGNAL(pressed()), this, SLOT(onSelectOutMedFileButton()));
1050   emit updateSelection();
1051 }
1052
1053 void SMESHGUI_HomardAdaptArguments::modeInChanged( int theMode )
1054 {
1055   clear();
1056   if (theMode == MedFile) {
1057     mySelectInMedFileLineEdit->show();
1058     mySelectInMedFileButton->show();
1059     myInBrowserObject->hide();
1060   }
1061   else {
1062     mySelectInMedFileLineEdit->hide();
1063     mySelectInMedFileButton->hide();
1064     myInBrowserObject->show();
1065     emit updateSelection();
1066   }
1067 }
1068
1069 void SMESHGUI_HomardAdaptArguments::onSelectOutMedFileButton()
1070 {
1071   // Current value
1072   QString fileName0 = mySelectOutMedFileLineEdit->text().trimmed();
1073
1074   // Ask user for the new value
1075   QString filtre = QString("Med");
1076   filtre += QString(" files (*.") + QString("med") + QString(");;");
1077   QString fileName = QFileDialog::getSaveFileName(this, tr("SAVE_MED"), QString(""), filtre);
1078
1079   // Check the new value
1080   if (fileName.isEmpty()) fileName = fileName0;
1081
1082   QFileInfo aFileInfo (fileName);
1083   mySelectOutMedFileLineEdit->setText(aFileInfo.absoluteFilePath());
1084 }
1085
1086 void SMESHGUI_HomardAdaptArguments::clear()
1087 {
1088   mySelectInMedFileLineEdit->clear();
1089   myInBrowserObject->clear();
1090
1091   myOutMeshNameLineEdit->clear();
1092   mySelectOutMedFileLineEdit->clear();
1093 }
1094
1095 void SMESHGUI_HomardAdaptArguments::onOutMedFileChk(int state)
1096 {
1097   if (state == Qt::Checked) {
1098     mySelectOutMedFileButton->show();
1099     mySelectOutMedFileLineEdit->show();
1100     mySelectOutMedFileButton->setEnabled(true);
1101     mySelectOutMedFileLineEdit->setEnabled(true);
1102   }
1103   else {
1104     mySelectOutMedFileButton->setEnabled(false);
1105     mySelectOutMedFileLineEdit->setEnabled(false);
1106     myOutPublishChk->setChecked(true);
1107   }
1108 }
1109
1110 void SMESHGUI_HomardAdaptArguments::onOutPublishChk(int state)
1111 {
1112   if (state == Qt::Unchecked) {
1113     myOutMedFileChk->setChecked(true);
1114   }
1115 }
1116
1117 //////////////////////////////////////////
1118 // SMESHGUI_HomardAdaptAdvanced
1119 //////////////////////////////////////////
1120
1121 SMESHGUI_HomardAdaptAdvanced::SMESHGUI_HomardAdaptAdvanced(QWidget* parent)
1122   : QWidget(parent)
1123 {
1124   setupWidget();
1125   connect(workingDirectoryPushButton, SIGNAL(pressed()),
1126           this, SLOT(onWorkingDirectoryPushButton()));
1127 }
1128
1129 SMESHGUI_HomardAdaptAdvanced::~SMESHGUI_HomardAdaptAdvanced()
1130 {
1131 }
1132
1133 void SMESHGUI_HomardAdaptAdvanced::setupWidget()
1134 {
1135   //this->resize(337, 369);
1136
1137   // Logs and debug
1138   logGroupBox = new QGroupBox(this);
1139   QGridLayout* logGroupBoxLayout = new QGridLayout(this);
1140   logGroupBoxLayout->setMargin( 9 );
1141   logGroupBoxLayout->setSpacing( 6 );
1142   logGroupBoxLayout->addWidget(logGroupBox, 0, 0, 1, 1);
1143
1144   QGridLayout* logsLayout = new QGridLayout(logGroupBox);
1145   logsLayout->setMargin( 9 );
1146   logsLayout->setSpacing( 6 );
1147
1148   // Working directory + Verbose level layout
1149   QGridLayout* gridLayout = new QGridLayout();
1150
1151   // Working directory
1152   workingDirectoryLabel = new QLabel(logGroupBox);
1153   workingDirectoryLineEdit = new QLineEdit(logGroupBox);
1154   workingDirectoryPushButton = new QPushButton(logGroupBox);
1155
1156   gridLayout->addWidget(workingDirectoryLabel,      0, 0, 1, 1);
1157   gridLayout->addWidget(workingDirectoryLineEdit,   0, 1, 1, 1);
1158   gridLayout->addWidget(workingDirectoryPushButton, 0, 2, 1, 1);
1159
1160   // Verbose level
1161   verboseLevelLabel = new QLabel(logGroupBox);
1162   verboseLevelSpin = new QSpinBox(logGroupBox);
1163
1164   gridLayout->addWidget(verboseLevelLabel, 1, 0, 1, 1);
1165   gridLayout->addWidget(verboseLevelSpin,  1, 1, 1, 1);
1166
1167   logsLayout->addLayout(gridLayout, 0, 0, 1, 1);
1168
1169   // logInFileCheck + removeLogOnSuccessCheck
1170   QHBoxLayout* horizontalLayout = new QHBoxLayout();
1171
1172   logInFileCheck = new QCheckBox(logGroupBox);
1173   removeLogOnSuccessCheck = new QCheckBox(logGroupBox);
1174
1175   logInFileCheck->setChecked(true);
1176   removeLogOnSuccessCheck->setChecked(true);
1177
1178   horizontalLayout->addWidget(logInFileCheck);
1179   horizontalLayout->addWidget(removeLogOnSuccessCheck);
1180
1181   logsLayout->addLayout(horizontalLayout, 1, 0, 1, 1);
1182
1183   // Keep Working Files Check
1184   keepWorkingFilesCheck = new QCheckBox(logGroupBox);
1185   keepWorkingFilesCheck->setAutoExclusive(false);
1186   keepWorkingFilesCheck->setChecked(false);
1187
1188   logsLayout->addWidget(keepWorkingFilesCheck, 2, 0, 1, 1);
1189
1190   //logsLayout->setColumnStretch( 1, 5 );
1191   //logsLayout->setRowStretch( 3, 5 );
1192 }
1193
1194 void SMESHGUI_HomardAdaptAdvanced::onWorkingDirectoryPushButton()
1195 {
1196   QString aWorkingDir = QFileDialog::getExistingDirectory();
1197   if (!(aWorkingDir.isEmpty())) workingDirectoryLineEdit->setText(aWorkingDir);
1198 }