1 // File : SALOMEDS_StudyBuilder_i.cxx
2 // Author : Seregy RUIN
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"
15 #include "SALOMEDSImpl_Study.hxx"
16 #include "SALOMEDSImpl_SObject.hxx"
17 #include "SALOMEDSImpl_SComponent.hxx"
19 #include "Utils_CorbaException.hxx"
20 #include "Utils_ExceptHandlers.hxx"
22 #include <TDF_Attribute.hxx>
27 UNEXPECT_CATCH(SBSalomeException, SALOME::SALOME_Exception);
28 UNEXPECT_CATCH(SBLockProtection, SALOMEDS::StudyBuilder::LockProtection);
30 //============================================================================
31 /*! Function : constructor
34 //============================================================================
35 SALOMEDS_StudyBuilder_i::SALOMEDS_StudyBuilder_i(const Handle(SALOMEDSImpl_StudyBuilder) theImpl,
38 _orb = CORBA::ORB::_duplicate(orb);
42 //============================================================================
43 /*! Function : destructor
46 //============================================================================
47 SALOMEDS_StudyBuilder_i::~SALOMEDS_StudyBuilder_i()
50 //============================================================================
51 /*! Function : NewComponent
52 * Purpose : Create a new component (Scomponent)
54 //============================================================================
55 SALOMEDS::SComponent_ptr SALOMEDS_StudyBuilder_i::NewComponent(const char* DataType)
57 SALOMEDS::Locker lock;
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();
64 SALOMEDS::SComponent_var sco = SALOMEDS_SComponent_i::New (aSCO,_orb);
68 //============================================================================
69 /*! Function : DefineComponentInstance
70 * Purpose : Add IOR attribute of a Scomponent
72 //============================================================================
73 void SALOMEDS_StudyBuilder_i::DefineComponentInstance(SALOMEDS::SComponent_ptr aComponent,
74 CORBA::Object_ptr IOR)
76 SALOMEDS::Locker lock;
78 Handle(SALOMEDSImpl_SComponent) aSCO;
79 aSCO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSComponent((char*)aComponent->GetID());
81 CORBA::String_var iorstr = _orb->object_to_string(IOR);
82 _impl->DefineComponentInstance(aSCO, (char*)iorstr);
85 //============================================================================
86 /*! Function : RemoveComponent
87 * Purpose : Delete a Scomponent
89 //============================================================================
90 void SALOMEDS_StudyBuilder_i::RemoveComponent(SALOMEDS::SComponent_ptr aComponent)
92 SALOMEDS::Locker lock;
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);
100 //============================================================================
101 /*! Function : NewObject
102 * Purpose : Create a new SObject
104 //============================================================================
105 SALOMEDS::SObject_ptr SALOMEDS_StudyBuilder_i::NewObject(SALOMEDS::SObject_ptr theFatherObject)
107 SALOMEDS::Locker lock;
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);
119 //============================================================================
120 /*! Function : NewObjectToTag
123 //============================================================================
124 SALOMEDS::SObject_ptr SALOMEDS_StudyBuilder_i::NewObjectToTag(SALOMEDS::SObject_ptr theFatherObject,
127 SALOMEDS::Locker lock;
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);
137 //============================================================================
138 /*! Function : RemoveObject
141 //============================================================================
142 void SALOMEDS_StudyBuilder_i::RemoveObject(SALOMEDS::SObject_ptr anObject)
144 SALOMEDS::Locker lock;
146 Handle(SALOMEDSImpl_SObject) aSO;
147 aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)anObject->GetID());
148 _impl->RemoveObject(aSO);
151 //============================================================================
152 /*! Function : RemoveObjectWithChildren
155 //============================================================================
156 void SALOMEDS_StudyBuilder_i::RemoveObjectWithChildren(SALOMEDS::SObject_ptr anObject)
158 SALOMEDS::Locker lock;
160 Handle(SALOMEDSImpl_SObject) aSO;
161 aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)anObject->GetID());
162 _impl->RemoveObjectWithChildren(aSO);
165 //============================================================================
166 /*! Function : LoadWith
169 //============================================================================
170 void SALOMEDS_StudyBuilder_i::LoadWith(SALOMEDS::SComponent_ptr anSCO,
171 SALOMEDS::Driver_ptr aDriver) throw(SALOME::SALOME_Exception)
173 SALOMEDS::Locker lock;
174 Unexpect aCatch(SBSalomeException);
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);
182 if(!isDone && _impl->IsError()) {
183 THROW_SALOME_CORBA_EXCEPTION(_impl->GetErrorCode().ToCString(),SALOME::BAD_PARAM);
188 //============================================================================
192 //============================================================================
193 void SALOMEDS_StudyBuilder_i::Load(SALOMEDS::SObject_ptr sco)
195 MESSAGE ( "This function is not yet implemented");
198 //============================================================================
199 /*! Function : FindOrCreateAttribute
200 * Purpose : Add attribute of given type to SObject, if there is attribute of such type, returns
203 //============================================================================
204 SALOMEDS::GenericAttribute_ptr SALOMEDS_StudyBuilder_i::FindOrCreateAttribute(SALOMEDS::SObject_ptr anObject,
205 const char* aTypeOfAttribute)
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;
213 anAttr = _impl->FindOrCreateAttribute(aSO, TCollection_AsciiString((char*)aTypeOfAttribute));
216 throw SALOMEDS::StudyBuilder::LockProtection();
219 SALOMEDS::GenericAttribute_var anAttribute;
220 anAttribute = SALOMEDS::GenericAttribute::_duplicate(SALOMEDS_GenericAttribute_i::CreateAttribute(anAttr, _orb));
222 return anAttribute._retn();
225 //============================================================================
226 /*! Function : FindAttribute
227 * Purpose : Find attribute of given type assigned SObject, returns Standard_True if it is found
229 //============================================================================
231 CORBA::Boolean SALOMEDS_StudyBuilder_i::FindAttribute(SALOMEDS::SObject_ptr anObject,
232 SALOMEDS::GenericAttribute_out anAttribute,
233 const char* aTypeOfAttribute)
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;
241 if(!_impl->FindAttribute(aSO, anAttr, TCollection_AsciiString((char*)aTypeOfAttribute))) return false;
243 anAttribute = SALOMEDS::GenericAttribute::_duplicate(SALOMEDS_GenericAttribute_i::CreateAttribute(anAttr, _orb));
247 //============================================================================
248 /*! Function : RemoveAttribute
249 * Purpose : Remove attribute of given type assigned SObject
251 //============================================================================
253 void SALOMEDS_StudyBuilder_i::RemoveAttribute(SALOMEDS::SObject_ptr anObject,
254 const char* aTypeOfAttribute)
256 SALOMEDS::Locker lock;
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));
264 //============================================================================
265 /*! Function : Addreference
268 //============================================================================
269 void SALOMEDS_StudyBuilder_i::Addreference(SALOMEDS::SObject_ptr me,
270 SALOMEDS::SObject_ptr theReferencedObject)
272 SALOMEDS::Locker lock;
274 ASSERT(!CORBA::is_nil(me));
275 ASSERT(!CORBA::is_nil(theReferencedObject));
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);
283 //============================================================================
284 /*! Function : RemoveReference
287 //============================================================================
288 void SALOMEDS_StudyBuilder_i::RemoveReference(SALOMEDS::SObject_ptr me)
290 SALOMEDS::Locker lock;
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);
299 //============================================================================
300 /*! Function : AddDirectory
301 * Purpose : adds a new directory with a path = thePath
303 //============================================================================
304 void SALOMEDS_StudyBuilder_i::AddDirectory(const char* thePath)
306 SALOMEDS::Locker lock;
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();
318 //============================================================================
319 /*! Function : SetGUID
322 //============================================================================
323 void SALOMEDS_StudyBuilder_i::SetGUID(SALOMEDS::SObject_ptr anObject, const char* theGUID)
325 SALOMEDS::Locker lock;
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));
333 //============================================================================
334 /*! Function : IsGUID
337 //============================================================================
338 bool SALOMEDS_StudyBuilder_i::IsGUID(SALOMEDS::SObject_ptr anObject, const char* theGUID)
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));
348 //============================================================================
349 /*! Function : NewCommand
352 //============================================================================
353 void SALOMEDS_StudyBuilder_i::NewCommand()
355 SALOMEDS::Locker lock;
359 //============================================================================
360 /*! Function : CommitCommand
363 //============================================================================
364 void SALOMEDS_StudyBuilder_i::CommitCommand() throw (SALOMEDS::StudyBuilder::LockProtection)
366 SALOMEDS::Locker lock;
367 Unexpect aCatch(SBLockProtection);
369 _impl->CommitCommand();
372 MESSAGE("Locked document modification !!!");
373 throw SALOMEDS::StudyBuilder::LockProtection();
377 //============================================================================
378 /*! Function : HasOpenCommand
381 //============================================================================
382 CORBA::Boolean SALOMEDS_StudyBuilder_i::HasOpenCommand()
384 SALOMEDS::Locker lock;
385 return _impl->HasOpenCommand();
388 //============================================================================
389 /*! Function : AbortCommand
392 //============================================================================
393 void SALOMEDS_StudyBuilder_i::AbortCommand()
395 SALOMEDS::Locker lock;
396 _impl->AbortCommand();
399 //============================================================================
403 //============================================================================
404 void SALOMEDS_StudyBuilder_i::Undo() throw (SALOMEDS::StudyBuilder::LockProtection)
406 SALOMEDS::Locker lock;
407 Unexpect aCatch(SBLockProtection);
412 MESSAGE("Locked document modification !!!");
413 throw SALOMEDS::StudyBuilder::LockProtection();
417 //============================================================================
421 //============================================================================
422 void SALOMEDS_StudyBuilder_i::Redo() throw (SALOMEDS::StudyBuilder::LockProtection)
424 SALOMEDS::Locker lock;
425 Unexpect aCatch(SBLockProtection);
430 MESSAGE("Locked document modification !!!");
431 throw SALOMEDS::StudyBuilder::LockProtection();
435 //============================================================================
436 /*! Function : GetAvailableUndos
439 //============================================================================
440 CORBA::Boolean SALOMEDS_StudyBuilder_i::GetAvailableUndos()
442 SALOMEDS::Locker lock;
443 return _impl->GetAvailableUndos();
446 //============================================================================
447 /*! Function : GetAvailableRedos
450 //============================================================================
451 CORBA::Boolean SALOMEDS_StudyBuilder_i::GetAvailableRedos()
453 SALOMEDS::Locker lock;
454 return _impl->GetAvailableRedos();
457 //============================================================================
458 /*! Function : UndoLimit
461 //============================================================================
462 CORBA::Long SALOMEDS_StudyBuilder_i::UndoLimit()
464 SALOMEDS::Locker lock;
465 return _impl->UndoLimit();
468 //============================================================================
469 /*! Function : UndoLimit
472 //============================================================================
473 void SALOMEDS_StudyBuilder_i::UndoLimit(CORBA::Long n)
475 SALOMEDS::Locker lock;
480 //============================================================================
481 /*! Function : CheckLocked
484 //============================================================================
485 void SALOMEDS_StudyBuilder_i::CheckLocked() throw (SALOMEDS::StudyBuilder::LockProtection)
487 SALOMEDS::Locker lock;
488 Unexpect aCatch(SBLockProtection);
490 _impl->CheckLocked();
493 throw SALOMEDS::StudyBuilder::LockProtection();
497 //============================================================================
498 /*! Function : SetName
501 //============================================================================
502 void SALOMEDS_StudyBuilder_i::SetName(SALOMEDS::SObject_ptr theSO, const char* theValue)
503 throw(SALOMEDS::StudyBuilder::LockProtection)
505 SALOMEDS::Locker lock;
506 Unexpect aCatch(SBLockProtection);
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));
514 //============================================================================
515 /*! Function : SetComment
518 //============================================================================
519 void SALOMEDS_StudyBuilder_i::SetComment(SALOMEDS::SObject_ptr theSO, const char* theValue)
520 throw(SALOMEDS::StudyBuilder::LockProtection)
522 SALOMEDS::Locker lock;
523 Unexpect aCatch(SBLockProtection);
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));
531 //============================================================================
532 /*! Function : SetIOR
535 //============================================================================
536 void SALOMEDS_StudyBuilder_i::SetIOR(SALOMEDS::SObject_ptr theSO, const char* theValue)
537 throw(SALOMEDS::StudyBuilder::LockProtection)
539 SALOMEDS::Locker lock;
540 Unexpect aCatch(SBLockProtection);
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));