]> SALOME platform Git repositories - modules/visu.git/blob - src/VISU_I/VISU_Gen_i.cc
Salome HOME
11ffff01971cb8f75ac337130fd868705091bf2c
[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     if (!CORBA::is_nil(theStudy))
410     {
411       CORBA::String_var aName = theStudy->Name();
412       QString aStudyName (aName.in());
413       MESSAGE("VISU_Gen_i::SetCurrentStudy - StudyId = " <<
414               theStudy->StudyId() << "; Name = '" << aName.in() << "'");
415       myStudyDocument = SALOMEDS::Study::_duplicate(theStudy);
416
417       MESSAGE("Find application for study : " << aName.in());
418       bool isActive = false;
419       SUIT_Session* aSession = SUIT_Session::session();
420       QPtrList<SUIT_Application> anApplications = aSession->applications();
421       QPtrListIterator<SUIT_Application> anIter (anApplications);
422       SUIT_Application* aFirstApp = anIter.current();
423       while (SUIT_Application* anApp = anIter.current()) {
424         ++anIter;
425         if (SUIT_Study* aSStudy = anApp->activeStudy()) {
426           if (SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>(aSStudy)) {
427             MESSAGE("There is an application with active study : " << aStudy->studyName());
428             if (aStudyName == aStudy->studyName()) {
429               isActive = true;
430               break;
431             }
432           }
433         }
434       }
435       if (!isActive) {
436         // Has to be loaded in an empty or in a new application
437         SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>(aFirstApp);
438         anApp->onLoadDoc(aName.in());
439       }
440     } else {
441       MESSAGE("VISU_Gen_i::SetCurrentStudy : CORBA::is_nil(theStudy)");
442     }
443   }
444
445   SALOMEDS::Study_ptr VISU_Gen_i::GetCurrentStudy(){
446     return SALOMEDS::Study::_duplicate(myStudyDocument);
447   }
448
449   ViewManager_ptr VISU_Gen_i::GetViewManager(){
450     Mutex mt(myMutex);
451     ViewManager_i * aViewManager = new ViewManager_i(myStudyDocument);
452     return ViewManager::_duplicate(aViewManager->_this());
453   }
454
455   SALOMEDS::SObject_ptr VISU_Gen_i::ImportTables(const char* theFileName){
456     if(myStudyDocument->GetProperties()->IsLocked())
457       return SALOMEDS::SObject::_nil();
458     Mutex mt(myMutex);
459     SALOMEDS::SObject_var aRes = VISU::ImportTables(theFileName,myStudyDocument);
460     return aRes._retn();
461   }
462
463   CORBA::Boolean VISU_Gen_i::ExportTableToFile(SALOMEDS::SObject_ptr theTable,
464                                                const char* theFileName)
465   {
466     return VISU::ExportTableToFile(theTable, theFileName);
467   }
468
469   Result_ptr VISU_Gen_i::ImportFile(const char* theFileName){
470     if(myStudyDocument->GetProperties()->IsLocked())
471       return Result::_nil();
472     Mutex mt(myMutex);
473     aFileInfo.setFile(theFileName);
474     Result_i* pResult = new Result_i(myStudyDocument,
475                                      Result_i::eFile,
476                                      Result_i::eImportFile);
477     if(pResult->Create(theFileName) != NULL)
478       return pResult->_this();
479     else{
480       pResult->_remove_ref();
481       return VISU::Result::_nil();
482     }
483   }
484
485   Result_ptr VISU_Gen_i::CopyAndImportFile(const char* theFileName){
486     if(myStudyDocument->GetProperties()->IsLocked())
487       return Result::_nil();
488     Mutex mt(myMutex);
489     VISU::Result_var aResult;
490     aFileInfo.setFile(theFileName);
491     Result_i* pResult = new Result_i(myStudyDocument,
492                                      Result_i::eRestoredFile,
493                                      Result_i::eCopyAndImportFile);
494     if(pResult->Create(theFileName) != NULL)
495       aResult = pResult->_this();
496     return aResult._retn();
497   }
498
499   Result_ptr VISU_Gen_i::ImportMed(SALOMEDS::SObject_ptr theMedSObject){
500     if(myStudyDocument->GetProperties()->IsLocked())
501       return Result::_nil();
502     Mutex mt(myMutex);
503     Result_i* pResult = new Result_i(myStudyDocument,
504                                      Result_i::eComponent,
505                                      Result_i::eImportMed);
506     if(pResult->Create(theMedSObject) != NULL)
507       return pResult->_this();
508     else{
509       pResult->_remove_ref();
510       return VISU::Result::_nil();
511     }
512   }
513
514   Result_ptr VISU_Gen_i::ImportMedField(SALOME_MED::FIELD_ptr theField){
515     if(myStudyDocument->GetProperties()->IsLocked())
516       return Result::_nil();
517     Mutex mt(myMutex);
518     Result_i* pResult = new Result_i(myStudyDocument,
519                                      Result_i::eComponent,
520                                      Result_i::eImportMedField);
521     if(pResult->Create(theField) != NULL)
522       return pResult->_this();
523     else{
524       pResult->_remove_ref();
525       return VISU::Result::_nil();
526     }
527   }
528
529   Mesh_ptr VISU_Gen_i::MeshOnEntity(Result_ptr theResult,
530                                     const char* theMeshName,
531                                     VISU::Entity theEntity)
532   {
533     if(myStudyDocument->GetProperties()->IsLocked())
534       return Mesh::_nil();
535     Mutex mt(myMutex);
536     if(Result_i* pResult = dynamic_cast<Result_i*>(GetServant(theResult).in())){
537       Mesh_i* aPresent = new Mesh_i(pResult);
538       if(aPresent->Create(theMeshName,theEntity) != NULL)
539         return aPresent->_this();
540       else{
541         aPresent->_remove_ref();
542       }
543     }
544     return VISU::Mesh::_nil();
545   }
546
547   Mesh_ptr VISU_Gen_i::FamilyMeshOnEntity(Result_ptr theResult,
548                                           const char* theMeshName,
549                                           VISU::Entity theEntity,
550                                           const char* theFamilyName)
551   {
552     if(myStudyDocument->GetProperties()->IsLocked())
553       return Mesh::_nil();
554     Mutex mt(myMutex);
555     if(Result_i* pResult = dynamic_cast<Result_i*>(GetServant(theResult).in())){
556       Mesh_i* aPresent = new Mesh_i(pResult);
557       if(aPresent->Create(theMeshName,theEntity,theFamilyName) != NULL)
558         return aPresent->_this();
559       else{
560         aPresent->_remove_ref();
561       }
562     }
563     return VISU::Mesh::_nil();
564   }
565
566   Mesh_ptr VISU_Gen_i::GroupMesh(Result_ptr theResult,
567                                  const char* theMeshName,
568                                  const char* theGroupName)
569   {
570     if(myStudyDocument->GetProperties()->IsLocked())
571       return Mesh::_nil();
572     Mutex mt(myMutex);
573     if(Result_i* pResult = dynamic_cast<Result_i*>(GetServant(theResult).in())){
574       Mesh_i* aPresent = new Mesh_i(pResult);
575       if(aPresent->Create(theMeshName,theGroupName) != NULL)
576         return aPresent->_this();
577       else{
578         aPresent->_remove_ref();
579       }
580     }
581     return VISU::Mesh::_nil();
582   }
583
584   ScalarMap_ptr VISU_Gen_i::ScalarMapOnField(Result_ptr theResult,
585                                              const char* theMeshName,
586                                              VISU::Entity theEntity,
587                                              const char* theFieldName,
588                                              CORBA::Double theIteration)
589   {
590     return Prs3dOnField<VISU::ScalarMap_i>(theResult,theMeshName,theEntity,theFieldName,theIteration,true)._retn();
591   }
592
593   DeformedShape_ptr VISU_Gen_i::DeformedShapeOnField(Result_ptr theResult,
594                                                      const char* theMeshName,
595                                                      VISU::Entity theEntity,
596                                                      const char* theFieldName,
597                                                      CORBA::Double theIteration)
598   {
599     return Prs3dOnField<VISU::DeformedShape_i>(theResult,theMeshName,theEntity,theFieldName,theIteration)._retn();
600   }
601
602   Vectors_ptr VISU_Gen_i::VectorsOnField(Result_ptr theResult,
603                                          const char* theMeshName,
604                                          VISU::Entity theEntity,
605                                          const char* theFieldName,
606                                          CORBA::Double theIteration)
607   {
608     return Prs3dOnField<VISU::Vectors_i>(theResult,theMeshName,theEntity,theFieldName,theIteration)._retn();
609   }
610
611   IsoSurfaces_ptr VISU_Gen_i::IsoSurfacesOnField(Result_ptr theResult,
612                                                  const char* theMeshName,
613                                                  VISU::Entity theEntity,
614                                                  const char* theFieldName,
615                                                  CORBA::Double theIteration)
616   {
617     return Prs3dOnField<VISU::IsoSurfaces_i>(theResult,theMeshName,theEntity,theFieldName,theIteration)._retn();
618   }
619
620   StreamLines_ptr VISU_Gen_i::StreamLinesOnField(Result_ptr theResult,
621                                                  const char* theMeshName,
622                                                  VISU::Entity theEntity,
623                                                  const char* theFieldName,
624                                                  CORBA::Double theIteration)
625   {
626     return Prs3dOnField<VISU::StreamLines_i>(theResult,theMeshName,theEntity,theFieldName,theIteration)._retn();
627   }
628
629   CutPlanes_ptr VISU_Gen_i::CutPlanesOnField(Result_ptr theResult,
630                                              const char* theMeshName,
631                                              VISU::Entity theEntity,
632                                              const char* theFieldName,
633                                              CORBA::Double theIteration)
634   {
635     return Prs3dOnField<VISU::CutPlanes_i>(theResult,theMeshName,theEntity,theFieldName,theIteration)._retn();
636   }
637
638   CutLines_ptr VISU_Gen_i::CutLinesOnField(Result_ptr theResult,
639                                            const char* theMeshName,
640                                            VISU::Entity theEntity,
641                                            const char* theFieldName,
642                                            CORBA::Double theIteration)
643   {
644     return Prs3dOnField<VISU::CutLines_i>(theResult,theMeshName,theEntity,theFieldName,theIteration)._retn();
645   }
646
647   Table_ptr VISU_Gen_i::CreateTable(const char* theTableEntry){
648     if(myStudyDocument->GetProperties()->IsLocked())
649       return Table::_nil();
650     Mutex mt(myMutex);
651     Table_i* pPresent = new Table_i(myStudyDocument,theTableEntry);
652     if(pPresent->Create() != NULL)
653       return pPresent->_this();
654     else{
655       pPresent->_remove_ref();
656       return VISU::Table::_nil();
657     }
658   }
659
660   Curve_ptr VISU_Gen_i::CreateCurve(Table_ptr theTable,
661                                     CORBA::Long theHRow,
662                                     CORBA::Long theVRow)
663   {
664     if(myStudyDocument->GetProperties()->IsLocked())
665       return Curve::_nil();
666     Mutex mt(myMutex);
667     PortableServer::POA_ptr aPOA = GetPOA();
668     Table_i* pTable = dynamic_cast<Table_i*>(aPOA->reference_to_servant(theTable));
669     Curve_i* pPresent = new Curve_i(myStudyDocument,pTable,theHRow,theVRow);
670     if(pPresent->Create() != NULL)
671       return pPresent->_this();
672     else{
673       pPresent->_remove_ref();
674       return VISU::Curve::_nil();
675     }
676   }
677
678   Container_ptr VISU_Gen_i::CreateContainer(){
679     if(myStudyDocument->GetProperties()->IsLocked())
680       return Container::_nil();
681     Mutex mt(myMutex);
682     Container_i* pPresent = new Container_i(myStudyDocument);
683     if(pPresent->Create() != NULL)
684       return pPresent->_this();
685     else{
686       pPresent->_remove_ref();
687       return VISU::Container::_nil();
688     }
689   }
690
691   Animation_ptr VISU_Gen_i::CreateAnimation(View3D_ptr theView3D){
692     if(myStudyDocument->GetProperties()->IsLocked())
693       return Animation::_nil();
694     Mutex mt(myMutex);
695     if(VISU_TimeAnimation_i* anAnim = new VISU_TimeAnimation_i(myStudyDocument,theView3D)){
696       return anAnim->_this();
697     }else
698       return VISU::Animation::_nil();
699   }
700
701   void DeletePrs3d (Prs3d_ptr thePrs3d)
702   {
703     Prs3d_i* aPrs3d = dynamic_cast<Prs3d_i*>(GetServant(thePrs3d).in());
704     if (!aPrs3d)
705       return;
706
707     // 1. Find appropriate application (code like in VISU_ViewManager_i.cxx)
708     SALOMEDS::Study_var myStudyDocument = aPrs3d->GetStudyDocument();
709     SalomeApp_Application* anApp = NULL;
710     CORBA::String_var studyName = myStudyDocument->Name();
711     std::string aStudyName = studyName.in();
712     SUIT_Session* aSession = SUIT_Session::session();
713     QPtrList<SUIT_Application> anApplications = aSession->applications();
714     QPtrListIterator<SUIT_Application> anIter (anApplications);
715     while (SUIT_Application* aSUITApp = anIter.current()) {
716       ++anIter;
717       if (SUIT_Study* aSStudy = aSUITApp->activeStudy()) {
718         if (SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>(aSStudy)) {
719           if (_PTR(Study) aCStudy = aStudy->studyDS()) {
720             if (aStudyName == aCStudy->Name()) {
721               anApp = dynamic_cast<SalomeApp_Application*>(aSUITApp);
722               break;
723             }
724           }
725         }
726       }
727     }
728     if (!anApp)
729       return;
730
731     // 2. Remove corresponding IO from selection
732     SALOMEDS::SObject_var aSObject = aPrs3d->GetSObject();
733     CORBA::String_var anEntry = aSObject->GetID();
734
735     SalomeApp_SelectionMgr* aSelectionMgr = anApp->selectionMgr();
736     SALOME_ListIO aListIO, aNewListIO;
737     aSelectionMgr->selectedObjects(aListIO);
738
739     for (SALOME_ListIteratorOfListIO it (aListIO); it.More(); it.Next()) {
740       if (it.Value()->hasEntry()) {
741         std::string aCurEntry (it.Value()->getEntry());
742         if (aCurEntry != anEntry) {
743           aNewListIO.Append(it.Value());
744         }
745       }
746     }
747
748     aSelectionMgr->setSelectedObjects(aNewListIO);
749
750     // 3. Remove Actors
751     ViewManagerList aViewManagerList;
752     anApp->viewManagers(SVTK_Viewer::Type(), aViewManagerList);
753     QPtrListIterator<SUIT_ViewManager> anVMIter (aViewManagerList);
754     for (; anVMIter.current(); ++anVMIter) {
755       SUIT_ViewManager* aViewManager = anVMIter.current();
756       QPtrVector<SUIT_ViewWindow> aViews = aViewManager->getViews();
757       for (int i = 0, iEnd = aViews.size(); i < iEnd; i++) {
758         if (SUIT_ViewWindow* aViewWindow = aViews.at(i)) {
759           if (SVTK_ViewWindow* vw = dynamic_cast<SVTK_ViewWindow*>(aViewWindow)) {
760             //VISU_Actor* anActor = aVISUViewManager->GetActor(aPrs3d, vw);
761             VISU_Actor* anActor = NULL;
762             vtkActorCollection *anActColl = vw->getRenderer()->GetActors();
763             anActColl->InitTraversal();
764             vtkActor *aVTKActor = anActColl->GetNextActor();
765             for (; !anActor && aVTKActor; aVTKActor = anActColl->GetNextActor()) {
766               if (VISU_Actor* anVISUActor = dynamic_cast<VISU_Actor*>(aVTKActor)) {
767                 if (aPrs3d == anVISUActor->GetPrs3d()) {
768                   anActor = anVISUActor->GetParent();
769                 }
770               }
771             }
772             if (anActor) {
773               vw->RemoveActor(anActor);
774               anActor->Delete();
775             }
776           }
777         }
778       }
779     }
780
781     aPrs3d->RemoveFromStudy();
782     aPrs3d->Destroy();
783
784     //jfa tmp:theModule->updateObjBrowser(); //update Object browser
785   }
786
787   void VISU_Gen_i::DeleteResult (Result_ptr theResult)
788   {
789     class TEvent: public SALOME_Event {
790       Result_ptr myResult;
791     public:
792       TEvent(Result_ptr theResult): myResult(theResult) {}
793       virtual void Execute(){
794         if (Result_i* aResult = dynamic_cast<Result_i*>(GetServant(myResult).in())) {
795           SALOMEDS::SObject_var aSObject = aResult->GetSObject();
796           SALOMEDS::Study_var aStudyDocument = aSObject->GetStudy();
797           SALOMEDS::ChildIterator_var aChildIter = aStudyDocument->NewChildIterator(aSObject);
798           for(aChildIter->InitEx(true); aChildIter->More(); aChildIter->Next()){
799             SALOMEDS::SObject_var aChildSObject = aChildIter->Value();
800             CORBA::Object_var aChildObj = VISU::SObjectToObject(aChildSObject);
801             if(CORBA::is_nil(aChildObj)) continue;
802             VISU::Prs3d_var aPrs3d = VISU::Prs3d::_narrow(aChildObj);
803             if(CORBA::is_nil(aPrs3d)) continue;
804             VISU::DeletePrs3d(aPrs3d);
805           }
806
807           aResult->RemoveFromStudy();
808           aResult->Destroy();
809
810           //jfa tmp:if (QAD_Desktop* aDesktop = QAD_Application::getDesktop())
811           //jfa tmp:  if (QAD_Study* aStudy = aDesktop->findStudy(aStudyDocument))
812           //jfa tmp:    aStudy->updateObjBrowser(); //update Object browser
813         }
814       }
815     };
816
817     if (myStudyDocument->GetProperties()->IsLocked())
818       return;
819     Mutex mt(myMutex); // jfa ???
820
821     ProcessVoidEvent(new TEvent(theResult));
822   }
823
824   void VISU_Gen_i::DeletePrs3d (Prs3d_ptr thePrs3d)
825   {
826     class TEvent: public SALOME_Event {
827       Prs3d_ptr myPrs3d;
828     public:
829       TEvent(Prs3d_ptr thePrs3d): myPrs3d(thePrs3d) {}
830       virtual void Execute() {
831         VISU::DeletePrs3d(myPrs3d);
832       }
833     };
834
835     if (myStudyDocument->GetProperties()->IsLocked())
836       return;
837     Mutex mt(myMutex); // jfa ???
838
839     ProcessVoidEvent(new TEvent(thePrs3d));
840   }
841
842   void VISU_Gen_i::Close(SALOMEDS::SComponent_ptr theComponent){
843   }
844
845   char* VISU_Gen_i::ComponentDataType(){
846     return CORBA::string_dup("VISU");
847   }
848
849   bool VISU_Gen_i::CanPublishInStudy(CORBA::Object_ptr theIOR) {
850     Result_var aResultObj = Result::_narrow(theIOR);
851     return !(aResultObj->_is_nil());
852   }
853
854   SALOMEDS::SObject_ptr VISU_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy,
855                                                    SALOMEDS::SObject_ptr theSObject,
856                                                    CORBA::Object_ptr theObject,
857                                                    const char* theName)
858     throw (SALOME::SALOME_Exception)
859   {
860     Unexpect aCatch(SalomeException);
861     if(MYDEBUG) MESSAGE("VISU_Gen_i::PublishInStudy : "<<myMutex);
862     Mutex mt(myMutex);
863     SALOMEDS::SObject_var aResultSO;
864     Result_i* aResultObj = dynamic_cast<Result_i*>(GetServant(theObject).in());
865     if (!aResultObj) return aResultSO._retn();
866     const QFileInfo& aFileInfo = aResultObj->GetFileInfo();
867     CORBA::String_var anEntry = aResultObj->Create(aFileInfo.filePath().latin1())->GetID();
868     aResultSO = theStudy->FindObjectID(anEntry);
869     return aResultSO._retn();
870   }
871
872   CORBA::Boolean VISU_Gen_i::CanCopy(SALOMEDS::SObject_ptr theObject) {
873     Mutex mt(myMutex);
874     SALOMEDS::GenericAttribute_var anAttr;
875     if (!theObject->FindAttribute(anAttr, "AttributeIOR")) return false;
876     try {
877       SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
878       CORBA::String_var aValue = anIOR->Value();
879       if(strcmp(aValue,"") != 0){
880         CORBA::Object_ptr anObj = GetORB()->string_to_object(aValue);
881         if (!CORBA::is_nil(anObj)){
882           Result_var aResultObj = Result::_narrow(anObj);
883           if(!aResultObj->_is_nil()){
884             if(Result_i* pResult = dynamic_cast<Result_i*>(GetServant(aResultObj).in())){
885               switch(pResult->GetCreationId()){
886               case Result_i::eImportFile:
887               case Result_i::eCopyAndImportFile:
888                 return true;
889               }
890             }
891           }
892         }
893       }
894     }catch(std::exception& exc){
895       INFOS("Follow exception was occured :\n"<<exc.what());
896     }catch (...){
897       INFOS("Unknown exception was occured!");
898     }
899     return false;
900   }
901
902   SALOMEDS::TMPFile* VISU_Gen_i::CopyFrom(SALOMEDS::SObject_ptr theObject, CORBA::Long& theObjectID) {
903     Mutex mt(myMutex);
904     theObjectID = 0;
905     SALOMEDS::TMPFile_var aStreamFile = new SALOMEDS::TMPFile;
906     SALOMEDS::ListOfFileNames_var aSeq = new SALOMEDS::ListOfFileNames;
907
908     PortableServer::POA_ptr aPOA = GetPOA();
909
910     SALOMEDS::GenericAttribute_var anAttr;
911     if (!theObject->FindAttribute(anAttr,"AttributeIOR")) return NULL;
912     SALOMEDS::AttributeIOR_var anIORAttr = SALOMEDS::AttributeIOR::_narrow(anAttr);
913     CORBA::Object_var aCorbaObj;
914     try {
915       aCorbaObj = GetORB()->string_to_object(anIORAttr->Value());
916     } catch(...) {
917       aStreamFile->length(1);
918       aStreamFile[0] = strdup("E")[0];
919       return aStreamFile._retn();
920     }
921     if (CORBA::is_nil(aCorbaObj)) {
922       return NULL;
923     }
924
925     Storable* pStorable = dynamic_cast<Storable*>(GetServant(aCorbaObj).in());
926     if (!pStorable) {
927       return NULL;
928     }
929
930     string aTmpDir = SALOMEDS_Tool::GetTmpDir();
931     string aCopyPersist =  aTmpDir + "copy_persistent";
932
933     ofstream stmOut2(aCopyPersist.c_str(),ios::out);
934     string aStr = pStorable->ToString().c_str();
935     stmOut2<<aStr<<endl;
936     stmOut2.close();
937
938     if (Result_i* aResultObj = dynamic_cast<Result_i*>(aPOA->reference_to_servant(aCorbaObj))) {
939       string aFileName = string(SALOMEDS_Tool::GetNameFromPath(theObject->GetStudy()->URL())) + "_";
940       if(strlen(aFileName.c_str()) == 1) aFileName="";
941       const QFileInfo& aFileInfo = aResultObj->GetFileInfo();
942       aFileName += aFileInfo.fileName().latin1();
943       static QString aCommand;
944       string aFullFileName =  aTmpDir + aFileName;
945       aCommand.sprintf("cp %s %s",
946                        aFileInfo.filePath().latin1(),
947                        aFullFileName.c_str());
948       if(system(aCommand) == -1) {
949         if(MYDEBUG) MESSAGE("VISU_Gen_i::Copy - Cann't execute the command :"<<aCommand);
950         return NULL;
951       }
952       aSeq->length(2);
953       aSeq[0] = "copy_persistent";
954       aSeq[1] = aFileName.c_str();
955     } else {
956       aSeq->length(1);
957       aSeq[0] = "copy_persistent";
958     }
959
960     aStreamFile = SALOMEDS_Tool::PutFilesToStream(aTmpDir.c_str(), aSeq.in(), false);
961     SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir.c_str(), aSeq.in(), true);
962
963     // Assign an ID = 1 the the type VISU::Result
964     theObjectID = 1;
965
966
967     SALOMEDS::SComponent_var aSComponent = theObject->GetStudy()->FindComponent("VISU");
968     return aStreamFile._retn();
969   }
970
971   CORBA::Boolean VISU_Gen_i::CanPaste(const char* theComponentName, CORBA::Long theObjectID) {
972     // The VISU component can paste only objects copied by VISU component
973     // and with the object type = 1
974     if (strcmp(theComponentName, ComponentDataType()) != 0 || theObjectID != 1)
975       return false;
976     return true;
977   }
978
979   SALOMEDS::SObject_ptr VISU_Gen_i::PasteInto(const SALOMEDS::TMPFile& theStream,
980                                               CORBA::Long theObjectID,
981                                               SALOMEDS::SObject_ptr theObject)
982   {
983     Mutex mt(myMutex);
984     SALOMEDS::SObject_var aResultSO;
985     if (theObjectID != 1)
986       return aResultSO._retn();
987
988     string aTmpDir = SALOMEDS_Tool::GetTmpDir();
989     SALOMEDS::ListOfFileNames_var aSeq = SALOMEDS_Tool::PutStreamToFiles(theStream, aTmpDir.c_str(), false);
990
991     ifstream stmIn((aTmpDir + string("copy_persistent")).c_str());
992     stmIn.seekg(0, ios::end);
993     int aLength = stmIn.tellg();
994     stmIn.seekg(0, ios::beg);
995     char* aString = new char[aLength+1];
996     stmIn.read(aString, aLength);
997     aString[aLength] = 0;
998     myIsMultiFile = false;
999
1000     string aFileName(aTmpDir);
1001     string aBasicFileName;
1002     if(aSeq->length() > 1) {
1003       aBasicFileName = aSeq[1].in();
1004       aFileName += aBasicFileName;
1005     }
1006
1007     SALOMEDS::SComponent_var aComponent = theObject->GetFatherComponent();
1008     SALOMEDS::Study_var aStudy = theObject->GetStudy();
1009     SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder();
1010     CORBA::String_var aComponentID(aComponent->GetID()), aSObjID(theObject->GetID());
1011
1012     if (strcmp(aComponentID, aSObjID) == 0) //create the new result SObject
1013       aResultSO = aStudyBuilder->NewObject(aComponent);
1014     else
1015       aResultSO = SALOMEDS::SObject::_duplicate(theObject);
1016
1017     //Just for Result::Restore to find the Comment attribute :(
1018     SALOMEDS::GenericAttribute_var anAttr = aStudyBuilder->FindOrCreateAttribute(aResultSO, "AttributeComment");
1019
1020     Storable* aStorable = Storable::Create(aResultSO,aFileName,aString);
1021
1022     SALOMEDS::ListOfFileNames_var aSeqToRm = new SALOMEDS::ListOfFileNames;
1023     aSeqToRm->length(1);
1024     aSeqToRm[0] = "copy_persistent";
1025
1026     SALOMEDS_Tool::RemoveTemporaryFiles(aTmpDir.c_str(), aSeqToRm.in(), true);
1027
1028     anAttr = aStudyBuilder->FindOrCreateAttribute(aResultSO, "AttributeIOR");
1029     SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
1030     CORBA::String_var anIORValue(aStorable->GetID());
1031     anIOR->SetValue(anIORValue);
1032     return aResultSO._retn();
1033   }
1034
1035 }