1 // Copyright (C) 2007-2015 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, or (at your option) any later version.
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);
94 _study->addSO_Notification(so);
96 _doc->SetModified(true);
101 //============================================================================
102 /*! Function : DefineComponentInstance
103 * Purpose : Add IOR attribute of a Scomponent
105 //============================================================================
106 bool SALOMEDSImpl_StudyBuilder::DefineComponentInstance(const SALOMEDSImpl_SComponent& aComponent,
107 const std::string& IOR)
112 if(!aComponent || IOR.empty()) {
113 _errorCode = "Invalid arguments";
117 SALOMEDSImpl_AttributeIOR::Set(aComponent.GetLabel(), IOR);
122 //============================================================================
123 /*! Function : RemoveComponent
124 * Purpose : Delete a Scomponent
126 //============================================================================
127 bool SALOMEDSImpl_StudyBuilder::RemoveComponent(const SALOMEDSImpl_SComponent& aComponent)
131 return RemoveObject(aComponent);
134 //============================================================================
135 /*! Function : NewObject
136 * Purpose : Create a new SObject
138 //============================================================================
139 SALOMEDSImpl_SObject SALOMEDSImpl_StudyBuilder::NewObject(const SALOMEDSImpl_SObject& theFatherObject)
144 //Find label of father
145 DF_Label Lab = theFatherObject.GetLabel();
148 DF_Label NewLab = Lab.NewChild();
150 SALOMEDSImpl_SObject so = _study->GetSObject(NewLab);
151 if(_callbackOnAdd) _callbackOnAdd->OnAddSObject(so);
152 _study->addSO_Notification(so);
154 _doc->SetModified(true);
158 //============================================================================
159 /*! Function : NewObjectToTag
162 //============================================================================
163 SALOMEDSImpl_SObject SALOMEDSImpl_StudyBuilder::NewObjectToTag(const SALOMEDSImpl_SObject& theFatherObject,
168 //Find label of father
169 DF_Label Lab = theFatherObject.GetLabel();
171 //Create or find label
172 DF_Label NewLab = Lab.FindChild(theTag, 1);
174 SALOMEDSImpl_SObject so = _study->GetSObject(NewLab);
176 if(_callbackOnAdd) _callbackOnAdd->OnAddSObject(so);
177 _study->addSO_Notification(so);
179 _doc->SetModified(true);
183 //============================================================================
184 /*! Function : RemoveObject
187 //============================================================================
188 bool SALOMEDSImpl_StudyBuilder::RemoveObject(const SALOMEDSImpl_SObject& anObject)
193 _errorCode = "Null object";
197 if(_callbackOnRemove) _callbackOnRemove->OnRemoveSObject(anObject);
199 DF_Label Lab = anObject.GetLabel();
201 SALOMEDSImpl_AttributeReference* aReference = NULL;
202 if ((aReference=(SALOMEDSImpl_AttributeReference*)Lab.FindAttribute(SALOMEDSImpl_AttributeReference::GetID()))) {
203 SALOMEDSImpl_AttributeTarget* aTarget = NULL;
204 if ((aTarget=(SALOMEDSImpl_AttributeTarget*)aReference->Get().FindAttribute(SALOMEDSImpl_AttributeTarget::GetID())))
205 aTarget->Remove(SALOMEDSImpl_Study::SObject(Lab));
208 SALOMEDSImpl_AttributeIOR* anAttr = NULL; //Remove from IORLabel map
209 if ((anAttr=(SALOMEDSImpl_AttributeIOR*)Lab.FindAttribute(SALOMEDSImpl_AttributeIOR::GetID()))) {
210 _study->DeleteIORLabelMapItem(anAttr->Value());
213 Lab.ForgetAllAttributes();
215 _doc->SetModified(true);
216 _study->removeSO_Notification(anObject);
221 //============================================================================
222 /*! Function : RemoveObjectWithChildren
225 //============================================================================
226 bool SALOMEDSImpl_StudyBuilder::RemoveObjectWithChildren(const SALOMEDSImpl_SObject& anObject)
231 _errorCode = "Null object";
235 if(_callbackOnRemove) _callbackOnRemove->OnRemoveSObject(anObject);
237 DF_Label Lab = anObject.GetLabel();
239 SALOMEDSImpl_AttributeReference* aReference = NULL;
240 if ((aReference=(SALOMEDSImpl_AttributeReference*)Lab.FindAttribute(SALOMEDSImpl_AttributeReference::GetID()))) {
241 SALOMEDSImpl_AttributeTarget* aTarget = NULL;
242 if ((aTarget=(SALOMEDSImpl_AttributeTarget*)aReference->Get().FindAttribute(SALOMEDSImpl_AttributeTarget::GetID())))
243 aTarget->Remove(SALOMEDSImpl_Study::SObject(Lab));
245 SALOMEDSImpl_AttributeIOR* anAttr = NULL; //Remove from IORLabel map
246 if ((anAttr=(SALOMEDSImpl_AttributeIOR*)Lab.FindAttribute(SALOMEDSImpl_AttributeIOR::GetID()))) {
247 _study->DeleteIORLabelMapItem(anAttr->Value());
250 DF_ChildIterator it(Lab, true);
251 for(;it.More();it.Next()) {
252 DF_Label aLabel = it.Value();
253 if ((aReference=(SALOMEDSImpl_AttributeReference*)aLabel.FindAttribute(SALOMEDSImpl_AttributeReference::GetID()))) {
254 SALOMEDSImpl_AttributeTarget* aTarget = NULL;
255 if ((aTarget=(SALOMEDSImpl_AttributeTarget*)aReference->Get().FindAttribute(SALOMEDSImpl_AttributeTarget::GetID())))
256 aTarget->Remove(SALOMEDSImpl_Study::SObject(aLabel));
258 SALOMEDSImpl_AttributeIOR* anAttr = NULL; //Remove from IORLabel map
259 if ((anAttr=(SALOMEDSImpl_AttributeIOR*)aLabel.FindAttribute(SALOMEDSImpl_AttributeIOR::GetID()))) {
260 _study->DeleteIORLabelMapItem(anAttr->Value());
264 Lab.ForgetAllAttributes(true);
266 _doc->SetModified(true);
267 _study->removeSO_Notification(anObject);
272 //============================================================================
273 /*! Function : LoadWith
276 //============================================================================
277 bool SALOMEDSImpl_StudyBuilder::LoadWith(const SALOMEDSImpl_SComponent& anSCO,
278 SALOMEDSImpl_Driver* aDriver)
282 DF_Label Lab = anSCO.GetLabel();
283 SALOMEDSImpl_AttributePersistentRef* Att = NULL;
285 //Find the current Url of the study
286 if ((Att=(SALOMEDSImpl_AttributePersistentRef*)_doc->Main().FindAttribute(SALOMEDSImpl_AttributePersistentRef::GetID()))) {
287 int aLocked = _study->GetProperties()->IsLocked();
288 if (aLocked) _study->GetProperties()->SetLocked(false);
290 std::string Res(Att->Value());
291 std::string aHDFPath(Res);
293 SALOMEDSImpl_AttributeComment* type = NULL;
294 std::string DataType;
295 if ((type=(SALOMEDSImpl_AttributeComment*)Lab.FindAttribute(SALOMEDSImpl_AttributeComment::GetID())))
296 DataType = type->Value();
298 // associate the driver to the SComponent
299 if(aDriver == NULL) {
300 _errorCode = "Driver is null";
304 // mpv 06.03.2003: SAL1927 - if component data if already loaded, it is not necessary to do it again
305 SALOMEDSImpl_AttributeIOR* attrIOR = NULL;
306 if ((attrIOR=(SALOMEDSImpl_AttributeIOR*)Lab.FindAttribute(SALOMEDSImpl_AttributeIOR::GetID()))) {
307 if (aLocked) _study->GetProperties()->SetLocked(true);
311 DefineComponentInstance (anSCO, aDriver->GetIOR());
314 bool isASCII = false;
315 if (HDFascii::isASCII(aHDFPath.c_str())) {
317 aHDFUrl = HDFascii::ConvertFromASCIIToHDF(aHDFPath.c_str());
318 aHDFUrl += "hdf_from_ascii.hdf";
323 //Open the Study HDF file
324 HDFfile *hdf_file = new HDFfile((char*)aHDFUrl.c_str());
326 char aMultifileState[2] = { '0','0' };
327 char ASCIIfileState[2] = { '0','0' };
328 bool hasModuleData = false;
330 std::string scoid = anSCO.GetID();
331 hdf_file->OpenOnDisk(HDF_RDONLY);
332 HDFgroup *hdf_group = new HDFgroup("DATACOMPONENT",hdf_file);
333 hdf_group->OpenOnDisk();
334 HDFgroup *hdf_sco_group = new HDFgroup((char*)scoid.c_str(), hdf_group);
335 hdf_sco_group->OpenOnDisk();
336 hasModuleData = true;
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 if (hdf_sco_group->ExistInternalObject("MULTIFILE_STATE")) {
354 HDFdataset *multifile_hdf_dataset = new HDFdataset("MULTIFILE_STATE", hdf_sco_group);
355 multifile_hdf_dataset->OpenOnDisk();
356 multifile_hdf_dataset->ReadFromDisk(aMultifileState);
357 multifile_hdf_dataset->CloseOnDisk();
358 multifile_hdf_dataset = 0;
361 if (hdf_sco_group->ExistInternalObject("ASCII_STATE")) {
362 HDFdataset *ascii_hdf_dataset = new HDFdataset("ASCII_STATE", hdf_sco_group);
363 ascii_hdf_dataset->OpenOnDisk();
364 ascii_hdf_dataset->ReadFromDisk(ASCIIfileState);
365 ascii_hdf_dataset->CloseOnDisk();
366 ascii_hdf_dataset = 0;
369 std::string aDir = SALOMEDSImpl_Tool::GetDirFromPath(Res);
372 if(aStreamFile && aStreamSize > 0 ) {
373 aResult = (ASCIIfileState[0]=='A')?
374 aDriver->LoadASCII(anSCO, aStreamFile, aStreamSize, aDir.c_str(), aMultifileState[0]=='M'):
375 aDriver->Load(anSCO, aStreamFile, aStreamSize, aDir.c_str(), aMultifileState[0]=='M');
378 if(aStreamFile != NULL) delete []aStreamFile;
381 RemoveAttribute( anSCO, "AttributeIOR" );
383 _errorCode = "Can't load component";
384 throw HDFexception("Unable to load component");
387 //if(aDir != NULL) delete []aDir;
389 hdf_sco_group->CloseOnDisk();
391 hdf_group->CloseOnDisk();
393 hdf_file->CloseOnDisk();
397 std::vector<std::string> aFilesToRemove;
398 aFilesToRemove.push_back("hdf_from_ascii.hdf");
399 SALOMEDSImpl_Tool::RemoveTemporaryFiles(SALOMEDSImpl_Tool::GetDirFromPath(aHDFUrl),
400 aFilesToRemove, true);
403 catch (HDFexception) {
407 std::vector<std::string> aFilesToRemove;
408 aFilesToRemove.push_back(aHDFUrl);
409 SALOMEDSImpl_Tool::RemoveTemporaryFiles(SALOMEDSImpl_Tool::GetDirFromPath(aHDFUrl), aFilesToRemove, true);
412 if (aLocked) _study->GetProperties()->SetLocked(true);
417 _errorCode = "No persistent file";
422 Translate_persistentID_to_IOR (Lab, aDriver, aMultifileState[0]=='M', ASCIIfileState[0] == 'A');
424 _errorCode = "Can not convert persistent IDs to IORs";
428 if (aLocked) _study->GetProperties()->SetLocked(true);
430 _errorCode = "No persistent file";
437 //============================================================================
441 //============================================================================
442 bool SALOMEDSImpl_StudyBuilder::Load(const SALOMEDSImpl_SObject& sco)
444 _errorCode = "Not implemented";
448 //============================================================================
449 /*! Function : FindOrCreateAttribute
450 * Purpose : Add attribute of given type to SObject, if there is attribute of such type, returns
453 //============================================================================
454 DF_Attribute* SALOMEDSImpl_StudyBuilder::FindOrCreateAttribute(const SALOMEDSImpl_SObject& anObject,
455 const std::string& aTypeOfAttribute)
459 _errorCode = "Invalid arguments";
463 DF_Label Lab = anObject.GetLabel();
465 _errorCode = "Null label";
469 _doc->SetModified(true);
471 //The macro adds all necessary checks for standardly behaiving attributes
472 __FindOrCreateAttributeForBuilder
475 //Add checks for TreeNode and UserID attributes
476 if (strncmp(aTypeOfAttribute.c_str(), "AttributeTreeNode",17) == 0 ) {
478 std::string aTreeNodeGUID;
479 if (strcmp(aTypeOfAttribute.c_str(), "AttributeTreeNode") == 0) {
480 aTreeNodeGUID = SALOMEDSImpl_AttributeTreeNode::GetDefaultTreeID();
482 aTreeNodeGUID = aTypeOfAttribute.substr(21, aTypeOfAttribute.size()); // create tree node GUID by name
484 SALOMEDSImpl_AttributeTreeNode* anAttr = NULL;
485 if (!(anAttr=(SALOMEDSImpl_AttributeTreeNode*)Lab.FindAttribute(aTreeNodeGUID))) {
487 anAttr = SALOMEDSImpl_AttributeTreeNode::Set(Lab, aTreeNodeGUID);
492 if (strncmp(aTypeOfAttribute.c_str(), "AttributeUserID",15) == 0 ) {
493 std::string aUserGUID;
494 if (strcmp(aTypeOfAttribute.c_str(), "AttributeUserID") == 0) {
495 aUserGUID = SALOMEDSImpl_AttributeUserID::DefaultID();
497 aUserGUID = aTypeOfAttribute.substr(15, aTypeOfAttribute.size()); // create tree node GUID by name
499 SALOMEDSImpl_AttributeUserID* anAttr = NULL;
500 if (!(anAttr=(SALOMEDSImpl_AttributeUserID*)Lab.FindAttribute(aUserGUID))) {
502 anAttr = SALOMEDSImpl_AttributeUserID::Set(Lab, aUserGUID);
506 _errorCode = "Can not create an attribute";
511 //============================================================================
512 /*! Function : FindAttribute
513 * Purpose : Find attribute of given type assigned SObject, returns Standard_True if it is found
515 //============================================================================
517 bool SALOMEDSImpl_StudyBuilder::FindAttribute(const SALOMEDSImpl_SObject& anObject,
518 DF_Attribute*& anAttribute,
519 const std::string& aTypeOfAttribute)
523 _errorCode = "Invalid arguments";
526 DF_Label Lab = anObject.GetLabel();
527 if ((anAttribute=Lab.FindAttribute(SALOMEDSImpl_SObject::GetGUID(aTypeOfAttribute)))) {
528 // commented out because NO MODIFICATION is done to attributes when calling FindAttribute()
535 //============================================================================
536 /*! Function : RemoveAttribute
537 * Purpose : Remove attribute of given type assigned SObject
539 //============================================================================
541 bool SALOMEDSImpl_StudyBuilder::RemoveAttribute(const SALOMEDSImpl_SObject& anObject,
542 const std::string& aTypeOfAttribute)
547 _errorCode = "Invalid arguments";
550 DF_Label Lab = anObject.GetLabel();
552 if (aTypeOfAttribute == std::string("AttributeIOR")) { // Remove from IORLabel map
553 SALOMEDSImpl_AttributeIOR* anAttr = NULL;
554 if ((anAttr=(SALOMEDSImpl_AttributeIOR*)Lab.FindAttribute(SALOMEDSImpl_AttributeIOR::GetID()))) {
555 _study->DeleteIORLabelMapItem(anAttr->Value());
559 Lab.ForgetAttribute (SALOMEDSImpl_SObject::GetGUID(aTypeOfAttribute));
561 _doc->SetModified(true);
562 _study->modifySO_Notification(anObject,0);
567 //============================================================================
568 /*! Function : Addreference
571 //============================================================================
572 bool SALOMEDSImpl_StudyBuilder::Addreference(const SALOMEDSImpl_SObject& me,
573 const SALOMEDSImpl_SObject& theReferencedObject)
576 if(!me || !theReferencedObject) {
577 _errorCode = "Invalid arguments";
581 DF_Label Lab = me.GetLabel();
582 DF_Label RefLab = theReferencedObject.GetLabel();
583 SALOMEDSImpl_AttributeReference::Set(Lab,RefLab);
585 SALOMEDSImpl_AttributeTarget::Set(RefLab)->Add(SALOMEDSImpl_Study::SObject(Lab));
587 if(_callbackOnRemove && Lab.IsDescendant(_doc->Main())) _callbackOnRemove->OnRemoveSObject(me);
592 //============================================================================
593 /*! Function : RemoveReference
596 //============================================================================
597 bool SALOMEDSImpl_StudyBuilder::RemoveReference(const SALOMEDSImpl_SObject& me)
600 SALOMEDSImpl_SObject theReferencedObject;
602 if(!me.ReferencedObject(theReferencedObject)) return false; //No reference is found
605 DF_Label Lab = me.GetLabel();
607 //SRN: 30 Aug, 2004 : fix from Ecole l'ete version
609 DF_Label RefLab = theReferencedObject.GetLabel();
611 SALOMEDSImpl_AttributeTarget* aTarget = NULL;
612 if((aTarget=(SALOMEDSImpl_AttributeTarget*)RefLab.FindAttribute(SALOMEDSImpl_AttributeTarget::GetID()))) {
613 aTarget->Remove(SALOMEDSImpl_Study::SObject(Lab));
616 Lab.ForgetAttribute(SALOMEDSImpl_AttributeReference::GetID());
618 _doc->SetModified(true);
625 //============================================================================
626 /*! Function : AddDirectory
627 * Purpose : adds a new directory with a path = thePath
629 //============================================================================
630 bool SALOMEDSImpl_StudyBuilder::AddDirectory(const std::string& thePath)
634 if(thePath.empty()) {
635 _errorCode = "Invalid path";
639 std::string aPath(thePath), aContext(""), aFatherPath;
641 SALOMEDSImpl_SObject anObject;
644 anObject = _study->FindObjectByPath(thePath); //Check if the directory already exists
649 _errorCode = "StudyNameAlreadyUsed";
653 if(aPath[0] != '/') { //Relative path
654 aPath.insert(aPath.begin(), '/');
655 aPath = _study->GetContext() + aPath;
658 std::vector<std::string> vs = SALOMEDSImpl_Tool::splitString(aPath, '/');
662 for(int i = 0, len = vs.size()-1; i<len; i++) {
664 aFatherPath += vs[i];
669 anObject = _study->FindObjectByPath(aFatherPath); //Check if the father directory exists
673 _errorCode = "StudyInvalidDirectory";
677 SALOMEDSImpl_SObject aNewObject = NewObject(anObject);
678 aLabel = aNewObject.GetLabel();
679 if(aLabel.IsNull()) {
680 _errorCode = "StudyInvalidComponent";
684 SALOMEDSImpl_AttributeName::Set(aLabel, vs.back());
686 //Set LocalID attribute to identify the directory object
687 SALOMEDSImpl_AttributeLocalID::Set(aLabel, DIRECTORYID);
689 _doc->SetModified(true);
695 //============================================================================
696 /*! Function : SetGUID
699 //============================================================================
700 bool SALOMEDSImpl_StudyBuilder::SetGUID(const SALOMEDSImpl_SObject& anObject,
701 const std::string& theGUID)
706 _errorCode = "Invalid arguments";
710 DF_Label aLabel = anObject.GetLabel();
711 SALOMEDSImpl_AttributeUserID::Set(aLabel, theGUID);
713 _doc->SetModified(true);
718 //============================================================================
719 /*! Function : IsGUID
722 //============================================================================
723 bool SALOMEDSImpl_StudyBuilder::IsGUID(const SALOMEDSImpl_SObject& anObject,
724 const std::string& theGUID)
728 _errorCode = "Invalid arguments";
731 DF_Label aLabel = anObject.GetLabel();
732 return aLabel.IsAttribute(theGUID);
736 //============================================================================
737 /*! Function : NewCommand
740 //============================================================================
741 void SALOMEDSImpl_StudyBuilder::NewCommand()
745 // mpv: for SAL2114 - unset "lock changed" flag at the operation start
746 _study->GetProperties()->IsLockChanged(true);
751 //============================================================================
752 /*! Function : CommitCommand
755 //============================================================================
756 void SALOMEDSImpl_StudyBuilder::CommitCommand()
759 SALOMEDSImpl_AttributeStudyProperties* anAttr = _study->GetProperties();
760 if (anAttr->IsLocked() && !anAttr->IsLockChanged(true)) {
761 _errorCode = "LockProtection";
762 throw LockProtection("LockProtection");
764 int aModif = anAttr->GetModified();
765 if (aModif < 0) aModif = 1000; // if user make undo and then - new transaction "modify" will never be zero
766 anAttr->SetModified(aModif+1);
771 _doc->SetModified(true);
774 //============================================================================
775 /*! Function : HasOpenCommand
778 //============================================================================
779 bool SALOMEDSImpl_StudyBuilder::HasOpenCommand()
787 //============================================================================
788 /*! Function : AbortCommand
791 //============================================================================
792 void SALOMEDSImpl_StudyBuilder::AbortCommand()
798 //============================================================================
802 //============================================================================
803 void SALOMEDSImpl_StudyBuilder::Undo()
807 SALOMEDSImpl_AttributeStudyProperties* anAttr = _study->GetProperties();
808 if (anAttr->IsLocked()) {
809 _errorCode = "LockProtection";
810 throw LockProtection("LockProtection");
812 anAttr->SetModified(anAttr->GetModified()-1);
815 _doc->SetModified(true);
818 //============================================================================
822 //============================================================================
823 void SALOMEDSImpl_StudyBuilder::Redo()
826 SALOMEDSImpl_AttributeStudyProperties* anAttr = _study->GetProperties();
827 if (anAttr->IsLocked()) {
828 _errorCode = "LockProtection";
829 throw LockProtection("LockProtection");
831 anAttr->SetModified(anAttr->GetModified()+1);
836 _doc->SetModified(true);
839 //============================================================================
840 /*! Function : GetAvailableUndos
843 //============================================================================
844 bool SALOMEDSImpl_StudyBuilder::GetAvailableUndos()
850 //============================================================================
851 /*! Function : GetAvailableRedos
854 //============================================================================
855 bool SALOMEDSImpl_StudyBuilder::GetAvailableRedos()
861 //============================================================================
862 /*! Function : UndoLimit
865 //============================================================================
866 int SALOMEDSImpl_StudyBuilder::UndoLimit()
872 //============================================================================
873 /*! Function : UndoLimit
876 //============================================================================
877 void SALOMEDSImpl_StudyBuilder::UndoLimit(int n)
884 //============================================================================
885 /*! Function : SetOnAddSObject
888 //============================================================================
889 SALOMEDSImpl_Callback*
890 SALOMEDSImpl_StudyBuilder::SetOnAddSObject(const SALOMEDSImpl_Callback* theCallback)
893 SALOMEDSImpl_Callback* aRet = _callbackOnAdd;
894 _callbackOnAdd = (SALOMEDSImpl_Callback*)theCallback;
898 //============================================================================
899 /*! Function : SetOnNewSObject
902 //============================================================================
903 SALOMEDSImpl_Callback*
904 SALOMEDSImpl_StudyBuilder::SetOnRemoveSObject(const SALOMEDSImpl_Callback* theCallback)
907 SALOMEDSImpl_Callback* aRet = _callbackOnRemove;
908 _callbackOnRemove = (SALOMEDSImpl_Callback*)theCallback;
912 //============================================================================
913 /*! Function : CheckLocked
916 //============================================================================
917 void SALOMEDSImpl_StudyBuilder::CheckLocked()
920 if (HasOpenCommand()) return;
921 SALOMEDSImpl_AttributeStudyProperties* anAttr = _study->GetProperties();
922 if (anAttr->IsLocked()) {
923 _errorCode = "LockProtection";
924 throw LockProtection("LockProtection");
928 //============================================================================
929 /*! Function : SetName
932 //============================================================================
933 bool SALOMEDSImpl_StudyBuilder::SetName(const SALOMEDSImpl_SObject& theSO,
934 const std::string& theValue)
939 _errorCode = "Invalid arguments";
942 SALOMEDSImpl_AttributeName::Set(theSO.GetLabel(), theValue);
944 _doc->SetModified(true);
949 //============================================================================
950 /*! Function : SetComment
953 //============================================================================
954 bool SALOMEDSImpl_StudyBuilder::SetComment(const SALOMEDSImpl_SObject& theSO,
955 const std::string& theValue)
960 _errorCode = "Invalid arguments";
963 SALOMEDSImpl_AttributeComment::Set(theSO.GetLabel(), theValue);
965 _doc->SetModified(true);
970 //============================================================================
971 /*! Function : SetIOR
974 //============================================================================
975 bool SALOMEDSImpl_StudyBuilder::SetIOR(const SALOMEDSImpl_SObject& theSO,
976 const std::string& theValue)
981 _errorCode = "Invalid arguments";
984 SALOMEDSImpl_AttributeIOR::Set(theSO.GetLabel(), theValue);
986 _doc->SetModified(true);
992 //============================================================================
993 /*! Function : Translate_persistentID_to_IOR
996 //============================================================================
997 static void Translate_persistentID_to_IOR(DF_Label& Lab, SALOMEDSImpl_Driver* driver, bool isMultiFile, bool isASCII)
999 if(driver == NULL) return;
1000 DF_ChildIterator itchild (Lab);
1002 for (; itchild.More(); itchild.Next()) {
1003 DF_Label current = itchild.Value();
1004 SALOMEDSImpl_AttributePersistentRef* Att = NULL;
1005 if ((Att=(SALOMEDSImpl_AttributePersistentRef*)current.FindAttribute(SALOMEDSImpl_AttributePersistentRef::GetID()))) {
1007 SALOMEDSImpl_AttributeLocalID* anID = NULL;
1008 if ((anID=(SALOMEDSImpl_AttributeLocalID*)current.FindAttribute(SALOMEDSImpl_AttributeLocalID::GetID())))
1009 if (anID->Value() == FILELOCALID) continue; //SRN: This attribute store a file name, skip it
1011 std::string persist_ref = Att->Value();
1012 SALOMEDSImpl_SObject so = SALOMEDSImpl_Study::SObject(current);
1013 std::string ior_string = driver->LocalPersistentIDToIOR(so,
1017 SALOMEDSImpl_AttributeIOR* iorAttr = SALOMEDSImpl_AttributeIOR::Set (current, ior_string);
1019 // make myRefCounter of a loaded GenericObj == 1
1020 SALOMEDSImpl_Study::UnRegisterGenObj( ior_string, iorAttr->Label());
1022 Translate_persistentID_to_IOR (current, driver, isMultiFile, isASCII);