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/ or email : webmaster.salome@opencascade.com
20 // File : SALOMEDSImpl_StudyBuilder.cxx
21 // Author : Sergey RUIN
26 #include "SALOMEDSImpl_Attributes.hxx"
27 #include "SALOMEDSImpl_Study.hxx"
28 #include "SALOMEDSImpl_StudyBuilder.hxx"
29 #include "SALOMEDSImpl_SObject.hxx"
30 #include "SALOMEDSImpl_SComponent.hxx"
31 #include "SALOMEDSImpl_Tool.hxx"
32 #include "SALOMEDSImpl_ChildNodeIterator.hxx"
34 #include "DF_ChildIterator.hxx"
35 #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)
56 _study = (SALOMEDSImpl_Study*)theOwner;
57 _doc = _study->GetDocument();
60 //============================================================================
61 /*! Function : destructor
64 //============================================================================
65 SALOMEDSImpl_StudyBuilder::~SALOMEDSImpl_StudyBuilder()
68 //============================================================================
69 /*! Function : NewComponent
70 * Purpose : Create a new component (Scomponent)
72 //============================================================================
73 SALOMEDSImpl_SComponent SALOMEDSImpl_StudyBuilder::NewComponent(const string& DataType)
78 SALOMEDSImpl_SComponent sco;
80 if(DataType.size() == 0) return sco;
82 //Always create component under main label.
83 DF_Label L = _doc->Main();
86 for (DF_ChildIterator it(L); it.More(); it.Next()) {
87 if (it.Value().Tag() > imax)
88 imax = it.Value().Tag();
91 DF_Label NL = L.FindChild(imax);
93 SALOMEDSImpl_AttributeComment::Set(NL, DataType);
95 SALOMEDSImpl_SComponent so = _study->GetSComponent (NL);
97 if(_callbackOnAdd) _callbackOnAdd->OnAddSObject(so);
99 _doc->SetModified(true);
104 //============================================================================
105 /*! Function : DefineComponentInstance
106 * Purpose : Add IOR attribute of a Scomponent
108 //============================================================================
109 bool SALOMEDSImpl_StudyBuilder::DefineComponentInstance(const SALOMEDSImpl_SComponent& aComponent,
115 if(!aComponent || IOR.empty()) {
116 _errorCode = "Invalid arguments";
120 SALOMEDSImpl_AttributeIOR::Set(aComponent.GetLabel(), IOR);
125 //============================================================================
126 /*! Function : RemoveComponent
127 * Purpose : Delete a Scomponent
129 //============================================================================
130 bool SALOMEDSImpl_StudyBuilder::RemoveComponent(const SALOMEDSImpl_SComponent& aComponent)
134 return RemoveObject(aComponent);
137 //============================================================================
138 /*! Function : NewObject
139 * Purpose : Create a new SObject
141 //============================================================================
142 SALOMEDSImpl_SObject SALOMEDSImpl_StudyBuilder::NewObject(const SALOMEDSImpl_SObject& theFatherObject)
147 //Find label of father
148 DF_Label Lab = theFatherObject.GetLabel();
152 for (DF_ChildIterator it(Lab); it.More(); it.Next()) {
153 if (it.Value().Tag() > imax)
154 imax = it.Value().Tag();
157 DF_Label NewLab = Lab.FindChild(imax);
159 SALOMEDSImpl_SObject so = _study->GetSObject(NewLab);
160 if(_callbackOnAdd) _callbackOnAdd->OnAddSObject(so);
162 _doc->SetModified(true);
166 //============================================================================
167 /*! Function : NewObjectToTag
170 //============================================================================
171 SALOMEDSImpl_SObject SALOMEDSImpl_StudyBuilder::NewObjectToTag(const SALOMEDSImpl_SObject& theFatherObject,
176 //Find label of father
177 DF_Label Lab = theFatherObject.GetLabel();
179 //Create or find label
180 DF_Label NewLab = Lab.FindChild(theTag, 1);
182 SALOMEDSImpl_SObject so = _study->GetSObject(NewLab);
184 if(_callbackOnAdd) _callbackOnAdd->OnAddSObject(so);
186 _doc->SetModified(true);
190 //============================================================================
191 /*! Function : RemoveObject
194 //============================================================================
195 bool SALOMEDSImpl_StudyBuilder::RemoveObject(const SALOMEDSImpl_SObject& anObject)
200 _errorCode = "Null object";
204 if(_callbackOnRemove) _callbackOnRemove->OnRemoveSObject(anObject);
206 DF_Label Lab = anObject.GetLabel();
208 SALOMEDSImpl_AttributeReference* aReference = NULL;
209 if ((aReference=(SALOMEDSImpl_AttributeReference*)Lab.FindAttribute(SALOMEDSImpl_AttributeReference::GetID()))) {
210 SALOMEDSImpl_AttributeTarget* aTarget = NULL;
211 if ((aTarget=(SALOMEDSImpl_AttributeTarget*)aReference->Get().FindAttribute(SALOMEDSImpl_AttributeTarget::GetID())))
212 aTarget->Remove(SALOMEDSImpl_Study::SObject(Lab));
215 SALOMEDSImpl_AttributeIOR* anAttr = NULL; //Remove from IORLabel map
216 if ((anAttr=(SALOMEDSImpl_AttributeIOR*)Lab.FindAttribute(SALOMEDSImpl_AttributeIOR::GetID()))) {
219 Lab.ForgetAllAttributes();
221 _doc->SetModified(true);
226 //============================================================================
227 /*! Function : RemoveObjectWithChildren
230 //============================================================================
231 bool SALOMEDSImpl_StudyBuilder::RemoveObjectWithChildren(const SALOMEDSImpl_SObject& anObject)
236 _errorCode = "Null object";
240 if(_callbackOnRemove) _callbackOnRemove->OnRemoveSObject(anObject);
242 DF_Label Lab = anObject.GetLabel();
244 SALOMEDSImpl_AttributeReference* aReference = NULL;
245 if ((aReference=(SALOMEDSImpl_AttributeReference*)Lab.FindAttribute(SALOMEDSImpl_AttributeReference::GetID()))) {
246 SALOMEDSImpl_AttributeTarget* aTarget = NULL;
247 if ((aTarget=(SALOMEDSImpl_AttributeTarget*)aReference->Get().FindAttribute(SALOMEDSImpl_AttributeTarget::GetID())))
248 aTarget->Remove(SALOMEDSImpl_Study::SObject(Lab));
250 SALOMEDSImpl_AttributeIOR* anAttr = NULL; //Remove from IORLabel map
251 if ((anAttr=(SALOMEDSImpl_AttributeIOR*)Lab.FindAttribute(SALOMEDSImpl_AttributeIOR::GetID()))) {
254 DF_ChildIterator it(Lab, true);
255 for(;it.More();it.Next()) {
256 DF_Label aLabel = it.Value();
257 if ((aReference=(SALOMEDSImpl_AttributeReference*)aLabel.FindAttribute(SALOMEDSImpl_AttributeReference::GetID()))) {
258 SALOMEDSImpl_AttributeTarget* aTarget = NULL;
259 if ((aTarget=(SALOMEDSImpl_AttributeTarget*)aReference->Get().FindAttribute(SALOMEDSImpl_AttributeTarget::GetID())))
260 aTarget->Remove(SALOMEDSImpl_Study::SObject(aLabel));
262 SALOMEDSImpl_AttributeIOR* anAttr = NULL; //Remove from IORLabel map
263 if ((anAttr=(SALOMEDSImpl_AttributeIOR*)aLabel.FindAttribute(SALOMEDSImpl_AttributeIOR::GetID()))) {
267 Lab.ForgetAllAttributes(true);
269 _doc->SetModified(true);
274 //============================================================================
275 /*! Function : LoadWith
278 //============================================================================
279 bool SALOMEDSImpl_StudyBuilder::LoadWith(const SALOMEDSImpl_SComponent& anSCO,
280 SALOMEDSImpl_Driver* aDriver)
284 DF_Label Lab = anSCO.GetLabel();
285 SALOMEDSImpl_AttributePersistentRef* Att = NULL;
287 //Find the current Url of the study
288 if ((Att=(SALOMEDSImpl_AttributePersistentRef*)_doc->Main().FindAttribute(SALOMEDSImpl_AttributePersistentRef::GetID()))) {
289 int aLocked = _study->GetProperties()->IsLocked();
290 if (aLocked) _study->GetProperties()->SetLocked(false);
292 std::string Res(Att->Value());
293 string aHDFPath(Res);
295 SALOMEDSImpl_AttributeComment* type = NULL;
296 std::string DataType;
297 if ((type=(SALOMEDSImpl_AttributeComment*)Lab.FindAttribute(SALOMEDSImpl_AttributeComment::GetID())))
298 DataType = type->Value();
300 // associate the driver to the SComponent
301 if(aDriver == NULL) {
302 _errorCode = "Driver is null";
306 // mpv 06.03.2003: SAL1927 - if component data if already loaded, it is not necessary to do it again
307 SALOMEDSImpl_AttributeIOR* attrIOR = NULL;
308 if ((attrIOR=(SALOMEDSImpl_AttributeIOR*)Lab.FindAttribute(SALOMEDSImpl_AttributeIOR::GetID()))) {
309 if (aLocked) _study->GetProperties()->SetLocked(true);
313 DefineComponentInstance (anSCO, aDriver->GetIOR());
316 bool isASCII = false;
317 if (HDFascii::isASCII(aHDFPath.c_str())) {
319 aHDFUrl = HDFascii::ConvertFromASCIIToHDF(aHDFPath.c_str());
320 aHDFUrl += "hdf_from_ascii.hdf";
325 //Open the Study HDF file
326 HDFfile *hdf_file = new HDFfile((char*)aHDFUrl.c_str());
328 char aMultifileState[2];
329 char ASCIIfileState[2];
331 string scoid = anSCO.GetID();
332 hdf_file->OpenOnDisk(HDF_RDONLY);
333 HDFgroup *hdf_group = new HDFgroup("DATACOMPONENT",hdf_file);
334 hdf_group->OpenOnDisk();
335 HDFgroup *hdf_sco_group = new HDFgroup((char*)scoid.c_str(), hdf_group);
336 hdf_sco_group->OpenOnDisk();
338 unsigned char* aStreamFile = NULL;
341 if (hdf_sco_group->ExistInternalObject("FILE_STREAM")) {
342 HDFdataset *hdf_dataset = new HDFdataset("FILE_STREAM", hdf_sco_group);
343 hdf_dataset->OpenOnDisk();
344 aStreamSize = hdf_dataset->GetSize();
345 aStreamFile = new unsigned char[aStreamSize];
346 if(aStreamFile == NULL) throw HDFexception("Unable to open dataset FILE_STREAM");
347 hdf_dataset->ReadFromDisk(aStreamFile);
348 hdf_dataset->CloseOnDisk();
353 HDFdataset *multifile_hdf_dataset = new HDFdataset("MULTIFILE_STATE", hdf_sco_group);
354 multifile_hdf_dataset->OpenOnDisk();
355 multifile_hdf_dataset->ReadFromDisk(aMultifileState);
357 HDFdataset *ascii_hdf_dataset = new HDFdataset("ASCII_STATE", hdf_sco_group);
358 ascii_hdf_dataset->OpenOnDisk();
359 ascii_hdf_dataset->ReadFromDisk(ASCIIfileState);
361 string aDir = SALOMEDSImpl_Tool::GetDirFromPath(Res);
363 bool aResult = (ASCIIfileState[0]=='A')?
364 aDriver->LoadASCII(anSCO, aStreamFile, aStreamSize, aDir.c_str(), aMultifileState[0]=='M'):
365 aDriver->Load(anSCO, aStreamFile, aStreamSize, aDir.c_str(), aMultifileState[0]=='M');
367 if(aStreamFile != NULL) delete []aStreamFile;
370 RemoveAttribute( anSCO, "AttributeIOR" );
372 _errorCode = "Can't load component";
373 throw HDFexception("Unable to load component");
376 //if(aDir != NULL) delete []aDir;
378 multifile_hdf_dataset->CloseOnDisk();
379 multifile_hdf_dataset = 0;
380 ascii_hdf_dataset->CloseOnDisk();
381 ascii_hdf_dataset = 0;
383 hdf_sco_group->CloseOnDisk();
385 hdf_group->CloseOnDisk();
387 hdf_file->CloseOnDisk();
391 vector<string> aFilesToRemove;
392 aFilesToRemove.push_back("hdf_from_ascii.hdf");
393 SALOMEDSImpl_Tool::RemoveTemporaryFiles(SALOMEDSImpl_Tool::GetDirFromPath(aHDFUrl),
394 aFilesToRemove, true);
397 catch (HDFexception) {
401 vector<string> aFilesToRemove;
402 aFilesToRemove.push_back(aHDFUrl);
403 SALOMEDSImpl_Tool::RemoveTemporaryFiles(SALOMEDSImpl_Tool::GetDirFromPath(aHDFUrl), aFilesToRemove, true);
406 if (aLocked) _study->GetProperties()->SetLocked(true);
407 _errorCode = "No persistent file";
412 Translate_persistentID_to_IOR (Lab, aDriver, aMultifileState[0]=='M', ASCIIfileState[0] == 'A');
414 _errorCode = "Can not convert persistent IDs to IORs";
418 if (aLocked) _study->GetProperties()->SetLocked(true);
420 _errorCode = "No persistent file";
427 //============================================================================
431 //============================================================================
432 bool SALOMEDSImpl_StudyBuilder::Load(const SALOMEDSImpl_SObject& sco)
434 _errorCode = "Not implemented";
438 //============================================================================
439 /*! Function : FindOrCreateAttribute
440 * Purpose : Add attribute of given type to SObject, if there is attribute of such type, returns
443 //============================================================================
444 DF_Attribute* SALOMEDSImpl_StudyBuilder::FindOrCreateAttribute(const SALOMEDSImpl_SObject& anObject,
445 const string& aTypeOfAttribute)
449 _errorCode = "Invalid arguments";
453 DF_Label Lab = anObject.GetLabel();
455 _errorCode = "Null label";
459 _doc->SetModified(true);
461 //The macro adds all necessary checks for standardly behaiving attributes
462 __FindOrCreateAttributeForBuilder
465 //Add checks for TreeNode and UserID attributes
466 if (strncmp(aTypeOfAttribute.c_str(), "AttributeTreeNode",17) == 0 ) {
468 string aTreeNodeGUID;
469 if (strcmp(aTypeOfAttribute.c_str(), "AttributeTreeNode") == 0) {
470 aTreeNodeGUID = SALOMEDSImpl_AttributeTreeNode::GetDefaultTreeID();
472 aTreeNodeGUID = aTypeOfAttribute.substr(21, aTypeOfAttribute.size()); // create tree node GUID by name
474 SALOMEDSImpl_AttributeTreeNode* anAttr = NULL;
475 if (!(anAttr=(SALOMEDSImpl_AttributeTreeNode*)Lab.FindAttribute(aTreeNodeGUID))) {
477 anAttr = SALOMEDSImpl_AttributeTreeNode::Set(Lab, aTreeNodeGUID);
482 if (strncmp(aTypeOfAttribute.c_str(), "AttributeUserID",15) == 0 ) {
483 std::string aUserGUID;
484 if (strcmp(aTypeOfAttribute.c_str(), "AttributeUserID") == 0) {
485 aUserGUID = SALOMEDSImpl_AttributeUserID::DefaultID();
487 aUserGUID = aTypeOfAttribute.substr(15, aTypeOfAttribute.size()); // create tree node GUID by name
489 SALOMEDSImpl_AttributeUserID* anAttr = NULL;
490 if (!(anAttr=(SALOMEDSImpl_AttributeUserID*)Lab.FindAttribute(aUserGUID))) {
492 anAttr = SALOMEDSImpl_AttributeUserID::Set(Lab, aUserGUID);
496 _errorCode = "Can not create an attribute";
501 //============================================================================
502 /*! Function : FindAttribute
503 * Purpose : Find attribute of given type assigned SObject, returns Standard_True if it is found
505 //============================================================================
507 bool SALOMEDSImpl_StudyBuilder::FindAttribute(const SALOMEDSImpl_SObject& anObject,
508 DF_Attribute*& anAttribute,
509 const string& aTypeOfAttribute)
513 _errorCode = "Invalid arguments";
516 DF_Label Lab = anObject.GetLabel();
517 if ((anAttribute=Lab.FindAttribute(SALOMEDSImpl_SObject::GetGUID(aTypeOfAttribute)))) {
518 // commented out because NO MODIFICATION is done to attributes when calling FindAttribute()
525 //============================================================================
526 /*! Function : RemoveAttribute
527 * Purpose : Remove attribute of given type assigned SObject
529 //============================================================================
531 bool SALOMEDSImpl_StudyBuilder::RemoveAttribute(const SALOMEDSImpl_SObject& anObject,
532 const string& aTypeOfAttribute)
537 _errorCode = "Invalid arguments";
540 DF_Label Lab = anObject.GetLabel();
542 if (aTypeOfAttribute == string("AttributeIOR")) { // Remove from IORLabel map
543 SALOMEDSImpl_AttributeIOR* anAttr = NULL;
544 if ((anAttr=(SALOMEDSImpl_AttributeIOR*)Lab.FindAttribute(SALOMEDSImpl_AttributeIOR::GetID()))) {
548 Lab.ForgetAttribute (SALOMEDSImpl_SObject::GetGUID(aTypeOfAttribute));
550 _doc->SetModified(true);
555 //============================================================================
556 /*! Function : Addreference
559 //============================================================================
560 bool SALOMEDSImpl_StudyBuilder::Addreference(const SALOMEDSImpl_SObject& me,
561 const SALOMEDSImpl_SObject& theReferencedObject)
564 if(!me || !theReferencedObject) {
565 _errorCode = "Invalid arguments";
569 DF_Label Lab = me.GetLabel();
570 DF_Label RefLab = theReferencedObject.GetLabel();
571 SALOMEDSImpl_AttributeReference::Set(Lab,RefLab);
573 SALOMEDSImpl_AttributeTarget::Set(RefLab)->Add(SALOMEDSImpl_Study::SObject(Lab));
575 if(_callbackOnRemove && Lab.IsDescendant(_doc->Main())) _callbackOnRemove->OnRemoveSObject(me);
580 //============================================================================
581 /*! Function : RemoveReference
584 //============================================================================
585 bool SALOMEDSImpl_StudyBuilder::RemoveReference(const SALOMEDSImpl_SObject& me)
588 SALOMEDSImpl_SObject theReferencedObject;
590 if(!me.ReferencedObject(theReferencedObject)) return false; //No reference is found
593 DF_Label Lab = me.GetLabel();
595 //SRN: 30 Aug, 2004 : fix from Ecole l'ete version
597 DF_Label RefLab = theReferencedObject.GetLabel();
599 SALOMEDSImpl_AttributeTarget* aTarget = NULL;
600 if((aTarget=(SALOMEDSImpl_AttributeTarget*)RefLab.FindAttribute(SALOMEDSImpl_AttributeTarget::GetID()))) {
601 aTarget->Remove(SALOMEDSImpl_Study::SObject(Lab));
604 Lab.ForgetAttribute(SALOMEDSImpl_AttributeReference::GetID());
606 _doc->SetModified(true);
613 //============================================================================
614 /*! Function : AddDirectory
615 * Purpose : adds a new directory with a path = thePath
617 //============================================================================
618 bool SALOMEDSImpl_StudyBuilder::AddDirectory(const string& thePath)
622 if(thePath.empty()) {
623 _errorCode = "Invalid path";
627 string aPath(thePath), aContext(""), aFatherPath;
629 SALOMEDSImpl_SObject anObject;
632 anObject = _study->FindObjectByPath(thePath); //Check if the directory already exists
637 _errorCode = "StudyNameAlreadyUsed";
641 if(aPath[0] != '/') { //Relative path
642 aPath.insert(aPath.begin(), '/');
643 aPath = _study->GetContext() + aPath;
646 vector<string> vs = SALOMEDSImpl_Tool::splitString(aPath, '/');
650 for(int i = 0, len = vs.size()-1; i<len; i++) {
652 aFatherPath += vs[i];
657 anObject = _study->FindObjectByPath(aFatherPath); //Check if the father directory exists
661 _errorCode = "StudyInvalidDirectory";
665 SALOMEDSImpl_SObject aNewObject = NewObject(anObject);
666 aLabel = aNewObject.GetLabel();
667 if(aLabel.IsNull()) {
668 _errorCode = "StudyInvalidComponent";
672 SALOMEDSImpl_AttributeName::Set(aLabel, vs.back());
674 //Set LocalID attribute to identify the directory object
675 SALOMEDSImpl_AttributeLocalID::Set(aLabel, DIRECTORYID);
677 _doc->SetModified(true);
683 //============================================================================
684 /*! Function : SetGUID
687 //============================================================================
688 bool SALOMEDSImpl_StudyBuilder::SetGUID(const SALOMEDSImpl_SObject& anObject,
689 const string& theGUID)
694 _errorCode = "Invalid arguments";
698 DF_Label aLabel = anObject.GetLabel();
699 SALOMEDSImpl_AttributeUserID::Set(aLabel, theGUID);
701 _doc->SetModified(true);
706 //============================================================================
707 /*! Function : IsGUID
710 //============================================================================
711 bool SALOMEDSImpl_StudyBuilder::IsGUID(const SALOMEDSImpl_SObject& anObject,
712 const string& theGUID)
716 _errorCode = "Invalid arguments";
719 DF_Label aLabel = anObject.GetLabel();
720 return aLabel.IsAttribute(theGUID);
724 //============================================================================
725 /*! Function : NewCommand
728 //============================================================================
729 void SALOMEDSImpl_StudyBuilder::NewCommand()
733 // mpv: for SAL2114 - unset "lock changed" flag at the operation start
734 _study->GetProperties()->IsLockChanged(true);
739 //============================================================================
740 /*! Function : CommitCommand
743 //============================================================================
744 void SALOMEDSImpl_StudyBuilder::CommitCommand()
747 SALOMEDSImpl_AttributeStudyProperties* anAttr = _study->GetProperties();
748 if (anAttr->IsLocked() && !anAttr->IsLockChanged(true)) {
749 _errorCode = "LockProtection";
750 throw LockProtection("LockProtection");
752 int aModif = anAttr->GetModified();
753 if (aModif < 0) aModif = 1000; // if user make undo and then - new transaction "modify" will never be zero
754 anAttr->SetModified(aModif+1);
759 _doc->SetModified(true);
762 //============================================================================
763 /*! Function : HasOpenCommand
766 //============================================================================
767 bool SALOMEDSImpl_StudyBuilder::HasOpenCommand()
775 //============================================================================
776 /*! Function : AbortCommand
779 //============================================================================
780 void SALOMEDSImpl_StudyBuilder::AbortCommand()
786 //============================================================================
790 //============================================================================
791 void SALOMEDSImpl_StudyBuilder::Undo()
795 SALOMEDSImpl_AttributeStudyProperties* anAttr = _study->GetProperties();
796 if (anAttr->IsLocked()) {
797 _errorCode = "LockProtection";
798 throw LockProtection("LockProtection");
800 anAttr->SetModified(anAttr->GetModified()-1);
803 _doc->SetModified(true);
806 //============================================================================
810 //============================================================================
811 void SALOMEDSImpl_StudyBuilder::Redo()
814 SALOMEDSImpl_AttributeStudyProperties* anAttr = _study->GetProperties();
815 if (anAttr->IsLocked()) {
816 _errorCode = "LockProtection";
817 throw LockProtection("LockProtection");
819 anAttr->SetModified(anAttr->GetModified()+1);
824 _doc->SetModified(true);
827 //============================================================================
828 /*! Function : GetAvailableUndos
831 //============================================================================
832 bool SALOMEDSImpl_StudyBuilder::GetAvailableUndos()
838 //============================================================================
839 /*! Function : GetAvailableRedos
842 //============================================================================
843 bool SALOMEDSImpl_StudyBuilder::GetAvailableRedos()
849 //============================================================================
850 /*! Function : UndoLimit
853 //============================================================================
854 int SALOMEDSImpl_StudyBuilder::UndoLimit()
860 //============================================================================
861 /*! Function : UndoLimit
864 //============================================================================
865 void SALOMEDSImpl_StudyBuilder::UndoLimit(int n)
872 //============================================================================
873 /*! Function : SetOnAddSObject
876 //============================================================================
877 SALOMEDSImpl_Callback*
878 SALOMEDSImpl_StudyBuilder::SetOnAddSObject(const SALOMEDSImpl_Callback* theCallback)
881 SALOMEDSImpl_Callback* aRet = _callbackOnAdd;
882 _callbackOnAdd = (SALOMEDSImpl_Callback*)theCallback;
886 //============================================================================
887 /*! Function : SetOnNewSObject
890 //============================================================================
891 SALOMEDSImpl_Callback*
892 SALOMEDSImpl_StudyBuilder::SetOnRemoveSObject(const SALOMEDSImpl_Callback* theCallback)
895 SALOMEDSImpl_Callback* aRet = _callbackOnRemove;
896 _callbackOnRemove = (SALOMEDSImpl_Callback*)theCallback;
900 //============================================================================
901 /*! Function : CheckLocked
904 //============================================================================
905 void SALOMEDSImpl_StudyBuilder::CheckLocked()
908 if (HasOpenCommand()) return;
909 SALOMEDSImpl_AttributeStudyProperties* anAttr = _study->GetProperties();
910 if (anAttr->IsLocked()) {
911 _errorCode = "LockProtection";
912 throw LockProtection("LockProtection");
916 //============================================================================
917 /*! Function : SetName
920 //============================================================================
921 bool SALOMEDSImpl_StudyBuilder::SetName(const SALOMEDSImpl_SObject& theSO,
922 const string& theValue)
927 _errorCode = "Invalid arguments";
930 SALOMEDSImpl_AttributeName::Set(theSO.GetLabel(), theValue);
932 _doc->SetModified(true);
937 //============================================================================
938 /*! Function : SetComment
941 //============================================================================
942 bool SALOMEDSImpl_StudyBuilder::SetComment(const SALOMEDSImpl_SObject& theSO,
943 const string& theValue)
948 _errorCode = "Invalid arguments";
951 SALOMEDSImpl_AttributeComment::Set(theSO.GetLabel(), theValue);
953 _doc->SetModified(true);
958 //============================================================================
959 /*! Function : SetIOR
962 //============================================================================
963 bool SALOMEDSImpl_StudyBuilder::SetIOR(const SALOMEDSImpl_SObject& theSO,
964 const string& theValue)
969 _errorCode = "Invalid arguments";
972 SALOMEDSImpl_AttributeIOR::Set(theSO.GetLabel(), theValue);
974 _doc->SetModified(true);
980 //============================================================================
981 /*! Function : Translate_persistentID_to_IOR
984 //============================================================================
985 static void Translate_persistentID_to_IOR(DF_Label& Lab, SALOMEDSImpl_Driver* driver, bool isMultiFile, bool isASCII)
987 if(driver == NULL) return;
988 DF_ChildIterator itchild (Lab);
990 for (; itchild.More(); itchild.Next()) {
991 DF_Label current = itchild.Value();
992 SALOMEDSImpl_AttributePersistentRef* Att = NULL;
993 if ((Att=(SALOMEDSImpl_AttributePersistentRef*)current.FindAttribute(SALOMEDSImpl_AttributePersistentRef::GetID()))) {
995 SALOMEDSImpl_AttributeLocalID* anID = NULL;
996 if ((anID=(SALOMEDSImpl_AttributeLocalID*)current.FindAttribute(SALOMEDSImpl_AttributeLocalID::GetID())))
997 if (anID->Value() == FILELOCALID) continue; //SRN: This attribute store a file name, skip it
999 string persist_ref = Att->Value();
1000 SALOMEDSImpl_SObject so = SALOMEDSImpl_Study::SObject(current);
1001 string ior_string = driver->LocalPersistentIDToIOR(so,
1005 SALOMEDSImpl_AttributeIOR::Set (current, ior_string);
1008 Translate_persistentID_to_IOR (current, driver, isMultiFile, isASCII);