1 // Copyright (C) 2007-2016 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 #include <Standard_Stream.hxx>
25 #include <GEOM_Function.hxx>
26 #include <GEOM_Object.hxx>
27 #include <GEOM_Solver.hxx>
28 #include <GEOM_ISubShape.hxx>
30 #include <Basics_OCCTVersion.hxx>
32 #include "utilities.h"
35 #include <TDF_Tool.hxx>
36 #include <TDF_Data.hxx>
37 #include <TDF_ChildIterator.hxx>
38 #include <TDF_Reference.hxx>
39 #include <TDataStd_BooleanArray.hxx>
40 #include <TDataStd_ByteArray.hxx>
41 #include <TDataStd_Integer.hxx>
42 #include <TDataStd_IntegerArray.hxx>
43 #include <TDataStd_Real.hxx>
44 #include <TDataStd_RealArray.hxx>
45 #include <TDataStd_Comment.hxx>
46 #include <TDataStd_TreeNode.hxx>
47 #include <TDataStd_UAttribute.hxx>
48 #include <TDataStd_ChildNodeIterator.hxx>
49 #include <TDataStd_ExtStringArray.hxx>
50 #include <TDataStd_ExtStringList.hxx>
51 #include <TDocStd_Owner.hxx>
52 #include <TDocStd_Document.hxx>
53 #include <TFunction_Function.hxx>
54 #include <TNaming_NamedShape.hxx>
55 #include <TNaming_Builder.hxx>
57 #include <TColStd_ListOfInteger.hxx>
58 #include <TColStd_ListIteratorOfListOfInteger.hxx>
59 #include <TCollection_ExtendedString.hxx>
63 #include <Standard_Failure.hxx>
64 #include <Standard_ErrorHandler.hxx> // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC
66 // This modification was introduced in frame of Mantis issue 0021251.
67 // This line allows to keep shape orientation together with the shape itself.
68 // Otherwise orientation can be lost in some cases.
69 #define KEEP_ORIENTATION_0021251
71 #define ARGUMENT_LABEL 1
72 #define RESULT_LABEL 2
73 #define DESCRIPTION_LABEL 3
74 #define HISTORY_LABEL 4
75 #define SUBSHAPES_LABEL 5 // 0020756: GetGroups
76 #define NAMING_LABEL 6 // 0020750: Naming during STEP import
77 #define CALLBACK_LABEL 1 // TDataStd_Comment
79 #ifdef KEEP_ORIENTATION_0021251
80 #define ORIENTATION_LABEL 7 // 0021251: TNaming_NamedShape doesn't store orientation
83 #define ARGUMENTS _label.FindChild((ARGUMENT_LABEL))
84 #define ARGUMENT(thePosition) _label.FindChild((ARGUMENT_LABEL)).FindChild((thePosition))
85 #define SUB_ARGUMENT(thePos1, thePos2) _label.FindChild((ARGUMENT_LABEL)).FindChild((thePos1)).FindChild((thePos2))
87 //=======================================================================
88 //function : GetFunctionTreeID
90 //=======================================================================
91 const Standard_GUID& GEOM_Function::GetFunctionTreeID()
93 static Standard_GUID aFunctionTreeID("FF1BBB00-5D14-4df2-980B-3A668264EA16");
94 return aFunctionTreeID;
98 //=======================================================================
99 //function : GetDependencyID
101 //=======================================================================
102 const Standard_GUID& GEOM_Function::GetDependencyID()
104 static Standard_GUID aDependencyID("E2620650-2354-41bd-8C2C-210CFCD00948");
105 return aDependencyID;
108 //=============================================================================
112 //=============================================================================
113 Handle(GEOM_Function) GEOM_Function::GetFunction(const TDF_Label& theEntry)
115 if(!theEntry.IsAttribute(TFunction_Function::GetID())) return NULL;
117 return new GEOM_Function(theEntry);
120 //=============================================================================
124 //=============================================================================
125 GEOM_Function::GEOM_Function(const TDF_Label& theEntry, const Standard_GUID& theGUID, int theType)
126 : _label(theEntry), _isCallBackData(false)
128 TFunction_Function::Set(theEntry, theGUID);
129 TDataStd_Integer::Set(theEntry, theType);
131 //Add function to a function tree
132 Handle(TDocStd_Document) aDoc = TDocStd_Owner::GetDocument(theEntry.Data());
133 Handle(TDataStd_TreeNode) aRoot, aNode;
134 if(!aDoc->Main().FindAttribute(GetFunctionTreeID(), aRoot))
135 aRoot = TDataStd_TreeNode::Set(aDoc->Main(), GetFunctionTreeID());
137 aNode = TDataStd_TreeNode::Set(theEntry, GetFunctionTreeID());
138 aRoot->Append(aNode);
141 //================================================================================
147 //================================================================================
149 GEOM_Function::~GEOM_Function()
151 if ( _isCallBackData ) {
152 _label.FindChild( CALLBACK_LABEL ).ForgetAttribute( TDataStd_Comment::GetID() );
156 //================================================================================
158 * \brief Retuns true if this function is the last one in the study
160 //================================================================================
162 bool GEOM_Function::IsLastFuntion()
166 Handle(TDataStd_TreeNode) aNode;
167 if (_label.FindAttribute(GetFunctionTreeID(), aNode))
168 isLast = !aNode->HasNext();
173 //=============================================================================
177 //=============================================================================
178 TDF_Label GEOM_Function::GetOwnerEntry()
180 TDF_Label aFather = _label.Father();
181 while(!aFather.IsRoot()) {
182 if(aFather.IsAttribute(GEOM_Object::GetObjectID())) return aFather;
183 aFather = aFather.Father();
189 //=============================================================================
193 //=============================================================================
194 int GEOM_Function::GetType()
197 Handle(TDataStd_Integer) aType;
198 if(!_label.FindAttribute(TDataStd_Integer::GetID(), aType)) return 0;
203 //=============================================================================
207 //=============================================================================
208 TopoDS_Shape GEOM_Function::GetValue()
213 TDF_Label aLabel = GetOwnerEntry();
214 if (aLabel.IsRoot()) return aShape;
215 Handle(GEOM_Object) anObject = GEOM_Object::GetObject(aLabel);
216 if (anObject.IsNull()) return aShape;
218 if (!anObject->IsMainShape()) {
219 bool isResult = false;
220 TDF_Label aResultLabel = _label.FindChild(RESULT_LABEL);
221 if (!aResultLabel.IsNull()) {
222 Handle(TNaming_NamedShape) aNS;
223 if (aResultLabel.FindAttribute(TNaming_NamedShape::GetID(), aNS))
230 Standard_Integer aTic = anObject->GetTic();
233 GEOM_ISubShape aCI (this);
234 TDF_Label aLabelObjMainSh = aCI.GetMainShape()->GetOwnerEntry();
235 if (aLabelObjMainSh.IsRoot()) return aShape;
236 Handle(GEOM_Object) anObjMainSh = GEOM_Object::GetObject(aLabelObjMainSh);
237 if (anObjMainSh.IsNull()) return aShape;
238 Standard_Integer aTicMainSh = anObjMainSh->GetTic();
241 isResult = ((aTic == aTicMainSh) ? true : false);
247 GEOM_Solver aSolver(GEOM_Engine::GetEngine());
248 if (!aSolver.ComputeFunction(this)) {
249 MESSAGE("GEOM_Object::GetValue Error : Can't build a sub-shape");
253 catch (Standard_Failure) {
254 Handle(Standard_Failure) aFail = Standard_Failure::Caught();
255 MESSAGE("GEOM_Function::GetValue Error: " << aFail->GetMessageString());
261 TDF_Label aResultLabel = _label.FindChild(RESULT_LABEL);
262 Handle(TNaming_NamedShape) aNS;
263 if (!aResultLabel.FindAttribute(TNaming_NamedShape::GetID(), aNS)) return aShape;
267 #ifdef KEEP_ORIENTATION_0021251
268 // 0021251: TNaming_NamedShape doesn't store orientation
269 TDF_Label anOrientationLabel = _label.FindChild(ORIENTATION_LABEL);
270 Handle(TDataStd_Integer) anInteger;
271 if (anOrientationLabel.FindAttribute(TDataStd_Integer::GetID(), anInteger)) {
272 aShape.Orientation((TopAbs_Orientation)anInteger->Get());
280 //=============================================================================
284 //=============================================================================
285 void GEOM_Function::SetValue(TopoDS_Shape& theShape)
288 TDF_Label aResultLabel = _label.FindChild(RESULT_LABEL);
289 TNaming_Builder aBuilder (aResultLabel);
291 aBuilder.Generated(theShape);
293 #ifdef KEEP_ORIENTATION_0021251
294 // 0021251: TNaming_NamedShape doesn't store orientation
295 TDF_Label anOrientationLabel = _label.FindChild(ORIENTATION_LABEL);
296 TDataStd_Integer::Set(anOrientationLabel, (int)theShape.Orientation());
299 // synchronisation between main shape and its sub-shapes
300 TDF_Label aLabel = GetOwnerEntry();
301 if (aLabel.IsRoot()) return;
302 Handle(GEOM_Object) anObject = GEOM_Object::GetObject(aLabel);
303 if (anObject.IsNull()) return;
304 if (anObject->IsMainShape()) {
305 // increase modifications counter of this (main) shape
306 anObject->IncrementTic();
309 // update modifications counter of this (sub-) shape to be the same as on main shape
310 GEOM_ISubShape aCI (this);
311 TDF_Label aLabelObjMainSh = aCI.GetMainShape()->GetOwnerEntry();
312 if (aLabelObjMainSh.IsRoot()) return;
313 Handle(GEOM_Object) anObjMainSh = GEOM_Object::GetObject(aLabelObjMainSh);
314 if (anObjMainSh.IsNull()) return;
316 anObject->SetTic(anObjMainSh->GetTic());
322 //=============================================================================
326 //=============================================================================
327 Standard_GUID GEOM_Function::GetDriverGUID()
329 Handle(TFunction_Function) aFunction;
330 if(!_label.FindAttribute(TFunction_Function::GetID(), aFunction)) {
331 return TDF::LowestID();
334 return aFunction->GetDriverGUID();
337 //=============================================================================
341 //=============================================================================
342 TCollection_AsciiString GEOM_Function::GetDescription()
344 Handle(TDataStd_Comment) aComment;
345 TDF_Label aChild = _label.FindChild(DESCRIPTION_LABEL);
346 if(!aChild.FindAttribute(TDataStd_Comment::GetID(), aComment)) return TCollection_AsciiString();
347 TCollection_AsciiString aDescr(aComment->Get());
351 //=============================================================================
355 //=============================================================================
356 void GEOM_Function::SetDescription(const TCollection_AsciiString& theDescription)
358 TDF_Label aChild = _label.FindChild(DESCRIPTION_LABEL);
359 Handle(TDataStd_Comment) aComment =
360 TDataStd_Comment::Set(aChild, TCollection_ExtendedString(theDescription));
363 //=============================================================================
367 //=============================================================================
368 void GEOM_Function::SetReal(int thePosition, double theValue)
371 if(thePosition <= 0) return;
372 TDF_Label anArgLabel = ARGUMENT(thePosition);
373 TDataStd_Real::Set(anArgLabel, theValue);
377 //=============================================================================
381 //=============================================================================
382 void GEOM_Function::SetRealArray (int thePosition,
383 const Handle(TColStd_HArray1OfReal)& theArray)
386 if(thePosition <= 0) return;
387 TDF_Label anArgLabel = ARGUMENT(thePosition);
388 Handle(TDataStd_RealArray) anAttr =
389 TDataStd_RealArray::Set(anArgLabel, theArray->Lower(), theArray->Upper());
390 anAttr->ChangeArray(theArray);
394 //=============================================================================
398 //=============================================================================
399 double GEOM_Function::GetReal(int thePosition)
402 if(thePosition <= 0) return 0.0;
403 Handle(TDataStd_Real) aReal;
404 TDF_Label anArgLabel = ARGUMENT(thePosition);
405 if(!anArgLabel.FindAttribute(TDataStd_Real::GetID(), aReal)) return 0.0;
411 //=============================================================================
415 //=============================================================================
416 Handle(TColStd_HArray1OfReal) GEOM_Function::GetRealArray(int thePosition)
419 if(thePosition <= 0) return NULL;
420 Handle(TDataStd_RealArray) aRealArray;
421 TDF_Label anArgLabel = ARGUMENT(thePosition);
422 if(!anArgLabel.FindAttribute(TDataStd_RealArray::GetID(), aRealArray)) return NULL;
425 return aRealArray->Array();
428 //=============================================================================
432 //=============================================================================
433 void GEOM_Function::SetInteger(int thePosition, int theValue)
436 if(thePosition <= 0) return;
437 TDF_Label anArgLabel = ARGUMENT(thePosition);
438 TDataStd_Integer::Set(anArgLabel, theValue);
442 //=============================================================================
446 //=============================================================================
447 void GEOM_Function::SetIntegerArray (int thePosition,
448 const Handle(TColStd_HArray1OfInteger)& theArray)
451 if(thePosition <= 0) return;
452 TDF_Label anArgLabel = ARGUMENT(thePosition);
453 Handle(TDataStd_IntegerArray) anAttr =
454 TDataStd_IntegerArray::Set(anArgLabel, theArray->Lower(), theArray->Upper());
455 anAttr->ChangeArray(theArray);
459 //=============================================================================
463 //=============================================================================
464 int GEOM_Function::GetInteger(int thePosition)
467 if(thePosition <= 0) return 0;
468 Handle(TDataStd_Integer) anInteger;
469 TDF_Label anArgLabel = ARGUMENT(thePosition);
470 if(!anArgLabel.FindAttribute(TDataStd_Integer::GetID(), anInteger)) return 0;
473 return anInteger->Get();
476 //=============================================================================
480 //=============================================================================
481 Handle(TColStd_HArray1OfInteger) GEOM_Function::GetIntegerArray(int thePosition)
484 if(thePosition <= 0) return 0;
485 Handle(TDataStd_IntegerArray) anIntegerArray;
486 TDF_Label anArgLabel = ARGUMENT(thePosition);
487 if(!anArgLabel.FindAttribute(TDataStd_IntegerArray::GetID(), anIntegerArray)) return 0;
490 return anIntegerArray->Array();
493 //=============================================================================
497 //=============================================================================
498 void GEOM_Function::SetByteArray (int thePosition,
499 const Handle(TColStd_HArray1OfByte)& theArray)
502 if(thePosition <= 0) return;
503 TDF_Label anArgLabel = ARGUMENT(thePosition);
504 Handle(TDataStd_ByteArray) anAttr =
505 TDataStd_ByteArray::Set(anArgLabel, theArray->Lower(), theArray->Upper());
506 anAttr->ChangeArray(theArray);
510 //=============================================================================
514 //=============================================================================
515 Handle(TColStd_HArray1OfByte) GEOM_Function::GetByteArray(int thePosition)
518 if(thePosition <= 0) return 0;
519 Handle(TDataStd_ByteArray) aByteArray;
520 TDF_Label anArgLabel = ARGUMENT(thePosition);
521 if(!anArgLabel.FindAttribute(TDataStd_ByteArray::GetID(), aByteArray)) return 0;
524 return aByteArray->InternalArray();
527 //=============================================================================
531 //=============================================================================
532 void GEOM_Function::SetBooleanArray (int thePosition,
533 const Handle(TColStd_HArray1OfByte)& theArray)
536 if(thePosition <= 0) return;
537 TDF_Label anArgLabel = ARGUMENT(thePosition);
538 Handle(TDataStd_BooleanArray) anAttr =
539 TDataStd_BooleanArray::Set(anArgLabel, theArray->Lower(), theArray->Upper());
540 anAttr->SetInternalArray(theArray);
544 //=============================================================================
548 //=============================================================================
549 Handle(TColStd_HArray1OfByte) GEOM_Function::GetBooleanArray(int thePosition)
552 if(thePosition <= 0) return 0;
553 Handle(TDataStd_BooleanArray) aBooleanArray;
554 TDF_Label anArgLabel = ARGUMENT(thePosition);
555 if(!anArgLabel.FindAttribute(TDataStd_BooleanArray::GetID(), aBooleanArray)) return 0;
558 return aBooleanArray->InternalArray();
561 //=============================================================================
565 //=============================================================================
566 void GEOM_Function::SetString(int thePosition, const TCollection_AsciiString& theValue)
569 if(thePosition <= 0) return;
570 TDF_Label anArgLabel = ARGUMENT(thePosition);
571 TDataStd_Comment::Set(anArgLabel, theValue);
575 //=============================================================================
579 //=============================================================================
580 TCollection_AsciiString GEOM_Function::GetString(int thePosition)
583 TCollection_AsciiString aRes;
584 if(thePosition <= 0) return aRes;
585 Handle(TDataStd_Comment) aString;
586 TDF_Label anArgLabel = ARGUMENT(thePosition);
587 if(!anArgLabel.FindAttribute(TDataStd_Comment::GetID(), aString)) return aRes;
588 char *str = new char[aString->Get().LengthOfCString()+1];
589 aString->Get().ToUTF8CString(str);
590 aRes = TCollection_AsciiString(str);
595 //=============================================================================
599 //=============================================================================
600 void GEOM_Function::SetReference(int thePosition, Handle(GEOM_Function) theReference)
603 if (thePosition <= 0) return;
604 if (theReference.IsNull()) return;
605 TDF_Label anArgLabel = ARGUMENT(thePosition);
606 TDF_Reference::Set(anArgLabel, theReference->GetEntry());
607 TDataStd_UAttribute::Set(anArgLabel, GetDependencyID());
612 //=============================================================================
616 //=============================================================================
617 Handle(GEOM_Function) GEOM_Function::GetReference(int thePosition)
620 if(thePosition <= 0) return NULL;
621 TDF_Label anArgLabel = ARGUMENT(thePosition);
622 Handle(TDF_Reference) aRef;
623 if(!anArgLabel.FindAttribute(TDF_Reference::GetID(), aRef)) return NULL;
626 return GetFunction(aRef->Get());
630 //=============================================================================
634 //=============================================================================
635 void GEOM_Function::SetStringArray(int thePosition, const Handle(TColStd_HArray1OfExtendedString)& theArray)
638 if(thePosition <= 0 || theArray.IsNull()) return;
639 TDF_Label anArgLabel = ARGUMENT(thePosition);
641 Handle(TDataStd_ExtStringArray) anArray =
642 TDataStd_ExtStringArray::Set(anArgLabel, theArray->Lower(), theArray->Upper());
643 anArray->ChangeArray(theArray);
649 //=============================================================================
653 //=============================================================================
654 Handle(TColStd_HArray1OfExtendedString) GEOM_Function::GetStringArray(int thePosition)
657 if(thePosition <= 0) return NULL;
658 TDF_Label anArgLabel = ARGUMENT(thePosition);
659 Handle(TDataStd_ExtStringArray) anArray;
660 if(!anArgLabel.FindAttribute(TDataStd_ExtStringArray::GetID(), anArray)) return NULL;
663 return anArray->Array();
666 //=======================================================================
668 //purpose : Returns true if data of given type already exists
669 //=======================================================================
671 bool GEOM_Function::HasData(int thePosition, const Standard_GUID& dataID)
673 if(thePosition <= 0) return false;
674 TDF_Label anArgLabel = ARGUMENT(thePosition);
675 return anArgLabel.IsAttribute( dataID );
678 //=======================================================================
679 //function : GetReferencesTreeID
681 //=======================================================================
682 const Standard_GUID& GEOM_Function::GetReferencesTreeID()
684 static Standard_GUID aReferencesTreeID("FF1BBB10-5D14-4df2-980B-3A668264EA16");
685 return aReferencesTreeID;
688 //=============================================================================
692 //=============================================================================
693 void GEOM_Function::SetReferenceList (int thePosition,
694 const Handle(TColStd_HSequenceOfTransient)& theRefList)
697 if(thePosition <= 0) return;
699 // parent label for the list of references
700 TDF_Label anArgLabel = ARGUMENT(thePosition);
701 anArgLabel.ForgetAllAttributes();
703 // set TreeNode on the parent label
704 Handle(TDataStd_TreeNode) aRoot, aNode;
705 aRoot = TDataStd_TreeNode::Set(anArgLabel, GetReferencesTreeID());
707 // store references on sub-labels of the parent label
708 Handle(GEOM_Function) aFunc;
709 Standard_Integer ind, len = theRefList->Length();
710 for (ind = 1; ind <= len; ind++) {
711 aFunc = Handle(GEOM_Function)::DownCast(theRefList->Value(ind));
712 if (aFunc.IsNull()) continue;
713 TDF_Label anArgLabel_i = SUB_ARGUMENT(thePosition, ind);
714 TDF_Reference::Set(anArgLabel_i, aFunc->GetEntry());
715 TDataStd_UAttribute::Set(anArgLabel_i, GetDependencyID());
717 // set TreeNode on the child label
718 aNode = TDataStd_TreeNode::Set(anArgLabel_i, GetReferencesTreeID());
719 aRoot->Append(aNode);
726 //=============================================================================
730 //=============================================================================
731 Handle(TColStd_HSequenceOfTransient) GEOM_Function::GetReferenceList(int thePosition)
733 Handle(TColStd_HSequenceOfTransient) aResult = new TColStd_HSequenceOfTransient;
735 if(thePosition <= 0) return aResult;
737 // parent label for the list of references
738 TDF_Label anArgLabel = ARGUMENT(thePosition);
739 Handle(TDF_Reference) aRef;
741 // get TreeNode on the parent label
742 Handle(TDataStd_TreeNode) aRoot, aNode;
743 if(!anArgLabel.FindAttribute(GetReferencesTreeID(), aRoot))
746 // get references, stored on sub-labels of the parent label
748 TDataStd_ChildNodeIterator anIter (aRoot);
749 for (; anIter.More(); anIter.Next()) {
750 aNode = anIter.Value();
751 aLabel_i = aNode->Label();
752 if (!aLabel_i.FindAttribute(TDF_Reference::GetID(), aRef)) continue;
753 Handle(GEOM_Function) aFunc_i = GetFunction(aRef->Get());
754 if (aFunc_i.IsNull()) continue;
755 aResult->Append(aFunc_i);
762 //=============================================================================
766 //=============================================================================
767 //void GEOM_Function::SetShape(int thePosition, const TopoDS_Shape& theShape)
770 // if(thePosition <= 0 || theShape.IsNull()) return;
772 // TDF_Label anArgLabel = ARGUMENT(thePosition);
773 // TNaming_Builder aBuilder(anArgLabel);
774 // aBuilder.Generated(theShape);
780 //=============================================================================
784 //=============================================================================
785 //TopoDS_Shape GEOM_Function::GetShape(int thePosition)
788 // TopoDS_Shape aShape;
789 // if(thePosition <= 0) return aShape;
791 // TDF_Label anArgLabel = ARGUMENT(thePosition);
792 // Handle(TNaming_NamedShape) aNS;
793 // if(!anArgLabel.FindAttribute(TNaming_NamedShape::GetID(), aNS)) return aShape;
795 // aShape = aNS->Get();
801 //=============================================================================
805 //=============================================================================
806 void GEOM_Function::GetDependency(TDF_LabelSequence& theSeq)
808 TDF_ChildIterator anIterator(ARGUMENTS, Standard_True);
809 for(; anIterator.More(); anIterator.Next()) {
810 if(anIterator.Value().IsAttribute(GetDependencyID())) theSeq.Append(anIterator.Value());
814 //=============================================================================
816 * AddSubShapeReference
818 //=============================================================================
819 void GEOM_Function::AddSubShapeReference(Handle(GEOM_Function) theSubShape)
823 TDF_Label aSubShapesLabel = _label.FindChild(SUBSHAPES_LABEL);
825 Handle(TDataStd_ExtStringList) aList;
826 if (!aSubShapesLabel.FindAttribute(TDataStd_ExtStringList::GetID(), aList)) {
827 aList = new TDataStd_ExtStringList;
828 aSubShapesLabel.AddAttribute(aList);
831 TCollection_AsciiString anEntry;
832 TDF_Tool::Entry(theSubShape->GetOwnerEntry(), anEntry);
833 aList->Append(anEntry);
838 //=============================================================================
840 * RemoveSubShapeReference
842 //=============================================================================
843 void GEOM_Function::RemoveSubShapeReference(Handle(GEOM_Function) theSubShape)
847 TDF_Label aSubShapesLabel = _label.FindChild(SUBSHAPES_LABEL);
849 Handle(TDataStd_ExtStringList) aList;
850 if (aSubShapesLabel.FindAttribute(TDataStd_ExtStringList::GetID(), aList)) {
851 TCollection_AsciiString anEntry;
852 TDF_Tool::Entry(theSubShape->GetOwnerEntry(), anEntry);
853 aList->Remove(anEntry);
859 //=============================================================================
861 * HasSubShapeReferences
863 //=============================================================================
864 bool GEOM_Function::HasSubShapeReferences()
868 TDF_Label aSubShapesLabel = _label.FindChild(SUBSHAPES_LABEL);
869 return aSubShapesLabel.IsAttribute(TDataStd_ExtStringList::GetID());
872 //=============================================================================
874 * GetSubShapeReferences
876 //=============================================================================
877 const TDataStd_ListOfExtendedString& GEOM_Function::GetSubShapeReferences()
881 TDF_Label aSubShapesLabel = _label.FindChild(SUBSHAPES_LABEL);
883 Handle(TDataStd_ExtStringList) aList;
884 if (!aSubShapesLabel.FindAttribute(TDataStd_ExtStringList::GetID(), aList)) {
885 aList = new TDataStd_ExtStringList;
886 aSubShapesLabel.AddAttribute(aList);
890 return aList->List();
893 //=============================================================================
897 //=============================================================================
898 TDF_Label GEOM_Function::GetHistoryEntry (const Standard_Boolean create)
900 return _label.FindChild(HISTORY_LABEL, create);
903 //=============================================================================
905 * GetArgumentHistoryEntry
907 //=============================================================================
908 TDF_Label GEOM_Function::GetArgumentHistoryEntry (const TDF_Label& theArgumentRefEntry,
909 const Standard_Boolean create)
911 TColStd_ListOfInteger anArgumentRefTags;
912 TDF_Tool::TagList(theArgumentRefEntry, anArgumentRefTags);
913 Standard_Integer anArgumentRefLabelPos = anArgumentRefTags.Extent();
915 TDF_Label aHistoryLabel = GetHistoryEntry(create);
916 if (aHistoryLabel.IsNull())
917 return aHistoryLabel;
918 Standard_Integer aHistoryLabelPos = aHistoryLabel.Depth() + 1;
920 Standard_Integer itag;
921 TDF_Label aHistoryCurLabel = aHistoryLabel;
922 TColStd_ListIteratorOfListOfInteger aListIter (anArgumentRefTags);
923 for (itag = 1; itag <= aHistoryLabelPos; itag++) {
926 for (; itag <= anArgumentRefLabelPos; itag++) {
927 aHistoryCurLabel = aHistoryCurLabel.FindChild(aListIter.Value(), create);
928 if (aHistoryCurLabel.IsNull())
929 return aHistoryCurLabel;
933 return aHistoryCurLabel;
936 //=============================================================================
940 //=============================================================================
941 TDF_Label GEOM_Function::GetNamingEntry (const Standard_Boolean create)
943 return _label.FindChild(NAMING_LABEL, create);
946 //================================================================================
948 * Save a pointer to a data holder intended to pass temporary data Driver -> Operation.
949 * This method should be called by Operation to set the data holder.
950 * An instance of GEOM_Function that sets the data holder will remove the
951 * corresponding OCAF attribute at it's destruction
953 //================================================================================
955 void GEOM_Function::SetCallBackData( void* data )
957 std::ostringstream strm;
958 strm << (long long) data;
959 TCollection_ExtendedString string( strm.str().c_str() );
961 TDF_Label aChild = _label.FindChild(CALLBACK_LABEL);
962 TDataStd_Comment::Set(aChild, string);
964 _isCallBackData = true; // I will remove TDataStd_Comment at destruction
967 //================================================================================
969 * Returns a pointer to a data holder intended to pass data Driver -> Operation.
970 * This method should be called by Driver to get the data holder to fill it in.
971 * Returns NULL if the Operation have not set the data holder.
973 //================================================================================
975 void* GEOM_Function::GetCallBackData()
977 Handle(TDataStd_Comment) aComment;
978 TDF_Label aChild = _label.FindChild( CALLBACK_LABEL );
979 if(!aChild.FindAttribute(TDataStd_Comment::GetID(), aComment)) return NULL;
980 TCollection_AsciiString string( aComment->Get() );
984 address = atoll ( string.ToCString() );
986 address = _strtoi64 ( string.ToCString(), NULL, 10 );
989 return reinterpret_cast<void*> ( address );
992 OCCT_IMPLEMENT_STANDARD_RTTIEXT(GEOM_Function, Standard_Transient );