1 // Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 // File : SALOMEDSImpl_StudyBuilder.cxx
24 // Author : Sergey RUIN
27 #include "SALOMEDSImpl_Attributes.hxx"
28 #include "SALOMEDSImpl_Study.hxx"
29 #include "SALOMEDSImpl_StudyBuilder.hxx"
30 #include "SALOMEDSImpl_SObject.hxx"
31 #include "SALOMEDSImpl_SComponent.hxx"
32 #include "SALOMEDSImpl_Tool.hxx"
33 #include "SALOMEDSImpl_ChildNodeIterator.hxx"
35 #include "DF_ChildIterator.hxx"
36 #include "DF_Label.hxx"
42 #define USE_CASE_LABEL_TAG 2
43 #define DIRECTORYID 16661
44 #define FILELOCALID 26662
46 static void Translate_persistentID_to_IOR(DF_Label& Lab, SALOMEDSImpl_Driver* driver, bool isMultiFile, bool isASCII);
48 //============================================================================
49 /*! Function : constructor
52 //============================================================================
53 SALOMEDSImpl_StudyBuilder::SALOMEDSImpl_StudyBuilder(const SALOMEDSImpl_Study* theOwner)
57 _callbackOnRemove = NULL;
58 _study = (SALOMEDSImpl_Study*)theOwner;
59 _doc = _study->GetDocument();
62 //============================================================================
63 /*! Function : destructor
66 //============================================================================
67 SALOMEDSImpl_StudyBuilder::~SALOMEDSImpl_StudyBuilder()
70 //============================================================================
71 /*! Function : NewComponent
72 * Purpose : Create a new component (Scomponent)
74 //============================================================================
75 SALOMEDSImpl_SComponent SALOMEDSImpl_StudyBuilder::NewComponent(const std::string& DataType)
80 SALOMEDSImpl_SComponent sco;
82 if(DataType.size() == 0) return sco;
84 //Always create component under main label.
85 DF_Label L = _doc->Main();
87 DF_Label NL = L.NewChild();
89 SALOMEDSImpl_AttributeComment::Set(NL, DataType);
91 SALOMEDSImpl_SComponent so = _study->GetSComponent (NL);
93 if(_callbackOnAdd) _callbackOnAdd->OnAddSObject(so);
95 _doc->SetModified(true);
100 //============================================================================
101 /*! Function : DefineComponentInstance
102 * Purpose : Add IOR attribute of a Scomponent
104 //============================================================================
105 bool SALOMEDSImpl_StudyBuilder::DefineComponentInstance(const SALOMEDSImpl_SComponent& aComponent,
106 const std::string& IOR)
111 if(!aComponent || IOR.empty()) {
112 _errorCode = "Invalid arguments";
116 SALOMEDSImpl_AttributeIOR::Set(aComponent.GetLabel(), IOR);
121 //============================================================================
122 /*! Function : RemoveComponent
123 * Purpose : Delete a Scomponent
125 //============================================================================
126 bool SALOMEDSImpl_StudyBuilder::RemoveComponent(const SALOMEDSImpl_SComponent& aComponent)
130 return RemoveObject(aComponent);
133 //============================================================================
134 /*! Function : NewObject
135 * Purpose : Create a new SObject
137 //============================================================================
138 SALOMEDSImpl_SObject SALOMEDSImpl_StudyBuilder::NewObject(const SALOMEDSImpl_SObject& theFatherObject)
143 //Find label of father
144 DF_Label Lab = theFatherObject.GetLabel();
147 DF_Label NewLab = Lab.NewChild();
149 SALOMEDSImpl_SObject so = _study->GetSObject(NewLab);
150 if(_callbackOnAdd) _callbackOnAdd->OnAddSObject(so);
152 _doc->SetModified(true);
156 //============================================================================
157 /*! Function : NewObjectToTag
160 //============================================================================
161 SALOMEDSImpl_SObject SALOMEDSImpl_StudyBuilder::NewObjectToTag(const SALOMEDSImpl_SObject& theFatherObject,
166 //Find label of father
167 DF_Label Lab = theFatherObject.GetLabel();
169 //Create or find label
170 DF_Label NewLab = Lab.FindChild(theTag, 1);
172 SALOMEDSImpl_SObject so = _study->GetSObject(NewLab);
174 if(_callbackOnAdd) _callbackOnAdd->OnAddSObject(so);
176 _doc->SetModified(true);
180 //============================================================================
181 /*! Function : RemoveObject
184 //============================================================================
185 bool SALOMEDSImpl_StudyBuilder::RemoveObject(const SALOMEDSImpl_SObject& anObject)
190 _errorCode = "Null object";
194 if(_callbackOnRemove) _callbackOnRemove->OnRemoveSObject(anObject);
196 DF_Label Lab = anObject.GetLabel();
198 SALOMEDSImpl_AttributeReference* aReference = NULL;
199 if ((aReference=(SALOMEDSImpl_AttributeReference*)Lab.FindAttribute(SALOMEDSImpl_AttributeReference::GetID()))) {
200 SALOMEDSImpl_AttributeTarget* aTarget = NULL;
201 if ((aTarget=(SALOMEDSImpl_AttributeTarget*)aReference->Get().FindAttribute(SALOMEDSImpl_AttributeTarget::GetID())))
202 aTarget->Remove(SALOMEDSImpl_Study::SObject(Lab));
205 SALOMEDSImpl_AttributeIOR* anAttr = NULL; //Remove from IORLabel map
206 if ((anAttr=(SALOMEDSImpl_AttributeIOR*)Lab.FindAttribute(SALOMEDSImpl_AttributeIOR::GetID()))) {
207 _study->DeleteIORLabelMapItem(anAttr->Value());
210 Lab.ForgetAllAttributes();
212 _doc->SetModified(true);
217 //============================================================================
218 /*! Function : RemoveObjectWithChildren
221 //============================================================================
222 bool SALOMEDSImpl_StudyBuilder::RemoveObjectWithChildren(const SALOMEDSImpl_SObject& anObject)
227 _errorCode = "Null object";
231 if(_callbackOnRemove) _callbackOnRemove->OnRemoveSObject(anObject);
233 DF_Label Lab = anObject.GetLabel();
235 SALOMEDSImpl_AttributeReference* aReference = NULL;
236 if ((aReference=(SALOMEDSImpl_AttributeReference*)Lab.FindAttribute(SALOMEDSImpl_AttributeReference::GetID()))) {
237 SALOMEDSImpl_AttributeTarget* aTarget = NULL;
238 if ((aTarget=(SALOMEDSImpl_AttributeTarget*)aReference->Get().FindAttribute(SALOMEDSImpl_AttributeTarget::GetID())))
239 aTarget->Remove(SALOMEDSImpl_Study::SObject(Lab));
241 SALOMEDSImpl_AttributeIOR* anAttr = NULL; //Remove from IORLabel map
242 if ((anAttr=(SALOMEDSImpl_AttributeIOR*)Lab.FindAttribute(SALOMEDSImpl_AttributeIOR::GetID()))) {
243 _study->DeleteIORLabelMapItem(anAttr->Value());
246 DF_ChildIterator it(Lab, true);
247 for(;it.More();it.Next()) {
248 DF_Label aLabel = it.Value();
249 if ((aReference=(SALOMEDSImpl_AttributeReference*)aLabel.FindAttribute(SALOMEDSImpl_AttributeReference::GetID()))) {
250 SALOMEDSImpl_AttributeTarget* aTarget = NULL;
251 if ((aTarget=(SALOMEDSImpl_AttributeTarget*)aReference->Get().FindAttribute(SALOMEDSImpl_AttributeTarget::GetID())))
252 aTarget->Remove(SALOMEDSImpl_Study::SObject(aLabel));
254 SALOMEDSImpl_AttributeIOR* anAttr = NULL; //Remove from IORLabel map
255 if ((anAttr=(SALOMEDSImpl_AttributeIOR*)aLabel.FindAttribute(SALOMEDSImpl_AttributeIOR::GetID()))) {
256 _study->DeleteIORLabelMapItem(anAttr->Value());
260 Lab.ForgetAllAttributes(true);
262 _doc->SetModified(true);
267 //============================================================================
268 /*! Function : LoadWith
271 //============================================================================
272 bool SALOMEDSImpl_StudyBuilder::LoadWith(const SALOMEDSImpl_SComponent& anSCO,
273 SALOMEDSImpl_Driver* aDriver)
277 DF_Label Lab = anSCO.GetLabel();
278 SALOMEDSImpl_AttributePersistentRef* Att = NULL;
280 //Find the current Url of the study
281 if ((Att=(SALOMEDSImpl_AttributePersistentRef*)_doc->Main().FindAttribute(SALOMEDSImpl_AttributePersistentRef::GetID()))) {
282 int aLocked = _study->GetProperties()->IsLocked();
283 if (aLocked) _study->GetProperties()->SetLocked(false);
285 std::string Res(Att->Value());
286 std::string aHDFPath(Res);
288 SALOMEDSImpl_AttributeComment* type = NULL;
289 std::string DataType;
290 if ((type=(SALOMEDSImpl_AttributeComment*)Lab.FindAttribute(SALOMEDSImpl_AttributeComment::GetID())))
291 DataType = type->Value();
293 // associate the driver to the SComponent
294 if(aDriver == NULL) {
295 _errorCode = "Driver is null";
299 // mpv 06.03.2003: SAL1927 - if component data if already loaded, it is not necessary to do it again
300 SALOMEDSImpl_AttributeIOR* attrIOR = NULL;
301 if ((attrIOR=(SALOMEDSImpl_AttributeIOR*)Lab.FindAttribute(SALOMEDSImpl_AttributeIOR::GetID()))) {
302 if (aLocked) _study->GetProperties()->SetLocked(true);
306 DefineComponentInstance (anSCO, aDriver->GetIOR());
309 bool isASCII = false;
310 if (HDFascii::isASCII(aHDFPath.c_str())) {
312 aHDFUrl = HDFascii::ConvertFromASCIIToHDF(aHDFPath.c_str());
313 aHDFUrl += "hdf_from_ascii.hdf";
318 //Open the Study HDF file
319 HDFfile *hdf_file = new HDFfile((char*)aHDFUrl.c_str());
321 char aMultifileState[2];
322 char ASCIIfileState[2];
324 std::string scoid = anSCO.GetID();
325 hdf_file->OpenOnDisk(HDF_RDONLY);
326 HDFgroup *hdf_group = new HDFgroup("DATACOMPONENT",hdf_file);
327 hdf_group->OpenOnDisk();
328 HDFgroup *hdf_sco_group = new HDFgroup((char*)scoid.c_str(), hdf_group);
329 hdf_sco_group->OpenOnDisk();
331 unsigned char* aStreamFile = NULL;
334 if (hdf_sco_group->ExistInternalObject("FILE_STREAM")) {
335 HDFdataset *hdf_dataset = new HDFdataset("FILE_STREAM", hdf_sco_group);
336 hdf_dataset->OpenOnDisk();
337 aStreamSize = hdf_dataset->GetSize();
338 aStreamFile = new unsigned char[aStreamSize];
339 if(aStreamFile == NULL) throw HDFexception("Unable to open dataset FILE_STREAM");
340 hdf_dataset->ReadFromDisk(aStreamFile);
341 hdf_dataset->CloseOnDisk();
346 HDFdataset *multifile_hdf_dataset = new HDFdataset("MULTIFILE_STATE", hdf_sco_group);
347 multifile_hdf_dataset->OpenOnDisk();
348 multifile_hdf_dataset->ReadFromDisk(aMultifileState);
350 HDFdataset *ascii_hdf_dataset = new HDFdataset("ASCII_STATE", hdf_sco_group);
351 ascii_hdf_dataset->OpenOnDisk();
352 ascii_hdf_dataset->ReadFromDisk(ASCIIfileState);
354 std::string aDir = SALOMEDSImpl_Tool::GetDirFromPath(Res);
356 bool aResult = (ASCIIfileState[0]=='A')?
357 aDriver->LoadASCII(anSCO, aStreamFile, aStreamSize, aDir.c_str(), aMultifileState[0]=='M'):
358 aDriver->Load(anSCO, aStreamFile, aStreamSize, aDir.c_str(), aMultifileState[0]=='M');
360 if(aStreamFile != NULL) delete []aStreamFile;
363 RemoveAttribute( anSCO, "AttributeIOR" );
365 _errorCode = "Can't load component";
366 throw HDFexception("Unable to load component");
369 //if(aDir != NULL) delete []aDir;
371 multifile_hdf_dataset->CloseOnDisk();
372 multifile_hdf_dataset = 0;
373 ascii_hdf_dataset->CloseOnDisk();
374 ascii_hdf_dataset = 0;
376 hdf_sco_group->CloseOnDisk();
378 hdf_group->CloseOnDisk();
380 hdf_file->CloseOnDisk();
384 std::vector<std::string> aFilesToRemove;
385 aFilesToRemove.push_back("hdf_from_ascii.hdf");
386 SALOMEDSImpl_Tool::RemoveTemporaryFiles(SALOMEDSImpl_Tool::GetDirFromPath(aHDFUrl),
387 aFilesToRemove, true);
390 catch (HDFexception) {
394 std::vector<std::string> aFilesToRemove;
395 aFilesToRemove.push_back(aHDFUrl);
396 SALOMEDSImpl_Tool::RemoveTemporaryFiles(SALOMEDSImpl_Tool::GetDirFromPath(aHDFUrl), aFilesToRemove, true);
399 if (aLocked) _study->GetProperties()->SetLocked(true);
400 _errorCode = "No persistent file";
405 Translate_persistentID_to_IOR (Lab, aDriver, aMultifileState[0]=='M', ASCIIfileState[0] == 'A');
407 _errorCode = "Can not convert persistent IDs to IORs";
411 if (aLocked) _study->GetProperties()->SetLocked(true);
413 _errorCode = "No persistent file";
420 //============================================================================
424 //============================================================================
425 bool SALOMEDSImpl_StudyBuilder::Load(const SALOMEDSImpl_SObject& sco)
427 _errorCode = "Not implemented";
431 //============================================================================
432 /*! Function : FindOrCreateAttribute
433 * Purpose : Add attribute of given type to SObject, if there is attribute of such type, returns
436 //============================================================================
437 DF_Attribute* SALOMEDSImpl_StudyBuilder::FindOrCreateAttribute(const SALOMEDSImpl_SObject& anObject,
438 const std::string& aTypeOfAttribute)
442 _errorCode = "Invalid arguments";
446 DF_Label Lab = anObject.GetLabel();
448 _errorCode = "Null label";
452 _doc->SetModified(true);
454 //The macro adds all necessary checks for standardly behaiving attributes
455 __FindOrCreateAttributeForBuilder
458 //Add checks for TreeNode and UserID attributes
459 if (strncmp(aTypeOfAttribute.c_str(), "AttributeTreeNode",17) == 0 ) {
461 std::string aTreeNodeGUID;
462 if (strcmp(aTypeOfAttribute.c_str(), "AttributeTreeNode") == 0) {
463 aTreeNodeGUID = SALOMEDSImpl_AttributeTreeNode::GetDefaultTreeID();
465 aTreeNodeGUID = aTypeOfAttribute.substr(21, aTypeOfAttribute.size()); // create tree node GUID by name
467 SALOMEDSImpl_AttributeTreeNode* anAttr = NULL;
468 if (!(anAttr=(SALOMEDSImpl_AttributeTreeNode*)Lab.FindAttribute(aTreeNodeGUID))) {
470 anAttr = SALOMEDSImpl_AttributeTreeNode::Set(Lab, aTreeNodeGUID);
475 if (strncmp(aTypeOfAttribute.c_str(), "AttributeUserID",15) == 0 ) {
476 std::string aUserGUID;
477 if (strcmp(aTypeOfAttribute.c_str(), "AttributeUserID") == 0) {
478 aUserGUID = SALOMEDSImpl_AttributeUserID::DefaultID();
480 aUserGUID = aTypeOfAttribute.substr(15, aTypeOfAttribute.size()); // create tree node GUID by name
482 SALOMEDSImpl_AttributeUserID* anAttr = NULL;
483 if (!(anAttr=(SALOMEDSImpl_AttributeUserID*)Lab.FindAttribute(aUserGUID))) {
485 anAttr = SALOMEDSImpl_AttributeUserID::Set(Lab, aUserGUID);
489 _errorCode = "Can not create an attribute";
494 //============================================================================
495 /*! Function : FindAttribute
496 * Purpose : Find attribute of given type assigned SObject, returns Standard_True if it is found
498 //============================================================================
500 bool SALOMEDSImpl_StudyBuilder::FindAttribute(const SALOMEDSImpl_SObject& anObject,
501 DF_Attribute*& anAttribute,
502 const std::string& aTypeOfAttribute)
506 _errorCode = "Invalid arguments";
509 DF_Label Lab = anObject.GetLabel();
510 if ((anAttribute=Lab.FindAttribute(SALOMEDSImpl_SObject::GetGUID(aTypeOfAttribute)))) {
511 // commented out because NO MODIFICATION is done to attributes when calling FindAttribute()
518 //============================================================================
519 /*! Function : RemoveAttribute
520 * Purpose : Remove attribute of given type assigned SObject
522 //============================================================================
524 bool SALOMEDSImpl_StudyBuilder::RemoveAttribute(const SALOMEDSImpl_SObject& anObject,
525 const std::string& aTypeOfAttribute)
530 _errorCode = "Invalid arguments";
533 DF_Label Lab = anObject.GetLabel();
535 if (aTypeOfAttribute == std::string("AttributeIOR")) { // Remove from IORLabel map
536 SALOMEDSImpl_AttributeIOR* anAttr = NULL;
537 if ((anAttr=(SALOMEDSImpl_AttributeIOR*)Lab.FindAttribute(SALOMEDSImpl_AttributeIOR::GetID()))) {
538 _study->DeleteIORLabelMapItem(anAttr->Value());
542 Lab.ForgetAttribute (SALOMEDSImpl_SObject::GetGUID(aTypeOfAttribute));
544 _doc->SetModified(true);
549 //============================================================================
550 /*! Function : Addreference
553 //============================================================================
554 bool SALOMEDSImpl_StudyBuilder::Addreference(const SALOMEDSImpl_SObject& me,
555 const SALOMEDSImpl_SObject& theReferencedObject)
558 if(!me || !theReferencedObject) {
559 _errorCode = "Invalid arguments";
563 DF_Label Lab = me.GetLabel();
564 DF_Label RefLab = theReferencedObject.GetLabel();
565 SALOMEDSImpl_AttributeReference::Set(Lab,RefLab);
567 SALOMEDSImpl_AttributeTarget::Set(RefLab)->Add(SALOMEDSImpl_Study::SObject(Lab));
569 if(_callbackOnRemove && Lab.IsDescendant(_doc->Main())) _callbackOnRemove->OnRemoveSObject(me);
574 //============================================================================
575 /*! Function : RemoveReference
578 //============================================================================
579 bool SALOMEDSImpl_StudyBuilder::RemoveReference(const SALOMEDSImpl_SObject& me)
582 SALOMEDSImpl_SObject theReferencedObject;
584 if(!me.ReferencedObject(theReferencedObject)) return false; //No reference is found
587 DF_Label Lab = me.GetLabel();
589 //SRN: 30 Aug, 2004 : fix from Ecole l'ete version
591 DF_Label RefLab = theReferencedObject.GetLabel();
593 SALOMEDSImpl_AttributeTarget* aTarget = NULL;
594 if((aTarget=(SALOMEDSImpl_AttributeTarget*)RefLab.FindAttribute(SALOMEDSImpl_AttributeTarget::GetID()))) {
595 aTarget->Remove(SALOMEDSImpl_Study::SObject(Lab));
598 Lab.ForgetAttribute(SALOMEDSImpl_AttributeReference::GetID());
600 _doc->SetModified(true);
607 //============================================================================
608 /*! Function : AddDirectory
609 * Purpose : adds a new directory with a path = thePath
611 //============================================================================
612 bool SALOMEDSImpl_StudyBuilder::AddDirectory(const std::string& thePath)
616 if(thePath.empty()) {
617 _errorCode = "Invalid path";
621 std::string aPath(thePath), aContext(""), aFatherPath;
623 SALOMEDSImpl_SObject anObject;
626 anObject = _study->FindObjectByPath(thePath); //Check if the directory already exists
631 _errorCode = "StudyNameAlreadyUsed";
635 if(aPath[0] != '/') { //Relative path
636 aPath.insert(aPath.begin(), '/');
637 aPath = _study->GetContext() + aPath;
640 std::vector<std::string> vs = SALOMEDSImpl_Tool::splitString(aPath, '/');
644 for(int i = 0, len = vs.size()-1; i<len; i++) {
646 aFatherPath += vs[i];
651 anObject = _study->FindObjectByPath(aFatherPath); //Check if the father directory exists
655 _errorCode = "StudyInvalidDirectory";
659 SALOMEDSImpl_SObject aNewObject = NewObject(anObject);
660 aLabel = aNewObject.GetLabel();
661 if(aLabel.IsNull()) {
662 _errorCode = "StudyInvalidComponent";
666 SALOMEDSImpl_AttributeName::Set(aLabel, vs.back());
668 //Set LocalID attribute to identify the directory object
669 SALOMEDSImpl_AttributeLocalID::Set(aLabel, DIRECTORYID);
671 _doc->SetModified(true);
677 //============================================================================
678 /*! Function : SetGUID
681 //============================================================================
682 bool SALOMEDSImpl_StudyBuilder::SetGUID(const SALOMEDSImpl_SObject& anObject,
683 const std::string& theGUID)
688 _errorCode = "Invalid arguments";
692 DF_Label aLabel = anObject.GetLabel();
693 SALOMEDSImpl_AttributeUserID::Set(aLabel, theGUID);
695 _doc->SetModified(true);
700 //============================================================================
701 /*! Function : IsGUID
704 //============================================================================
705 bool SALOMEDSImpl_StudyBuilder::IsGUID(const SALOMEDSImpl_SObject& anObject,
706 const std::string& theGUID)
710 _errorCode = "Invalid arguments";
713 DF_Label aLabel = anObject.GetLabel();
714 return aLabel.IsAttribute(theGUID);
718 //============================================================================
719 /*! Function : NewCommand
722 //============================================================================
723 void SALOMEDSImpl_StudyBuilder::NewCommand()
727 // mpv: for SAL2114 - unset "lock changed" flag at the operation start
728 _study->GetProperties()->IsLockChanged(true);
733 //============================================================================
734 /*! Function : CommitCommand
737 //============================================================================
738 void SALOMEDSImpl_StudyBuilder::CommitCommand()
741 SALOMEDSImpl_AttributeStudyProperties* anAttr = _study->GetProperties();
742 if (anAttr->IsLocked() && !anAttr->IsLockChanged(true)) {
743 _errorCode = "LockProtection";
744 throw LockProtection("LockProtection");
746 int aModif = anAttr->GetModified();
747 if (aModif < 0) aModif = 1000; // if user make undo and then - new transaction "modify" will never be zero
748 anAttr->SetModified(aModif+1);
753 _doc->SetModified(true);
756 //============================================================================
757 /*! Function : HasOpenCommand
760 //============================================================================
761 bool SALOMEDSImpl_StudyBuilder::HasOpenCommand()
769 //============================================================================
770 /*! Function : AbortCommand
773 //============================================================================
774 void SALOMEDSImpl_StudyBuilder::AbortCommand()
780 //============================================================================
784 //============================================================================
785 void SALOMEDSImpl_StudyBuilder::Undo()
789 SALOMEDSImpl_AttributeStudyProperties* anAttr = _study->GetProperties();
790 if (anAttr->IsLocked()) {
791 _errorCode = "LockProtection";
792 throw LockProtection("LockProtection");
794 anAttr->SetModified(anAttr->GetModified()-1);
797 _doc->SetModified(true);
800 //============================================================================
804 //============================================================================
805 void SALOMEDSImpl_StudyBuilder::Redo()
808 SALOMEDSImpl_AttributeStudyProperties* anAttr = _study->GetProperties();
809 if (anAttr->IsLocked()) {
810 _errorCode = "LockProtection";
811 throw LockProtection("LockProtection");
813 anAttr->SetModified(anAttr->GetModified()+1);
818 _doc->SetModified(true);
821 //============================================================================
822 /*! Function : GetAvailableUndos
825 //============================================================================
826 bool SALOMEDSImpl_StudyBuilder::GetAvailableUndos()
832 //============================================================================
833 /*! Function : GetAvailableRedos
836 //============================================================================
837 bool SALOMEDSImpl_StudyBuilder::GetAvailableRedos()
843 //============================================================================
844 /*! Function : UndoLimit
847 //============================================================================
848 int SALOMEDSImpl_StudyBuilder::UndoLimit()
854 //============================================================================
855 /*! Function : UndoLimit
858 //============================================================================
859 void SALOMEDSImpl_StudyBuilder::UndoLimit(int n)
866 //============================================================================
867 /*! Function : SetOnAddSObject
870 //============================================================================
871 SALOMEDSImpl_Callback*
872 SALOMEDSImpl_StudyBuilder::SetOnAddSObject(const SALOMEDSImpl_Callback* theCallback)
875 SALOMEDSImpl_Callback* aRet = _callbackOnAdd;
876 _callbackOnAdd = (SALOMEDSImpl_Callback*)theCallback;
880 //============================================================================
881 /*! Function : SetOnNewSObject
884 //============================================================================
885 SALOMEDSImpl_Callback*
886 SALOMEDSImpl_StudyBuilder::SetOnRemoveSObject(const SALOMEDSImpl_Callback* theCallback)
889 SALOMEDSImpl_Callback* aRet = _callbackOnRemove;
890 _callbackOnRemove = (SALOMEDSImpl_Callback*)theCallback;
894 //============================================================================
895 /*! Function : CheckLocked
898 //============================================================================
899 void SALOMEDSImpl_StudyBuilder::CheckLocked()
902 if (HasOpenCommand()) return;
903 SALOMEDSImpl_AttributeStudyProperties* anAttr = _study->GetProperties();
904 if (anAttr->IsLocked()) {
905 _errorCode = "LockProtection";
906 throw LockProtection("LockProtection");
910 //============================================================================
911 /*! Function : SetName
914 //============================================================================
915 bool SALOMEDSImpl_StudyBuilder::SetName(const SALOMEDSImpl_SObject& theSO,
916 const std::string& theValue)
921 _errorCode = "Invalid arguments";
924 SALOMEDSImpl_AttributeName::Set(theSO.GetLabel(), theValue);
926 _doc->SetModified(true);
931 //============================================================================
932 /*! Function : SetComment
935 //============================================================================
936 bool SALOMEDSImpl_StudyBuilder::SetComment(const SALOMEDSImpl_SObject& theSO,
937 const std::string& theValue)
942 _errorCode = "Invalid arguments";
945 SALOMEDSImpl_AttributeComment::Set(theSO.GetLabel(), theValue);
947 _doc->SetModified(true);
952 //============================================================================
953 /*! Function : SetIOR
956 //============================================================================
957 bool SALOMEDSImpl_StudyBuilder::SetIOR(const SALOMEDSImpl_SObject& theSO,
958 const std::string& theValue)
963 _errorCode = "Invalid arguments";
966 SALOMEDSImpl_AttributeIOR::Set(theSO.GetLabel(), theValue);
968 _doc->SetModified(true);
974 //============================================================================
975 /*! Function : Translate_persistentID_to_IOR
978 //============================================================================
979 static void Translate_persistentID_to_IOR(DF_Label& Lab, SALOMEDSImpl_Driver* driver, bool isMultiFile, bool isASCII)
981 if(driver == NULL) return;
982 DF_ChildIterator itchild (Lab);
984 for (; itchild.More(); itchild.Next()) {
985 DF_Label current = itchild.Value();
986 SALOMEDSImpl_AttributePersistentRef* Att = NULL;
987 if ((Att=(SALOMEDSImpl_AttributePersistentRef*)current.FindAttribute(SALOMEDSImpl_AttributePersistentRef::GetID()))) {
989 SALOMEDSImpl_AttributeLocalID* anID = NULL;
990 if ((anID=(SALOMEDSImpl_AttributeLocalID*)current.FindAttribute(SALOMEDSImpl_AttributeLocalID::GetID())))
991 if (anID->Value() == FILELOCALID) continue; //SRN: This attribute store a file name, skip it
993 std::string persist_ref = Att->Value();
994 SALOMEDSImpl_SObject so = SALOMEDSImpl_Study::SObject(current);
995 std::string ior_string = driver->LocalPersistentIDToIOR(so,
999 SALOMEDSImpl_AttributeIOR::Set (current, ior_string);
1002 Translate_persistentID_to_IOR (current, driver, isMultiFile, isASCII);