]> SALOME platform Git repositories - modules/homard.git/blob - src/HOMARDGUI/HOMARDGUI.cxx
Salome HOME
Fix problems of 'make distcheck'
[modules/homard.git] / src / HOMARDGUI / HOMARDGUI.cxx
1 //  File   : HOMARDGUI.cxx
2 //  Author : Paul RASCLE, EDF
3 //  Module : HOMARD
4
5 using namespace std;
6 #include "HOMARDGUI.h"
7
8 // SALOME Includes
9 #include "Utils_ORB_INIT.hxx"
10 #include "Utils_SINGLETON.hxx"
11 #include "SALOME_LifeCycleCORBA.hxx"
12
13 #include "SUIT_ResourceMgr.h"
14 #include "SUIT_MessageBox.h"
15 #include "SUIT_Session.h"
16 #include "SUIT_ViewWindow.h"
17 #include "SUIT_ViewManager.h"
18 #include <SUIT_Desktop.h>
19
20 #include "CAM_Module.h"
21 #include "OB_Browser.h"
22
23 #include "SALOME_ListIO.hxx"
24 #include "SALOME_ListIteratorOfListIO.hxx"
25
26 #include "SalomeApp_Application.h"
27 #include "SalomeApp_DataModel.h"
28 #include "SalomeApp_Study.h"
29 #include "LightApp_SelectionMgr.h"
30 #include "LightApp_Selection.h"
31 #include <LightApp_Preferences.h>
32 #include "SalomeApp_Module.h"
33 #include "SALOMEconfig.h"
34 #include <SALOME_LifeCycleCORBA.hxx>
35
36 #include <utilities.h>
37
38
39 // QT Includes
40 #include <QMenu>
41 #include "MonCreateCase.h"
42 #include "MonCreateIteration.h"
43 #include "MonEditFile.h"
44 #include "MonEditCase.h"
45 #include "MonEditIteration.h"
46 #include "MonEditHypothesis.h"
47 #include "MonEditZone.h"
48 #include "MonEditBoundaryAn.h"
49 #include "MonEditBoundaryDi.h"
50 #include "HomardQtCommun.h"
51
52 // BOOST Includes
53 #include <boost/shared_ptr.hpp>
54
55 //Pour le _CAST
56 #include "SALOMEDS_Study.hxx"
57 #include "HOMARDGUI_Utils.h"
58
59 static CORBA::ORB_var _orb;
60
61 //=======================================================================
62 // function : HOMARDGUI()
63 // purpose  : Constructor
64 //=======================================================================
65 HOMARDGUI::HOMARDGUI(const QString&) :
66            SalomeApp_Module( "HOMARD" ), // default name
67            LightApp_Module( "HOMARD" )
68 {
69 }
70
71
72 //=======================================================================
73 // function : ~HOMARDGUI()
74 // purpose  : Destructor
75 //=======================================================================
76 HOMARDGUI::~HOMARDGUI()
77 {
78 }
79
80 //=======================================================================
81 // function : InitHOMARDGen
82 // launch HOMARD component and return a handle
83 //=======================================================================
84 HOMARD::HOMARD_Gen_var HOMARDGUI::InitHOMARDGen(SalomeApp_Application* app)
85 {
86   Engines::EngineComponent_var comp = app->lcc()->FindOrLoad_Component( "FactoryServer","HOMARD" );
87   HOMARD::HOMARD_Gen_var clr = HOMARD::HOMARD_Gen::_narrow(comp);
88   ASSERT(!CORBA::is_nil(clr));
89   return clr;
90 }
91
92 //=======================================================================
93 // Module's initialization
94 void HOMARDGUI::initialize( CAM_Application* app )
95 //=======================================================================
96 {
97   SalomeApp_Module::initialize( app );
98   InitHOMARDGen(dynamic_cast<SalomeApp_Application*>( app ));
99   anId = 0;
100   createActions();
101   createMenus();
102 }
103
104 //================================================
105 // function : createHOMARDAction
106 // create an item in status bar and Homard menu
107 //================================================
108 void HOMARDGUI::createHOMARDAction( const int id, const QString& po_id, const QString& icon_id, const int key, const bool toggle  )
109 {
110   MESSAGE("HOMARDGUI::createHOMARDAction");
111   QIcon icon;
112   QWidget* parent = application()->desktop();
113   SUIT_ResourceMgr* resMgr = application()->resourceMgr();
114   QPixmap pix;
115   if ( icon_id.length() )
116      pix = resMgr->loadPixmap( "HOMARD", tr( icon_id .toLatin1().data()) );
117   else
118      pix = resMgr->loadPixmap( "HOMARD", tr( QString( "ICO_%1" ).arg( po_id ).toLatin1().data()), false );
119   if ( !pix.isNull() )
120       icon = QIcon( pix );
121
122   QString tooltip    = tr(QString( "HOM_TOP_%1" ).arg( po_id ).toLatin1().data()),
123           menu       = tr(QString( "HOM_MEN_%1" ).arg( po_id ).toLatin1().data()),
124           status_bar = tr(QString( "HOM_STB_%1" ).arg( po_id ).toLatin1().data());
125
126   createAction( id, tooltip, icon, menu, status_bar, key, parent, toggle, this, SLOT( OnGUIEvent() )  );
127 }
128
129 //================================================
130 // function : createAction
131 // constructs Homard menu
132 // calls createHOMARDAction for each item
133 //================================================
134 void HOMARDGUI::createActions(){
135 //
136   createHOMARDAction( 1101, "NEW_CASE",       "cas_calcule.png"  );
137   createHOMARDAction( 1102, "NEW_ITERATION",  "iter_next.png"    );
138   createHOMARDAction( 1111, "COMPUTE",        "mesh_compute.png" );
139   createHOMARDAction( 1120, "EDIT_CASE",      "whatis.png"       );
140   createHOMARDAction( 1121, "EDIT_ITERATION", "whatis.png"       );
141   createHOMARDAction( 1122, "EDIT_HYPO",      "whatis.png"       );
142   createHOMARDAction( 1123, "EDIT_ZONE",      "whatis.png"       );
143   createHOMARDAction( 1124, "EDIT_BOUNDARY",  "whatis.png"       );
144   createHOMARDAction( 1130, "EDIT_MESS_FILE", "texte.png"        );
145 //
146 }
147
148 //================================================
149 // function : createPreferences
150 // No preferences for Homard
151 // Just a test
152 //================================================
153 void HOMARDGUI::createPreferences(){
154    QString toto = tr( "PREF_GROUP_GENERAL" );
155    int tabId  = addPreference( tr( "PREF_GROUP_GENERAL" ) );
156    int genGroup = addPreference( tr( "PREF_TAB_SETTINGS" ), tabId );
157    addPreference( tr( "PREF_TEST" ), genGroup, LightApp_Preferences::Color, "Homard", "shading_color" );
158 }
159
160
161 //================================================
162 // function : createMenus
163 //                Verifier l'avant dernier nombre passe en parametre
164 //================================================
165 void HOMARDGUI::createMenus(){
166   MESSAGE("HOMARDGUI::createMenus")
167   int HOMARD_Id  = createMenu( tr( "HOMARD" ),  -1,  5, 10 );
168   createMenu( 1101, HOMARD_Id, -1 ); //Create_Case
169   createMenu( 1102, HOMARD_Id, -1 ); //Create_Iteration
170   createMenu( 1111, HOMARD_Id, -1 ); //COMPUTE
171   createMenu( separator(), HOMARD_Id,-1);
172   createMenu( 1120, HOMARD_Id, -1 ); //Edit_Case
173   createMenu( 1121, HOMARD_Id, -1 ); //Edit_Iteration
174   createMenu( 1122, HOMARD_Id, -1 ); //Edit Hypo
175   createMenu( 1123, HOMARD_Id, -1 ); //Edit_Zone
176   createMenu( 1124, HOMARD_Id, -1 ); //Edit_Boundary
177   createMenu( separator(), HOMARD_Id,-1);
178   createMenu( 1130, HOMARD_Id, -1 ); //EditAsciiFile pour le fichier listeStd ou bilan
179 }
180
181 //================================================
182 void HOMARDGUI::OnGUIEvent()
183 //================================================
184 {
185   MESSAGE("HOMARDGUI::OnGUIEvent()")
186   setOrb();
187   const QObject* obj = sender();
188   if ( !obj || !obj->inherits( "QAction" ) )
189        return;
190   int id = actionId((QAction*)obj);
191   bool ret;
192   if ( id != -1 )
193       ret = OnGUIEvent( id );
194   MESSAGE("************** End of HOMARDGUI::OnGUIEvent()");
195 }
196
197 //=======================================================================
198 // Method OnGUIEvent pour Homard
199 //=======================================================================
200 bool HOMARDGUI::OnGUIEvent (int theCommandID)
201 {
202   MESSAGE("HOMARDGUI::OnGUIEvent(int)");
203   SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( application() );
204   if ( !app ) return false;
205
206   SalomeApp_Study* stud = dynamic_cast<SalomeApp_Study*> ( app->activeStudy() );
207   if ( !stud ) {
208     MESSAGE ( "FAILED to cast active study to SalomeApp_Study" );
209     return false;
210   }
211
212   SUIT_Desktop* parent = application()->desktop();
213   HOMARD::HOMARD_Gen_var homardGen = HOMARDGUI::InitHOMARDGen(app);
214
215   if (!CORBA::is_nil(homardGen))
216   {
217     // Set current study
218     SalomeApp_Study* aSAStudy =dynamic_cast<SalomeApp_Study*>(app->activeStudy());
219     _PTR(Study) aStudy = aSAStudy->studyDS();
220     SALOMEDS::Study_ptr aStudyDS;
221     if (aStudy)
222       aStudyDS = _CAST(Study,aStudy)->GetStudy();
223       homardGen->SetCurrentStudy(aStudyDS);
224    }
225   getApp()->updateObjectBrowser();
226
227   SCRUTE(theCommandID);
228   switch (theCommandID)
229   {
230     case 1101: // Creation d un Cas
231     {
232       MESSAGE("etape 1101")
233       MESSAGE("command " << theCommandID << " activated");
234       MonCreateCase *aDlg = new MonCreateCase( parent, TRUE,
235                             HOMARD::HOMARD_Gen::_duplicate(homardGen) ) ;
236       aDlg->show();
237       break;
238     }
239
240     case 1102: // Creation d une Iteration
241     {
242       MESSAGE("command " << theCommandID << " activated");
243       QString IterParentName=HOMARD_QT_COMMUN::SelectionArbreEtude(QString("IterationHomard"), 0);
244       MESSAGE("IterParentName " << IterParentName.toStdString().c_str() << " choisi dans arbre");
245       MonCreateIteration *IterDlg = new MonCreateIteration( parent, true,
246                                      HOMARD::HOMARD_Gen::_duplicate(homardGen), IterParentName ) ;
247       IterDlg->show();
248       break;
249     }
250
251     case 1111: // Compute une Iteration
252     {
253       MESSAGE("command " << theCommandID << " activated");
254       QString monIter=HOMARD_QT_COMMUN::SelectionArbreEtude(QString("IterationHomard"), 1);
255       if (monIter == QString("")) break;
256       try
257       {
258         homardGen->Compute(monIter.toStdString().c_str(), 0);
259       }
260       catch( SALOME::SALOME_Exception& S_ex )
261       {
262         QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
263                                   QString(CORBA::string_dup(S_ex.details.text)) );
264         getApp()->updateObjectBrowser();
265         return false;
266       }
267       break;
268     }
269
270     case 1120: // Edition d un cas
271     {
272       MESSAGE("command " << theCommandID << " activated avec objet " << _ObjectName.toStdString().c_str() );
273       _PTR(SObject) obj = chercheMonObjet();
274       if ((obj) and (HOMARD_UTILS::isCase(obj)))
275       {
276           MonEditCase *aDlg = new MonEditCase(parent, true, HOMARD::HOMARD_Gen::_duplicate(homardGen), _ObjectName ) ;
277           aDlg->show();
278       }
279     }
280
281     case 1121: // Edition d une iteration
282     {
283       MESSAGE("command " << theCommandID << " activated avec objet " << _ObjectName.toStdString().c_str() );
284       _PTR(SObject) obj = chercheMonObjet();
285       if ((obj) and (HOMARD_UTILS::isIter(obj)))
286       {
287           MonEditIteration *aDlg = new MonEditIteration(parent, true, HOMARD::HOMARD_Gen::_duplicate(homardGen), QString(""), _ObjectName ) ;
288           aDlg->show();
289       }
290     }
291
292     case 1122: // Edition d une hypothese
293     {
294       MESSAGE("command " << theCommandID << " activated avec objet " << _ObjectName.toStdString().c_str() );
295       _PTR(SObject) obj = chercheMonObjet();
296       if ((obj) and (HOMARD_UTILS::isHypo(obj)))
297       {
298           MonEditHypothesis *aDlg = new MonEditHypothesis(0, true, HOMARD::HOMARD_Gen::_duplicate(homardGen),  _ObjectName, QString(""), QString("")) ;
299           aDlg->show();
300       }
301     }
302
303     case 1123: // Edition d une zone
304     {
305       MESSAGE("command " << theCommandID << " activated avec objet " << _ObjectName.toStdString().c_str() );
306       _PTR(SObject) obj = chercheMonObjet();
307       if ((obj) and (HOMARD_UTILS::isZone(obj)))
308       {
309           MonEditZone *aDlg = new MonEditZone(0, TRUE, HOMARD::HOMARD_Gen::_duplicate(homardGen), QString(""), _ObjectName ) ;
310           aDlg->show();
311       }
312     }
313
314     case 1124: // Edition d une frontiere
315     {
316       MESSAGE("command " << theCommandID << " activated avec objet " << _ObjectName.toStdString().c_str() );
317       _PTR(SObject) obj = chercheMonObjet();
318       if ((obj))
319       {
320           if (HOMARD_UTILS::isBoundaryDi(obj))
321           {
322               MESSAGE(".. Lancement de MonEditBoundaryDi" );
323               MonEditBoundaryDi *aDlg = new MonEditBoundaryDi(0, TRUE, HOMARD::HOMARD_Gen::_duplicate(homardGen), QString(""), _ObjectName ) ;
324               aDlg->show();
325           }
326           if (HOMARD_UTILS::isBoundaryAn(obj))
327           {
328               MESSAGE(".. Lancement de MonEditBoundaryAn" );
329               MonEditBoundaryAn *aDlg = new MonEditBoundaryAn(0, TRUE, HOMARD::HOMARD_Gen::_duplicate(homardGen), QString(""), _ObjectName ) ;
330               aDlg->show();
331           }
332       }
333     }
334
335     case 1130: // Edition du fichier mess
336     {
337       MESSAGE("command " << theCommandID << " activated avec objet " << _ObjectName.toStdString().c_str() );
338       _PTR(SObject) obj = chercheMonObjet();
339       if ((obj) and ((HOMARD_UTILS::isFileMess(obj) or HOMARD_UTILS::isFileSummary(obj))))
340       {
341           MonEditFile *aDlg = new MonEditFile( 0, true, HOMARD::HOMARD_Gen::_duplicate(homardGen), _ObjectName ) ;
342           aDlg->show();
343       }
344      }
345   }
346   getApp()->updateObjectBrowser();
347   return true;
348 }
349
350 //=============================================================================
351 /*!
352  *
353  */
354 //=============================================================================
355
356 // Module's engine IOR
357 //=============================================================================
358 QString HOMARDGUI::engineIOR() const
359 //=============================================================================
360 {
361   CORBA::String_var anIOR = getApp()->orb()->object_to_string( InitHOMARDGen(getApp()) );
362   return QString( anIOR.in() );
363 }
364
365 // Module's activation
366 //=============================================================================
367 bool HOMARDGUI::activateModule( SUIT_Study* theStudy )
368 //=============================================================================
369 {
370   bool bOk = SalomeApp_Module::activateModule( theStudy );
371
372   setMenuShown( true );
373   setToolShown( true );
374
375   return bOk;
376 }
377
378 // Module's deactivation
379 //=============================================================================
380 bool HOMARDGUI::deactivateModule( SUIT_Study* theStudy )
381 //=============================================================================
382 {
383   setMenuShown( false );
384   setToolShown( false );
385
386   return SalomeApp_Module::deactivateModule( theStudy );
387 }
388
389 // Default windows
390 //=============================================================================
391 void HOMARDGUI::windows( QMap<int, int>& theMap ) const
392 //=============================================================================
393 {
394   theMap.clear();
395   theMap.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea );
396   theMap.insert( SalomeApp_Application::WT_PyConsole,     Qt::BottomDockWidgetArea );
397 }
398
399 //=============================================================================
400 void HOMARDGUI::setOrb()
401 //=============================================================================
402 {
403   try
404   {
405      ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance();
406      ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting());
407      _orb = init( 0 , 0 );
408   }
409   catch (...)
410   {
411      INFOS("internal error : orb not found");
412      _orb = 0;
413   }
414             ASSERT(! CORBA::is_nil(_orb));
415 }
416 //========================================
417 _PTR(SObject) HOMARDGUI::chercheMonObjet()
418 //========================================
419 {
420
421     SALOMEDSClient_SObject* aSO = NULL;
422     _PTR(SObject) obj;
423     SALOME_ListIO lst;
424     getApp()->selectionMgr()->selectedObjects( lst );
425     if (  lst.Extent() == 1 )
426     {
427         Handle(SALOME_InteractiveObject) io = lst.First();
428         SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
429         _PTR(Study) study = appStudy->studyDS();
430         _PTR(SObject) obj = study->FindObjectID( io->getEntry() );
431         _ObjectName = QString( obj->GetName().c_str() );
432         return obj;
433      }
434      else
435          return _PTR(SObject)(aSO);
436 }
437 //=============================================================================
438 void HOMARDGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& title )
439 //=============================================================================
440 {
441   MESSAGE("Debut de HOMARDGUI::contextMenuPopup");
442   _PTR(SObject) obj = chercheMonObjet();
443   if ( obj )
444   {
445     title = QString( obj->GetName().c_str() );
446     _ObjectName = title;
447     SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
448 //
449     if ( HOMARD_UTILS::isBoundaryAn(obj) )
450     {
451       QPixmap pix = resMgr->loadPixmap( "HOMARD", "whatis.png" );
452       menu->addAction(QIcon(pix), tr(QString("HOM_MEN_EDIT_BOUNDARY").toLatin1().data()), this,SLOT(EditBoDi()));
453     }
454     else if ( HOMARD_UTILS::isBoundaryDi(obj) )
455     {
456       QPixmap pix = resMgr->loadPixmap( "HOMARD", "whatis.png" );
457       menu->addAction(QIcon(pix), tr(QString("HOM_MEN_EDIT_BOUNDARY").toLatin1().data()), this,SLOT(EditBoDi()));
458     }
459     else if ( HOMARD_UTILS::isZone(obj) )
460     {
461       QPixmap pix = resMgr->loadPixmap( "HOMARD", "whatis.png" );
462       menu->addAction(QIcon(pix), tr(QString("HOM_MEN_EDIT_ZONE").toLatin1().data()), this,SLOT(EditZone()));
463     }
464     else if ( HOMARD_UTILS::isHypo(obj) )
465     {
466       QPixmap pix = resMgr->loadPixmap( "HOMARD", "whatis.png" );
467       menu->addAction(QIcon(pix), tr(QString("HOM_MEN_EDIT_HYPO").toLatin1().data()), this,SLOT(EditHypo()));
468     }
469     else if ( HOMARD_UTILS::isIter(obj) )
470     {
471       QPixmap pix = resMgr->loadPixmap( "HOMARD", "iter_next.png" );
472       menu->addAction(QIcon(pix), tr(QString("HOM_MEN_NEW_ITERATION").toLatin1().data()), this,SLOT(NextIter()));
473       QPixmap pix1 = resMgr->loadPixmap( "HOMARD", "whatis.png" );
474       menu->addAction(QIcon(pix1), tr(QString("HOM_MEN_EDIT_ITERATION").toLatin1().data()), this,SLOT(EditIter()));
475       QPixmap pix2 = resMgr->loadPixmap( "HOMARD", "mesh_compute.png" );
476       menu->addAction(QIcon(pix2), tr(QString("HOM_MEN_COMPUTE").toLatin1().data()), this,SLOT(LanceCalcul()));
477     }
478     else if ( HOMARD_UTILS::isCase(obj) )
479     {
480       QPixmap pix = resMgr->loadPixmap( "HOMARD", "whatis.png" );
481       menu->addAction(QIcon(pix), tr(QString("HOM_MEN_EDIT_CASE").toLatin1().data()), this,SLOT(EditCase()));
482     }
483     else if ( HOMARD_UTILS::isFileMess(obj) or HOMARD_UTILS::isFileSummary(obj) )
484     {
485       QPixmap pix = resMgr->loadPixmap( "HOMARD", "texte.png" );
486       menu->addAction(QIcon(pix), tr(QString("HOM_MEN_EDIT_MESS_FILE").toLatin1().data()), this,SLOT(EditAsciiFile()));
487     }
488   }
489 }
490
491 void HOMARDGUI::NextIter()
492 {
493   this->OnGUIEvent(1102);
494 }
495
496 void HOMARDGUI::LanceCalcul()
497 {
498   this->OnGUIEvent(1111);
499 }
500
501 void HOMARDGUI::EditCase()
502 {
503   this->OnGUIEvent(1120);
504 }
505
506 void HOMARDGUI::EditIter()
507 {
508   this->OnGUIEvent(1121);
509 }
510
511 void HOMARDGUI::EditHypo()
512 {
513   this->OnGUIEvent(1122);
514 }
515
516 void HOMARDGUI::EditZone()
517 {
518   this->OnGUIEvent(1123);
519 }
520
521 void HOMARDGUI::EditBoDi()
522 {
523   this->OnGUIEvent(1124);
524 }
525
526 void HOMARDGUI::EditAsciiFile()
527 {
528   this->OnGUIEvent(1130);
529 }
530 //
531 //=============================================================================
532 // Export the module
533 //=============================================================================
534 extern "C" {
535   Standard_EXPORT CAM_Module* createModule()
536   {
537     return new HOMARDGUI("");
538   }
539 }
540