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 char* anID = anObject->GetID();
210 aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject(anID);
212 Handle(TDF_Attribute) anAttr;
214 anAttr = _impl->FindOrCreateAttribute(aSO, TCollection_AsciiString((char*)aTypeOfAttribute));
217 throw SALOMEDS::StudyBuilder::LockProtection();
220 SALOMEDS::GenericAttribute_var anAttribute;
221 anAttribute = SALOMEDS::GenericAttribute::_duplicate(SALOMEDS_GenericAttribute_i::CreateAttribute(anAttr, _orb));
223 return anAttribute._retn();
226 //============================================================================
227 /*! Function : FindAttribute
228 * Purpose : Find attribute of given type assigned SObject, returns Standard_True if it is found
230 //============================================================================
232 CORBA::Boolean SALOMEDS_StudyBuilder_i::FindAttribute(SALOMEDS::SObject_ptr anObject,
233 SALOMEDS::GenericAttribute_out anAttribute,
234 const char* aTypeOfAttribute)
236 SALOMEDS::Locker lock;
237 ASSERT(!CORBA::is_nil(anObject));
238 Handle(SALOMEDSImpl_SObject) aSO;
239 aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)anObject->GetID());
240 Handle(TDF_Attribute) anAttr;
242 if(!_impl->FindAttribute(aSO, anAttr, TCollection_AsciiString((char*)aTypeOfAttribute))) return false;
244 anAttribute = SALOMEDS::GenericAttribute::_duplicate(SALOMEDS_GenericAttribute_i::CreateAttribute(anAttr, _orb));
248 //============================================================================
249 /*! Function : RemoveAttribute
250 * Purpose : Remove attribute of given type assigned SObject
252 //============================================================================
254 void SALOMEDS_StudyBuilder_i::RemoveAttribute(SALOMEDS::SObject_ptr anObject,
255 const char* aTypeOfAttribute)
257 SALOMEDS::Locker lock;
259 ASSERT(!CORBA::is_nil(anObject));
260 Handle(SALOMEDSImpl_SObject) aSO;
261 aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)anObject->GetID());
262 _impl->RemoveAttribute(aSO, TCollection_AsciiString((char*)aTypeOfAttribute));
265 //============================================================================
266 /*! Function : Addreference
269 //============================================================================
270 void SALOMEDS_StudyBuilder_i::Addreference(SALOMEDS::SObject_ptr me,
271 SALOMEDS::SObject_ptr theReferencedObject)
273 SALOMEDS::Locker lock;
275 ASSERT(!CORBA::is_nil(me));
276 ASSERT(!CORBA::is_nil(theReferencedObject));
278 Handle(SALOMEDSImpl_SObject) aSO, aRefSO;
279 aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)me->GetID());
280 aRefSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)theReferencedObject->GetID());
281 _impl->Addreference(aSO, aRefSO);
284 //============================================================================
285 /*! Function : RemoveReference
288 //============================================================================
289 void SALOMEDS_StudyBuilder_i::RemoveReference(SALOMEDS::SObject_ptr me)
291 SALOMEDS::Locker lock;
293 ASSERT(!CORBA::is_nil(me));
294 Handle(SALOMEDSImpl_SObject) aSO;
295 aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)me->GetID());
296 _impl->RemoveReference(aSO);
300 //============================================================================
301 /*! Function : AddDirectory
302 * Purpose : adds a new directory with a path = thePath
304 //============================================================================
305 void SALOMEDS_StudyBuilder_i::AddDirectory(const char* thePath)
307 SALOMEDS::Locker lock;
309 if(thePath == NULL || strlen(thePath) == 0) throw SALOMEDS::Study::StudyInvalidDirectory();
310 if(!_impl->AddDirectory(TCollection_AsciiString((char*)thePath))) {
311 TCollection_AsciiString anErrorCode = _impl->GetErrorCode();
312 if(anErrorCode == "StudyNameAlreadyUsed") throw SALOMEDS::Study::StudyNameAlreadyUsed();
313 if(anErrorCode == "StudyInvalidDirectory") throw SALOMEDS::Study::StudyInvalidDirectory();
314 if(anErrorCode == "StudyInvalidComponent") throw SALOMEDS::Study::StudyInvalidComponent();
319 //============================================================================
320 /*! Function : SetGUID
323 //============================================================================
324 void SALOMEDS_StudyBuilder_i::SetGUID(SALOMEDS::SObject_ptr anObject, const char* theGUID)
326 SALOMEDS::Locker lock;
328 ASSERT(!CORBA::is_nil(anObject));
329 Handle(SALOMEDSImpl_SObject) aSO;
330 aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)anObject->GetID());
331 _impl->SetGUID(aSO, TCollection_AsciiString((char*)theGUID));
334 //============================================================================
335 /*! Function : IsGUID
338 //============================================================================
339 bool SALOMEDS_StudyBuilder_i::IsGUID(SALOMEDS::SObject_ptr anObject, const char* theGUID)
341 SALOMEDS::Locker lock;
342 ASSERT(!CORBA::is_nil(anObject));
343 Handle(SALOMEDSImpl_SObject) aSO;
344 aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)anObject->GetID());
345 return _impl->IsGUID(aSO, TCollection_AsciiString((char*)theGUID));
349 //============================================================================
350 /*! Function : NewCommand
353 //============================================================================
354 void SALOMEDS_StudyBuilder_i::NewCommand()
356 SALOMEDS::Locker lock;
360 //============================================================================
361 /*! Function : CommitCommand
364 //============================================================================
365 void SALOMEDS_StudyBuilder_i::CommitCommand() throw (SALOMEDS::StudyBuilder::LockProtection)
367 SALOMEDS::Locker lock;
368 Unexpect aCatch(SBLockProtection);
370 _impl->CommitCommand();
373 MESSAGE("Locked document modification !!!");
374 throw SALOMEDS::StudyBuilder::LockProtection();
378 //============================================================================
379 /*! Function : HasOpenCommand
382 //============================================================================
383 CORBA::Boolean SALOMEDS_StudyBuilder_i::HasOpenCommand()
385 SALOMEDS::Locker lock;
386 return _impl->HasOpenCommand();
389 //============================================================================
390 /*! Function : AbortCommand
393 //============================================================================
394 void SALOMEDS_StudyBuilder_i::AbortCommand()
396 SALOMEDS::Locker lock;
397 _impl->AbortCommand();
400 //============================================================================
404 //============================================================================
405 void SALOMEDS_StudyBuilder_i::Undo() throw (SALOMEDS::StudyBuilder::LockProtection)
407 SALOMEDS::Locker lock;
408 Unexpect aCatch(SBLockProtection);
413 MESSAGE("Locked document modification !!!");
414 throw SALOMEDS::StudyBuilder::LockProtection();
418 //============================================================================
422 //============================================================================
423 void SALOMEDS_StudyBuilder_i::Redo() throw (SALOMEDS::StudyBuilder::LockProtection)
425 SALOMEDS::Locker lock;
426 Unexpect aCatch(SBLockProtection);
431 MESSAGE("Locked document modification !!!");
432 throw SALOMEDS::StudyBuilder::LockProtection();
436 //============================================================================
437 /*! Function : GetAvailableUndos
440 //============================================================================
441 CORBA::Boolean SALOMEDS_StudyBuilder_i::GetAvailableUndos()
443 SALOMEDS::Locker lock;
444 return _impl->GetAvailableUndos();
447 //============================================================================
448 /*! Function : GetAvailableRedos
451 //============================================================================
452 CORBA::Boolean SALOMEDS_StudyBuilder_i::GetAvailableRedos()
454 SALOMEDS::Locker lock;
455 return _impl->GetAvailableRedos();
458 //============================================================================
459 /*! Function : UndoLimit
462 //============================================================================
463 CORBA::Long SALOMEDS_StudyBuilder_i::UndoLimit()
465 SALOMEDS::Locker lock;
466 return _impl->UndoLimit();
469 //============================================================================
470 /*! Function : UndoLimit
473 //============================================================================
474 void SALOMEDS_StudyBuilder_i::UndoLimit(CORBA::Long n)
476 SALOMEDS::Locker lock;
481 //============================================================================
482 /*! Function : CheckLocked
485 //============================================================================
486 void SALOMEDS_StudyBuilder_i::CheckLocked() throw (SALOMEDS::StudyBuilder::LockProtection)
488 SALOMEDS::Locker lock;
489 Unexpect aCatch(SBLockProtection);
491 _impl->CheckLocked();
494 throw SALOMEDS::StudyBuilder::LockProtection();
498 //============================================================================
499 /*! Function : SetName
502 //============================================================================
503 void SALOMEDS_StudyBuilder_i::SetName(SALOMEDS::SObject_ptr theSO, const char* theValue)
504 throw(SALOMEDS::StudyBuilder::LockProtection)
506 SALOMEDS::Locker lock;
507 Unexpect aCatch(SBLockProtection);
510 Handle(SALOMEDSImpl_SObject) aSO;
511 aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)theSO->GetID());
512 _impl->SetName(aSO, TCollection_AsciiString((char*)theValue));
515 //============================================================================
516 /*! Function : SetComment
519 //============================================================================
520 void SALOMEDS_StudyBuilder_i::SetComment(SALOMEDS::SObject_ptr theSO, const char* theValue)
521 throw(SALOMEDS::StudyBuilder::LockProtection)
523 SALOMEDS::Locker lock;
524 Unexpect aCatch(SBLockProtection);
527 Handle(SALOMEDSImpl_SObject) aSO;
528 aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)theSO->GetID());
529 _impl->SetComment(aSO, TCollection_AsciiString((char*)theValue));
532 //============================================================================
533 /*! Function : SetIOR
536 //============================================================================
537 void SALOMEDS_StudyBuilder_i::SetIOR(SALOMEDS::SObject_ptr theSO, const char* theValue)
538 throw(SALOMEDS::StudyBuilder::LockProtection)
540 SALOMEDS::Locker lock;
541 Unexpect aCatch(SBLockProtection);
544 Handle(SALOMEDSImpl_SObject) aSO;
545 aSO = Handle(SALOMEDSImpl_Study)::DownCast(_impl->GetOwner())->GetSObject((char*)theSO->GetID());
546 _impl->SetIOR(aSO, TCollection_AsciiString((char*)theValue));