]> SALOME platform Git repositories - modules/homard.git/blob - src/HOMARDGUI/MonCreateCase.cxx
Salome HOME
Correction schema YCAS pour une frontière discrète.
[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   char* LanguageShort = myHomardGen->GetLanguageShort();
309   HOMARD_UTILS::PushOnHelp(QString("gui_create_case.html"), QString(""), QString(LanguageShort));
310 }
311 // ---------------------------------
312 void MonCreateCase::SetNewName()
313 // ------------------------------
314 {
315   HOMARD::listeCases_var  MyCases = myHomardGen->GetAllCasesName();
316   int num = 0; QString aCaseName="";
317   while (aCaseName=="" )
318   {
319     aCaseName.setNum(num+1) ;
320     aCaseName.insert(0, QString("Case_")) ;
321     for ( int i=0; i<MyCases->length(); i++)
322     {
323       if ( aCaseName ==  QString((MyCases)[i]))
324       {
325           num=num+1;
326           aCaseName="";
327           break;
328       }
329    }
330   }
331   LEName->clear() ;
332   LEName->insert(aCaseName);
333 }
334
335 // ------------------------------------------------------------------------
336 void MonCreateCase::SetDirName()
337 // ------------------------------------------------------------------------
338 {
339   QString aDirName=QFileDialog::getExistingDirectory ();
340   if (!(aDirName.isEmpty()))LEDirName->setText(aDirName);
341 }
342 // ------------------------------------------------------------------------
343 void MonCreateCase::SetFileName()
344 // ------------------------------------------------------------------------
345 {
346   QString fileName0 = LEFileName->text().trimmed();
347   QString fileName = HOMARD_QT_COMMUN::PushNomFichier();
348   if (fileName.isEmpty()) fileName = fileName0 ;
349   LEFileName->setText(fileName);
350 }
351 // ------------------------------------------------------------------------
352 void MonCreateCase::SetConforme()
353 // ------------------------------------------------------------------------
354 {
355   GBTypeNoConf->setVisible(0);
356   adjustSize();
357   _ConfType=1;
358 }
359 // ------------------------------------------------------------------------
360 void MonCreateCase::SetNonConforme()
361 // ------------------------------------------------------------------------
362 {
363   GBTypeNoConf->setVisible(1);
364   RB1NpM->setChecked(true);
365   adjustSize();
366   _ConfType=2;
367 }
368 // ------------------------------------------------------------------------
369 void MonCreateCase::Set1NpM()
370 // ------------------------------------------------------------------------
371 {
372   _ConfType=2;
373 }
374 // ------------------------------------------------------------------------
375 void MonCreateCase::Set1NpA()
376 // ------------------------------------------------------------------------
377 {
378   _ConfType=3;
379 }
380 // ------------------------------------------------------------------------
381 void MonCreateCase::SetQuelconque()
382 // ------------------------------------------------------------------------
383 {
384   _ConfType=4;
385 }
386 // ------------------------------------------------------------------------
387 void MonCreateCase::SetBoundaryD()
388 // ------------------------------------------------------------------------
389 {
390   MESSAGE("Debut de SetBoundaryD ");
391   if (CBBoundaryD->isChecked())
392   {
393     bool bOK = PushOnApply();
394     if (bOK) { GBBoundaryD->setVisible(1); }
395     else     { GBBoundaryD->setVisible(0);
396                CBBoundaryD->setChecked(0);
397                CBBoundaryD->setCheckState(Qt::Unchecked); }
398   }
399   else { GBBoundaryD->setVisible(0); }
400   adjustSize();
401 }
402 // ------------------------------------------------------------------------
403 void MonCreateCase::AddBoundaryDi(QString newBoundary)
404 // ------------------------------------------------------------------------
405 {
406   CBBoundaryDi->insertItem(0,newBoundary);
407   CBBoundaryDi->setCurrentIndex(0);
408 }
409 // ------------------------------------------------------------------------
410 void MonCreateCase::PushBoundaryDiNew()
411 // ------------------------------------------------------------------------
412 {
413    MonCreateBoundaryDi *BoundaryDlg = new MonCreateBoundaryDi(this, true,
414                 HOMARD::HOMARD_Gen::_duplicate(myHomardGen), _aCaseName, "") ;
415    BoundaryDlg->show();
416 }
417 // ------------------------------------------------------------------------
418 void MonCreateCase::PushBoundaryDiEdit()
419 // ------------------------------------------------------------------------
420 {
421   if (CBBoundaryDi->currentText() == QString(""))  return;
422   MonEditBoundaryDi *BoundaryDlg = new MonEditBoundaryDi(this, true,
423        HOMARD::HOMARD_Gen::_duplicate(myHomardGen), _aCaseName, CBBoundaryDi->currentText() ) ;
424   BoundaryDlg->show();
425 }
426 // ------------------------------------------------------------------------
427 void MonCreateCase::PushBoundaryDiHelp()
428 // ------------------------------------------------------------------------
429 {
430   char* LanguageShort = myHomardGen->GetLanguageShort();
431   HOMARD_UTILS::PushOnHelp(QString("gui_create_boundary.html"), QString("frontiere-discrete"), QString(LanguageShort));
432 }
433 // ------------------------------------------------------------------------
434 void MonCreateCase::SetBoundaryA()
435 // ------------------------------------------------------------------------
436 {
437   MESSAGE("Debut de SetBoundaryA ");
438   if (CBBoundaryA->isChecked())
439   {
440     bool bOK = PushOnApply();
441     if (bOK) { GBBoundaryA->setVisible(1); }
442     else     { GBBoundaryA->setVisible(0);
443                CBBoundaryA->setChecked(0);
444                CBBoundaryA->setCheckState(Qt::Unchecked); }
445   }
446   else { GBBoundaryA->setVisible(0); }
447   adjustSize();
448 //
449 //   MESSAGE("Fin de SetBoundaryA ");
450 }
451 // ------------------------------------------------------------------------
452 void MonCreateCase::AddBoundaryAn(QString newBoundary)
453 // ------------------------------------------------------------------------
454 {
455   MESSAGE("Debut de AddBoundaryAn ");
456 // Ajout d'une nouvelle colonne
457   int nbcol = TWBoundary->columnCount();
458 //   MESSAGE("nbcol " <<  nbcol);
459   nbcol += 1 ;
460   TWBoundary->setColumnCount ( nbcol ) ;
461   QTableWidgetItem *__colItem = new QTableWidgetItem();
462   __colItem->setText(QApplication::translate("CreateCase", newBoundary.toStdString().c_str(), 0, QApplication::UnicodeUTF8));
463   TWBoundary->setHorizontalHeaderItem(nbcol-1, __colItem);
464 /*  TWBoundary->horizontalHeaderItem(nbcol-1)->setFlags( Qt::ItemIsSelectable|Qt::ItemIsEnabled );*/
465 // Chaque case est a cocher
466   int nbrow = TWBoundary->rowCount();
467 //   MESSAGE("nbrow " <<  nbrow);
468   for ( int i = 0; i < nbrow; i++ )
469   {
470     TWBoundary->setItem( i, nbcol-1, new QTableWidgetItem( QString ("") ) );
471     TWBoundary->item( i, nbcol-1 )->setFlags( 0 );
472     TWBoundary->item( i, nbcol-1 )->setFlags( Qt::ItemIsUserCheckable|Qt::ItemIsEnabled  );
473     TWBoundary->item( i, nbcol-1 )->setCheckState( Qt::Unchecked );
474   }
475   TWBoundary->resizeColumnToContents(nbcol-1);
476 //   TWBoundary->resizeRowsToContents();
477 //   MESSAGE("Fin de AddBoundaryAn ");
478 }
479 // ------------------------------------------------------------------------
480 void MonCreateCase::PushBoundaryAnNew()
481 // ------------------------------------------------------------------------
482 {
483    MonCreateBoundaryAn *BoundaryDlg = new MonCreateBoundaryAn(this, true,
484                 HOMARD::HOMARD_Gen::_duplicate(myHomardGen), _aCaseName) ;
485    BoundaryDlg->show();
486 }
487 // ------------------------------------------------------------------------
488 void MonCreateCase::PushBoundaryAnEdit()
489 // ------------------------------------------------------------------------
490 {
491   QString nom="";
492   int nbcol = TWBoundary->columnCount();
493   for ( int i = 1; i < nbcol; i++ )
494   {
495     QTableWidgetItem *__colItem = new QTableWidgetItem();
496     __colItem = TWBoundary->horizontalHeaderItem(i);
497     nom = QString(__colItem->text()) ;
498     MESSAGE("nom "<<nom.toStdString().c_str());
499     if (nom != QString(""))
500     { MonEditBoundaryAn *BoundaryDlg = new MonEditBoundaryAn(this, true,
501         HOMARD::HOMARD_Gen::_duplicate(myHomardGen), _aCaseName, nom ) ;
502       BoundaryDlg->show(); }
503   }
504 }
505 // ------------------------------------------------------------------------
506 void MonCreateCase::PushBoundaryAnHelp()
507 // ------------------------------------------------------------------------
508 {
509   char* LanguageShort = myHomardGen->GetLanguageShort();
510   HOMARD_UTILS::PushOnHelp(QString("gui_create_boundary.html"), QString("frontiere-analytique"), QString(LanguageShort));
511 }
512 // ------------------------------------------------------------------------
513 void MonCreateCase::CaseNameChanged()
514 // ------------------------------------------------------------------------
515 {
516     if (_aCaseName != LEName->text().trimmed())
517     {
518        LEFileName->setReadOnly(false);
519        PushFichier->show();
520     }
521 }
522 // ------------------------------------------------------------------------
523 void MonCreateCase::SetAdvanced()
524 // ------------------------------------------------------------------------
525 {
526   MESSAGE("Debut de SetAdvanced ");
527   if (CBAdvanced->isChecked()) { GBAdvancedOptions->setVisible(1); }
528   else
529   { GBAdvancedOptions->setVisible(0);
530     CBPyramid->setChecked(false);
531     _Pyram = 0 ;
532  }
533   adjustSize();
534 }