Salome HOME
Schémas YACS - suite
[modules/homard.git] / src / HOMARDGUI / MonCreateCase.cxx
1 // Copyright (C) 2011-2013  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.
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 using namespace std;
21
22 #include "MonCreateCase.h"
23 #include "MonCreateBoundaryAn.h"
24 #include "MonEditBoundaryAn.h"
25 #include "MonCreateBoundaryDi.h"
26 #include "MonEditBoundaryDi.h"
27
28 #include <QFileDialog>
29 #include <QMessageBox>
30
31 #include "SalomeApp_Tools.h"
32 #include "HOMARDGUI_Utils.h"
33 #include "HomardQtCommun.h"
34 #include <utilities.h>
35
36
37 // -----------------------------------------------------------------------------------------
38 /* Constructs a MonCreateCase
39  * Inherits from CasHomard
40  * Sets attributes to default values
41  */
42 // -----------------------------------------------------------------------------------------
43 MonCreateCase::MonCreateCase( bool modal, HOMARD::HOMARD_Gen_var myHomardGen0)
44     :
45     Ui_CreateCase(),
46     _aCaseName(""),_aDirName(""),
47     _ConfType(1),
48     _Pyram(0)
49 {
50   MESSAGE("Debut du constructeur de MonCreateCase");
51   myHomardGen=HOMARD::HOMARD_Gen::_duplicate(myHomardGen0);
52   setupUi(this);
53   setModal(modal);
54   InitConnect();
55
56   SetNewName() ;
57   GBBoundaryA->setVisible(0);
58   GBBoundaryD->setVisible(0);
59   GBTypeNoConf->setVisible(0);
60   GBAdvancedOptions->setVisible(0);
61   Comment->setVisible(0);
62   CBPyramid->setChecked(false);
63
64   adjustSize();
65   MESSAGE("Fin du constructeur de MonCreateCase");
66 }
67 // ------------------------------------------------------------------------
68 MonCreateCase::~MonCreateCase()
69 // ------------------------------------------------------------------------
70 {
71     // no need to delete child widgets, Qt does it all for us
72 }
73 // ------------------------------------------------------------------------
74 void MonCreateCase::InitConnect()
75 // ------------------------------------------------------------------------
76 {
77     connect( LEName,     SIGNAL(textChanged(QString)), this, SLOT(CaseNameChanged()));
78     connect( PushDir,        SIGNAL(pressed()), this, SLOT(SetDirName()));
79     connect( PushFichier,    SIGNAL(pressed()), this, SLOT(SetFileName()));
80
81     connect( RBConforme,     SIGNAL(clicked()), this, SLOT(SetConforme()));
82     connect( RBNonConforme,  SIGNAL(clicked()), this, SLOT(SetNonConforme()));
83     connect( RB1NpM,         SIGNAL(clicked()), this, SLOT(Set1NpM()));
84     connect( RB1NpA,         SIGNAL(clicked()), this, SLOT(Set1NpA()));
85     connect( RBQuelconque,   SIGNAL(clicked()), this, SLOT(SetQuelconque()));
86
87     connect( CBBoundaryD,      SIGNAL(stateChanged(int)), this, SLOT(SetBoundaryD()));
88     connect( PBBoundaryDiNew,  SIGNAL(pressed()), this, SLOT(PushBoundaryDiNew()));
89     connect( PBBoundaryDiEdit, SIGNAL(pressed()), this, SLOT(PushBoundaryDiEdit()) );
90     connect( PBBoundaryDiHelp, SIGNAL(pressed()), this, SLOT(PushBoundaryDiHelp()) );
91     connect( CBBoundaryA,      SIGNAL(stateChanged(int)), this, SLOT(SetBoundaryA()));
92     connect( PBBoundaryAnNew,  SIGNAL(pressed()), this, SLOT(PushBoundaryAnNew()));
93     connect( PBBoundaryAnEdit, SIGNAL(pressed()), this, SLOT(PushBoundaryAnEdit()) );
94     connect( PBBoundaryAnHelp, SIGNAL(pressed()), this, SLOT(PushBoundaryAnHelp()) );
95
96     connect( CBAdvanced,     SIGNAL(stateChanged(int)), this, SLOT(SetAdvanced()));
97
98     connect( buttonOk,       SIGNAL(pressed()), this, SLOT(PushOnOK()));
99     connect( buttonApply,    SIGNAL(pressed()), this, SLOT(PushOnApply()));
100     connect( buttonCancel,   SIGNAL(pressed()), this, SLOT(close()));
101     connect( buttonHelp,     SIGNAL(pressed()), this, SLOT(PushOnHelp()));
102 }
103 // ------------------------------------------------------------------------
104 void MonCreateCase::InitBoundarys()
105 // ------------------------------------------------------------------------
106 // Initialisation des menus avec les frontieres deja enregistrees
107 {
108   MESSAGE("InitBoundarys");
109 // Pour les frontieres analytiques : la colonne des groupes
110   HOMARD::ListGroupType_var _listeGroupesCas = aCase->GetGroups();
111   QTableWidgetItem *__colItem = new QTableWidgetItem();
112   __colItem->setText(QApplication::translate("CreateCase", "", 0, QApplication::UnicodeUTF8));
113   TWBoundary->setHorizontalHeaderItem(0, __colItem);
114   for ( int i = 0; i < _listeGroupesCas->length(); i++ )
115   {
116     TWBoundary->insertRow(i);
117     TWBoundary->setItem( i, 0, new QTableWidgetItem(QString((_listeGroupesCas)[i]).trimmed()));
118     TWBoundary->item( i, 0 )->setFlags(Qt::ItemIsEnabled |Qt::ItemIsSelectable );
119   }
120 // Pour les frontieres discretes : la liste a saisir
121 // Pour les frontieres analytiques : les colonnes de chaque frontiere
122   HOMARD::HOMARD_Boundary_var myBoundary ;
123   HOMARD::listeBoundarys_var  mesBoundarys = myHomardGen->GetAllBoundarysName();
124 //   MESSAGE("Nombre de frontieres enregistrees : "<<mesBoundarys->length());
125   for (int i=0; i<mesBoundarys->length(); i++)
126   {
127     myBoundary = myHomardGen->GetBoundary(mesBoundarys[i]);
128     int type_obj = myBoundary->GetType() ;
129     if ( type_obj==0 ) { CBBoundaryDi->addItem(QString(mesBoundarys[i])); }
130     else               { AddBoundaryAn(QString(mesBoundarys[i])); }
131   }
132 // Ajustement
133   TWBoundary->resizeColumnsToContents();
134   TWBoundary->resizeRowsToContents();
135   TWBoundary->clearSelection();
136 }
137 // -------------------------------
138 bool MonCreateCase::PushOnApply()
139 // --------------------------------
140 {
141   MESSAGE("PushOnApply");
142   QString aCaseName=LEName->text().trimmed();
143   if ( aCaseName == "" )
144   {
145     QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
146                               QObject::tr("HOM_CASE_NAME") );
147     return false;
148   }
149
150   QString aDirName=LEDirName->text().trimmed();
151   if (aDirName == QString(""))
152   {
153     QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
154                               QObject::tr("HOM_CASE_DIRECTORY_1") );
155     return false;
156   }
157   if ((aDirName != _aDirName) and (myHomardGen->VerifieDir( aDirName.toStdString().c_str()) == false))
158   {
159     QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
160                               QObject::tr("HOM_CASE_DIRECTORY_2") );
161     return false;
162   }
163   if (chdir(aDirName.toStdString().c_str()) != 0)
164   {
165     QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
166                               QObject::tr("HOM_CASE_DIRECTORY_3") );
167     return false;
168   }
169
170   QString aFileName=LEFileName->text().trimmed();
171   if (aFileName ==QString(""))
172   {
173     QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
174                               QObject::tr("HOM_CASE_MESH") );
175     return false;
176   }
177
178   QString aMeshName = HOMARD_QT_COMMUN::LireNomMaillage(aFileName);
179   if (aMeshName == "" )
180   {
181     QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
182                               QObject::tr("HOM_MED_FILE_2") );
183     return false;
184   }
185
186   if (CBBoundaryA->isChecked())
187   {
188     QStringList ListeGroup ;
189     QString NomGroup ;
190     int nbcol = TWBoundary->columnCount();
191     int nbrow = TWBoundary->rowCount();
192     for ( int col=1; col< nbcol; col++)
193     {
194       for ( int row=0; row< nbrow; row++)
195       {
196         if ( TWBoundary->item( row, col )->checkState() ==  Qt::Checked )
197         {
198 //        Nom du groupe
199           NomGroup = QString(TWBoundary->item(row, 0)->text()) ;
200 //           MESSAGE("NomGroup "<<NomGroup.toStdString().c_str());
201           for ( int nugr = 0 ; nugr<ListeGroup.size(); nugr++)
202           {
203 //             MESSAGE("....... "<<ListeGroup[nugr].toStdString().c_str());
204             if ( NomGroup == ListeGroup[nugr] )
205             {
206               QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
207                                         QObject::tr("HOM_CASE_GROUP").arg(NomGroup) );
208               return false;
209             }
210           }
211           ListeGroup.insert(0, NomGroup );
212         }
213       }
214     }
215   }
216
217   if (aCaseName != _aCaseName )
218   {
219     _aCaseName = aCaseName;
220     try
221     {
222     aCase = myHomardGen->CreateCase( \
223             CORBA::string_dup(_aCaseName.toStdString().c_str()),  \
224             CORBA::string_dup(aMeshName.toStdString().c_str()),  \
225             CORBA::string_dup(aFileName.toStdString().c_str()) );
226     }
227     catch( SALOME::SALOME_Exception& S_ex )
228     {
229       QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
230                                 QObject::tr(CORBA::string_dup(S_ex.details.text)) );
231       try
232       {
233           aCase = myHomardGen->GetCase(_aCaseName.toStdString().c_str());
234           string iter0 = aCase->GetIter0Name();
235           HOMARD::HOMARD_Iteration_var aIter =  myHomardGen->GetIteration(iter0.c_str());
236           QString aFileName = aIter->GetMeshFile();
237           LEFileName->setText(aFileName);
238           LEFileName->setReadOnly(true);
239           PushFichier->hide();
240       }
241       catch( SALOME::SALOME_Exception& S_ex )  {};
242       return false;
243     }
244     LEFileName->setReadOnly(true);
245     PushFichier->hide();
246     InitBoundarys();
247   }
248
249   aCase->SetDirName(aDirName.toStdString().c_str());
250   _aDirName=aDirName;
251   aCase->SetConfType(_ConfType);
252
253 // Enregistrement de la frontiere discrete
254   if (CBBoundaryD->isChecked())
255   {
256     QString monBoundaryDiName=CBBoundaryDi->currentText();
257     if (monBoundaryDiName != "" )
258     {
259       aCase->AddBoundaryGroup(monBoundaryDiName.toStdString().c_str(), "");
260     }
261   }
262
263 // Enregistrement des liens (groupe,frontiere analytique)
264   if (CBBoundaryA->isChecked())
265   {
266     QString NomGroup ;
267     int nbcol = TWBoundary->columnCount();
268     int nbrow = TWBoundary->rowCount();
269     for ( int col=1; col< nbcol; col++)
270     {
271       for ( int row=0; row< nbrow; row++)
272       {
273         if ( TWBoundary->item( row, col )->checkState() ==  Qt::Checked )
274         {
275 //        Nom du groupe
276           NomGroup = QString(TWBoundary->item(row, 0)->text()) ;
277 //        Nom de la frontiere
278           QTableWidgetItem *__colItem = new QTableWidgetItem();
279           __colItem = TWBoundary->horizontalHeaderItem(col);
280           aCase->AddBoundaryGroup(QString(__colItem->text()).toStdString().c_str(), NomGroup.toStdString().c_str());
281         }
282       }
283     }
284   }
285
286 // Options avancees
287   if (CBAdvanced->isChecked())
288   {
289 // Autorisation des pyramides
290     if (CBPyramid->isChecked()) { _Pyram = 1 ; }
291   }
292
293   HOMARD_UTILS::updateObjBrowser();
294
295   return true;
296 }
297 // ---------------------------
298 void MonCreateCase::PushOnOK()
299 // ---------------------------
300 {
301   bool bOK = PushOnApply();
302   if ( bOK ) this->close();
303 }
304 //------------------------------
305 void MonCreateCase::PushOnHelp()
306 //-------------------------------
307 {
308   HOMARD_UTILS::PushOnHelp(QString("gui_create_case.html"), QString(""));
309 }
310 // ---------------------------------
311 void MonCreateCase::SetNewName()
312 // ------------------------------
313 {
314   HOMARD::listeCases_var  MyCases = myHomardGen->GetAllCasesName();
315   int num = 0; QString aCaseName="";
316   while (aCaseName=="" )
317   {
318     aCaseName.setNum(num+1) ;
319     aCaseName.insert(0, QString("Case_")) ;
320     for ( int i=0; i<MyCases->length(); i++)
321     {
322       if ( aCaseName ==  QString((MyCases)[i]))
323       {
324           num=num+1;
325           aCaseName="";
326           break;
327       }
328    }
329   }
330   LEName->clear() ;
331   LEName->insert(aCaseName);
332 }
333
334 // ------------------------------------------------------------------------
335 void MonCreateCase::SetDirName()
336 // ------------------------------------------------------------------------
337 {
338   QString aDirName=QFileDialog::getExistingDirectory ();
339   if (!(aDirName.isEmpty()))LEDirName->setText(aDirName);
340 }
341 // ------------------------------------------------------------------------
342 void MonCreateCase::SetFileName()
343 // ------------------------------------------------------------------------
344 {
345   QString fileName0 = LEFileName->text().trimmed();
346   QString fileName = HOMARD_QT_COMMUN::PushNomFichier();
347   if (fileName.isEmpty()) fileName = fileName0 ;
348   LEFileName->setText(fileName);
349 }
350 // ------------------------------------------------------------------------
351 void MonCreateCase::SetConforme()
352 // ------------------------------------------------------------------------
353 {
354   GBTypeNoConf->setVisible(0);
355   adjustSize();
356   _ConfType=1;
357 }
358 // ------------------------------------------------------------------------
359 void MonCreateCase::SetNonConforme()
360 // ------------------------------------------------------------------------
361 {
362   GBTypeNoConf->setVisible(1);
363   RB1NpM->setChecked(true);
364   adjustSize();
365   _ConfType=2;
366 }
367 // ------------------------------------------------------------------------
368 void MonCreateCase::Set1NpM()
369 // ------------------------------------------------------------------------
370 {
371   _ConfType=2;
372 }
373 // ------------------------------------------------------------------------
374 void MonCreateCase::Set1NpA()
375 // ------------------------------------------------------------------------
376 {
377   _ConfType=3;
378 }
379 // ------------------------------------------------------------------------
380 void MonCreateCase::SetQuelconque()
381 // ------------------------------------------------------------------------
382 {
383   _ConfType=4;
384 }
385 // ------------------------------------------------------------------------
386 void MonCreateCase::SetBoundaryD()
387 // ------------------------------------------------------------------------
388 {
389   MESSAGE("Debut de SetBoundaryD ");
390   if (CBBoundaryD->isChecked())
391   {
392     bool bOK = PushOnApply();
393     if (bOK) { GBBoundaryD->setVisible(1); }
394     else     { GBBoundaryD->setVisible(0);
395                CBBoundaryD->setChecked(0);
396                CBBoundaryD->setCheckState(Qt::Unchecked); }
397   }
398   else { GBBoundaryD->setVisible(0); }
399   adjustSize();
400 }
401 // ------------------------------------------------------------------------
402 void MonCreateCase::AddBoundaryDi(QString newBoundary)
403 // ------------------------------------------------------------------------
404 {
405   CBBoundaryDi->insertItem(0,newBoundary);
406   CBBoundaryDi->setCurrentIndex(0);
407 }
408 // ------------------------------------------------------------------------
409 void MonCreateCase::PushBoundaryDiNew()
410 // ------------------------------------------------------------------------
411 {
412    MonCreateBoundaryDi *BoundaryDlg = new MonCreateBoundaryDi(this, true,
413                 HOMARD::HOMARD_Gen::_duplicate(myHomardGen), _aCaseName, "") ;
414    BoundaryDlg->show();
415 }
416 // ------------------------------------------------------------------------
417 void MonCreateCase::PushBoundaryDiEdit()
418 // ------------------------------------------------------------------------
419 {
420   if (CBBoundaryDi->currentText() == QString(""))  return;
421   MonEditBoundaryDi *BoundaryDlg = new MonEditBoundaryDi(this, true,
422        HOMARD::HOMARD_Gen::_duplicate(myHomardGen), _aCaseName, CBBoundaryDi->currentText() ) ;
423   BoundaryDlg->show();
424 }
425 // ------------------------------------------------------------------------
426 void MonCreateCase::PushBoundaryDiHelp()
427 // ------------------------------------------------------------------------
428 {
429   HOMARD_UTILS::PushOnHelp(QString("gui_create_boundary.html"), QString("frontiere-discrete") ) ;
430 }
431 // ------------------------------------------------------------------------
432 void MonCreateCase::SetBoundaryA()
433 // ------------------------------------------------------------------------
434 {
435   MESSAGE("Debut de SetBoundaryA ");
436   if (CBBoundaryA->isChecked())
437   {
438     bool bOK = PushOnApply();
439     if (bOK) { GBBoundaryA->setVisible(1); }
440     else     { GBBoundaryA->setVisible(0);
441                CBBoundaryA->setChecked(0);
442                CBBoundaryA->setCheckState(Qt::Unchecked); }
443   }
444   else { GBBoundaryA->setVisible(0); }
445   adjustSize();
446 //
447 //   MESSAGE("Fin de SetBoundaryA ");
448 }
449 // ------------------------------------------------------------------------
450 void MonCreateCase::AddBoundaryAn(QString newBoundary)
451 // ------------------------------------------------------------------------
452 {
453   MESSAGE("Debut de AddBoundaryAn ");
454 // Ajout d'une nouvelle colonne
455   int nbcol = TWBoundary->columnCount();
456 //   MESSAGE("nbcol " <<  nbcol);
457   nbcol += 1 ;
458   TWBoundary->setColumnCount ( nbcol ) ;
459   QTableWidgetItem *__colItem = new QTableWidgetItem();
460   __colItem->setText(QApplication::translate("CreateCase", newBoundary.toStdString().c_str(), 0, QApplication::UnicodeUTF8));
461   TWBoundary->setHorizontalHeaderItem(nbcol-1, __colItem);
462 /*  TWBoundary->horizontalHeaderItem(nbcol-1)->setFlags( Qt::ItemIsSelectable|Qt::ItemIsEnabled );*/
463 // Chaque case est a cocher
464   int nbrow = TWBoundary->rowCount();
465 //   MESSAGE("nbrow " <<  nbrow);
466   for ( int i = 0; i < nbrow; i++ )
467   {
468     TWBoundary->setItem( i, nbcol-1, new QTableWidgetItem( QString ("") ) );
469     TWBoundary->item( i, nbcol-1 )->setFlags( 0 );
470     TWBoundary->item( i, nbcol-1 )->setFlags( Qt::ItemIsUserCheckable|Qt::ItemIsEnabled  );
471     TWBoundary->item( i, nbcol-1 )->setCheckState( Qt::Unchecked );
472   }
473   TWBoundary->resizeColumnToContents(nbcol-1);
474 //   TWBoundary->resizeRowsToContents();
475 //   MESSAGE("Fin de AddBoundaryAn ");
476 }
477 // ------------------------------------------------------------------------
478 void MonCreateCase::PushBoundaryAnNew()
479 // ------------------------------------------------------------------------
480 {
481    MonCreateBoundaryAn *BoundaryDlg = new MonCreateBoundaryAn(this, true,
482                 HOMARD::HOMARD_Gen::_duplicate(myHomardGen), _aCaseName) ;
483    BoundaryDlg->show();
484 }
485 // ------------------------------------------------------------------------
486 void MonCreateCase::PushBoundaryAnEdit()
487 // ------------------------------------------------------------------------
488 {
489   QString nom="";
490   int nbcol = TWBoundary->columnCount();
491   for ( int i = 1; i < nbcol; i++ )
492   {
493     QTableWidgetItem *__colItem = new QTableWidgetItem();
494     __colItem = TWBoundary->horizontalHeaderItem(i);
495     nom = QString(__colItem->text()) ;
496     MESSAGE("nom "<<nom.toStdString().c_str());
497     if (nom != QString(""))
498     { MonEditBoundaryAn *BoundaryDlg = new MonEditBoundaryAn(this, true,
499         HOMARD::HOMARD_Gen::_duplicate(myHomardGen), _aCaseName, nom ) ;
500       BoundaryDlg->show(); }
501   }
502 }
503 // ------------------------------------------------------------------------
504 void MonCreateCase::PushBoundaryAnHelp()
505 // ------------------------------------------------------------------------
506 {
507   HOMARD_UTILS::PushOnHelp(QString("gui_create_boundary.html"), QString("frontiere-analytique") ) ;
508 }
509 // ------------------------------------------------------------------------
510 void MonCreateCase::CaseNameChanged()
511 // ------------------------------------------------------------------------
512 {
513     if (_aCaseName != LEName->text().trimmed())
514     {
515        LEFileName->setReadOnly(false);
516        PushFichier->show();
517     }
518 }
519 // ------------------------------------------------------------------------
520 void MonCreateCase::SetAdvanced()
521 // ------------------------------------------------------------------------
522 {
523   MESSAGE("Debut de SetAdvanced ");
524   if (CBAdvanced->isChecked()) { GBAdvancedOptions->setVisible(1); }
525   else
526   { GBAdvancedOptions->setVisible(0);
527     CBPyramid->setChecked(false);
528     _Pyram = 0 ;
529  }
530   adjustSize();
531 }