Salome HOME
Start implementation of methods, manipulating view parameters (position, size, splitt...
[modules/visu.git] / src / VISU_I / VISU_Gen_i.cc
1 //  VISU OBJECT : interactive object for VISU entities implementation
2 //
3 //  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 //  This library is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU Lesser General Public
8 //  License as published by the Free Software Foundation; either
9 //  version 2.1 of the License.
10 //
11 //  This library is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 //  Lesser General Public License for more details.
15 //
16 //  You should have received a copy of the GNU Lesser General Public
17 //  License along with this library; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 //  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
21 //
22 //
23 //  File   : VISU_Gen_i.cc
24 //  Author : Alexey PETROV
25 //  Module : VISU
26
27 #include "VISU_Gen_i.hh"
28 #include "VISU_Result_i.hh"
29 #include "VISU_PrsObject_i.hh"
30 #include "VISU_ViewManager_i.hh"
31
32 #include "VISU_Prs3d_i.hh"
33 #include "VISU_Mesh_i.hh"
34 #include "VISU_ScalarMap_i.hh"
35 #include "VISU_IsoSurfaces_i.hh"
36 #include "VISU_DeformedShape_i.hh"
37 #include "VISU_CutPlanes_i.hh"
38 #include "VISU_CutLines_i.hh"
39 #include "VISU_Vectors_i.hh"
40 #include "VISU_StreamLines_i.hh"
41 #include "VISU_Table_i.hh"
42 #include "VISU_TimeAnimation.h"
43
44 #include "VISU_Actor.h"
45
46 #include "HDFascii.hxx"
47 #include "SALOMEDS_Tool.hxx"
48
49 #include "SALOMEDSClient_AttributeName.hxx"
50 #include "SALOMEDSClient_AttributePixMap.hxx"
51
52 #include "SUIT_Session.h"
53 #include "SalomeApp_Study.h"
54 #include "SalomeApp_Application.h"
55 #include "SalomeApp_SelectionMgr.h"
56 #include "SVTK_ViewModel.h"
57 #include "SVTK_ViewWindow.h"
58 #include "SALOME_Event.hxx"
59 #include "SALOME_ListIO.hxx"
60 #include "SALOME_ListIteratorOfListIO.hxx"
61
62 #include "utilities.h"
63
64 // IDL Headers
65 #include <omnithread.h>
66 #include CORBA_SERVER_HEADER(SALOME_Session)
67 #include CORBA_SERVER_HEADER(SALOME_ModuleCatalog)
68
69 // QT Includes
70 #include <qstring.h>
71 #include <qfileinfo.h>
72
73 // VTK Includes
74 #include <vtkRenderer.h>
75 #include <vtkActorCollection.h>
76
77 // OCCT Includes
78 #include <TCollection_AsciiString.hxx>
79 #include <TColStd_SequenceOfAsciiString.hxx>
80
81 // STL Includes
82 #include <strstream>
83
84 #include "Utils_ExceptHandlers.hxx"
85
86 using namespace std;
87
88 static QFileInfo aFileInfo;
89
90 #ifdef _DEBUG_
91 static int MYDEBUG = 1;
92 #else
93 static int MYDEBUG = 0;
94 #endif
95
96 UNEXPECT_CATCH(SalomeException, SALOME::SALOME_Exception);
97
98 extern "C" VISU::VISU_Gen_ptr GetImpl(CORBA::ORB_ptr theORB,
99                                       PortableServer::POA_ptr thePOA,
100                                       SALOME_NamingService* theNamingService,
101                                       QMutex* theMutex)
102 {
103   if(MYDEBUG) MESSAGE("extern \"C\" GetImpl");
104   VISU::VISU_Gen_i *aVISU_Gen = new VISU::VISU_Gen_i(theORB,thePOA,theNamingService,theMutex);
105   //return VISU::VISU_Gen::_duplicate(aVISU_Gen->_this());
106   return aVISU_Gen->_this();
107 }
108
109 namespace VISU{
110   static string VisuTmpDir;
111
112   static CORBA::Boolean myIsMultiFile;
113   const CORBA::Boolean IsMultifile() { return myIsMultiFile;}
114
115   //===========================================================================
116   _PTR(SComponent) ClientFindOrCreateVisuComponent (_PTR(Study) theStudyDocument)
117   {
118     _PTR(SComponent) aSComponent = theStudyDocument->FindComponent("VISU");
119     if (!aSComponent) {
120       _PTR(StudyBuilder) aStudyBuilder = theStudyDocument->NewBuilder();
121       aStudyBuilder->NewCommand();
122       int aLocked = theStudyDocument->GetProperties()->IsLocked();
123       if (aLocked) theStudyDocument->GetProperties()->SetLocked(false);
124       aSComponent = aStudyBuilder->NewComponent("VISU");
125       _PTR(GenericAttribute) anAttr =
126         aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributeName");
127       _PTR(AttributeName) aName (anAttr);
128
129       CORBA::ORB_var anORB = Base_i::GetORB();
130       SALOME_NamingService *NamingService = new SALOME_NamingService( anORB );
131       CORBA::Object_var objVarN = NamingService->Resolve("/Kernel/ModulCatalog");
132       SALOME_ModuleCatalog::ModuleCatalog_var Catalogue =
133         SALOME_ModuleCatalog::ModuleCatalog::_narrow(objVarN);
134       SALOME_ModuleCatalog::Acomponent_var Comp = Catalogue->GetComponent( "VISU" );
135       if (!Comp->_is_nil()) {
136         aName->SetValue(Comp->componentusername());
137       }
138
139       anAttr = aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributePixMap");
140       _PTR(AttributePixMap) aPixmap (anAttr);
141       aPixmap->SetPixMap( "ICON_OBJBROWSER_Visu" );
142
143       VISU_Gen_var aVisuGen = Base_i::GetVisuGenImpl()->_this();
144       aStudyBuilder->DefineComponentInstance(aSComponent, aVisuGen->GetID());
145       if (aLocked) theStudyDocument->GetProperties()->SetLocked(true);
146       aStudyBuilder->CommitCommand();
147     }
148     return aSComponent;
149   }
150
151   SALOMEDS::SComponent_var FindOrCreateVisuComponent(SALOMEDS::Study_ptr theStudyDocument){
152     SALOMEDS::SComponent_var aSComponent = theStudyDocument->FindComponent("VISU");
153     if (aSComponent->_is_nil()) {
154       SALOMEDS::StudyBuilder_var aStudyBuilder = theStudyDocument->NewBuilder();
155       aStudyBuilder->NewCommand();
156       int aLocked = theStudyDocument->GetProperties()->IsLocked();
157       if (aLocked) theStudyDocument->GetProperties()->SetLocked(false);
158       aSComponent = aStudyBuilder->NewComponent("VISU");
159       SALOMEDS::GenericAttribute_var anAttr = aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributeName");
160       SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(anAttr);
161
162       //NRI      aName->SetValue("Visu");
163       CORBA::ORB_var anORB = Base_i::GetORB();
164       SALOME_NamingService *NamingService = new SALOME_NamingService( anORB );
165       CORBA::Object_var objVarN = NamingService->Resolve("/Kernel/ModulCatalog");
166       SALOME_ModuleCatalog::ModuleCatalog_var Catalogue  = SALOME_ModuleCatalog::ModuleCatalog::_narrow(objVarN);
167       SALOME_ModuleCatalog::Acomponent_var Comp = Catalogue->GetComponent( "VISU" );
168       if ( !Comp->_is_nil() ) {
169         aName->SetValue( Comp->componentusername() );
170       }
171
172       anAttr = aStudyBuilder->FindOrCreateAttribute(aSComponent, "AttributePixMap");
173       SALOMEDS::AttributePixMap_var aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
174       aPixmap->SetPixMap( "ICON_OBJBROWSER_Visu" );
175
176       VISU_Gen_var aVisuGen = Base_i::GetVisuGenImpl()->_this();
177       aStudyBuilder->DefineComponentInstance(aSComponent,aVisuGen);
178       if (aLocked) theStudyDocument->GetProperties()->SetLocked(true);
179       aStudyBuilder->CommitCommand();
180     }
181     return aSComponent;
182   }
183
184   void RegistryStorable() {
185     Storable::Registry(Result_i::myComment.c_str(),&(Result_i::Restore));
186     Storable::Registry(Mesh_i::myComment.c_str(),&(Restore<Mesh_i>));
187     Storable::Registry(ScalarMap_i::myComment.c_str(),&(Restore<ScalarMap_i>));
188     Storable::Registry(DeformedShape_i::myComment.c_str(),&(Restore<DeformedShape_i>));
189     Storable::Registry(CutPlanes_i::myComment.c_str(),&(Restore<CutPlanes_i>));
190     Storable::Registry(CutLines_i::myComment.c_str(),&(Restore<CutLines_i>));
191     Storable::Registry(IsoSurfaces_i::myComment.c_str(),&(Restore<IsoSurfaces_i>));
192     Storable::Registry(StreamLines_i::myComment.c_str(),&(Restore<StreamLines_i>));
193     Storable::Registry(Vectors_i::myComment.c_str(),&(Restore<Vectors_i>));
194     Storable::Registry(Table_i::myComment.c_str(),&(Table_i::Restore));
195     Storable::Registry(Curve_i::myComment.c_str(),&(Curve_i::Restore));
196     Storable::Registry(Container_i::myComment.c_str(),&(Container_i::Restore));
197   }
198
199
200   //===========================================================================
201   VISU_Gen_i::VISU_Gen_i(CORBA::ORB_ptr theORB, PortableServer::POA_ptr thePOA,
202                          SALOME_NamingService* theNamingService, QMutex* theMutex) :
203     Engines_Component_i()
204   {
205     if(MYDEBUG) MESSAGE("VISU_Gen_i::VISU_Gen_i : "<<theMutex);
206     Base_i::myMutex = theMutex;  //apo
207     Base_i::myOrb = CORBA::ORB::_duplicate(theORB);
208     Base_i::myPoa = PortableServer::POA::_duplicate(thePOA);
209     Base_i::myNamingService = theNamingService;
210     static SALOME_LifeCycleCORBA aEnginesLifeCycle(theNamingService);
211     Base_i::myEnginesLifeCycle = &aEnginesLifeCycle;
212     Base_i::myVisuGenImpl = this;
213     RegistryStorable();
214
215     CORBA::Object_var anObj = myNamingService->Resolve("/myStudyManager");
216     SALOMEDS::StudyManager_var aStudyManager = SALOMEDS::StudyManager::_narrow(anObj);
217     SALOMEDS::ListOfOpenStudies_var aListOfOpenStudies = aStudyManager->GetOpenStudies();
218     if(aListOfOpenStudies->length() > 0) {
219       CORBA::String_var aStudyName = aListOfOpenStudies[0];
220       //aFileInfo.setFile(aStudyName.in());
221       myStudyDocument = aStudyManager->GetStudyByName(aStudyName/*aFileInfo.baseName()*/);
222     }else
223       if(MYDEBUG) MESSAGE("VISU_Gen_i::VISU_Gen_i : there is no opened study in StudyManager !!!");
224   }
225
226   VISU_Gen_i::~VISU_Gen_i(){
227     if(MYDEBUG) MESSAGE("VISU_Gen_i::~VISU_Gen_i");
228   }
229   //===========================================================================
230   CORBA::Boolean VISU_Gen_i::Load(SALOMEDS::SComponent_ptr theComponent,
231                                   const SALOMEDS::TMPFile & theStream,
232                                   const char* theURL,
233                                   bool isMultiFile)
234   {
235     Mutex mt(myMutex);
236     SALOMEDS::Study_var aStudy = theComponent->GetStudy();
237     SALOMEDS::StudyBuilder_var  aStudyBuilder = aStudy->NewBuilder();
238     const char* aDir = isMultiFile? theURL: SALOMEDS_Tool::GetTmpDir().c_str();
239     TCollection_AsciiString aTmpDir(const_cast<char*>(aDir));
240     VisuTmpDir = aTmpDir.ToCString();
241     SALOMEDS::ListOfFileNames_var aSeq =
242       SALOMEDS_Tool::PutStreamToFiles(theStream, aTmpDir.ToCString(),isMultiFile);
243     myIsMultiFile = isMultiFile;
244     return true;
245   }
246
247   CORBA::Boolean VISU_Gen_i::LoadASCII(SALOMEDS::SComponent_ptr theComponent,
248                                        const SALOMEDS::TMPFile & theStream,
249                                        const char* theURL,
250                                        bool isMultiFile)
251   {
252     return Load(theComponent, theStream, theURL, isMultiFile);
253   }
254
255   char* VISU_Gen_i::LocalPersistentIDToIOR(SALOMEDS::SObject_ptr theSObject,
256                                            const char* aLocalPersistentID,
257                                            CORBA::Boolean isMultiFile,
258                                            CORBA::Boolean isASCII)
259   {
260     CORBA::String_var aString("");
261     if(strcmp(aLocalPersistentID,"") != 0) {
262       Mutex mt(myMutex);
263       Storable* aStorable =
264         Storable::Create(theSObject,VisuTmpDir.c_str(),aLocalPersistentID);
265       if(aStorable != NULL) aString = aStorable->GetID();
266     }
267     return aString._retn();
268   }
269   //===========================================================================
270   SALOMEDS::TMPFile* VISU_Gen_i::Save(SALOMEDS::SComponent_ptr theComponent,
271                                       const char* theURL,
272                                       bool isMultiFile)
273   {
274     Mutex mt(myMutex);
275     const char* aDir = isMultiFile? theURL: SALOMEDS_Tool::GetTmpDir().c_str();
276     TCollection_AsciiString aTmpDir(const_cast<char*>(aDir));
277     if(MYDEBUG) MESSAGE("VISU_Gen_i::Save - "<<aTmpDir);
278     int aCounter = 0;
279     TColStd_SequenceOfAsciiString aFileNames;
280     SALOMEDS::Study_var aStudy = theComponent->GetStudy();
281
282     //CORBA::Boolean anIsValidScript;
283     //Engines::TMPFile_var aDump = DumpPython(aStudy,false,anIsValidScript);
284
285     SALOMEDS::ChildIterator_var itBig = aStudy->NewChildIterator(theComponent);
286     for (; itBig->More(); itBig->Next()) {
287       SALOMEDS::SObject_var gotBranch = itBig->Value();
288       CORBA::Object_var anObj = SObjectToObject(gotBranch);
289       if(CORBA::is_nil(anObj)) continue;
290       if(Result_i* pResult = dynamic_cast<Result_i*>(GetServant(anObj).in())){
291         switch(pResult->GetCreationId()){
292         case Result_i::eImportFile:
293         case Result_i::eCopyAndImportFile: {
294           const QFileInfo& aFileInfo = pResult->GetFileInfo();
295           QString aPrefix("");
296           if (isMultiFile) aPrefix = SALOMEDS_Tool::GetNameFromPath(aStudy->URL()).c_str();
297           QString aFileName = aPrefix + "_" + (pResult->GetName()).c_str();
298           static QString aCommand;
299           aCommand.sprintf("cp %s %s%s",aFileInfo.filePath().latin1(),aTmpDir.ToCString(),aFileName.latin1());
300
301           int aRes = system(aCommand);
302           if(aRes){
303             if(MYDEBUG) MESSAGE("VISU_Gen_i::Save - Cann't execute the command :"<<aCommand);
304             continue;
305           }else
306             if(MYDEBUG) MESSAGE("VISU_Gen_i::Save - aCommand = "<<aCommand);
307
308           TCollection_AsciiString aString(strdup(aFileName.latin1()));
309           aFileNames.Append(aString);
310         }}
311       }
312     }
313     SALOMEDS::TMPFile_var aStreamFile = new SALOMEDS::TMPFile(0);
314     if(MYDEBUG) MESSAGE("VISU_Gen_i::Save - aFileNames.Length() - "<<aFileNames.Length());
315     if(aFileNames.Length() > 0){
316       SALOMEDS::ListOfFileNames_var aSeq = new SALOMEDS::ListOfFileNames;
317       aSeq->length(aFileNames.Length());
318       for(aCounter = aFileNames.Length(); aCounter > 0; aCounter--)
319         aSeq[aCounter-1] = CORBA::string_dup(aFileNames.Value(aCounter).ToCString());
320       aStreamFile = SALOMEDS_Tool::PutFilesToStream(aTmpDir.ToCString(), aSeq.in(), isMultiFile);
321       if(!isMultiFile)
322         SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir.ToCString(), aSeq.in(), true);
323     }
324     return aStreamFile._retn();
325   }
326
327   SALOMEDS::TMPFile* VISU_Gen_i::SaveASCII(SALOMEDS::SComponent_ptr theComponent,
328                                            const char* theURL,
329                                            bool isMultiFile)
330   {
331     Mutex mt(myMutex);
332     const char* aDir = isMultiFile? theURL: SALOMEDS_Tool::GetTmpDir().c_str();
333     TCollection_AsciiString aTmpDir(const_cast<char*>(aDir));
334     if(MYDEBUG) MESSAGE("VISU_Gen_i::Save - "<<aTmpDir);
335     int aCounter = 0;
336     TColStd_SequenceOfAsciiString aFileNames;
337     SALOMEDS::Study_var aStudy = theComponent->GetStudy();
338     SALOMEDS::ChildIterator_var itBig = aStudy->NewChildIterator(theComponent);
339     for (; itBig->More(); itBig->Next()) {
340       SALOMEDS::SObject_var gotBranch = itBig->Value();
341       CORBA::Object_var anObj = SObjectToObject(gotBranch);
342       if(CORBA::is_nil(anObj)) continue;
343       if(Result_i* pResult = dynamic_cast<Result_i*>(GetServant(anObj).in())){
344         switch(pResult->GetCreationId()){
345         case Result_i::eImportFile:
346         case Result_i::eCopyAndImportFile: {
347           const QFileInfo& aFileInfo = pResult->GetFileInfo();
348           QString aPrefix("");
349           if (isMultiFile) aPrefix = SALOMEDS_Tool::GetNameFromPath(aStudy->URL()).c_str();
350           QString aFileName = aPrefix + "_" + (pResult->GetName()).c_str();
351           static QString aCommand;
352           aCommand.sprintf("cp %s %s%s",aFileInfo.filePath().latin1(),aTmpDir.ToCString(),aFileName.latin1());
353
354           int aRes = system(aCommand);
355           if(aRes){
356             if(MYDEBUG) MESSAGE("VISU_Gen_i::Save - Can't execute the command :"<<aCommand);
357             continue;
358           }else
359             if(MYDEBUG) MESSAGE("VISU_Gen_i::Save - "<<aCommand);
360
361           TCollection_AsciiString aString(strdup(aFileName.latin1()));
362
363           HDFascii::ConvertFromHDFToASCII(strdup((aTmpDir + aString).ToCString()), true);
364
365           aFileNames.Append(aString);
366         }}
367       }
368     }
369     SALOMEDS::TMPFile_var aStreamFile = new SALOMEDS::TMPFile(0);
370     if(MYDEBUG) MESSAGE("VISU_Gen_i::Save - aFileNames.Length() - "<<aFileNames.Length());
371     if(aFileNames.Length() > 0){
372       SALOMEDS::ListOfFileNames_var aSeq = new SALOMEDS::ListOfFileNames;
373       aSeq->length(aFileNames.Length());
374       for(aCounter = aFileNames.Length(); aCounter > 0; aCounter--)
375         aSeq[aCounter-1] = CORBA::string_dup(aFileNames.Value(aCounter).ToCString());
376       aStreamFile = SALOMEDS_Tool::PutFilesToStream(aTmpDir.ToCString(), aSeq.in(), isMultiFile);
377       if(!isMultiFile)
378         SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir.ToCString(), aSeq.in(), true);
379     }
380     return aStreamFile._retn();
381   }
382
383   char* VISU_Gen_i::IORToLocalPersistentID(SALOMEDS::SObject_ptr theSObject,
384                                            const char* IORString,
385                                            CORBA::Boolean isMultiFile,
386                                            CORBA::Boolean isASCII)
387   {
388     CORBA::String_var aString(IORString);
389     if(strcmp(IORString,"") != 0){
390       CORBA::ORB_ptr anORB = GetORB();
391       CORBA::Object_var anObj = anORB->string_to_object(aString);
392       if(!CORBA::is_nil(anObj)){
393         if(Storable* pStorable = dynamic_cast<Storable*>(GetServant(anObj).in())){
394           Mutex mt(myMutex);
395           aString = pStorable->ToString().c_str();
396           return aString._retn();
397         }
398       }
399     }
400     return aString._retn();
401   }
402
403   char* VISU_Gen_i::GetID(){
404     return Base_i::GetID();
405   }
406
407   void VISU_Gen_i::SetCurrentStudy (SALOMEDS::Study_ptr theStudy)
408   {
409     class TEvent: public SALOME_Event { 
410       std::string myStudyName;
411     public:
412       TEvent(const std::string theStudyName):myStudyName(theStudyName) 
413         {}  
414       virtual void Execute()
415         {
416           bool isActive = false;
417           SUIT_Session* aSession = SUIT_Session::session();
418           QPtrList<SUIT_Application> anApplications = aSession->applications();
419           QPtrListIterator<SUIT_Application> anIter (anApplications);
420           SUIT_Application* aFirstApp = anIter.current();
421           while (SUIT_Application* anApp = anIter.current()) {
422             ++anIter;
423             if (SUIT_Study* aSStudy = anApp->activeStudy()) {
424               if (SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>(aSStudy)) {
425                 if (_PTR(Study) aCStudy = aStudy->studyDS()) {
426                   MESSAGE("There is an application with active study : StudyId = "
427                           << aCStudy->StudyId() << "; Name = '" << aCStudy->Name() << "'");
428                   if (myStudyName == aCStudy->Name()) {
429                     isActive = true;
430                     break;
431                   }
432                 }
433               }
434             }
435           }
436           if (!isActive) {
437             MESSAGE("!!! anApp->onLoadDoc(myStudyName) !!!");
438             // Has to be loaded in an empty or in a new application
439             SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>(aFirstApp);
440             anApp->onLoadDoc(myStudyName);
441           }
442         }
443     };
444     
445     if (!CORBA::is_nil(theStudy))
446     {
447       CORBA::String_var aName = theStudy->Name();
448       std::string aStudyName (aName.in());
449       MESSAGE("StudyId = " << theStudy->StudyId() << "; Name = '" << aName.in() << "'");
450       myStudyDocument = SALOMEDS::Study::_duplicate(theStudy);
451
452       ProcessVoidEvent(new TEvent(aStudyName)); 
453     } else {
454       MESSAGE("CORBA::is_nil(theStudy)");
455     }
456   }
457
458   SALOMEDS::Study_ptr VISU_Gen_i::GetCurrentStudy(){
459     return SALOMEDS::Study::_duplicate(myStudyDocument);
460   }
461
462   ViewManager_ptr VISU_Gen_i::GetViewManager(){
463     Mutex mt(myMutex);
464     ViewManager_i * aViewManager = new ViewManager_i(myStudyDocument);
465     return ViewManager::_duplicate(aViewManager->_this());
466   }
467
468   SALOMEDS::SObject_ptr VISU_Gen_i::ImportTables(const char* theFileName){
469     if(myStudyDocument->GetProperties()->IsLocked())
470       return SALOMEDS::SObject::_nil();
471     Mutex mt(myMutex);
472     SALOMEDS::SObject_var aRes = VISU::ImportTables(theFileName,myStudyDocument);
473     return aRes._retn();
474   }
475
476   CORBA::Boolean VISU_Gen_i::ExportTableToFile(SALOMEDS::SObject_ptr theTable,
477                                                const char* theFileName)
478   {
479     return VISU::ExportTableToFile(theTable, theFileName);
480   }
481
482   Result_ptr VISU_Gen_i::ImportFile(const char* theFileName){
483     if(myStudyDocument->GetProperties()->IsLocked())
484       return Result::_nil();
485     Mutex mt(myMutex);
486     aFileInfo.setFile(theFileName);
487     Result_i* pResult = new Result_i(myStudyDocument,
488                                      Result_i::eFile,
489                                      Result_i::eImportFile);
490     if(pResult->Create(theFileName) != NULL)
491       return pResult->_this();
492     else{
493       pResult->_remove_ref();
494       return VISU::Result::_nil();
495     }
496   }
497
498   Result_ptr VISU_Gen_i::CopyAndImportFile(const char* theFileName){
499     if(myStudyDocument->GetProperties()->IsLocked())
500       return Result::_nil();
501     Mutex mt(myMutex);
502     VISU::Result_var aResult;
503     aFileInfo.setFile(theFileName);
504     Result_i* pResult = new Result_i(myStudyDocument,
505                                      Result_i::eRestoredFile,
506                                      Result_i::eCopyAndImportFile);
507     if(pResult->Create(theFileName) != NULL)
508       aResult = pResult->_this();
509     return aResult._retn();
510   }
511
512   Result_ptr VISU_Gen_i::ImportMed (SALOMEDS::SObject_ptr theMedSObject)
513   {
514     if (myStudyDocument->GetProperties()->IsLocked())
515       return Result::_nil();
516     Mutex mt(myMutex);
517     Result_i* pResult = new Result_i(myStudyDocument,
518                                      Result_i::eComponent,
519                                      Result_i::eImportMed);
520     if (pResult->Create(theMedSObject) != NULL) {
521       return pResult->_this();
522     } else {
523       pResult->_remove_ref();
524       return VISU::Result::_nil();
525     }
526   }
527
528   Result_ptr VISU_Gen_i::ImportMedField (SALOME_MED::FIELD_ptr theField)
529   {
530     if (myStudyDocument->GetProperties()->IsLocked())
531       return Result::_nil();
532     Mutex mt(myMutex);
533     Result_i* pResult = new Result_i(myStudyDocument,
534                                      Result_i::eComponent,
535                                      Result_i::eImportMedField);
536     if (pResult->Create(theField) != NULL) {
537       return pResult->_this();
538     } else {
539       pResult->_remove_ref();
540       return VISU::Result::_nil();
541     }
542   }
543
544   Mesh_ptr VISU_Gen_i::MeshOnEntity(Result_ptr theResult,
545                                     const char* theMeshName,
546                                     VISU::Entity theEntity)
547   {
548     if(myStudyDocument->GetProperties()->IsLocked())
549       return Mesh::_nil();
550     Mutex mt(myMutex);
551     if(Result_i* pResult = dynamic_cast<Result_i*>(GetServant(theResult).in())){
552       Mesh_i* aPresent = new Mesh_i(pResult);
553       if(aPresent->Create(theMeshName,theEntity) != NULL)
554         return aPresent->_this();
555       else{
556         aPresent->_remove_ref();
557       }
558     }
559     return VISU::Mesh::_nil();
560   }
561
562   Mesh_ptr VISU_Gen_i::FamilyMeshOnEntity(Result_ptr theResult,
563                                           const char* theMeshName,
564                                           VISU::Entity theEntity,
565                                           const char* theFamilyName)
566   {
567     if(myStudyDocument->GetProperties()->IsLocked())
568       return Mesh::_nil();
569     Mutex mt(myMutex);
570     if(Result_i* pResult = dynamic_cast<Result_i*>(GetServant(theResult).in())){
571       Mesh_i* aPresent = new Mesh_i(pResult);
572       if(aPresent->Create(theMeshName,theEntity,theFamilyName) != NULL)
573         return aPresent->_this();
574       else{
575         aPresent->_remove_ref();
576       }
577     }
578     return VISU::Mesh::_nil();
579   }
580
581   Mesh_ptr VISU_Gen_i::GroupMesh(Result_ptr theResult,
582                                  const char* theMeshName,
583                                  const char* theGroupName)
584   {
585     if(myStudyDocument->GetProperties()->IsLocked())
586       return Mesh::_nil();
587     Mutex mt(myMutex);
588     if(Result_i* pResult = dynamic_cast<Result_i*>(GetServant(theResult).in())){
589       Mesh_i* aPresent = new Mesh_i(pResult);
590       if(aPresent->Create(theMeshName,theGroupName) != NULL)
591         return aPresent->_this();
592       else{
593         aPresent->_remove_ref();
594       }
595     }
596     return VISU::Mesh::_nil();
597   }
598
599   ScalarMap_ptr VISU_Gen_i::ScalarMapOnField(Result_ptr theResult,
600                                              const char* theMeshName,
601                                              VISU::Entity theEntity,
602                                              const char* theFieldName,
603                                              CORBA::Double theIteration)
604   {
605     return Prs3dOnField<VISU::ScalarMap_i>(theResult,theMeshName,theEntity,theFieldName,theIteration,true)._retn();
606   }
607
608   DeformedShape_ptr VISU_Gen_i::DeformedShapeOnField(Result_ptr theResult,
609                                                      const char* theMeshName,
610                                                      VISU::Entity theEntity,
611                                                      const char* theFieldName,
612                                                      CORBA::Double theIteration)
613   {
614     return Prs3dOnField<VISU::DeformedShape_i>(theResult,theMeshName,theEntity,theFieldName,theIteration)._retn();
615   }
616
617   Vectors_ptr VISU_Gen_i::VectorsOnField(Result_ptr theResult,
618                                          const char* theMeshName,
619                                          VISU::Entity theEntity,
620                                          const char* theFieldName,
621                                          CORBA::Double theIteration)
622   {
623     return Prs3dOnField<VISU::Vectors_i>(theResult,theMeshName,theEntity,theFieldName,theIteration)._retn();
624   }
625
626   IsoSurfaces_ptr VISU_Gen_i::IsoSurfacesOnField(Result_ptr theResult,
627                                                  const char* theMeshName,
628                                                  VISU::Entity theEntity,
629                                                  const char* theFieldName,
630                                                  CORBA::Double theIteration)
631   {
632     return Prs3dOnField<VISU::IsoSurfaces_i>(theResult,theMeshName,theEntity,theFieldName,theIteration)._retn();
633   }
634
635   StreamLines_ptr VISU_Gen_i::StreamLinesOnField(Result_ptr theResult,
636                                                  const char* theMeshName,
637                                                  VISU::Entity theEntity,
638                                                  const char* theFieldName,
639                                                  CORBA::Double theIteration)
640   {
641     return Prs3dOnField<VISU::StreamLines_i>(theResult,theMeshName,theEntity,theFieldName,theIteration)._retn();
642   }
643
644   CutPlanes_ptr VISU_Gen_i::CutPlanesOnField(Result_ptr theResult,
645                                              const char* theMeshName,
646                                              VISU::Entity theEntity,
647                                              const char* theFieldName,
648                                              CORBA::Double theIteration)
649   {
650     return Prs3dOnField<VISU::CutPlanes_i>(theResult,theMeshName,theEntity,theFieldName,theIteration)._retn();
651   }
652
653   CutLines_ptr VISU_Gen_i::CutLinesOnField(Result_ptr theResult,
654                                            const char* theMeshName,
655                                            VISU::Entity theEntity,
656                                            const char* theFieldName,
657                                            CORBA::Double theIteration)
658   {
659     return Prs3dOnField<VISU::CutLines_i>(theResult,theMeshName,theEntity,theFieldName,theIteration)._retn();
660   }
661
662   Table_ptr VISU_Gen_i::CreateTable(const char* theTableEntry){
663     if(myStudyDocument->GetProperties()->IsLocked())
664       return Table::_nil();
665     Mutex mt(myMutex);
666     Table_i* pPresent = new Table_i(myStudyDocument,theTableEntry);
667     if(pPresent->Create() != NULL)
668       return pPresent->_this();
669     else{
670       pPresent->_remove_ref();
671       return VISU::Table::_nil();
672     }
673   }
674
675   Curve_ptr VISU_Gen_i::CreateCurve(Table_ptr theTable,
676                                     CORBA::Long theHRow,
677                                     CORBA::Long theVRow)
678   {
679     if(myStudyDocument->GetProperties()->IsLocked())
680       return Curve::_nil();
681     Mutex mt(myMutex);
682     PortableServer::POA_ptr aPOA = GetPOA();
683     Table_i* pTable = dynamic_cast<Table_i*>(aPOA->reference_to_servant(theTable));
684     Curve_i* pPresent = new Curve_i(myStudyDocument,pTable,theHRow,theVRow);
685     if(pPresent->Create() != NULL)
686       return pPresent->_this();
687     else{
688       pPresent->_remove_ref();
689       return VISU::Curve::_nil();
690     }
691   }
692
693   Container_ptr VISU_Gen_i::CreateContainer(){
694     if(myStudyDocument->GetProperties()->IsLocked())
695       return Container::_nil();
696     Mutex mt(myMutex);
697     Container_i* pPresent = new Container_i(myStudyDocument);
698     if(pPresent->Create() != NULL)
699       return pPresent->_this();
700     else{
701       pPresent->_remove_ref();
702       return VISU::Container::_nil();
703     }
704   }
705
706   Animation_ptr VISU_Gen_i::CreateAnimation(View3D_ptr theView3D){
707     if(myStudyDocument->GetProperties()->IsLocked())
708       return Animation::_nil();
709     Mutex mt(myMutex);
710     if(VISU_TimeAnimation_i* anAnim = new VISU_TimeAnimation_i(myStudyDocument,theView3D)){
711       return anAnim->_this();
712     }else
713       return VISU::Animation::_nil();
714   }
715
716   void DeletePrs3d (Prs3d_ptr thePrs3d)
717   {
718     Prs3d_i* aPrs3d = dynamic_cast<Prs3d_i*>(GetServant(thePrs3d).in());
719     if (!aPrs3d)
720       return;
721
722     // 1. Find appropriate application (code like in VISU_ViewManager_i.cxx)
723     SALOMEDS::Study_var myStudyDocument = aPrs3d->GetStudyDocument();
724     SalomeApp_Application* anApp = NULL;
725     CORBA::String_var studyName = myStudyDocument->Name();
726     std::string aStudyName = studyName.in();
727     SUIT_Session* aSession = SUIT_Session::session();
728     QPtrList<SUIT_Application> anApplications = aSession->applications();
729     QPtrListIterator<SUIT_Application> anIter (anApplications);
730     while (SUIT_Application* aSUITApp = anIter.current()) {
731       ++anIter;
732       if (SUIT_Study* aSStudy = aSUITApp->activeStudy()) {
733         if (SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>(aSStudy)) {
734           if (_PTR(Study) aCStudy = aStudy->studyDS()) {
735             if (aStudyName == aCStudy->Name()) {
736               anApp = dynamic_cast<SalomeApp_Application*>(aSUITApp);
737               break;
738             }
739           }
740         }
741       }
742     }
743     if (!anApp)
744       return;
745
746     // 2. Remove corresponding IO from selection
747     SALOMEDS::SObject_var aSObject = aPrs3d->GetSObject();
748     CORBA::String_var anEntry = aSObject->GetID();
749
750     SalomeApp_SelectionMgr* aSelectionMgr = anApp->selectionMgr();
751     SALOME_ListIO aListIO, aNewListIO;
752     aSelectionMgr->selectedObjects(aListIO);
753
754     for (SALOME_ListIteratorOfListIO it (aListIO); it.More(); it.Next()) {
755       if (it.Value()->hasEntry()) {
756         std::string aCurEntry (it.Value()->getEntry());
757         if (aCurEntry != std::string( anEntry.in() ) ) {
758           aNewListIO.Append(it.Value());
759         }
760       }
761     }
762
763     aSelectionMgr->setSelectedObjects(aNewListIO);
764
765     // 3. Remove Actors
766     ViewManagerList aViewManagerList;
767     anApp->viewManagers(SVTK_Viewer::Type(), aViewManagerList);
768     QPtrListIterator<SUIT_ViewManager> anVMIter (aViewManagerList);
769     for (; anVMIter.current(); ++anVMIter) {
770       SUIT_ViewManager* aViewManager = anVMIter.current();
771       QPtrVector<SUIT_ViewWindow> aViews = aViewManager->getViews();
772       for (int i = 0, iEnd = aViews.size(); i < iEnd; i++) {
773         if (SUIT_ViewWindow* aViewWindow = aViews.at(i)) {
774           if (SVTK_ViewWindow* vw = dynamic_cast<SVTK_ViewWindow*>(aViewWindow)) {
775             //VISU_Actor* anActor = aVISUViewManager->GetActor(aPrs3d, vw);
776             VISU_Actor* anActor = NULL;
777             vtkActorCollection *anActColl = vw->getRenderer()->GetActors();
778             anActColl->InitTraversal();
779             vtkActor *aVTKActor = anActColl->GetNextActor();
780             for (; !anActor && aVTKActor; aVTKActor = anActColl->GetNextActor()) {
781               if (VISU_Actor* anVISUActor = dynamic_cast<VISU_Actor*>(aVTKActor)) {
782                 if (aPrs3d == anVISUActor->GetPrs3d()) {
783                   anActor = anVISUActor->GetParent();
784                 }
785               }
786             }
787             if (anActor) {
788               vw->RemoveActor(anActor);
789               anActor->Delete();
790             }
791           }
792         }
793       }
794     }
795
796     aPrs3d->RemoveFromStudy();
797     aPrs3d->Destroy();
798
799     //jfa tmp:theModule->updateObjBrowser(); //update Object browser
800   }
801
802   void VISU_Gen_i::DeleteResult (Result_ptr theResult)
803   {
804     class TEvent: public SALOME_Event {
805       Result_ptr myResult;
806     public:
807       TEvent(Result_ptr theResult): myResult(theResult) {}
808       virtual void Execute(){
809         if (Result_i* aResult = dynamic_cast<Result_i*>(GetServant(myResult).in())) {
810           SALOMEDS::SObject_var aSObject = aResult->GetSObject();
811           SALOMEDS::Study_var aStudyDocument = aSObject->GetStudy();
812           SALOMEDS::ChildIterator_var aChildIter = aStudyDocument->NewChildIterator(aSObject);
813           for(aChildIter->InitEx(true); aChildIter->More(); aChildIter->Next()){
814             SALOMEDS::SObject_var aChildSObject = aChildIter->Value();
815             CORBA::Object_var aChildObj = VISU::SObjectToObject(aChildSObject);
816             if(CORBA::is_nil(aChildObj)) continue;
817             VISU::Prs3d_var aPrs3d = VISU::Prs3d::_narrow(aChildObj);
818             if(CORBA::is_nil(aPrs3d)) continue;
819             VISU::DeletePrs3d(aPrs3d);
820           }
821
822           aResult->RemoveFromStudy();
823           aResult->Destroy();
824
825           //jfa tmp:if (QAD_Desktop* aDesktop = QAD_Application::getDesktop())
826           //jfa tmp:  if (QAD_Study* aStudy = aDesktop->findStudy(aStudyDocument))
827           //jfa tmp:    aStudy->updateObjBrowser(); //update Object browser
828         }
829       }
830     };
831
832     if (myStudyDocument->GetProperties()->IsLocked())
833       return;
834     Mutex mt(myMutex); // jfa ???
835
836     ProcessVoidEvent(new TEvent(theResult));
837   }
838
839   void VISU_Gen_i::DeletePrs3d (Prs3d_ptr thePrs3d)
840   {
841     class TEvent: public SALOME_Event {
842       Prs3d_ptr myPrs3d;
843     public:
844       TEvent(Prs3d_ptr thePrs3d): myPrs3d(thePrs3d) {}
845       virtual void Execute() {
846         VISU::DeletePrs3d(myPrs3d);
847       }
848     };
849
850     if (myStudyDocument->GetProperties()->IsLocked())
851       return;
852     Mutex mt(myMutex); // jfa ???
853
854     ProcessVoidEvent(new TEvent(thePrs3d));
855   }
856
857   void VISU_Gen_i::Close(SALOMEDS::SComponent_ptr theComponent){
858   }
859
860   char* VISU_Gen_i::ComponentDataType(){
861     return CORBA::string_dup("VISU");
862   }
863
864   bool VISU_Gen_i::CanPublishInStudy(CORBA::Object_ptr theIOR) {
865     Result_var aResultObj = Result::_narrow(theIOR);
866     return !(aResultObj->_is_nil());
867   }
868
869   SALOMEDS::SObject_ptr VISU_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy,
870                                                    SALOMEDS::SObject_ptr theSObject,
871                                                    CORBA::Object_ptr theObject,
872                                                    const char* theName)
873     throw (SALOME::SALOME_Exception)
874   {
875     Unexpect aCatch(SalomeException);
876     if(MYDEBUG) MESSAGE("VISU_Gen_i::PublishInStudy : "<<myMutex);
877     Mutex mt(myMutex);
878     SALOMEDS::SObject_var aResultSO;
879     Result_i* aResultObj = dynamic_cast<Result_i*>(GetServant(theObject).in());
880     if (!aResultObj) return aResultSO._retn();
881     const QFileInfo& aFileInfo = aResultObj->GetFileInfo();
882     CORBA::String_var anEntry = aResultObj->Create(aFileInfo.filePath().latin1())->GetID();
883     aResultSO = theStudy->FindObjectID(anEntry);
884     return aResultSO._retn();
885   }
886
887   CORBA::Boolean VISU_Gen_i::CanCopy(SALOMEDS::SObject_ptr theObject) {
888     Mutex mt(myMutex);
889     SALOMEDS::GenericAttribute_var anAttr;
890     if (!theObject->FindAttribute(anAttr, "AttributeIOR")) return false;
891     try {
892       SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
893       CORBA::String_var aValue = anIOR->Value();
894       if(strcmp(aValue,"") != 0){
895         CORBA::Object_ptr anObj = GetORB()->string_to_object(aValue);
896         if (!CORBA::is_nil(anObj)){
897           Result_var aResultObj = Result::_narrow(anObj);
898           if(!aResultObj->_is_nil()){
899             if(Result_i* pResult = dynamic_cast<Result_i*>(GetServant(aResultObj).in())){
900               switch(pResult->GetCreationId()){
901               case Result_i::eImportFile:
902               case Result_i::eCopyAndImportFile:
903                 return true;
904               }
905             }
906           }
907         }
908       }
909     }catch(std::exception& exc){
910       INFOS("Follow exception was occured :\n"<<exc.what());
911     }catch (...){
912       INFOS("Unknown exception was occured!");
913     }
914     return false;
915   }
916
917   SALOMEDS::TMPFile* VISU_Gen_i::CopyFrom(SALOMEDS::SObject_ptr theObject, CORBA::Long& theObjectID) {
918     Mutex mt(myMutex);
919     theObjectID = 0;
920     SALOMEDS::TMPFile_var aStreamFile = new SALOMEDS::TMPFile;
921     SALOMEDS::ListOfFileNames_var aSeq = new SALOMEDS::ListOfFileNames;
922
923     PortableServer::POA_ptr aPOA = GetPOA();
924
925     SALOMEDS::GenericAttribute_var anAttr;
926     if (!theObject->FindAttribute(anAttr,"AttributeIOR")) return NULL;
927     SALOMEDS::AttributeIOR_var anIORAttr = SALOMEDS::AttributeIOR::_narrow(anAttr);
928     CORBA::Object_var aCorbaObj;
929     try {
930       aCorbaObj = GetORB()->string_to_object(anIORAttr->Value());
931     } catch(...) {
932       aStreamFile->length(1);
933       aStreamFile[0] = strdup("E")[0];
934       return aStreamFile._retn();
935     }
936     if (CORBA::is_nil(aCorbaObj)) {
937       return NULL;
938     }
939
940     Storable* pStorable = dynamic_cast<Storable*>(GetServant(aCorbaObj).in());
941     if (!pStorable) {
942       return NULL;
943     }
944
945     string aTmpDir = SALOMEDS_Tool::GetTmpDir();
946     string aCopyPersist =  aTmpDir + "copy_persistent";
947
948     ofstream stmOut2(aCopyPersist.c_str(),ios::out);
949     string aStr = pStorable->ToString().c_str();
950     stmOut2<<aStr<<endl;
951     stmOut2.close();
952
953     if (Result_i* aResultObj = dynamic_cast<Result_i*>(aPOA->reference_to_servant(aCorbaObj))) {
954       string aFileName = string(SALOMEDS_Tool::GetNameFromPath(theObject->GetStudy()->URL())) + "_";
955       if(strlen(aFileName.c_str()) == 1) aFileName="";
956       const QFileInfo& aFileInfo = aResultObj->GetFileInfo();
957       aFileName += aFileInfo.fileName().latin1();
958       static QString aCommand;
959       string aFullFileName =  aTmpDir + aFileName;
960       aCommand.sprintf("cp %s %s",
961                        aFileInfo.filePath().latin1(),
962                        aFullFileName.c_str());
963       if(system(aCommand) == -1) {
964         if(MYDEBUG) MESSAGE("VISU_Gen_i::Copy - Cann't execute the command :"<<aCommand);
965         return NULL;
966       }
967       aSeq->length(2);
968       aSeq[0] = "copy_persistent";
969       aSeq[1] = aFileName.c_str();
970     } else {
971       aSeq->length(1);
972       aSeq[0] = "copy_persistent";
973     }
974
975     aStreamFile = SALOMEDS_Tool::PutFilesToStream(aTmpDir.c_str(), aSeq.in(), false);
976     SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir.c_str(), aSeq.in(), true);
977
978     // Assign an ID = 1 the the type VISU::Result
979     theObjectID = 1;
980
981
982     SALOMEDS::SComponent_var aSComponent = theObject->GetStudy()->FindComponent("VISU");
983     return aStreamFile._retn();
984   }
985
986   CORBA::Boolean VISU_Gen_i::CanPaste(const char* theComponentName, CORBA::Long theObjectID) {
987     // The VISU component can paste only objects copied by VISU component
988     // and with the object type = 1
989     if (strcmp(theComponentName, ComponentDataType()) != 0 || theObjectID != 1)
990       return false;
991     return true;
992   }
993
994   SALOMEDS::SObject_ptr VISU_Gen_i::PasteInto(const SALOMEDS::TMPFile& theStream,
995                                               CORBA::Long theObjectID,
996                                               SALOMEDS::SObject_ptr theObject)
997   {
998     Mutex mt(myMutex);
999     SALOMEDS::SObject_var aResultSO;
1000     if (theObjectID != 1)
1001       return aResultSO._retn();
1002
1003     string aTmpDir = SALOMEDS_Tool::GetTmpDir();
1004     SALOMEDS::ListOfFileNames_var aSeq = SALOMEDS_Tool::PutStreamToFiles(theStream, aTmpDir.c_str(), false);
1005
1006     ifstream stmIn((aTmpDir + string("copy_persistent")).c_str());
1007     stmIn.seekg(0, ios::end);
1008     int aLength = stmIn.tellg();
1009     stmIn.seekg(0, ios::beg);
1010     char* aString = new char[aLength+1];
1011     stmIn.read(aString, aLength);
1012     aString[aLength] = 0;
1013     myIsMultiFile = false;
1014
1015     string aFileName(aTmpDir);
1016     string aBasicFileName;
1017     if(aSeq->length() > 1) {
1018       aBasicFileName = aSeq[1].in();
1019       aFileName += aBasicFileName;
1020     }
1021
1022     SALOMEDS::SComponent_var aComponent = theObject->GetFatherComponent();
1023     SALOMEDS::Study_var aStudy = theObject->GetStudy();
1024     SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder();
1025     CORBA::String_var aComponentID(aComponent->GetID()), aSObjID(theObject->GetID());
1026
1027     if (strcmp(aComponentID, aSObjID) == 0) //create the new result SObject
1028       aResultSO = aStudyBuilder->NewObject(aComponent);
1029     else
1030       aResultSO = SALOMEDS::SObject::_duplicate(theObject);
1031
1032     //Just for Result::Restore to find the Comment attribute :(
1033     SALOMEDS::GenericAttribute_var anAttr = aStudyBuilder->FindOrCreateAttribute(aResultSO, "AttributeComment");
1034
1035     Storable* aStorable = Storable::Create(aResultSO,aFileName,aString);
1036
1037     SALOMEDS::ListOfFileNames_var aSeqToRm = new SALOMEDS::ListOfFileNames;
1038     aSeqToRm->length(1);
1039     aSeqToRm[0] = "copy_persistent";
1040
1041     SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir.c_str(), aSeqToRm.in(), true);
1042
1043     anAttr = aStudyBuilder->FindOrCreateAttribute(aResultSO, "AttributeIOR");
1044     SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
1045     CORBA::String_var anIORValue(aStorable->GetID());
1046     anIOR->SetValue(anIORValue);
1047     return aResultSO._retn();
1048   }
1049 }