From e3a0b42ccb2e6698d666daf8141c91ff051dd56f Mon Sep 17 00:00:00 2001 From: rnv Date: Wed, 7 Jun 2017 15:17:22 +0300 Subject: [PATCH] Merge multi-study removal branch. --- CMakeLists.txt | 7 - SalomeGUIConfig.cmake.in | 4 - .../gui/input/howtos_and_best_practives.doc | 6 +- doc/salome/gui/input/text_user_interface.doc | 5 +- doc/salome/gui/input/using_pluginsmanager.doc | 6 +- src/CAM/CAM_Study.cxx | 2 +- src/GUI_PY/helper.py | 25 +- src/GuiHelpers/SALOME_AppStudyEditor.cxx | 25 +- src/GuiHelpers/SALOME_AppStudyEditor.hxx | 3 - src/GuiHelpers/SALOME_GuiServices.cxx | 25 +- src/GuiHelpers/SALOME_GuiServices.hxx | 3 +- src/GuiHelpers/StandardApp_Module.cxx | 11 +- src/GuiHelpers/StandardApp_Module.hxx | 2 +- src/LightApp/LightApp_Application.cxx | 40 +- src/LightApp/LightApp_Application.h | 7 +- src/LightApp/LightApp_Study.cxx | 2 - src/LightApp/resources/LightApp_msg_en.ts | 6 +- src/LightApp/resources/LightApp_msg_fr.ts | 6 +- src/LightApp/resources/LightApp_msg_ja.ts | 7 +- .../SALOME_PYQT_PyModule.cxx | 48 +-- .../SALOME_PYQT_PyModule.h | 5 +- src/SALOME_PYQT/SalomePyQt/SalomePyQt.cxx | 50 +-- src/SALOME_PYQT/SalomePyQt/SalomePyQt.h | 3 +- src/SALOME_PYQT/SalomePyQt/SalomePyQt.sip | 4 +- src/SALOME_SWIG/SALOMEGUI_Swig.cxx | 29 +- src/SALOME_SWIG/SALOMEGUI_Swig.hxx | 3 +- src/SALOME_SWIG/SALOMEGUI_Swig.i | 3 +- src/SALOME_SWIG/test_big_table.py | 2 +- src/SALOME_SWIG/test_many_objects.py | 2 +- src/SALOME_SWIG/test_table.py | 2 +- src/SOCC/SOCC_ViewModel.cxx | 61 +-- src/SPlot2d/SPlot2d_ViewModel.cxx | 25 -- src/STD/STD_Application.cxx | 9 +- src/SVTK/SVTK_ViewModel.cxx | 49 +-- src/SalomeApp/SalomeApp_Application.cxx | 348 ++++++++---------- src/SalomeApp/SalomeApp_Application.h | 4 +- src/SalomeApp/SalomeApp_DataModel.cxx | 9 +- src/SalomeApp/SalomeApp_DataObject.cxx | 46 +-- src/SalomeApp/SalomeApp_DoubleSpinBox.cxx | 47 ++- src/SalomeApp/SalomeApp_Engine_i.cxx | 98 ++--- src/SalomeApp/SalomeApp_Engine_i.h | 13 +- src/SalomeApp/SalomeApp_IntSpinBox.cxx | 47 ++- src/SalomeApp/SalomeApp_NoteBook.cxx | 67 ++-- src/SalomeApp/SalomeApp_NoteBook.h | 12 +- src/SalomeApp/SalomeApp_PyInterp.cxx | 2 +- src/SalomeApp/SalomeApp_Study.cxx | 205 +++-------- src/SalomeApp/SalomeApp_Study.h | 6 +- .../SalomeApp_StudyPropertiesDlg.cxx | 13 +- src/SalomeApp/SalomeApp_StudyPropertiesDlg.h | 1 - src/SalomeApp/SalomeApp_TypeFilter.cxx | 23 +- src/SalomeApp/pluginsdemo/minmax_plugin.py | 5 +- src/SalomeApp/pluginsdemo/salome_plugins.py | 38 +- src/SalomeApp/pluginsdemo/trihedron.py | 2 +- src/SalomeApp/pluginsdemo/tubebuilder.py | 42 +-- src/SalomeApp/pluginsdemo/xalome.py | 29 +- src/SalomeApp/resources/SalomeApp_msg_en.ts | 6 +- src/SalomeApp/resources/SalomeApp_msg_fr.ts | 6 +- src/SalomeApp/resources/SalomeApp_msg_ja.ts | 7 +- src/SalomeApp/salome_pluginsmanager.py | 11 +- src/Session/Session_ServerCheck.cxx | 12 +- src/Session/Session_ServerThread.cxx | 4 +- src/Session/Session_Session_i.cxx | 22 +- src/Session/Session_Session_i.hxx | 3 - src/TOOLSGUI/CMakeLists.txt | 2 + src/TOOLSGUI/ToolsGUI.cxx | 15 +- src/TOOLSGUI/ToolsGUI.h | 6 +- 66 files changed, 533 insertions(+), 1105 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f3e75dfa7..087ee04b9 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -89,12 +89,10 @@ OPTION(SALOME_USE_PVVIEWER "Enable ParaView visualization (Mandatory in classic CMAKE_DEPENDENT_OPTION(SALOME_USE_SALOMEOBJECT "Enable Salome Object (Mandatory in classic configurations)" ON "SALOME_LIGHT_ONLY" ON) -OPTION(SALOME_USE_SINGLE_DESKTOP "Enable multiple document interface" ON) MARK_AS_ADVANCED(SALOME_LIGHT_ONLY SALOME_USE_VTKVIEWER SALOME_USE_GRAPHICSVIEW SALOME_USE_PVVIEWER) MARK_AS_ADVANCED(SALOME_USE_SALOMEOBJECT SALOME_USE_OCCVIEWER SALOME_USE_GLVIEWER SALOME_USE_PLOT2DVIEWER) MARK_AS_ADVANCED(SALOME_USE_PYCONSOLE SALOME_USE_QXGRAPHVIEWER SALOME_USE_PYVIEWER) -MARK_AS_ADVANCED(SALOME_USE_SINGLE_DESKTOP) # Prerequisites # ============= @@ -146,11 +144,6 @@ IF(SALOME_GUI_USE_OBSERVERS) ADD_DEFINITIONS(-DWITH_SALOMEDS_OBSERVER) ENDIF() -# Single-study GUI -IF(SALOME_USE_SINGLE_DESKTOP) - ADD_DEFINITIONS(-DSINGLE_DESKTOP) -ENDIF() - # OCCT FIND_PACKAGE(SalomeCAS REQUIRED) diff --git a/SalomeGUIConfig.cmake.in b/SalomeGUIConfig.cmake.in index 74af92640..bcd7e3c24 100644 --- a/SalomeGUIConfig.cmake.in +++ b/SalomeGUIConfig.cmake.in @@ -63,16 +63,12 @@ SET(SALOME_USE_PVVIEWER @SALOME_USE_PVVIEWER@) SET(SALOME_USE_PYVIEWER @SALOME_USE_PYVIEWER@) SET(SALOME_USE_PYCONSOLE @SALOME_USE_PYCONSOLE@) SET(SALOME_USE_SALOMEOBJECT @SALOME_USE_SALOMEOBJECT@) -SET(SALOME_USE_SINGLE_DESKTOP @SALOME_USE_SINGLE_DESKTOP@) SET(SALOME_GUI_USE_OBSERVERS @SALOME_GUI_USE_OBSERVERS@) SET(SALOME_GUI_USE_OPENGL2 @SALOME_GUI_USE_OPENGL2@) IF(SALOME_GUI_LIGHT_ONLY) LIST(APPEND GUI_DEFINITIONS "-DGUI_DISABLE_CORBA") ENDIF() -IF(SALOME_USE_SINGLE_DESKTOP) - LIST(APPEND GUI_DEFINITIONS "-DSINGLE_DESKTOP") -ENDIF() IF(SALOME_GUI_USE_OBSERVERS) LIST(APPEND GUI_DEFINITIONS "-DWITH_SALOMEDS_OBSERVER") ENDIF() diff --git a/doc/salome/gui/input/howtos_and_best_practives.doc b/doc/salome/gui/input/howtos_and_best_practives.doc index e064bf281..bb32f91cb 100644 --- a/doc/salome/gui/input/howtos_and_best_practives.doc +++ b/doc/salome/gui/input/howtos_and_best_practives.doc @@ -159,12 +159,12 @@ useCaseIter->UnRegister(); useCaseBuilder->UnRegister(); \endcode -\section use_case_compatibility Remark about compatibility with existing studies +\section use_case_compatibility Remark about compatibility with existing study If you decide to switch your module to the use case builder approach to provide customization for the data tree representation, you must take care of compatibility with existing SALOME studies. Basically it means that you have to add -a simple code to \c Load() (and \c LoadASCII() if necessary) method +a simple code to \c Load() method of your module, which adds tree node attributes to all data entities in the data tree of your module. The simplest way to do this is to iterate through all data items and recursively add them to @@ -416,7 +416,7 @@ void MyModule::copyOrMove( const MYMODULE_ORB::object_list& what, { if ( CORBA::is_nil( where ) ) return; // bad parent - SALOMEDS::Study_var study = where->GetStudy(); // study + SALOMEDS::Study_var study = GUI::getStudyServant(); // study SALOMEDS::StudyBuilder_var studyBuilder = study->NewBuilder(); // study builder SALOMEDS::UseCaseBuilder_var useCaseBuilder = study->GetUseCaseBuilder(); // use case builder SALOMEDS::SComponent_var father = where->GetFatherComponent(); // father component diff --git a/doc/salome/gui/input/text_user_interface.doc b/doc/salome/gui/input/text_user_interface.doc index 5501c21ce..0e9984bfa 100644 --- a/doc/salome/gui/input/text_user_interface.doc +++ b/doc/salome/gui/input/text_user_interface.doc @@ -12,10 +12,7 @@ console (since SWIG library is linked directly to the GUI library). The example of usage: \code # update Object browser contents -salome.sg.updateObjBrowser(True) - -# get the active study ID -studyId = salome.sg.getActiveStudyId() +salome.sg.updateObjBrowser() # get the active study name studyName = salome.sg.getActiveStudyName() diff --git a/doc/salome/gui/input/using_pluginsmanager.doc b/doc/salome/gui/input/using_pluginsmanager.doc index bff116f05..71302d2bb 100644 --- a/doc/salome/gui/input/using_pluginsmanager.doc +++ b/doc/salome/gui/input/using_pluginsmanager.doc @@ -100,7 +100,7 @@ training course): import salome import GEOM from salome.geom import geomBuilder -geompy = geomBuilder.New(salome.myStudy) +geompy = geomBuilder.New() # Create the objects Vx = geompy.MakeVectorDXDYDZ(10, 0, 0) @@ -122,10 +122,10 @@ import salome_pluginsmanager def trihedron(context): import GEOM from salome.geom import geomBuilder - geompy = geomBuilder.New(salome.myStudy) + geompy = geomBuilder.New() # Intialize the geompy factory with the active study activeStudy = context.study - geompy.init_geom(activeStudy) + geompy.init_geom() # Create the objects Vx = geompy.MakeVectorDXDYDZ(10, 0, 0) Vy = geompy.MakeVectorDXDYDZ(0, 10, 0) diff --git a/src/CAM/CAM_Study.cxx b/src/CAM/CAM_Study.cxx index 91aff4c34..f252617cb 100755 --- a/src/CAM/CAM_Study.cxx +++ b/src/CAM/CAM_Study.cxx @@ -163,7 +163,7 @@ void CAM_Study::dataModelInserted( const CAM_DataModel* dModel ) { CAM_DataModel* dm = (CAM_DataModel*)dModel; - if ( isSaved() ) // need to load data model from an exisitng file? + if ( isSaved() ) // need to load data model from an existing file? openDataModel( studyName(), dm ); else // no, just need to update data model's connection to study tree //(some application may want to show model's root in a study tree even if a model is empty) diff --git a/src/GUI_PY/helper.py b/src/GUI_PY/helper.py index 3b11a48d0..d1f0ca992 100644 --- a/src/GUI_PY/helper.py +++ b/src/GUI_PY/helper.py @@ -53,23 +53,6 @@ sgPyQt=SalomePyQt.SalomePyQt() import libSALOME_Swig SalomeGUI = libSALOME_Swig.SALOMEGUI_Swig() -# -# ================================================================== -# General helper function for GUI programming actions -# ================================================================== -# -# Get the active study -# -def getActiveStudy(): - """ - This returns a study object that corresponds to the active - study. The active study is a GUI concept: it's the study currently - active on the desktop. - """ - studyId = sgPyQt.getStudyId() - study = services.getStudyManager().GetStudyByID( studyId ) - return study - # # ================================================================== # Functions to manipulate the objects in the browser (generic) @@ -84,7 +67,7 @@ def getSObjectSelected(): ''' sobj = None entry = None - study = getActiveStudy() + study = salome.myStudy if SalomeGUI.SelectedCount() == 1: # We only considere the first element of the list. If you need # something else, create another function in your own context. @@ -112,10 +95,10 @@ def deleteSObjectSelected(): ''' sobj, entry = getSObjectSelected() if ( sobj ): - study = getActiveStudy() + study = salome.myStudy builder = study.NewBuilder() builder.RemoveObject( sobj ) - SalomeGUI.updateObjBrowser(True) + SalomeGUI.updateObjBrowser() pass # @@ -130,7 +113,7 @@ def deleteSObjectSelected(): # # Definitions: -# - the SObject is an item in the active study (Study Object). +# - the SObject is an item in the study (Study Object). # - the entry is the identifier of an item. # - the object (geom object or smesh object) is a CORBA servant # embedded in the SALOME component container and with a reference in diff --git a/src/GuiHelpers/SALOME_AppStudyEditor.cxx b/src/GuiHelpers/SALOME_AppStudyEditor.cxx index 1252bc431..d024287ff 100644 --- a/src/GuiHelpers/SALOME_AppStudyEditor.cxx +++ b/src/GuiHelpers/SALOME_AppStudyEditor.cxx @@ -20,6 +20,7 @@ // Author: Guillaume Boulant (EDF/R&D) #include "SALOME_AppStudyEditor.hxx" +#include "SALOME_GuiServices.hxx" #include #include @@ -29,34 +30,12 @@ SALOME_AppStudyEditor::SALOME_AppStudyEditor(SalomeApp_Application * salomeApp) : SALOME_StudyEditor() { _salomeApp = salomeApp; - updateActiveStudy(); -} - -/** - * This updates the editor with the current active study. If the - * active study id is identical to the study id currently associated - * to this object, then no update is performed. - */ -int SALOME_AppStudyEditor::updateActiveStudy() { - int activeStudyId = SALOME_AppStudyEditor::getActiveStudyId(_salomeApp); - if ( activeStudyId != this->getStudyId() ) { - this->setStudyById(activeStudyId); - } - return activeStudyId; -} - -// GUI context only -int SALOME_AppStudyEditor::getActiveStudyId(SalomeApp_Application * salomeApp) { - SalomeApp_Study* appStudy = dynamic_cast (salomeApp->activeStudy()); - _PTR(Study) aCStudy = appStudy->studyDS(); - int studyId = aCStudy->StudyId(); - return studyId; } SALOMEDS::SObject_ptr SALOME_AppStudyEditor::IObjectToSObject(const Handle(SALOME_InteractiveObject)& iobject) { if (!iobject.IsNull()) { if (iobject->hasEntry()) { - SALOMEDS::SObject_var sobject = _study->FindObjectID(iobject->getEntry()); + SALOMEDS::SObject_var sobject = GUI::getStudyServant()->FindObjectID(iobject->getEntry()); return sobject._retn(); } } diff --git a/src/GuiHelpers/SALOME_AppStudyEditor.hxx b/src/GuiHelpers/SALOME_AppStudyEditor.hxx index 19ceb182c..804ad6df1 100644 --- a/src/GuiHelpers/SALOME_AppStudyEditor.hxx +++ b/src/GuiHelpers/SALOME_AppStudyEditor.hxx @@ -37,13 +37,10 @@ class SALOMEGUIHELPERS_EXPORT SALOME_AppStudyEditor: public SALOME_StudyEditor { public: SALOME_AppStudyEditor(SalomeApp_Application * salomeApp); - int updateActiveStudy(); SALOMEDS::SObject_ptr IObjectToSObject(const Handle(SALOME_InteractiveObject)& iobject); SALOME_StudyEditor::SObjectList * getSelectedObjects(); - static int getActiveStudyId(SalomeApp_Application * salomeApp); - private: SalomeApp_Application * _salomeApp; diff --git a/src/GuiHelpers/SALOME_GuiServices.cxx b/src/GuiHelpers/SALOME_GuiServices.cxx index 76d1dc081..59d77362e 100644 --- a/src/GuiHelpers/SALOME_GuiServices.cxx +++ b/src/GuiHelpers/SALOME_GuiServices.cxx @@ -68,31 +68,14 @@ namespace GUI { // SALOME application using the resourceMgr() method: // - /** - * This returns the current active study id if an active study is - * defined in the SALOME session, returns -1 otherwise. Note that - * the active study doesn't make sense outside of the GUI SALOME - * process, i.e. the SALOME_SessionServer embedding the - * SalomeApp_Application. - */ - int getActiveStudyId() { - SALOME::Session_var aSession = KERNEL::getSalomeSession(); - if ( CORBA::is_nil(aSession) ) { - INFOS("ERR: can't request for active study because the session is NULL"); - return -1; - } - return aSession->GetActiveStudyId(); - } - /** * This returns the current active study if an active study is * defined in the SALOME session, returns null otherwise. */ - SALOMEDS::Study_ptr getActiveStudy() { - return KERNEL::getStudyById(getActiveStudyId()); + SALOMEDS::Study_ptr getStudyServant() { + return SALOMEDS::Study::_duplicate(KERNEL::getStudyServant()); } - // __GBO__ Question: what is the difference between a // SALOMEDS::Study and a SalomeApp_Study? SalomeApp_Study* getSalomeAppActiveStudy() { @@ -120,9 +103,7 @@ namespace GUI { // retrieve the SALOMEDS::Study servant first and the to // request this servant to get the SObject given its entry. // - _PTR(Study) studyClient = appStudy->studyDS(); - SALOMEDS::Study_var study = KERNEL::getStudyManager()->GetStudyByID(studyClient->StudyId()); - SALOMEDS::SObject_ptr sobject = study->FindObjectID(iobject->getEntry()); + SALOMEDS::SObject_ptr sobject = KERNEL::getStudyServant()->FindObjectID(iobject->getEntry()); return sobject; } } diff --git a/src/GuiHelpers/SALOME_GuiServices.hxx b/src/GuiHelpers/SALOME_GuiServices.hxx index 73661bb98..a7565ff9d 100644 --- a/src/GuiHelpers/SALOME_GuiServices.hxx +++ b/src/GuiHelpers/SALOME_GuiServices.hxx @@ -58,8 +58,7 @@ namespace GUI { // depends of the SALOME module technical choices). In general, on // of the attribute of a SObject is a CORBA servant that handles the // data to work with - SALOMEGUIHELPERS_EXPORT SALOMEDS::Study_ptr getActiveStudy(); - SALOMEGUIHELPERS_EXPORT int getActiveStudyId(); + SALOMEGUIHELPERS_EXPORT SALOMEDS::Study_ptr getStudyServant(); // Another way to get the active study (to be converted in // SALOMEDS::Study): diff --git a/src/GuiHelpers/StandardApp_Module.cxx b/src/GuiHelpers/StandardApp_Module.cxx index e969ed113..051958daa 100644 --- a/src/GuiHelpers/StandardApp_Module.cxx +++ b/src/GuiHelpers/StandardApp_Module.cxx @@ -20,6 +20,8 @@ #include "StandardApp_Module.hxx" +#include "SALOME_GuiServices.hxx" + #include #include #include @@ -279,7 +281,7 @@ bool StandardApp_Module::activateModule( SUIT_Study* theStudy ) setToolShown( true ); if ( this->createStudyComponentAtActivation() ) { - this->createStudyComponent(theStudy); + this->createStudyComponent(); } return bOk; @@ -301,12 +303,9 @@ bool StandardApp_Module::createStudyComponentAtActivation() { * the module. This component is associated to the engine (return by * getEngine()) if the engine is a SALOMEDS::Driver. */ -void StandardApp_Module::createStudyComponent(SUIT_Study* theStudy) { +void StandardApp_Module::createStudyComponent() { - SALOME_NamingService *aNamingService = SalomeApp_Application::namingService(); - CORBA::Object_var aSMObject = aNamingService->Resolve("/myStudyManager"); - SALOMEDS::StudyManager_var aStudyManager = SALOMEDS::StudyManager::_narrow(aSMObject); - SALOMEDS::Study_var aDSStudy = aStudyManager->GetStudyByID(theStudy->id()); + SALOMEDS::Study_var aDSStudy = GUI::getStudyServant(); SALOMEDS::SComponent_var aFather = aDSStudy->FindComponent(QCHARSTAR(moduleName())); if (aFather->_is_nil()) diff --git a/src/GuiHelpers/StandardApp_Module.hxx b/src/GuiHelpers/StandardApp_Module.hxx index 62dad7d0e..acf1a4c19 100644 --- a/src/GuiHelpers/StandardApp_Module.hxx +++ b/src/GuiHelpers/StandardApp_Module.hxx @@ -103,7 +103,7 @@ protected: virtual void createModuleActions(); /* Use this to create a root entry in the study for this module */ - void createStudyComponent(SUIT_Study*); + void createStudyComponent(); /* Implement this to say if study component entry should be created at activation step */ virtual bool createStudyComponentAtActivation(); diff --git a/src/LightApp/LightApp_Application.cxx b/src/LightApp/LightApp_Application.cxx index 1005ae4f4..79e89bd63 100644 --- a/src/LightApp/LightApp_Application.cxx +++ b/src/LightApp/LightApp_Application.cxx @@ -230,8 +230,6 @@ static const char* imageEmptyIcon[] = { "....................", "...................."}; -int LightApp_Application::lastStudyId = 0; - // Markers used to parse array with dockable windows and toolbars state. // For more details please see the qdockarealayout.cpp && qtoolbararealayout.cpp // in the Qt source code. @@ -295,14 +293,6 @@ namespace } } -/*! - \return last global id of study -*/ -int LightApp_Application::studyId() -{ - return LightApp_Application::lastStudyId; -} - /*!Create new instance of LightApp_Application.*/ extern "C" LIGHTAPP_EXPORT SUIT_Application* createApplication() { @@ -454,6 +444,8 @@ void LightApp_Application::start() desktop()->statusBar()->showMessage( "" ); LightApp_EventFilter::Init(); + + onNewDoc(); } /*!Closeapplication.*/ @@ -932,10 +924,8 @@ void LightApp_Application::onNewWindow() */ void LightApp_Application::onNewDoc() { -#ifdef SINGLE_DESKTOP if ( !checkExistingDoc() ) return; -#endif //asl: fix for 0020515 saveDockWindowsState(); @@ -950,10 +940,8 @@ void LightApp_Application::onOpenDoc() { SUIT_Study* study = activeStudy(); -#ifdef SINGLE_DESKTOP if ( !checkExistingDoc() ) return; -#endif CAM_Application::onOpenDoc(); @@ -970,10 +958,8 @@ void LightApp_Application::onOpenDoc() */ bool LightApp_Application::onOpenDoc( const QString& aName ) { -#ifdef SINGLE_DESKTOP if ( !checkExistingDoc() ) return false; -#endif saveDockWindowsState(); @@ -1357,10 +1343,9 @@ void LightApp_Application::placeDockWindow( const int id, Qt::DockWidgetArea pla /*! Gets window. \param flag - key for window - \param studyId - study id Flag used how identificator of window in windows list. */ -QWidget* LightApp_Application::getWindow( const int flag, const int ) +QWidget* LightApp_Application::getWindow( const int flag) { QWidget* wid = dockWindow( flag ); if ( !wid ) @@ -1999,8 +1984,6 @@ void LightApp_Application::updateActions() */ SUIT_Study* LightApp_Application::createNewStudy() { - LightApp_Application::lastStudyId++; - LightApp_Study* aStudy = new LightApp_Study( this ); // Set up processing of major study-related events @@ -5147,19 +5130,20 @@ bool LightApp_Application::checkExistingDoc() { bool result = true; if( activeStudy() ) { - int answer = SUIT_MessageBox::question( desktop(), - tr( "APPCLOSE_CAPTION" ), - tr( "STUDYCLOSE_DESCRIPTION" ), - tr( "APPCLOSE_SAVE" ), - tr( "APPCLOSE_CLOSE" ), - tr( "APPCLOSE_CANCEL" ), 0 ); + int answer = !activeStudy()->isModified() ? 1 : + SUIT_MessageBox::question( desktop(), + tr( "APPCLOSE_CAPTION" ), + tr( "STUDYCLOSE_DESCRIPTION" ), + tr( "APPCLOSE_SAVE" ), + tr( "APPCLOSE_CLOSE" ), + tr( "APPCLOSE_CANCEL" ), 0 ); if(answer == 0) { if ( activeStudy()->isSaved() ) { onSaveDoc(); closeDoc( false ); } else if ( onSaveAsDoc() ) { - if( !closeDoc( false ) ) { - result = false; + if( !closeDoc( false ) ) { + result = false; } } else { result = false; diff --git a/src/LightApp/LightApp_Application.h b/src/LightApp/LightApp_Application.h index 4d26aef25..767509dfe 100644 --- a/src/LightApp/LightApp_Application.h +++ b/src/LightApp/LightApp_Application.h @@ -135,7 +135,7 @@ public: virtual SUIT_ViewManager* createViewManager( const QString& vmType, QWidget* w ); virtual SUIT_ViewManager* createViewManager( SUIT_ViewModel* ); - QWidget* getWindow( const int, const int = -1 ); + QWidget* getWindow( const int ); QWidget* dockWindow( const int ) const; void removeDockWindow( const int ); void insertDockWindow( const int, QWidget* ); @@ -154,8 +154,6 @@ public: void setDefaultStudyName( const QString& theName ); - static int studyId(); - virtual bool event( QEvent* ); virtual bool checkDataObject( LightApp_DataObject* theObj ); @@ -248,7 +246,7 @@ protected slots: virtual void onWindowActivated( SUIT_ViewWindow* theViewWindow ); void onNewWindow(); - void onModuleActivation( const QString& ); + virtual void onModuleActivation( const QString& ); void onCloseView( SUIT_ViewManager* ); virtual void onStudyCreated( SUIT_Study* ); @@ -341,7 +339,6 @@ protected: static LightApp_Preferences* _prefs_; - static int lastStudyId; QStringList myUserWmTypes; }; diff --git a/src/LightApp/LightApp_Study.cxx b/src/LightApp/LightApp_Study.cxx index 9a3d5dfb7..debdb25b4 100644 --- a/src/LightApp/LightApp_Study.cxx +++ b/src/LightApp/LightApp_Study.cxx @@ -60,8 +60,6 @@ LightApp_Study::~LightApp_Study() */ bool LightApp_Study::createDocument( const QString& theStr ) { - setStudyName( QString( "Study%1" ).arg( LightApp_Application::studyId() ) ); - // create myRoot setRoot( new LightApp_RootObject( this ) ); diff --git a/src/LightApp/resources/LightApp_msg_en.ts b/src/LightApp/resources/LightApp_msg_en.ts index fd899055d..62c8b8d1e 100644 --- a/src/LightApp/resources/LightApp_msg_en.ts +++ b/src/LightApp/resources/LightApp_msg_en.ts @@ -56,15 +56,15 @@ CEA/DEN, CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS STUDYCLOSE_DESCRIPTION - You already have an active study in your session. It has to be closed before working with another study. + The current study has unsaved changes. Would you like to save before closing it? APPCLOSE_SAVE - &Save && Close + &Yes APPCLOSE_CLOSE - Close &w/o saving + &No APPCLOSE_CANCEL diff --git a/src/LightApp/resources/LightApp_msg_fr.ts b/src/LightApp/resources/LightApp_msg_fr.ts index b91790d59..6cd92b3d4 100755 --- a/src/LightApp/resources/LightApp_msg_fr.ts +++ b/src/LightApp/resources/LightApp_msg_fr.ts @@ -56,15 +56,15 @@ CEA/DEN, CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS STUDYCLOSE_DESCRIPTION - Une étude est déjà ouverte. Elle doit être fermée avant d'en ouvrir une autre. + Une étude a des modifications non enregistrées. Voulez-vous les sauvegarder avant de fermer? APPCLOSE_SAVE - &Sauvegarder && Fermer + &Oui APPCLOSE_CLOSE - &Fermer sans sauvegarder + &Non APPCLOSE_CANCEL diff --git a/src/LightApp/resources/LightApp_msg_ja.ts b/src/LightApp/resources/LightApp_msg_ja.ts index 02fa314f2..21df7e366 100644 --- a/src/LightApp/resources/LightApp_msg_ja.ts +++ b/src/LightApp/resources/LightApp_msg_ja.ts @@ -56,16 +56,15 @@ CEA/DEN, CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS STUDYCLOSE_DESCRIPTION - 既存のスタディを閉じる必要があります。閉じますか? - + The current study has unsaved changes. Would you like to save before closing it? APPCLOSE_SAVE - 保存して閉じる(&S) + はい(&Y) APPCLOSE_CLOSE - 保存せずに閉じる(&C) + いいえ(&N) APPCLOSE_CANCEL diff --git a/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_PyModule.cxx b/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_PyModule.cxx index e6ba25f84..f9d15e587 100644 --- a/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_PyModule.cxx +++ b/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_PyModule.cxx @@ -609,7 +609,6 @@ void PyModuleHelper::XmlHandler::insertPopupItems( QDomNode& parentNode, QMenu* SALOME GUI modules. */ -PyModuleHelper::InterpMap PyModuleHelper::myInterpMap; LightApp_Module* PyModuleHelper::myInitModule = 0; /*! @@ -1731,31 +1730,15 @@ QString PyModuleHelper::engineIOR() const /*! \brief Initialize python subinterpreter (one per study). \internal - \param studyId study ID */ -void PyModuleHelper::initInterp( int studyId ) +void PyModuleHelper::initInterp() { FuncMsg fmsg( "--- PyModuleHelper::initInterp()" ); - // check study Id - if ( !studyId ) { - // Error! Study Id must not be 0! - myInterp = 0; - return; - } - QMutexLocker ml( &myInitMutex ); - // try to find the subinterpreter - if ( myInterpMap.contains( studyId ) ) { - // found! - myInterp = myInterpMap[ studyId ]; - return; - } - myInterp = new SALOME_PYQT_PyInterp(); myInterp->initialize(); - myInterpMap[ studyId ] = myInterp; #ifndef GUI_DISABLE_CORBA if ( !SUIT_PYTHON::initialized ) { @@ -1772,7 +1755,7 @@ void PyModuleHelper::initInterp( int studyId ) } // ... then call a method int embedded = 1; - PyObjWrapper aRes( PyObject_CallMethod( aMod, (char*)"salome_init", (char*)"ii", studyId, embedded ) ); + PyObjWrapper aRes( PyObject_CallMethod( aMod, (char*)"salome_init", (char*)"i", embedded ) ); if ( !aRes ) { // Error! PyErr_Print(); @@ -1905,10 +1888,9 @@ void PyModuleHelper::internalInitialize( CAM_Application* app ) LightApp_Study* aStudy = dynamic_cast( app->activeStudy() ); if ( !aStudy ) return; - int aStudyId = aStudy ? aStudy->id() : 0; // initialize Python subinterpreter (on per study) and put it in variable - initInterp( aStudyId ); + initInterp(); if ( !myInterp ) return; // Error @@ -2006,10 +1988,11 @@ void PyModuleHelper::internalActivate( SUIT_Study* study ) // get study Id LightApp_Study* aStudy = dynamic_cast( study ); - int aStudyId = aStudy ? aStudy->id() : 0; + if ( !aStudy ) + return; // initialize Python subinterpreter (on per study) and put it in variable - initInterp( aStudyId ); + initInterp(); if ( !myInterp ) { myLastActivateStatus = false; return; // Error @@ -2058,10 +2041,11 @@ void PyModuleHelper::internalCustomize( SUIT_Study* study ) // get study Id LightApp_Study* aStudy = dynamic_cast( study ); - int aStudyId = aStudy ? aStudy->id() : 0; + if ( !aStudy ) + return; // initialize Python subinterpreter (on per study) and put it in variable - initInterp( aStudyId ); + initInterp(); if ( !myInterp ) { myLastActivateStatus = false; return; // Error @@ -2134,7 +2118,8 @@ void PyModuleHelper::internalClosedStudy( SUIT_Study* theStudy ) // Get study Id // get study Id LightApp_Study* aStudy = dynamic_cast( theStudy ); - int aStudyId = aStudy ? aStudy->id() : 0; + if ( !aStudy ) + return; // check that Python subinterpreter is initialized and Python module is imported if ( !myInterp || !myPyModule ) { @@ -2143,7 +2128,7 @@ void PyModuleHelper::internalClosedStudy( SUIT_Study* theStudy ) } // then call Python module's deactivate() method if ( PyObject_HasAttrString( myPyModule , (char*)"closeStudy" ) ) { - PyObjWrapper res( PyObject_CallMethod( myPyModule, (char*)"closeStudy", (char*)"i", aStudyId ) ); + PyObjWrapper res( PyObject_CallMethod( myPyModule, (char*)"closeStudy", (char*)"i" ) ); if( !res ) { PyErr_Print(); } @@ -2202,12 +2187,11 @@ void PyModuleHelper::internalStudyChanged( SUIT_Study* study ) // get study Id LightApp_Study* aStudy = dynamic_cast( study ); - int id = aStudy ? aStudy->id() : 0; - - fmsg.message( QString( "study id = %1" ).arg( id ) ); + if ( !aStudy ) + return; // initialize Python subinterpreter (on per study) and put it in variable - initInterp( id ); + initInterp(); if ( !myInterp ) return; // Error @@ -2224,7 +2208,7 @@ void PyModuleHelper::internalStudyChanged( SUIT_Study* study ) // call Python module's activeStudyChanged() method if ( PyObject_HasAttrString( myPyModule, (char*)"activeStudyChanged" ) ) { - PyObjWrapper res( PyObject_CallMethod( myPyModule, (char*)"activeStudyChanged", (char*)"i", id ) ); + PyObjWrapper res( PyObject_CallMethod( myPyModule, (char*)"activeStudyChanged", (char*)"i" ) ); if( !res ) { PyErr_Print(); } diff --git a/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_PyModule.h b/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_PyModule.h index e25fc9ab0..c4d1ca9fe 100644 --- a/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_PyModule.h +++ b/src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_PyModule.h @@ -54,9 +54,6 @@ private: class XmlHandler; class InitLocker; - typedef QMap InterpMap; - - static InterpMap myInterpMap; //!< study to Python subinterpreter map static LightApp_Module* myInitModule; //!< Python GUI being initialized (not zero only during the initialization) LightApp_Module* myModule; //!< GUI module @@ -110,7 +107,7 @@ public slots: void onObjectBrowserClicked(SUIT_DataObject*, int); private: - void initInterp( int ); + void initInterp(); void importModule(); void setWorkSpace(); diff --git a/src/SALOME_PYQT/SalomePyQt/SalomePyQt.cxx b/src/SALOME_PYQT/SalomePyQt/SalomePyQt.cxx index 699ce585f..aea4aa2d5 100644 --- a/src/SALOME_PYQT/SalomePyQt/SalomePyQt.cxx +++ b/src/SALOME_PYQT/SalomePyQt/SalomePyQt.cxx @@ -598,30 +598,6 @@ QTreeView* SalomePyQt::getObjectBrowser() return ProcessEvent( new TGetObjectBrowserEvent() ); } -/*! - \fn int SalomePyQt::getStudyId(); - \brief Get active study's identifier. - \return active study ID or 0 if there is no active study -*/ - -class TGetStudyIdEvent: public SALOME_Event -{ -public: - typedef int TResult; - TResult myResult; - TGetStudyIdEvent() : myResult( 0 ) {} - virtual void Execute() - { - if ( LightApp_Study* aStudy = getActiveStudy() ) { - myResult = aStudy->id(); - } - } -}; -int SalomePyQt::getStudyId() -{ - return ProcessEvent( new TGetStudyIdEvent() ); -} - /*! \fn SALOME_Selection* SalomePyQt::getSelection(); \brief Get the selection object for the current study. @@ -824,37 +800,23 @@ bool SalomePyQt::activateModule( const QString& modName ) } /*! - \brief Update an Object Browser of the specified (by identifier) study. - - If \a studyId <= 0 the active study's object browser is updated. - The \a updateSelection parameter is obsolete and currently is not used. - This parameter will be removed in future, so try to avoid its usage in - your code. - - \brief studyId study identifier - \brief updateSelection update selection flag (not used) - \sa getActiveStudy() + \brief Update an Object Browser of the study. */ -void SalomePyQt::updateObjBrowser( const int studyId, bool updateSelection ) +void SalomePyQt::updateObjBrowser() { class TEvent: public SALOME_Event { - int myStudyId; - bool myUpdateSelection; public: - TEvent( const int studyId, bool updateSelection ) - : myStudyId( studyId ), myUpdateSelection( updateSelection ) {} + TEvent() {} virtual void Execute() { if ( SUIT_Session::session() ) { - if ( getActiveStudy() && myStudyId <= 0 ) - myStudyId = getActiveStudy()->id(); - if ( myStudyId > 0 ) { + if ( getActiveStudy() ) { QList apps = SUIT_Session::session()->applications(); QList::Iterator it; for( it = apps.begin(); it != apps.end(); ++it ) { LightApp_Application* anApp = dynamic_cast( *it ); - if ( anApp && anApp->activeStudy() && anApp->activeStudy()->id() == myStudyId ) { + if ( anApp && anApp->activeStudy() ) { anApp->updateObjectBrowser(); return; } @@ -863,7 +825,7 @@ void SalomePyQt::updateObjBrowser( const int studyId, bool updateSelection ) } } }; - ProcessVoidEvent( new TEvent( studyId, updateSelection ) ); + ProcessVoidEvent( new TEvent() ); } diff --git a/src/SALOME_PYQT/SalomePyQt/SalomePyQt.h b/src/SALOME_PYQT/SalomePyQt/SalomePyQt.h index a64b01e89..8b749800e 100644 --- a/src/SALOME_PYQT/SalomePyQt/SalomePyQt.h +++ b/src/SALOME_PYQT/SalomePyQt/SalomePyQt.h @@ -189,12 +189,11 @@ public: static void disableSelector(); static SALOME_Selection* getSelection(); static void setSelection( const QStringList& ); - static int getStudyId(); static void putInfo( const QString&, const int = 0 ); static const QString getActiveComponent(); static PyObject* getActivePythonModule(); static bool activateModule( const QString& ); - static void updateObjBrowser( const int = 0, bool = true ); + static void updateObjBrowser(); static bool isModified(); static void setModified( bool ); diff --git a/src/SALOME_PYQT/SalomePyQt/SalomePyQt.sip b/src/SALOME_PYQT/SalomePyQt/SalomePyQt.sip index ca70e94c5..a80a8403a 100644 --- a/src/SALOME_PYQT/SalomePyQt/SalomePyQt.sip +++ b/src/SALOME_PYQT/SalomePyQt/SalomePyQt.sip @@ -299,13 +299,11 @@ public: static void enableSelector() /ReleaseGIL/ ; static void disableSelector() /ReleaseGIL/ ; static SALOME_Selection* getSelection() /Factory,ReleaseGIL/ ; - static void setSelection( const QStringList& ) /ReleaseGIL/ ; - static int getStudyId() /ReleaseGIL/ ; static void putInfo( const QString&, const int = 0 ) /ReleaseGIL/ ; static const QString getActiveComponent() /ReleaseGIL/ ; static SIP_PYOBJECT getActivePythonModule() /ReleaseGIL/ ; static bool activateModule( const QString& ) /ReleaseGIL/ ; - static void updateObjBrowser( const int = 0, bool = true ) /ReleaseGIL/ ; + static void updateObjBrowser() /ReleaseGIL/ ; static bool isModified() /ReleaseGIL/ ; static void setModified( bool ) /ReleaseGIL/ ; diff --git a/src/SALOME_SWIG/SALOMEGUI_Swig.cxx b/src/SALOME_SWIG/SALOMEGUI_Swig.cxx index bcd1e54ad..184ad8f63 100644 --- a/src/SALOME_SWIG/SALOMEGUI_Swig.cxx +++ b/src/SALOME_SWIG/SALOMEGUI_Swig.cxx @@ -71,7 +71,7 @@ This module provides an access to the SALOME GUI implementing set of functions which can be used from Python. This module is implemented using SWIG wrappings for some GUI functionality: - - getActiveStudyId(), getActiveStudyName() : get active study identifier and name + - getActiveStudyName() : get active study name - updateObjBrowser() : update contents of the Object Browser - SelectedCount() : get number of currently selected items - getSelected() : get entry of the speicified selected item @@ -173,9 +173,8 @@ bool SALOMEGUI_Swig::hasDesktop() /*! \brief Update active study's Object Browser. - \param updateSelection this parameter is obsolete */ -void SALOMEGUI_Swig::updateObjBrowser( bool /*updateSelection*/ ) +void SALOMEGUI_Swig::updateObjBrowser() { class TEvent: public SALOME_Event { @@ -192,30 +191,6 @@ void SALOMEGUI_Swig::updateObjBrowser( bool /*updateSelection*/ ) ProcessVoidEvent( new TEvent() ); } -/*! - \fn int SALOMEGUI_Swig::getActiveStudyId() - \brief Get active study identifier - \return active study's ID or 0 if there is no active study -*/ - -class TGetActiveStudyIdEvent: public SALOME_Event -{ -public: - typedef int TResult; - TResult myResult; - TGetActiveStudyIdEvent() : myResult( 0 ) {} - virtual void Execute() - { - if ( LightApp_Study* aStudy = getActiveStudy() ) { - myResult = aStudy->id(); - } - } -}; -int SALOMEGUI_Swig::getActiveStudyId() -{ - return ProcessEvent( new TGetActiveStudyIdEvent() ); -} - /*! \fn const char* SALOMEGUI_Swig::getActiveStudyName() \brief Get active study name diff --git a/src/SALOME_SWIG/SALOMEGUI_Swig.hxx b/src/SALOME_SWIG/SALOMEGUI_Swig.hxx index 6b537c8c9..f5d2227ee 100644 --- a/src/SALOME_SWIG/SALOMEGUI_Swig.hxx +++ b/src/SALOME_SWIG/SALOMEGUI_Swig.hxx @@ -35,9 +35,8 @@ public: bool hasDesktop(); - void updateObjBrowser( bool ); + void updateObjBrowser(); - int getActiveStudyId(); const char* getActiveStudyName(); const char* getComponentName( const char* ); diff --git a/src/SALOME_SWIG/SALOMEGUI_Swig.i b/src/SALOME_SWIG/SALOMEGUI_Swig.i index 10631d881..c77f14a6a 100644 --- a/src/SALOME_SWIG/SALOMEGUI_Swig.i +++ b/src/SALOME_SWIG/SALOMEGUI_Swig.i @@ -57,10 +57,9 @@ public: bool hasDesktop(); /* update object browser*/ - void updateObjBrowser(bool); + void updateObjBrowser(); /* get active study */ - int getActiveStudyId(); const char *getActiveStudyName(); /* get component name/username */ diff --git a/src/SALOME_SWIG/test_big_table.py b/src/SALOME_SWIG/test_big_table.py index f2aa597b6..109b56ffc 100755 --- a/src/SALOME_SWIG/test_big_table.py +++ b/src/SALOME_SWIG/test_big_table.py @@ -66,6 +66,6 @@ for i in range(1,myVerNb+1): ARealTable.SetTitle("Very useful data") # >>> Updating Object Browser ================================================ -salome.sg.updateObjBrowser(True) +salome.sg.updateObjBrowser() # ============================================================================ diff --git a/src/SALOME_SWIG/test_many_objects.py b/src/SALOME_SWIG/test_many_objects.py index 94df01f83..42897dace 100755 --- a/src/SALOME_SWIG/test_many_objects.py +++ b/src/SALOME_SWIG/test_many_objects.py @@ -84,7 +84,7 @@ for i in range(0,myNb1): myBuilder.Addreference(myRefObject,myObject3); # >>> Updating Object Browser ================================================ -salome.sg.updateObjBrowser(True) +salome.sg.updateObjBrowser() # ============================================================================ diff --git a/src/SALOME_SWIG/test_table.py b/src/SALOME_SWIG/test_table.py index e480f6ad8..780c3c7ae 100755 --- a/src/SALOME_SWIG/test_table.py +++ b/src/SALOME_SWIG/test_table.py @@ -109,7 +109,7 @@ ACmt = myBuilder.FindOrCreateAttribute(myCmtObject, "AttributeComment") ACmt.SetValue("Just a comment") # >>> Updating Object Browser ================================================ -salome.sg.updateObjBrowser(True) +salome.sg.updateObjBrowser() # ============================================================================ diff --git a/src/SOCC/SOCC_ViewModel.cxx b/src/SOCC/SOCC_ViewModel.cxx index 03825c7a4..3981d50cb 100755 --- a/src/SOCC/SOCC_ViewModel.cxx +++ b/src/SOCC/SOCC_ViewModel.cxx @@ -44,45 +44,11 @@ #include #include -// Temporarily commented to avoid awful dependecy on SALOMEDS -// TODO: better mechanism of storing display/erse status in a study -// should be provided... -//#include -//#include -//#include -//#include - -//#include "SALOMEDSClient.hxx" -//#include "SALOMEDS_StudyManager.hxx" - #include #include #include -// in order NOT TO link with SalomeApp, here the code returns SALOMEDS_Study. -// SalomeApp_Study::studyDS() does it as well, but -- here it is retrieved from -// SALOMEDS::StudyManager - no linkage with SalomeApp. - -// Temporarily commented to avoid awful dependecy on SALOMEDS -// TODO: better mechanism of storing display/erse status in a study -// should be provided... -//static _PTR(Study) getStudyDS() -//{ -// SALOMEDSClient_Study* aStudy = NULL; -// _PTR(StudyManager) aMgr( new SALOMEDS_StudyManager() ); - - // get id of SUIT_Study, if it's a SalomeApp_Study, it will return - // id of its underlying SALOMEDS::Study -// SUIT_Application* app = SUIT_Session::session()->activeApplication(); -// if ( !app ) return _PTR(Study)(aStudy); -// SUIT_Study* stud = app->activeStudy(); -// if ( !stud ) return _PTR(Study)(aStudy); -// const int id = stud->id(); // virtual method, must return SALOMEDS_Study id - // get SALOMEDS_Study with this id from StudyMgr -// return aMgr->GetStudyByID( id ); -//} - /*! Constructor \param DisplayTrihedron - is trihedron displayed @@ -320,12 +286,6 @@ void SOCC_Viewer::Display( const SALOME_OCCPrs* prs ) if ( !anOCCPrs || anOCCPrs->IsNull() ) return; - // get SALOMEDS Study - // Temporarily commented to avoid awful dependecy on SALOMEDS - // TODO: better mechanism of storing display/erse status in a study - // should be provided... - // _PTR(Study) study(getStudyDS()); - // get context Handle (AIS_InteractiveContext) ic = getAISContext(); @@ -401,8 +361,7 @@ void SOCC_Viewer::Display( const SALOME_OCCPrs* prs ) // Handle(SALOME_InteractiveObject)::DownCast( anAIS->GetOwner() ); //if ( !anObj.IsNull() && anObj->hasEntry() ) //{ - // if ( study ) - // ToolsGUI::SetVisibility( study, anObj->getEntry(), true, this ); + // ToolsGUI::SetVisibility( anObj->getEntry(), true, this ); //} // Deactivate object if necessary @@ -426,12 +385,6 @@ void SOCC_Viewer::Erase( const SALOME_OCCPrs* prs, const bool forced ) if ( !anOCCPrs || anOCCPrs->IsNull() ) return; - // get SALOMEDS Study - // Temporarily commented to avoid awful dependecy on SALOMEDS - // TODO: better mechanism of storing display/erse status in a study - // should be provided... - // _PTR(Study) study(getStudyDS()); - // get context Handle(AIS_InteractiveContext) ic = getAISContext(); @@ -455,8 +408,7 @@ void SOCC_Viewer::Erase( const SALOME_OCCPrs* prs, const bool forced ) // Handle(SALOME_InteractiveObject)::DownCast( anAIS->GetOwner() ); // if ( !anObj.IsNull() && anObj->hasEntry() ) // { - // if ( study ) - // ToolsGUI::SetVisibility( study, anObj->getEntry(), true, this ); + // ToolsGUI::SetVisibility( anObj->getEntry(), true, this ); // } //} } @@ -471,12 +423,6 @@ void SOCC_Viewer::Erase( const SALOME_OCCPrs* prs, const bool forced ) */ void SOCC_Viewer::EraseAll( SALOME_Displayer* d, const bool forced ) { - // get SALOMEDS Study - // Temporarily commented to avoid awful dependecy on SALOMEDS - // TODO: better mechanism of storing display/erse status in a study - // should be provided... - // _PTR(Study) study(getStudyDS()); - // get context Handle(AIS_InteractiveContext) ic = getAISContext(); @@ -504,8 +450,7 @@ void SOCC_Viewer::EraseAll( SALOME_Displayer* d, const bool forced ) // Handle(SALOME_InteractiveObject)::DownCast( anIO->GetOwner() ); // if ( !anObj.IsNull() && anObj->hasEntry() ) { - // if ( study ) - // ToolsGUI::SetVisibility( study, anObj->getEntry(), true, this ); + // ToolsGUI::SetVisibility( anObj->getEntry(), true, this ); // } //} } diff --git a/src/SPlot2d/SPlot2d_ViewModel.cxx b/src/SPlot2d/SPlot2d_ViewModel.cxx index abe70294a..f890ca74c 100644 --- a/src/SPlot2d/SPlot2d_ViewModel.cxx +++ b/src/SPlot2d/SPlot2d_ViewModel.cxx @@ -47,31 +47,6 @@ #include #include -//ASL: Temporary commented in order to avoir dependency on SALOMEDS - -//#include "SALOMEDSClient.hxx" -//#include "SALOMEDS_StudyManager.hxx" - -// in order NOT TO link with SalomeApp, here the code returns SALOMEDS_Study. -// SalomeApp_Study::studyDS() does it as well, but -- here it is retrieved from -// SALOMEDS::StudyManager - no linkage with SalomeApp. - -/*static _PTR(Study) getStudyDS() -{ - SALOMEDSClient_Study* aStudy = NULL; - _PTR(StudyManager) aMgr( new SALOMEDS_StudyManager() ); - - // get id of SUIT_Study, if it's a SalomeApp_Study, it will return - // id of its underlying SALOMEDS::Study - SUIT_Application* app = SUIT_Session::session()->activeApplication(); - if ( !app ) return _PTR(Study)(aStudy); - SUIT_Study* stud = app->activeStudy(); - if ( !stud ) return _PTR(Study)(aStudy); - const int id = stud->id(); // virtual method, must return SALOMEDS_Study id - // get SALOMEDS_Study with this id from StudyMgr - return aMgr->GetStudyByID( id ); -} */ - /*! Constructor */ diff --git a/src/STD/STD_Application.cxx b/src/STD/STD_Application.cxx index d5751cf34..1dcd838cf 100755 --- a/src/STD/STD_Application.cxx +++ b/src/STD/STD_Application.cxx @@ -156,6 +156,8 @@ void STD_Application::createActions() resMgr->loadPixmap( "STD", tr( "ICON_FILE_NEW" ) ), tr( "MEN_DESK_FILE_NEW" ), tr( "PRP_DESK_FILE_NEW" ), Qt::CTRL+Qt::Key_N, desk, false, this, SLOT( onNewDoc() ) ); + //no need at this action for mono-study application because study is always exists + action( FileNewId )->setVisible( false ); createAction( FileOpenId, tr( "TOT_DESK_FILE_OPEN" ), resMgr->loadPixmap( "STD", tr( "ICON_FILE_OPEN" ) ), @@ -367,16 +369,11 @@ bool STD_Application::onReopenDoc() // post closing actions afterCloseDoc(); - int aNbStudies = 0; - QList apps = SUIT_Session::session()->applications(); - for ( int i = 0; i < apps.count(); i++ ) - aNbStudies += apps.at( i )->getNbStudies(); - // reload study from the file res = useFile( studyName ) && activeStudy(); // if reloading is failed, close the desktop - if ( aNbStudies && !res ) + if ( activeStudy() && !res ) closeApplication(); else { diff --git a/src/SVTK/SVTK_ViewModel.cxx b/src/SVTK/SVTK_ViewModel.cxx index 28bc07177..eb5c339a8 100644 --- a/src/SVTK/SVTK_ViewModel.cxx +++ b/src/SVTK/SVTK_ViewModel.cxx @@ -50,29 +50,6 @@ // VSR: Uncomment below line to allow texture background support in VTK viewer #define VTK_ENABLE_TEXTURED_BACKGROUND - -// in order NOT TO link with SalomeApp, here the code returns SALOMEDS_Study. -// SalomeApp_Study::studyDS() does it as well, but -- here it is retrieved from -// SALOMEDS::StudyManager - no linkage with SalomeApp. - -// Temporarily commented to avoid awful dependecy on SALOMEDS -// TODO: better mechanism of storing display/erse status in a study -// should be provided... -//static _PTR(Study) getStudyDS() -//{ -// SALOMEDSClient_Study* aStudy = NULL; -// _PTR(StudyManager) aMgr( new SALOMEDS_StudyManager() ); - // get id of SUIT_Study, if it's a SalomeApp_Study, it will return - // id of its underlying SALOMEDS::Study -// SUIT_Application* app = SUIT_Session::session()->activeApplication(); -// if ( !app ) return _PTR(Study)(aStudy); -// SUIT_Study* stud = app->activeStudy(); -// if ( !stud ) return _PTR(Study)(aStudy); -// const int id = stud->id(); // virtual method, must return SALOMEDS_Study id - // get SALOMEDS_Study with this id from StudyMgr -// return aMgr->GetStudyByID( id ); -//} - /*! Constructor */ @@ -688,11 +665,6 @@ void SVTK_Viewer::Display( const SALOME_VTKPrs* prs ) if(aPrs->IsNull()) return; if(vtkActorCollection* anActorCollection = aPrs->GetObjects()){ - // get SALOMEDS Study - // Temporarily commented to avoid awful dependecy on SALOMEDS - // TODO: better mechanism of storing display/erse status in a study - // should be provided... - // _PTR(Study) aStudy(getStudyDS()); anActorCollection->InitTraversal(); while(vtkActor* anActor = anActorCollection->GetNextActor()){ if(SALOME_Actor* anAct = SALOME_Actor::SafeDownCast(anActor)){ @@ -703,8 +675,8 @@ void SVTK_Viewer::Display( const SALOME_VTKPrs* prs ) // TODO: better mechanism of storing display/erse status in a study // should be provided... //Handle(SALOME_InteractiveObject) anObj = anAct->getIO(); - //if(!anObj.IsNull() && anObj->hasEntry() && aStudy){ - // ToolsGUI::SetVisibility(aStudy,anObj->getEntry(),true,this); + //if(!anObj.IsNull() && anObj->hasEntry()){ + // ToolsGUI::SetVisibility(anObj->getEntry(),true,this); //} // just display the object QVector aViews = myViewManager->getViews(); @@ -737,11 +709,6 @@ void SVTK_Viewer::Erase( const SALOME_VTKPrs* prs, const bool forced ) if(aPrs->IsNull()) return; if(vtkActorCollection* anActorCollection = aPrs->GetObjects()){ - // get SALOMEDS Study - // Temporarily commented to avoid awful dependecy on SALOMEDS - // TODO: better mechanism of storing display/erase status in a study - // should be provided... - //_PTR(Study) aStudy(getStudyDS()); anActorCollection->InitTraversal(); while(vtkActor* anActor = anActorCollection->GetNextActor()) if(SALOME_Actor* anAct = SALOME_Actor::SafeDownCast(anActor)){ @@ -750,8 +717,8 @@ void SVTK_Viewer::Erase( const SALOME_VTKPrs* prs, const bool forced ) // TODO: better mechanism of storing display/erase status in a study // should be provided... //Handle(SALOME_InteractiveObject) anObj = anAct->getIO(); - //if(!anObj.IsNull() && anObj->hasEntry() && aStudy){ - // ToolsGUI::SetVisibility(aStudy,anObj->getEntry(),false,this); + //if(!anObj.IsNull() && anObj->hasEntry()){ + // ToolsGUI::SetVisibility(anObj->getEntry(),false,this); //} // just display the object QVector aViews = myViewManager->getViews(); @@ -776,10 +743,6 @@ void SVTK_Viewer::Erase( const SALOME_VTKPrs* prs, const bool forced ) */ void SVTK_Viewer::EraseAll( SALOME_Displayer* d, const bool forced ) { - // Temporarily commented to avoid awful dependecy on SALOMEDS - // TODO: better mechanism of storing display/erse status in a study - // should be provided... - //_PTR(Study) aStudy(getStudyDS()); QVector aViews = myViewManager->getViews(); for(int i = 0, iEnd = aViews.size(); i < iEnd; i++){ if(SVTK_ViewWindow* aViewWindow = dynamic_cast(aViews.at(i))) @@ -795,8 +758,8 @@ void SVTK_Viewer::EraseAll( SALOME_Displayer* d, const bool forced ) // TODO: better mechanism of storing display/erse status in a study // should be provided... //Handle(SALOME_InteractiveObject) anObj = anAct->getIO(); - //if(!anObj.IsNull() && anObj->hasEntry() && aStudy) - // ToolsGUI::SetVisibility(aStudy,anObj->getEntry(),false,this); + //if(!anObj.IsNull() && anObj->hasEntry()) + // ToolsGUI::SetVisibility(anObj->getEntry(),false,this); if(forced){ if(SVTK_Renderer* aRnd = aView->GetRenderer()) aRnd->RemoveActor(anAct); diff --git a/src/SalomeApp/SalomeApp_Application.cxx b/src/SalomeApp/SalomeApp_Application.cxx index 12a733584..c12854741 100644 --- a/src/SalomeApp/SalomeApp_Application.cxx +++ b/src/SalomeApp/SalomeApp_Application.cxx @@ -206,7 +206,6 @@ void SalomeApp_Application::start() QString hdffile; QStringList pyfiles; - QString loadStudy; for (int i = 1; i < qApp->arguments().size(); i++) { QRegExp rxs ("--study-hdf=(.+)"); @@ -240,14 +239,8 @@ void SalomeApp_Application::start() SALOME_EventFilter::Init(); setProperty("open_study_from_command_line", true); - if ( !hdffile.isEmpty() ) // open hdf file given as parameter + if ( !hdffile.isEmpty() ) // open hdf file given as parameter onOpenDoc( hdffile ); - else if ( pyfiles.count() > 0 ) // create new study - onNewDoc(); - else if (!loadStudy.isEmpty()) {// load study by name - if (onLoadDoc(loadStudy)) - updateObjectBrowser(true); - } setProperty("open_study_from_command_line", QVariant()); #ifndef DISABLE_PYCONSOLE @@ -256,8 +249,7 @@ void SalomeApp_Application::start() SalomeApp_Study* appStudy = dynamic_cast( activeStudy() ); PyConsole_Console* pyConsole = pythonConsole(); if ( appStudy && pyConsole ) { - _PTR(Study) aStudy = appStudy->studyDS(); - if ( !aStudy->GetProperties()->IsLocked() ) { + if ( !getStudy()->GetProperties()->IsLocked() ) { // pyfiles[j] is a dictionary: {"/absolute/path/to/script.py": [script_args]} // Path is absolute, script has .py extension for (uint j = 0; j < pyfiles.count(); j++ ) { @@ -335,10 +327,14 @@ void SalomeApp_Application::createActions() createAction( ConnectId, tr( "TOT_DESK_CONNECT_STUDY" ), QIcon(), tr( "MEN_DESK_CONNECT" ), tr( "PRP_DESK_CONNECT" ), Qt::CTRL+Qt::Key_L, desk, false, this, SLOT( onLoadDoc() ) ); + //no need at this action for mono-study application because study is always exists + action( ConnectId )->setVisible( false ); createAction( DisconnectId, tr( "TOT_DESK_DISCONNECT_STUDY" ), QIcon(), tr( "MEN_DESK_DISCONNECT" ), tr( "PRP_DESK_DISCONNECT" ), Qt::CTRL+Qt::Key_U, desk, false, this, SLOT( onUnloadDoc() ) ); + //no need at this action for mono-study application because study is always exists + action( DisconnectId )->setVisible( false ); int fileMenu = createMenu( tr( "MEN_DESK_FILE" ), -1 ); @@ -406,8 +402,6 @@ void SalomeApp_Application::onLoadDoc() { QString studyName; - std::vector List = studyMgr()->GetOpenStudies(); - // rnv: According to the single-study approach on the server side // can be only one study. So if it is exists connect to them, // overwise show warning message: "No active study on the server" @@ -439,14 +433,14 @@ void SalomeApp_Application::onLoadDoc() return; */ - if(List.size() <= 0) { + if(!activeStudy()) { SUIT_MessageBox::warning( desktop(), QObject::tr("WRN_WARNING"), QObject::tr("WRN_NO_STUDY_ON SERV") ); return; } - studyName = List[0].c_str(); + studyName = activeStudy()->studyName(); #ifndef WIN32 // this code replaces marker of windows drive and path become invalid therefore @@ -518,10 +512,9 @@ void SalomeApp_Application::onNewWithScript() /*!SLOT. Load document with \a aName.*/ bool SalomeApp_Application::onLoadDoc( const QString& aName ) { -#ifdef SINGLE_DESKTOP if ( !LightApp_Application::closeDoc() ) return false; -#endif + bool res = true; if ( !activeStudy() ) { // if no study - load in current desktop @@ -555,28 +548,40 @@ bool SalomeApp_Application::onLoadDoc( const QString& aName ) /*!SLOT. Parse message for desktop.*/ void SalomeApp_Application::onDesktopMessage( const QString& message ) { - if (message.indexOf("studyCreated:") == 0) { - // Enable 'Connect' action - updateCommandsStatus(); + if (message.indexOf("studyCreated") == 0) { + if (!activeStudy()) { + onNewDoc(); + updateCommandsStatus(); + } } - else if (message.indexOf("studyClosed:") == 0) { - /* message also contains ID of the closed study, - but as soon as SALOME is mono-study application for the moment, - this ID is not needed now.*/ - //long aStudyId = message.section(':', 1).toLong(); + if (message.indexOf("studyCleared") == 0) { // Disconnect GUI from active study, because it was closed on DS side. - closeActiveDoc( false ); - // Disable 'Connect' action - QAction* a = action( ConnectId ); - if ( a ) - a->setEnabled( false ); + if (activeStudy()) { + closeActiveDoc( false ); + // Disable 'Connect' action + QAction* a = action( ConnectId ); + if ( a ) + a->setEnabled( false ); + } } else if ( message.toLower() == "connect_to_study" ) { onLoadDoc(); } + if (message.indexOf("studyNameChanged") == 0) { + updateDesktopTitle(); + } LightApp_Application::onDesktopMessage( message ); } +/*!On module activation action.*/ +void SalomeApp_Application::onModuleActivation( const QString& modName ) +{ + if (!activeStudy() && !modName.isEmpty()) + getStudy()->Init(); + + LightApp_Application::onModuleActivation( modName ); +} + /*!SLOT. Copy objects to study maneger from selection maneger..*/ void SalomeApp_Application::onCopy() { @@ -587,7 +592,7 @@ void SalomeApp_Application::onCopy() SalomeApp_Study* study = dynamic_cast(activeStudy()); if(study == NULL) return; - _PTR(Study) stdDS = study->studyDS(); + _PTR(Study) stdDS = getStudy(); if(!stdDS) return; SALOME_ListIteratorOfListIO it( list ); @@ -595,7 +600,7 @@ void SalomeApp_Application::onCopy() { _PTR(SObject) so = stdDS->FindObjectID(it.Value()->getEntry()); try { - studyMgr()->Copy(so); + stdDS->Copy(so); onSelectionChanged(); } catch(...) { @@ -613,7 +618,7 @@ void SalomeApp_Application::onPaste() SalomeApp_Study* study = dynamic_cast(activeStudy()); if(study == NULL) return; - _PTR(Study) stdDS = study->studyDS(); + _PTR(Study) stdDS = getStudy(); if(!stdDS) return; if ( stdDS->GetProperties()->IsLocked() ) { @@ -628,7 +633,7 @@ void SalomeApp_Application::onPaste() { _PTR(SObject) so = stdDS->FindObjectID(it.Value()->getEntry()); try { - studyMgr()->Paste(so); + stdDS->Paste(so); updateObjectBrowser( true ); updateActions(); //SRN: BugID IPAL9377, case 3 } @@ -648,20 +653,18 @@ bool SalomeApp_Application::isPossibleToClose( bool& closePermanently ) /*! Check if the study is locked */ void SalomeApp_Application::onCloseDoc( bool ask ) { - SalomeApp_Study* study = dynamic_cast(activeStudy()); - - if (study != NULL) { - _PTR(Study) stdDS = study->studyDS(); - if(stdDS && stdDS->IsStudyLocked()) { - if ( SUIT_MessageBox::question( desktop(), - QObject::tr( "WRN_WARNING" ), - QObject::tr( "CLOSE_LOCKED_STUDY" ), - SUIT_MessageBox::Yes | SUIT_MessageBox::No, - SUIT_MessageBox::No) == SUIT_MessageBox::No ) return; + if(getStudy()->IsStudyLocked()) { + if ( SUIT_MessageBox::question( desktop(), + QObject::tr( "WRN_WARNING" ), + QObject::tr( "CLOSE_LOCKED_STUDY" ), + SUIT_MessageBox::Yes | SUIT_MessageBox::No, + SUIT_MessageBox::No) == SUIT_MessageBox::No ) return; - } } LightApp_Application::onCloseDoc( ask ); + + // reinitialize study to have empty data + getStudy()->Init(); } /*!Sets enable or disable some actions on selection changed.*/ @@ -681,21 +684,14 @@ void SalomeApp_Application::onSelectionChanged() canPaste = m->canPaste(); } - SalomeApp_Study* study = dynamic_cast(activeStudy()); - if (study) { - _PTR(Study) stdDS = study->studyDS(); + SALOME_ListIteratorOfListIO it ( list ); - if (stdDS) { - SALOME_ListIteratorOfListIO it ( list ); + if (it.More() && list.Extent() == 1) { + _PTR(SObject) so = getStudy()->FindObjectID(it.Value()->getEntry()); - if (it.More() && list.Extent() == 1) { - _PTR(SObject) so = stdDS->FindObjectID(it.Value()->getEntry()); - - if ( so ) { - canCopy = canCopy || studyMgr()->CanCopy(so); - canPaste = canPaste || studyMgr()->CanPaste(so); - } - } + if ( so ) { + canCopy = canCopy || getStudy()->CanCopy(so); + canPaste = canPaste || getStudy()->CanPaste(so); } } @@ -713,8 +709,7 @@ void SalomeApp_Application::onDeleteInvalidReferences() if( aList.IsEmpty() ) return; - SalomeApp_Study* aStudy = dynamic_cast(activeStudy()); - _PTR(Study) aStudyDS = aStudy->studyDS(); + _PTR(Study) aStudyDS = getStudy(); _PTR(StudyBuilder) aStudyBuilder = aStudyDS->NewBuilder(); _PTR(SObject) anObj; @@ -804,7 +799,7 @@ void SalomeApp_Application::updateCommandsStatus() // Connect study menu a = action( ConnectId ); if( a ) - a->setEnabled( !activeStudy() && studyMgr()->GetOpenStudies().size() > 0 ); + a->setEnabled( !activeStudy() ); // Disconnect study menu a = action( DisconnectId ); @@ -859,7 +854,6 @@ void SalomeApp_Application::onDumpStudy( ) { SalomeApp_Study* appStudy = dynamic_cast( activeStudy() ); if ( !appStudy ) return; - _PTR(Study) aStudy = appStudy->studyDS(); QStringList aFilters; aFilters.append( tr( "PYTHON_FILES_FILTER" ) ); @@ -911,15 +905,11 @@ void SalomeApp_Application::onDumpStudy( ) /*!Private SLOT. On load script.*/ void SalomeApp_Application::onLoadScript( ) { - SalomeApp_Study* appStudy = dynamic_cast( activeStudy() ); - if ( appStudy ) { - _PTR(Study) aStudy = appStudy->studyDS(); - if ( aStudy->GetProperties()->IsLocked() ) { - SUIT_MessageBox::warning( desktop(), - QObject::tr("WRN_WARNING"), - QObject::tr("WRN_STUDY_LOCKED") ); - return; - } + if ( getStudy()->GetProperties()->IsLocked() ) { + SUIT_MessageBox::warning( desktop(), + QObject::tr("WRN_WARNING"), + QObject::tr("WRN_STUDY_LOCKED") ); + return; } QStringList filtersList; @@ -1060,14 +1050,11 @@ QWidget* SalomeApp_Application::createWindow( const int flag ) } else if ( flag == WT_NoteBook ) { - SalomeApp_Study* appStudy = dynamic_cast( activeStudy() ); - if ( appStudy ) { - _PTR(Study) aStudy = appStudy->studyDS(); - setNoteBook( new SalomeApp_NoteBook( desktop(), aStudy ) ); - //to receive signal in NoteBook that it's variable was modified - connect( this, SIGNAL( notebookVarUpdated( QString ) ), - getNoteBook(), SLOT( onVarUpdate( QString ) ) ); - } + setNoteBook( new SalomeApp_NoteBook( desktop() ) ); + //to receive signal in NoteBook that it's variable was modified + connect( this, SIGNAL( notebookVarUpdated( QString ) ), + getNoteBook(), SLOT( onVarUpdate( QString ) ) ); + wid = getNoteBook(); wid->setObjectName( "noteBook" ); } @@ -1116,16 +1103,10 @@ void SalomeApp_Application::updateDesktopTitle() { { QString sName = SUIT_Tools::file( activeStudy()->studyName().trimmed(), false ); if ( !sName.isEmpty() ) { - SalomeApp_Study* study = dynamic_cast(activeStudy()); - if ( study ) { - _PTR(Study) stdDS = study->studyDS(); - if(stdDS) { - if ( stdDS->GetProperties()->IsLocked() ) { - aTitle += QString( " - [%1 (%2)]").arg( sName ).arg( tr( "STUDY_LOCKED" ) ); - } else { - aTitle += QString( " - [%1]" ).arg( sName ); - } - } + if ( getStudy()->GetProperties()->IsLocked() ) { + aTitle += QString( " - [%1 (%2)]").arg( sName ).arg( tr( "STUDY_LOCKED" ) ); + } else { + aTitle += QString( " - [%1]" ).arg( sName ); } } } @@ -1138,9 +1119,9 @@ int SalomeApp_Application::closeChoice( const QString& docName ) QStringList buttons; QMap choices; int idx = 0; - buttons << tr ("APPCLOSE_SAVE"); // Save & Close + buttons << tr ("APPCLOSE_SAVE"); // Save & Clear choices.insert( idx++, CloseSave ); // ... - buttons << tr ("APPCLOSE_CLOSE"); // Close w/o saving + buttons << tr ("APPCLOSE_CLOSE"); // Clear w/o saving choices.insert( idx++, CloseDiscard ); // ... if ( myIsCloseFromExit ) { buttons << tr ("APPCLOSE_UNLOAD_SAVE"); // Save & Disconnect @@ -1151,6 +1132,8 @@ int SalomeApp_Application::closeChoice( const QString& docName ) buttons << tr ("APPCLOSE_CANCEL"); // Cancel choices.insert( idx++, CloseCancel ); // ... + if( !activeStudy()->isModified() ) + return CloseCancel; int answer = SUIT_MessageBox::question( desktop(), tr( "APPCLOSE_CAPTION" ), tr( "APPCLOSE_DESCRIPTION" ), buttons, 0 ); return choices[answer]; @@ -1192,12 +1175,9 @@ int SalomeApp_Application::openChoice( const QString& aName ) if ( QFileInfo( aName ).exists() ) { if ( choice == OpenNew ) { // The document isn't already open. bool exist = false; - std::vector lst = studyMgr()->GetOpenStudies(); - for ( uint i = 0; i < lst.size() && !exist; i++ ) { - if ( aName == QString( lst[i].c_str() ) ) - exist = true; - } - // The document already exists in the study manager. + if ( aName == getStudy()->Name().c_str() ) + exist = true; + // The document already exists in the study. // Do you want to reload it? if ( exist ) { int answer = SUIT_MessageBox::question( desktop(), tr( "WRN_WARNING" ), tr( "QUE_DOC_ALREADYEXIST" ).arg( aName ), @@ -1226,12 +1206,7 @@ bool SalomeApp_Application::openAction( const int aChoice, const QString& aName { case OpenRefresh: { - _PTR(Study) aStudy = studyMgr()->GetStudyByName( aName.toStdString() ); - if ( aStudy ) - { - studyMgr()->Close( aStudy ); - choice = OpenNew; - } + choice = OpenNew; } default: res = LightApp_Application::openAction( choice, aName ); @@ -1304,12 +1279,16 @@ CORBA::ORB_var SalomeApp_Application::orb() return _orb; } -/*!Create and return SALOMEDS_StudyManager.*/ -SALOMEDSClient_StudyManager* SalomeApp_Application::studyMgr() +/*!Create and return SALOMEDS_Study.*/ +_PTR(Study) SalomeApp_Application::getStudy() { - static _PTR(StudyManager) _sm; - if(!_sm) _sm = ClientFactory::StudyManager(); - return _sm.get(); + static _PTR(Study) _study; + if(!_study) { + CORBA::Object_var aSObject = namingService()->Resolve("/Study"); + SALOMEDS::Study_var aStudy = SALOMEDS::Study::_narrow(aSObject); + _study = ClientFactory::Study(aStudy); + } + return _study; } /*!Create and return SALOME_NamingService.*/ @@ -1380,72 +1359,62 @@ void SalomeApp_Application::contextMenuPopup( const QString& type, QMenu* thePop // isInvalidRefs will be true, if at least one of selected objects is invalid reference bool isInvalidRefs = false; - SalomeApp_Study* aStudy = dynamic_cast(activeStudy()); - if ( aStudy ) { - _PTR(Study) aStudyDS = aStudy->studyDS(); - _PTR(SObject) anObj; - for( SALOME_ListIteratorOfListIO it( aList ); it.More() && !isInvalidRefs; it.Next() ) + _PTR(SObject) anObj; + for( SALOME_ListIteratorOfListIO it( aList ); it.More() && !isInvalidRefs; it.Next() ) + { + if( it.Value()->hasEntry() ) { - if( it.Value()->hasEntry() ) - { - _PTR(SObject) aSObject = aStudyDS->FindObjectID( it.Value()->getEntry() ), aRefObj = aSObject; - while( aRefObj && aRefObj->ReferencedObject( anObj ) ) - aRefObj = anObj; + _PTR(SObject) aSObject = getStudy()->FindObjectID( it.Value()->getEntry() ), aRefObj = aSObject; + while( aRefObj && aRefObj->ReferencedObject( anObj ) ) + aRefObj = anObj; - if( aRefObj && aRefObj!=aSObject && QString( aRefObj->GetName().c_str() ).isEmpty() ) - isInvalidRefs = true; - } + if( aRefObj && aRefObj!=aSObject && QString( aRefObj->GetName().c_str() ).isEmpty() ) + isInvalidRefs = true; } + } - // Add "Delete reference" item to popup - if ( isInvalidRefs ) - { - thePopup->addSeparator(); - thePopup->addAction( tr( "MEN_DELETE_INVALID_REFERENCE" ), this, SLOT( onDeleteInvalidReferences() ) ); - return; - } + // Add "Delete reference" item to popup + if ( isInvalidRefs ) + { + thePopup->addSeparator(); + thePopup->addAction( tr( "MEN_DELETE_INVALID_REFERENCE" ), this, SLOT( onDeleteInvalidReferences() ) ); + return; + } - // "Activate module" item should appear only if it's necessary - if ( aList.Extent() == 1 ) { - aList.Clear(); - mgr->selectedObjects( aList ); - - Handle(SALOME_InteractiveObject) aIObj = aList.First(); - - // add extra popup menu (defined in XML) - if ( myExtActions.size() > 0 ) { - // Use only first selected object - SalomeApp_Study* study = dynamic_cast( activeStudy() ); - if ( study ) { - _PTR(Study) stdDS = study->studyDS(); - if ( stdDS ) { - _PTR(SObject) aSO = stdDS->FindObjectID( aIObj->getEntry() ); - if ( aSO ) { - _PTR( GenericAttribute ) anAttr; - std::string auid = "AttributeUserID"; - auid += Kernel_Utils::GetGUID(Kernel_Utils::ObjectdID); - if ( aSO->FindAttribute( anAttr, auid ) ) { - _PTR(AttributeUserID) aAttrID = anAttr; - QString aId = aAttrID->Value().c_str(); - if ( myExtActions.contains( aId ) ) { - thePopup->addAction(myExtActions[aId]); - } - } - } + // "Activate module" item should appear only if it's necessary + if ( aList.Extent() == 1 ) { + aList.Clear(); + mgr->selectedObjects( aList ); + + Handle(SALOME_InteractiveObject) aIObj = aList.First(); + + // add extra popup menu (defined in XML) + if ( myExtActions.size() > 0 ) { + // Use only first selected object + _PTR(SObject) aSO = getStudy()->FindObjectID( aIObj->getEntry() ); + if ( aSO ) { + _PTR( GenericAttribute ) anAttr; + std::string auid = "AttributeUserID"; + auid += Kernel_Utils::GetGUID(Kernel_Utils::ObjectdID); + if ( aSO->FindAttribute( anAttr, auid ) ) { + _PTR(AttributeUserID) aAttrID = anAttr; + QString aId = aAttrID->Value().c_str(); + if ( myExtActions.contains( aId ) ) { + thePopup->addAction(myExtActions[aId]); } } } + } - // check if item is a "GUI state" item (also a first level object) - QString entry( aIObj->getEntry() ); - if ( !entry.startsWith( tr( "SAVE_POINT_DEF_NAME" ) ) ) { - QString aModuleName( aIObj->getComponentDataType() ); - QString aModuleTitle = moduleTitle( aModuleName ); - CAM_Module* currentModule = activeModule(); - if ( ( !currentModule || currentModule->moduleName() != aModuleTitle ) && !aModuleTitle.isEmpty() ) - thePopup->addAction( tr( "MEN_OPENWITH" ).arg( aModuleTitle ), this, SLOT( onOpenWith() ) ); - } + // check if item is a "GUI state" item (also a first level object) + QString entry( aIObj->getEntry() ); + if ( !entry.startsWith( tr( "SAVE_POINT_DEF_NAME" ) ) ) { + QString aModuleName( aIObj->getComponentDataType() ); + QString aModuleTitle = moduleTitle( aModuleName ); + CAM_Module* currentModule = activeModule(); + if ( ( !currentModule || currentModule->moduleName() != aModuleTitle ) && !aModuleTitle.isEmpty() ) + thePopup->addAction( tr( "MEN_OPENWITH" ).arg( aModuleTitle ), this, SLOT( onOpenWith() ) ); } } @@ -1462,25 +1431,21 @@ void SalomeApp_Application::updateObjectBrowser( const bool updateModels ) SalomeApp_Study* study = dynamic_cast(activeStudy()); if ( study ) { - _PTR(Study) stdDS = study->studyDS(); - if( stdDS ) + for ( _PTR(SComponentIterator) it ( getStudy()->NewComponentIterator() ); it->More(); it->Next() ) { - for ( _PTR(SComponentIterator) it ( stdDS->NewComponentIterator() ); it->More(); it->Next() ) - { - _PTR(SComponent) aComponent ( it->Value() ); + _PTR(SComponent) aComponent ( it->Value() ); #ifndef WITH_SALOMEDS_OBSERVER - // with GUI observers this check is not needed anymore - if ( aComponent->ComponentDataType() == study->getVisualComponentName().toLatin1().constData() ) - continue; // skip the magic "Interface Applicative" component + // with GUI observers this check is not needed anymore + if ( aComponent->ComponentDataType() == study->getVisualComponentName().toLatin1().constData() ) + continue; // skip the magic "Interface Applicative" component #endif - if ( !objectBrowser() ) - getWindow( WT_ObjectBrowser ); - const bool isAutoUpdate = objectBrowser()->autoUpdate(); - objectBrowser()->setAutoUpdate( false ); - SalomeApp_DataModel::synchronize( aComponent, study ); - objectBrowser()->setAutoUpdate( isAutoUpdate ); - } + if ( !objectBrowser() ) + getWindow( WT_ObjectBrowser ); + const bool isAutoUpdate = objectBrowser()->autoUpdate(); + objectBrowser()->setAutoUpdate( false ); + SalomeApp_DataModel::synchronize( aComponent, study ); + objectBrowser()->setAutoUpdate( isAutoUpdate ); } } @@ -1908,8 +1873,6 @@ bool SalomeApp_Application::updateStudy() myNoteBook->setIsDumpedStudySaved( study->isSaved() ); myNoteBook->setDumpedStudyName( study->studyName() ); - _PTR(Study) studyDS = study->studyDS(); - // get unique temporary directory name QString aTmpDir = QString::fromStdString( SALOMEDS_Tool::GetTmpDir() ); if( aTmpDir.isEmpty() ) @@ -1927,12 +1890,12 @@ bool SalomeApp_Application::updateStudy() int savePoint; _PTR(AttributeParameter) ap; _PTR(IParameters) ip = ClientFactory::getIParameters(ap); - if(ip->isDumpPython(studyDS)) ip->setDumpPython(studyDS); //Unset DumpPython flag. + if(ip->isDumpPython()) ip->setDumpPython(); //Unset DumpPython flag. if ( toSaveGUI ) { //SRN: Store a visual state of the study at the save point for DumpStudy method - ip->setDumpPython(studyDS); + ip->setDumpPython(); savePoint = SalomeApp_VisualState( this ).storeState(); //SRN: create a temporary save point } - bool ok = studyDS->DumpStudy( aTmpDir.toStdString(), aScriptName.toStdString(), toPublish, isMultiFile ); + bool ok = getStudy()->DumpStudy( aTmpDir.toStdString(), aScriptName.toStdString(), toPublish, isMultiFile ); if ( toSaveGUI ) study->removeSavePoint(savePoint); //SRN: remove the created temporary save point. @@ -1991,9 +1954,6 @@ bool SalomeApp_Application::onRestoreStudy( const QString& theDumpScript, { bool ok = true; - // create a new study - onNewDoc(); - // get active application SalomeApp_Application* app = dynamic_cast( SUIT_Session::session()->activeApplication() ); @@ -2019,9 +1979,8 @@ bool SalomeApp_Application::onRestoreStudy( const QString& theDumpScript, if( SalomeApp_Study* newStudy = dynamic_cast( app->activeStudy() ) ) { #ifndef DISABLE_PYCONSOLE - _PTR(Study) aStudyDS = newStudy->studyDS(); if ( app->getNoteBook() ) - app->getNoteBook()->Init( aStudyDS ); + app->getNoteBook()->Init(); newStudy->updateFromNotebook(theStudyName, theIsStudySaved); newStudy->Modified(); updateDesktopTitle(); @@ -2055,18 +2014,7 @@ void SalomeApp_Application::afterCloseDoc() */ bool SalomeApp_Application::checkExistingDoc() { - bool result = LightApp_Application::checkExistingDoc(); - if ( result && !activeStudy() ) { - SALOMEDSClient_StudyManager* aMgr = studyMgr(); - if ( aMgr ) { - std::vector List = studyMgr()->GetOpenStudies(); - if( List.size() > 0 ) { - SUIT_MessageBox::critical( desktop(), tr( "WRN_WARNING" ), tr( "ERR_ACTIVEDOC_LOAD" )); - result = false; - } - } - } - return result; + return LightApp_Application::checkExistingDoc(); } diff --git a/src/SalomeApp/SalomeApp_Application.h b/src/SalomeApp/SalomeApp_Application.h index ae6775ea7..cf112abbf 100644 --- a/src/SalomeApp/SalomeApp_Application.h +++ b/src/SalomeApp/SalomeApp_Application.h @@ -96,7 +96,7 @@ public: virtual bool checkExistingDoc(); static CORBA::ORB_var orb(); - static SALOMEDSClient_StudyManager* studyMgr(); + static _PTR(Study) getStudy(); static SALOME_NamingService* namingService(); static SALOME_LifeCycleCORBA* lcc(); @@ -141,6 +141,8 @@ protected slots: void onStudyOpened( SUIT_Study* ); void onDesktopMessage( const QString& ); + virtual void onModuleActivation( const QString& ); + protected: virtual void createActions(); virtual SUIT_Study* createNewStudy(); diff --git a/src/SalomeApp/SalomeApp_DataModel.cxx b/src/SalomeApp/SalomeApp_DataModel.cxx index bebd38e64..77a1ea824 100644 --- a/src/SalomeApp/SalomeApp_DataModel.cxx +++ b/src/SalomeApp/SalomeApp_DataModel.cxx @@ -286,8 +286,7 @@ bool SalomeApp_DataModel::open( const QString& name, CAM_Study* study, QStringLi if ( anId.isEmpty() ) return true; // Probably nothing to load - _PTR(Study) aStudy ( aDoc->studyDS() ); // shared_ptr cannot be used here - _PTR(SComponent) aSComp ( aStudy->FindComponentID( std::string( anId.toLatin1() ) ) ); + _PTR(SComponent) aSComp ( SalomeApp_Application::getStudy()->FindComponentID( std::string( anId.toLatin1() ) ) ); if ( aSComp ) updateTree( aSComp, aDoc ); @@ -321,8 +320,7 @@ void SalomeApp_DataModel::update( LightApp_DataObject*, LightApp_Study* study ) studyRoot = dynamic_cast( aSStudy->root() ); QString anId = getRootEntry( aSStudy ); if ( !anId.isEmpty() ){ // if nothing is published in the study for this module -> do nothing - _PTR(Study) aStudy ( aSStudy->studyDS() ); - sobj = aStudy->FindComponentID( std::string( anId.toLatin1() ) ); + sobj = SalomeApp_Application::getStudy()->FindComponentID( std::string( anId.toLatin1() ) ); } } } @@ -331,9 +329,8 @@ void SalomeApp_DataModel::update( LightApp_DataObject*, LightApp_Study* study ) if ( studyRoot ) { aSStudy = dynamic_cast( studyRoot->study() ); // value should not change here theoretically, but just to make sure if ( aSStudy ) { - _PTR(Study) aStudy ( aSStudy->studyDS() ); // modelRoot->object() cannot be reused here: it is about to be deleted by buildTree() soon - sobj = aStudy->FindComponentID( std::string( modelRoot->entry().toLatin1() ) ); + sobj = SalomeApp_Application::getStudy()->FindComponentID( std::string( modelRoot->entry().toLatin1() ) ); } } } diff --git a/src/SalomeApp/SalomeApp_DataObject.cxx b/src/SalomeApp/SalomeApp_DataObject.cxx index a6fd9c005..ba1afa068 100644 --- a/src/SalomeApp/SalomeApp_DataObject.cxx +++ b/src/SalomeApp/SalomeApp_DataObject.cxx @@ -291,7 +291,7 @@ QString SalomeApp_DataObject::toolTip( const int /*id*/ ) const if ( !CORBA::is_nil(aComponent) && aComponent->hasObjectInfo() ) { LightApp_RootObject* aRoot = dynamic_cast( root() ); if ( aRoot && aRoot->study() ) { - CORBA::String_var data = aComponent->getObjectInfo( aRoot->study()->id(), entry().toLatin1().constData()); + CORBA::String_var data = aComponent->getObjectInfo( entry().toLatin1().constData()); QString objInfo = data.in(); QStringList l; l << name(); @@ -405,13 +405,13 @@ bool SalomeApp_DataObject::hasChildren() const bool ok = false; // tmp?? - _PTR(UseCaseBuilder) aUseCaseBuilder = myObject->GetStudy()->GetUseCaseBuilder(); + _PTR(UseCaseBuilder) aUseCaseBuilder = SalomeApp_Application::getStudy()->GetUseCaseBuilder(); if (aUseCaseBuilder->IsUseCaseNode(myObject)) { ok = aUseCaseBuilder->HasChildren(myObject); // TODO: check name as below? } else { - _PTR(ChildIterator) it ( myObject->GetStudy()->NewChildIterator( myObject ) ); + _PTR(ChildIterator) it ( SalomeApp_Application::getStudy()->NewChildIterator( myObject ) ); for ( ; it->More() && !ok; it->Next() ) { _PTR(SObject) obj = it->Value(); if ( obj ) { @@ -548,36 +548,28 @@ QString SalomeApp_DataObject::value( const _PTR(SObject)& obj ) const QString aStrings = fromUtf8( str ); //Special case to show NoteBook variables in the "Value" column of the OB - if ( LightApp_RootObject* aRoot = dynamic_cast( root() ) ) + bool ok = false; + QStringList aSectionList = aStrings.split( "|" ); + if ( !aSectionList.isEmpty() ) { - if ( SalomeApp_Study* aStudy = dynamic_cast( aRoot->study() ) ) + QString aLastSection = aSectionList.last(); + QStringList aStringList = aLastSection.split( ":" ); + if ( !aStringList.isEmpty() ) { - _PTR(Study) studyDS( aStudy->studyDS() ); - - bool ok = false; - QStringList aSectionList = aStrings.split( "|" ); - if ( !aSectionList.isEmpty() ) + ok = true; + for ( int i = 0, n = aStringList.size(); i < n; i++ ) { - QString aLastSection = aSectionList.last(); - QStringList aStringList = aLastSection.split( ":" ); - if ( !aStringList.isEmpty() ) - { - ok = true; - for ( int i = 0, n = aStringList.size(); i < n; i++ ) - { - QString aStr = aStringList[i]; - if ( studyDS->IsVariable( aStr.toStdString() ) ) - val.append( aStr + ", " ); - } - - if ( !val.isEmpty() ) - val.remove( val.length() - 2, 2 ); - } + QString aStr = aStringList[i]; + if ( SalomeApp_Application::getStudy()->IsVariable( aStr.toStdString() ) ) + val.append( aStr + ", " ); } - if( !ok ) - val = aStrings; + + if ( !val.isEmpty() ) + val.remove( val.length() - 2, 2 ); } } + if( !ok ) + val = aStrings; } else if ( obj->FindAttribute( attr, "AttributeInteger" ) ) { diff --git a/src/SalomeApp/SalomeApp_DoubleSpinBox.cxx b/src/SalomeApp/SalomeApp_DoubleSpinBox.cxx index 9bdda7525..216b107cd 100644 --- a/src/SalomeApp/SalomeApp_DoubleSpinBox.cxx +++ b/src/SalomeApp/SalomeApp_DoubleSpinBox.cxx @@ -425,38 +425,35 @@ SalomeApp_DoubleSpinBox::SearchState SalomeApp_DoubleSpinBox::findVariable( cons value = 0; if( SalomeApp_Application* app = dynamic_cast( SUIT_Session::session()->activeApplication() ) ) { - if( SalomeApp_Study* study = dynamic_cast( app->activeStudy() ) ) - { - _PTR(Study) studyDS = study->studyDS(); + _PTR(Study) studyDS = SalomeApp_Application::getStudy(); - std::string aName = name.toStdString(); - if( studyDS->IsVariable( aName ) ) + std::string aName = name.toStdString(); + if( studyDS->IsVariable( aName ) ) + { + if( studyDS->IsReal( aName ) || studyDS->IsInteger( aName ) || studyDS->IsString( aName ) ) { - if( studyDS->IsReal( aName ) || studyDS->IsInteger( aName ) || studyDS->IsString( aName ) ) + if( studyDS->IsString( aName ) ) { - if( studyDS->IsString( aName ) ) - { #ifndef DISABLE_PYCONSOLE - PyConsole_Interp* pyInterp = app->getPyInterp(); - PyLockWrapper aLock; // Acquire GIL - std::string command; - command = "import salome_notebook ; "; - command += "salome_notebook.notebook.setAsReal(\""; - command += aName; - command += "\")"; - bool aResult; - aResult = pyInterp->run(command.c_str()); - if(aResult) - { - return IncorrectType; - } + PyConsole_Interp* pyInterp = app->getPyInterp(); + PyLockWrapper aLock; // Acquire GIL + std::string command; + command = "import salome_notebook ; "; + command += "salome_notebook.notebook.setAsReal(\""; + command += aName; + command += "\")"; + bool aResult; + aResult = pyInterp->run(command.c_str()); + if(aResult) + { + return IncorrectType; + } #endif - } - value = studyDS->GetReal( aName ); - return Found; } - return IncorrectType; + value = studyDS->GetReal( aName ); + return Found; } + return IncorrectType; } } return NotFound; diff --git a/src/SalomeApp/SalomeApp_Engine_i.cxx b/src/SalomeApp/SalomeApp_Engine_i.cxx index 16c1fcc29..108cee699 100644 --- a/src/SalomeApp/SalomeApp_Engine_i.cxx +++ b/src/SalomeApp/SalomeApp_Engine_i.cxx @@ -65,43 +65,37 @@ SALOMEDS::TMPFile* SalomeApp_Engine_i::Save (SALOMEDS::SComponent_ptr theCompone { SALOMEDS::TMPFile_var aStreamFile = new SALOMEDS::TMPFile; - if (CORBA::is_nil(theComponent) || CORBA::is_nil(theComponent->GetStudy())) + if (CORBA::is_nil(theComponent)) return aStreamFile._retn(); - const int studyId = theComponent->GetStudy()->StudyId(); - // Get a temporary directory to store a file //std::string aTmpDir = isMultiFile ? theURL : SALOMEDS_Tool::GetTmpDir(); - if (myMap.count(studyId)) { - std::string componentName (theComponent->ComponentDataType()); - - // Error somewhere outside - Save() called with - // wrong SComponent instance - if ( myComponentName != componentName ) - return aStreamFile._retn(); + std::string componentName (theComponent->ComponentDataType()); - const ListOfFiles& listOfFiles = myMap[studyId]; + // Error somewhere outside - Save() called with + // wrong SComponent instance + if ( myComponentName != componentName ) + return aStreamFile._retn(); - // listOfFiles must contain temporary directory name in its first item - // and names of files (relatively the temporary directory) in the others - const int n = listOfFiles.size() - 1; + // listOfFiles must contain temporary directory name in its first item + // and names of files (relatively the temporary directory) in the others + const int n = myListOfFiles.size() - 1; - if (n > 0) { // there are some files, containing persistent data of the component - std::string aTmpDir = listOfFiles[0]; + if (n > 0) { // there are some files, containing persistent data of the component + std::string aTmpDir = myListOfFiles[0]; - // Create a list to store names of created files - SALOMEDS::ListOfFileNames_var aSeq = new SALOMEDS::ListOfFileNames; - aSeq->length(n); - for (int i = 0; i < n; i++) - aSeq[i] = CORBA::string_dup(listOfFiles[i + 1].c_str()); + // Create a list to store names of created files + ListOfFiles aSeq; + aSeq.reserve(n); + for (int i = 0; i < n; i++) + aSeq.push_back(CORBA::string_dup(myListOfFiles[i + 1].c_str())); - // Convert a file to the byte stream - aStreamFile = SALOMEDS_Tool::PutFilesToStream(aTmpDir.c_str(), aSeq.in(), isMultiFile); + // Convert a file to the byte stream + aStreamFile = SALOMEDS_Tool::PutFilesToStream(aTmpDir.c_str(), aSeq, isMultiFile); - // Remove the files and tmp directory, created by the component storage procedure - if (!isMultiFile) SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir.c_str(), aSeq.in(), true); - } + // Remove the files and tmp directory, created by the component storage procedure + if (!isMultiFile) SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir.c_str(), aSeq, true); } return aStreamFile._retn(); @@ -113,7 +107,7 @@ CORBA::Boolean SalomeApp_Engine_i::Load (SALOMEDS::SComponent_ptr theComponent, bool isMultiFile) { std::cout << "SalomeApp_Engine_i::Load() isMultiFile = " << isMultiFile << std::endl; - if (CORBA::is_nil(theComponent) || CORBA::is_nil(theComponent->GetStudy())) + if (CORBA::is_nil(theComponent)) return false; // Error somewhere outside - Load() called with @@ -122,53 +116,42 @@ CORBA::Boolean SalomeApp_Engine_i::Load (SALOMEDS::SComponent_ptr theComponent, if ( myComponentName != componentName ) return false; - const int studyId = theComponent->GetStudy()->StudyId(); - // Create a temporary directory for the component's data files std::string aTmpDir = isMultiFile ? theURL : SALOMEDS_Tool::GetTmpDir(); // Convert the byte stream theStream to a files and place them in the tmp directory. // The files and temporary directory must be deleted by the component loading procedure. - SALOMEDS::ListOfFileNames_var aSeq = + ListOfFiles aSeq = SALOMEDS_Tool::PutStreamToFiles(theFile, aTmpDir.c_str(), isMultiFile); // Store list of file names to be used by the component loading procedure - const int n = aSeq->length() + 1; + const int n = aSeq.size() + 1; ListOfFiles listOfFiles (n); listOfFiles[0] = aTmpDir; for (int i = 1; i < n; i++) listOfFiles[i] = std::string(aSeq[i - 1]); - SetListOfFiles(listOfFiles, studyId); + SetListOfFiles(listOfFiles); return true; } -SalomeApp_Engine_i::ListOfFiles SalomeApp_Engine_i::GetListOfFiles (const int theStudyId) +SalomeApp_Engine_i::ListOfFiles SalomeApp_Engine_i::GetListOfFiles() { - ListOfFiles aListOfFiles; - - if (myMap.find(theStudyId) != myMap.end()) - { - aListOfFiles = myMap[theStudyId]; - } - - return aListOfFiles; + return myListOfFiles; } -void SalomeApp_Engine_i::SetListOfFiles (const ListOfFiles& theListOfFiles, - const int theStudyId) +void SalomeApp_Engine_i::SetListOfFiles (const ListOfFiles& theListOfFiles) { - myMap[theStudyId] = theListOfFiles; + myListOfFiles = theListOfFiles; } /*! * DumpPython implementation for light modules */ -Engines::TMPFile* SalomeApp_Engine_i::DumpPython(CORBA::Object_ptr theStudy, - CORBA::Boolean isPublished, - CORBA::Boolean isMultiFile, - CORBA::Boolean& isValidScript) +Engines::TMPFile* SalomeApp_Engine_i::DumpPython(CORBA::Boolean isPublished, + CORBA::Boolean isMultiFile, + CORBA::Boolean& isValidScript) { MESSAGE("SalomeApp_Engine_i::DumpPython(): myComponentName = "<< myComponentName << ", this = " << this); @@ -182,24 +165,13 @@ Engines::TMPFile* SalomeApp_Engine_i::DumpPython(CORBA::Object_ptr theStudy, aStreamFile[0] = '\0'; isValidScript = true; - if (CORBA::is_nil(theStudy)) - return aStreamFile._retn(); - - SALOMEDS::Study_var studyDS = SALOMEDS::Study::_narrow( theStudy ); - const int studyId = studyDS->StudyId(); - - if (!myMap.count(studyId)) - return aStreamFile._retn(); - - ListOfFiles listOfFiles = myMap[studyId]; - // listOfFiles must contain temporary directory name in its first item // and names of files (relatively the temporary directory) in the others - if ( listOfFiles.size() < 2 ) + if ( myListOfFiles.size() < 2 ) return aStreamFile._retn(); // there are some files, containing persistent data of the component - QString aTmpPath( listOfFiles.front().c_str() ); + QString aTmpPath( myListOfFiles.front().c_str() ); QDir aTmpDir( aTmpPath ); if ( !aTmpDir.exists() ) return aStreamFile._retn(); @@ -208,8 +180,8 @@ Engines::TMPFile* SalomeApp_Engine_i::DumpPython(CORBA::Object_ptr theStudy, QStringList aFilePaths; QList aFileSizes; qint64 aBuffSize = 0; - ListOfFiles::const_iterator aFIt = listOfFiles.begin(); - ListOfFiles::const_iterator aFEnd = listOfFiles.end(); + ListOfFiles::const_iterator aFIt = myListOfFiles.begin(); + ListOfFiles::const_iterator aFEnd = myListOfFiles.end(); aFIt++; for (; aFIt != aFEnd; aFIt++){ QString aFileName( (*aFIt).c_str() ); diff --git a/src/SalomeApp/SalomeApp_Engine_i.h b/src/SalomeApp/SalomeApp_Engine_i.h index ec2641913..98412512b 100644 --- a/src/SalomeApp/SalomeApp_Engine_i.h +++ b/src/SalomeApp/SalomeApp_Engine_i.h @@ -55,17 +55,15 @@ public: const char* theURL, bool isMultiFile ); - virtual Engines::TMPFile* DumpPython(CORBA::Object_ptr theStudy, - CORBA::Boolean isPublished, + virtual Engines::TMPFile* DumpPython(CORBA::Boolean isPublished, CORBA::Boolean isMultiFile, CORBA::Boolean& isValidScript); public: typedef std::vector ListOfFiles; - ListOfFiles GetListOfFiles (const int theStudyId); - void SetListOfFiles (const ListOfFiles& theListOfFiles, - const int theStudyId); + ListOfFiles GetListOfFiles (); + void SetListOfFiles (const ListOfFiles& theListOfFiles); static std::string EngineIORForComponent( const char* theComponentName, bool toCreate ); @@ -85,7 +83,7 @@ public: char* IORToLocalPersistentID( SALOMEDS::SObject_ptr, const char*, CORBA::Boolean, CORBA::Boolean ) {return 0;} char* LocalPersistentIDToIOR( SALOMEDS::SObject_ptr, const char*, CORBA::Boolean, CORBA::Boolean ) {return 0;} bool CanPublishInStudy( CORBA::Object_ptr ) {return 0;} - SALOMEDS::SObject_ptr PublishInStudy(SALOMEDS::Study_ptr, SALOMEDS::SObject_ptr, CORBA::Object_ptr, const char* ) throw (SALOME::SALOME_Exception) {return 0;} + SALOMEDS::SObject_ptr PublishInStudy( SALOMEDS::SObject_ptr, CORBA::Object_ptr, const char* ) throw (SALOME::SALOME_Exception) {return 0;} CORBA::Boolean CanCopy( SALOMEDS::SObject_ptr ) {return 0;} SALOMEDS::TMPFile* CopyFrom( SALOMEDS::SObject_ptr, CORBA::Long& ) {return 0;} CORBA::Boolean CanPaste( const char*, CORBA::Long ) {return 0;} @@ -98,8 +96,7 @@ private: static PortableServer::POA_var poa(); static SALOME_NamingService* namingService(); private: - typedef std::map MapOfListOfFiles; - MapOfListOfFiles myMap; + ListOfFiles myListOfFiles; std::string myComponentName; }; diff --git a/src/SalomeApp/SalomeApp_IntSpinBox.cxx b/src/SalomeApp/SalomeApp_IntSpinBox.cxx index 64bf5a306..bb4e01b88 100644 --- a/src/SalomeApp/SalomeApp_IntSpinBox.cxx +++ b/src/SalomeApp/SalomeApp_IntSpinBox.cxx @@ -373,38 +373,35 @@ SalomeApp_IntSpinBox::SearchState SalomeApp_IntSpinBox::findVariable( const QStr value = 0; if( SalomeApp_Application* app = dynamic_cast( SUIT_Session::session()->activeApplication() ) ) { - if( SalomeApp_Study* study = dynamic_cast( app->activeStudy() ) ) - { - _PTR(Study) studyDS = study->studyDS(); + _PTR(Study) studyDS = SalomeApp_Application::getStudy(); - std::string aName = name.toStdString(); - if( studyDS->IsVariable( aName ) ) + std::string aName = name.toStdString(); + if( studyDS->IsVariable( aName ) ) + { + if( studyDS->IsInteger( aName ) || studyDS->IsString( aName ) ) { - if( studyDS->IsInteger( aName ) || studyDS->IsString( aName ) ) + if( studyDS->IsString( aName ) ) { - if( studyDS->IsString( aName ) ) - { #ifndef DISABLE_PYCONSOLE - PyConsole_Interp* pyInterp = app->getPyInterp(); - PyLockWrapper aLock; // Acquire GIL - std::string command; - command = "import salome_notebook ; "; - command += "salome_notebook.notebook.setAsInteger(\""; - command += aName; - command += "\")"; - bool aResult; - aResult = pyInterp->run(command.c_str()); - if(aResult) - { - return IncorrectType; - } + PyConsole_Interp* pyInterp = app->getPyInterp(); + PyLockWrapper aLock; // Acquire GIL + std::string command; + command = "import salome_notebook ; "; + command += "salome_notebook.notebook.setAsInteger(\""; + command += aName; + command += "\")"; + bool aResult; + aResult = pyInterp->run(command.c_str()); + if(aResult) + { + return IncorrectType; + } #endif - } - value = studyDS->GetInteger( aName ); - return Found; } - return IncorrectType; + value = studyDS->GetInteger( aName ); + return Found; } + return IncorrectType; } } return NotFound; diff --git a/src/SalomeApp/SalomeApp_NoteBook.cxx b/src/SalomeApp/SalomeApp_NoteBook.cxx index 749ce3798..64d75941f 100644 --- a/src/SalomeApp/SalomeApp_NoteBook.cxx +++ b/src/SalomeApp/SalomeApp_NoteBook.cxx @@ -378,7 +378,7 @@ int NoteBook_Table::getUniqueIndex() const * Purpose : Add variables in the table from theStudy */ //============================================================================ -void NoteBook_Table::Init(_PTR(Study) theStudy) +void NoteBook_Table::Init() { isProcessItemChangedSignal = false; @@ -403,10 +403,10 @@ void NoteBook_Table::Init(_PTR(Study) theStudy) myVariableMap.clear(); //Add all variables into the table - std::vector aVariables = theStudy->GetVariableNames(); + std::vector aVariables = SalomeApp_Application::getStudy()->GetVariableNames(); for(int iVar = 0; iVar < aVariables.size(); iVar++ ) { AddRow(QString(aVariables[iVar].c_str()), - Variable2String(aVariables[iVar],theStudy)); + Variable2String(aVariables[iVar])); } //Add empty row @@ -414,8 +414,6 @@ void NoteBook_Table::Init(_PTR(Study) theStudy) isProcessItemChangedSignal = true; ResetMaps(); - - myStudy = theStudy; } //============================================================================ @@ -423,18 +421,18 @@ void NoteBook_Table::Init(_PTR(Study) theStudy) * Purpose : Convert variable values to QString */ //============================================================================ -QString NoteBook_Table::Variable2String(const std::string& theVarName, - _PTR(Study) theStudy) +QString NoteBook_Table::Variable2String(const std::string& theVarName) { + _PTR(Study) aStudy = SalomeApp_Application::getStudy(); QString aResult; - if( theStudy->IsReal(theVarName) ) - aResult = QString::number(theStudy->GetReal(theVarName)); - else if( theStudy->IsInteger(theVarName) ) - aResult = QString::number(theStudy->GetInteger(theVarName)); - else if( theStudy->IsBoolean(theVarName) ) - aResult = theStudy->GetBoolean(theVarName) ? QString("True") : QString("False"); - else if( theStudy->IsString(theVarName) ) - aResult = theStudy->GetString(theVarName).c_str(); + if( aStudy->IsReal(theVarName) ) + aResult = QString::number(aStudy->GetReal(theVarName)); + else if( aStudy->IsInteger(theVarName) ) + aResult = QString::number(aStudy->GetInteger(theVarName)); + else if( aStudy->IsBoolean(theVarName) ) + aResult = aStudy->GetBoolean(theVarName) ? QString("True") : QString("False"); + else if( aStudy->IsString(theVarName) ) + aResult = aStudy->GetString(theVarName).c_str(); return aResult; } @@ -566,7 +564,7 @@ void NoteBook_Table::onItemChanged(QTableWidgetItem* theItem) if( myVariableMap.contains( anIndex ) ) { const NoteBoox_Variable& aVariable = myVariableMap[ anIndex ]; - if( !aVariable.Name.isEmpty() && myStudy->IsVariableUsed( std::string( aVariable.Name.toLatin1().constData() ) ) ) + if( !aVariable.Name.isEmpty() && SalomeApp_Application::getStudy()->IsVariableUsed( std::string( aVariable.Name.toLatin1().constData() ) ) ) { if( QMessageBox::warning( parentWidget(), tr( "WARNING" ), tr( "RENAME_VARIABLE_IS_USED" ).arg( aVariable.Name ), @@ -661,6 +659,7 @@ bool NoteBook_Table::IsUniqueName(const NoteBook_TableRow* theRow) const //============================================================================ void NoteBook_Table::RemoveSelected() { + _PTR(Study) aStudy = SalomeApp_Application::getStudy(); isProcessItemChangedSignal = false; QList aSelectedItems = selectedItems(); if( !(aSelectedItems.size() > 0)) { @@ -678,7 +677,7 @@ void NoteBook_Table::RemoveSelected() else { int nRow = row(aSelectedItems[i]); - if( myStudy->IsVariableUsed( std::string( aRow->GetName().toLatin1().constData() ) ) ) + if( aStudy->IsVariableUsed( std::string( aRow->GetName().toLatin1().constData() ) ) ) { if( QMessageBox::warning( parentWidget(), tr( "WARNING" ), tr( "REMOVE_VARIABLE_IS_USED" ).arg( aRow->GetName() ), @@ -696,7 +695,7 @@ void NoteBook_Table::RemoveSelected() myVariableMap.remove( index ); removeRow(nRow); myRows.removeAt(nRow); - if(myStudy->IsVariable(aVarName.toLatin1().constData())) + if(aStudy->IsVariable(aVarName.toLatin1().constData())) removedFromStudy = true; } } @@ -757,9 +756,8 @@ void NoteBook_Table::ResetMaps() * Purpose : Constructor */ //============================================================================ -SalomeApp_NoteBook::SalomeApp_NoteBook(QWidget * parent, _PTR(Study) theStudy): - QWidget(parent), - myStudy(theStudy) +SalomeApp_NoteBook::SalomeApp_NoteBook(QWidget * parent): + QWidget(parent) { setObjectName("SalomeApp_NoteBook"); setWindowTitle(tr("NOTEBOOK_TITLE")); @@ -789,7 +787,7 @@ SalomeApp_NoteBook::SalomeApp_NoteBook(QWidget * parent, _PTR(Study) theStudy): connect( myUpdateStudyBtn, SIGNAL(clicked()), this, SLOT(onUpdateStudy()) ); connect( myRemoveButton, SIGNAL(clicked()), this, SLOT(onRemove())); - myTable->Init(myStudy); + myTable->Init(); myDumpedStudyScript = ""; myIsDumpedStudySaved = false; @@ -808,10 +806,8 @@ SalomeApp_NoteBook::~SalomeApp_NoteBook(){} * Purpose : init variable table */ //============================================================================ -void SalomeApp_NoteBook::Init(_PTR(Study) theStudy){ - if(myStudy!= theStudy) - myStudy = theStudy; - myTable->Init(myStudy); +void SalomeApp_NoteBook::Init(){ + myTable->Init(); } @@ -822,7 +818,7 @@ void SalomeApp_NoteBook::Init(_PTR(Study) theStudy){ //============================================================================ void SalomeApp_NoteBook::onVarUpdate(QString theVarName) { - myTable->Init(myStudy); + myTable->Init(); } //============================================================================ @@ -837,6 +833,7 @@ void SalomeApp_NoteBook::onApply() SUIT_MessageBox::warning( this, tr( "WARNING" ), tr( "INCORRECT_DATA" ) ); return; } + _PTR(Study) aStudy = SalomeApp_Application::getStudy(); double aDVal; int anIVal; @@ -852,7 +849,7 @@ void SalomeApp_NoteBook::onApply() if( aVariableMapRef.contains( anIndex ) ) { QString aRemovedVariable = aVariableMapRef[ anIndex ].Name; - myStudy->RemoveVariable( std::string( aRemovedVariable.toLatin1().constData() ) ); + aStudy->RemoveVariable( std::string( aRemovedVariable.toLatin1().constData() ) ); } } @@ -874,22 +871,22 @@ void SalomeApp_NoteBook::onApply() if( !aNameRef.isEmpty() && !aValueRef.isEmpty() && aNameRef != aName ) { - myStudy->RenameVariable( std::string( aNameRef.toLatin1().constData() ), - std::string( aName.toLatin1().constData() ) ); + aStudy->RenameVariable( std::string( aNameRef.toLatin1().constData() ), + std::string( aName.toLatin1().constData() ) ); } } if( NoteBook_TableRow::IsIntegerValue(aValue,&anIVal) ) - myStudy->SetInteger(std::string(aName.toLatin1().constData()),anIVal); + aStudy->SetInteger(std::string(aName.toLatin1().constData()),anIVal); else if( NoteBook_TableRow::IsRealValue(aValue,&aDVal) ) - myStudy->SetReal(std::string(aName.toLatin1().constData()),aDVal); + aStudy->SetReal(std::string(aName.toLatin1().constData()),aDVal); else if( NoteBook_TableRow::IsBooleanValue(aValue,&aBVal) ) - myStudy->SetBoolean(std::string(aName.toLatin1().constData()),aBVal); + aStudy->SetBoolean(std::string(aName.toLatin1().constData()),aBVal); else - myStudy->SetString(std::string(aName.toLatin1().constData()),aValue.toStdString()); + aStudy->SetString(std::string(aName.toLatin1().constData()),aValue.toStdString()); } } myTable->ResetMaps(); @@ -898,7 +895,7 @@ void SalomeApp_NoteBook::onApply() if(app) app->updateActions(); - myStudy->Modified(); + aStudy->Modified(); } //============================================================================ diff --git a/src/SalomeApp/SalomeApp_NoteBook.h b/src/SalomeApp/SalomeApp_NoteBook.h index ba4e96b25..4722ee7aa 100644 --- a/src/SalomeApp/SalomeApp_NoteBook.h +++ b/src/SalomeApp/SalomeApp_NoteBook.h @@ -95,9 +95,8 @@ class SALOMEAPP_EXPORT NoteBook_Table : public QTableWidget NoteBook_Table(QWidget * parent = 0); virtual ~NoteBook_Table(); - void Init(_PTR(Study) theStudy); - static QString Variable2String(const std::string& theVarName, - _PTR(Study) theStudy); + void Init(); + static QString Variable2String(const std::string& theVarName); bool IsValid() const; @@ -137,18 +136,16 @@ class SALOMEAPP_EXPORT NoteBook_Table : public QTableWidget QList myRemovedRows; VariableMap myVariableMapRef; VariableMap myVariableMap; - - _PTR(Study) myStudy; }; class SALOMEAPP_EXPORT SalomeApp_NoteBook : public QWidget { Q_OBJECT public: - SalomeApp_NoteBook(QWidget * parent , _PTR(Study) theStudy); + SalomeApp_NoteBook(QWidget * parent); virtual ~SalomeApp_NoteBook(); - void Init(_PTR(Study) theStudy); + void Init(); QString getDumpedStudyName() { return myDumpedStudyName; } void setDumpedStudyName(QString theName) { myDumpedStudyName = theName; } @@ -170,7 +167,6 @@ class SALOMEAPP_EXPORT SalomeApp_NoteBook : public QWidget QPushButton* myRemoveButton; QPushButton* myUpdateStudyBtn; - _PTR(Study) myStudy; QString myDumpedStudyScript; // path to script of dumped study QString myDumpedStudyName; bool myIsDumpedStudySaved; diff --git a/src/SalomeApp/SalomeApp_PyInterp.cxx b/src/SalomeApp/SalomeApp_PyInterp.cxx index 4db5aff1a..942aa6da4 100755 --- a/src/SalomeApp/SalomeApp_PyInterp.cxx +++ b/src/SalomeApp/SalomeApp_PyInterp.cxx @@ -72,7 +72,7 @@ int SalomeApp_PyInterp::beforeRun() int ret = simpleRun( "import salome", false ); if ( ret ) return ret; - ret = simpleRun( "salome.salome_init(0,1)", false ); + ret = simpleRun( "salome.salome_init(1)", false ); if ( ret ) return ret; } diff --git a/src/SalomeApp/SalomeApp_Study.cxx b/src/SalomeApp/SalomeApp_Study.cxx index 84bb76df6..fe94de0de 100644 --- a/src/SalomeApp/SalomeApp_Study.cxx +++ b/src/SalomeApp/SalomeApp_Study.cxx @@ -82,9 +82,8 @@ class SalomeApp_Study::Observer_i : public virtual POA_SALOMEDS::Observer, QObje public: - Observer_i(_PTR(Study) aStudyDS, SalomeApp_Study* aStudy):QObject(aStudy) + Observer_i( SalomeApp_Study* aStudy):QObject(aStudy) { - myStudyDS=aStudyDS; myStudy=aStudy; fillEntryMap(); } @@ -122,7 +121,7 @@ public: switch(event) { case 1: { //Add sobject - _PTR(SObject) aSObj = myStudyDS->FindObjectID(theID); + _PTR(SObject) aSObj = SalomeApp_Application::getStudy()->FindObjectID(theID); _PTR(SComponent) aSComp = aSObj->GetFatherComponent(); if (!aSComp || aSComp->IsNull()) { @@ -131,7 +130,7 @@ public: } // Mantis issue 0020136: Drag&Drop in OB - _PTR(UseCaseBuilder) aUseCaseBuilder = myStudyDS->GetUseCaseBuilder(); + _PTR(UseCaseBuilder) aUseCaseBuilder = SalomeApp_Application::getStudy()->GetUseCaseBuilder(); if (aUseCaseBuilder->IsUseCaseNode(aSComp)) { // BEGIN: work with tree nodes structure if (!aUseCaseBuilder->IsUseCaseNode(aSObj)) { // tree node is not yet set, it is a normal situation @@ -392,7 +391,6 @@ private: } private: - _PTR(Study) myStudyDS; SalomeApp_Study* myStudy; EntryMap entry2SuitObject; }; @@ -404,6 +402,7 @@ private: SalomeApp_Study::SalomeApp_Study( SUIT_Application* app ) : LightApp_Study( app ), myObserver( 0 ) { + myStudyDS = SalomeApp_Application::getStudy(); } /*! @@ -424,17 +423,6 @@ void SalomeApp_Study::onNoteBookVarUpdate( QString theVarName) } #endif -/*! - Gets study id. -*/ -int SalomeApp_Study::id() const -{ - int id = -1; - if ( studyDS() ) - id = studyDS()->StudyId(); - return id; -} - /*! Get study name. */ @@ -444,7 +432,7 @@ QString SalomeApp_Study::studyName() const // it can be changed outside of GUI // TEMPORARILY SOLUTION: better to be implemented with help of SALOMEDS observers if ( studyDS() ) { - QString newName = QString::fromUtf8(studyDS()->Name().c_str()); + QString newName = QString::fromUtf8(studyDS()->URL().c_str()); if ( LightApp_Study::studyName() != newName ) { SalomeApp_Study* that = const_cast( this ); that->setStudyName( newName ); @@ -469,35 +457,7 @@ bool SalomeApp_Study::createDocument( const QString& theStr ) { MESSAGE( "createDocument" ); - // initialize myStudyDS, read HDF file - QString aName = newStudyName(); - - _PTR(Study) study; - bool showError = !application()->property("open_study_from_command_line").isValid() || - !application()->property("open_study_from_command_line").toBool(); - try { - study = _PTR(Study)( SalomeApp_Application::studyMgr()->NewStudy( aName.toUtf8().data() ) ); - } - catch(const SALOME_Exception& ex) { - application()->putInfo(tr(ex.what())); - if ( showError ) - SUIT_MessageBox::critical( SUIT_Session::session()->activeApplication()->desktop(), - tr("ERR_ERROR"), tr(ex.what())); - return false; - } - catch(...) { - application()->putInfo(tr("CREATE_DOCUMENT_PROBLEM")); - if ( showError ) - SUIT_MessageBox::critical( SUIT_Session::session()->activeApplication()->desktop(), - tr("ERR_ERROR"), tr("CREATE_DOCUMENT_PROBLEM")); - return false; - } - - if ( !study ) - return false; - - setStudyDS( study ); - setStudyName( aName ); + setStudyName( QString::fromUtf8(myStudyDS->URL().c_str()) ); // create myRoot SalomeApp_RootObject* aRoot=new SalomeApp_RootObject( this ); @@ -509,7 +469,7 @@ bool SalomeApp_Study::createDocument( const QString& theStr ) bool aRet = CAM_Study::createDocument( theStr ); #ifdef WITH_SALOMEDS_OBSERVER - myObserver = new Observer_i(myStudyDS,this); + myObserver = new Observer_i(this); //attach an observer to the study with notification of modifications myStudyDS->attach(myObserver->_this(),true); #endif @@ -527,12 +487,12 @@ bool SalomeApp_Study::openDocument( const QString& theFileName ) { MESSAGE( "openDocument" ); - // initialize myStudyDS, read HDF file - _PTR(Study) study; - bool showError = !application()->property("open_study_from_command_line").isValid() || + // read HDF file + bool res = false; + bool showError = !application()->property("open_study_from_command_line").isValid() || !application()->property("open_study_from_command_line").toBool(); try { - study = _PTR(Study) ( SalomeApp_Application::studyMgr()->Open( theFileName.toUtf8().data() ) ); + res = myStudyDS->Open( theFileName.toUtf8().data() ); } catch(const SALOME_Exception& ex) { application()->putInfo(tr(ex.what())); @@ -540,7 +500,7 @@ bool SalomeApp_Study::openDocument( const QString& theFileName ) SUIT_MessageBox::critical( SUIT_Session::session()->activeApplication()->desktop(), tr("ERR_ERROR"), tr(ex.what())); return false; - } + } catch(...) { application()->putInfo(tr("OPEN_DOCUMENT_PROBLEM")); if ( showError ) @@ -549,11 +509,9 @@ bool SalomeApp_Study::openDocument( const QString& theFileName ) return false; } - if ( !study ) + if ( !res) return false; - setStudyDS( study ); - setRoot( new SalomeApp_RootObject( this ) ); // create myRoot // update loaded data models: call open() and update() on them. @@ -570,15 +528,15 @@ bool SalomeApp_Study::openDocument( const QString& theFileName ) #ifdef WITH_SALOMEDS_OBSERVER dynamic_cast( root() )->setToSynchronize(false); - myObserver = new Observer_i(myStudyDS,this); + myObserver = new Observer_i(this); //attach an observer to the study with notification of modifications myStudyDS->attach(myObserver->_this(),true); #endif - bool res = CAM_Study::openDocument( theFileName ); + res = CAM_Study::openDocument( theFileName ); emit opened( this ); - study->IsSaved(true); + myStudyDS->IsSaved(true); bool restore = application()->resourceMgr()->booleanValue( "Study", "store_visual_state", true ); if ( restore ) { @@ -592,20 +550,13 @@ bool SalomeApp_Study::openDocument( const QString& theFileName ) } /*! - Connects GUI study to SALOMEDS one already loaded into StudyManager + Connects GUI study to SALOMEDS one \param theStudyName - name of study */ bool SalomeApp_Study::loadDocument( const QString& theStudyName ) { MESSAGE( "loadDocument" ); - // obtain myStudyDS from StudyManager - _PTR(Study) study ( SalomeApp_Application::studyMgr()->GetStudyByName( theStudyName.toUtf8().data() ) ); - if ( !study ) - return false; - - setStudyDS( study ); - setRoot( new SalomeApp_RootObject( this ) ); // create myRoot //SRN: BugID IPAL9021, put there the same code as in a method openDocument @@ -625,7 +576,7 @@ bool SalomeApp_Study::loadDocument( const QString& theStudyName ) #ifdef WITH_SALOMEDS_OBSERVER dynamic_cast( root() )->setToSynchronize(false); - myObserver = new Observer_i(myStudyDS,this); + myObserver = new Observer_i(this); //attach an observer to the study with notification of modifications myStudyDS->attach(myObserver->_this(),true); #endif @@ -681,9 +632,7 @@ bool SalomeApp_Study::saveDocumentAs( const QString& theFileName ) bool isMultiFile = resMgr->booleanValue( "Study", "multi_file", false ); bool isAscii = resMgr->booleanValue( "Study", "ascii_file", false ); - bool res = (isAscii ? - SalomeApp_Application::studyMgr()->SaveAsASCII( theFileName.toUtf8().data(), studyDS(), isMultiFile ) : - SalomeApp_Application::studyMgr()->SaveAs ( theFileName.toUtf8().data(), studyDS(), isMultiFile )) + bool res = studyDS()->SaveAs( theFileName.toUtf8().data(), isMultiFile, isAscii ) && CAM_Study::saveDocumentAs( theFileName ); res = res && saveStudyData(theFileName); @@ -726,9 +675,7 @@ bool SalomeApp_Study::saveDocument() bool isMultiFile = resMgr->booleanValue( "Study", "multi_file", false ); bool isAscii = resMgr->booleanValue( "Study", "ascii_file", false ); - bool res = (isAscii ? - SalomeApp_Application::studyMgr()->SaveASCII( studyDS(), isMultiFile ) : - SalomeApp_Application::studyMgr()->Save ( studyDS(), isMultiFile )) && CAM_Study::saveDocument(); + bool res = studyDS()->Save( isMultiFile, isAscii ) && CAM_Study::saveDocument(); res = res && saveStudyData(studyName()); if ( res ) @@ -745,24 +692,18 @@ void SalomeApp_Study::closeDocument(bool permanently) LightApp_Study::closeDocument(permanently); // close SALOMEDS document - _PTR(Study) studyPtr = studyDS(); - if ( studyPtr ) - { - if ( myObserver ) - myStudyDS->detach( myObserver->_this() ); - if ( permanently ) { - SUIT_Desktop* desk = SUIT_Session::session()->activeApplication()->desktop(); - bool isBlocked = desk->signalsBlocked(); - desk->blockSignals( true ); - SalomeApp_Application::studyMgr()->Close( studyPtr ); - desk->blockSignals( isBlocked ); + if ( myObserver ) + myStudyDS->detach( myObserver->_this() ); + if ( permanently ) { + SUIT_Desktop* desk = SUIT_Session::session()->activeApplication()->desktop(); + bool isBlocked = desk->signalsBlocked(); + desk->blockSignals( true ); + myStudyDS->Clear(); + desk->blockSignals( isBlocked ); #ifndef DISABLE_PYCONSOLE - SalomeApp_Application* app = dynamic_cast( application() ); - app->getPyInterp()->destroy(); + SalomeApp_Application* app = dynamic_cast( application() ); + app->getPyInterp()->destroy(); #endif - } - SALOMEDSClient_Study* aStudy = 0; - setStudyDS( _PTR(Study)(aStudy) ); } } @@ -789,13 +730,12 @@ bool SalomeApp_Study::dump( const QString& theFileName, int savePoint; _PTR(AttributeParameter) ap; _PTR(IParameters) ip = ClientFactory::getIParameters(ap); - _PTR(Study) aStudy = studyDS(); - if( ip->isDumpPython( aStudy ) ) - ip->setDumpPython( aStudy ); //Unset DumpPython flag. + if( ip->isDumpPython() ) + ip->setDumpPython(); //Unset DumpPython flag. if ( toSaveGUI ) { //SRN: Store a visual state of the study at the save point for DumpStudy method - ip->setDumpPython( aStudy ); + ip->setDumpPython(); //SRN: create a temporary save point savePoint = SalomeApp_VisualState( dynamic_cast( application() ) ).storeState(); @@ -825,10 +765,10 @@ bool SalomeApp_Study::dump( const QString& theFileName, // Now dump SALOMEDS part that also involves SalomeApp_Engine in case if // any light module is present in the current configuration QFileInfo aFileInfo( theFileName ); - bool res = aStudy->DumpStudy( aFileInfo.absolutePath().toUtf8().data(), - aFileInfo.baseName().toUtf8().data(), - toPublish, - isMultiFile); + bool res = myStudyDS->DumpStudy( aFileInfo.absolutePath().toUtf8().data(), + aFileInfo.baseName().toUtf8().data(), + toPublish, + isMultiFile); if ( toSaveGUI ) removeSavePoint( savePoint ); //SRN: remove the created temporary save point. @@ -857,8 +797,7 @@ bool SalomeApp_Study::isModified() const */ void SalomeApp_Study::Modified() { - if(_PTR(Study) aStudy = studyDS()) - aStudy->Modified(); + myStudyDS->Modified(); LightApp_Study::Modified(); } @@ -944,14 +883,6 @@ bool SalomeApp_Study::openStudyData( const QString& theFileName ) return true; } -/*! - Set studyDS. -*/ -void SalomeApp_Study::setStudyDS( const _PTR(Study)& s ) -{ - myStudyDS = s; -} - /*! Virtual method re-implemented from LightApp_Study in order to create the module object connected to SALOMEDS - SalomeApp_ModuleObject. @@ -985,11 +916,7 @@ CAM_ModuleObject* SalomeApp_Study::createModuleObject( LightApp_DataModel* theDa } if ( !res ){ - _PTR(Study) aStudy = studyDS(); - if ( !aStudy ) - return res; - - _PTR(SComponent) aComp = aStudy->FindComponent( + _PTR(SComponent) aComp = myStudyDS->FindComponent( theDataModel->module()->name().toStdString() ); if ( !aComp ) return res; @@ -1021,16 +948,13 @@ void SalomeApp_Study::addComponent(const CAM_DataModel* dm) // 1. aModule == 0 means that this is a light module (no CORBA enigine) if (!aModule) { // Check SComponent existance - _PTR(Study) aStudy = studyDS(); - if (!aStudy) - return; std::string aCompDataType = dm->module()->name().toStdString(); - _PTR(SComponent) aComp = aStudy->FindComponent(aCompDataType); + _PTR(SComponent) aComp = myStudyDS->FindComponent(aCompDataType); if (!aComp) { // Create SComponent - _PTR(StudyBuilder) aBuilder = aStudy->NewBuilder(); + _PTR(StudyBuilder) aBuilder = myStudyDS->NewBuilder(); aComp = aBuilder->NewComponent(aCompDataType); aBuilder->SetName(aComp, dm->module()->moduleName().toStdString()); QString anIconName = dm->module()->iconName(); @@ -1049,7 +973,7 @@ void SalomeApp_Study::addComponent(const CAM_DataModel* dm) SalomeApp_DataModel::synchronize( aComp, this ); } else { - _PTR(StudyBuilder) aBuilder = aStudy->NewBuilder(); + _PTR(StudyBuilder) aBuilder = myStudyDS->NewBuilder(); aBuilder->SetName(aComp, dm->module()->moduleName().toStdString()); QString anIconName = dm->module()->iconName(); if (!anIconName.isEmpty()) { @@ -1072,7 +996,6 @@ bool SalomeApp_Study::openDataModel( const QString& studyName, CAM_DataModel* dm // SalomeApp_DataModel* aDM = (SalomeApp_DataModel*)(dm); SalomeApp_Module* aModule = dynamic_cast( dm->module() ); - _PTR(Study) aStudy = studyDS(); // shared_ptr cannot be used here _PTR(SComponent) aSComp; QString anEngine; // 1. aModule == 0 means that this is a light module (no CORBA enigine) @@ -1080,7 +1003,7 @@ bool SalomeApp_Study::openDataModel( const QString& studyName, CAM_DataModel* dm // Issue 21377 - using separate engine for each type of light module std::string aCompDataType = dm->module()->name().toStdString(); anEngine = SalomeApp_Engine_i::EngineIORForComponent( aCompDataType.c_str(), true ).c_str(); - aSComp = aStudy->FindComponent( aCompDataType ); + aSComp = myStudyDS->FindComponent( aCompDataType ); } else { SalomeApp_DataModel* aDM = dynamic_cast( dm ); @@ -1091,11 +1014,11 @@ bool SalomeApp_Study::openDataModel( const QString& studyName, CAM_DataModel* dm anEngine = aDM->getModule()->engineIOR(); if ( anEngine.isEmpty() ) return false; - aSComp = aStudy->FindComponentID( std::string( anId.toLatin1() ) ); + aSComp = myStudyDS->FindComponentID( std::string( anId.toLatin1() ) ); } } if ( aSComp ) { - _PTR(StudyBuilder) aBuilder( aStudy->NewBuilder() ); + _PTR(StudyBuilder) aBuilder( myStudyDS->NewBuilder() ); if ( aBuilder ) { try { aBuilder->LoadWith( aSComp, std::string( anEngine.toLatin1() ) ); @@ -1129,28 +1052,6 @@ bool SalomeApp_Study::openDataModel( const QString& studyName, CAM_DataModel* dm return false; } -/*! - Create new study name. -*/ -QString SalomeApp_Study::newStudyName() const -{ - std::vector studies = SalomeApp_Application::studyMgr()->GetOpenStudies(); - QString prefix( "Study%1" ), newName, curName; - int i = 1, j, n = studies.size(); - while ( newName.isEmpty() ){ - curName = prefix.arg( i ); - for ( j = 0 ; j < n; j++ ){ - if ( !strcmp( studies[j].c_str(), curName.toLatin1() ) ) - break; - } - if ( j == n ) - newName = curName; - else - i++; - } - return newName; -} - /*! Note that this method does not create or activate SalomeApp_Engine_i instance, therefore it can be called safely for any kind of module, but for full @@ -1163,7 +1064,7 @@ std::vector SalomeApp_Study::GetListOfFiles( const char* theModuleN // Issue 21377 - using separate engine for each type of light module SalomeApp_Engine_i* aDefaultEngine = SalomeApp_Engine_i::GetInstance( theModuleName, false ); if (aDefaultEngine) - return aDefaultEngine->GetListOfFiles(id()); + return aDefaultEngine->GetListOfFiles(); std::vector aListOfFiles; return aListOfFiles; @@ -1183,7 +1084,7 @@ void SalomeApp_Study::SetListOfFiles ( const char* theModuleName, // Issue 21377 - using separate engine for each type of light module SalomeApp_Engine_i* aDefaultEngine = SalomeApp_Engine_i::GetInstance( theModuleName, false ); if (aDefaultEngine) - aDefaultEngine->SetListOfFiles(theListOfFiles, id()); + aDefaultEngine->SetListOfFiles(theListOfFiles); } /*! @@ -1204,17 +1105,17 @@ void SalomeApp_Study::RemoveTemporaryFiles ( const char* theModuleName, const bo if (isMultiFile) return; - std::vector aListOfFiles = GetListOfFiles( theModuleName ); + SALOMEDS_Tool::ListOfFiles aListOfFiles = GetListOfFiles( theModuleName ); if (aListOfFiles.size() > 0) { std::string aTmpDir = aListOfFiles[0]; const int n = aListOfFiles.size() - 1; - SALOMEDS::ListOfFileNames_var aSeq = new SALOMEDS::ListOfFileNames; - aSeq->length(n); + std::vector aSeq; + aSeq.reserve(n); for (int i = 0; i < n; i++) - aSeq[i] = CORBA::string_dup(aListOfFiles[i + 1].c_str()); + aSeq.push_back(CORBA::string_dup(aListOfFiles[i + 1].c_str())); - SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir.c_str(), aSeq.in(), true); + SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir.c_str(), aSeq, true); } } @@ -1226,7 +1127,7 @@ void SalomeApp_Study::RemoveTemporaryFiles ( const char* theModuleName, const bo void SalomeApp_Study::updateFromNotebook( const QString& theFileName, bool isSaved ) { setStudyName(theFileName); - studyDS()->Name(theFileName.toStdString()); + studyDS()->URL(theFileName.toStdString()); setIsSaved( isSaved ); } #endif diff --git a/src/SalomeApp/SalomeApp_Study.h b/src/SalomeApp/SalomeApp_Study.h index cf93e4056..2284df8db 100644 --- a/src/SalomeApp/SalomeApp_Study.h +++ b/src/SalomeApp/SalomeApp_Study.h @@ -43,7 +43,6 @@ public: SalomeApp_Study( SUIT_Application* ); virtual ~SalomeApp_Study(); - virtual int id() const; virtual QString studyName() const; virtual bool createDocument( const QString& ); @@ -103,7 +102,7 @@ protected: protected: virtual void dataModelInserted( const CAM_DataModel* ); virtual bool openDataModel( const QString&, CAM_DataModel* ); - void setStudyDS(const _PTR(Study)& s ); + virtual CAM_ModuleObject* createModuleObject( LightApp_DataModel* theDataModel, SUIT_DataObject* theParent ) const; protected slots: @@ -112,9 +111,6 @@ protected slots: void onNoteBookVarUpdate( QString theVarName ); #endif -private: - QString newStudyName() const; - private: _PTR(Study) myStudyDS; Observer_i* myObserver; diff --git a/src/SalomeApp/SalomeApp_StudyPropertiesDlg.cxx b/src/SalomeApp/SalomeApp_StudyPropertiesDlg.cxx index 043a2e30c..55a4765c7 100644 --- a/src/SalomeApp/SalomeApp_StudyPropertiesDlg.cxx +++ b/src/SalomeApp/SalomeApp_StudyPropertiesDlg.cxx @@ -25,6 +25,7 @@ // Author : Roman NIKOLAEV #include "SalomeApp_StudyPropertiesDlg.h" +#include "SalomeApp_Application.h" #include "SalomeApp_Study.h" #include "SUIT_Session.h" @@ -69,12 +70,6 @@ SalomeApp_StudyPropertiesDlg::SalomeApp_StudyPropertiesDlg(QWidget* parent) setWindowFlags( windowFlags() & ~Qt::WindowContextHelpButtonHint ); - // Display study properties - SalomeApp_Study* study = - dynamic_cast( SUIT_Session::session()->activeApplication()->activeStudy() ); - if (study) - myStudyDoc = study->studyDS(); - //Author QLabel* authorLbl = new QLabel(tr("PRP_AUTHOR"),this); myAuthor = new QLineEdit(this); @@ -173,10 +168,10 @@ SalomeApp_StudyPropertiesDlg::~SalomeApp_StudyPropertiesDlg() */ void SalomeApp_StudyPropertiesDlg::initData() { - bool hasData = (myStudyDoc != NULL); + bool hasData = (SalomeApp_Application::getStudy() != NULL); _PTR(AttributeStudyProperties) propAttr; if (hasData) - propAttr = myStudyDoc->GetProperties(); + propAttr = SalomeApp_Application::getStudy()->GetProperties(); hasData = hasData && propAttr; if (hasData) { @@ -268,7 +263,7 @@ void SalomeApp_StudyPropertiesDlg::initData() */ void SalomeApp_StudyPropertiesDlg::clickOnOk() { - _PTR(AttributeStudyProperties) propAttr = myStudyDoc->GetProperties(); + _PTR(AttributeStudyProperties) propAttr = SalomeApp_Application::getStudy()->GetProperties(); //Firstly, store locked flag if(propAttr) { bool bLocked = myLocked->isChecked(); diff --git a/src/SalomeApp/SalomeApp_StudyPropertiesDlg.h b/src/SalomeApp/SalomeApp_StudyPropertiesDlg.h index 7289eb800..a88d54edb 100644 --- a/src/SalomeApp/SalomeApp_StudyPropertiesDlg.h +++ b/src/SalomeApp/SalomeApp_StudyPropertiesDlg.h @@ -60,7 +60,6 @@ private: void initData(); private: - _PTR(Study) myStudyDoc; bool myIsChanged; QLineEdit* myAuthor; QLabel* myDate; diff --git a/src/SalomeApp/SalomeApp_TypeFilter.cxx b/src/SalomeApp/SalomeApp_TypeFilter.cxx index 8d296e815..d2652792b 100644 --- a/src/SalomeApp/SalomeApp_TypeFilter.cxx +++ b/src/SalomeApp/SalomeApp_TypeFilter.cxx @@ -24,6 +24,7 @@ #include "LightApp_DataOwner.h" #include "SalomeApp_Study.h" +#include "SalomeApp_Application.h" /*! Constructor. @@ -48,20 +49,18 @@ bool SalomeApp_TypeFilter::isOk( const SUIT_DataOwner* sOwner ) const { const LightApp_DataOwner* owner = dynamic_cast ( sOwner ); - SalomeApp_Study* aDoc = getStudy(); - if (owner && aDoc && aDoc->studyDS()) + if (owner) + { + QString entry = owner->entry(); + + _PTR(SObject) aSObj( SalomeApp_Application::getStudy()->FindObjectID( entry.toStdString() ) ); + if (aSObj) { - _PTR(Study) aStudy = aDoc->studyDS(); - QString entry = owner->entry(); - - _PTR(SObject) aSObj( aStudy->FindObjectID( entry.toStdString() ) ); - if (aSObj) - { - _PTR(SComponent) aComponent(aSObj->GetFatherComponent()); - if ( aComponent && (aComponent->ComponentDataType() == myKind.toStdString()) ) - return true; - } + _PTR(SComponent) aComponent(aSObj->GetFatherComponent()); + if ( aComponent && (aComponent->ComponentDataType() == myKind.toStdString()) ) + return true; } + } return false; } diff --git a/src/SalomeApp/pluginsdemo/minmax_plugin.py b/src/SalomeApp/pluginsdemo/minmax_plugin.py index 1b0719bb1..f1b30c06a 100644 --- a/src/SalomeApp/pluginsdemo/minmax_plugin.py +++ b/src/SalomeApp/pluginsdemo/minmax_plugin.py @@ -22,9 +22,8 @@ from qtsalome import * def minmax(context): - # get context study, studyId, salomeGui + # get context study, salomeGui study = context.study - studyId = context.studyId sg = context.sg from minmax_ui import Ui_Dialog @@ -32,7 +31,7 @@ def minmax(context): import salome import SMESH from salome.smesh import smeshBuilder - smesh = smeshBuilder.New(salome.myStudy) + smesh = smeshBuilder.New() controls_dict = { "Aspect Ratio 3D" : SMESH.FT_AspectRatio3D, diff --git a/src/SalomeApp/pluginsdemo/salome_plugins.py b/src/SalomeApp/pluginsdemo/salome_plugins.py index c532de866..f93ba12a7 100755 --- a/src/SalomeApp/pluginsdemo/salome_plugins.py +++ b/src/SalomeApp/pluginsdemo/salome_plugins.py @@ -28,11 +28,11 @@ if DEMO_IS_ACTIVATED: try: import GEOM from salome.geom import geomBuilder - geompy = geomBuilder.New(salome.myStudy) + geompy = geomBuilder.New() import SMESH, SALOMEDS from salome.smesh import smeshBuilder - smesh = smeshBuilder.New(salome.myStudy) + smesh = smeshBuilder.New() except: DEMO_IS_ACTIVATED = False @@ -48,8 +48,7 @@ if DEMO_IS_ACTIVATED: from salome.geom import geomBuilder # Intialize the geompy factory with the active study - activeStudy = context.study - geompy = geomBuilder.New(activeStudy) + geompy = geomBuilder.New() # Create the objects Vx = geompy.MakeVectorDXDYDZ(10, 0, 0) @@ -76,8 +75,7 @@ if DEMO_IS_ACTIVATED: from salome.geom import geomBuilder # Intialize the geompy factory with the active study - activeStudy = context.study - geompy = geomBuilder.New(activeStudy) + geompy = geomBuilder.New() # Create the objects Vx = geompy.MakeVectorDXDYDZ(10, 0, 0) @@ -122,7 +120,6 @@ if DEMO_IS_ACTIVATED: def tube_shapewithgui(context): global tubebuilder, xalome, dialog - activeStudy = context.study # Get the parameter values from a gui dialog box. If the dialog is # closed using the Ok button, then the data are requested from the @@ -130,8 +127,8 @@ if DEMO_IS_ACTIVATED: dialog.exec_() if dialog.wasOk(): radius, length, width = dialog.getData() - shape = tubebuilder.createGeometry(activeStudy, radius, length, width) - entry = xalome.addToStudy(activeStudy, shape, "Tube" ) + shape = tubebuilder.createGeometry(radius, length, width) + entry = xalome.addToStudy(shape, "Tube" ) xalome.displayShape(entry) @@ -147,7 +144,6 @@ if DEMO_IS_ACTIVATED: # def tube_meshwithgui(context): global tube, dialog - activeStudy = context.study # Get the parameter values from a gui dialog box. If the dialog is # closed using the Ok button, then the data are requested from the @@ -155,7 +151,7 @@ if DEMO_IS_ACTIVATED: dialog.exec_() if dialog.wasOk(): radius, length, width = dialog.getData() - mesh = tubebuilder.createModel(activeStudy, radius, length, width) + mesh = tubebuilder.createModel(radius, length, width) salome_pluginsmanager.AddFunction('DEMO/Tube mesh from parameters', @@ -179,7 +175,6 @@ if DEMO_IS_ACTIVATED: dialogWithApply.setData(tubebuilder.DEFAULT_RADIUS, tubebuilder.DEFAULT_LENGTH, tubebuilder.DEFAULT_WIDTH) - activeStudy = None previewShapeEntry = None DEFAULT_FOLDER_NAME="TubeList" @@ -189,7 +184,7 @@ if DEMO_IS_ACTIVATED: def acceptCallback(): """Action to be done when click on Ok""" global tubebuilder, xalome - global dialogWithApply, activeStudy + global dialogWithApply global previewShapeEntry, deletePreviewShape global DEFAULT_FOLDER_NAME,DEFAULT_SHAPE_NAME @@ -199,8 +194,8 @@ if DEMO_IS_ACTIVATED: deletePreviewShape() radius, length, width = dialogWithApply.getData() - shape = tubebuilder.createGeometry(activeStudy, radius, length, width) - entry = xalome.addToStudy(activeStudy, shape, DEFAULT_SHAPE_NAME, DEFAULT_FOLDER_NAME) + shape = tubebuilder.createGeometry(radius, length, width) + entry = xalome.addToStudy(shape, DEFAULT_SHAPE_NAME, DEFAULT_FOLDER_NAME) xalome.displayShape(entry) def rejectCallback(): @@ -218,7 +213,7 @@ if DEMO_IS_ACTIVATED: def applyCallback(): """Action to be done when click on Apply""" global tubebuilder, xalome - global dialogWithApply, activeStudy + global dialogWithApply global previewShapeEntry, deletePreviewShape global PREVIEW_COLOR, DEFAULT_SHAPE_NAME, DEFAULT_FOLDER_NAME, PREVIEW_SHAPE_NAME @@ -228,16 +223,16 @@ if DEMO_IS_ACTIVATED: # Then we can create the new shape with the new parameter values radius, length, width = dialogWithApply.getData() - shape = tubebuilder.createGeometry(activeStudy, radius, length, width) + shape = tubebuilder.createGeometry(radius, length, width) # We apply a specific color on the shape for the preview state shape.SetColor(PREVIEW_COLOR) - previewShapeEntry = xalome.addToStudy(activeStudy, shape, PREVIEW_SHAPE_NAME, DEFAULT_FOLDER_NAME ) + previewShapeEntry = xalome.addToStudy(shape, PREVIEW_SHAPE_NAME, DEFAULT_FOLDER_NAME ) xalome.displayShape(previewShapeEntry) def deletePreviewShape(): """This delete the shape currently being displayed as a preview""" - global activeStudy, previewShapeEntry, xsalome - xalome.deleteShape(activeStudy,previewShapeEntry) + global previewShapeEntry, xsalome + xalome.deleteShape(previewShapeEntry) previewShapeEntry = None # Connection of callback functions to the dialog butoon click signals @@ -251,8 +246,7 @@ if DEMO_IS_ACTIVATED: required callback functions to be associated to the button signals. """ - global dialogWithApply, activeStudy - activeStudy = context.study + global dialogWithApply dialogWithApply.open() diff --git a/src/SalomeApp/pluginsdemo/trihedron.py b/src/SalomeApp/pluginsdemo/trihedron.py index 3439d0830..95fd3d001 100644 --- a/src/SalomeApp/pluginsdemo/trihedron.py +++ b/src/SalomeApp/pluginsdemo/trihedron.py @@ -26,7 +26,7 @@ import salome import GEOM from salome.geom import geomBuilder -geompy = geomBuilder.New(salome.myStudy) +geompy = geomBuilder.New() # Create the objects Vx = geompy.MakeVectorDXDYDZ(10, 0, 0) diff --git a/src/SalomeApp/pluginsdemo/tubebuilder.py b/src/SalomeApp/pluginsdemo/tubebuilder.py index 3fcb8c639..e121161c0 100644 --- a/src/SalomeApp/pluginsdemo/tubebuilder.py +++ b/src/SalomeApp/pluginsdemo/tubebuilder.py @@ -27,14 +27,13 @@ DEFAULT_WIDTH = 20 from salome.geom import geomtools -def createGeometry(study, radius=DEFAULT_RADIUS, length=DEFAULT_LENGTH, width=DEFAULT_WIDTH): +def createGeometry(radius=DEFAULT_RADIUS, length=DEFAULT_LENGTH, width=DEFAULT_WIDTH): ''' This function creates the geometry on the specified study and with given parameters. ''' print "TUBE: creating the geometry ..." - studyId = study._get_StudyId() - geompy = geomtools.getGeompy(studyId) + geompy = geomtools.getGeompy() radius_ext = radius radius_int = radius_ext - width @@ -44,17 +43,16 @@ def createGeometry(study, radius=DEFAULT_RADIUS, length=DEFAULT_LENGTH, width=DE Tube = geompy.MakeCut(CylinderExt, CylinderInt) return Tube -def createGeometryWithPartition(study, radius=DEFAULT_RADIUS, length=DEFAULT_LENGTH, width=DEFAULT_WIDTH): +def createGeometryWithPartition(radius=DEFAULT_RADIUS, length=DEFAULT_LENGTH, width=DEFAULT_WIDTH): ''' This function create the geometrical shape with a partition so that the hexaedric algorithm could be used for meshing. ''' - shape = createGeometry(study,radius,length,width) + shape = createGeometry(radius,length,width) # We have to create a partition so that we can use an hexaedric # meshing algorithm. - studyId = study._get_StudyId() - geompy = geomtools.getGeompy(studyId) + geompy = geomtools.getGeompy() print "TUBE: creating a partition ..." toolPlane = geompy.MakeFaceHW(2.1*length,2.1*radius,3) @@ -62,12 +60,12 @@ def createGeometryWithPartition(study, radius=DEFAULT_RADIUS, length=DEFAULT_LEN entry = geompy.addToStudy( partition, "TubeWithPartition" ) return partition -def createMesh(study, shape): - '''This function creates the mesh of the specified shape on the specified study''' +def createMesh(shape): + '''This function creates the mesh of the specified shape on the current study''' print "TUBE: creating the mesh ..." import SMESH from salome.smesh import smeshBuilder - smesh = smeshBuilder.New(study) + smesh = smeshBuilder.New() mesh = smesh.Mesh(shape) Regular_1D = mesh.Segment() @@ -84,21 +82,21 @@ def createMesh(study, shape): smesh.SetName(Nb_Segments, 'Nb. Segments_1') smesh.SetName(Quadrangle_2D.GetAlgorithm(), 'Quadrangle_2D') smesh.SetName(Hexa_3D.GetAlgorithm(), 'Hexa_3D') - salome.sg.updateObjBrowser(False) + salome.sg.updateObjBrowser() return mesh -def createModel(study, radius=DEFAULT_RADIUS, length=DEFAULT_LENGTH,width=DEFAULT_WIDTH): +def createModel(radius=DEFAULT_RADIUS, length=DEFAULT_LENGTH,width=DEFAULT_WIDTH): ''' This function create the geomtrical shape AND the associated mesh. ''' # We first create a shape with a partition so that the hexaedric # algorithm could be used. - shape = createGeometryWithPartition(study,radius,length,width) + shape = createGeometryWithPartition(radius,length,width) # Then the mesh can be defined and computed - mesh = createMesh(study,shape) + mesh = createMesh(shape) def exportModel(mesh, filename): ''' @@ -116,25 +114,21 @@ def exportModel(mesh, filename): # def TEST_createGeometry(): salome.salome_init() - theStudy=salome.myStudy - createGeometry(theStudy) + createGeometry() def TEST_createMesh(): salome.salome_init() - theStudy=salome.myStudy - shape = createGeometryWithPartition(theStudy) - mesh = createMesh(theStudy, shape) + shape = createGeometryWithPartition() + mesh = createMesh(shape) def TEST_createModel(): salome.salome_init() - theStudy=salome.myStudy - createModel(theStudy) + createModel() def TEST_exportModel(): salome.salome_init() - theStudy=salome.myStudy - shape = createGeometryWithPartition(theStudy) - mesh = createMesh(theStudy, shape) + shape = createGeometryWithPartition() + mesh = createMesh(shape) exportModel(mesh,"tubemesh.med") if __name__ == "__main__": diff --git a/src/SalomeApp/pluginsdemo/xalome.py b/src/SalomeApp/pluginsdemo/xalome.py index a2f5343d7..c2d55be7d 100644 --- a/src/SalomeApp/pluginsdemo/xalome.py +++ b/src/SalomeApp/pluginsdemo/xalome.py @@ -36,7 +36,7 @@ from salome.geom import geomtools # Helper functions to add/remove a geometrical shape in/from the study # ====================================================================== -def addToStudy(study,shape,shapeName,folderName=None): +def addToStudy(shape,shapeName,folderName=None): """ Add a GEOM shape in the study. It returns the associated entry that corresponds to the identifier of the entry in the study. This @@ -45,8 +45,7 @@ def addToStudy(study,shape,shapeName,folderName=None): created in the Geometry part of the study, and the shape study object is stored in this folder of the study. """ - studyId = study._get_StudyId() - geompy = geomtools.getGeompy(studyId) + geompy = geomtools.getGeompy() if folderName is None: # Insert the shape in the study by the standard way @@ -55,7 +54,7 @@ def addToStudy(study,shape,shapeName,folderName=None): # A folder name has been specified to embed this shape. Find # or create a folder with this name in the Geometry study, and # then store the shape in this folder. - studyEditor = getStudyEditor(studyId) + studyEditor = getStudyEditor() geomStudyFolder = studyEditor.findOrCreateComponent("GEOM") shapeStudyFolder = studyEditor.findOrCreateItem(geomStudyFolder,folderName) @@ -71,17 +70,16 @@ def addToStudy(study,shape,shapeName,folderName=None): return entry -def removeFromStudy(study,shapeStudyEntry): +def removeFromStudy(shapeStudyEntry): """ This removes the specified entry from the study. Note that this operation does not destroy the underlying GEOM object, neither erase the drawing in the viewer. The underlying GEOM object is returned (so that it can be destroyed) """ - studyId = study._get_StudyId() shape = IDToObject(shapeStudyEntry) studyObject = IDToSObject(shapeStudyEntry) - studyEditor = getStudyEditor(studyId) + studyEditor = getStudyEditor() studyEditor.removeItem(studyObject,True) return shape @@ -126,7 +124,7 @@ def eraseShape_version65(shapeStudyEntry): # Helper functions for a complete suppression of a shape from the # SALOME session. # ====================================================================== -def deleteShape(study,shapeStudyEntry): +def deleteShape(shapeStudyEntry): """ This completly deletes a geom shape. @@ -138,7 +136,7 @@ def deleteShape(study,shapeStudyEntry): 3. destroy the underlying geom object """ eraseShape(shapeStudyEntry) - shape = removeFromStudy(study, shapeStudyEntry) + shape = removeFromStudy(shapeStudyEntry) if shape is not None: shape.Destroy() @@ -162,11 +160,10 @@ def TEST_createAndDeleteShape(): """ import salome salome.salome_init() - study = salome.myStudy - studyId = salome.myStudyId + study = salome.myStudy from salome.geom import geomtools - geompy = geomtools.getGeompy(studyId) + geompy = geomtools.getGeompy() # -------------------------------------------------- # Create a first shape (GEOM object) @@ -178,7 +175,7 @@ def TEST_createAndDeleteShape(): # folder. A name must be specified. The register operation # (addToStudy) returns an identifier of the entry in the study. cylinderName = "cyl.r%s.l%s"%(radius,length) - cylinderStudyEntry = addToStudy(study, cylinder, cylinderName) + cylinderStudyEntry = addToStudy(cylinder, cylinderName) # Display the registered shape in a viewer displayShape(cylinderStudyEntry) @@ -188,7 +185,7 @@ def TEST_createAndDeleteShape(): radius = 10 sphere = geompy.MakeSphereR(radius) sphereName = "sph.r%s"%radius - sphereStudyEntry = addToStudy(study, sphere, sphereName) + sphereStudyEntry = addToStudy(sphere, sphereName) displayShape(sphereStudyEntry) # -------------------------------------------------- @@ -199,7 +196,7 @@ def TEST_createAndDeleteShape(): box = geompy.MakeBoxDXDYDZ(length,length,length) boxName = "box.l%s"%length folderName = "boxset" - boxStudyEntry = addToStudy(study, box, boxName, folderName) + boxStudyEntry = addToStudy(box, boxName, folderName) displayShape(boxStudyEntry,PreviewColor) # -------------------------------------------------- @@ -214,7 +211,7 @@ def TEST_createAndDeleteShape(): # SALOME session (erase from viewer, remove from study and finnaly # destroy the object). This is done by a simple call to # deleteShape(). - deleteShape(study,cylinderStudyEntry) + deleteShape(cylinderStudyEntry) # -------------------------------------------------- # At the end of the executioon of this test, you should have in diff --git a/src/SalomeApp/resources/SalomeApp_msg_en.ts b/src/SalomeApp/resources/SalomeApp_msg_en.ts index 58fb8aced..d75e202a2 100644 --- a/src/SalomeApp/resources/SalomeApp_msg_en.ts +++ b/src/SalomeApp/resources/SalomeApp_msg_en.ts @@ -7,10 +7,6 @@ WRN_FILE_NOT_EXIST The file %1 does not exist. - - ERR_ACTIVEDOC_LOAD - A study is already active in your session, but you are not connected to it. Use the Connect button to load it in the interface. - WRN_STUDY_LOCKED Study is locked. @@ -214,7 +210,7 @@ Launch a new session or close the study. QUE_DOC_ALREADYEXIST - The document %1 already exists in study manager. + The document %1 already exists. Do you want to reload it ? diff --git a/src/SalomeApp/resources/SalomeApp_msg_fr.ts b/src/SalomeApp/resources/SalomeApp_msg_fr.ts index 5709c9727..c50fe9355 100755 --- a/src/SalomeApp/resources/SalomeApp_msg_fr.ts +++ b/src/SalomeApp/resources/SalomeApp_msg_fr.ts @@ -7,10 +7,6 @@ WRN_FILE_NOT_EXIST Le fichier %1 n'existe pas. - - ERR_ACTIVEDOC_LOAD - Une étude est déjà chargée dans votre session mais vous n'y êtes pas connectée. Utilisez le bouton "Connecter" pour charger l'étude dans l'interface. - WRN_STUDY_LOCKED L'étude est verrouillée @@ -214,7 +210,7 @@ Lancez une nouvelle session ou fermez l'étude en cours. QUE_DOC_ALREADYEXIST - Le document %1 existe déjà dans le gestionnaire d'études. + Le document %1 existe déjà. Voulez-vous le recharger ? diff --git a/src/SalomeApp/resources/SalomeApp_msg_ja.ts b/src/SalomeApp/resources/SalomeApp_msg_ja.ts index 1d9a98edb..7dab9b3a4 100644 --- a/src/SalomeApp/resources/SalomeApp_msg_ja.ts +++ b/src/SalomeApp/resources/SalomeApp_msg_ja.ts @@ -7,11 +7,6 @@ WRN_FILE_NOT_EXIST ファイル %1 は存在しません。 - - ERR_ACTIVEDOC_LOAD - A study is already active in your session, but you are not connected to it. Use the Connect button to load it in the interface. -スタディはあなたのセッション内ですでにアクティブになっていますが、接続できません。インターフェイス内でそれをロードするための接続用ボタンを使用してください。 - WRN_STUDY_LOCKED スタディがロックされています @@ -215,7 +210,7 @@ QUE_DOC_ALREADYEXIST - ドキュメント %1 は研究のマネージャーに既に存在します。それを再読み込みしますか。 + ドキュメント %1 はの存在。それを再読み込みしますか。 MEN_RENAME_VS diff --git a/src/SalomeApp/salome_pluginsmanager.py b/src/SalomeApp/salome_pluginsmanager.py index 2eb1ef319..e4ffb88f4 100644 --- a/src/SalomeApp/salome_pluginsmanager.py +++ b/src/SalomeApp/salome_pluginsmanager.py @@ -77,7 +77,6 @@ In short to add a plugin: context attributes: - sg : the SALOME Swig interface - - studyId : the SALOME studyId that must be used to execute the plugin - study : the SALOME study object that must be used to execute the plugin """ @@ -118,8 +117,7 @@ def initialize(module,name,basemenuname,menuname): class Context: def __init__(self,sgpyqt): self.sg=sgpyqt - self.studyId=salome.sg.getActiveStudyId() - self.study= salome.myStudyManager.GetStudyByID(self.studyId) + self.study=salome.myStudy def find_menu(smenu): lmenus=smenu.split("|") @@ -239,12 +237,7 @@ class PluginsManager: def importPlugins(self): """Execute the salome_plugins file that contains plugins definition """ - studyId=sg.getActiveStudyId() - if studyId == 0: - self.menu.clear() - self.menu.menuAction().setVisible(False) - return - elif self.lasttime ==0 or salome.myStudy == None: + if self.lasttime ==0 or salome.myStudy == None: salome.salome_init(embedded=1) lasttime=0 diff --git a/src/Session/Session_ServerCheck.cxx b/src/Session/Session_ServerCheck.cxx index 1575acb72..3e3e062fe 100644 --- a/src/Session/Session_ServerCheck.cxx +++ b/src/Session/Session_ServerCheck.cxx @@ -354,12 +354,12 @@ void Session_ServerCheck::run() SALOME_NamingService &NS = *SINGLETON_::Instance(); ASSERT( SINGLETON_::IsAlreadyExisting() ); NS.init_orb( orb ); - CORBA::Object_var obj = NS.Resolve( "/myStudyManager" ); - SALOMEDS::StudyManager_var studyManager = SALOMEDS::StudyManager::_narrow( obj ); - if ( !CORBA::is_nil( studyManager ) ) { - MESSAGE( "/myStudyManager is found" ); - studyManager->ping(); - MESSAGE( "StudyManager was activated" ); + CORBA::Object_var obj = NS.Resolve( "/Study" ); + SALOMEDS::Study_var study = SALOMEDS::Study::_narrow( obj ); + if ( !CORBA::is_nil( study ) ) { + MESSAGE( "/Study is found" ); + study->ping(); + MESSAGE( "Study was activated" ); setStep( ++current * myAttempts ); break; } diff --git a/src/Session/Session_ServerThread.cxx b/src/Session/Session_ServerThread.cxx index ee1c1f681..753cacaab 100755 --- a/src/Session/Session_ServerThread.cxx +++ b/src/Session/Session_ServerThread.cxx @@ -142,7 +142,7 @@ void Session_ServerThread::Init() } case 4: // Session { - NamingService_WaitForServerReadiness(_NS,"/myStudyManager"); + NamingService_WaitForServerReadiness(_NS,"/Study"); std::string containerName = "/Containers/"; containerName = containerName + Kernel_Utils::GetHostname(); containerName = containerName + "/FactoryServer"; @@ -215,7 +215,7 @@ void Session_ServerThread::ActivateSALOMEDS(int argc, // counted objects, they will be deleted by the POA when they are no // longer needed. - ClientFactory::createStudyManager(_orb,_root_poa); + ClientFactory::createStudy(_orb,_root_poa); } catch(CORBA::SystemException&) { INFOS( "Caught CORBA::SystemException." ); diff --git a/src/Session/Session_Session_i.cxx b/src/Session/Session_Session_i.cxx index 95103de9c..d82cefc87 100755 --- a/src/Session/Session_Session_i.cxx +++ b/src/Session/Session_Session_i.cxx @@ -65,7 +65,6 @@ SALOME_Session_i::SALOME_Session_i(int argc, _argc = argc ; _argv = argv ; _isGUI = false ; - _runningStudies= 0 ; _orb = CORBA::ORB::_duplicate(orb) ; _poa = PortableServer::POA::_duplicate(poa) ; _GUIMutex = GUIMutex; @@ -206,7 +205,7 @@ void SALOME_Session_i::Shutdown() /*! Send a SALOME::StatSession structure (see idl) to the client - (number of running studies and presence of GUI) + (presence of GUI) */ /*class QtLock { @@ -220,24 +219,23 @@ SALOME::StatSession SALOME_Session_i::GetStatSession() { // update Session state _GUIMutex->lock(); + int activeStudy = 0; - _runningStudies = 0; { //QtLock lock; _isGUI = SUIT_Session::session(); if ( _isGUI && SUIT_Session::session()->activeApplication() ) - _runningStudies = SUIT_Session::session()->activeApplication()->getNbStudies(); + activeStudy = SUIT_Session::session()->activeApplication()->getNbStudies(); } // getting stat info - SALOME::StatSession_var myStats = new SALOME::StatSession ; - if (_runningStudies) + SALOME::StatSession_var myStats = new SALOME::StatSession; + if (activeStudy) myStats->state = SALOME::running ; else if (_isShuttingDown) myStats->state = SALOME::shutdown ; else myStats->state = SALOME::asleep ; - myStats->runningStudies = _runningStudies ; myStats->activeGUI = _isGUI ; _GUIMutex->unlock(); @@ -245,16 +243,6 @@ SALOME::StatSession SALOME_Session_i::GetStatSession() return myStats._retn() ; } -CORBA::Long SALOME_Session_i::GetActiveStudyId() -{ - long aStudyId=-1; - if ( SUIT_Session::session() && SUIT_Session::session()->activeApplication() ) { - if ( SUIT_Session::session()->activeApplication()->activeStudy() ) // mkr : IPAL12128 - aStudyId = SUIT_Session::session()->activeApplication()->activeStudy()->id(); - } - return aStudyId; -} - CORBA::Long SALOME_Session_i::getPID() { return (CORBA::Long) #ifndef WIN32 diff --git a/src/Session/Session_Session_i.hxx b/src/Session/Session_Session_i.hxx index 5a83d5fdf..1fbcc4d42 100755 --- a/src/Session/Session_Session_i.hxx +++ b/src/Session/Session_Session_i.hxx @@ -68,8 +68,6 @@ public: //! Unregister the servant from Naming Service void NSunregister(); - CORBA::Long GetActiveStudyId(); - void ping(){}; CORBA::Long getPID(); char* getHostname(); @@ -94,7 +92,6 @@ protected: CORBA::Boolean _isGUI ; QMutex* _GUIMutex ; QWaitCondition* _GUILauncher; - int _runningStudies ; CORBA::ORB_var _orb; PortableServer::POA_var _poa; bool _isShuttingDown; diff --git a/src/TOOLSGUI/CMakeLists.txt b/src/TOOLSGUI/CMakeLists.txt index d391fc676..91bef71a8 100755 --- a/src/TOOLSGUI/CMakeLists.txt +++ b/src/TOOLSGUI/CMakeLists.txt @@ -44,8 +44,10 @@ SET(_link_LIBRARIES ${CAS_KERNEL} ${KERNEL_SalomeIDLKernel} ${KERNEL_SALOMELocalTrace} + ${KERNEL_SalomeDSClient} ${KERNEL_SalomeNS} ${KERNEL_OpUtil} + ${KERNEL_SalomeKernelHelpers} ${OMNIORB_LIBRARIES} qtx suit ) diff --git a/src/TOOLSGUI/ToolsGUI.cxx b/src/TOOLSGUI/ToolsGUI.cxx index aba358027..253389ad7 100755 --- a/src/TOOLSGUI/ToolsGUI.cxx +++ b/src/TOOLSGUI/ToolsGUI.cxx @@ -25,6 +25,8 @@ // Author : Nicolas REJNERI // #include "ToolsGUI.h" +#include +#include /*! \class ToolsGUI @@ -33,13 +35,11 @@ /*! \brief Get visibility value of the "AttributeGraphic" attribute. - \param theStudy study \param theObj object \param theId sub-object identifier \return \c true if an object (sub-object) is visible */ -bool ToolsGUI::GetVisibility( _PTR(Study) theStudy, - _PTR(SObject) theObj, +bool ToolsGUI::GetVisibility( _PTR(SObject) theObj, void* theId ) { _PTR(GenericAttribute) anAttr; @@ -54,17 +54,16 @@ bool ToolsGUI::GetVisibility( _PTR(Study) theStudy, /*! \brief Set visibility value of the "AttributeGraphic" attribute. - \param theStudy study \param theObj object \return theValue new visibility value \param theId sub-object identifier */ -bool ToolsGUI::SetVisibility( _PTR(Study) theStudy, - const char* theEntry, +bool ToolsGUI::SetVisibility( const char* theEntry, const bool theValue, void* theId ) { - _PTR(SObject) anObj ( theStudy->FindObjectID( theEntry ) ); + _PTR(Study) aStudy = ClientFactory::Study(KERNEL::getStudyServant()); + _PTR(SObject) anObj ( aStudy->FindObjectID( theEntry ) ); if ( anObj ) { @@ -76,7 +75,7 @@ bool ToolsGUI::SetVisibility( _PTR(Study) theStudy, } else if ( theValue ) { - _PTR(StudyBuilder) aBuilder (theStudy->NewBuilder()); + _PTR(StudyBuilder) aBuilder (aStudy->NewBuilder()); _PTR(AttributeGraphic) anAttr (aBuilder->FindOrCreateAttribute(anObj, "AttributeGraphic")); anAttr->SetVisibility( (unsigned long)theId, theValue ); } diff --git a/src/TOOLSGUI/ToolsGUI.h b/src/TOOLSGUI/ToolsGUI.h index 5a2190d7a..05ab64815 100755 --- a/src/TOOLSGUI/ToolsGUI.h +++ b/src/TOOLSGUI/ToolsGUI.h @@ -43,11 +43,9 @@ class TOOLSGUI_EXPORT ToolsGUI { public : - static bool GetVisibility( _PTR(Study) theStudy, - _PTR(SObject) theObj, + static bool GetVisibility( _PTR(SObject) theObj, void* theId ); - static bool SetVisibility( _PTR(Study) theStudy, - const char* theEntry, + static bool SetVisibility( const char* theEntry, const bool theValue, void* theId ); }; -- 2.39.2