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