Salome HOME
Correction schema YCAS pour une frontière discrète.
[modules/homard.git] / src / HOMARDGUI / MonCreateZone.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 "MonCreateZone.h"
23 #include "MonCreateHypothesis.h"
24
25 #include <QFileDialog>
26 #include <QMessageBox>
27
28 #include "SalomeApp_Tools.h"
29 #include "HOMARDGUI_Utils.h"
30 #include "HomardQtCommun.h"
31 #include <utilities.h>
32
33 #include <SUIT_Desktop.h>
34 #include <SUIT_MessageBox.h>
35 #include <SUIT_ResourceMgr.h>
36 #include <SUIT_Session.h>
37 #include <SUIT_ViewManager.h>
38
39 // ----------------------------------------------------------------------
40 MonCreateZone::MonCreateZone(MonCreateHypothesis* parent, bool modal,
41                              HOMARD::HOMARD_Gen_var myHomardGen0,
42                              QString caseName) :
43 // ----------------------------------------------------------------------
44 /* Constructs a MonCreateZone
45    appele pour une vraie creation
46    initialise une boite et non une sphere
47 */
48     QDialog(0), Ui_CreateZone(),
49     _parent(parent),
50     _Name (""),
51     _aCaseName(caseName),
52     _Orient(0),
53     _Type(2),
54     _Xcentre(0), _Ycentre(0), _Zcentre(0), _Rayon(0),
55     _ZoneXcentre(0), _ZoneYcentre(0), _ZoneZcentre(0), _ZoneRayon(0),
56     _Xmin(0), _Xmax(0), _Xincr(0), _Ymin(0), _Ymax(0), _Yincr(0), _Zmin(0), _Zmax(0), _Zincr(0),
57     _ZoneXmin(0), _ZoneXmax(0), _ZoneYmin(0), _ZoneYmax(0), _ZoneZmin(0), _ZoneZmax(0),
58     _Xaxis(0), _Yaxis(0), _Zaxis(0), _RayonInt(0), _Haut(0),
59     _ZoneXaxis(0), _ZoneYaxis(0), _ZoneZaxis(0), _ZoneRayonInt(0), _ZoneHaut(0),
60     _DMax(0),
61     Chgt (false)
62     {
63       MESSAGE("Constructeur") ;
64       myHomardGen=HOMARD::HOMARD_Gen::_duplicate(myHomardGen0) ;
65       setupUi(this) ;
66       setModal(modal) ;
67       InitConnect( ) ;
68
69       SetNewName() ;
70       InitValZone() ;           // Cherche les valeurs de la boite englobante le maillage
71       InitMinMax() ;            // Initialise les bornes des boutons
72       SetBox() ;                // Propose une boite en premier choix
73
74     }
75 // ----------------------------------------------------------------------
76 MonCreateZone::MonCreateZone(MonCreateHypothesis* parent,
77                              HOMARD::HOMARD_Gen_var myHomardGen0,
78                              QString caseName):
79 // ----------------------------------------------------------------------
80 // Constructeur appele par MonEditZone
81 //
82     QDialog(0), Ui_CreateZone(),
83      myHomardGen(myHomardGen0),
84     _parent(parent),
85     _Name (""),
86     _aCaseName(caseName),
87     _Orient(0),
88     _Type(2),
89     _Xcentre(0), _Ycentre(0), _Zcentre(0), _Rayon(0),
90     _ZoneXcentre(0), _ZoneYcentre(0), _ZoneZcentre(0), _ZoneRayon(0),
91     _ZoneXmin(0), _ZoneXmax(0), _ZoneYmin(0), _ZoneYmax(0), _ZoneZmin(0), _ZoneZmax(0),
92     _Xaxis(0), _Yaxis(0), _Zaxis(0), _RayonInt(0), _Haut(0),
93     _ZoneXaxis(0), _ZoneYaxis(0), _ZoneZaxis(0), _ZoneRayonInt(0), _ZoneHaut(0),
94     // Pour affichage lors de l edition d une Zone sans nom de Cas
95     _Xmin(1), _Xmax(1), _Xincr(1), _Ymin(1), _Ymax(1), _Yincr(1), _Zmin(1), _Zmax(1), _Zincr(1),
96     _DMax(1),
97     Chgt (false)
98     {
99   //  MESSAGE("Debut de  MonCreateZone")
100       setupUi(this) ;
101
102       setModal(true) ;
103       InitConnect() ;
104     }
105
106 // ------------------------------------------------------------------------
107 MonCreateZone::~MonCreateZone()
108 // ------------------------------------------------------------------------
109 {
110     // no need to delete child widgets, Qt does it all for us
111 }
112 // ------------------------------------------------------------------------
113 void MonCreateZone::InitConnect()
114 // ------------------------------------------------------------------------
115 {
116     connect( RBBox,        SIGNAL(clicked()) , this, SLOT(SetBox()) ) ;
117     connect( RBSphere,     SIGNAL(clicked()) , this, SLOT(SetSphere()) ) ;
118     connect( RBCylinder,   SIGNAL(clicked()) , this, SLOT(SetCylinder()) ) ;
119     connect( RBPipe,       SIGNAL(clicked()) , this, SLOT(SetPipe()) ) ;
120     connect( buttonOk,     SIGNAL( pressed() ), this, SLOT( PushOnOK() ) ) ;
121     connect( buttonApply,  SIGNAL( pressed() ), this, SLOT( PushOnApply() ) ) ;
122     connect( buttonCancel, SIGNAL( pressed() ), this, SLOT( close() ) ) ;
123     connect( buttonHelp,   SIGNAL( pressed() ), this, SLOT( PushOnHelp() ) ) ;
124 }
125 // ------------------------------------------------------------------------
126 void MonCreateZone::InitValZone()
127 // ------------------------------------------------------------------------
128 {
129 //
130 //  1. Les coordonnees extremes du maillage
131 //
132   if (_aCaseName == QString("")) { return; }
133
134   HOMARD::HOMARD_Cas_var aCas = myHomardGen->GetCase(_aCaseName.toStdString().c_str()) ;
135   HOMARD::extrema_var  MesExtremes = aCas->GetBoundingBox() ;
136   int num = MesExtremes->length() ;
137   ASSERT(num == 10) ;
138   _Xmin=MesExtremes[0]; _Xmax=MesExtremes[1]; _Xincr=MesExtremes[2];
139   _Ymin=MesExtremes[3]; _Ymax=MesExtremes[4]; _Yincr=MesExtremes[5];
140   _Zmin=MesExtremes[6]; _Zmax=MesExtremes[7]; _Zincr=MesExtremes[8];
141   _DMax=MesExtremes[9];
142   if ( _Xincr < 0 ) { _Orient = 2 ; }
143   else if ( _Yincr < 0 ) { _Orient = 3 ; }
144   else if ( _Zincr < 0 ) { _Orient = 1 ; }
145   MESSAGE ("_Xmin : " << _Xmin << " _Xmax : " << _Xmax << " _Xincr : " << _Xincr ) ;
146   MESSAGE ("_Ymin : " << _Ymin << " _Ymax : " << _Ymax << " _Yincr : " << _Yincr ) ;
147   MESSAGE ("_Zmin : " << _Zmin << " _Zmax : " << _Zmax << " _Zincr : " << _Zincr) ;
148   MESSAGE ("_DMax : " << _DMax) ;
149   MESSAGE ("_Orient : " << _Orient) ;
150 //  2. Caracteristiques des zones
151 // en X
152   if ( _Xincr < 0 )
153   {
154     _ZoneXmin = _Xmin;
155     _ZoneXmax = _Xmax;
156   }
157   else
158   {
159     _ZoneXmin = _Xmin - _Xincr;
160     _ZoneXmax = _Xmax + _Xincr;
161   }
162   _Xcentre=(_Xmin + _Xmax)/2.;
163 // en Y
164   if ( _Yincr < 0 )
165   {
166     _ZoneYmin = _Ymin;
167     _ZoneYmax = _Ymax;
168   }
169   else
170   {
171     _ZoneYmin = _Ymin - _Yincr;
172     _ZoneYmax = _Ymax + _Yincr;
173   }
174   _Ycentre=(_Ymin + _Ymax)/2.;
175 // en Z
176   if ( _Zincr < 0 )
177   {
178     _ZoneZmin = _Zmin;
179     _ZoneZmax = _Zmax;
180   }
181   else
182   {
183     _ZoneZmin = _Zmin - _Zincr;
184     _ZoneZmax = _Zmax + _Zincr;
185   }
186   _Zcentre=(_Zmin + _Zmax)/2.;
187 // Rayons
188   _Rayon= _DMax/4.;
189   _RayonInt= _DMax/8.;
190 // Axe et hauteur pour cylindre et tuyau
191   _Haut= _DMax/2.;
192 // 3. Gestion des icones
193   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr() ;
194   QPixmap pix = resMgr->loadPixmap( "HOMARD", "boxdxyz.png" ) ;
195   if ( _Orient == 0 ) { pix = resMgr->loadPixmap( "HOMARD", "boxdxyz.png" ) ; }
196   else                { pix = resMgr->loadPixmap( "HOMARD", "boxdxy.png" ) ; }
197   QIcon IS=QIcon(pix) ;
198   RBBox->setIcon(IS) ;
199
200   if ( _Orient == 0 ) { pix = resMgr->loadPixmap( "HOMARD", "cylinderpointvector.png" ) ; }
201   else                { pix = resMgr->loadPixmap( "HOMARD", "disk.png" ) ;
202                         RBCylinder->setText(QApplication::translate("CreateZone", "Disk", 0, QApplication::UnicodeUTF8));
203                         TLXbase->setText(QApplication::translate("CreateZone", "X centre", 0, QApplication::UnicodeUTF8));
204                         TLYbase->setText(QApplication::translate("CreateZone", "Y centre", 0, QApplication::UnicodeUTF8));
205                         TLZbase->setText(QApplication::translate("CreateZone", "Z centre", 0, QApplication::UnicodeUTF8)); }
206   IS=QIcon(pix) ;
207   RBCylinder->setIcon(IS) ;
208
209   if ( _Orient == 0 ) { pix = resMgr->loadPixmap( "HOMARD", "pipe.png" ) ; }
210   else                { pix = resMgr->loadPixmap( "HOMARD", "diskwithhole.png" ) ;
211                         RBPipe->setText(QApplication::translate("CreateZone", "Disk with hole", 0, QApplication::UnicodeUTF8));
212                         TLXbase_p->setText(QApplication::translate("CreateZone", "X centre", 0, QApplication::UnicodeUTF8));
213                         TLYbase_p->setText(QApplication::translate("CreateZone", "Y centre", 0, QApplication::UnicodeUTF8));
214                         TLZbase_p->setText(QApplication::translate("CreateZone", "Z centre", 0, QApplication::UnicodeUTF8)); }
215   IS=QIcon(pix) ;
216   RBPipe->setIcon(IS) ;
217
218   if ( _Orient == 0 ) { pix = resMgr->loadPixmap( "HOMARD", "spherepoint.png" ) ;
219                         IS=QIcon(pix) ;
220                         RBSphere->setIcon(IS) ; }
221   else                { RBSphere->setVisible(0) ; }
222 }
223
224 // ------------------------------------------------------------------------
225 void MonCreateZone::InitMinMax()
226 // ------------------------------------------------------------------------
227 {
228 // en X
229     if ( _Xincr > 0) {
230       SpinBox_Xmini->setRange(_ZoneXmin,_ZoneXmax) ;
231       SpinBox_Xmaxi->setRange(_ZoneXmin,_ZoneXmax) ;
232       SpinBox_Xmini->setSingleStep(_Xincr) ;
233       SpinBox_Xmaxi->setSingleStep(_Xincr) ;
234       SpinBox_Xcentre->setSingleStep(_Xincr) ;
235     }
236     else {
237       SpinBox_Xmini->setValue(_ZoneXmin) ;
238       SpinBox_Xmaxi->setValue(_ZoneXmax) ;
239       SpinBox_Xcentre->setValue(_Xcentre) ;
240       SpinBox_Xbase->setValue(_Xcentre) ;
241       SpinBox_Xbase_p->setValue(_Xcentre) ;
242       SpinBox_Xmini->setEnabled(false) ;
243       SpinBox_Xmaxi->setEnabled(false) ;
244       SpinBox_Xcentre->setEnabled(false) ;
245       SpinBox_Xbase->setEnabled(false) ;
246       SpinBox_Xbase_p->setEnabled(false) ;
247     }
248 // en Y
249     if ( _Yincr > 0) {
250       SpinBox_Ymini->setRange(_ZoneYmin,_ZoneYmax) ;
251       SpinBox_Ymaxi->setRange(_ZoneYmin,_ZoneYmax) ;
252       SpinBox_Ymini->setSingleStep(_Yincr) ;
253       SpinBox_Ymaxi->setSingleStep(_Yincr) ;
254       SpinBox_Ycentre->setSingleStep(_Yincr) ;
255     }
256     else {
257       SpinBox_Ymini->setValue(_ZoneYmin) ;
258       SpinBox_Ymaxi->setValue(_ZoneYmax) ;
259       SpinBox_Ycentre->setValue(_Ycentre) ;
260       SpinBox_Ybase->setValue(_Ycentre) ;
261       SpinBox_Ybase_p->setValue(_Ycentre) ;
262       SpinBox_Ymini->setEnabled(false) ;
263       SpinBox_Ymaxi->setEnabled(false) ;
264       SpinBox_Ycentre->setEnabled(false) ;
265       SpinBox_Ybase->setEnabled(false) ;
266       SpinBox_Ybase_p->setEnabled(false) ;
267     }
268 // en Z
269     if ( _Zincr > 0) {
270       SpinBox_Zmini->setRange(_ZoneZmin,_ZoneZmax) ;
271       SpinBox_Zmaxi->setRange(_ZoneZmin,_ZoneZmax) ;
272       SpinBox_Zmini->setSingleStep(_Zincr) ;
273       SpinBox_Zmaxi->setSingleStep(_Zincr) ;
274       SpinBox_Zcentre->setSingleStep(_Zincr) ;
275     }
276     else {
277       SpinBox_Zmini->setValue(_ZoneZmin) ;
278       SpinBox_Zmaxi->setValue(_ZoneZmax) ;
279       SpinBox_Zcentre->setValue(_Zcentre) ;
280       SpinBox_Zbase->setValue(_Zcentre) ;
281       SpinBox_Zbase_p->setValue(_Zcentre) ;
282       SpinBox_Zmini->setEnabled(false) ;
283       SpinBox_Zmaxi->setEnabled(false) ;
284       SpinBox_Zcentre->setEnabled(false) ;
285       SpinBox_Zbase->setEnabled(false) ;
286       SpinBox_Zbase_p->setEnabled(false) ;
287     }
288 // Rayons
289     SpinBox_Rayon->setSingleStep(_Rayon/10.) ;
290     SpinBox_Rayon->setMinimum(0.) ;
291     SpinBox_Radius->setSingleStep(_Rayon/10.) ;
292     SpinBox_Radius->setMinimum(0.) ;
293     SpinBox_Radius_int->setSingleStep(_Rayon/20.) ;
294     SpinBox_Radius_int->setMinimum(0.) ;
295     SpinBox_Radius_ext->setSingleStep(_Rayon/10.) ;
296     SpinBox_Radius_ext->setMinimum(0.) ;
297 // Axe et hauteur
298 // Si une coordonnee est constante, inutile de demander l'axe et la hauteur
299     if ( _Orient > 0) {
300       SpinBox_Xaxis->setVisible(0) ;
301       SpinBox_Yaxis->setVisible(0) ;
302       SpinBox_Zaxis->setVisible(0) ;
303       SpinBox_Haut->setVisible(0) ;
304       TLXaxis->setVisible(0) ;
305       TLYaxis->setVisible(0) ;
306       TLZaxis->setVisible(0) ;
307       TLHaut->setVisible(0) ;
308       SpinBox_Xaxis_p->setVisible(0) ;
309       SpinBox_Yaxis_p->setVisible(0) ;
310       SpinBox_Zaxis_p->setVisible(0) ;
311       SpinBox_Haut_p->setVisible(0) ;
312       TLXaxis_p->setVisible(0) ;
313       TLYaxis_p->setVisible(0) ;
314       TLZaxis_p->setVisible(0) ;
315       TLHaut_p->setVisible(0) ;
316     }
317     else {
318       SpinBox_Haut->setMinimum(0.) ;
319       SpinBox_Haut->setSingleStep(_Rayon/10.) ;
320       SpinBox_Haut_p->setMinimum(0.) ;
321       SpinBox_Haut_p->setSingleStep(_Rayon/10.) ;
322     }
323 }
324 // ------------------------------------------------------------------------
325 bool MonCreateZone::PushOnApply()
326 // ------------------------------------------------------------------------
327 // Appele lorsque l'un des boutons Ok ou Apply est presse
328 //
329 {
330   if (LEName->text().trimmed()=="")
331   {
332     QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
333                               QObject::tr("HOM_ZONE_NAME") ) ;
334     return false;
335   }
336
337   switch (_Type)
338   {
339     case 11 : // il s agit d un rectangle
340     { }
341     case 12 : // il s agit d un rectangle
342     { }
343     case 13 : // il s agit d un rectangle
344     { }
345     case 2 : // il s agit d un parallelipipede rectangle
346     {
347       if (  (_ZoneXmin != SpinBox_Xmini->value()) or
348             (_ZoneXmax != SpinBox_Xmaxi->value()) or
349             (_ZoneYmin != SpinBox_Ymini->value()) or
350             (_ZoneYmax != SpinBox_Ymaxi->value()) or
351             (_ZoneZmin != SpinBox_Zmini->value()) or
352             (_ZoneZmax   != SpinBox_Zmaxi->value()) )
353       {
354         Chgt = true;
355         _ZoneXmin= SpinBox_Xmini->value() ; _ZoneXmax= SpinBox_Xmaxi->value() ;
356         _ZoneYmin= SpinBox_Ymini->value() ; _ZoneYmax= SpinBox_Ymaxi->value() ;
357         _ZoneZmin= SpinBox_Zmini->value() ; _ZoneZmax= SpinBox_Zmaxi->value() ;
358       }
359       break ;
360     }
361     case 4 : // il s agit d une sphere
362     {
363       if (  (_ZoneXcentre != SpinBox_Xcentre->value()) or
364             (_ZoneYcentre != SpinBox_Ycentre->value()) or
365             (_ZoneZcentre != SpinBox_Zbase->value())   or
366             (_ZoneRayon   != SpinBox_Rayon->value()) )
367       {
368         Chgt = true;
369         _ZoneXcentre=SpinBox_Xcentre->value() ;
370         _ZoneYcentre=SpinBox_Ycentre->value() ;
371         _ZoneZcentre=SpinBox_Zcentre->value() ;
372         _ZoneRayon=SpinBox_Rayon->value() ;
373       }
374       break ;
375     }
376     case 31 : // il s agit d un disque issu d'un cylindre
377     { }
378     case 32 : // il s agit d un disque issu d'un cylindre
379     { }
380     case 33 : // il s agit d un disque issu d'un cylindre
381     { }
382     case 5 : // il s agit d un cylindre
383     {
384       if (  (_ZoneXcentre != SpinBox_Xbase->value())  or
385             (_ZoneYcentre != SpinBox_Ybase->value())  or
386             (_ZoneZcentre != SpinBox_Zbase->value())  or
387             (_ZoneRayon   != SpinBox_Radius->value()) or
388             (_ZoneHaut    != SpinBox_Haut->value())   or
389             (_ZoneXaxis   != SpinBox_Xaxis->value())  or
390             (_ZoneYaxis   != SpinBox_Yaxis->value())  or
391             (_ZoneZaxis   != SpinBox_Zaxis->value()) )
392       {
393         Chgt = true;
394         _ZoneXcentre=SpinBox_Xbase->value() ;
395         _ZoneYcentre=SpinBox_Ybase->value() ;
396         _ZoneZcentre=SpinBox_Zbase->value() ;
397         _ZoneXaxis=SpinBox_Xaxis->value() ;
398         _ZoneYaxis=SpinBox_Yaxis->value() ;
399         _ZoneZaxis=SpinBox_Zaxis->value() ;
400         _ZoneRayon=SpinBox_Radius->value() ;
401         _ZoneHaut=SpinBox_Haut->value() ;
402       }
403       break ;
404     }
405     case 61 : // il s agit d un disque avec trou
406     { }
407     case 62 : // il s agit d un disque avec trou
408     { }
409     case 63 : // il s agit d un disque avec trou
410     { }
411     case 7 : // il s agit d un tuyau
412     {
413       if (  (_ZoneXcentre  != SpinBox_Xbase_p->value())  or
414             (_ZoneYcentre  != SpinBox_Ybase_p->value())  or
415             (_ZoneZcentre  != SpinBox_Zbase_p->value())  or
416             (_ZoneRayonInt != SpinBox_Radius_int->value()) or
417             (_ZoneRayon    != SpinBox_Radius_ext->value()) or
418             (_ZoneHaut     != SpinBox_Haut_p->value())   or
419             (_ZoneXaxis    != SpinBox_Xaxis_p->value())  or
420             (_ZoneYaxis    != SpinBox_Yaxis_p->value())  or
421             (_ZoneZaxis    != SpinBox_Zaxis_p->value()) )
422       {
423         Chgt = true;
424         _ZoneXcentre=SpinBox_Xbase_p->value() ;
425         _ZoneYcentre=SpinBox_Ybase_p->value() ;
426         _ZoneZcentre=SpinBox_Zbase_p->value() ;
427         _ZoneXaxis=SpinBox_Xaxis_p->value() ;
428         _ZoneYaxis=SpinBox_Yaxis_p->value() ;
429         _ZoneZaxis=SpinBox_Zaxis_p->value() ;
430         _ZoneRayonInt=SpinBox_Radius_int->value() ;
431         _ZoneRayon=SpinBox_Radius_ext->value() ;
432         _ZoneHaut=SpinBox_Haut_p->value() ;
433       }
434       break ;
435    }
436   }
437
438 // Controles
439 // Pour un rectangle ou un parallelepipede :
440   if ( ( _Type >= 11 and _Type <= 13 ) or _Type == 2 )
441   {
442     if ((_ZoneXmin >= _ZoneXmax) and (_Xincr > 0)) {
443       QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
444                                 QObject::tr("HOM_ZONE_LIMIT").arg("X") ) ;
445       return false; }
446
447     if  ((_ZoneYmin >= _ZoneYmax) and (_Yincr > 0)) {
448       QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
449                                 QObject::tr("HOM_ZONE_LIMIT").arg("Y") ) ;
450       return false; }
451
452     if ((_ZoneZmin >= _ZoneZmax) and (_Zincr > 0)) {
453       QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
454                                 QObject::tr("HOM_ZONE_LIMIT").arg("Z") ) ;
455       return false; }
456   }
457 // L'axe pour un cylindre ou un tuyau :
458   if ( _Type == 5 or _Type == 7 )
459   {
460     double daux = _ZoneXaxis*_ZoneXaxis + _ZoneYaxis*_ZoneYaxis + _ZoneZaxis*_ZoneZaxis ;
461     if ( daux < 0.0000001 )
462     {
463       QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
464                                 QObject::tr("HOM_AXE") );
465       return false;
466     }
467   }
468 // Rayons pour disque avec trou ou un tuyau :
469   if ( ( _Type >= 61 and _Type <= 63 ) or _Type == 7 )
470   {
471     if ( _ZoneRayonInt >= _ZoneRayon )
472     {
473       QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
474                                 QObject::tr("HOM_ZONE_RAYON") );
475       return false;
476     }
477   }
478   bool bOK = CreateOrUpdateZone() ;
479
480   if ( bOK ) { HOMARD_UTILS::updateObjBrowser() ; }
481
482   return bOK;
483
484 }
485 // ---------------------------------------------------
486 bool MonCreateZone:: CreateOrUpdateZone()
487 //----------------------------------------------------
488 //  Creation de la zone
489 {
490   MESSAGE("CreateOrUpdateZone _Type ="<<_Type);
491   if (_Name != LEName->text().trimmed())
492   {
493     _Name = LEName->text().trimmed() ;
494     try
495     {
496       switch (_Type)
497       {
498         case 11 : // il s agit d un rectangle
499         { aZone = myHomardGen->CreateZoneBox2D(CORBA::string_dup(_Name.toStdString().c_str()), \
500           _ZoneXmin, _ZoneXmax, _ZoneYmin, _ZoneYmax, _Orient );
501           break;
502         }
503         case 12 : // il s agit d un rectangle
504         { aZone = myHomardGen->CreateZoneBox2D(CORBA::string_dup(_Name.toStdString().c_str()), \
505           _ZoneYmin, _ZoneYmax, _ZoneZmin, _ZoneZmax, _Orient );
506           break;
507         }
508         case 13 : // il s agit d un rectangle
509         { aZone = myHomardGen->CreateZoneBox2D(CORBA::string_dup(_Name.toStdString().c_str()), \
510           _ZoneZmin, _ZoneZmax, _ZoneXmin, _ZoneXmax, _Orient );
511           break;
512         }
513         case 2 : // il s agit d un parallelepipede
514         { aZone = myHomardGen->CreateZoneBox(CORBA::string_dup(_Name.toStdString().c_str()), \
515           _ZoneXmin, _ZoneXmax, _ZoneYmin, _ZoneYmax, _ZoneZmin, _ZoneZmax );
516           break;
517         }
518         case 4 : // il s agit d une sphere
519         { aZone = myHomardGen->CreateZoneSphere(CORBA::string_dup(_Name.toStdString().c_str()), \
520           _ZoneXcentre, _ZoneYcentre, _ZoneZcentre, _ZoneRayon );
521           break;
522         }
523         case 31 : // il s agit d un disque issu d'un cylindre
524         { aZone = myHomardGen->CreateZoneDisk(CORBA::string_dup(_Name.toStdString().c_str()), \
525           _ZoneXcentre, _ZoneYcentre, _ZoneRayon, _Orient );
526           break;
527           }
528         case 32 : // il s agit d un disque issu d'un cylindre
529         { aZone = myHomardGen->CreateZoneDisk(CORBA::string_dup(_Name.toStdString().c_str()), \
530           _ZoneYcentre, _ZoneZcentre, _ZoneRayon, _Orient );
531           break;
532         }
533         case 33 : // il s agit d un disque issu d'un cylindre
534         { aZone = myHomardGen->CreateZoneDisk(CORBA::string_dup(_Name.toStdString().c_str()), \
535           _ZoneZcentre, _ZoneXcentre, _ZoneRayon, _Orient );
536           break;
537         }
538         case 5 : // il s agit d un cylindre
539         { aZone = myHomardGen->CreateZoneCylinder(CORBA::string_dup(_Name.toStdString().c_str()), \
540           _ZoneXcentre, _ZoneYcentre, _ZoneZcentre, _ZoneXaxis, _ZoneYaxis, _ZoneZaxis, _ZoneRayon, _ZoneHaut );
541           break;
542         }
543         case 61 : // il s agit d un disque avec trou
544         { aZone = myHomardGen->CreateZoneDiskWithHole(CORBA::string_dup(_Name.toStdString().c_str()), \
545           _ZoneXcentre, _ZoneYcentre, _ZoneRayon, _ZoneRayonInt, _Orient );
546           break;
547           }
548         case 62 : // il s agit d un disque avec trou
549         { aZone = myHomardGen->CreateZoneDiskWithHole(CORBA::string_dup(_Name.toStdString().c_str()), \
550           _ZoneYcentre, _ZoneZcentre, _ZoneRayon, _ZoneRayonInt, _Orient );
551           break;
552           }
553         case 63 : // il s agit d un disque avec trou
554         { aZone = myHomardGen->CreateZoneDiskWithHole(CORBA::string_dup(_Name.toStdString().c_str()), \
555           _ZoneZcentre, _ZoneXcentre, _ZoneRayon, _ZoneRayonInt, _Orient );
556           break;
557           }
558         case 7 : // il s agit d un tuyau
559         { aZone = myHomardGen->CreateZonePipe(CORBA::string_dup(_Name.toStdString().c_str()), \
560           _ZoneXcentre, _ZoneYcentre, _ZoneZcentre, _ZoneXaxis, _ZoneYaxis, _ZoneZaxis, _ZoneRayon, _ZoneHaut, _ZoneRayonInt );
561           break;
562           }
563       }
564     }
565     catch( SALOME::SALOME_Exception& S_ex )
566     {
567       QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
568                                 QObject::tr(CORBA::string_dup(S_ex.details.text)) );
569       return false ;
570     }
571     _parent->addZoneinTWZone(_Name) ;
572 // Mise en place des attributs
573     aZone->SetLimit(_Xincr, _Yincr, _Zincr) ;
574
575     return true;
576   }
577   else { return false ; }
578 }
579 // ------------------------------------------------------------------------
580 void MonCreateZone::PushOnOK()
581 // ------------------------------------------------------------------------
582 {
583      if (PushOnApply()) this->close() ;
584 }
585 // ------------------------------------------------------------------------
586 void MonCreateZone::PushOnHelp()
587 // ------------------------------------------------------------------------
588 {
589   char* LanguageShort = myHomardGen->GetLanguageShort();
590   HOMARD_UTILS::PushOnHelp(QString("gui_create_zone.html"), QString(""), QString(LanguageShort));
591 }
592
593 // -----------------------------------
594 void MonCreateZone::SetNewName()
595 // -----------------------------------
596 {
597 // Recherche d'un nom par defaut qui n'existe pas encore
598
599   HOMARD::listeZones_var  MyObjects = myHomardGen->GetAllZonesName() ;
600   int num = 0; QString aName="";
601   while (aName=="" )
602   {
603     aName.setNum(num+1) ;
604     aName.insert(0, QString("Zone_")) ;
605     for ( int i=0; i<MyObjects->length() ; i++)
606     {
607       if ( aName ==  QString(MyObjects[i]))
608       {
609           num=num+1;
610           aName="";
611           break;
612       }
613    }
614   }
615   LEName->setText(aName);
616 }
617 // ------------------------------------------------------------------------
618 void MonCreateZone::SetBox()
619 // ------------------------------------------------------------------------
620 {
621   gBBox->setVisible(1) ;
622   gBSphere->setVisible(0) ;
623   gBCylindre->setVisible(0) ;
624   gBPipe->setVisible(0) ;
625   adjustSize() ;
626   _Type=2;
627 // Sachant que l'increment est le 1/100eme de l'ecart (min/max), cela revient
628 // a initialiser la boite sur une boite 'centrale' comprise entre 2/5 et 3/5
629   if ( _Xincr > 0 ) { SpinBox_Xmini->setValue(_Xcentre-10*_Xincr) ;
630                       SpinBox_Xmaxi->setValue(_Xcentre+10*_Xincr) ; }
631   else { _Type=12 ; }
632   if ( _Yincr > 0 ) { SpinBox_Ymini->setValue(_Ycentre-10*_Yincr) ;
633                       SpinBox_Ymaxi->setValue(_Ycentre+10*_Yincr) ; }
634   else { _Type=13 ; }
635   if ( _Zincr > 0 ) { SpinBox_Zmini->setValue(_Zcentre-10*_Zincr) ;
636                       SpinBox_Zmaxi->setValue(_Zcentre+10*_Zincr) ; }
637   else { _Type=11 ; }
638 }
639 // ------------------------------------------------------------------------
640 void MonCreateZone::SetSphere()
641 // ------------------------------------------------------------------------
642 {
643   MESSAGE("Debut de SetSphere")
644   gBBox->setVisible(0) ;
645   gBSphere->setVisible(1) ;
646   gBCylindre->setVisible(0) ;
647   gBPipe->setVisible(0) ;
648   adjustSize() ;
649   _Type=4;
650   SpinBox_Xcentre->setValue(_Xcentre) ;
651   SpinBox_Ycentre->setValue(_Ycentre) ;
652   SpinBox_Zcentre->setValue(_Zcentre) ;
653   SpinBox_Rayon->setValue(_Rayon) ;
654   MESSAGE("Fin de SetSphere")
655 }
656 // ------------------------------------------------------------------------
657 void MonCreateZone::SetCylinder()
658 // ------------------------------------------------------------------------
659 {
660   MESSAGE("Debut de SetCylinder")
661   gBBox->setVisible(0) ;
662   gBSphere->setVisible(0) ;
663   gBCylindre->setVisible(1) ;
664   gBPipe->setVisible(0) ;
665   adjustSize() ;
666   _Type=5;
667   if ( _Xincr > 0 ) { SpinBox_Xbase->setValue(_Xcentre) ;
668                       SpinBox_Xaxis->setValue(0.) ; }
669   else { _Type=32 ; }
670   if ( _Yincr > 0 ) { SpinBox_Ybase->setValue(_Ycentre) ;
671                       SpinBox_Yaxis->setValue(0.) ; }
672   else { _Type=33 ; }
673   if ( _Zincr > 0 ) { SpinBox_Zbase->setValue(_Zcentre) ;
674                       SpinBox_Zaxis->setValue(1.) ; }
675   else { _Type=31 ; }
676   SpinBox_Radius->setValue(_Rayon) ;
677   SpinBox_Haut->setValue(_Haut) ;
678   MESSAGE("Fin de SetCylinder")
679 }
680 // ------------------------------------------------------------------------
681 void MonCreateZone::SetPipe()
682 // ------------------------------------------------------------------------
683 {
684   MESSAGE("Debut de SetPipe")
685   gBBox->setVisible(0) ;
686   gBSphere->setVisible(0) ;
687   gBCylindre->setVisible(0) ;
688   gBPipe->setVisible(1) ;
689   adjustSize() ;
690   _Type=7;
691   if ( _Xincr > 0 ) { SpinBox_Xbase_p->setValue(_Xcentre) ;
692                       SpinBox_Xaxis_p->setValue(0.) ; }
693   else { _Type=62 ; }
694   if ( _Yincr > 0 ) { SpinBox_Ybase_p->setValue(_Ycentre) ;
695                       SpinBox_Yaxis_p->setValue(0.) ; }
696   else { _Type=63 ; }
697   if ( _Zincr > 0 ) { SpinBox_Zbase_p->setValue(_Zcentre) ;
698                       SpinBox_Zaxis_p->setValue(1.) ; }
699   else { _Type=61 ; }
700   SpinBox_Radius_int->setValue(_RayonInt) ;
701   SpinBox_Radius_ext->setValue(_Rayon) ;
702   SpinBox_Haut_p->setValue(_Haut) ;
703   MESSAGE("Fin de SetPipe")
704 }
705
706