Salome HOME
Join modifications from branch OCC_development_for_3_2_0a2
[modules/visu.git] / src / VISU_I / VISU_Gen_i.cc
index 33527f6d89565c7a906701ac0af271cd427c040d..c5a950cc427b8c7462ddfb5d9f007d1ba927e70d 100644 (file)
@@ -1,23 +1,23 @@
 //  VISU OBJECT : interactive object for VISU entities implementation
 //
 //  Copyright (C) 2003  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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+//  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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
 //
 //
 //  File   : VISU_Gen_i.cc
 #include "VISU_CutLines_i.hh"
 #include "VISU_Vectors_i.hh"
 #include "VISU_StreamLines_i.hh"
+#include "VISU_GaussPoints_i.hh"
+#include "VISU_Plot3D_i.hh"
 #include "VISU_Table_i.hh"
 #include "VISU_TimeAnimation.h"
+#include "VISU_ScalarMapOnDeformedShape_i.hh"
+
+#include "VISU_Actor.h"
 
 #include "HDFascii.hxx"
 #include "SALOMEDS_Tool.hxx"
 
-#include "utilities.h"
+#include "SALOMEDSClient_AttributeName.hxx"
+#include "SALOMEDSClient_AttributePixMap.hxx"
 
-#include <strstream>   
-#include <TCollection_AsciiString.hxx>
-#include <TColStd_SequenceOfAsciiString.hxx>
+#include "SUIT_Session.h"
+#include "SalomeApp_Study.h"
+#include "SalomeApp_Application.h"
+#include "LightApp_SelectionMgr.h"
+#include "SVTK_ViewModel.h"
+#include "SVTK_ViewWindow.h"
+#include "SALOME_Event.hxx"
+#include "SALOME_ListIO.hxx"
+#include "SALOME_ListIteratorOfListIO.hxx"
 
-#include <omnithread.h>        
+#include "utilities.h"
+
+// IDL Headers
+#include <omnithread.h>
 #include CORBA_SERVER_HEADER(SALOME_Session)
 #include CORBA_SERVER_HEADER(SALOME_ModuleCatalog)
 
+// QT Includes
 #include <qstring.h>
 #include <qfileinfo.h>
+
+// VTK Includes
+#include <vtkRenderer.h>
+#include <vtkActorCollection.h>
+
+// OCCT Includes
+#include <TCollection_AsciiString.hxx>
+#include <TColStd_SequenceOfAsciiString.hxx>
+
+// STL Includes
+#include <strstream>
+
 #include "Utils_ExceptHandlers.hxx"
+#include "CASCatch.hxx"
 
 using namespace std;
 
 static QFileInfo aFileInfo;
 
 #ifdef _DEBUG_
-static int MYDEBUG = 1;
+static int MYDEBUG = 0;
+//#define _DEXCEPT_
 #else
 static int MYDEBUG = 0;
 #endif
 
 UNEXPECT_CATCH(SalomeException, SALOME::SALOME_Exception);
 
-extern "C" VISU::VISU_Gen_ptr GetImpl(CORBA::ORB_ptr theORB, 
-                                     PortableServer::POA_ptr thePOA, 
-                                     SALOME_NamingService* theNamingService, 
+extern "C" VISU::VISU_Gen_ptr GetImpl(CORBA::ORB_ptr theORB,
+                                     PortableServer::POA_ptr thePOA,
+                                     SALOME_NamingService* theNamingService,
                                      QMutex* theMutex)
 {
   if(MYDEBUG) MESSAGE("extern \"C\" GetImpl");
@@ -81,13 +111,49 @@ extern "C" VISU::VISU_Gen_ptr GetImpl(CORBA::ORB_ptr theORB,
   return aVISU_Gen->_this();
 }
 
-namespace VISU{
+namespace VISU
+{
   static string VisuTmpDir;
 
   static CORBA::Boolean myIsMultiFile;
   const CORBA::Boolean IsMultifile() { return myIsMultiFile;}
 
   //===========================================================================
+  _PTR(SComponent) ClientFindOrCreateVisuComponent (_PTR(Study) theStudyDocument)
+  {
+    _PTR(SComponent) aSComponent = theStudyDocument->FindComponent("VISU");
+    if (!aSComponent) {
+      _PTR(StudyBuilder) aStudyBuilder = theStudyDocument->NewBuilder();
+      aStudyBuilder->NewCommand();
+      int aLocked = theStudyDocument->GetProperties()->IsLocked();
+      if (aLocked) theStudyDocument->GetProperties()->SetLocked(false);
+      aSComponent = aStudyBuilder->NewComponent("VISU");
+      _PTR(GenericAttribute) anAttr =
+       aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributeName");
+      _PTR(AttributeName) aName (anAttr);
+
+      CORBA::ORB_var anORB = Base_i::GetORB();
+      SALOME_NamingService *NamingService = new SALOME_NamingService( anORB );
+      CORBA::Object_var objVarN = NamingService->Resolve("/Kernel/ModulCatalog");
+      SALOME_ModuleCatalog::ModuleCatalog_var Catalogue =
+       SALOME_ModuleCatalog::ModuleCatalog::_narrow(objVarN);
+      SALOME_ModuleCatalog::Acomponent_var Comp = Catalogue->GetComponent( "VISU" );
+      if (!Comp->_is_nil()) {
+       aName->SetValue(Comp->componentusername());
+      }
+
+      anAttr = aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributePixMap");
+      _PTR(AttributePixMap) aPixmap (anAttr);
+      aPixmap->SetPixMap( "ICON_OBJBROWSER_Visu" );
+
+      VISU_Gen_var aVisuGen = Base_i::GetVisuGenImpl()->_this();
+      aStudyBuilder->DefineComponentInstance(aSComponent, aVisuGen->GetID());
+      if (aLocked) theStudyDocument->GetProperties()->SetLocked(true);
+      aStudyBuilder->CommitCommand();
+    }
+    return aSComponent;
+  }
+
   SALOMEDS::SComponent_var FindOrCreateVisuComponent(SALOMEDS::Study_ptr theStudyDocument){
     SALOMEDS::SComponent_var aSComponent = theStudyDocument->FindComponent("VISU");
     if (aSComponent->_is_nil()) {
@@ -95,7 +161,7 @@ namespace VISU{
       aStudyBuilder->NewCommand();
       int aLocked = theStudyDocument->GetProperties()->IsLocked();
       if (aLocked) theStudyDocument->GetProperties()->SetLocked(false);
-      aSComponent = aStudyBuilder->NewComponent("VISU"); 
+      aSComponent = aStudyBuilder->NewComponent("VISU");
       SALOMEDS::GenericAttribute_var anAttr = aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributeName");
       SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(anAttr);
 
@@ -112,33 +178,36 @@ namespace VISU{
       anAttr = aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributePixMap");
       SALOMEDS::AttributePixMap_var aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
       aPixmap->SetPixMap( "ICON_OBJBROWSER_Visu" );
-      
+
       VISU_Gen_var aVisuGen = Base_i::GetVisuGenImpl()->_this();
       aStudyBuilder->DefineComponentInstance(aSComponent,aVisuGen);
       if (aLocked) theStudyDocument->GetProperties()->SetLocked(true);
       aStudyBuilder->CommitCommand();
     }
     return aSComponent;
-  }    
+  }
 
   void RegistryStorable() {
     Storable::Registry(Result_i::myComment.c_str(),&(Result_i::Restore));
     Storable::Registry(Mesh_i::myComment.c_str(),&(Restore<Mesh_i>));
     Storable::Registry(ScalarMap_i::myComment.c_str(),&(Restore<ScalarMap_i>));
+    Storable::Registry(GaussPoints_i::myComment.c_str(),&(Restore<GaussPoints_i>));
     Storable::Registry(DeformedShape_i::myComment.c_str(),&(Restore<DeformedShape_i>));
     Storable::Registry(CutPlanes_i::myComment.c_str(),&(Restore<CutPlanes_i>));
     Storable::Registry(CutLines_i::myComment.c_str(),&(Restore<CutLines_i>));
     Storable::Registry(IsoSurfaces_i::myComment.c_str(),&(Restore<IsoSurfaces_i>));
     Storable::Registry(StreamLines_i::myComment.c_str(),&(Restore<StreamLines_i>));
+    Storable::Registry(Plot3D_i::myComment.c_str(),&(Restore<Plot3D_i>));
     Storable::Registry(Vectors_i::myComment.c_str(),&(Restore<Vectors_i>));
     Storable::Registry(Table_i::myComment.c_str(),&(Table_i::Restore));
     Storable::Registry(Curve_i::myComment.c_str(),&(Curve_i::Restore));
     Storable::Registry(Container_i::myComment.c_str(),&(Container_i::Restore));
+    Storable::Registry(ScalarMapOnDeformedShape_i::myComment.c_str(),&(Restore<ScalarMapOnDeformedShape_i>));
   }
 
 
   //===========================================================================
-  VISU_Gen_i::VISU_Gen_i(CORBA::ORB_ptr theORB, PortableServer::POA_ptr thePOA, 
+  VISU_Gen_i::VISU_Gen_i(CORBA::ORB_ptr theORB, PortableServer::POA_ptr thePOA,
                         SALOME_NamingService* theNamingService, QMutex* theMutex) :
     Engines_Component_i()
   {
@@ -163,6 +232,33 @@ namespace VISU{
       if(MYDEBUG) MESSAGE("VISU_Gen_i::VISU_Gen_i : there is no opened study in StudyManager !!!");
   }
 
+  bool
+  CreatColoredPrs3d(ColoredPrs3d_i* theColoredPrs3d,
+                   const char* theMeshName, 
+                   VISU::Entity theEntity,
+                   const char* theFieldName, 
+                   CORBA::Double theIteration)
+  {
+    CASCatch_TRY{       
+#ifndef _DEXCEPT_
+      try{
+#endif
+       if(theColoredPrs3d->Create(theMeshName,theEntity,theFieldName,int(theIteration)))
+         return true;
+#ifndef _DEXCEPT_
+      }catch(std::exception& exc){
+       INFOS("Follow exception was occured :\n"<<exc.what());
+      }catch(...){
+       INFOS("Unknown exception was occured!");
+      }
+#endif
+    }CASCatch_CATCH(Standard_Failure) {
+      Handle(Standard_Failure) aFail = Standard_Failure::Caught();
+      INFOS("Follow signal was occured :\n"<<aFail->GetMessageString());
+    }
+    return false;
+  }
+
   VISU_Gen_i::~VISU_Gen_i(){
     if(MYDEBUG) MESSAGE("VISU_Gen_i::~VISU_Gen_i");
   }
@@ -173,10 +269,10 @@ namespace VISU{
                                  bool isMultiFile)
   {
     Mutex mt(myMutex);
-    SALOMEDS::Study_var aStudy = theComponent->GetStudy(); 
-    SALOMEDS::StudyBuilder_var  aStudyBuilder = aStudy->NewBuilder(); 
-    TCollection_AsciiString aTmpDir =
-      isMultiFile?TCollection_AsciiString((char*)theURL):SALOMEDS_Tool::GetTmpDir();
+    SALOMEDS::Study_var aStudy = theComponent->GetStudy();
+    SALOMEDS::StudyBuilder_var  aStudyBuilder = aStudy->NewBuilder();
+    string aDir = isMultiFile ? theURL : SALOMEDS_Tool::GetTmpDir();
+    TCollection_AsciiString aTmpDir (const_cast<char*>(aDir.c_str()));
     VisuTmpDir = aTmpDir.ToCString();
     SALOMEDS::ListOfFileNames_var aSeq =
       SALOMEDS_Tool::PutStreamToFiles(theStream, aTmpDir.ToCString(),isMultiFile);
@@ -187,7 +283,7 @@ namespace VISU{
   CORBA::Boolean VISU_Gen_i::LoadASCII(SALOMEDS::SComponent_ptr theComponent,
                                       const SALOMEDS::TMPFile & theStream,
                                       const char* theURL,
-                                      bool isMultiFile) 
+                                      bool isMultiFile)
   {
     return Load(theComponent, theStream, theURL, isMultiFile);
   }
@@ -195,7 +291,7 @@ namespace VISU{
   char* VISU_Gen_i::LocalPersistentIDToIOR(SALOMEDS::SObject_ptr theSObject,
                                           const char* aLocalPersistentID,
                                           CORBA::Boolean isMultiFile,
-                                          CORBA::Boolean isASCII) 
+                                          CORBA::Boolean isASCII)
   {
     CORBA::String_var aString("");
     if(strcmp(aLocalPersistentID,"") != 0) {
@@ -209,94 +305,112 @@ namespace VISU{
   //===========================================================================
   SALOMEDS::TMPFile* VISU_Gen_i::Save(SALOMEDS::SComponent_ptr theComponent,
                                      const char* theURL,
-                                     bool isMultiFile)
+                                     bool theIsMultiFile)
   {
     Mutex mt(myMutex);
-    TCollection_AsciiString aTmpDir = isMultiFile? strdup(theURL): SALOMEDS_Tool::GetTmpDir();
+    string aTmpDir = theURL;
     if(MYDEBUG) MESSAGE("VISU_Gen_i::Save - "<<aTmpDir);
-    int aCounter = 0;
-    TColStd_SequenceOfAsciiString aFileNames;
-    SALOMEDS::Study_var aStudy = theComponent->GetStudy(); 
-    SALOMEDS::ChildIterator_var itBig = aStudy->NewChildIterator(theComponent);
-    for (; itBig->More(); itBig->Next()) {
-      SALOMEDS::SObject_var gotBranch = itBig->Value();
+    
+    typedef std::vector<std::string> TFileNames;
+    TFileNames aFileNames;
+    TFileNames aFiles;
+
+    SALOMEDS::Study_var aStudy = theComponent->GetStudy();
+    SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator(theComponent);
+    for (; anIter->More(); anIter->Next()) {
+      SALOMEDS::SObject_var gotBranch = anIter->Value();
       CORBA::Object_var anObj = SObjectToObject(gotBranch);
       if(CORBA::is_nil(anObj)) continue;
-      if(Result_i* pResult = dynamic_cast<Result_i*>(GetServant(anObj).in())){
-       const Result_i::TSourceId& aSourceId = pResult->GetSourceId();
-       if(aSourceId == Result_i::eFile || aSourceId == Result_i::eRestoredFile){
-         const QFileInfo& aFileInfo = pResult->GetFileInfo();
-         QString aPrefix("");
-         if (isMultiFile) aPrefix = SALOMEDS_Tool::GetNameFromPath(aStudy->URL());
-         QString aFileName = aPrefix + "_" + (pResult->GetName()).c_str();
-         static QString aCommand;
-         aCommand.sprintf("cp %s %s%s",aFileInfo.filePath().latin1(),aTmpDir.ToCString(),aFileName.latin1());
+      if(Result_i* aResult = dynamic_cast<Result_i*>(GetServant(anObj).in())){
+       switch(aResult->GetCreationId()){
+       case Result_i::eImportFile:
+       case Result_i::eCopyAndImportFile: {
+         const QFileInfo& aFileInfo = aResult->GetFileInfo();
+         const std::string& aName = aResult->GetName();
+         std::string aFileName = std::string("_") + aName;
+         std::string aFile = aFileInfo.filePath().latin1();
+         if(theIsMultiFile){
+           aFileName = SALOMEDS_Tool::GetNameFromPath(aStudy->URL()) + aFileName;
+
+           std::ostringstream aStream;
+           aStream<<"cp "<<aFile<<" "<<aTmpDir<<aFileName;
+           std::string aCommand = aStream.str();
+           if(system(aCommand.c_str()) != 0){
+             INFOS("VISU_Gen_i::Save - Cann't execute the command :"<<aCommand);
+             continue;
+           }
+         }
+         aFileNames.push_back(aFileName);
+         aFiles.push_back(aFile);
+       }}
+      }
+    }
 
-         int aRes = system(aCommand);
-         if(aRes){
-           if(MYDEBUG) MESSAGE("VISU_Gen_i::Save - Cann't execute the command :"<<aCommand);
-           continue;
-         }else
-           if(MYDEBUG) MESSAGE("VISU_Gen_i::Save - aCommand = "<<aCommand);
+    if(MYDEBUG) MESSAGE("VISU_Gen_i::Save - aFileNames.size() - "<<aFileNames.size());
 
-         TCollection_AsciiString aString(strdup(aFileName.latin1()));
-         aFileNames.Append(aString);
-       }
-      }
+    SALOMEDS::ListOfFileNames_var aListOfFileNames = new SALOMEDS::ListOfFileNames;
+    if(!aFileNames.empty()){
+      aListOfFileNames->length(aFileNames.size());
+      for(int aCounter = aFileNames.size(); aCounter > 0; aCounter--)
+       aListOfFileNames[aCounter-1] = aFileNames[aCounter-1].c_str();
     }
-    SALOMEDS::TMPFile_var aStreamFile = new SALOMEDS::TMPFile(0);
-    if(MYDEBUG) MESSAGE("VISU_Gen_i::Save - aFileNames.Length() - "<<aFileNames.Length());
-    if(aFileNames.Length() > 0){
-      SALOMEDS::ListOfFileNames_var aSeq = new SALOMEDS::ListOfFileNames;
-      aSeq->length(aFileNames.Length());
-      for(aCounter = aFileNames.Length(); aCounter > 0; aCounter--)
-       aSeq[aCounter-1] = CORBA::string_dup(aFileNames.Value(aCounter).ToCString());
-      aStreamFile = SALOMEDS_Tool::PutFilesToStream(aTmpDir.ToCString(), aSeq.in(), isMultiFile);
-      if(!isMultiFile)
-       SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir.ToCString(), aSeq.in(), true);
+
+    SALOMEDS::ListOfFileNames_var aListOfFiles = new SALOMEDS::ListOfFileNames;
+    aListOfFiles->length(aFiles.size());
+    if(!aFiles.empty()){
+      for(int aCounter = aFileNames.size(); aCounter > 0; aCounter--)
+       aListOfFiles[aCounter-1] = aFiles[aCounter-1].c_str();
     }
+
+    SALOMEDS::TMPFile_var aStreamFile = new SALOMEDS::TMPFile(0);
+    if(theIsMultiFile)
+      aStreamFile = SALOMEDS_Tool::PutFilesToStream(aTmpDir, aListOfFiles.in(), theIsMultiFile);
+    else
+      aStreamFile = SALOMEDS_Tool::PutFilesToStream(aListOfFiles.in(), aListOfFileNames.in());
+
     return aStreamFile._retn();
   }
 
   SALOMEDS::TMPFile* VISU_Gen_i::SaveASCII(SALOMEDS::SComponent_ptr theComponent,
                                           const char* theURL,
-                                          bool isMultiFile) 
+                                          bool isMultiFile)
   {
     Mutex mt(myMutex);
-    CORBA::String_var aString = SALOMEDS_Tool::GetTmpDir();
-    TCollection_AsciiString aTmpDir = isMultiFile? (const Standard_CString)theURL: (const Standard_CString)aString.in();
+    string aDir = isMultiFile ? theURL : SALOMEDS_Tool::GetTmpDir();
+    TCollection_AsciiString aTmpDir (const_cast<char*>(aDir.c_str()));
     if(MYDEBUG) MESSAGE("VISU_Gen_i::Save - "<<aTmpDir);
     int aCounter = 0;
     TColStd_SequenceOfAsciiString aFileNames;
-    SALOMEDS::Study_var aStudy = theComponent->GetStudy(); 
+    SALOMEDS::Study_var aStudy = theComponent->GetStudy();
     SALOMEDS::ChildIterator_var itBig = aStudy->NewChildIterator(theComponent);
     for (; itBig->More(); itBig->Next()) {
       SALOMEDS::SObject_var gotBranch = itBig->Value();
       CORBA::Object_var anObj = SObjectToObject(gotBranch);
       if(CORBA::is_nil(anObj)) continue;
       if(Result_i* pResult = dynamic_cast<Result_i*>(GetServant(anObj).in())){
-       const Result_i::TSourceId& aSourceId = pResult->GetSourceId();
-       if(aSourceId == Result_i::eFile || aSourceId == Result_i::eRestoredFile){
+       switch(pResult->GetCreationId()){
+       case Result_i::eImportFile:
+       case Result_i::eCopyAndImportFile: {
          const QFileInfo& aFileInfo = pResult->GetFileInfo();
          QString aPrefix("");
-         if (isMultiFile) aPrefix = SALOMEDS_Tool::GetNameFromPath(aStudy->URL());
+         if (isMultiFile) aPrefix = SALOMEDS_Tool::GetNameFromPath(aStudy->URL()).c_str();
          QString aFileName = aPrefix + "_" + (pResult->GetName()).c_str();
          static QString aCommand;
          aCommand.sprintf("cp %s %s%s",aFileInfo.filePath().latin1(),aTmpDir.ToCString(),aFileName.latin1());
 
          int aRes = system(aCommand);
-         if(aRes){       
+         if(aRes){
            if(MYDEBUG) MESSAGE("VISU_Gen_i::Save - Can't execute the command :"<<aCommand);
            continue;
          }else
            if(MYDEBUG) MESSAGE("VISU_Gen_i::Save - "<<aCommand);
 
          TCollection_AsciiString aString(strdup(aFileName.latin1()));
-         
+
          HDFascii::ConvertFromHDFToASCII(strdup((aTmpDir + aString).ToCString()), true);
-         
+
          aFileNames.Append(aString);
-       }
+       }}
       }
     }
     SALOMEDS::TMPFile_var aStreamFile = new SALOMEDS::TMPFile(0);
@@ -316,10 +430,10 @@ namespace VISU{
   char* VISU_Gen_i::IORToLocalPersistentID(SALOMEDS::SObject_ptr theSObject,
                                           const char* IORString,
                                           CORBA::Boolean isMultiFile,
-                                          CORBA::Boolean isASCII) 
+                                          CORBA::Boolean isASCII)
   {
     CORBA::String_var aString(IORString);
-    if(strcmp(IORString,"") != 0){ 
+    if(strcmp(IORString,"") != 0){
       CORBA::ORB_ptr anORB = GetORB();
       CORBA::Object_var anObj = anORB->string_to_object(aString);
       if(!CORBA::is_nil(anObj)){
@@ -337,13 +451,54 @@ namespace VISU{
     return Base_i::GetID();
   }
 
-  void VISU_Gen_i::SetCurrentStudy(SALOMEDS::Study_ptr theStudy){
-    if(!CORBA::is_nil(theStudy)){
+  void VISU_Gen_i::SetCurrentStudy (SALOMEDS::Study_ptr theStudy)
+  {
+    class TEvent: public SALOME_Event {
+      std::string myStudyName;
+    public:
+      TEvent(const std::string theStudyName):myStudyName(theStudyName)
+       {}
+      virtual void Execute()
+       {
+         bool isActive = false;
+         SUIT_Session* aSession = SUIT_Session::session();
+         QPtrList<SUIT_Application> anApplications = aSession->applications();
+         QPtrListIterator<SUIT_Application> anIter (anApplications);
+         SUIT_Application* aFirstApp = anIter.current();
+         while (SUIT_Application* anApp = anIter.current()) {
+           ++anIter;
+           if (SUIT_Study* aSStudy = anApp->activeStudy()) {
+             if (SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>(aSStudy)) {
+                if (_PTR(Study) aCStudy = aStudy->studyDS()) {
+                 if(MYDEBUG) MESSAGE("There is an application with active study : StudyId = "
+                                     << aCStudy->StudyId() << "; Name = '" << aCStudy->Name() << "'");
+                 if (myStudyName == aCStudy->Name()) {
+                   isActive = true;
+                   break;
+                 }
+               }
+             }
+           }
+         }
+         if (!isActive) {
+           MESSAGE("!!! anApp->onLoadDoc(myStudyName) !!!");
+           // Has to be loaded in an empty or in a new application
+           SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>(aFirstApp);
+           anApp->onLoadDoc(myStudyName.c_str());
+         }
+       }
+    };
+
+    if (!CORBA::is_nil(theStudy))
+    {
       CORBA::String_var aName = theStudy->Name();
-      MESSAGE("VISU_Gen_i::SetCurrentStudy - StudyId = "<<theStudy->StudyId()<<"; Name = '"<<aName.in()<<"'");
+      std::string aStudyName (aName.in());
+      if(MYDEBUG) MESSAGE("StudyId = " << theStudy->StudyId() << "; Name = '" << aName.in() << "'");
       myStudyDocument = SALOMEDS::Study::_duplicate(theStudy);
-    }else{
-      MESSAGE("VISU_Gen_i::SetCurrentStudy : CORBA::is_nil(theStudy)");
+
+      ProcessVoidEvent(new TEvent(aStudyName));
+    } else {
+      INFOS("CORBA::is_nil(theStudy)");
     }
   }
 
@@ -358,7 +513,7 @@ namespace VISU{
   }
 
   SALOMEDS::SObject_ptr VISU_Gen_i::ImportTables(const char* theFileName){
-    if(myStudyDocument->GetProperties()->IsLocked()) 
+    if(myStudyDocument->GetProperties()->IsLocked())
       return SALOMEDS::SObject::_nil();
     Mutex mt(myMutex);
     SALOMEDS::SObject_var aRes = VISU::ImportTables(theFileName,myStudyDocument);
@@ -372,12 +527,31 @@ namespace VISU{
   }
 
   Result_ptr VISU_Gen_i::ImportFile(const char* theFileName){
-    if(myStudyDocument->GetProperties()->IsLocked()) 
+    if(myStudyDocument->GetProperties()->IsLocked())
       return Result::_nil();
     Mutex mt(myMutex);
     aFileInfo.setFile(theFileName);
-    Result_i* pResult = new Result_i(myStudyDocument);
-    if(pResult->Create(theFileName) != NULL)   
+    Result_i* pResult = new Result_i(myStudyDocument,
+                                    Result_i::eFile,
+                                    Result_i::eImportFile);
+    if(pResult->Create(theFileName) != NULL)
+      return pResult->_this();
+    else{
+      pResult->_remove_ref();
+      return VISU::Result::_nil();
+    }
+  }
+
+  Result_ptr VISU_Gen_i::CreateResult(const char* theFileName){
+    if(myStudyDocument->GetProperties()->IsLocked())
+      return Result::_nil();
+    Mutex mt(myMutex);
+    aFileInfo.setFile(theFileName);
+    Result_i* pResult = new Result_i(myStudyDocument,
+                                    Result_i::eFile,
+                                    Result_i::eImportFile,
+                                    false);
+    if(pResult->Create(theFileName) != NULL)
       return pResult->_this();
     else{
       pResult->_remove_ref();
@@ -386,48 +560,56 @@ namespace VISU{
   }
 
   Result_ptr VISU_Gen_i::CopyAndImportFile(const char* theFileName){
-    if(myStudyDocument->GetProperties()->IsLocked()) 
+    if(myStudyDocument->GetProperties()->IsLocked())
       return Result::_nil();
     Mutex mt(myMutex);
     VISU::Result_var aResult;
     aFileInfo.setFile(theFileName);
-    Result_i* pResult = new Result_i(myStudyDocument,Result_i::eRestoredFile);
-    if(pResult->Create(theFileName) != NULL) 
+    Result_i* pResult = new Result_i(myStudyDocument,
+                                    Result_i::eRestoredFile,
+                                    Result_i::eCopyAndImportFile);
+    if(pResult->Create(theFileName) != NULL)
       aResult = pResult->_this();
     return aResult._retn();
   }
 
-  Result_ptr VISU_Gen_i::ImportMed(SALOMEDS::SObject_ptr theMedSObject){
-    if(myStudyDocument->GetProperties()->IsLocked()) 
+  Result_ptr VISU_Gen_i::ImportMed (SALOMEDS::SObject_ptr theMedSObject)
+  {
+    if (myStudyDocument->GetProperties()->IsLocked())
       return Result::_nil();
     Mutex mt(myMutex);
-    Result_i* pResult = new Result_i(myStudyDocument);
-    if(pResult->Create(theMedSObject) != NULL)
+    Result_i* pResult = new Result_i(myStudyDocument,
+                                    Result_i::eComponent,
+                                    Result_i::eImportMed);
+    if (pResult->Create(theMedSObject) != NULL) {
       return pResult->_this();
-    else{
+    } else {
       pResult->_remove_ref();
       return VISU::Result::_nil();
     }
   }
 
-  Result_ptr VISU_Gen_i::ImportMedField(SALOME_MED::FIELD_ptr theField){
-    if(myStudyDocument->GetProperties()->IsLocked()) 
+  Result_ptr VISU_Gen_i::ImportMedField (SALOME_MED::FIELD_ptr theField)
+  {
+    if (myStudyDocument->GetProperties()->IsLocked())
       return Result::_nil();
     Mutex mt(myMutex);
-    Result_i* pResult = new Result_i(myStudyDocument);
-    if(pResult->Create(theField) != NULL)
+    Result_i* pResult = new Result_i(myStudyDocument,
+                                    Result_i::eComponent,
+                                    Result_i::eImportMedField);
+    if (pResult->Create(theField) != NULL) {
       return pResult->_this();
-    else{
+    } else {
       pResult->_remove_ref();
       return VISU::Result::_nil();
     }
   }
 
-  Mesh_ptr VISU_Gen_i::MeshOnEntity(Result_ptr theResult, 
-                                   const char* theMeshName, 
+  Mesh_ptr VISU_Gen_i::MeshOnEntity(Result_ptr theResult,
+                                   const char* theMeshName,
                                    VISU::Entity theEntity)
   {
-    if(myStudyDocument->GetProperties()->IsLocked()) 
+    if(myStudyDocument->GetProperties()->IsLocked())
       return Mesh::_nil();
     Mutex mt(myMutex);
     if(Result_i* pResult = dynamic_cast<Result_i*>(GetServant(theResult).in())){
@@ -436,17 +618,17 @@ namespace VISU{
        return aPresent->_this();
       else{
        aPresent->_remove_ref();
-       return VISU::Mesh::_nil();
       }
     }
+    return VISU::Mesh::_nil();
   }
 
-  Mesh_ptr VISU_Gen_i::FamilyMeshOnEntity(Result_ptr theResult, 
-                                         const char* theMeshName, 
-                                         VISU::Entity theEntity, 
+  Mesh_ptr VISU_Gen_i::FamilyMeshOnEntity(Result_ptr theResult,
+                                         const char* theMeshName,
+                                         VISU::Entity theEntity,
                                          const char* theFamilyName)
   {
-    if(myStudyDocument->GetProperties()->IsLocked()) 
+    if(myStudyDocument->GetProperties()->IsLocked())
       return Mesh::_nil();
     Mutex mt(myMutex);
     if(Result_i* pResult = dynamic_cast<Result_i*>(GetServant(theResult).in())){
@@ -455,16 +637,16 @@ namespace VISU{
        return aPresent->_this();
       else{
        aPresent->_remove_ref();
-       return VISU::Mesh::_nil();
       }
     }
+    return VISU::Mesh::_nil();
   }
 
-  Mesh_ptr VISU_Gen_i::GroupMesh(Result_ptr theResult, 
-                                const char* theMeshName, 
+  Mesh_ptr VISU_Gen_i::GroupMesh(Result_ptr theResult,
+                                const char* theMeshName,
                                 const char* theGroupName)
   {
-    if(myStudyDocument->GetProperties()->IsLocked()) 
+    if(myStudyDocument->GetProperties()->IsLocked())
       return Mesh::_nil();
     Mutex mt(myMutex);
     if(Result_i* pResult = dynamic_cast<Result_i*>(GetServant(theResult).in())){
@@ -473,76 +655,103 @@ namespace VISU{
        return aPresent->_this();
       else{
        aPresent->_remove_ref();
-       return VISU::Mesh::_nil();
       }
     }
+    return VISU::Mesh::_nil();
   }
 
-  ScalarMap_ptr VISU_Gen_i::ScalarMapOnField(Result_ptr theResult, 
-                                            const char* theMeshName, 
-                                            VISU::Entity theEntity, 
-                                            const char* theFieldName, 
+  ScalarMap_ptr VISU_Gen_i::ScalarMapOnField(Result_ptr theResult,
+                                            const char* theMeshName,
+                                            VISU::Entity theEntity,
+                                            const char* theFieldName,
                                             CORBA::Double theIteration)
   {
     return Prs3dOnField<VISU::ScalarMap_i>(theResult,theMeshName,theEntity,theFieldName,theIteration,true)._retn();
   }
 
-  DeformedShape_ptr VISU_Gen_i::DeformedShapeOnField(Result_ptr theResult, 
-                                                    const char* theMeshName, 
-                                                    VISU::Entity theEntity, 
-                                                    const char* theFieldName, 
+  GaussPoints_ptr VISU_Gen_i::GaussPointsOnField(Result_ptr theResult,
+                                                const char* theMeshName,
+                                                VISU::Entity theEntity,
+                                                const char* theFieldName,
+                                                CORBA::Double theIteration)
+  {
+    return Prs3dOnField<VISU::GaussPoints_i>(theResult,theMeshName,theEntity,theFieldName,theIteration,true)._retn();
+  }
+
+  DeformedShape_ptr VISU_Gen_i::DeformedShapeOnField(Result_ptr theResult,
+                                                    const char* theMeshName,
+                                                    VISU::Entity theEntity,
+                                                    const char* theFieldName,
                                                     CORBA::Double theIteration)
   {
     return Prs3dOnField<VISU::DeformedShape_i>(theResult,theMeshName,theEntity,theFieldName,theIteration)._retn();
   }
 
-  Vectors_ptr VISU_Gen_i::VectorsOnField(Result_ptr theResult, 
-                                        const char* theMeshName, 
-                                        VISU::Entity theEntity, 
-                                        const char* theFieldName, 
+  ScalarMapOnDeformedShape_ptr VISU_Gen_i::ScalarMapOnDeformedShapeOnField(Result_ptr theResult,
+                                                                          const char* theMeshName,
+                                                                          VISU::Entity theEntity,
+                                                                          const char* theFieldName,
+                                                                          CORBA::Double theIteration)
+  {
+    return Prs3dOnField<VISU::ScalarMapOnDeformedShape_i>(theResult,theMeshName,theEntity,theFieldName,theIteration)._retn();
+  }
+  
+  Vectors_ptr VISU_Gen_i::VectorsOnField(Result_ptr theResult,
+                                        const char* theMeshName,
+                                        VISU::Entity theEntity,
+                                        const char* theFieldName,
                                         CORBA::Double theIteration)
   {
     return Prs3dOnField<VISU::Vectors_i>(theResult,theMeshName,theEntity,theFieldName,theIteration)._retn();
   }
 
-  IsoSurfaces_ptr VISU_Gen_i::IsoSurfacesOnField(Result_ptr theResult, 
-                                                const char* theMeshName, 
-                                                VISU::Entity theEntity, 
-                                                const char* theFieldName, 
+  IsoSurfaces_ptr VISU_Gen_i::IsoSurfacesOnField(Result_ptr theResult,
+                                                const char* theMeshName,
+                                                VISU::Entity theEntity,
+                                                const char* theFieldName,
                                                 CORBA::Double theIteration)
   {
     return Prs3dOnField<VISU::IsoSurfaces_i>(theResult,theMeshName,theEntity,theFieldName,theIteration)._retn();
   }
 
-  StreamLines_ptr VISU_Gen_i::StreamLinesOnField(Result_ptr theResult, 
-                                                const char* theMeshName, 
-                                                VISU::Entity theEntity, 
-                                                const char* theFieldName, 
+  StreamLines_ptr VISU_Gen_i::StreamLinesOnField(Result_ptr theResult,
+                                                const char* theMeshName,
+                                                VISU::Entity theEntity,
+                                                const char* theFieldName,
                                                 CORBA::Double theIteration)
   {
     return Prs3dOnField<VISU::StreamLines_i>(theResult,theMeshName,theEntity,theFieldName,theIteration)._retn();
   }
 
-  CutPlanes_ptr VISU_Gen_i::CutPlanesOnField(Result_ptr theResult, 
-                                            const char* theMeshName, 
-                                            VISU::Entity theEntity, 
-                                            const char* theFieldName, 
+  Plot3D_ptr VISU_Gen_i::Plot3DOnField(Result_ptr theResult,
+                                      const char* theMeshName,
+                                      VISU::Entity theEntity,
+                                      const char* theFieldName,
+                                      CORBA::Double theIteration)
+  {
+    return Prs3dOnField<VISU::Plot3D_i>(theResult,theMeshName,theEntity,theFieldName,theIteration)._retn();
+  }
+
+  CutPlanes_ptr VISU_Gen_i::CutPlanesOnField(Result_ptr theResult,
+                                            const char* theMeshName,
+                                            VISU::Entity theEntity,
+                                            const char* theFieldName,
                                             CORBA::Double theIteration)
   {
     return Prs3dOnField<VISU::CutPlanes_i>(theResult,theMeshName,theEntity,theFieldName,theIteration)._retn();
   }
 
-  CutLines_ptr VISU_Gen_i::CutLinesOnField(Result_ptr theResult, 
-                                          const char* theMeshName, 
-                                          VISU::Entity theEntity, 
-                                          const char* theFieldName, 
+  CutLines_ptr VISU_Gen_i::CutLinesOnField(Result_ptr theResult,
+                                          const char* theMeshName,
+                                          VISU::Entity theEntity,
+                                          const char* theFieldName,
                                           CORBA::Double theIteration)
   {
     return Prs3dOnField<VISU::CutLines_i>(theResult,theMeshName,theEntity,theFieldName,theIteration)._retn();
   }
 
   Table_ptr VISU_Gen_i::CreateTable(const char* theTableEntry){
-    if(myStudyDocument->GetProperties()->IsLocked()) 
+    if(myStudyDocument->GetProperties()->IsLocked())
       return Table::_nil();
     Mutex mt(myMutex);
     Table_i* pPresent = new Table_i(myStudyDocument,theTableEntry);
@@ -554,11 +763,11 @@ namespace VISU{
     }
   }
 
-  Curve_ptr VISU_Gen_i::CreateCurve(Table_ptr theTable, 
-                                   CORBA::Long theHRow, 
+  Curve_ptr VISU_Gen_i::CreateCurve(Table_ptr theTable,
+                                   CORBA::Long theHRow,
                                    CORBA::Long theVRow)
   {
-    if(myStudyDocument->GetProperties()->IsLocked()) 
+    if(myStudyDocument->GetProperties()->IsLocked())
       return Curve::_nil();
     Mutex mt(myMutex);
     PortableServer::POA_ptr aPOA = GetPOA();
@@ -573,7 +782,7 @@ namespace VISU{
   }
 
   Container_ptr VISU_Gen_i::CreateContainer(){
-    if(myStudyDocument->GetProperties()->IsLocked()) 
+    if(myStudyDocument->GetProperties()->IsLocked())
       return Container::_nil();
     Mutex mt(myMutex);
     Container_i* pPresent = new Container_i(myStudyDocument);
@@ -586,7 +795,7 @@ namespace VISU{
   }
 
   Animation_ptr VISU_Gen_i::CreateAnimation(View3D_ptr theView3D){
-    if(myStudyDocument->GetProperties()->IsLocked()) 
+    if(myStudyDocument->GetProperties()->IsLocked())
       return Animation::_nil();
     Mutex mt(myMutex);
     if(VISU_TimeAnimation_i* anAnim = new VISU_TimeAnimation_i(myStudyDocument,theView3D)){
@@ -595,6 +804,16 @@ namespace VISU{
       return VISU::Animation::_nil();
   }
 
+  void VISU_Gen_i::DeleteResult (Result_ptr theResult)
+  {
+    theResult->RemoveFromStudy();
+  }
+
+  void VISU_Gen_i::DeletePrs3d (Prs3d_ptr thePrs3d)
+  {
+    thePrs3d->RemoveFromStudy();
+  }
+
   void VISU_Gen_i::Close(SALOMEDS::SComponent_ptr theComponent){
   }
 
@@ -610,8 +829,8 @@ namespace VISU{
   SALOMEDS::SObject_ptr VISU_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy,
                                                   SALOMEDS::SObject_ptr theSObject,
                                                   CORBA::Object_ptr theObject,
-                                                  const char* theName) 
-    throw (SALOME::SALOME_Exception) 
+                                                  const char* theName)
+    throw (SALOME::SALOME_Exception)
   {
     Unexpect aCatch(SalomeException);
     if(MYDEBUG) MESSAGE("VISU_Gen_i::PublishInStudy : "<<myMutex);
@@ -624,7 +843,7 @@ namespace VISU{
     aResultSO = theStudy->FindObjectID(anEntry);
     return aResultSO._retn();
   }
-    
+
   CORBA::Boolean VISU_Gen_i::CanCopy(SALOMEDS::SObject_ptr theObject) {
     Mutex mt(myMutex);
     SALOMEDS::GenericAttribute_var anAttr;
@@ -638,17 +857,19 @@ namespace VISU{
          Result_var aResultObj = Result::_narrow(anObj);
          if(!aResultObj->_is_nil()){
            if(Result_i* pResult = dynamic_cast<Result_i*>(GetServant(aResultObj).in())){
-             const Result_i::TSourceId& aSourceId = pResult->GetSourceId();
-             if(aSourceId == Result_i::eComponent || aSourceId == Result_i::eRestoredComponent)
-               if((pResult->GetFileInfo()).filePath() == "MED") 
-                 return false;
-             return true;
+             switch(pResult->GetCreationId()){
+             case Result_i::eImportFile:
+             case Result_i::eCopyAndImportFile:
+               return true;
+             }
            }
          }
        }
       }
+    }catch(std::exception& exc){
+      INFOS("Follow exception was occured :\n"<<exc.what());
     }catch (...){
-      INFOS("Unknown exception was accured!");
+      INFOS("Unknown exception was occured!");
     }
     return false;
   }
@@ -660,7 +881,7 @@ namespace VISU{
     SALOMEDS::ListOfFileNames_var aSeq = new SALOMEDS::ListOfFileNames;
 
     PortableServer::POA_ptr aPOA = GetPOA();
-    
+
     SALOMEDS::GenericAttribute_var anAttr;
     if (!theObject->FindAttribute(anAttr,"AttributeIOR")) return NULL;
     SALOMEDS::AttributeIOR_var anIORAttr = SALOMEDS::AttributeIOR::_narrow(anAttr);
@@ -675,31 +896,34 @@ namespace VISU{
     if (CORBA::is_nil(aCorbaObj)) {
       return NULL;
     }
-    
+
     Storable* pStorable = dynamic_cast<Storable*>(GetServant(aCorbaObj).in());
     if (!pStorable) {
       return NULL;
     }
-    CORBA::String_var aTmpDir = SALOMEDS_Tool::GetTmpDir();
-    
+
+    string aTmpDir = SALOMEDS_Tool::GetTmpDir();
+    string aCopyPersist =  aTmpDir + "copy_persistent";
+
+    ofstream stmOut2(aCopyPersist.c_str(),ios::out);
     string aStr = pStorable->ToString().c_str();
-    ofstream stmOut2((string(aTmpDir) + string("copy_persistent")).c_str(),ios::out);
     stmOut2<<aStr<<endl;
     stmOut2.close();
-    
+
     if (Result_i* aResultObj = dynamic_cast<Result_i*>(aPOA->reference_to_servant(aCorbaObj))) {
       string aFileName = string(SALOMEDS_Tool::GetNameFromPath(theObject->GetStudy()->URL())) + "_";
+      if(strlen(aFileName.c_str()) == 1) aFileName="";
       const QFileInfo& aFileInfo = aResultObj->GetFileInfo();
       aFileName += aFileInfo.fileName().latin1();
       static QString aCommand;
+      string aFullFileName =  aTmpDir + aFileName;
       aCommand.sprintf("cp %s %s",
                       aFileInfo.filePath().latin1(),
-                      (string(aTmpDir) + aFileName).c_str());
+                      aFullFileName.c_str());
       if(system(aCommand) == -1) {
        if(MYDEBUG) MESSAGE("VISU_Gen_i::Copy - Cann't execute the command :"<<aCommand);
        return NULL;
       }
-      
       aSeq->length(2);
       aSeq[0] = "copy_persistent";
       aSeq[1] = aFileName.c_str();
@@ -707,13 +931,14 @@ namespace VISU{
       aSeq->length(1);
       aSeq[0] = "copy_persistent";
     }
-    aStreamFile = SALOMEDS_Tool::PutFilesToStream(aTmpDir, aSeq.in(), false);
-    SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir, aSeq.in(), true);
-    
+
+    aStreamFile = SALOMEDS_Tool::PutFilesToStream(aTmpDir.c_str(), aSeq.in(), false);
+    SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir.c_str(), aSeq.in(), true);
+
     // Assign an ID = 1 the the type VISU::Result
     theObjectID = 1;
-    
-    
+
+
     SALOMEDS::SComponent_var aSComponent = theObject->GetStudy()->FindComponent("VISU");
     return aStreamFile._retn();
   }
@@ -721,24 +946,24 @@ namespace VISU{
   CORBA::Boolean VISU_Gen_i::CanPaste(const char* theComponentName, CORBA::Long theObjectID) {
     // The VISU component can paste only objects copied by VISU component
     // and with the object type = 1
-    if (strcmp(theComponentName, ComponentDataType()) != 0 || theObjectID != 1) 
+    if (strcmp(theComponentName, ComponentDataType()) != 0 || theObjectID != 1)
       return false;
     return true;
   }
 
   SALOMEDS::SObject_ptr VISU_Gen_i::PasteInto(const SALOMEDS::TMPFile& theStream,
                                              CORBA::Long theObjectID,
-                                             SALOMEDS::SObject_ptr theObject) 
+                                             SALOMEDS::SObject_ptr theObject)
   {
     Mutex mt(myMutex);
     SALOMEDS::SObject_var aResultSO;
-    if (theObjectID != 1) 
+    if (theObjectID != 1)
       return aResultSO._retn();
-    
-    CORBA::String_var aTmpDir = (const char*)SALOMEDS_Tool::GetTmpDir();
-    SALOMEDS::ListOfFileNames_var aSeq = SALOMEDS_Tool::PutStreamToFiles(theStream, aTmpDir, false);
-    
-    ifstream stmIn((string(aTmpDir) + string("copy_persistent")).c_str());
+
+    string aTmpDir = SALOMEDS_Tool::GetTmpDir();
+    SALOMEDS::ListOfFileNames_var aSeq = SALOMEDS_Tool::PutStreamToFiles(theStream, aTmpDir.c_str(), false);
+
+    ifstream stmIn((aTmpDir + string("copy_persistent")).c_str());
     stmIn.seekg(0, ios::end);
     int aLength = stmIn.tellg();
     stmIn.seekg(0, ios::beg);
@@ -746,35 +971,39 @@ namespace VISU{
     stmIn.read(aString, aLength);
     aString[aLength] = 0;
     myIsMultiFile = false;
-    
-    string aFileName(aTmpDir.in());
-    if(aSeq->length() > 1) aFileName += aSeq[1].in();
-    
+
+    string aFileName(aTmpDir);
+    string aBasicFileName;
+    if(aSeq->length() > 1) {
+      aBasicFileName = aSeq[1].in();
+      aFileName += aBasicFileName;
+    }
+
     SALOMEDS::SComponent_var aComponent = theObject->GetFatherComponent();
     SALOMEDS::Study_var aStudy = theObject->GetStudy();
     SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder();
     CORBA::String_var aComponentID(aComponent->GetID()), aSObjID(theObject->GetID());
-    
+
     if (strcmp(aComponentID, aSObjID) == 0) //create the new result SObject
       aResultSO = aStudyBuilder->NewObject(aComponent);
-    else 
+    else
       aResultSO = SALOMEDS::SObject::_duplicate(theObject);
-    
+
     //Just for Result::Restore to find the Comment attribute :(
     SALOMEDS::GenericAttribute_var anAttr = aStudyBuilder->FindOrCreateAttribute(aResultSO, "AttributeComment");
-    
+
     Storable* aStorable = Storable::Create(aResultSO,aFileName,aString);
-    
+
     SALOMEDS::ListOfFileNames_var aSeqToRm = new SALOMEDS::ListOfFileNames;
     aSeqToRm->length(1);
     aSeqToRm[0] = "copy_persistent";
-    SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir, aSeqToRm.in(), true);
-    
+
+    SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir.c_str(), aSeqToRm.in(), true);
+
     anAttr = aStudyBuilder->FindOrCreateAttribute(aResultSO, "AttributeIOR");
     SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
     CORBA::String_var anIORValue(aStorable->GetID());
     anIOR->SetValue(anIORValue);
     return aResultSO._retn();
   }
-
-};
+}