1 // File : SALOMEDS_StudyBuilder.cxx
2 // Author : Sergey RUIN
9 #include "SALOMEDS_StudyBuilder.hxx"
10 #include "SALOMEDS_SObject.hxx"
11 #include "SALOMEDSImpl_SObject.hxx"
12 #include "SALOMEDS_SComponent.hxx"
13 #include "SALOMEDSImpl_SComponent.hxx"
14 #include "SALOMEDS_Driver_i.hxx"
15 #include "SALOMEDS_GenericAttribute.hxx"
16 #include "SALOMEDSImpl_GenericAttribute.hxx"
18 #include <TCollection_AsciiString.hxx>
19 #include <TDF_Attribute.hxx>
20 #include "SALOMEDS_StudyManager.hxx"
22 #include "Utils_CorbaException.hxx"
23 #include "Utils_ORB_INIT.hxx"
24 #include "Utils_SINGLETON.hxx"
28 SALOMEDS_StudyBuilder::SALOMEDS_StudyBuilder(const Handle(SALOMEDSImpl_StudyBuilder)& theBuilder)
31 _local_impl = theBuilder;
32 _corba_impl = SALOMEDS::StudyBuilder::_nil();
37 SALOMEDS_StudyBuilder::SALOMEDS_StudyBuilder(SALOMEDS::StudyBuilder_ptr theBuilder)
41 _corba_impl = SALOMEDS::StudyBuilder::_duplicate(theBuilder);
46 SALOMEDS_StudyBuilder::~SALOMEDS_StudyBuilder()
50 _PTR(SComponent) SALOMEDS_StudyBuilder::NewComponent(const std::string& ComponentDataType)
54 SALOMEDSClient_SComponent* aSCO = NULL;
57 Handle(SALOMEDSImpl_SComponent) aSCO_impl =_local_impl->NewComponent((char*)ComponentDataType.c_str());
58 if(aSCO_impl.IsNull()) return _PTR(SComponent)(aSCO);
59 aSCO = new SALOMEDS_SComponent(aSCO_impl);
62 SALOMEDS::SComponent_var aSCO_impl = _corba_impl->NewComponent((char*)ComponentDataType.c_str());
63 if(CORBA::is_nil(aSCO_impl)) return _PTR(SComponent)(aSCO);
64 aSCO = new SALOMEDS_SComponent(aSCO_impl);
67 return _PTR(SComponent)(aSCO);
70 void SALOMEDS_StudyBuilder::DefineComponentInstance (const _PTR(SComponent)& theSCO,
71 const std::string& ComponentIOR)
75 SALOMEDS_SComponent* aSCO = dynamic_cast<SALOMEDS_SComponent*>(theSCO.get());
76 if(_isLocal) _local_impl->DefineComponentInstance(Handle(SALOMEDSImpl_SComponent)::DownCast(aSCO->GetLocalImpl()),
77 (char*)ComponentIOR.c_str());
79 CORBA::Object_var obj = _orb->string_to_object(ComponentIOR.c_str());
80 _corba_impl->DefineComponentInstance(SALOMEDS::SComponent::_narrow(aSCO->GetCORBAImpl()), obj);
84 void SALOMEDS_StudyBuilder::RemoveComponent(const _PTR(SComponent)& theSCO)
88 SALOMEDS_SComponent* aSCO = dynamic_cast<SALOMEDS_SComponent*>(theSCO.get());
89 if(_isLocal) _local_impl->RemoveComponent(Handle(SALOMEDSImpl_SComponent)::DownCast(aSCO->GetLocalImpl()));
90 else _corba_impl->RemoveComponent(SALOMEDS::SComponent::_narrow(aSCO->GetCORBAImpl()));
93 _PTR(SObject) SALOMEDS_StudyBuilder::NewObject(const _PTR(SObject)& theFatherObject)
97 SALOMEDSClient_SObject* aSO = NULL;
98 SALOMEDS_SObject* father = dynamic_cast< SALOMEDS_SObject*>(theFatherObject.get());
99 if(father == NULL) return _PTR(SObject)(aSO);
101 Handle(SALOMEDSImpl_SObject) aSO_impl = _local_impl->NewObject(father->GetLocalImpl());
102 if(aSO_impl.IsNull()) return _PTR(SObject)(aSO);
103 aSO = new SALOMEDS_SObject(aSO_impl);
106 SALOMEDS::SObject_var aSO_impl = _corba_impl->NewObject(father->GetCORBAImpl());
107 if(CORBA::is_nil(aSO_impl)) return _PTR(SObject)(aSO);
108 aSO = new SALOMEDS_SObject(aSO_impl);
111 return _PTR(SObject)(aSO);
114 _PTR(SObject) SALOMEDS_StudyBuilder::NewObjectToTag(const _PTR(SObject)& theFatherObject, int theTag)
118 SALOMEDSClient_SObject* aSO = NULL;
119 SALOMEDS_SObject* father = dynamic_cast< SALOMEDS_SObject*>(theFatherObject.get());
120 if(father == NULL) return _PTR(SObject)(aSO);
122 Handle(SALOMEDSImpl_SObject) aSO_impl = _local_impl->NewObjectToTag(father->GetLocalImpl(), theTag);
123 if(aSO_impl.IsNull()) return _PTR(SObject)(aSO);
124 aSO = new SALOMEDS_SObject(aSO_impl);
127 SALOMEDS::SObject_var aSO_impl = _corba_impl->NewObjectToTag(father->GetCORBAImpl(), theTag);
128 if(CORBA::is_nil(aSO_impl)) return _PTR(SObject)(aSO);
129 aSO = new SALOMEDS_SObject(aSO_impl);
132 return _PTR(SObject)(aSO);
136 void SALOMEDS_StudyBuilder::AddDirectory(const std::string& thePath)
141 _local_impl->AddDirectory((char*)thePath.c_str());
142 if(_local_impl->IsError()) {
143 std::string anErrorCode = _local_impl->GetErrorCode().ToCString();
144 if(anErrorCode == "StudyNameAlreadyUsed") throw SALOMEDS::Study::StudyNameAlreadyUsed();
145 if(anErrorCode == "StudyInvalidDirectory") throw SALOMEDS::Study::StudyInvalidDirectory();
146 if(anErrorCode == "StudyInvalidComponent") throw SALOMEDS::Study::StudyInvalidComponent();
149 else _corba_impl->AddDirectory((char*)thePath.c_str());
152 void SALOMEDS_StudyBuilder::LoadWith(const _PTR(SComponent)& theSCO, const std::string& theIOR)
154 SALOMEDS_SComponent* aSCO = dynamic_cast<SALOMEDS_SComponent*>(theSCO.get());
155 CORBA::Object_var obj = _orb->string_to_object(theIOR.c_str());
156 SALOMEDS::Driver_var aDriver = SALOMEDS::Driver::_narrow(obj);
159 SALOMEDS_Driver_i* drv = new SALOMEDS_Driver_i(aDriver, _orb);
160 Handle(SALOMEDSImpl_SComponent) aSCO_impl = Handle(SALOMEDSImpl_SComponent)::DownCast(aSCO->GetLocalImpl());
161 bool isDone = _local_impl->LoadWith(aSCO_impl, drv);
163 if(!isDone && _local_impl->IsError())
164 THROW_SALOME_CORBA_EXCEPTION(_local_impl->GetErrorCode().ToCString(),SALOME::BAD_PARAM);
167 _corba_impl->LoadWith(SALOMEDS::SComponent::_narrow(aSCO->GetCORBAImpl()), aDriver);
171 void SALOMEDS_StudyBuilder::Load(const _PTR(SObject)& theSCO)
173 SALOMEDS_SComponent* aSCO = dynamic_cast<SALOMEDS_SComponent*>(theSCO.get());
174 if(_isLocal) _local_impl->Load(Handle(SALOMEDSImpl_SComponent)::DownCast(aSCO->GetLocalImpl()));
175 else _corba_impl->Load(SALOMEDS::SComponent::_narrow(aSCO->GetCORBAImpl()));
178 void SALOMEDS_StudyBuilder::RemoveObject(const _PTR(SObject)& theSO)
182 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
183 if(_isLocal) _local_impl->RemoveObject(aSO->GetLocalImpl());
184 else _corba_impl->RemoveObject(aSO->GetCORBAImpl());
187 void SALOMEDS_StudyBuilder::RemoveObjectWithChildren(const _PTR(SObject)& theSO)
191 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
192 if(_isLocal) _local_impl->RemoveObjectWithChildren(aSO->GetLocalImpl());
193 else _corba_impl->RemoveObjectWithChildren(aSO->GetCORBAImpl());
196 _PTR(GenericAttribute) SALOMEDS_StudyBuilder::FindOrCreateAttribute(const _PTR(SObject)& theSO,
197 const std::string& aTypeOfAttribute)
199 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
200 SALOMEDSClient_GenericAttribute* anAttr = NULL;
202 Handle(SALOMEDSImpl_GenericAttribute) aGA;
204 aGA=Handle(SALOMEDSImpl_GenericAttribute)::DownCast(_local_impl->FindOrCreateAttribute(aSO->GetLocalImpl(),
205 (char*)aTypeOfAttribute.c_str()));
208 throw SALOMEDS::StudyBuilder::LockProtection();
210 anAttr = SALOMEDS_GenericAttribute::CreateAttribute(aGA);
213 SALOMEDS::GenericAttribute_var aGA = _corba_impl->FindOrCreateAttribute(aSO->GetCORBAImpl(), (char*)aTypeOfAttribute.c_str());
214 anAttr = SALOMEDS_GenericAttribute::CreateAttribute(aGA);
217 return _PTR(GenericAttribute)(anAttr);
220 bool SALOMEDS_StudyBuilder::FindAttribute(const _PTR(SObject)& theSO,
221 _PTR(GenericAttribute)& anAttribute,
222 const std::string& aTypeOfAttribute)
225 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
227 Handle(SALOMEDSImpl_GenericAttribute) aGA;
228 ret = _local_impl->FindAttribute(aSO->GetLocalImpl(), aGA, (char*)aTypeOfAttribute.c_str());
229 if(ret) anAttribute = _PTR(GenericAttribute)(SALOMEDS_GenericAttribute::CreateAttribute(aGA));
232 SALOMEDS::GenericAttribute_var aGA;
233 ret = _corba_impl->FindAttribute(aSO->GetCORBAImpl(), aGA.out(), (char*)aTypeOfAttribute.c_str());
234 if(ret) anAttribute = _PTR(GenericAttribute)(SALOMEDS_GenericAttribute::CreateAttribute(aGA));
240 void SALOMEDS_StudyBuilder::RemoveAttribute(const _PTR(SObject)& theSO, const std::string& aTypeOfAttribute)
244 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
245 if(_isLocal) _local_impl->RemoveAttribute(aSO->GetLocalImpl(), (char*)aTypeOfAttribute.c_str());
246 else _corba_impl->RemoveAttribute(aSO->GetCORBAImpl(), (char*)aTypeOfAttribute.c_str());
249 void SALOMEDS_StudyBuilder::Addreference(const _PTR(SObject)& me, const _PTR(SObject)& thereferencedObject)
253 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(me.get());
254 SALOMEDS_SObject* aRefSO = dynamic_cast<SALOMEDS_SObject*>(thereferencedObject.get());
255 if(_isLocal) _local_impl->Addreference(aSO->GetLocalImpl(), aRefSO->GetLocalImpl());
256 else _corba_impl->Addreference(aSO->GetCORBAImpl(), aRefSO->GetCORBAImpl());
259 void SALOMEDS_StudyBuilder::RemoveReference(const _PTR(SObject)& me)
263 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(me.get());
264 if(_isLocal) _local_impl->RemoveReference(aSO->GetLocalImpl());
265 else _corba_impl->RemoveReference(aSO->GetCORBAImpl());
268 void SALOMEDS_StudyBuilder::SetGUID(const _PTR(SObject)& theSO, const std::string& theGUID)
272 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
273 if(_isLocal) _local_impl->SetGUID(aSO->GetLocalImpl(), (char*)theGUID.c_str());
274 else _corba_impl->SetGUID(aSO->GetCORBAImpl(), (char*)theGUID.c_str());
277 bool SALOMEDS_StudyBuilder::IsGUID(const _PTR(SObject)& theSO, const std::string& theGUID)
279 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
281 if(_isLocal) ret = _local_impl->IsGUID(aSO->GetLocalImpl(), (char*)theGUID.c_str());
282 else ret = _corba_impl->IsGUID(aSO->GetCORBAImpl(), (char*)theGUID.c_str());
287 void SALOMEDS_StudyBuilder::NewCommand()
289 if(_isLocal) _local_impl->NewCommand();
290 else _corba_impl->NewCommand();
293 void SALOMEDS_StudyBuilder::CommitCommand()
297 _local_impl->CommitCommand();
300 throw SALOMEDS::StudyBuilder::LockProtection();
303 else _corba_impl->CommitCommand();
306 bool SALOMEDS_StudyBuilder::HasOpenCommand()
309 if(_isLocal) ret = _local_impl->HasOpenCommand();
310 else ret = _corba_impl->HasOpenCommand();
314 void SALOMEDS_StudyBuilder::AbortCommand()
316 if(_isLocal) _local_impl->AbortCommand();
317 else _corba_impl->AbortCommand();
320 void SALOMEDS_StudyBuilder::Undo()
327 throw SALOMEDS::StudyBuilder::LockProtection();
330 else _corba_impl->Undo();
333 void SALOMEDS_StudyBuilder::Redo()
340 throw SALOMEDS::StudyBuilder::LockProtection();
343 else _corba_impl->Redo();
346 bool SALOMEDS_StudyBuilder::GetAvailableUndos()
349 if(_isLocal) ret = _local_impl->GetAvailableUndos();
350 else ret = _corba_impl->GetAvailableUndos();
354 bool SALOMEDS_StudyBuilder::GetAvailableRedos()
357 if(_isLocal) ret = _local_impl->GetAvailableRedos();
358 else ret = _corba_impl->GetAvailableRedos();
362 int SALOMEDS_StudyBuilder::UndoLimit()
365 if(_isLocal) aLimit = _local_impl->UndoLimit();
366 else aLimit = _corba_impl->UndoLimit();
370 void SALOMEDS_StudyBuilder::UndoLimit(int theLimit)
374 if(_isLocal) _local_impl->UndoLimit(theLimit);
375 else _corba_impl->UndoLimit(theLimit);
378 void SALOMEDS_StudyBuilder::CheckLocked()
380 //There is only local part as CORBA part throws the correct exeception
383 _local_impl->CheckLocked();
386 throw SALOMEDS::StudyBuilder::LockProtection();
391 void SALOMEDS_StudyBuilder::SetName(const _PTR(SObject)& theSO, const std::string& theValue)
395 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
396 if(_isLocal) _local_impl->SetName(aSO->GetLocalImpl(), (char*)theValue.c_str());
397 else _corba_impl->SetName(aSO->GetCORBAImpl(), (char*)theValue.c_str());
400 void SALOMEDS_StudyBuilder::SetComment(const _PTR(SObject)& theSO, const std::string& theValue)
404 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
405 if(_isLocal) _local_impl->SetComment(aSO->GetLocalImpl(), (char*)theValue.c_str());
406 else _corba_impl->SetComment(aSO->GetCORBAImpl(), (char*)theValue.c_str());
409 void SALOMEDS_StudyBuilder::SetIOR(const _PTR(SObject)& theSO, const std::string& theValue)
413 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
414 if(_isLocal) _local_impl->SetIOR(aSO->GetLocalImpl(), (char*)theValue.c_str());
415 else _corba_impl->SetIOR(aSO->GetCORBAImpl(), (char*)theValue.c_str());
418 void SALOMEDS_StudyBuilder::init_orb()
420 ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
421 ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting());
422 _orb = init(0 , 0 ) ;