]> SALOME platform Git repositories - modules/yacs.git/blob - src/SALOMEDS/SALOMEDS_StudyBuilder_i.cxx
Salome HOME
PR: merge from branch BR_UT_V310a3 tag mergeto_trunk_05dec05
[modules/yacs.git] / src / SALOMEDS / SALOMEDS_StudyBuilder_i.cxx
1 //  File   : SALOMEDS_StudyBuilder_i.cxx
2 //  Author : Seregy RUIN
3 //  Module : SALOME
4
5
6 #include "utilities.h"
7 #include "SALOMEDS_StudyBuilder_i.hxx"
8 #include "SALOMEDS_Study_i.hxx"
9 #include "SALOMEDS_SObject_i.hxx"
10 #include "SALOMEDS_SComponent_i.hxx"
11 #include "SALOMEDS_GenericAttribute_i.hxx"
12 #include "SALOMEDS_Driver_i.hxx"
13 #include "SALOMEDS.hxx"
14
15 #include "SALOMEDSImpl_Study.hxx"
16 #include "SALOMEDSImpl_SObject.hxx"
17 #include "SALOMEDSImpl_SComponent.hxx"
18
19 #include "Utils_CorbaException.hxx"
20 #include "Utils_ExceptHandlers.hxx"
21
22 #include <TDF_Attribute.hxx>
23 #include <stdlib.h> 
24
25 using namespace std;
26
27 UNEXPECT_CATCH(SBSalomeException, SALOME::SALOME_Exception);
28 UNEXPECT_CATCH(SBLockProtection, SALOMEDS::StudyBuilder::LockProtection);
29
30 //============================================================================
31 /*! Function : constructor
32  *  Purpose  :
33  */
34 //============================================================================
35 SALOMEDS_StudyBuilder_i::SALOMEDS_StudyBuilder_i(const Handle(SALOMEDSImpl_StudyBuilder) theImpl, 
36                                                  CORBA::ORB_ptr orb) 
37 {
38   _orb = CORBA::ORB::_duplicate(orb);
39   _impl = theImpl;
40 }
41
42 //============================================================================
43 /*! Function : destructor
44  *  Purpose  :
45  */
46 //============================================================================
47 SALOMEDS_StudyBuilder_i::~SALOMEDS_StudyBuilder_i()
48 {}
49
50 //============================================================================
51 /*! Function : NewComponent
52  *  Purpose  : Create a new component (Scomponent)
53  */
54 //============================================================================
55 SALOMEDS::SComponent_ptr SALOMEDS_StudyBuilder_i::NewComponent(const char* DataType)
56 {
57   SALOMEDS::Locker lock;
58   CheckLocked();
59   //char* aDataType = CORBA::string_dup(DataType);
60   Handle(SALOMEDSImpl_SComponent) aSCO = _impl->NewComponent(TCollection_AsciiString((char*)DataType));
61   //CORBA::free_string(aDataType);
62   if(aSCO.IsNull()) return SALOMEDS::SComponent::_nil();
63
64   SALOMEDS::SComponent_var sco = SALOMEDS_SComponent_i::New (aSCO,_orb);
65   return sco._retn();
66 }
67
68 //============================================================================
69 /*! Function : DefineComponentInstance
70  *  Purpose  : Add IOR attribute of a Scomponent
71  */
72 //============================================================================
73 void SALOMEDS_StudyBuilder_i::DefineComponentInstance(SALOMEDS::SComponent_ptr aComponent,
74                                                       CORBA::Object_ptr IOR)
75 {
76   SALOMEDS::Locker lock;
77   CheckLocked();
78   Handle(SALOMEDSImpl_SComponent) aSCO;
79   aSCO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSComponent((char*)aComponent->GetID());
80
81   CORBA::String_var iorstr = _orb->object_to_string(IOR);
82   _impl->DefineComponentInstance(aSCO, (char*)iorstr);
83 }
84
85 //============================================================================
86 /*! Function : RemoveComponent
87  *  Purpose  : Delete a Scomponent
88  */
89 //============================================================================
90 void SALOMEDS_StudyBuilder_i::RemoveComponent(SALOMEDS::SComponent_ptr aComponent)
91 {
92   SALOMEDS::Locker lock;
93   CheckLocked();
94   ASSERT(!CORBA::is_nil(aComponent));
95   Handle(SALOMEDSImpl_SComponent) aSCO;
96   aSCO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSComponent((char*)aComponent->GetID());
97   _impl->RemoveComponent(aSCO);
98 }
99
100 //============================================================================
101 /*! Function : NewObject
102  *  Purpose  : Create a new SObject
103  */
104 //============================================================================
105 SALOMEDS::SObject_ptr SALOMEDS_StudyBuilder_i::NewObject(SALOMEDS::SObject_ptr theFatherObject)
106 {
107   SALOMEDS::Locker lock;
108   CheckLocked();
109   
110   Handle(SALOMEDSImpl_SObject) aFO, aSO;
111   aFO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)theFatherObject->GetID());
112   aSO = _impl->NewObject(aFO);
113   if(aSO.IsNull()) return SALOMEDS::SObject::_nil();
114   SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aSO,_orb);
115
116   return so._retn();
117 }
118
119 //============================================================================
120 /*! Function : NewObjectToTag
121  *  Purpose  :
122  */
123 //============================================================================
124 SALOMEDS::SObject_ptr SALOMEDS_StudyBuilder_i::NewObjectToTag(SALOMEDS::SObject_ptr theFatherObject,
125                                                               CORBA::Long atag)
126 {
127   SALOMEDS::Locker lock;
128   CheckLocked();
129   Handle(SALOMEDSImpl_SObject) aFO, aSO;
130   aFO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)theFatherObject->GetID());
131   aSO = _impl->NewObjectToTag(aFO, atag);
132   if(aSO.IsNull()) return SALOMEDS::SObject::_nil();
133   SALOMEDS::SObject_var so = SALOMEDS_SObject_i::New (aSO, _orb);
134   return so._retn();
135 }
136
137 //============================================================================
138 /*! Function : RemoveObject
139  *  Purpose  :
140  */
141 //============================================================================
142 void SALOMEDS_StudyBuilder_i::RemoveObject(SALOMEDS::SObject_ptr anObject)
143 {
144   SALOMEDS::Locker lock;
145   CheckLocked();
146   Handle(SALOMEDSImpl_SObject) aSO;
147   aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)anObject->GetID());
148   _impl->RemoveObject(aSO);
149 }
150
151 //============================================================================
152 /*! Function : RemoveObjectWithChildren
153  *  Purpose  :
154  */
155 //============================================================================
156 void SALOMEDS_StudyBuilder_i::RemoveObjectWithChildren(SALOMEDS::SObject_ptr anObject)
157 {
158   SALOMEDS::Locker lock;
159   CheckLocked();
160   Handle(SALOMEDSImpl_SObject) aSO;
161   aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)anObject->GetID());
162   _impl->RemoveObjectWithChildren(aSO);
163 }
164
165 //============================================================================
166 /*! Function : LoadWith
167  *  Purpose  : 
168  */
169 //============================================================================
170 void SALOMEDS_StudyBuilder_i::LoadWith(SALOMEDS::SComponent_ptr anSCO, 
171                                        SALOMEDS::Driver_ptr aDriver) throw(SALOME::SALOME_Exception)
172 {
173   SALOMEDS::Locker lock;
174   Unexpect aCatch(SBSalomeException);
175
176   Handle(SALOMEDSImpl_SComponent) aSCO;
177   aSCO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSComponent((char*)anSCO->GetID());
178   SALOMEDS_Driver_i* driver = new SALOMEDS_Driver_i(aDriver, _orb);
179    bool isDone = _impl->LoadWith(aSCO, driver); 
180   delete driver;
181
182   if(!isDone && _impl->IsError()) {
183     THROW_SALOME_CORBA_EXCEPTION(_impl->GetErrorCode().ToCString(),SALOME::BAD_PARAM);
184   }
185 }
186
187
188 //============================================================================
189 /*! Function : Load
190  *  Purpose  : 
191  */
192 //============================================================================
193 void SALOMEDS_StudyBuilder_i::Load(SALOMEDS::SObject_ptr sco)
194 {
195   MESSAGE ( "This function is not yet implemented");
196 }
197
198 //============================================================================
199 /*! Function : FindOrCreateAttribute
200  *  Purpose  : Add attribute of given type to SObject, if there is attribute of such type, returns
201  *  existing one
202  */
203 //============================================================================
204 SALOMEDS::GenericAttribute_ptr SALOMEDS_StudyBuilder_i::FindOrCreateAttribute(SALOMEDS::SObject_ptr anObject, 
205                                                                               const char* aTypeOfAttribute)
206 {
207   SALOMEDS::Locker lock;
208   Handle(SALOMEDSImpl_SObject) aSO;
209   CORBA::String_var anID = anObject->GetID();
210   aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject(anID.inout());
211   Handle(TDF_Attribute) anAttr;
212   try {
213      anAttr = _impl->FindOrCreateAttribute(aSO, TCollection_AsciiString((char*)aTypeOfAttribute));
214   }
215   catch (...) {
216     throw SALOMEDS::StudyBuilder::LockProtection();
217   }
218
219   SALOMEDS::GenericAttribute_var anAttribute;
220   anAttribute = SALOMEDS::GenericAttribute::_duplicate(SALOMEDS_GenericAttribute_i::CreateAttribute(anAttr, _orb));
221
222   return anAttribute._retn();
223 }
224
225 //============================================================================
226 /*! Function : FindAttribute
227  *  Purpose  : Find attribute of given type assigned SObject, returns Standard_True if it is found
228  */
229 //============================================================================
230
231 CORBA::Boolean SALOMEDS_StudyBuilder_i::FindAttribute(SALOMEDS::SObject_ptr anObject, 
232                                                       SALOMEDS::GenericAttribute_out anAttribute, 
233                                                       const char* aTypeOfAttribute)
234 {
235   SALOMEDS::Locker lock;
236   ASSERT(!CORBA::is_nil(anObject));
237   Handle(SALOMEDSImpl_SObject) aSO;
238   aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)anObject->GetID());
239   Handle(TDF_Attribute) anAttr;
240
241   if(!_impl->FindAttribute(aSO, anAttr, TCollection_AsciiString((char*)aTypeOfAttribute))) return false;
242     
243   anAttribute = SALOMEDS::GenericAttribute::_duplicate(SALOMEDS_GenericAttribute_i::CreateAttribute(anAttr, _orb));
244   return true;  
245 }
246
247 //============================================================================
248 /*! Function : RemoveAttribute
249  *  Purpose  : Remove attribute of given type assigned SObject
250  */
251 //============================================================================
252
253 void SALOMEDS_StudyBuilder_i::RemoveAttribute(SALOMEDS::SObject_ptr anObject, 
254                                               const char* aTypeOfAttribute)
255 {
256   SALOMEDS::Locker lock;
257   CheckLocked();
258   ASSERT(!CORBA::is_nil(anObject));
259   Handle(SALOMEDSImpl_SObject) aSO;
260   aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)anObject->GetID());
261   _impl->RemoveAttribute(aSO, TCollection_AsciiString((char*)aTypeOfAttribute));
262 }
263
264 //============================================================================
265 /*! Function : Addreference
266  *  Purpose  : 
267  */
268 //============================================================================
269 void SALOMEDS_StudyBuilder_i::Addreference(SALOMEDS::SObject_ptr me, 
270                                            SALOMEDS::SObject_ptr theReferencedObject)
271 {
272   SALOMEDS::Locker lock;
273   CheckLocked();
274   ASSERT(!CORBA::is_nil(me));
275   ASSERT(!CORBA::is_nil(theReferencedObject));
276  
277   Handle(SALOMEDSImpl_SObject) aSO, aRefSO;
278   aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)me->GetID());
279   aRefSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)theReferencedObject->GetID());
280   _impl->Addreference(aSO, aRefSO);
281 }
282
283 //============================================================================
284 /*! Function : RemoveReference
285  *  Purpose  : 
286  */
287 //============================================================================
288 void SALOMEDS_StudyBuilder_i::RemoveReference(SALOMEDS::SObject_ptr me)
289 {
290   SALOMEDS::Locker lock;
291   CheckLocked();
292   ASSERT(!CORBA::is_nil(me));
293   Handle(SALOMEDSImpl_SObject) aSO;
294   aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)me->GetID());
295   _impl->RemoveReference(aSO);
296 }
297
298
299 //============================================================================
300 /*! Function : AddDirectory
301  *  Purpose  : adds a new directory with a path = thePath
302  */
303 //============================================================================
304 void SALOMEDS_StudyBuilder_i::AddDirectory(const char* thePath) 
305 {
306   SALOMEDS::Locker lock;
307   CheckLocked();
308   if(thePath == NULL || strlen(thePath) == 0) throw SALOMEDS::Study::StudyInvalidDirectory();
309   if(!_impl->AddDirectory(TCollection_AsciiString((char*)thePath))) {
310     TCollection_AsciiString anErrorCode = _impl->GetErrorCode();
311     if(anErrorCode == "StudyNameAlreadyUsed") throw SALOMEDS::Study::StudyNameAlreadyUsed(); 
312     if(anErrorCode == "StudyInvalidDirectory") throw SALOMEDS::Study::StudyInvalidDirectory(); 
313     if(anErrorCode == "StudyInvalidComponent") throw SALOMEDS::Study::StudyInvalidComponent();  
314   }
315 }
316
317
318 //============================================================================
319 /*! Function : SetGUID
320  *  Purpose  : 
321  */
322 //============================================================================
323 void SALOMEDS_StudyBuilder_i::SetGUID(SALOMEDS::SObject_ptr anObject, const char* theGUID)
324 {
325   SALOMEDS::Locker lock;
326   CheckLocked();
327   ASSERT(!CORBA::is_nil(anObject));
328   Handle(SALOMEDSImpl_SObject) aSO;
329   aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)anObject->GetID());
330   _impl->SetGUID(aSO, TCollection_AsciiString((char*)theGUID));
331 }
332
333 //============================================================================
334 /*! Function : IsGUID
335  *  Purpose  : 
336  */
337 //============================================================================
338 bool SALOMEDS_StudyBuilder_i::IsGUID(SALOMEDS::SObject_ptr anObject, const char* theGUID)
339 {
340   SALOMEDS::Locker lock;
341   ASSERT(!CORBA::is_nil(anObject));
342   Handle(SALOMEDSImpl_SObject) aSO;
343   aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)anObject->GetID());
344   return _impl->IsGUID(aSO, TCollection_AsciiString((char*)theGUID));
345 }
346
347
348 //============================================================================
349 /*! Function : NewCommand
350  *  Purpose  : 
351  */
352 //============================================================================
353 void SALOMEDS_StudyBuilder_i::NewCommand()
354 {
355   SALOMEDS::Locker lock;
356   _impl->NewCommand();
357 }
358
359 //============================================================================
360 /*! Function : CommitCommand
361  *  Purpose  : 
362  */
363 //============================================================================
364 void SALOMEDS_StudyBuilder_i::CommitCommand() throw (SALOMEDS::StudyBuilder::LockProtection)
365 {
366   SALOMEDS::Locker lock;
367   Unexpect aCatch(SBLockProtection);
368   try {
369     _impl->CommitCommand();
370   }
371   catch(...) {
372     MESSAGE("Locked document modification !!!");
373     throw SALOMEDS::StudyBuilder::LockProtection();
374   }
375 }
376
377 //============================================================================
378 /*! Function : HasOpenCommand
379  *  Purpose  : 
380  */
381 //============================================================================
382 CORBA::Boolean SALOMEDS_StudyBuilder_i::HasOpenCommand()
383 {
384   SALOMEDS::Locker lock;
385   return _impl->HasOpenCommand();
386 }
387
388 //============================================================================
389 /*! Function : AbortCommand
390  *  Purpose  : 
391  */
392 //============================================================================
393 void SALOMEDS_StudyBuilder_i::AbortCommand()
394 {
395   SALOMEDS::Locker lock;
396   _impl->AbortCommand();
397 }
398
399 //============================================================================
400 /*! Function : Undo
401  *  Purpose  : 
402  */
403 //============================================================================
404 void SALOMEDS_StudyBuilder_i::Undo() throw (SALOMEDS::StudyBuilder::LockProtection)
405 {
406   SALOMEDS::Locker lock;
407   Unexpect aCatch(SBLockProtection);
408   try {
409     _impl->Undo();
410   }
411   catch(...) {
412     MESSAGE("Locked document modification !!!");
413     throw SALOMEDS::StudyBuilder::LockProtection();
414   }
415 }
416
417 //============================================================================
418 /*! Function : Redo
419  *  Purpose  : 
420  */
421 //============================================================================
422 void SALOMEDS_StudyBuilder_i::Redo() throw (SALOMEDS::StudyBuilder::LockProtection)
423 {
424   SALOMEDS::Locker lock;
425   Unexpect aCatch(SBLockProtection);
426   try {
427     _impl->Redo();
428   }
429   catch(...) {
430     MESSAGE("Locked document modification !!!");
431     throw SALOMEDS::StudyBuilder::LockProtection();
432   }
433 }
434
435 //============================================================================
436 /*! Function : GetAvailableUndos
437  *  Purpose  : 
438  */
439 //============================================================================
440 CORBA::Boolean SALOMEDS_StudyBuilder_i::GetAvailableUndos()
441 {
442   SALOMEDS::Locker lock;
443   return _impl->GetAvailableUndos();
444 }
445
446 //============================================================================
447 /*! Function : GetAvailableRedos
448  *  Purpose  : 
449  */
450 //============================================================================
451 CORBA::Boolean  SALOMEDS_StudyBuilder_i::GetAvailableRedos()
452 {
453   SALOMEDS::Locker lock;
454   return _impl->GetAvailableRedos();
455 }
456
457 //============================================================================
458 /*! Function : UndoLimit
459  *  Purpose  : 
460  */
461 //============================================================================
462 CORBA::Long  SALOMEDS_StudyBuilder_i::UndoLimit()
463 {
464   SALOMEDS::Locker lock;
465   return _impl->UndoLimit();
466 }
467
468 //============================================================================
469 /*! Function : UndoLimit
470  *  Purpose  : 
471  */
472 //============================================================================
473 void  SALOMEDS_StudyBuilder_i::UndoLimit(CORBA::Long n)
474 {
475   SALOMEDS::Locker lock;
476   CheckLocked();
477   _impl->UndoLimit(n);
478 }
479
480 //============================================================================
481 /*! Function : CheckLocked
482  *  Purpose  : 
483  */
484 //============================================================================
485 void SALOMEDS_StudyBuilder_i::CheckLocked() throw (SALOMEDS::StudyBuilder::LockProtection) 
486 {
487   SALOMEDS::Locker lock;
488   Unexpect aCatch(SBLockProtection);
489   try {
490     _impl->CheckLocked();
491   }
492   catch(...) {
493     throw SALOMEDS::StudyBuilder::LockProtection();
494   }
495 }
496
497 //============================================================================
498 /*! Function : SetName
499  *  Purpose  : 
500  */
501 //============================================================================
502 void SALOMEDS_StudyBuilder_i::SetName(SALOMEDS::SObject_ptr theSO, const char* theValue)
503      throw(SALOMEDS::StudyBuilder::LockProtection)
504 {
505   SALOMEDS::Locker lock;
506   Unexpect aCatch(SBLockProtection);
507   CheckLocked();
508  
509   Handle(SALOMEDSImpl_SObject) aSO;
510   aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)theSO->GetID());  
511   _impl->SetName(aSO, TCollection_AsciiString((char*)theValue));
512 }
513
514 //============================================================================
515 /*! Function : SetComment
516  *  Purpose  : 
517  */
518 //============================================================================
519 void SALOMEDS_StudyBuilder_i::SetComment(SALOMEDS::SObject_ptr theSO, const char* theValue)
520      throw(SALOMEDS::StudyBuilder::LockProtection)
521 {
522   SALOMEDS::Locker lock;
523   Unexpect aCatch(SBLockProtection);
524   CheckLocked();
525
526   Handle(SALOMEDSImpl_SObject) aSO;
527   aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)theSO->GetID());  
528   _impl->SetComment(aSO, TCollection_AsciiString((char*)theValue));
529 }
530
531 //============================================================================
532 /*! Function : SetIOR
533  *  Purpose  : 
534  */
535 //============================================================================
536 void SALOMEDS_StudyBuilder_i::SetIOR(SALOMEDS::SObject_ptr theSO, const char* theValue)
537  throw(SALOMEDS::StudyBuilder::LockProtection)
538 {
539   SALOMEDS::Locker lock;
540   Unexpect aCatch(SBLockProtection);
541   CheckLocked();
542
543   Handle(SALOMEDSImpl_SObject) aSO;
544   aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)theSO->GetID());  
545   _impl->SetIOR(aSO, TCollection_AsciiString((char*)theValue));
546 }