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 #include <Standard_Stream.hxx>
22 #include <GEOM_Object.hxx>
23 #include <GEOM_Engine.hxx>
24 #include <GEOM_Solver.hxx>
25 #include <TDF_Tool.hxx>
26 #include <TDF_Data.hxx>
27 #include <TDF_Reference.hxx>
28 #include <TDF_LabelSequence.hxx>
29 #include <TDocStd_Owner.hxx>
30 #include <TDocStd_Document.hxx>
31 #include <TDataStd_Integer.hxx>
32 #include <TDataStd_ChildNodeIterator.hxx>
33 #include <TDataStd_UAttribute.hxx>
34 #include <TDataStd_Name.hxx>
35 #include <TDataStd_Comment.hxx>
36 #include <TCollection_AsciiString.hxx>
37 #include <TCollection_ExtendedString.hxx>
38 #include <TopTools_IndexedMapOfShape.hxx>
41 #define FUNCTION_LABEL(theNb) (_label.FindChild(1).FindChild((theNb)))
46 //=======================================================================
47 //function : GetObjectID
49 //=======================================================================
50 const Standard_GUID& GEOM_Object::GetObjectID()
52 static Standard_GUID anObjectID("FF1BBB01-5D14-4df2-980B-3A668264EA16");
56 //=======================================================================
57 //function : GetSubShapeID
59 //=======================================================================
60 const Standard_GUID& GEOM_Object::GetSubShapeID()
62 static Standard_GUID anObjectID("FF1BBB68-5D14-4df2-980B-3A668264EA16");
66 //=============================================================================
70 //=============================================================================
71 Handle(GEOM_Object) GEOM_Object::GetObject(TDF_Label& theLabel)
73 if (!theLabel.IsAttribute(GetObjectID())) return NULL;
75 TCollection_AsciiString anEntry;
76 TDF_Tool::Entry(theLabel, anEntry);
78 Handle(TDocStd_Document) aDoc = TDocStd_Owner::GetDocument(theLabel.Data());
79 if(aDoc.IsNull()) return NULL;
81 Handle(TDataStd_Integer) anID;
82 if(!aDoc->Main().FindAttribute(TDataStd_Integer::GetID(), anID)) return NULL;
85 GEOM_Engine* anEngine= GEOM_Engine::GetEngine();
86 if(anEngine == NULL) return NULL;
87 return anEngine->GetObject(anID->Get(), anEntry.ToCString());
90 //=============================================================================
94 //=============================================================================
95 Handle(GEOM_Object) GEOM_Object::GetReferencedObject(TDF_Label& theLabel)
97 Handle(TDF_Reference) aRef;
98 if (!theLabel.FindAttribute(TDF_Reference::GetID(), aRef)) return NULL;
100 // Get TreeNode of a referenced function
101 Handle(TDataStd_TreeNode) aT, aFather;
102 if (!TDataStd_TreeNode::Find(aRef->Get(), aT)) return NULL;
104 // Get TreeNode of Object of the referenced function
105 aFather = aT->Father();
106 if (aFather.IsNull()) return NULL;
108 // Get label of the referenced object
109 TDF_Label aLabel = aFather->Label();
112 return GEOM_Object::GetObject(aLabel);
115 //=============================================================================
117 * Constructor: private
119 //=============================================================================
120 GEOM_Object::GEOM_Object(TDF_Label& theEntry)
121 : _label(theEntry), _ior("")
123 if(!theEntry.FindAttribute(TDataStd_TreeNode::GetDefaultTreeID(), _root))
124 _root = TDataStd_TreeNode::Set(theEntry);
127 //=============================================================================
129 * Constructor: public
131 //=============================================================================
132 GEOM_Object::GEOM_Object(TDF_Label& theEntry, int theType)
133 : _label(theEntry), _ior("")
135 theEntry.ForgetAllAttributes(Standard_True);
137 if(!theEntry.FindAttribute(TDataStd_TreeNode::GetDefaultTreeID(), _root))
138 _root = TDataStd_TreeNode::Set(theEntry);
140 TDataStd_Integer::Set(theEntry.FindChild(TYPE_LABEL), theType);
142 TDataStd_UAttribute::Set(theEntry, GetObjectID());
145 //=============================================================================
149 //=============================================================================
150 int GEOM_Object::GetType()
152 Handle(TDataStd_Integer) aType;
153 if(!_label.FindChild(TYPE_LABEL).FindAttribute(TDataStd_Integer::GetID(), aType)) return -1;
158 //=============================================================================
162 //=============================================================================
163 void GEOM_Object::SetType(int theType)
165 TDataStd_Integer::Set(_label.FindChild(TYPE_LABEL), theType);
169 //=============================================================================
171 * Returns modifications counter of this object.
172 * Comparing this value with modifications counters of argument objects
173 * (on which this object depends) we decide whether this object needs to be updated.
175 //=============================================================================
176 int GEOM_Object::GetTic()
178 Handle(TDataStd_Integer) aTicAttr;
179 if (!_label.FindChild(TIC_LABEL).FindAttribute(TDataStd_Integer::GetID(), aTicAttr))
182 return aTicAttr->Get();
185 //=============================================================================
187 * Set another value of modifications counter.
189 * Use this method to update modifications counter of dependent object
190 * to be equal to modifications counter of its argument.
191 * This is commonly done in GEOM_Function::GetValue()
193 //=============================================================================
194 void GEOM_Object::SetTic(int theTic)
196 TDataStd_Integer::Set(_label.FindChild(TIC_LABEL), theTic);
199 //=============================================================================
201 * Increment modifications counter to mark this object as modified.
203 * Commonly called from GEOM_Function::SetValue()
205 //=============================================================================
206 void GEOM_Object::IncrementTic()
208 TDF_Label aTicLabel = _label.FindChild(TIC_LABEL);
210 Standard_Integer aTic = 0;
211 Handle(TDataStd_Integer) aTicAttr;
212 if (aTicLabel.FindAttribute(TDataStd_Integer::GetID(), aTicAttr))
213 aTic = aTicAttr->Get();
215 TDataStd_Integer::Set(aTicLabel, aTic + 1);
219 //=============================================================================
223 //=============================================================================
224 int GEOM_Object::GetDocID()
226 Handle(TDocStd_Document) aDoc = TDocStd_Owner::GetDocument(_label.Data());
227 if(aDoc.IsNull()) return -1;
229 Handle(TDataStd_Integer) anID;
230 if(!aDoc->Main().FindAttribute(TDataStd_Integer::GetID(), anID)) return -1;
236 //=============================================================================
240 //=============================================================================
241 TopoDS_Shape GEOM_Object::GetValue()
245 Handle(GEOM_Function) aFunction = GetLastFunction();
247 if (!aFunction.IsNull())
248 aShape = aFunction->GetValue();
253 //=============================================================================
257 //=============================================================================
258 void GEOM_Object::SetName(const char* theName)
260 TDataStd_Name::Set(_label, (char*)theName);
263 //=============================================================================
267 //=============================================================================
268 char* GEOM_Object::GetName()
270 Handle(TDataStd_Name) aNameAttr;
271 if(!_label.FindAttribute(TDataStd_Name::GetID(), aNameAttr)) return NULL;
273 TCollection_AsciiString aName(aNameAttr->Get());
274 // do not return pointer of local variable
275 // return aName.ToCString();
276 // the following code could lead to memory leak, so take care about recieved pointer
277 return strdup(aName.ToCString());
280 //=============================================================================
284 //=============================================================================
285 void GEOM_Object::SetAuxData(const char* theData)
287 TDataStd_Comment::Set(_label, (char*)theData);
290 //=============================================================================
294 //=============================================================================
295 TCollection_AsciiString GEOM_Object::GetAuxData()
297 TCollection_AsciiString aData;
299 Handle(TDataStd_Comment) aCommentAttr;
300 if (_label.FindAttribute(TDataStd_Comment::GetID(), aCommentAttr))
301 aData = aCommentAttr->Get();
307 //=============================================================================
311 //=============================================================================
312 bool GEOM_Object::IsMainShape()
314 Handle(GEOM_Function) aFunction = GetFunction(1);
315 if(aFunction.IsNull() || aFunction->GetDriverGUID() != GetSubShapeID()) return true; // mkr : IPAL9921
320 //=============================================================================
324 //=============================================================================
325 Handle(GEOM_Function) GEOM_Object::AddFunction(const Standard_GUID& theGUID, int theFunctionType)
327 Standard_Integer nb = GetNbFunctions();
328 if(nb == 1 && theGUID == GetSubShapeID()) return NULL; //It's impossible to add a function to sub shape
330 TDF_Label aChild = FUNCTION_LABEL(nb);
332 Handle(TDataStd_TreeNode) aNode = TDataStd_TreeNode::Set(aChild);
333 _root->Append(aNode);
335 Handle(GEOM_Function) aFunction = new GEOM_Function(aChild, theGUID, theFunctionType);
341 //=============================================================================
345 //=============================================================================
346 int GEOM_Object::GetNbFunctions()
348 Standard_Integer nb = 0;
349 for(TDataStd_ChildNodeIterator CI(_root); CI.More(); CI.Next()) nb++;
353 //=============================================================================
357 //=============================================================================
358 Handle(GEOM_Function) GEOM_Object::GetFunction(int theFunctionNumber)
360 TDF_Label aChild = FUNCTION_LABEL(theFunctionNumber);
361 return GEOM_Function::GetFunction(aChild);
364 //=============================================================================
368 //=============================================================================
369 Handle(GEOM_Function) GEOM_Object::GetLastFunction()
371 Standard_Integer nb = GetNbFunctions();
372 if(nb) return GetFunction(nb);
378 //=============================================================================
382 //=============================================================================
383 Handle(TColStd_HSequenceOfTransient) GEOM_Object::GetAllDependency()
385 Handle(TColStd_HSequenceOfTransient) anArray;
386 TDF_LabelSequence aSeq;
387 Standard_Integer nb = GetNbFunctions();
388 if(nb == 0) return anArray;
389 for(Standard_Integer i=1; i<=nb; i++) {
390 Handle(GEOM_Function) aFunction = GetFunction(i);
391 if(aFunction.IsNull()) continue;
392 aFunction->GetDependency(aSeq);
395 Standard_Integer aLength = aSeq.Length();
397 anArray = new TColStd_HSequenceOfTransient;
398 for(Standard_Integer j =1; j<=aLength; j++)
399 anArray->Append(GetReferencedObject(aSeq(j)));
405 //=============================================================================
409 //=============================================================================
410 Handle(TColStd_HSequenceOfTransient) GEOM_Object::GetLastDependency()
412 Handle(TColStd_HSequenceOfTransient) anArray;
413 Handle(GEOM_Function) aFunction = GetLastFunction();
414 if (aFunction.IsNull()) return anArray;
416 TDF_LabelSequence aSeq;
417 aFunction->GetDependency(aSeq);
418 Standard_Integer aLength = aSeq.Length();
420 anArray = new TColStd_HSequenceOfTransient;
421 for (Standard_Integer i = 1; i <= aLength; i++)
422 anArray->Append(GetReferencedObject(aSeq(i)));
428 //=============================================================================
432 //=============================================================================
433 TDF_Label GEOM_Object::GetFreeLabel()
435 return _label.FindChild(FREE_LABEL);
438 //=======================================================================
439 //function : GEOM_Object_Type_
441 //=======================================================================
442 Standard_EXPORT Handle_Standard_Type& GEOM_Object_Type_()
445 static Handle_Standard_Type aType1 = STANDARD_TYPE(MMgt_TShared);
446 if ( aType1.IsNull()) aType1 = STANDARD_TYPE(MMgt_TShared);
447 static Handle_Standard_Type aType2 = STANDARD_TYPE(Standard_Transient);
448 if ( aType2.IsNull()) aType2 = STANDARD_TYPE(Standard_Transient);
451 static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,NULL};
452 static Handle_Standard_Type _aType = new Standard_Type("GEOM_Object",
455 (Standard_Address)_Ancestors,
456 (Standard_Address)NULL);
460 //=======================================================================
461 //function : DownCast
463 //=======================================================================
465 const Handle(GEOM_Object) Handle(GEOM_Object)::DownCast(const Handle(Standard_Transient)& AnObject)
467 Handle(GEOM_Object) _anOtherObject;
469 if (!AnObject.IsNull()) {
470 if (AnObject->IsKind(STANDARD_TYPE(GEOM_Object))) {
471 _anOtherObject = Handle(GEOM_Object)((Handle(GEOM_Object)&)AnObject);
475 return _anOtherObject ;