1 // File : HOMARDGUI.cxx
2 // Author : Paul RASCLE, EDF
9 #include "Utils_ORB_INIT.hxx"
10 #include "Utils_SINGLETON.hxx"
11 #include "SALOME_LifeCycleCORBA.hxx"
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>
20 #include "CAM_Module.h"
21 #include "OB_Browser.h"
23 #include "SALOME_ListIO.hxx"
24 #include "SALOME_ListIteratorOfListIO.hxx"
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>
36 #include <utilities.h>
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"
53 #include <boost/shared_ptr.hpp>
56 #include "SALOMEDS_Study.hxx"
57 #include "HOMARDGUI_Utils.h"
59 static CORBA::ORB_var _orb;
61 //=======================================================================
62 // function : HOMARDGUI()
63 // purpose : Constructor
64 //=======================================================================
65 HOMARDGUI::HOMARDGUI(const QString&) :
66 SalomeApp_Module( "HOMARD" ), // default name
67 LightApp_Module( "HOMARD" )
72 //=======================================================================
73 // function : ~HOMARDGUI()
74 // purpose : Destructor
75 //=======================================================================
76 HOMARDGUI::~HOMARDGUI()
80 //=======================================================================
81 // function : InitHOMARDGen
82 // launch HOMARD component and return a handle
83 //=======================================================================
84 HOMARD::HOMARD_Gen_var HOMARDGUI::InitHOMARDGen(SalomeApp_Application* app)
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));
92 //=======================================================================
93 // Module's initialization
94 void HOMARDGUI::initialize( CAM_Application* app )
95 //=======================================================================
97 SalomeApp_Module::initialize( app );
98 InitHOMARDGen(dynamic_cast<SalomeApp_Application*>( app ));
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 )
110 MESSAGE("HOMARDGUI::createHOMARDAction");
112 QWidget* parent = application()->desktop();
113 SUIT_ResourceMgr* resMgr = application()->resourceMgr();
115 if ( icon_id.length() )
116 pix = resMgr->loadPixmap( "HOMARD", tr( icon_id .toLatin1().data()) );
118 pix = resMgr->loadPixmap( "HOMARD", tr( QString( "ICO_%1" ).arg( po_id ).toLatin1().data()), false );
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());
126 createAction( id, tooltip, icon, menu, status_bar, key, parent, toggle, this, SLOT( OnGUIEvent() ) );
129 //================================================
130 // function : createAction
131 // constructs Homard menu
132 // calls createHOMARDAction for each item
133 //================================================
134 void HOMARDGUI::createActions(){
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" );
148 //================================================
149 // function : createPreferences
150 // No preferences for Homard
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" );
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
181 //================================================
182 void HOMARDGUI::OnGUIEvent()
183 //================================================
185 MESSAGE("HOMARDGUI::OnGUIEvent()")
187 const QObject* obj = sender();
188 if ( !obj || !obj->inherits( "QAction" ) )
190 int id = actionId((QAction*)obj);
193 ret = OnGUIEvent( id );
194 MESSAGE("************** End of HOMARDGUI::OnGUIEvent()");
197 //=======================================================================
198 // Method OnGUIEvent pour Homard
199 //=======================================================================
200 bool HOMARDGUI::OnGUIEvent (int theCommandID)
202 MESSAGE("HOMARDGUI::OnGUIEvent(int)");
203 SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( application() );
204 if ( !app ) return false;
206 SalomeApp_Study* stud = dynamic_cast<SalomeApp_Study*> ( app->activeStudy() );
208 MESSAGE ( "FAILED to cast active study to SalomeApp_Study" );
212 SUIT_Desktop* parent = application()->desktop();
213 HOMARD::HOMARD_Gen_var homardGen = HOMARDGUI::InitHOMARDGen(app);
215 if (!CORBA::is_nil(homardGen))
218 SalomeApp_Study* aSAStudy =dynamic_cast<SalomeApp_Study*>(app->activeStudy());
219 _PTR(Study) aStudy = aSAStudy->studyDS();
220 SALOMEDS::Study_ptr aStudyDS;
222 aStudyDS = _CAST(Study,aStudy)->GetStudy();
223 homardGen->SetCurrentStudy(aStudyDS);
225 getApp()->updateObjectBrowser();
227 SCRUTE(theCommandID);
228 switch (theCommandID)
230 case 1101: // Creation d un Cas
232 MESSAGE("etape 1101")
233 MESSAGE("command " << theCommandID << " activated");
234 MonCreateCase *aDlg = new MonCreateCase( parent, TRUE,
235 HOMARD::HOMARD_Gen::_duplicate(homardGen) ) ;
240 case 1102: // Creation d une Iteration
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 ) ;
251 case 1111: // Compute une Iteration
253 MESSAGE("command " << theCommandID << " activated");
254 QString monIter=HOMARD_QT_COMMUN::SelectionArbreEtude(QString("IterationHomard"), 1);
255 if (monIter == QString("")) break;
258 homardGen->Compute(monIter.toStdString().c_str(), 0);
260 catch( SALOME::SALOME_Exception& S_ex )
262 QMessageBox::critical( 0, QObject::tr("HOM_ERROR"),
263 QString(CORBA::string_dup(S_ex.details.text)) );
264 getApp()->updateObjectBrowser();
270 case 1120: // Edition d un cas
272 MESSAGE("command " << theCommandID << " activated avec objet " << _ObjectName.toStdString().c_str() );
273 _PTR(SObject) obj = chercheMonObjet();
274 if ((obj) and (HOMARD_UTILS::isCase(obj)))
276 MonEditCase *aDlg = new MonEditCase(parent, true, HOMARD::HOMARD_Gen::_duplicate(homardGen), _ObjectName ) ;
281 case 1121: // Edition d une iteration
283 MESSAGE("command " << theCommandID << " activated avec objet " << _ObjectName.toStdString().c_str() );
284 _PTR(SObject) obj = chercheMonObjet();
285 if ((obj) and (HOMARD_UTILS::isIter(obj)))
287 MonEditIteration *aDlg = new MonEditIteration(parent, true, HOMARD::HOMARD_Gen::_duplicate(homardGen), QString(""), _ObjectName ) ;
292 case 1122: // Edition d une hypothese
294 MESSAGE("command " << theCommandID << " activated avec objet " << _ObjectName.toStdString().c_str() );
295 _PTR(SObject) obj = chercheMonObjet();
296 if ((obj) and (HOMARD_UTILS::isHypo(obj)))
298 MonEditHypothesis *aDlg = new MonEditHypothesis(0, true, HOMARD::HOMARD_Gen::_duplicate(homardGen), _ObjectName, QString(""), QString("")) ;
303 case 1123: // Edition d une zone
305 MESSAGE("command " << theCommandID << " activated avec objet " << _ObjectName.toStdString().c_str() );
306 _PTR(SObject) obj = chercheMonObjet();
307 if ((obj) and (HOMARD_UTILS::isZone(obj)))
309 MonEditZone *aDlg = new MonEditZone(0, TRUE, HOMARD::HOMARD_Gen::_duplicate(homardGen), QString(""), _ObjectName ) ;
314 case 1124: // Edition d une frontiere
316 MESSAGE("command " << theCommandID << " activated avec objet " << _ObjectName.toStdString().c_str() );
317 _PTR(SObject) obj = chercheMonObjet();
320 if (HOMARD_UTILS::isBoundaryDi(obj))
322 MESSAGE(".. Lancement de MonEditBoundaryDi" );
323 MonEditBoundaryDi *aDlg = new MonEditBoundaryDi(0, TRUE, HOMARD::HOMARD_Gen::_duplicate(homardGen), QString(""), _ObjectName ) ;
326 if (HOMARD_UTILS::isBoundaryAn(obj))
328 MESSAGE(".. Lancement de MonEditBoundaryAn" );
329 MonEditBoundaryAn *aDlg = new MonEditBoundaryAn(0, TRUE, HOMARD::HOMARD_Gen::_duplicate(homardGen), QString(""), _ObjectName ) ;
335 case 1130: // Edition du fichier mess
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))))
341 MonEditFile *aDlg = new MonEditFile( 0, true, HOMARD::HOMARD_Gen::_duplicate(homardGen), _ObjectName ) ;
346 getApp()->updateObjectBrowser();
350 //=============================================================================
354 //=============================================================================
356 // Module's engine IOR
357 //=============================================================================
358 QString HOMARDGUI::engineIOR() const
359 //=============================================================================
361 CORBA::String_var anIOR = getApp()->orb()->object_to_string( InitHOMARDGen(getApp()) );
362 return QString( anIOR.in() );
365 // Module's activation
366 //=============================================================================
367 bool HOMARDGUI::activateModule( SUIT_Study* theStudy )
368 //=============================================================================
370 bool bOk = SalomeApp_Module::activateModule( theStudy );
372 setMenuShown( true );
373 setToolShown( true );
378 // Module's deactivation
379 //=============================================================================
380 bool HOMARDGUI::deactivateModule( SUIT_Study* theStudy )
381 //=============================================================================
383 setMenuShown( false );
384 setToolShown( false );
386 return SalomeApp_Module::deactivateModule( theStudy );
390 //=============================================================================
391 void HOMARDGUI::windows( QMap<int, int>& theMap ) const
392 //=============================================================================
395 theMap.insert( SalomeApp_Application::WT_ObjectBrowser, Qt::LeftDockWidgetArea );
396 theMap.insert( SalomeApp_Application::WT_PyConsole, Qt::BottomDockWidgetArea );
399 //=============================================================================
400 void HOMARDGUI::setOrb()
401 //=============================================================================
405 ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance();
406 ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting());
407 _orb = init( 0 , 0 );
411 INFOS("internal error : orb not found");
414 ASSERT(! CORBA::is_nil(_orb));
416 //========================================
417 _PTR(SObject) HOMARDGUI::chercheMonObjet()
418 //========================================
421 SALOMEDSClient_SObject* aSO = NULL;
424 getApp()->selectionMgr()->selectedObjects( lst );
425 if ( lst.Extent() == 1 )
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() );
435 return _PTR(SObject)(aSO);
437 //=============================================================================
438 void HOMARDGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& title )
439 //=============================================================================
441 MESSAGE("Debut de HOMARDGUI::contextMenuPopup");
442 _PTR(SObject) obj = chercheMonObjet();
445 title = QString( obj->GetName().c_str() );
447 SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
449 if ( HOMARD_UTILS::isBoundaryAn(obj) )
451 QPixmap pix = resMgr->loadPixmap( "HOMARD", "whatis.png" );
452 menu->addAction(QIcon(pix), tr(QString("HOM_MEN_EDIT_BOUNDARY").toLatin1().data()), this,SLOT(EditBoDi()));
454 else if ( HOMARD_UTILS::isBoundaryDi(obj) )
456 QPixmap pix = resMgr->loadPixmap( "HOMARD", "whatis.png" );
457 menu->addAction(QIcon(pix), tr(QString("HOM_MEN_EDIT_BOUNDARY").toLatin1().data()), this,SLOT(EditBoDi()));
459 else if ( HOMARD_UTILS::isZone(obj) )
461 QPixmap pix = resMgr->loadPixmap( "HOMARD", "whatis.png" );
462 menu->addAction(QIcon(pix), tr(QString("HOM_MEN_EDIT_ZONE").toLatin1().data()), this,SLOT(EditZone()));
464 else if ( HOMARD_UTILS::isHypo(obj) )
466 QPixmap pix = resMgr->loadPixmap( "HOMARD", "whatis.png" );
467 menu->addAction(QIcon(pix), tr(QString("HOM_MEN_EDIT_HYPO").toLatin1().data()), this,SLOT(EditHypo()));
469 else if ( HOMARD_UTILS::isIter(obj) )
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()));
478 else if ( HOMARD_UTILS::isCase(obj) )
480 QPixmap pix = resMgr->loadPixmap( "HOMARD", "whatis.png" );
481 menu->addAction(QIcon(pix), tr(QString("HOM_MEN_EDIT_CASE").toLatin1().data()), this,SLOT(EditCase()));
483 else if ( HOMARD_UTILS::isFileMess(obj) or HOMARD_UTILS::isFileSummary(obj) )
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()));
491 void HOMARDGUI::NextIter()
493 this->OnGUIEvent(1102);
496 void HOMARDGUI::LanceCalcul()
498 this->OnGUIEvent(1111);
501 void HOMARDGUI::EditCase()
503 this->OnGUIEvent(1120);
506 void HOMARDGUI::EditIter()
508 this->OnGUIEvent(1121);
511 void HOMARDGUI::EditHypo()
513 this->OnGUIEvent(1122);
516 void HOMARDGUI::EditZone()
518 this->OnGUIEvent(1123);
521 void HOMARDGUI::EditBoDi()
523 this->OnGUIEvent(1124);
526 void HOMARDGUI::EditAsciiFile()
528 this->OnGUIEvent(1130);
531 //=============================================================================
533 //=============================================================================
535 Standard_EXPORT CAM_Module* createModule()
537 return new HOMARDGUI("");