Salome HOME
a0759a26c39b1f665e697a6931860bf6c40c3bbe
[modules/homard.git] / src / HOMARDGUI / HOMARDGUI.cxx
1 // Copyright (C) 2011-2021  CEA/DEN, EDF R&D
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 //  File   : HOMARDGUI.cxx
21 //  Author : Gerald NICOLAS, EDF
22 //  Module : HOMARD
23
24 #include "HOMARDGUI.h"
25
26 // SALOME Includes
27 #include "OpUtil.hxx"
28 #include "SALOME_LifeCycleCORBA.hxx"
29
30 #include "SUIT_ResourceMgr.h"
31 #include "SUIT_MessageBox.h"
32 #include "SUIT_Session.h"
33 #include "SUIT_ViewWindow.h"
34 #include "SUIT_ViewManager.h"
35 #include <SUIT_Desktop.h>
36
37 #include "CAM_Module.h"
38 #include "OB_Browser.h"
39
40 #include "SALOME_ListIO.hxx"
41
42 #include "SalomeApp_Application.h"
43 #include "SalomeApp_DataModel.h"
44 #include "SalomeApp_Study.h"
45 #include "LightApp_SelectionMgr.h"
46 #include "LightApp_Selection.h"
47 #include <LightApp_Preferences.h>
48 #include "SalomeApp_Module.h"
49 #include "SALOMEconfig.h"
50 #include <SALOME_LifeCycleCORBA.hxx>
51
52 #include <utilities.h>
53
54
55 // QT Includes
56 #include <QMenu>
57 #include "MonCreateCase.h"
58 #include "MonCreateIteration.h"
59 #include "MonPursueIteration.h"
60 #include "MonCreateYACS.h"
61 #include "MonEditBoundaryCAO.h"
62 #include "MonEditBoundaryAn.h"
63 #include "MonEditBoundaryDi.h"
64 #include "MonEditCase.h"
65 #include "MonEditHypothesis.h"
66 #include "MonEditIteration.h"
67 #include "MonEditYACS.h"
68 #include "MonEditZone.h"
69 #include "MonMeshInfo.h"
70 #include "MonIterInfo.h"
71 #include "MonEditFile.h"
72 #include "HomardQtCommun.h"
73
74 // BOOST Includes
75 #include <boost/shared_ptr.hpp>
76
77 //Pour le _CAST
78 #include "SALOMEDS_Study.hxx"
79 #include "HOMARDGUI_Utils.h"
80
81 using namespace std;
82
83 static CORBA::ORB_var _orb;
84
85 //=======================================================================
86 // function : HOMARDGUI()
87 // purpose  : Constructor
88 //=======================================================================
89 HOMARDGUI::HOMARDGUI(const QString&) :
90            SalomeApp_Module( "HOMARD" ) // default name
91 {
92 }
93 //=======================================================================
94 // function : ~HOMARDGUI()
95 // purpose  : Destructor
96 //=======================================================================
97 HOMARDGUI::~HOMARDGUI()
98 {
99 }
100
101 //=======================================================================
102 // function : InitHOMARDGen
103 // launch HOMARD component and return a handle
104 //=======================================================================
105 HOMARD::HOMARD_Gen_var HOMARDGUI::InitHOMARDGen(SalomeApp_Application* app)
106 {
107   Engines::EngineComponent_var comp = app->lcc()->FindOrLoad_Component( "FactoryServer","HOMARD" );
108   HOMARD::HOMARD_Gen_var clr = HOMARD::HOMARD_Gen::_narrow(comp);
109   ASSERT(!CORBA::is_nil(clr));
110   return clr;
111 }
112
113 //=======================================================================
114 // Module's initialization
115 void HOMARDGUI::initialize( CAM_Application* app )
116 //=======================================================================
117 {
118   SalomeApp_Module::initialize( app );
119   InitHOMARDGen(dynamic_cast<SalomeApp_Application*>( app ));
120   anId = 0;
121   createActions();
122   createMenus();
123   recupPreferences();
124 }
125
126 //================================================
127 // function : createHOMARDAction
128 // create an item in status bar and Homard menu
129 //================================================
130 void HOMARDGUI::createHOMARDAction( const int id, const QString& po_id, const QString& icon_id, const int key, const bool toggle  )
131 {
132 //   MESSAGE("createHOMARDAction");
133   QIcon icon;
134   QWidget* parent = application()->desktop();
135   SUIT_ResourceMgr* resMgr = application()->resourceMgr();
136   QPixmap pix;
137   if ( icon_id.length() )
138      pix = resMgr->loadPixmap( "HOMARD", tr( icon_id .toLatin1().data()) );
139   else
140      pix = resMgr->loadPixmap( "HOMARD", tr( QString( "ICO_%1" ).arg( po_id ).toLatin1().data()), false );
141   if ( !pix.isNull() )
142       icon = QIcon( pix );
143
144   QString tooltip    = tr(QString( "HOM_TOP_%1" ).arg( po_id ).toLatin1().data()),
145           menu       = tr(QString( "HOM_MEN_%1" ).arg( po_id ).toLatin1().data()),
146           status_bar = tr(QString( "HOM_STB_%1" ).arg( po_id ).toLatin1().data());
147
148   createAction( id, tooltip, icon, menu, status_bar, key, parent, toggle, this, SLOT( OnGUIEvent() )  );
149 }
150
151 //================================================
152 // function : createAction
153 // constructs Homard menu
154 // calls createHOMARDAction for each item
155 //================================================
156 void HOMARDGUI::createActions(){
157 //
158   createHOMARDAction( 1101, "NEW_CASE",         "cas_calcule.png"        );
159   createHOMARDAction( 1102, "PURSUE_ITERATION", "iter_poursuite.png"     );
160   createHOMARDAction( 1103, "NEW_ITERATION",    "iter_next.png"          );
161   createHOMARDAction( 1111, "COMPUTE",          "mesh_compute.png"       );
162   createHOMARDAction( 1112, "COMPUTE_PUBLISH",  "mesh_compute.png"       );
163   createHOMARDAction( 1121, "MESH_INFO",        "advanced_mesh_info.png" );
164   createHOMARDAction( 1131, "MESH_PUBLICATION", "mesh_tree_mesh.png"     );
165 //
166   createHOMARDAction( 1201, "EDIT",             "loop.png"         );
167   createHOMARDAction( 1211, "DELETE",           "delete.png"       );
168 //
169   createHOMARDAction( 1301, "MESH_INFO",        "advanced_mesh_info.png" );
170   createHOMARDAction( 1302, "EDIT_MESS_FILE",   "texte.png"              );
171 //
172   createHOMARDAction( 1401, "YACS",             "table_view.png" );
173 //
174 }
175
176 //================================================
177 // function : createPreferences
178 //================================================
179 void HOMARDGUI::createPreferences()
180 {
181   MESSAGE("createPreferences")
182
183   int Onglet, Bloc, Pref ;
184   // 1. Generalites
185   Onglet = addPreference( tr( "PREF_TAB_GENERAL" ) );
186 //   Onglet = addPreference( tr( "PREF_TAB_SETTINGS" ) ) ;
187
188   Bloc = addPreference( tr( "PREF_PUBLICATION" ), Onglet );
189   setPreferenceProperty( Bloc, "columns", 1 );
190
191   Pref = addPreference( tr( "PREF_PUBLICATION_MAILLAGE_IN" ), Bloc, LightApp_Preferences::Bool, "HOMARD", "publish_mesh_in" );
192
193   Pref = addPreference( tr( "PREF_PUBLICATION_MAILLAGE_OUT" ), Bloc, LightApp_Preferences::Bool, "HOMARD", "publish_mesh_out" );
194
195   // 2. YACS
196   Onglet = addPreference( tr( "PREF_YACS" ) ) ;
197
198   Bloc = addPreference( tr( "PREF_YACS_MAX" ), Onglet );
199   setPreferenceProperty( Bloc, "columns", 1 );
200
201   Pref = addPreference( tr( "PREF_YACS_MAX_ITER" ), Bloc, LightApp_Preferences::IntSpin, "HOMARD", "yacs_max_iter" );
202   setPreferenceProperty( Pref, "min",  0 );
203   setPreferenceProperty( Pref, "max",  100000000 );
204   setPreferenceProperty( Pref, "step", 1 );
205
206   Pref = addPreference( tr( "PREF_YACS_MAX_NODE" ), Bloc, LightApp_Preferences::IntSpin, "HOMARD", "yacs_max_node" );
207   setPreferenceProperty( Pref, "min",  0 );
208   setPreferenceProperty( Pref, "max",  100000000 );
209   setPreferenceProperty( Pref, "step", 1000 );
210
211   Pref = addPreference( tr( "PREF_YACS_MAX_ELEM" ), Bloc, LightApp_Preferences::IntSpin, "HOMARD", "yacs_max_elem" );
212   setPreferenceProperty( Pref, "min",  0 );
213   setPreferenceProperty( Pref, "max",  100000000 );
214   setPreferenceProperty( Pref, "step", 1000 );
215
216   Bloc = addPreference( tr( "PREF_YACS_CONVERGENCE" ), Onglet );
217   setPreferenceProperty( Bloc, "columns", 1 );
218
219   Pref = addPreference( tr( "PREF_YACS_TYPE_TEST" ), Bloc, LightApp_Preferences::Selector, "HOMARD", "yacs_type_test" );
220   QStringList aListOfTypeTest;
221   aListOfTypeTest << "None";
222   aListOfTypeTest << "VTest > VRef";
223   aListOfTypeTest << "VTest < VRef";
224   setPreferenceProperty( Pref, "strings", aListOfTypeTest );
225 }
226
227
228 //================================================
229 // function : createMenus
230 //================================================
231 void HOMARDGUI::createMenus()
232 {
233   MESSAGE("createMenus")
234 //
235   int HOMARD_Id  = createMenu( tr( "HOM_MEN_HOMARD" ),  -1,  5, 10 );
236   createMenu( 1101, HOMARD_Id, -1 ); //Create_Case
237   createMenu( 1102, HOMARD_Id, -1 ); //Pursue_Iteration
238   createMenu( separator(), HOMARD_Id,-1);
239   createMenu( 1103, HOMARD_Id, -1 ); //Create_Iteration
240   createMenu( 1111, HOMARD_Id, -1 ); //Compute
241   createMenu( 1112, HOMARD_Id, -1 ); //Compute and publish
242 //
243   HOMARD_Id  = createMenu( tr( "HOM_MEN_MODIFICATION" ),  -1,  5, 10 );
244   createMenu( 1201, HOMARD_Id, -1 ); //Edit
245   createMenu( 1211, HOMARD_Id, -1 ); //Delete
246 //
247   HOMARD_Id  = createMenu( tr( "HOM_MEN_INFORMATION" ),  -1,  5, 10 );
248   createMenu( 1301, HOMARD_Id, -1 ); //Information sur un maillage
249   createMenu( 1131, HOMARD_Id, -1 ); //Mesh publication
250   createMenu( separator(), HOMARD_Id,-1);
251   createMenu( 1302, HOMARD_Id, -1 ); //EditAsciiFile pour le fichier listeStd ou bilan
252   createMenu( separator(), HOMARD_Id,-1);
253   createMenu( 1201, HOMARD_Id, -1 ); //Edit
254   createMenu( separator(), HOMARD_Id,-1);
255 //
256   HOMARD_Id  = createMenu( tr( "HOM_MEN_YACS" ),  -1,  5, 10 );
257   createMenu( 1401, HOMARD_Id, -1 ); // Création d'un schéma YACS
258   createMenu( separator(), HOMARD_Id,-1);
259 }
260
261 //================================================
262 // function : recupPreferences
263 // Pour chaque valeur, le defaut est la valeur definie dans HOMARD_Gen
264 // . Si la recuperation dans config/salome s'est bien passee a la creation de HOMARD_Gen,
265 //   ces valeurs sont les valeurs definies.
266 // . Si cela ne s'est pas bien passe, ce sont les valeurs par defaut de HOMARD_Gen
267 //================================================
268 void HOMARDGUI::recupPreferences()
269 {
270   INFOS("recupPreferences")
271 //
272 // A. Declarations
273 //
274   SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( application() );
275   HOMARD::HOMARD_Gen_var homardGen = HOMARDGUI::InitHOMARDGen(app);
276   int defaut_i ;
277   std::string defaut_s ;
278   QString QString_v ;
279 //
280 // B. Les valeurs
281 // B.1. La langue
282 //
283   SUIT_ResourceMgr* resMgr0 = getApp()->resourceMgr();
284   QString lang = resMgr0->stringValue( resMgr0->langSection(), "language", "en" );
285   INFOS ("Récupération de lang = " << lang.toStdString().c_str() );
286   defaut_s = homardGen->GetLanguageShort();
287   INFOS ("Récupération de defaut_s = " << defaut_s.c_str() );
288   SUIT_ResourceMgr* resMgr = getApp()->resourceMgr();
289   _LanguageShort = resMgr->stringValue("language", "language", QString(defaut_s.c_str()) );
290   INFOS ("Récupération de LanguageShort = " << _LanguageShort.toStdString().c_str() );
291 //
292 // B.2. Les publications
293   bool publish_mesh ;
294 //
295   _PublisMeshIN = homardGen->GetPublisMeshIN();
296   if ( _PublisMeshIN == 1 ) { publish_mesh = true ;  }
297   else                      { publish_mesh = false ; }
298   publish_mesh = resMgr->booleanValue("HOMARD", "publish_mesh_in", publish_mesh );
299   if ( publish_mesh ) { _PublisMeshIN = 1 ; }
300   else                { _PublisMeshIN = 0 ; }
301 //
302   _PublisMeshOUT = homardGen->GetPublisMeshOUT();
303   if ( _PublisMeshOUT == 1 ) { publish_mesh = true ;  }
304   else                       { publish_mesh = false ; }
305   publish_mesh = resMgr->booleanValue("HOMARD", "publish_mesh_out", publish_mesh );
306   if ( publish_mesh ) { _PublisMeshOUT = 1 ; }
307   else                { _PublisMeshOUT = 0 ; }
308 //
309 // B.3. Les maximum pour YACS
310 //
311   defaut_i = homardGen->GetYACSMaxIter();
312   _YACSMaxIter = resMgr->integerValue("HOMARD", "yacs_max_iter", defaut_i );
313 //
314   defaut_i = homardGen->GetYACSMaxNode();
315   _YACSMaxNode = resMgr->integerValue("HOMARD", "yacs_max_node", defaut_i );
316 //
317   defaut_i = homardGen->GetYACSMaxElem();
318   _YACSMaxElem = resMgr->integerValue("HOMARD", "yacs_max_elem", defaut_i );
319 //
320 // B.4. La convergence pour YACS
321 //
322   defaut_i = homardGen->GetYACSConvergenceType();
323   if ( defaut_i == 1 )      { QString_v = tr("VTest > VRef") ; }
324   else if ( defaut_i == 2 ) { QString_v = tr("VTest < VRef") ; }
325   else                      { QString_v = tr("None") ; }
326   QString_v = resMgr->stringValue ( "HOMARD", "yacs_type_test", QString_v );
327   if ( ( QString_v == "VTest > VRef" ) || ( QString_v == "VTest &gt; VRef" ) )      { _YACSTypeTest = 1 ; }
328   else if ( ( QString_v == "VTest < VRef" ) || ( QString_v == "VTest &lt; VRef" ) ) { _YACSTypeTest = 2 ; }
329   else                                                                              { _YACSTypeTest = 0 ; }
330 //
331 // C. Enregistrement dans l'objet general
332 //
333   INFOS ("Enregistrement de LanguageShort = " << _LanguageShort.toStdString().c_str() );
334   INFOS ("Enregistrement de PublisMeshIN = " << _PublisMeshIN<<", PublisMeshOUT = "<< _PublisMeshOUT);
335   INFOS ("Enregistrement de YACSMaxIter = " << _YACSMaxIter<<", YACSMaxNode = "<< _YACSMaxNode<<", YACSMaxElem = "<< _YACSMaxElem);
336   INFOS ("Enregistrement de YACSTypeTest = " << _YACSTypeTest);
337 //
338   homardGen->SetLanguageShort(_LanguageShort.toStdString().c_str());
339   homardGen->SetPublisMesh(_PublisMeshIN, _PublisMeshOUT);
340   homardGen->SetYACSMaximum(_YACSMaxIter, _YACSMaxNode, _YACSMaxElem);
341 //
342   homardGen->SetYACSConvergenceType(_YACSTypeTest);
343 }
344
345 //================================================
346 void HOMARDGUI::OnGUIEvent()
347 //================================================
348 {
349   MESSAGE("OnGUIEvent()")
350   setOrb();
351   const QObject* obj = sender();
352   if ( !obj || !obj->inherits( "QAction" ) ) { return; }
353   int id = actionId((QAction*)obj);
354   if ( id != -1 ) { bool ret = OnGUIEvent( id ); }
355   MESSAGE("Fin de OnGUIEvent()");
356 }
357
358 //=======================================================================
359 // Method OnGUIEvent pour Homard
360 //=======================================================================
361 bool HOMARDGUI::OnGUIEvent (int theCommandID)
362 {
363   MESSAGE("OnGUIEvent avec theCommandID = "<<theCommandID);
364 // A. Controles
365   SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( application() );
366   if ( !app ) return false;
367
368   SalomeApp_Study* stud = dynamic_cast<SalomeApp_Study*> ( app->activeStudy() );
369   if ( !stud )
370   {
371     MESSAGE ( "FAILED to cast active study to SalomeApp_Study" );
372     return false;
373   }
374
375   SUIT_Desktop* parent = application()->desktop();
376
377   HOMARD::HOMARD_Gen_var homardGen = HOMARDGUI::InitHOMARDGen(app);
378
379   if (!CORBA::is_nil(homardGen))
380     homardGen->UpdateStudy();
381
382   getApp()->updateObjectBrowser();
383
384 // B. Choix selon les commandes
385   SCRUTE(theCommandID);
386   switch (theCommandID)
387   {
388     case 1101: // Creation d un Cas
389     {
390       MESSAGE("command " << theCommandID << " activated");
391       MonCreateCase *aDlg = new MonCreateCase( true,
392                             HOMARD::HOMARD_Gen::_duplicate(homardGen) ) ;
393       aDlg->show();
394       break;
395     }
396
397     case 1102: // Poursuite d une iteration
398     {
399       MESSAGE("command " << theCommandID << " activated");
400       MonPursueIteration *aDlg = new MonPursueIteration( true,
401                                 HOMARD::HOMARD_Gen::_duplicate(homardGen) ) ;
402       aDlg->show();
403       break;
404     }
405
406     case 1103: // Creation d une Iteration
407     {
408       MESSAGE("command " << theCommandID << " activated avec objet " << _ObjectName.toStdString().c_str() );
409       MonCreateIteration *IterDlg = new MonCreateIteration( parent, true,
410                                      HOMARD::HOMARD_Gen::_duplicate(homardGen), _ObjectName ) ;
411       IterDlg->show();
412       break;
413     }
414
415     case 1111: // Compute une iteration
416     {
417       MESSAGE("command " << theCommandID << " activated avec objet " << _ObjectName.toStdString().c_str() );
418       try { homardGen->Compute(_ObjectName.toStdString().c_str(), 0, 1, -1, 1); }
419       catch( SALOME::SALOME_Exception& S_ex )
420       {
421         QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
422                                   QObject::tr(CORBA::string_dup(S_ex.details.text)) );
423         getApp()->updateObjectBrowser();
424         return false;
425       }
426       break;
427     }
428
429     case 1112: // Compute une iteration et publication
430     {
431       MESSAGE("command " << theCommandID << " activated avec objet " << _ObjectName.toStdString().c_str() );
432       try { homardGen->Compute(_ObjectName.toStdString().c_str(), 0, 1, -1, 2); }
433       catch( SALOME::SALOME_Exception& S_ex )
434       {
435         QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
436                                   QObject::tr(CORBA::string_dup(S_ex.details.text)) );
437         getApp()->updateObjectBrowser();
438         return false;
439       }
440       break;
441     }
442
443     case 1121: // Information sur le maillage de l'iteration
444     {
445       MESSAGE("command " << theCommandID << " activated avec objet " << _ObjectName.toStdString().c_str() );
446       MonIterInfo *IterDlg = new MonIterInfo( parent, true, HOMARD::HOMARD_Gen::_duplicate(homardGen), _ObjectName ) ;
447       IterDlg->show();
448       break;
449     }
450
451     case 1131: // Publication du maillage de l'iteration
452     {
453       MESSAGE("command " << theCommandID << " activated avec objet " << _ObjectName.toStdString().c_str() );
454       homardGen->PublishMeshIterInSmesh(_ObjectName.toStdString().c_str());
455       break;
456     }
457
458     case 1132: // Publication du maillage de l'iteration a partir du fichier
459     {
460       MESSAGE("command " << theCommandID << " activated avec objet " << _ObjectName.toStdString().c_str() );
461       homardGen->PublishResultInSmesh(_ObjectName.toStdString().c_str(), 1);
462       break;
463     }
464
465     case 1201: // Edition d'un objet
466     {
467       MESSAGE("command " << theCommandID << " activated");
468       QString nomObjet = HOMARD_QT_COMMUN::SelectionArbreEtude(QString(""), 1);
469       if (nomObjet == QString("")) break;
470       _PTR(SObject) obj = chercheMonObjet();
471       if (obj)
472       {
473         // Edition d'une frontiere CAO
474         if (HOMARD_UTILS::isBoundaryCAO(obj))
475         {
476           MonEditBoundaryCAO *aDlg = new MonEditBoundaryCAO(0, true, HOMARD::HOMARD_Gen::_duplicate(homardGen), QString(""), _ObjectName ) ;
477           aDlg->show();
478         }
479         // Edition d'une frontiere discrete
480         else if (HOMARD_UTILS::isBoundaryDi(obj))
481         {
482           MonEditBoundaryDi *aDlg = new MonEditBoundaryDi(0, true, HOMARD::HOMARD_Gen::_duplicate(homardGen), QString(""), _ObjectName ) ;
483           aDlg->show();
484         }
485         // Edition d'une frontiere analytique
486         else if (HOMARD_UTILS::isBoundaryAn(obj))
487         {
488           MonEditBoundaryAn *aDlg = new MonEditBoundaryAn(0, true, HOMARD::HOMARD_Gen::_duplicate(homardGen), QString(""), _ObjectName ) ;
489           aDlg->show();
490         }
491         // Edition d'un cas
492         else if (HOMARD_UTILS::isCase(obj))
493         {
494           MonEditCase *aDlg = new MonEditCase(true, HOMARD::HOMARD_Gen::_duplicate(homardGen), _ObjectName ) ;
495           aDlg->show();
496         }
497         // Edition d'une hypothese
498         else if (HOMARD_UTILS::isHypo(obj))
499         {
500           MonEditHypothesis *aDlg = new MonEditHypothesis(0, true, HOMARD::HOMARD_Gen::_duplicate(homardGen),  _ObjectName, QString(""), QString("")) ;
501           aDlg->show();
502         }
503         // Edition d'une iteration
504         else if (HOMARD_UTILS::isIter(obj))
505         {
506           MonEditIteration *aDlg = new MonEditIteration(parent, true, HOMARD::HOMARD_Gen::_duplicate(homardGen), QString(""), _ObjectName ) ;
507           aDlg->show();
508         }
509         // Edition d'un schema YACS
510         else if (HOMARD_UTILS::isYACS(obj))
511         {
512           MESSAGE("appel de MonEditYACS");
513           MonEditYACS *aDlg = new MonEditYACS(true, HOMARD::HOMARD_Gen::_duplicate(homardGen), _ObjectName) ;
514           aDlg->show();
515         }
516         // Edition d'une zone
517         else if (HOMARD_UTILS::isZone(obj))
518         {
519           MonEditZone *aDlg = new MonEditZone(0, true, HOMARD::HOMARD_Gen::_duplicate(homardGen), QString(""), _ObjectName ) ;
520           aDlg->show();
521         }
522       }
523       break;
524     }
525
526     case 1211: // Suppression d'un objet
527     {
528       MESSAGE("command " << theCommandID << " activated");
529       QString nomObjet = HOMARD_QT_COMMUN::SelectionArbreEtude(QString(""), 1);
530       if (nomObjet == QString("")) break;
531       _PTR(SObject) obj = chercheMonObjet();
532       if (obj)
533       {
534         // Suppression d'une frontiere
535         if ( HOMARD_UTILS::isBoundaryCAO(obj) || HOMARD_UTILS::isBoundaryDi(obj) || HOMARD_UTILS::isBoundaryAn(obj) )
536         {
537           try
538           { homardGen->DeleteBoundary(_ObjectName.toStdString().c_str()); }
539           catch( SALOME::SALOME_Exception& S_ex )
540           {
541             QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
542                                       QObject::tr(CORBA::string_dup(S_ex.details.text)) );
543             getApp()->updateObjectBrowser();
544             return false;
545           }
546         }
547         // Suppression d'un cas
548         else if (HOMARD_UTILS::isCase(obj))
549         {
550           try
551           { homardGen->DeleteCase(_ObjectName.toStdString().c_str(), 1); }
552           catch( SALOME::SALOME_Exception& S_ex )
553           {
554             QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
555                                       QObject::tr(CORBA::string_dup(S_ex.details.text)) );
556             getApp()->updateObjectBrowser();
557             return false;
558           }
559         }
560         // Suppression d'une hypothese
561         else if (HOMARD_UTILS::isHypo(obj))
562         {
563           try
564           { homardGen->DeleteHypo(_ObjectName.toStdString().c_str()); }
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             getApp()->updateObjectBrowser();
570             return false;
571           }
572         }
573         // Suppression d'une iteration
574         else if (HOMARD_UTILS::isIter(obj))
575         {
576           try
577           { homardGen->DeleteIteration(_ObjectName.toStdString().c_str(), 1); }
578           catch( SALOME::SALOME_Exception& S_ex )
579           {
580             QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
581                                       QObject::tr(CORBA::string_dup(S_ex.details.text)) );
582             getApp()->updateObjectBrowser();
583             return false;
584           }
585         }
586         // Suppression d'un schema YACS
587         else if (HOMARD_UTILS::isYACS(obj))
588         {
589           try
590           { homardGen->DeleteYACS(_ObjectName.toStdString().c_str(), 1); }
591           catch( SALOME::SALOME_Exception& S_ex )
592           {
593             QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
594                                       QObject::tr(CORBA::string_dup(S_ex.details.text)) );
595             getApp()->updateObjectBrowser();
596             return false;
597           }
598         }
599         // Suppression d'une zone
600         else if (HOMARD_UTILS::isZone(obj))
601         {
602           try
603           { homardGen->DeleteZone(_ObjectName.toStdString().c_str()); }
604           catch( SALOME::SALOME_Exception& S_ex )
605           {
606             QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
607                                       QObject::tr(CORBA::string_dup(S_ex.details.text)) );
608             getApp()->updateObjectBrowser();
609             return false;
610           }
611         }
612       }
613       break;
614     }
615
616     case 1301: // Information sur un maillage
617     {
618       MESSAGE("etape 1301")
619       MESSAGE("command " << theCommandID << " activated");
620       MonMeshInfo *aDlg = new MonMeshInfo( parent, true, HOMARD::HOMARD_Gen::_duplicate(homardGen) ) ;
621       aDlg->show();
622       break;
623     }
624
625     case 1302: // Affichage de fichier texte
626     {
627       MESSAGE("command " << theCommandID << " activated avec objet " << _ObjectName.toStdString().c_str() );
628       _PTR(SObject) obj = chercheMonObjet();
629       if ( (obj) && ( HOMARD_UTILS::isFileType(obj,QString("log")) || HOMARD_UTILS::isFileType(obj,QString("Summary")) || HOMARD_UTILS::isFileType(obj,QString("xml")) ) )
630       {
631           MonEditFile *aDlg = new MonEditFile( 0, true, HOMARD::HOMARD_Gen::_duplicate(homardGen), _ObjectName, 0 ) ;
632           if ( aDlg->_codret == 0 ) { aDlg->show(); }
633       }
634       break;
635     }
636
637     case 1401: // Création d'un schema YACS
638     {
639       MESSAGE("etape 1401")
640       MESSAGE("command " << theCommandID << " activated avec objet " << _ObjectName.toStdString().c_str() );
641       MonCreateYACS *aDlg = new MonCreateYACS( true, HOMARD::HOMARD_Gen::_duplicate(homardGen), _ObjectName ) ;
642       aDlg->show();
643       break;
644     }
645
646     case 1402: // Ecriture d'un schéma YACS
647     {
648       MESSAGE("etape 1402")
649       MESSAGE("command " << theCommandID << " activated avec objet " << _ObjectName.toStdString().c_str() );
650       try { homardGen->YACSWrite(_ObjectName.toStdString().c_str()); }
651       catch( SALOME::SALOME_Exception& S_ex )
652       {
653         QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
654                                   QObject::tr(CORBA::string_dup(S_ex.details.text)) );
655         getApp()->updateObjectBrowser();
656         return false;
657       }
658       break;
659     }
660
661   }
662   getApp()->updateObjectBrowser();
663   return true;
664 }
665
666 //=============================================================================
667 /*!
668  *
669  */
670 //=============================================================================
671
672 // Module's engine IOR
673 //=============================================================================
674 QString HOMARDGUI::engineIOR() const
675 //=============================================================================
676 {
677   CORBA::String_var anIOR = getApp()->orb()->object_to_string( InitHOMARDGen(getApp()) );
678   return QString( anIOR.in() );
679 }
680
681 // Module's activation
682 //=============================================================================
683 bool HOMARDGUI::activateModule( SUIT_Study* theStudy )
684 //=============================================================================
685 {
686   bool bOk = SalomeApp_Module::activateModule( theStudy );
687
688   setMenuShown( true );
689   setToolShown( true );
690
691   return bOk;
692 }
693
694 // Module's deactivation
695 //=============================================================================
696 bool HOMARDGUI::deactivateModule( SUIT_Study* theStudy )
697 //=============================================================================
698 {
699   setMenuShown( false );
700   setToolShown( false );
701
702   return SalomeApp_Module::deactivateModule( theStudy );
703 }
704
705 // Default windows
706 //=============================================================================
707 void HOMARDGUI::windows( QMap<int, int>& theMap ) const
708 //=============================================================================
709 {
710   theMap.clear();
711   theMap.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea );
712 #ifndef DISABLE_PYCONSOLE
713   theMap.insert( SalomeApp_Application::WT_PyConsole,     Qt::BottomDockWidgetArea );
714 #endif
715 }
716
717 //=============================================================================
718 void HOMARDGUI::setOrb()
719 //=============================================================================
720 {
721   try
722   {
723      _orb = KERNEL::GetRefToORB();
724   }
725   catch (...)
726   {
727      INFOS("internal error : orb not found");
728      _orb = 0;
729   }
730             ASSERT(! CORBA::is_nil(_orb));
731 }
732 //========================================
733 _PTR(SObject) HOMARDGUI::chercheMonObjet()
734 //========================================
735 {
736   SALOMEDSClient_SObject* aSO = NULL;
737   _PTR(SObject) obj;
738   SALOME_ListIO lst;
739   getApp()->selectionMgr()->selectedObjects( lst );
740   if (  lst.Extent() == 1 )
741   {
742     Handle(SALOME_InteractiveObject) io = lst.First();
743     SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
744     _PTR(Study) study = appStudy->studyDS();
745     _PTR(SObject) obj = study->FindObjectID( io->getEntry() );
746     _ObjectName = QString( obj->GetName().c_str() );
747     return obj;
748   }
749   else { return _PTR(SObject)(aSO); }
750 }
751 //=============================================================================
752 void HOMARDGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& title )
753 //=============================================================================
754 {
755   MESSAGE("Debut de contextMenuPopup");
756   _PTR(SObject) obj = chercheMonObjet();
757   if ( obj )
758   {
759     title = QString( obj->GetName().c_str() );
760     _ObjectName = title;
761     SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
762 //
763     QPixmap pix ;
764     bool DeleteObject = false ;
765     bool EditObject = false ;
766 //
767     if ( HOMARD_UTILS::isBoundaryCAO(obj) )
768     {
769       EditObject = true ;
770       DeleteObject = true ;
771     }
772     else if ( HOMARD_UTILS::isBoundaryAn(obj) )
773     {
774       EditObject = true ;
775       DeleteObject = true ;
776     }
777     else if ( HOMARD_UTILS::isBoundaryDi(obj) )
778     {
779       EditObject = true ;
780       DeleteObject = true ;
781     }
782     else if ( HOMARD_UTILS::isCase(obj) )
783     {
784       pix = resMgr->loadPixmap( "HOMARD", "table_view.png" );
785       menu->addAction(QIcon(pix), tr(QString("HOM_MEN_YACS").toLatin1().data()), this, SLOT(YACSCreate()));
786       EditObject = true ;
787       DeleteObject = true ;
788     }
789     else if ( HOMARD_UTILS::isHypo(obj) )
790     {
791       EditObject = true ;
792       DeleteObject = true ;
793     }
794     else if ( HOMARD_UTILS::isIter(obj) )
795     {
796       pix = resMgr->loadPixmap( "HOMARD", "iter_next.png" );
797       menu->addAction(QIcon(pix), tr(QString("HOM_MEN_NEW_ITERATION").toLatin1().data()), this, SLOT(NextIter()));
798       pix = resMgr->loadPixmap( "HOMARD", "mesh_compute.png" );
799       menu->addAction(QIcon(pix), tr(QString("HOM_MEN_COMPUTE").toLatin1().data()), this, SLOT(LanceCalcul0()));
800       pix = resMgr->loadPixmap( "HOMARD", "mesh_compute.png" );
801       menu->addAction(QIcon(pix), tr(QString("HOM_MEN_COMPUTE_PUBLISH").toLatin1().data()), this, SLOT(LanceCalcul1()));
802       pix = resMgr->loadPixmap( "HOMARD", "advanced_mesh_info.png" );
803       menu->addAction(QIcon(pix), tr(QString("HOM_MEN_MESH_INFO").toLatin1().data()), this, SLOT(IterInfo()));
804       pix = resMgr->loadPixmap( "HOMARD", "mesh_tree_mesh.png" );
805       menu->addAction(QIcon(pix), tr(QString("HOM_MEN_MESH_PUBLICATION").toLatin1().data()), this, SLOT(MeshPublish0()));
806       EditObject = true ;
807       DeleteObject = true ;
808     }
809     else if ( HOMARD_UTILS::isYACS(obj) )
810     {
811       pix = resMgr->loadPixmap( "HOMARD", "write.png" );
812       menu->addAction(QIcon(pix), tr(QString("HOM_MEN_WRITE").toLatin1().data()), this, SLOT(YACSWrite()));
813       EditObject = true ;
814       DeleteObject = true ;
815     }
816     else if ( HOMARD_UTILS::isZone(obj) )
817     {
818       EditObject = true ;
819       DeleteObject = true ;
820     }
821     else if ( HOMARD_UTILS::isFileType(obj,QString("log")) || HOMARD_UTILS::isFileType(obj,QString("Summary")) || HOMARD_UTILS::isFileType(obj,QString("xml")) )
822     {
823       pix = resMgr->loadPixmap( "HOMARD", "texte.png" );
824       menu->addAction(QIcon(pix), tr(QString("HOM_MEN_EDIT_MESS_FILE").toLatin1().data()), this, SLOT(EditAsciiFile()));
825     }
826     else if ( HOMARD_UTILS::isFileType(obj,QString("Mesh")) )
827     {
828       pix = resMgr->loadPixmap( "HOMARD", "mesh_tree_mesh.png" );
829       menu->addAction(QIcon(pix), tr(QString("HOM_MEN_MESH_PUBLICATION").toLatin1().data()), this, SLOT(MeshPublish1()));
830     }
831 //  Ajout d'un menu d'edition pour les objets qui le proposent
832     if ( EditObject )
833     {
834       pix = resMgr->loadPixmap( "HOMARD", "loop.png" );
835       menu->addAction(QIcon(pix), tr(QString("HOM_MEN_EDIT").toLatin1().data()), this, SLOT(Edit()));
836     }
837 //  Ajout d'un menu de destruction pour les objets qui le proposent
838     if ( DeleteObject )
839     {
840       pix = resMgr->loadPixmap( "HOMARD", "delete.png" );
841       menu->addAction(QIcon(pix), tr(QString("HOM_MEN_DELETE").toLatin1().data()), this, SLOT(Delete()));
842     }
843   }
844 }
845
846 void HOMARDGUI::NextIter()
847 {
848   this->OnGUIEvent(1103);
849 }
850
851 void HOMARDGUI::LanceCalcul0()
852 {
853   this->OnGUIEvent(1111);
854 }
855
856 void HOMARDGUI::LanceCalcul1()
857 {
858   this->OnGUIEvent(1112);
859 }
860
861 void HOMARDGUI::IterInfo()
862 {
863   this->OnGUIEvent(1121);
864 }
865
866 void HOMARDGUI::MeshPublish0()
867 {
868   this->OnGUIEvent(1131);
869 }
870
871 void HOMARDGUI::MeshPublish1()
872 {
873   this->OnGUIEvent(1132);
874 }
875
876 void HOMARDGUI::Edit()
877 {
878   this->OnGUIEvent(1201);
879 }
880
881 void HOMARDGUI::Delete()
882 {
883   this->OnGUIEvent(1211);
884 }
885
886 void HOMARDGUI::EditAsciiFile()
887 {
888   this->OnGUIEvent(1302);
889 }
890
891 void HOMARDGUI::YACSCreate()
892 {
893   this->OnGUIEvent(1401);
894 }
895 void HOMARDGUI::YACSWrite()
896 {
897   this->OnGUIEvent(1402);
898 }
899
900
901 //
902 //=============================================================================
903 // Export the module
904 //=============================================================================
905 extern "C" {
906   Standard_EXPORT CAM_Module* createModule()
907   {
908     return new HOMARDGUI("");
909   }
910 }
911