]> SALOME platform Git repositories - modules/homard.git/blob - src/HOMARDGUI/HOMARDGUI.cxx
Salome HOME
23776674ed8dc26e1bc5ee931f32047b7217c0fd
[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 {
87 }
88
89
90 //=======================================================================
91 // function : ~HOMARDGUI()
92 // purpose  : Destructor
93 //=======================================================================
94 HOMARDGUI::~HOMARDGUI()
95 {
96 }
97
98 //=======================================================================
99 // function : InitHOMARDGen
100 // launch HOMARD component and return a handle
101 //=======================================================================
102 HOMARD::HOMARD_Gen_var HOMARDGUI::InitHOMARDGen(SalomeApp_Application* app)
103 {
104   Engines::EngineComponent_var comp = app->lcc()->FindOrLoad_Component( "FactoryServer","HOMARD" );
105   HOMARD::HOMARD_Gen_var clr = HOMARD::HOMARD_Gen::_narrow(comp);
106   ASSERT(!CORBA::is_nil(clr));
107   return clr;
108 }
109
110 //=======================================================================
111 // Module's initialization
112 void HOMARDGUI::initialize( CAM_Application* app )
113 //=======================================================================
114 {
115   SalomeApp_Module::initialize( app );
116   InitHOMARDGen(dynamic_cast<SalomeApp_Application*>( app ));
117   anId = 0;
118   createActions();
119   createMenus();
120 }
121
122 //================================================
123 // function : createHOMARDAction
124 // create an item in status bar and Homard menu
125 //================================================
126 void HOMARDGUI::createHOMARDAction( const int id, const QString& po_id, const QString& icon_id, const int key, const bool toggle  )
127 {
128 //   MESSAGE("createHOMARDAction");
129   QIcon icon;
130   QWidget* parent = application()->desktop();
131   SUIT_ResourceMgr* resMgr = application()->resourceMgr();
132   QPixmap pix;
133   if ( icon_id.length() )
134      pix = resMgr->loadPixmap( "HOMARD", tr( icon_id .toLatin1().data()) );
135   else
136      pix = resMgr->loadPixmap( "HOMARD", tr( QString( "ICO_%1" ).arg( po_id ).toLatin1().data()), false );
137   if ( !pix.isNull() )
138       icon = QIcon( pix );
139
140   QString tooltip    = tr(QString( "HOM_TOP_%1" ).arg( po_id ).toLatin1().data()),
141           menu       = tr(QString( "HOM_MEN_%1" ).arg( po_id ).toLatin1().data()),
142           status_bar = tr(QString( "HOM_STB_%1" ).arg( po_id ).toLatin1().data());
143
144   createAction( id, tooltip, icon, menu, status_bar, key, parent, toggle, this, SLOT( OnGUIEvent() )  );
145 }
146
147 //================================================
148 // function : createAction
149 // constructs Homard menu
150 // calls createHOMARDAction for each item
151 //================================================
152 void HOMARDGUI::createActions(){
153 //
154   createHOMARDAction( 1101, "NEW_CASE",       "cas_calcule.png"  );
155   createHOMARDAction( 1102, "NEW_ITERATION",  "iter_next.png"    );
156   createHOMARDAction( 1111, "COMPUTE",        "mesh_compute.png" );
157 //
158   createHOMARDAction( 1201, "EDIT",           "whatis.png"       );
159   createHOMARDAction( 1211, "DELETE",         "delete.png"       );
160 //
161   createHOMARDAction( 1301, "EDIT_MESS_FILE", "texte.png"        );
162 //
163 }
164
165 //================================================
166 // function : createPreferences
167 // No preferences for Homard
168 // Just a test
169 //================================================
170 void HOMARDGUI::createPreferences(){
171    QString toto = tr( "PREF_GROUP_GENERAL" );
172    int tabId  = addPreference( tr( "PREF_GROUP_GENERAL" ) );
173    int genGroup = addPreference( tr( "PREF_TAB_SETTINGS" ), tabId );
174    addPreference( tr( "PREF_TEST" ), genGroup, LightApp_Preferences::Color, "Homard", "shading_color" );
175 }
176
177
178 //================================================
179 // function : createMenus
180 //                Verifier l'avant dernier nombre passe en parametre
181 //================================================
182 void HOMARDGUI::createMenus(){
183   MESSAGE("createMenus")
184 //
185   int HOMARD_Id  = createMenu( tr( "HOM_MEN_HOMARD" ),  -1,  5, 10 );
186   createMenu( 1101, HOMARD_Id, -1 ); //Create_Case
187   createMenu( 1102, HOMARD_Id, -1 ); //Create_Iteration
188   createMenu( 1111, HOMARD_Id, -1 ); //COMPUTE
189 //
190   HOMARD_Id  = createMenu( tr( "HOM_MEN_MODIFICATION" ),  -1,  5, 10 );
191   createMenu( 1201, HOMARD_Id, -1 ); //Edit
192   createMenu( 1211, HOMARD_Id, -1 ); //Delete
193 //
194   HOMARD_Id  = createMenu( tr( "HOM_MEN_INFORMATION" ),  -1,  5, 10 );
195   createMenu( 1301, HOMARD_Id, -1 ); //EditAsciiFile pour le fichier listeStd ou bilan
196   createMenu( separator(), HOMARD_Id,-1);
197   createMenu( 1201, HOMARD_Id, -1 ); //Edit
198   createMenu( separator(), HOMARD_Id,-1);
199 //   createMenu( 1201, HOMARD_Id, -1 ); //Edit
200 }
201
202 //================================================
203 void HOMARDGUI::OnGUIEvent()
204 //================================================
205 {
206   MESSAGE("OnGUIEvent()")
207   setOrb();
208   const QObject* obj = sender();
209   if ( !obj || !obj->inherits( "QAction" ) )
210        return;
211   int id = actionId((QAction*)obj);
212   bool ret;
213   if ( id != -1 )
214       ret = OnGUIEvent( id );
215   MESSAGE("************** End of OnGUIEvent()");
216 }
217
218 //=======================================================================
219 // Method OnGUIEvent pour Homard
220 //=======================================================================
221 bool HOMARDGUI::OnGUIEvent (int theCommandID)
222 {
223   MESSAGE("OnGUIEvent(int)");
224   SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( application() );
225   if ( !app ) return false;
226
227   SalomeApp_Study* stud = dynamic_cast<SalomeApp_Study*> ( app->activeStudy() );
228   if ( !stud ) {
229     MESSAGE ( "FAILED to cast active study to SalomeApp_Study" );
230     return false;
231   }
232
233   SUIT_Desktop* parent = application()->desktop();
234   HOMARD::HOMARD_Gen_var homardGen = HOMARDGUI::InitHOMARDGen(app);
235
236   if (!CORBA::is_nil(homardGen))
237   {
238     // Set current study
239     SalomeApp_Study* aSAStudy =dynamic_cast<SalomeApp_Study*>(app->activeStudy());
240     _PTR(Study) aStudy = aSAStudy->studyDS();
241     SALOMEDS::Study_ptr aStudyDS;
242     if (aStudy)
243       aStudyDS = _CAST(Study,aStudy)->GetStudy();
244       homardGen->SetCurrentStudy(aStudyDS);
245    }
246   getApp()->updateObjectBrowser();
247
248   SCRUTE(theCommandID);
249   switch (theCommandID)
250   {
251     case 1101: // Creation d un Cas
252     {
253       MESSAGE("etape 1101")
254       MESSAGE("command " << theCommandID << " activated");
255       MonCreateCase *aDlg = new MonCreateCase( parent, TRUE,
256                             HOMARD::HOMARD_Gen::_duplicate(homardGen) ) ;
257       aDlg->show();
258       break;
259     }
260
261     case 1102: // Creation d une Iteration
262     {
263       MESSAGE("command " << theCommandID << " activated");
264       QString IterParentName=HOMARD_QT_COMMUN::SelectionArbreEtude(QString("IterationHomard"), 0);
265       MESSAGE("IterParentName " << IterParentName.toStdString().c_str() << " choisi dans arbre");
266       MonCreateIteration *IterDlg = new MonCreateIteration( parent, true,
267                                      HOMARD::HOMARD_Gen::_duplicate(homardGen), IterParentName ) ;
268       IterDlg->show();
269       break;
270     }
271
272     case 1111: // Compute une Iteration
273     {
274       MESSAGE("command " << theCommandID << " activated");
275       QString monIter=HOMARD_QT_COMMUN::SelectionArbreEtude(QString("IterationHomard"), 1);
276       if (monIter == QString("")) break;
277       try
278       {
279         homardGen->Compute(monIter.toStdString().c_str(), 0);
280       }
281       catch( SALOME::SALOME_Exception& S_ex )
282       {
283         QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
284                                   QString(CORBA::string_dup(S_ex.details.text)) );
285         getApp()->updateObjectBrowser();
286         return false;
287       }
288       break;
289     }
290
291     case 1201: // Edition d'un objet
292     {
293       MESSAGE("command " << theCommandID << " activated");
294       QString nomObjet = HOMARD_QT_COMMUN::SelectionArbreEtude(QString(""), 1);
295       if (nomObjet == QString("")) break;
296       _PTR(SObject) obj = chercheMonObjet();
297       if (obj)
298       {
299         // Edition d'un cas
300         if (HOMARD_UTILS::isCase(obj))
301         {
302           MonEditCase *aDlg = new MonEditCase(parent, true, HOMARD::HOMARD_Gen::_duplicate(homardGen), _ObjectName ) ;
303           aDlg->show();
304         }
305         // Edition d'une iteration
306         else if (HOMARD_UTILS::isIter(obj))
307         {
308           MonEditIteration *aDlg = new MonEditIteration(parent, true, HOMARD::HOMARD_Gen::_duplicate(homardGen), QString(""), _ObjectName ) ;
309           aDlg->show();
310         }
311         // Edition d'une hypothese
312         else if (HOMARD_UTILS::isHypo(obj))
313         {
314           MonEditHypothesis *aDlg = new MonEditHypothesis(0, true, HOMARD::HOMARD_Gen::_duplicate(homardGen),  _ObjectName, QString(""), QString("")) ;
315           aDlg->show();
316         }
317         // Edition d'une zone
318         else if (HOMARD_UTILS::isZone(obj))
319         {
320           MonEditZone *aDlg = new MonEditZone(0, TRUE, HOMARD::HOMARD_Gen::_duplicate(homardGen), QString(""), _ObjectName ) ;
321           aDlg->show();
322         }
323         // Edition d'une frontiere discrete
324         else if (HOMARD_UTILS::isBoundaryDi(obj))
325         {
326             MESSAGE(".. Lancement de MonEditBoundaryDi" );
327             MonEditBoundaryDi *aDlg = new MonEditBoundaryDi(0, TRUE, HOMARD::HOMARD_Gen::_duplicate(homardGen), QString(""), _ObjectName ) ;
328             aDlg->show();
329         }
330         // Edition d'une frontiere analytique
331         else if (HOMARD_UTILS::isBoundaryAn(obj))
332         {
333             MESSAGE(".. Lancement de MonEditBoundaryAn" );
334             MonEditBoundaryAn *aDlg = new MonEditBoundaryAn(0, TRUE, HOMARD::HOMARD_Gen::_duplicate(homardGen), QString(""), _ObjectName ) ;
335             aDlg->show();
336         }
337       }
338       break;
339     }
340
341     case 1211: // Suppression d'un objet
342     {
343       MESSAGE("command " << theCommandID << " activated");
344       QString nomObjet = HOMARD_QT_COMMUN::SelectionArbreEtude(QString(""), 1);
345       if (nomObjet == QString("")) break;
346       _PTR(SObject) obj = chercheMonObjet();
347       if (obj)
348       {
349         // Suppression d'un cas
350         if (HOMARD_UTILS::isCase(obj))
351         {
352           try
353           { homardGen->DeleteCase(_ObjectName.toStdString().c_str()); }
354           catch( SALOME::SALOME_Exception& S_ex )
355           {
356             QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
357                                       QString(CORBA::string_dup(S_ex.details.text)) );
358             getApp()->updateObjectBrowser();
359             return false;
360           }
361         }
362         // Suppression d'une iteration
363         else if (HOMARD_UTILS::isIter(obj))
364         {
365           try
366           { homardGen->DeleteIteration(_ObjectName.toStdString().c_str()); }
367           catch( SALOME::SALOME_Exception& S_ex )
368           {
369             QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
370                                       QString(CORBA::string_dup(S_ex.details.text)) );
371             getApp()->updateObjectBrowser();
372             return false;
373           }
374         }
375         // Suppression d'une hypothese
376         else if (HOMARD_UTILS::isHypo(obj))
377         {
378           try
379           { homardGen->DeleteHypo(_ObjectName.toStdString().c_str()); }
380           catch( SALOME::SALOME_Exception& S_ex )
381           {
382             QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
383                                       QString(CORBA::string_dup(S_ex.details.text)) );
384             getApp()->updateObjectBrowser();
385             return false;
386           }
387         }
388         // Suppression d'une zone
389         else if (HOMARD_UTILS::isZone(obj))
390         {
391           try
392           { homardGen->DeleteZone(_ObjectName.toStdString().c_str()); }
393           catch( SALOME::SALOME_Exception& S_ex )
394           {
395             QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
396                                       QString(CORBA::string_dup(S_ex.details.text)) );
397             getApp()->updateObjectBrowser();
398             return false;
399           }
400         }
401         // Suppression d'une frontiere
402         else if ( HOMARD_UTILS::isBoundaryDi(obj) or HOMARD_UTILS::isBoundaryAn(obj) )
403         {
404           try
405           { homardGen->DeleteBoundary(_ObjectName.toStdString().c_str()); }
406           catch( SALOME::SALOME_Exception& S_ex )
407           {
408             QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
409                                       QString(CORBA::string_dup(S_ex.details.text)) );
410             getApp()->updateObjectBrowser();
411             return false;
412           }
413         }
414       }
415       break;
416     }
417
418     case 1301: // Affichage du fichier mess
419     {
420       MESSAGE("command " << theCommandID << " activated avec objet " << _ObjectName.toStdString().c_str() );
421       _PTR(SObject) obj = chercheMonObjet();
422       if ((obj) and ((HOMARD_UTILS::isFileMess(obj) or HOMARD_UTILS::isFileSummary(obj))))
423       {
424           MonEditFile *aDlg = new MonEditFile( 0, true, HOMARD::HOMARD_Gen::_duplicate(homardGen), _ObjectName ) ;
425           aDlg->show();
426       }
427       break;
428      }
429
430   }
431   getApp()->updateObjectBrowser();
432   return true;
433 }
434
435 //=============================================================================
436 /*!
437  *
438  */
439 //=============================================================================
440
441 // Module's engine IOR
442 //=============================================================================
443 QString HOMARDGUI::engineIOR() const
444 //=============================================================================
445 {
446   CORBA::String_var anIOR = getApp()->orb()->object_to_string( InitHOMARDGen(getApp()) );
447   return QString( anIOR.in() );
448 }
449
450 // Module's activation
451 //=============================================================================
452 bool HOMARDGUI::activateModule( SUIT_Study* theStudy )
453 //=============================================================================
454 {
455   bool bOk = SalomeApp_Module::activateModule( theStudy );
456
457   setMenuShown( true );
458   setToolShown( true );
459
460   return bOk;
461 }
462
463 // Module's deactivation
464 //=============================================================================
465 bool HOMARDGUI::deactivateModule( SUIT_Study* theStudy )
466 //=============================================================================
467 {
468   setMenuShown( false );
469   setToolShown( false );
470
471   return SalomeApp_Module::deactivateModule( theStudy );
472 }
473
474 // Default windows
475 //=============================================================================
476 void HOMARDGUI::windows( QMap<int, int>& theMap ) const
477 //=============================================================================
478 {
479   theMap.clear();
480   theMap.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea );
481   theMap.insert( SalomeApp_Application::WT_PyConsole,     Qt::BottomDockWidgetArea );
482 }
483
484 //=============================================================================
485 void HOMARDGUI::setOrb()
486 //=============================================================================
487 {
488   try
489   {
490      ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance();
491      ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting());
492      _orb = init( 0 , 0 );
493   }
494   catch (...)
495   {
496      INFOS("internal error : orb not found");
497      _orb = 0;
498   }
499             ASSERT(! CORBA::is_nil(_orb));
500 }
501 //========================================
502 _PTR(SObject) HOMARDGUI::chercheMonObjet()
503 //========================================
504 {
505
506     SALOMEDSClient_SObject* aSO = NULL;
507     _PTR(SObject) obj;
508     SALOME_ListIO lst;
509     getApp()->selectionMgr()->selectedObjects( lst );
510     if (  lst.Extent() == 1 )
511     {
512         Handle(SALOME_InteractiveObject) io = lst.First();
513         SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
514         _PTR(Study) study = appStudy->studyDS();
515         _PTR(SObject) obj = study->FindObjectID( io->getEntry() );
516         _ObjectName = QString( obj->GetName().c_str() );
517         return obj;
518      }
519      else
520          return _PTR(SObject)(aSO);
521 }
522 //=============================================================================
523 void HOMARDGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& title )
524 //=============================================================================
525 {
526   MESSAGE("Debut de contextMenuPopup");
527   _PTR(SObject) obj = chercheMonObjet();
528   if ( obj )
529   {
530     title = QString( obj->GetName().c_str() );
531     _ObjectName = title;
532     SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
533 //
534     QPixmap pix ;
535     bool DeleteObject = false ;
536     bool EditObject = false ;
537 //
538     if ( HOMARD_UTILS::isBoundaryAn(obj) )
539     {
540       EditObject = true ;
541       DeleteObject = true ;
542     }
543     else if ( HOMARD_UTILS::isBoundaryDi(obj) )
544     {
545       EditObject = true ;
546       DeleteObject = true ;
547     }
548     else if ( HOMARD_UTILS::isZone(obj) )
549     {
550       EditObject = true ;
551       DeleteObject = true ;
552     }
553     else if ( HOMARD_UTILS::isHypo(obj) )
554     {
555       EditObject = true ;
556       DeleteObject = true ;
557     }
558     else if ( HOMARD_UTILS::isIter(obj) )
559     {
560       pix = resMgr->loadPixmap( "HOMARD", "iter_next.png" );
561       menu->addAction(QIcon(pix), tr(QString("HOM_MEN_NEW_ITERATION").toLatin1().data()), this,SLOT(NextIter()));
562       QPixmap pix2 = resMgr->loadPixmap( "HOMARD", "mesh_compute.png" );
563       menu->addAction(QIcon(pix2), tr(QString("HOM_MEN_COMPUTE").toLatin1().data()), this,SLOT(LanceCalcul()));
564       EditObject = true ;
565       DeleteObject = true ;
566     }
567     else if ( HOMARD_UTILS::isCase(obj) )
568     {
569       EditObject = true ;
570       DeleteObject = true ;
571     }
572     else if ( HOMARD_UTILS::isFileMess(obj) or HOMARD_UTILS::isFileSummary(obj) )
573     {
574       pix = resMgr->loadPixmap( "HOMARD", "texte.png" );
575       menu->addAction(QIcon(pix), tr(QString("HOM_MEN_EDIT_MESS_FILE").toLatin1().data()), this,SLOT(EditAsciiFile()));
576     }
577 //  Ajout d'un menu d'edition pour les objets qui le proposent
578     if ( EditObject )
579     {
580       pix = resMgr->loadPixmap( "HOMARD", "whatis.png" );
581       menu->addAction(QIcon(pix), tr(QString("HOM_MEN_EDIT").toLatin1().data()), this,SLOT(Edit()));
582     }
583 //  Ajout d'un menu de destruction pour les objets qui le proposent
584     if ( DeleteObject )
585     {
586       pix = resMgr->loadPixmap( "HOMARD", "delete.png" );
587       menu->addAction(QIcon(pix), tr(QString("HOM_MEN_DELETE").toLatin1().data()), this,SLOT(Delete()));
588     }
589   }
590 }
591
592 void HOMARDGUI::NextIter()
593 {
594   this->OnGUIEvent(1102);
595 }
596
597 void HOMARDGUI::LanceCalcul()
598 {
599   this->OnGUIEvent(1111);
600 }
601
602 void HOMARDGUI::Edit()
603 {
604   this->OnGUIEvent(1201);
605 }
606
607 void HOMARDGUI::Delete()
608 {
609   this->OnGUIEvent(1211);
610 }
611
612 void HOMARDGUI::EditAsciiFile()
613 {
614   this->OnGUIEvent(1301);
615 }
616
617 //
618 //=============================================================================
619 // Export the module
620 //=============================================================================
621 extern "C" {
622   Standard_EXPORT CAM_Module* createModule()
623   {
624     return new HOMARDGUI("");
625   }
626 }
627