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