From: mpv Date: Thu, 18 Oct 2012 06:40:43 +0000 (+0000) Subject: Initial integration of SimanIO support and SIMAN study interfaces X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=72b9d28382ffb3a1980b5e947972818ea9f0f4f0;p=modules%2Fkernel.git Initial integration of SimanIO support and SIMAN study interfaces --- diff --git a/src/SALOMEDS/Makefile.am b/src/SALOMEDS/Makefile.am index bfc45db68..24edd8d54 100644 --- a/src/SALOMEDS/Makefile.am +++ b/src/SALOMEDS/Makefile.am @@ -105,6 +105,8 @@ libSalomeDS_la_SOURCES = \ SALOMEDS_UseCaseIterator_i.cxx \ SALOMEDS_ChildIterator_i.cxx \ SALOMEDS_SComponentIterator_i.cxx \ + SALOMEDS_SimanStudy_i.cxx \ + SALOMEDS_SimanStudy.cxx \ SALOMEDS_Study_i.cxx \ SALOMEDS_StudyBuilder_i.cxx \ SALOMEDS_SObject_i.cxx \ @@ -255,6 +257,8 @@ libSalomeDS_la_SOURCES = \ SALOMEDS_SComponent_i.hxx \ SALOMEDS_SComponentIterator.hxx \ SALOMEDS_SComponentIterator_i.hxx \ + SALOMEDS_SimanStudy.hxx \ + SALOMEDS_SimanStudy_i.hxx \ SALOMEDS_SObject.hxx \ SALOMEDS_SObject_i.hxx \ SALOMEDS_StudyBuilder.hxx \ @@ -273,6 +277,12 @@ libSalomeDS_la_SOURCES = \ SALOMEDS_AttributeString_i.hxx \ SALOMEDS_TMPFile_i.hxx +if WITH_SIMANIO + +COMMON_CPPFLAGS += -DWITH_SIMANIO + +endif + libSalomeDS_la_CPPFLAGS = $(COMMON_CPPFLAGS) libSalomeDS_la_LDFLAGS = -Wl,-E -no-undefined -version-info=0:0:0 @LDEXPDYNFLAGS@ libSalomeDS_la_LIBADD = $(COMMON_LIBS) diff --git a/src/SALOMEDS/SALOMEDS_SimanStudy.cxx b/src/SALOMEDS/SALOMEDS_SimanStudy.cxx new file mode 100644 index 000000000..1000eadd7 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_SimanStudy.cxx @@ -0,0 +1,179 @@ +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// File : SALOMEDS_SimanStudy.cxx +// Author : Mikhail PONIKAROV +// Module : SALOME +// +#include "utilities.h" + +#include "SALOMEDS_SimanStudy.hxx" + +#include "SALOMEDS.hxx" +#include "SALOMEDS_Study.hxx" + +#include "SALOMEDSImpl_Study.hxx" + +#include "SALOMEDS_SimanStudy_i.hxx" + +#include "Basics_Utils.hxx" + +#include "Utils_ORB_INIT.hxx" +#include "Utils_SINGLETON.hxx" + +SALOMEDS_SimanStudy::SALOMEDS_SimanStudy(SALOMEDSImpl_SimanStudy* theStudy) +{ + _isLocal = true; + _local_impl = theStudy; + _corba_impl = SALOMEDS::SimanStudy::_nil(); + init_orb(); +} + +SALOMEDS_SimanStudy::SALOMEDS_SimanStudy(SALOMEDS::SimanStudy_ptr theStudy) +{ +#ifdef WIN32 + long pid = (long)_getpid(); +#else + long pid = (long)getpid(); +#endif + + long addr = theStudy->GetLocalImpl(Kernel_Utils::GetHostname().c_str(), pid, _isLocal); + if(_isLocal) { + _local_impl = reinterpret_cast(addr); + _corba_impl = SALOMEDS::SimanStudy::_duplicate(theStudy); + } + else { + _local_impl = NULL; + _corba_impl = SALOMEDS::SimanStudy::_duplicate(theStudy); + } + + init_orb(); +} + +SALOMEDS_SimanStudy::~SALOMEDS_SimanStudy() +{ +} + +void SALOMEDS_SimanStudy::CheckOut(const _PTR(Study) theTarget) +{ + if (!theTarget) return; + SALOMEDS_Study* aStudy = dynamic_cast(theTarget.get()); + if (_isLocal) { + //SALOMEDS::Locker lock; mpv: this may cause dedlock when importData in module calls another SALOMEDS method with lock + _local_impl->CheckOut(aStudy->GetLocalImpl()); + } + else _corba_impl->CheckOut(aStudy->GetStudy()); +} + +void SALOMEDS_SimanStudy::CheckIn(const std::string theModuleName) +{ + if (_isLocal) { + //SALOMEDS::Locker lock; mpv: this may cause dedlock when getModifiedData in module calls another SALOMEDS method with lock + _local_impl->CheckIn(theModuleName); + } + else _corba_impl->CheckIn((char*)theModuleName.c_str()); +} + +_PTR(Study) SALOMEDS_SimanStudy::getReferencedStudy() +{ + SALOMEDSClient_Study* aStudy = NULL; + if (_isLocal) { + SALOMEDS::Locker lock; + + SALOMEDSImpl_Study* aStudy_impl = _local_impl->getReferencedStudy(); + if (!aStudy_impl) return _PTR(Study)(aStudy); + aStudy = new SALOMEDS_Study(aStudy_impl); + } + else { + SALOMEDS::Study_var aStudy_impl = _corba_impl->getReferencedStudy(); + if (CORBA::is_nil(aStudy_impl)) return _PTR(Study)(aStudy); + aStudy = new SALOMEDS_Study(aStudy_impl); + } + return _PTR(Study)(aStudy); +} + +std::string SALOMEDS_SimanStudy::StudyId() +{ + std::string anId; + if (_isLocal) { + SALOMEDS::Locker lock; + anId = _local_impl->StudyId(); + } + else anId = (CORBA::String_var)_corba_impl->StudyId(); + return anId; +} + +void SALOMEDS_SimanStudy::StudyId(const std::string theId) +{ + if (_isLocal) { + SALOMEDS::Locker lock; + _local_impl->StudyId(theId); + } + else _corba_impl->StudyId((char*)theId.c_str()); +} + +std::string SALOMEDS_SimanStudy::ScenarioId() +{ + std::string anId; + if (_isLocal) { + SALOMEDS::Locker lock; + anId = _local_impl->ScenarioId(); + } + else anId = (CORBA::String_var)_corba_impl->ScenarioId(); + return anId; +} + +void SALOMEDS_SimanStudy::ScenarioId(const std::string theId) +{ + if (_isLocal) { + SALOMEDS::Locker lock; + _local_impl->ScenarioId(theId); + } + else _corba_impl->ScenarioId((char*)theId.c_str()); +} + +std::string SALOMEDS_SimanStudy::UserId() +{ + std::string anId; + if (_isLocal) { + SALOMEDS::Locker lock; + anId = _local_impl->UserId(); + } + else anId = (CORBA::String_var)_corba_impl->UserId(); + return anId; +} + +void SALOMEDS_SimanStudy::UserId(const std::string theId) +{ + if (_isLocal) { + SALOMEDS::Locker lock; + _local_impl->UserId(theId); + } + else _corba_impl->UserId((char*)theId.c_str()); +} + +void SALOMEDS_SimanStudy::init_orb() +{ + ORB_INIT &init = *SINGLETON_::Instance(); + ASSERT(SINGLETON_::IsAlreadyExisting()); + _orb = init(0, 0); +} diff --git a/src/SALOMEDS/SALOMEDS_SimanStudy.hxx b/src/SALOMEDS/SALOMEDS_SimanStudy.hxx new file mode 100644 index 000000000..3cfe76f4f --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_SimanStudy.hxx @@ -0,0 +1,69 @@ +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// File : SALOMEDS_SimanStudy.hxx +// Author : Mikhail PONIKAROV +// Module : SALOME +// +#ifndef __SALOMEDS_SIMANSTUDY_H__ +#define __SALOMEDS_SIMANSTUDY_H__ + +#include +#include + +#include "SALOMEDSClient.hxx" +#include "SALOMEDSImpl_SimanStudy.hxx" + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) + +class Standard_EXPORT SALOMEDS_SimanStudy: public SALOMEDSClient_SimanStudy +{ + +private: + bool _isLocal; + SALOMEDSImpl_SimanStudy* _local_impl; + SALOMEDS::SimanStudy_var _corba_impl; + CORBA::ORB_var _orb; + +public: + + SALOMEDS_SimanStudy(SALOMEDSImpl_SimanStudy* theStudy); + SALOMEDS_SimanStudy(SALOMEDS::SimanStudy_ptr theStudy); + ~SALOMEDS_SimanStudy(); + + virtual void CheckOut(const _PTR(Study) theTarget); + virtual void CheckIn(const std::string theModuleName); + virtual _PTR(Study) getReferencedStudy() ; + virtual std::string StudyId(); + virtual void StudyId(const std::string theId); + virtual std::string ScenarioId(); + virtual void ScenarioId(const std::string theId); + virtual std::string UserId(); + virtual void UserId(const std::string theId); + +private: + void init_orb(); + +}; +#endif diff --git a/src/SALOMEDS/SALOMEDS_SimanStudy_i.cxx b/src/SALOMEDS/SALOMEDS_SimanStudy_i.cxx new file mode 100644 index 000000000..e43bf02b4 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_SimanStudy_i.cxx @@ -0,0 +1,176 @@ +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// File : SALOMEDS_SimanStudy_i.cxx +// Author : Mikhail PONIKAROV +// Module : SALOME +// +#include "utilities.h" +#include "SALOMEDS_SimanStudy_i.hxx" +#include "SALOMEDSImpl_SimanStudy.hxx" +#include "SALOMEDSImpl_StudyManager.hxx" +#include "SALOMEDS_Study_i.hxx" +#include "SALOMEDS_Study.hxx" + +#include "Basics_Utils.hxx" + +//============================================================================ +/*! Function : SALOMEDS_SimanStudy_i + * Purpose : standard constructor + */ +//============================================================================ +SALOMEDS_SimanStudy_i::SALOMEDS_SimanStudy_i(SALOMEDSImpl_SimanStudy* theImpl, CORBA::ORB_ptr orb) +{ + _orb = CORBA::ORB::_duplicate(orb); + _impl = theImpl; +} + +//============================================================================ +/*! Function : ~SALOMEDS_SimanStudy_i + * Purpose : standard destructor + */ +//============================================================================ +SALOMEDS_SimanStudy_i::~SALOMEDS_SimanStudy_i() +{ + //delete implementation + delete _impl; +} + +//============================================================================ +/*! Function : CheckOut + * Purpose : Get data from SIMAN and put it to the given study + */ +//============================================================================ +void SALOMEDS_SimanStudy_i::CheckOut(SALOMEDS::Study_ptr theTarget) +{ + // SimanStudy and Study must be located at the same place anyway + SALOMEDS_Study aStudy(theTarget); + _study = aStudy.GetLocalImpl(); + if (_study) { + _impl->CheckOut(_study); + } +} + +//============================================================================ +/*! Function : CheckIn + * Purpose : Get data from SIMAN study and stores to SIMAN + */ +//============================================================================ +void SALOMEDS_SimanStudy_i::CheckIn(const char* theModuleName) +{ + if (_study) { + _impl->CheckIn(theModuleName); + } +} + +//============================================================================ +/*! Function : getReferencedStudy + * Purpose : Returns the %Study with checked out data + */ +//============================================================================ +SALOMEDS::Study_ptr SALOMEDS_SimanStudy_i::getReferencedStudy() +{ + SALOMEDS::Study_var aStudy = (new SALOMEDS_Study_i(_study, _orb))->_this(); + return aStudy._retn(); +} + +//============================================================================ +/*! Function : StudyId + * Purpose : The ID of the study in SIMAN server + */ +//============================================================================ +char* SALOMEDS_SimanStudy_i::StudyId() +{ + return CORBA::string_dup(_impl->StudyId().c_str()); +} + +//============================================================================ +/*! Function : StudyId + * Purpose : The ID of the study in SIMAN server + */ +//============================================================================ +void SALOMEDS_SimanStudy_i::StudyId(const char* theId) +{ + _impl->StudyId(theId); +} + +//============================================================================ +/*! Function : ScenarioId + * Purpose : The ID of the scenario in SIMAN server + */ +//============================================================================ +char* SALOMEDS_SimanStudy_i::ScenarioId() +{ + return CORBA::string_dup(_impl->ScenarioId().c_str()); +} + +//============================================================================ +/*! Function : ScenarioId + * Purpose : The ID of the scenario in SIMAN server + */ +//============================================================================ +void SALOMEDS_SimanStudy_i::ScenarioId(const char* theId) +{ + _impl->StudyId(theId); +} + +//============================================================================ +/*! Function : UserId + * Purpose : The ID of the user in SIMAN server + */ +//============================================================================ +char* SALOMEDS_SimanStudy_i::UserId() +{ + return CORBA::string_dup(_impl->UserId().c_str()); +} + +//============================================================================ +/*! Function : UserId + * Purpose : The ID of the user in SIMAN server + */ +//============================================================================ +void SALOMEDS_SimanStudy_i::UserId(const char* theId) +{ + _impl->UserId(theId); +} + + +SALOMEDS_SimanStudy_i* SALOMEDS_SimanStudy_i::GetSimanServant(SALOMEDSImpl_SimanStudy* aSimanImpl, CORBA::ORB_ptr orb) +{ + static SALOMEDS_SimanStudy_i* aServant = 0; + if (aServant == 0) { + aServant = new SALOMEDS_SimanStudy_i(aSimanImpl, orb); + } + return aServant; +} + +/// PRIVATE FUNCTIONS +CORBA::LongLong SALOMEDS_SimanStudy_i::GetLocalImpl(const char* theHostname, CORBA::Long thePID, CORBA::Boolean& isLocal) +{ +#ifdef WIN32 + long pid = (long)_getpid(); +#else + long pid = (long)getpid(); +#endif + isLocal = (strcmp(theHostname, Kernel_Utils::GetHostname().c_str()) == 0 && pid == thePID)?1:0; + return reinterpret_cast(_impl); +} diff --git a/src/SALOMEDS/SALOMEDS_SimanStudy_i.hxx b/src/SALOMEDS/SALOMEDS_SimanStudy_i.hxx new file mode 100644 index 000000000..cd894aa47 --- /dev/null +++ b/src/SALOMEDS/SALOMEDS_SimanStudy_i.hxx @@ -0,0 +1,119 @@ +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// File : SALOMEDS_SimanStudy_i.hxx +// Author : Mikhail PONIKAROV +// Module : SALOME +// +#ifndef __SALOMEDS_SIMANSTUDY_I_H__ +#define __SALOMEDS_SIMANSTUDY_I_H__ + +// IDL headers +#include +#include CORBA_SERVER_HEADER(SALOMEDS) + +//SALOMEDS headers +#include "SALOMEDS_Study_i.hxx" + +class SALOMEDSImpl_SimanStudy; +class SALOMEDSImpl_Study; + +class Standard_EXPORT SALOMEDS_SimanStudy_i: public POA_SALOMEDS::SimanStudy +{ +private: + CORBA::ORB_var _orb; + SALOMEDSImpl_SimanStudy* _impl; + SALOMEDSImpl_Study* _study; + +public: + + //! standard constructor + SALOMEDS_SimanStudy_i(SALOMEDSImpl_SimanStudy*, CORBA::ORB_ptr); + + //! standard destructor + virtual ~SALOMEDS_SimanStudy_i(); + + /*! \brief Get data from SIMAN and put it to the given study + + This method is called for just created study to make it referenced + by this Siman study. Also it fills this study by the checked out + data from SIMAN server. + Warning: StudyID, ScenarioID and User Id must be set before calling of this method! + + \param theTarget referenced study for checking out + */ + virtual void CheckOut(SALOMEDS::Study_ptr theTarget); + + /*! \brief Get data from all modules and calls the corresponding SimanIO methods to store it. + + It works only with already checked out study + */ + virtual void CheckIn(const char* themoduleName); + + /*! \brief Returns the %Study with checked out data + + If study is null, there is no such study in this application instance, or Salome was + launched without siman option. + */ + virtual SALOMEDS::Study_ptr getReferencedStudy(); + + /*! \brief The ID of the study in SIMAN server + + Returns the Id of SIMAN study, used for CheckOut before. + */ + virtual char* StudyId(); + + /*! \brief The ID of the study in SIMAN server + + Defines the Id of SIMAN study, used for CheckOut after. + */ + virtual void StudyId(const char* theId); + + /*! \brief The ID of the scenario in SIMAN server + + Returns the Id of SIMAN scenario, used for CheckOut before. + */ + virtual char* ScenarioId(); + + /*! \brief The ID of the scenario in SIMAN server + + Defines the Id of SIMAN scenario, used for CheckOut after. + */ + virtual void ScenarioId(const char* theId); + + /*! \brief The ID of the user in SIMAN server + + Returns the Id of SIMAN user, used for CheckOut before. + */ + virtual char* UserId(); + + /*! \brief The ID of the user in SIMAN server + + Defines the Id of SIMAN user, used for CheckOut after. + */ + virtual void UserId(const char* theId); + + virtual CORBA::LongLong GetLocalImpl(const char* theHostname, CORBA::Long thePID, CORBA::Boolean& isLocal); + + static SALOMEDS_SimanStudy_i* GetSimanServant(SALOMEDSImpl_SimanStudy*, CORBA::ORB_ptr orb); +}; +#endif diff --git a/src/SALOMEDS/SALOMEDS_Study.hxx b/src/SALOMEDS/SALOMEDS_Study.hxx index 3e0c43498..58ed7ebb3 100644 --- a/src/SALOMEDS/SALOMEDS_Study.hxx +++ b/src/SALOMEDS/SALOMEDS_Study.hxx @@ -128,7 +128,9 @@ public: CORBA::Object_ptr ConvertIORToObject(const std::string& theIOR); SALOMEDS::Study_ptr GetStudy(); - + + SALOMEDSImpl_Study* GetLocalImpl() { return _local_impl; } + private: void init_orb(); diff --git a/src/SALOMEDS/SALOMEDS_StudyManager.cxx b/src/SALOMEDS/SALOMEDS_StudyManager.cxx index 813d0820e..f081e31d1 100644 --- a/src/SALOMEDS/SALOMEDS_StudyManager.cxx +++ b/src/SALOMEDS/SALOMEDS_StudyManager.cxx @@ -39,6 +39,8 @@ #include "Basics_Utils.hxx" +#include "SALOMEDS_SimanStudy.hxx" + #ifdef WIN32 #include #else @@ -324,3 +326,21 @@ SALOMEDS_Driver_i* GetDriver(const SALOMEDSImpl_SObject& theObject, CORBA::ORB_p return driver; } + +_PTR(SimanStudy) SALOMEDS_StudyManager::GetSimanStudy() +{ + SALOMEDSClient_SimanStudy* aSiman = NULL; + if (_isLocal) { + SALOMEDS::Locker lock; + + SALOMEDSImpl_SimanStudy* aSiman_impl = _local_impl->GetSimanStudy(); + if(!aSiman_impl) return _PTR(SimanStudy)(aSiman); + aSiman = new SALOMEDS_SimanStudy(aSiman_impl); + } + else { + SALOMEDS::SimanStudy_var aSiman_impl = _corba_impl->GetSimanStudy(); + if(CORBA::is_nil(aSiman_impl)) return _PTR(SimanStudy)(aSiman); + aSiman = new SALOMEDS_SimanStudy(aSiman_impl); + } + return _PTR(SimanStudy)(aSiman); +} diff --git a/src/SALOMEDS/SALOMEDS_StudyManager.hxx b/src/SALOMEDS/SALOMEDS_StudyManager.hxx index b48175bf7..991f3ae17 100644 --- a/src/SALOMEDS/SALOMEDS_StudyManager.hxx +++ b/src/SALOMEDS/SALOMEDS_StudyManager.hxx @@ -66,6 +66,7 @@ public: virtual bool Copy(const _PTR(SObject)& theSO); virtual bool CanPaste(const _PTR(SObject)& theSO); virtual _PTR(SObject) Paste(const _PTR(SObject)& theSO); + virtual _PTR(SimanStudy) GetSimanStudy(); private: void init_orb(); diff --git a/src/SALOMEDS/SALOMEDS_StudyManager_i.cxx b/src/SALOMEDS/SALOMEDS_StudyManager_i.cxx index c26919c8e..9e2340f4d 100644 --- a/src/SALOMEDS/SALOMEDS_StudyManager_i.cxx +++ b/src/SALOMEDS/SALOMEDS_StudyManager_i.cxx @@ -42,10 +42,13 @@ #include "Basics_Utils.hxx" #include "SALOME_GenericObj_i.hh" +#include "SALOMEDS_SimanStudy_i.hxx" + #include #include #include + #ifdef WIN32 #include #else @@ -478,6 +481,21 @@ void SALOMEDS_StudyManager_i::ShutdownWithExit() exit( EXIT_SUCCESS ); } +//============================================================================ +/*! Function : GetSimanStudy + * Purpose : Retruns the created or cashed SimanStudy + */ +//============================================================================ +SALOMEDS::SimanStudy_ptr SALOMEDS_StudyManager_i::GetSimanStudy() +{ + SALOMEDS::Locker lock; + + SALOMEDSImpl_SimanStudy* aSimanImpl = _impl->GetSimanStudy(); + + SALOMEDS_SimanStudy_i* aSiman_servant = SALOMEDS_SimanStudy_i::GetSimanServant(aSimanImpl, _orb); + return aSiman_servant->_this(); +} + //=========================================================================== // PRIVATE FUNCTIONS //=========================================================================== diff --git a/src/SALOMEDS/SALOMEDS_StudyManager_i.hxx b/src/SALOMEDS/SALOMEDS_StudyManager_i.hxx index 5b44f0602..5d08c4803 100644 --- a/src/SALOMEDS/SALOMEDS_StudyManager_i.hxx +++ b/src/SALOMEDS/SALOMEDS_StudyManager_i.hxx @@ -151,6 +151,8 @@ public: static PortableServer::POA_ptr GetPOA(const SALOMEDS::Study_ptr theStudy); void Shutdown() { if(!CORBA::is_nil(_orb)) _orb->shutdown(0); } + + virtual SALOMEDS::SimanStudy_ptr GetSimanStudy(); }; #endif diff --git a/src/SALOMEDS/Test/Makefile.am b/src/SALOMEDS/Test/Makefile.am index 3076b5821..f45fe0f40 100644 --- a/src/SALOMEDS/Test/Makefile.am +++ b/src/SALOMEDS/Test/Makefile.am @@ -85,6 +85,10 @@ COMMON_LIBS =\ $(RPATH)/SALOMEDS/libSalomeDS.la \ $(top_builddir)/idl/libSalomeIDLKernel.la +if WITH_SIMANIO + COMMON_CPPFLAGS += -DWITH_SIMANIO +endif + # # =============================================================== # Libraries targets diff --git a/src/SALOMEDSClient/Makefile.am b/src/SALOMEDSClient/Makefile.am index 9e65df0b2..7c7140d9d 100644 --- a/src/SALOMEDSClient/Makefile.am +++ b/src/SALOMEDSClient/Makefile.am @@ -66,6 +66,7 @@ salomeinclude_HEADERS=\ SALOMEDSClient_SComponentIterator.hxx \ SALOMEDSClient_SObject.hxx \ SALOMEDSClient_Study.hxx \ + SALOMEDSClient_SimanStudy.hxx \ SALOMEDSClient_StudyBuilder.hxx \ SALOMEDSClient_StudyManager.hxx \ SALOMEDSClient_UseCaseBuilder.hxx \ @@ -87,7 +88,12 @@ COMMON_CPPFLAGS= \ -I$(top_builddir)/idl \ @CORBA_CXXFLAGS@ @CORBA_INCLUDES@ +if WITH_SIMANIO +COMMON_CPPFLAGS += -DWITH_SIMANIO + +endif + # This local variable defines the list of dependant libraries common to all target in this package. COMMON_LIBS = $(top_builddir)/idl/libSalomeIDLKernel.la diff --git a/src/SALOMEDSClient/SALOMEDSClient.hxx b/src/SALOMEDSClient/SALOMEDSClient.hxx index cb606ef13..0289ab11b 100644 --- a/src/SALOMEDSClient/SALOMEDSClient.hxx +++ b/src/SALOMEDSClient/SALOMEDSClient.hxx @@ -65,4 +65,8 @@ #include "SALOMEDSClient_UseCaseBuilder.hxx" #include "SALOMEDSClient_UseCaseIterator.hxx" +#ifdef WITH_SIMANIO +#include "SALOMEDSClient_SimanStudy.hxx" +#endif + #endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_SimanStudy.hxx b/src/SALOMEDSClient/SALOMEDSClient_SimanStudy.hxx new file mode 100644 index 000000000..456019816 --- /dev/null +++ b/src/SALOMEDSClient/SALOMEDSClient_SimanStudy.hxx @@ -0,0 +1,56 @@ +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// File : SALOMEDSClient_SimanStudy.hxx +// Author : Mikhail PONIKAROV +// Module : SALOME +// +#ifndef __SALOMEDSClient_SIMANSTUDY_H__ +#define __SALOMEDSClient_SIMANSTUDY_H__ + +#include +#include + +#include "SALOMEDSClient_definitions.hxx" +#include "SALOMEDSClient_Study.hxx" +#include +#include CORBA_CLIENT_HEADER(SALOMEDS) + +class SALOMEDSClient_SimanStudy +{ + +public: + virtual ~SALOMEDSClient_SimanStudy() {} + + virtual void CheckOut(const _PTR(Study) theTarget) = 0; + virtual void CheckIn(const std::string theModuleName) = 0; + virtual _PTR(Study) getReferencedStudy() = 0; + virtual std::string StudyId() = 0; + virtual void StudyId(const std::string theId) = 0; + virtual std::string ScenarioId() = 0; + virtual void ScenarioId(const std::string theId) = 0; + virtual std::string UserId() = 0; + virtual void UserId(const std::string theId) = 0; +}; + + +#endif diff --git a/src/SALOMEDSClient/SALOMEDSClient_StudyManager.hxx b/src/SALOMEDSClient/SALOMEDSClient_StudyManager.hxx index a7081c4f2..43717c1b9 100644 --- a/src/SALOMEDSClient/SALOMEDSClient_StudyManager.hxx +++ b/src/SALOMEDSClient/SALOMEDSClient_StudyManager.hxx @@ -32,6 +32,7 @@ #include "SALOMEDSClient_definitions.hxx" #include "SALOMEDSClient_Study.hxx" +#include "SALOMEDSClient_SimanStudy.hxx" class SALOMEDSClient_StudyManager { @@ -52,6 +53,8 @@ public: virtual bool Copy(const _PTR(SObject)& theSO) = 0; virtual bool CanPaste(const _PTR(SObject)& theSO) = 0; virtual _PTR(SObject) Paste(const _PTR(SObject)& theSO) = 0; + + virtual _PTR(SimanStudy) GetSimanStudy() = 0; }; diff --git a/src/SALOMEDSImpl/Makefile.am b/src/SALOMEDSImpl/Makefile.am index dac9a72ce..c2ec0025e 100644 --- a/src/SALOMEDSImpl/Makefile.am +++ b/src/SALOMEDSImpl/Makefile.am @@ -211,6 +211,8 @@ libSalomeDSImpl_la_SOURCES =\ SALOMEDSImpl_GenericAttribute.hxx \ SALOMEDSImpl_SComponent.hxx \ SALOMEDSImpl_SComponentIterator.hxx \ + SALOMEDSImpl_SimanStudy.hxx \ + SALOMEDSImpl_SimanStudy.cxx \ SALOMEDSImpl_SObject.hxx \ SALOMEDSImpl_StudyBuilder.hxx \ SALOMEDSImpl_StudyHandle.hxx \ @@ -222,10 +224,21 @@ libSalomeDSImpl_la_SOURCES =\ SALOMEDSImpl_GenericVariable.hxx \ SALOMEDSImpl_ScalarVariable.hxx +if WITH_SIMANIO + +COMMON_CPPFLAGS += -DWITH_SIMANIO @SIMANIO_CPPFLAGS@ \ + -I$(srcdir)/../KernelHelpers -I$(srcdir)/../NamingService -I$(srcdir)/../LifeCycleCORBA -I$(srcdir)/../Utils \ + -I$(srcdir)/../Container -I$(srcdir)/../TOOLSDS + +COMMON_LIBS += @SIMANIO_LIBS@ ../KernelHelpers/libSalomeKernelHelpers.la ../LifeCycleCORBA/libSalomeLifeCycleCORBA.la \ + ../Container/libSalomeContainer.la ../TOOLSDS/libTOOLSDS.la + +endif + libSalomeDSImpl_la_CPPFLAGS = $(COMMON_CPPFLAGS) libSalomeDSImpl_la_LDFLAGS = -no-undefined -version-info=0:0:0 libSalomeDSImpl_la_LIBADD = $(COMMON_LIBS) $(CORBA_LIBS) - + # # =============================================================== # Executables targets diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_SimanStudy.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_SimanStudy.cxx new file mode 100644 index 000000000..d0d3d0b43 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_SimanStudy.cxx @@ -0,0 +1,307 @@ +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// File : SALOMEDSImpl_SimanStudy.cxx +// Author : Mikhail PONIKAROV +// Module : SALOME +// +#include "SALOMEDSImpl_SimanStudy.hxx" + +#ifdef WITH_SIMANIO +#include +#include +#include +#include +#include +#include +#include +#endif + +#include +#include CORBA_SERVER_HEADER(SALOME_Component) + +using namespace std; + +//============================================================================ +/*! Function : SALOMEDSImpl_SimanStudy + * Purpose : SALOMEDSImpl_SimanStudy constructor + */ +//============================================================================ +SALOMEDSImpl_SimanStudy::SALOMEDSImpl_SimanStudy() +{ + _study = 0; + _checkedOut = new SimanIO_Configuration; +} + +//============================================================================ +/*! Function : ~SALOMEDSImpl_SimanStudy + * Purpose : SALOMEDSImpl_SimanStudy destructor + */ +//============================================================================ +SALOMEDSImpl_SimanStudy::~SALOMEDSImpl_SimanStudy() +{ + if (_checkedOut) { +#ifdef WITH_SIMANIO + SimanIO_Configuration::ActivitiesIterator actIter(*_checkedOut); + for(; actIter.More(); actIter.Next()) { + SimanIO_Activity::DocumentsIterator aDocIter(actIter.Activity()); + for(; aDocIter.More(); aDocIter.Next()) { + const SimanIO_Document& aDoc = aDocIter.Document(); + SimanIO_Document::FilesIterator aFileIter(aDoc); + for(; aFileIter.More(); aFileIter.Next()) { + string aURL = aFileIter.URL(); + string aDir = Kernel_Utils::GetDirName(aURL); + aDir += "/"; + string aFileName = aURL.substr(aDir.size()); + SALOMEDS::ListOfFileNames aTmpFiles; + aTmpFiles.length(1); + aTmpFiles[0] = aFileName.c_str(); + // try to removetemporary directory that contains this file if directory becomes empty + SALOMEDS_Tool::RemoveTemporaryFiles(aDir, aTmpFiles, true); + } + } + } +#endif + delete _checkedOut; + } +} + +//============================================================================ +/*! Function : CheckOut + * Purpose : Fills the referenced study by the SIMAN data + */ +//============================================================================ +void SALOMEDSImpl_SimanStudy::CheckOut(SALOMEDSImpl_Study* theTarget) +{ + _study = theTarget; +#ifdef WITH_SIMANIO + int aLocked = _study->GetProperties()->IsLocked(); + if (aLocked) _study->GetProperties()->SetLocked(false); + + SimanIO_Link aLink(_studyId.c_str(), _scenarioId.c_str(), _userId.c_str()); + if (aLink.IsConnected()) { + // Set "C" locale temporarily to avoid possible localization problems + Kernel_Utils::Localizer loc; + *_checkedOut = aLink.RetrieveConf(); + SimanIO_Configuration::ActivitiesIterator actIter(*_checkedOut); + for(; actIter.More(); actIter.Next()) { + Engines::EngineComponent_var aComp = + KERNEL::getLifeCycleCORBA()->FindOrLoad_Component("FactoryServerPy", actIter.Activity().Module()); + if (CORBA::is_nil(aComp)) // it is not python container, try to find in C++ container + aComp = KERNEL::getLifeCycleCORBA()->FindOrLoad_Component("FactoryServer", actIter.Activity().Module()); + if (CORBA::is_nil(aComp)) { + MESSAGE("Checkout: component "<(); + const SimanIO_Document& aDoc = aDocIter.Document(); + SimanIO_Document::FilesIterator aFileIter(aDoc); + for(; aFileIter.More(); aFileIter.Next()) { + if (aFileIter.GetProcessing() == FILE_IMPORT) { + // files provided by SIMAN will be removed later, on study close + Engines::DataContainer_var aData = (new Engines_DataContainer_i( + aFileIter.URL(), aDoc.Name(), "", false))->_this(); + Engines::ListOfOptions anEmptyOpts; + Engines::ListOfIdentifiers_var anIds = aComp->importData(_study->StudyId(), aData, anEmptyOpts); + for(int anIdNum = 0; anIdNum < anIds->length(); anIdNum++) { + const char* anId = anIds[anIdNum]; + _filesId[aDocIter.DocId()][anId] = aFileIter.Id(); + } + } else { + cout<<"!!! File just downloaded, not imported:"<GetProperties()->SetLocked(true); + +#endif +} + +//============================================================================ +/*! Function : CheckIn + * Purpose : Fills the SIMAN by the SIMAN study data + */ +//============================================================================ +void SALOMEDSImpl_SimanStudy::CheckIn(const std::string theModuleName) +{ +#ifdef WITH_SIMANIO + if (!_study) { + MESSAGE("No siman study defined"); + return; + } + SimanIO_Link aLink(_studyId.c_str(), _scenarioId.c_str(), _userId.c_str()); + if (aLink.IsConnected()) { + // Set "C" locale temporarily to avoid possible localization problems + Kernel_Utils::Localizer loc; + SimanIO_Configuration aToStore; // here create and store data in this configuration to check in to SIMAN + string aTmpDir = SALOMEDS_Tool::GetTmpDir(); // temporary directory for checked in files + int aFileIndex = 0; // for unique file name generation + list aTemporaryFileNames; + SimanIO_Configuration::ActivitiesIterator actIter(*_checkedOut); + for(; actIter.More(); actIter.Next()) { + int aDocId = actIter.Activity().DocumentMaxID(); + if (aDocId < 0) continue; // no documents => no check in + if (!theModuleName.empty() && theModuleName != actIter.Activity().Module()) { + continue; + } + Engines::EngineComponent_var aComp = + KERNEL::getLifeCycleCORBA()->FindOrLoad_Component("FactoryServerPy", actIter.Activity().Module()); + if (CORBA::is_nil(aComp)) // it is not python container, try to find in C++ container + aComp = KERNEL::getLifeCycleCORBA()->FindOrLoad_Component("FactoryServer", actIter.Activity().Module()); + if (CORBA::is_nil(aComp)) { + MESSAGE("Checkin: component "<getModifiedData(_study->StudyId()); + int aNumData = aList->length(); + for(int aDataIndex = 0; aDataIndex < aNumData; aDataIndex++) { + Engines::DataContainer_var aData = aList[aDataIndex]; + // store this in the configuration + SimanIO_Activity& aStoreActivity = aToStore.GetOrCreateActivity(actIter.ActivityId()); + aStoreActivity.SetName(actIter.Activity().Name()); + aStoreActivity.SetModule(actIter.Activity().Module()); + SimanIO_Document& aStoreDoc = aStoreActivity.GetOrCreateDocument(aDocId); + aStoreDoc.SetName(aDoc.Name()); + // prepare a file to store + SimanIO_File aStoreFile; + + stringstream aNumStore; + aNumStore<<"file"<<(++aFileIndex); + string aFileName(aNumStore.str()); + string anExtension(aData->extension()); + aFileName += "." + anExtension; + string aFullPath = aTmpDir + aFileName; + Engines::TMPFile* aFileStream = aData->get(); + const char *aBuffer = (const char*)aFileStream->NP_data(); +#ifdef WIN32 + std::ofstream aFile(aFullPath.c_str(), std::ios::binary); +#else + std::ofstream aFile(aFullPath.c_str()); +#endif + aFile.write(aBuffer, aFileStream->length()); + aFile.close(); + aTemporaryFileNames.push_back(aFileName); + + aStoreFile.url = aFullPath; + if (_filesId[aDocId].find(aData->identifier()) != _filesId[aDocId].end()) { // file is already exists + aStoreFile.id = _filesId[aDocId][aData->identifier()]; + aStoreFile.result = aDoc.File(aStoreFile.id).result; + } else { + aStoreFile.id = -1; // to be created as new + aStoreFile.result = true; // new is always result + } + + aStoreDoc.AddFile(aStoreFile); + } + } + } + aLink.StoreConf(aToStore); + // after files have been stored, remove them from the temporary directory + SALOMEDS::ListOfFileNames aTmpFiles; + aTmpFiles.length(aTemporaryFileNames.size()); + list::iterator aFilesIter = aTemporaryFileNames.begin(); + for(int a = 0; aFilesIter != aTemporaryFileNames.end(); aFilesIter++, a++) + aTmpFiles[a] = aFilesIter->c_str(); + SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir, aTmpFiles, true); + } else { + MESSAGE("There is no connection to SIMAN!") + } +#endif +} + +//============================================================================ +/*! Function : getReferencedStudy + * Purpose : + */ +//============================================================================ +SALOMEDSImpl_Study* SALOMEDSImpl_SimanStudy::getReferencedStudy() +{ + return _study; +} + +//============================================================================ +/*! Function : StudyId + * Purpose : + */ +//============================================================================ +std::string SALOMEDSImpl_SimanStudy::StudyId() +{ + return _studyId; +} + +//============================================================================ +/*! Function : StudyId + * Purpose : + */ +//============================================================================ +void SALOMEDSImpl_SimanStudy::StudyId(const std::string theId) +{ + _studyId = theId; +} + +//============================================================================ +/*! Function : ScenarioId + * Purpose : + */ +//============================================================================ +std::string SALOMEDSImpl_SimanStudy::ScenarioId() +{ + return _scenarioId; +} + +//============================================================================ +/*! Function : ScenarioId + * Purpose : + */ +//============================================================================ +void SALOMEDSImpl_SimanStudy::ScenarioId(const std::string theId) +{ + _scenarioId = theId; +} + +//============================================================================ +/*! Function : UserId + * Purpose : + */ +//============================================================================ +std::string SALOMEDSImpl_SimanStudy::UserId() +{ + return _userId; +} + +//============================================================================ +/*! Function : UserId + * Purpose : + */ +//============================================================================ +void SALOMEDSImpl_SimanStudy::UserId(const std::string theId) +{ + _userId = theId; +} diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_SimanStudy.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_SimanStudy.hxx new file mode 100644 index 000000000..27959f6c9 --- /dev/null +++ b/src/SALOMEDSImpl/SALOMEDSImpl_SimanStudy.hxx @@ -0,0 +1,69 @@ +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// File : SALOMEDSImpl_SimanStudy.hxx +// Author : Mikhail PONIKAROV +// Module : SALOME +// +#ifndef __SALOMEDSIMPL_SIMANSTUDY_I_H__ +#define __SALOMEDSIMPL_SIMANSTUDY_I_H__ + +// std C++ headers +#include +#include + +//SALOMEDSImpl headers +#include "SALOMEDSImpl_Defines.hxx" +#include "SALOMEDSImpl_Study.hxx" + +class SimanIO_Configuration; + +class SALOMEDSIMPL_EXPORT SALOMEDSImpl_SimanStudy +{ +private: + SALOMEDSImpl_Study* _study; // referenced study + std::string _studyId; // SIMAN ID + std::string _scenarioId; // SIMAN ID + std::string _userId; // SIMAN ID + + SimanIO_Configuration* _checkedOut; // pointer to information about checked out data + std::map > _filesId; // map from document id to component identifiers to SIMAN file ID + +public: + + virtual void CheckOut(SALOMEDSImpl_Study* theTarget); + virtual void CheckIn(const std::string theModuleName); + virtual SALOMEDSImpl_Study* getReferencedStudy(); + virtual std::string StudyId(); + virtual void StudyId(const std::string theId); + virtual std::string ScenarioId(); + virtual void ScenarioId(const std::string theId); + virtual std::string UserId(); + virtual void UserId(const std::string theId); + + //! standard constructor + SALOMEDSImpl_SimanStudy(); + + //! standard destructor + virtual ~SALOMEDSImpl_SimanStudy(); +}; +#endif diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_StudyManager.cxx b/src/SALOMEDSImpl/SALOMEDSImpl_StudyManager.cxx index d52b629eb..b4928a2bb 100644 --- a/src/SALOMEDSImpl/SALOMEDSImpl_StudyManager.cxx +++ b/src/SALOMEDSImpl/SALOMEDSImpl_StudyManager.cxx @@ -40,6 +40,8 @@ #include "SALOMEDSImpl_SComponent.hxx" #include "SALOMEDSImpl_GenericAttribute.hxx" #include "SALOMEDSImpl_ScalarVariable.hxx" +#include "SALOMEDSImpl_SimanStudy.hxx" + #include #include "HDFOI.hxx" @@ -67,6 +69,7 @@ SALOMEDSImpl_StudyManager::SALOMEDSImpl_StudyManager() _appli = new DF_Application(); _IDcounter = 0; _clipboard = _appli->NewDocument("SALOME_STUDY"); + _siman = 0; } //============================================================================ @@ -79,6 +82,7 @@ SALOMEDSImpl_StudyManager::~SALOMEDSImpl_StudyManager() _appli->Close(_clipboard); // Destroy application delete _appli; + if (_siman) delete _siman; } @@ -1477,3 +1481,15 @@ void ReadNoteBookVariables(SALOMEDSImpl_Study* theStudy, HDFgroup* theGroup) theGroup->CloseOnDisk(); } + +//============================================================================ +/*! Function : GetSimanStudy + * Purpose : Retruns the created or cashed SimanStudy + */ +//==================================================T========================== +SALOMEDSImpl_SimanStudy* SALOMEDSImpl_StudyManager::GetSimanStudy() +{ + if (_siman == 0) + _siman = new SALOMEDSImpl_SimanStudy(); + return _siman; +} diff --git a/src/SALOMEDSImpl/SALOMEDSImpl_StudyManager.hxx b/src/SALOMEDSImpl/SALOMEDSImpl_StudyManager.hxx index f65863d88..c3d48aa66 100644 --- a/src/SALOMEDSImpl/SALOMEDSImpl_StudyManager.hxx +++ b/src/SALOMEDSImpl/SALOMEDSImpl_StudyManager.hxx @@ -43,6 +43,7 @@ #include "DF_Document.hxx" class HDFgroup; +class SALOMEDSImpl_SimanStudy; class SALOMEDSIMPL_EXPORT SALOMEDSImpl_StudyManager { @@ -53,6 +54,7 @@ private: int _IDcounter; DF_Document* _clipboard; std::string _errorCode; + SALOMEDSImpl_SimanStudy* _siman; public: @@ -139,6 +141,9 @@ public: std::string GetErrorCode() { return _errorCode; } virtual bool IsError() { return _errorCode != ""; } + //! Retruns the created or cashed SimanStudy + virtual SALOMEDSImpl_SimanStudy* GetSimanStudy(); + }; #endif