1 // Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License.
9 // This library is distributed in the hope that it will be useful
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 // See http://www.salome-platform.org/
20 // File : SALOMEDS_StudyBuilder.cxx
21 // Author : Sergey RUIN
26 #include "utilities.h"
28 #include "SALOMEDS_StudyBuilder.hxx"
29 #include "SALOMEDS_SObject.hxx"
30 #include "SALOMEDSImpl_SObject.hxx"
31 #include "SALOMEDS_SComponent.hxx"
32 #include "SALOMEDSImpl_SComponent.hxx"
33 #include "SALOMEDS_Driver_i.hxx"
34 #include "SALOMEDS_GenericAttribute.hxx"
35 #include "SALOMEDSImpl_GenericAttribute.hxx"
37 #include <TCollection_AsciiString.hxx>
38 #include <TDF_Attribute.hxx>
39 #include "SALOMEDS_StudyManager.hxx"
41 #include "Utils_CorbaException.hxx"
42 #include "Utils_ORB_INIT.hxx"
43 #include "Utils_SINGLETON.hxx"
47 SALOMEDS_StudyBuilder::SALOMEDS_StudyBuilder(const Handle(SALOMEDSImpl_StudyBuilder)& theBuilder)
50 _local_impl = theBuilder;
51 _corba_impl = SALOMEDS::StudyBuilder::_nil();
56 SALOMEDS_StudyBuilder::SALOMEDS_StudyBuilder(SALOMEDS::StudyBuilder_ptr theBuilder)
60 _corba_impl = SALOMEDS::StudyBuilder::_duplicate(theBuilder);
65 SALOMEDS_StudyBuilder::~SALOMEDS_StudyBuilder()
69 _PTR(SComponent) SALOMEDS_StudyBuilder::NewComponent(const std::string& ComponentDataType)
73 SALOMEDSClient_SComponent* aSCO = NULL;
76 Handle(SALOMEDSImpl_SComponent) aSCO_impl =_local_impl->NewComponent((char*)ComponentDataType.c_str());
77 if(aSCO_impl.IsNull()) return _PTR(SComponent)(aSCO);
78 aSCO = new SALOMEDS_SComponent(aSCO_impl);
81 SALOMEDS::SComponent_var aSCO_impl = _corba_impl->NewComponent((char*)ComponentDataType.c_str());
82 if(CORBA::is_nil(aSCO_impl)) return _PTR(SComponent)(aSCO);
83 aSCO = new SALOMEDS_SComponent(aSCO_impl);
86 return _PTR(SComponent)(aSCO);
89 void SALOMEDS_StudyBuilder::DefineComponentInstance (const _PTR(SComponent)& theSCO,
90 const std::string& ComponentIOR)
94 SALOMEDS_SComponent* aSCO = dynamic_cast<SALOMEDS_SComponent*>(theSCO.get());
95 if(_isLocal) _local_impl->DefineComponentInstance(Handle(SALOMEDSImpl_SComponent)::DownCast(aSCO->GetLocalImpl()),
96 (char*)ComponentIOR.c_str());
98 CORBA::Object_var obj = _orb->string_to_object(ComponentIOR.c_str());
99 _corba_impl->DefineComponentInstance(SALOMEDS::SComponent::_narrow(aSCO->GetCORBAImpl()), obj);
103 void SALOMEDS_StudyBuilder::RemoveComponent(const _PTR(SComponent)& theSCO)
107 SALOMEDS_SComponent* aSCO = dynamic_cast<SALOMEDS_SComponent*>(theSCO.get());
108 if(_isLocal) _local_impl->RemoveComponent(Handle(SALOMEDSImpl_SComponent)::DownCast(aSCO->GetLocalImpl()));
109 else _corba_impl->RemoveComponent(SALOMEDS::SComponent::_narrow(aSCO->GetCORBAImpl()));
112 _PTR(SObject) SALOMEDS_StudyBuilder::NewObject(const _PTR(SObject)& theFatherObject)
116 SALOMEDSClient_SObject* aSO = NULL;
117 SALOMEDS_SObject* father = dynamic_cast< SALOMEDS_SObject*>(theFatherObject.get());
118 if(father == NULL) return _PTR(SObject)(aSO);
120 Handle(SALOMEDSImpl_SObject) aSO_impl = _local_impl->NewObject(father->GetLocalImpl());
121 if(aSO_impl.IsNull()) return _PTR(SObject)(aSO);
122 aSO = new SALOMEDS_SObject(aSO_impl);
125 SALOMEDS::SObject_var aSO_impl = _corba_impl->NewObject(father->GetCORBAImpl());
126 if(CORBA::is_nil(aSO_impl)) return _PTR(SObject)(aSO);
127 aSO = new SALOMEDS_SObject(aSO_impl);
130 return _PTR(SObject)(aSO);
133 _PTR(SObject) SALOMEDS_StudyBuilder::NewObjectToTag(const _PTR(SObject)& theFatherObject, int theTag)
137 SALOMEDSClient_SObject* aSO = NULL;
138 SALOMEDS_SObject* father = dynamic_cast< SALOMEDS_SObject*>(theFatherObject.get());
139 if(father == NULL) return _PTR(SObject)(aSO);
141 Handle(SALOMEDSImpl_SObject) aSO_impl = _local_impl->NewObjectToTag(father->GetLocalImpl(), theTag);
142 if(aSO_impl.IsNull()) return _PTR(SObject)(aSO);
143 aSO = new SALOMEDS_SObject(aSO_impl);
146 SALOMEDS::SObject_var aSO_impl = _corba_impl->NewObjectToTag(father->GetCORBAImpl(), theTag);
147 if(CORBA::is_nil(aSO_impl)) return _PTR(SObject)(aSO);
148 aSO = new SALOMEDS_SObject(aSO_impl);
151 return _PTR(SObject)(aSO);
155 void SALOMEDS_StudyBuilder::AddDirectory(const std::string& thePath)
160 _local_impl->AddDirectory((char*)thePath.c_str());
161 if(_local_impl->IsError()) {
162 std::string anErrorCode = _local_impl->GetErrorCode().ToCString();
163 if(anErrorCode == "StudyNameAlreadyUsed") throw SALOMEDS::Study::StudyNameAlreadyUsed();
164 if(anErrorCode == "StudyInvalidDirectory") throw SALOMEDS::Study::StudyInvalidDirectory();
165 if(anErrorCode == "StudyInvalidComponent") throw SALOMEDS::Study::StudyInvalidComponent();
168 else _corba_impl->AddDirectory((char*)thePath.c_str());
171 void SALOMEDS_StudyBuilder::LoadWith(const _PTR(SComponent)& theSCO, const std::string& theIOR)
173 SALOMEDS_SComponent* aSCO = dynamic_cast<SALOMEDS_SComponent*>(theSCO.get());
174 CORBA::Object_var obj = _orb->string_to_object(theIOR.c_str());
175 SALOMEDS::Driver_var aDriver = SALOMEDS::Driver::_narrow(obj);
178 SALOMEDS_Driver_i* drv = new SALOMEDS_Driver_i(aDriver, _orb);
179 Handle(SALOMEDSImpl_SComponent) aSCO_impl = Handle(SALOMEDSImpl_SComponent)::DownCast(aSCO->GetLocalImpl());
180 bool isDone = _local_impl->LoadWith(aSCO_impl, drv);
182 if(!isDone && _local_impl->IsError())
183 THROW_SALOME_CORBA_EXCEPTION(_local_impl->GetErrorCode().ToCString(),SALOME::BAD_PARAM);
186 _corba_impl->LoadWith(SALOMEDS::SComponent::_narrow(aSCO->GetCORBAImpl()), aDriver);
190 void SALOMEDS_StudyBuilder::Load(const _PTR(SObject)& theSCO)
192 SALOMEDS_SComponent* aSCO = dynamic_cast<SALOMEDS_SComponent*>(theSCO.get());
193 if(_isLocal) _local_impl->Load(Handle(SALOMEDSImpl_SComponent)::DownCast(aSCO->GetLocalImpl()));
194 else _corba_impl->Load(SALOMEDS::SComponent::_narrow(aSCO->GetCORBAImpl()));
197 void SALOMEDS_StudyBuilder::RemoveObject(const _PTR(SObject)& theSO)
201 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
202 if(_isLocal) _local_impl->RemoveObject(aSO->GetLocalImpl());
203 else _corba_impl->RemoveObject(aSO->GetCORBAImpl());
206 void SALOMEDS_StudyBuilder::RemoveObjectWithChildren(const _PTR(SObject)& theSO)
210 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
211 if(_isLocal) _local_impl->RemoveObjectWithChildren(aSO->GetLocalImpl());
212 else _corba_impl->RemoveObjectWithChildren(aSO->GetCORBAImpl());
215 _PTR(GenericAttribute) SALOMEDS_StudyBuilder::FindOrCreateAttribute(const _PTR(SObject)& theSO,
216 const std::string& aTypeOfAttribute)
218 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
219 SALOMEDSClient_GenericAttribute* anAttr = NULL;
221 Handle(SALOMEDSImpl_GenericAttribute) aGA;
223 aGA=Handle(SALOMEDSImpl_GenericAttribute)::DownCast(_local_impl->FindOrCreateAttribute(aSO->GetLocalImpl(),
224 (char*)aTypeOfAttribute.c_str()));
227 throw SALOMEDS::StudyBuilder::LockProtection();
229 anAttr = SALOMEDS_GenericAttribute::CreateAttribute(aGA);
232 SALOMEDS::GenericAttribute_var aGA = _corba_impl->FindOrCreateAttribute(aSO->GetCORBAImpl(), (char*)aTypeOfAttribute.c_str());
233 anAttr = SALOMEDS_GenericAttribute::CreateAttribute(aGA);
236 return _PTR(GenericAttribute)(anAttr);
239 bool SALOMEDS_StudyBuilder::FindAttribute(const _PTR(SObject)& theSO,
240 _PTR(GenericAttribute)& anAttribute,
241 const std::string& aTypeOfAttribute)
244 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
246 Handle(SALOMEDSImpl_GenericAttribute) aGA;
247 ret = _local_impl->FindAttribute(aSO->GetLocalImpl(), aGA, (char*)aTypeOfAttribute.c_str());
248 if(ret) anAttribute = _PTR(GenericAttribute)(SALOMEDS_GenericAttribute::CreateAttribute(aGA));
251 SALOMEDS::GenericAttribute_var aGA;
252 ret = _corba_impl->FindAttribute(aSO->GetCORBAImpl(), aGA.out(), (char*)aTypeOfAttribute.c_str());
253 if(ret) anAttribute = _PTR(GenericAttribute)(SALOMEDS_GenericAttribute::CreateAttribute(aGA));
259 void SALOMEDS_StudyBuilder::RemoveAttribute(const _PTR(SObject)& theSO, const std::string& aTypeOfAttribute)
263 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
264 if(_isLocal) _local_impl->RemoveAttribute(aSO->GetLocalImpl(), (char*)aTypeOfAttribute.c_str());
265 else _corba_impl->RemoveAttribute(aSO->GetCORBAImpl(), (char*)aTypeOfAttribute.c_str());
268 void SALOMEDS_StudyBuilder::Addreference(const _PTR(SObject)& me, const _PTR(SObject)& thereferencedObject)
272 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(me.get());
273 SALOMEDS_SObject* aRefSO = dynamic_cast<SALOMEDS_SObject*>(thereferencedObject.get());
274 if(_isLocal) _local_impl->Addreference(aSO->GetLocalImpl(), aRefSO->GetLocalImpl());
275 else _corba_impl->Addreference(aSO->GetCORBAImpl(), aRefSO->GetCORBAImpl());
278 void SALOMEDS_StudyBuilder::RemoveReference(const _PTR(SObject)& me)
282 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(me.get());
283 if(_isLocal) _local_impl->RemoveReference(aSO->GetLocalImpl());
284 else _corba_impl->RemoveReference(aSO->GetCORBAImpl());
287 void SALOMEDS_StudyBuilder::SetGUID(const _PTR(SObject)& theSO, const std::string& theGUID)
291 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
292 if(_isLocal) _local_impl->SetGUID(aSO->GetLocalImpl(), (char*)theGUID.c_str());
293 else _corba_impl->SetGUID(aSO->GetCORBAImpl(), (char*)theGUID.c_str());
296 bool SALOMEDS_StudyBuilder::IsGUID(const _PTR(SObject)& theSO, const std::string& theGUID)
298 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
300 if(_isLocal) ret = _local_impl->IsGUID(aSO->GetLocalImpl(), (char*)theGUID.c_str());
301 else ret = _corba_impl->IsGUID(aSO->GetCORBAImpl(), (char*)theGUID.c_str());
306 void SALOMEDS_StudyBuilder::NewCommand()
308 if(_isLocal) _local_impl->NewCommand();
309 else _corba_impl->NewCommand();
312 void SALOMEDS_StudyBuilder::CommitCommand()
316 _local_impl->CommitCommand();
319 throw SALOMEDS::StudyBuilder::LockProtection();
322 else _corba_impl->CommitCommand();
325 bool SALOMEDS_StudyBuilder::HasOpenCommand()
328 if(_isLocal) ret = _local_impl->HasOpenCommand();
329 else ret = _corba_impl->HasOpenCommand();
333 void SALOMEDS_StudyBuilder::AbortCommand()
335 if(_isLocal) _local_impl->AbortCommand();
336 else _corba_impl->AbortCommand();
339 void SALOMEDS_StudyBuilder::Undo()
346 throw SALOMEDS::StudyBuilder::LockProtection();
349 else _corba_impl->Undo();
352 void SALOMEDS_StudyBuilder::Redo()
359 throw SALOMEDS::StudyBuilder::LockProtection();
362 else _corba_impl->Redo();
365 bool SALOMEDS_StudyBuilder::GetAvailableUndos()
368 if(_isLocal) ret = _local_impl->GetAvailableUndos();
369 else ret = _corba_impl->GetAvailableUndos();
373 bool SALOMEDS_StudyBuilder::GetAvailableRedos()
376 if(_isLocal) ret = _local_impl->GetAvailableRedos();
377 else ret = _corba_impl->GetAvailableRedos();
381 int SALOMEDS_StudyBuilder::UndoLimit()
384 if(_isLocal) aLimit = _local_impl->UndoLimit();
385 else aLimit = _corba_impl->UndoLimit();
389 void SALOMEDS_StudyBuilder::UndoLimit(int theLimit)
393 if(_isLocal) _local_impl->UndoLimit(theLimit);
394 else _corba_impl->UndoLimit(theLimit);
397 void SALOMEDS_StudyBuilder::CheckLocked()
399 //There is only local part as CORBA part throws the correct exeception
402 _local_impl->CheckLocked();
405 throw SALOMEDS::StudyBuilder::LockProtection();
410 void SALOMEDS_StudyBuilder::SetName(const _PTR(SObject)& theSO, const std::string& theValue)
414 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
415 if(_isLocal) _local_impl->SetName(aSO->GetLocalImpl(), (char*)theValue.c_str());
416 else _corba_impl->SetName(aSO->GetCORBAImpl(), (char*)theValue.c_str());
419 void SALOMEDS_StudyBuilder::SetComment(const _PTR(SObject)& theSO, const std::string& theValue)
423 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
424 if(_isLocal) _local_impl->SetComment(aSO->GetLocalImpl(), (char*)theValue.c_str());
425 else _corba_impl->SetComment(aSO->GetCORBAImpl(), (char*)theValue.c_str());
428 void SALOMEDS_StudyBuilder::SetIOR(const _PTR(SObject)& theSO, const std::string& theValue)
432 SALOMEDS_SObject* aSO = dynamic_cast<SALOMEDS_SObject*>(theSO.get());
433 if(_isLocal) _local_impl->SetIOR(aSO->GetLocalImpl(), (char*)theValue.c_str());
434 else _corba_impl->SetIOR(aSO->GetCORBAImpl(), (char*)theValue.c_str());
437 void SALOMEDS_StudyBuilder::init_orb()
439 ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
440 ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting());
441 _orb = init(0 , 0 ) ;