]> SALOME platform Git repositories - modules/geom.git/blob - src/GEOM/GEOM_Object.cxx
Salome HOME
NPAL17269: Performance pb. when creating a group with GUI.
[modules/geom.git] / src / GEOM / GEOM_Object.cxx
1 // Copyright (C) 2005  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
3 //
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.
8 //
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.
13 //
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
17 //
18 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 //
20 #include <Standard_Stream.hxx>
21
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>
39 #include <TopExp.hxx>
40
41 #define FUNCTION_LABEL(theNb) (_label.FindChild(1).FindChild((theNb)))
42 #define TYPE_LABEL 2
43 #define FREE_LABEL 3
44 #define TIC_LABEL  4
45
46 //=======================================================================
47 //function : GetObjectID
48 //purpose  :
49 //=======================================================================
50 const Standard_GUID& GEOM_Object::GetObjectID()
51 {
52   static Standard_GUID anObjectID("FF1BBB01-5D14-4df2-980B-3A668264EA16");
53   return anObjectID;
54 }
55
56 //=======================================================================
57 //function : GetSubShapeID
58 //purpose  :
59 //=======================================================================
60 const Standard_GUID& GEOM_Object::GetSubShapeID()
61 {
62   static Standard_GUID anObjectID("FF1BBB68-5D14-4df2-980B-3A668264EA16");
63   return anObjectID;
64 }
65
66 //=============================================================================
67 /*!
68  *  GetObject
69  */
70 //=============================================================================
71 Handle(GEOM_Object) GEOM_Object::GetObject(TDF_Label& theLabel)
72 {
73   if (!theLabel.IsAttribute(GetObjectID())) return NULL;
74
75   TCollection_AsciiString anEntry;
76   TDF_Tool::Entry(theLabel, anEntry);
77
78   Handle(TDocStd_Document) aDoc = TDocStd_Owner::GetDocument(theLabel.Data());
79   if(aDoc.IsNull()) return NULL;
80
81   Handle(TDataStd_Integer) anID;
82   if(!aDoc->Main().FindAttribute(TDataStd_Integer::GetID(), anID)) return NULL;
83
84
85   GEOM_Engine* anEngine=  GEOM_Engine::GetEngine();
86   if(anEngine == NULL) return NULL;
87   return anEngine->GetObject(anID->Get(), anEntry.ToCString());
88 }
89
90 //=============================================================================
91 /*!
92  *  GetReferencedObject
93  */
94 //=============================================================================
95 Handle(GEOM_Object) GEOM_Object::GetReferencedObject(TDF_Label& theLabel)
96 {
97   Handle(TDF_Reference) aRef;
98   if (!theLabel.FindAttribute(TDF_Reference::GetID(), aRef)) {
99     return NULL;
100   }
101   
102   if(aRef.IsNull() || aRef->Get().IsNull()) {
103     return NULL;
104   }
105
106
107   // Get TreeNode of a referenced function
108   Handle(TDataStd_TreeNode) aT, aFather;
109   if (!TDataStd_TreeNode::Find(aRef->Get(), aT)) {
110     return NULL;
111   }
112
113
114   // Get TreeNode of Object of the referenced function
115   aFather = aT->Father();
116   if (aFather.IsNull()) {
117     return NULL;
118   }
119
120   // Get label of the referenced object
121   TDF_Label aLabel = aFather->Label();
122   
123
124   return GEOM_Object::GetObject(aLabel);
125 }
126
127 //=============================================================================
128 /*!
129  *  Constructor: private
130  */
131 //=============================================================================
132 GEOM_Object::GEOM_Object(TDF_Label& theEntry)
133 : _label(theEntry), _ior("")
134 {
135   if(!theEntry.FindAttribute(TDataStd_TreeNode::GetDefaultTreeID(), _root))
136     _root = TDataStd_TreeNode::Set(theEntry);
137 }
138
139 //=============================================================================
140 /*!
141  *  Constructor: public
142  */
143 //=============================================================================
144 GEOM_Object::GEOM_Object(TDF_Label& theEntry, int theType)
145 : _label(theEntry), _ior("")
146 {
147   theEntry.ForgetAllAttributes(Standard_True);
148
149   if(!theEntry.FindAttribute(TDataStd_TreeNode::GetDefaultTreeID(), _root))
150     _root = TDataStd_TreeNode::Set(theEntry);
151
152   TDataStd_Integer::Set(theEntry.FindChild(TYPE_LABEL), theType);
153
154   TDataStd_UAttribute::Set(theEntry, GetObjectID());
155 }
156
157 //=============================================================================
158 /*!
159  *  GetType
160  */
161 //=============================================================================
162 int GEOM_Object::GetType()
163 {
164   Handle(TDataStd_Integer) aType;
165   if(!_label.FindChild(TYPE_LABEL).FindAttribute(TDataStd_Integer::GetID(), aType)) return -1;
166
167   return aType->Get();
168 }
169
170 //=============================================================================
171 /*!
172  *  SetType
173  */
174 //=============================================================================
175 void GEOM_Object::SetType(int theType)
176 {
177   TDataStd_Integer::Set(_label.FindChild(TYPE_LABEL), theType);
178 }
179
180
181 //=============================================================================
182 /*!
183  *  Returns modifications counter of this object.
184  *  Comparing this value with modifications counters of argument objects
185  *  (on which this object depends) we decide whether this object needs to be updated.
186  */
187 //=============================================================================
188 int GEOM_Object::GetTic()
189 {
190   Handle(TDataStd_Integer) aTicAttr;
191   if (!_label.FindChild(TIC_LABEL).FindAttribute(TDataStd_Integer::GetID(), aTicAttr))
192     return 0;
193
194   return aTicAttr->Get();
195 }
196
197 //=============================================================================
198 /*!
199  *  Set another value of modifications counter.
200  *
201  *  Use this method to update modifications counter of dependent object
202  *  to be equal to modifications counter of its argument.
203  *  This is commonly done in GEOM_Function::GetValue()
204  */
205 //=============================================================================
206 void GEOM_Object::SetTic(int theTic)
207 {
208   TDataStd_Integer::Set(_label.FindChild(TIC_LABEL), theTic);
209 }
210
211 //=============================================================================
212 /*!
213  *  Increment modifications counter to mark this object as modified.
214  *
215  *  Commonly called from GEOM_Function::SetValue()
216  */
217 //=============================================================================
218 void GEOM_Object::IncrementTic()
219 {
220   TDF_Label aTicLabel = _label.FindChild(TIC_LABEL);
221
222   Standard_Integer aTic = 0;
223   Handle(TDataStd_Integer) aTicAttr;
224   if (aTicLabel.FindAttribute(TDataStd_Integer::GetID(), aTicAttr))
225     aTic = aTicAttr->Get();
226
227   TDataStd_Integer::Set(aTicLabel, aTic + 1);
228 }
229
230
231 //=============================================================================
232 /*!
233  *  GetDocID
234  */
235 //=============================================================================
236 int GEOM_Object::GetDocID()
237 {
238   Handle(TDocStd_Document) aDoc = TDocStd_Owner::GetDocument(_label.Data());
239   if(aDoc.IsNull()) return -1;
240
241   Handle(TDataStd_Integer) anID;
242   if(!aDoc->Main().FindAttribute(TDataStd_Integer::GetID(), anID)) return -1;
243
244   return anID->Get();
245 }
246
247
248 //=============================================================================
249 /*!
250  *  GetValue
251  */
252 //=============================================================================
253 TopoDS_Shape GEOM_Object::GetValue()
254 {
255   TopoDS_Shape aShape;
256
257   Handle(GEOM_Function) aFunction = GetLastFunction();
258
259   if (!aFunction.IsNull())
260     aShape = aFunction->GetValue();
261
262   return aShape;
263 }
264
265 //=============================================================================
266 /*!
267  *  SetName
268  */
269 //=============================================================================
270 void GEOM_Object::SetName(const char* theName)
271 {
272   TDataStd_Name::Set(_label, (char*)theName);
273 }
274
275 //=============================================================================
276 /*!
277  *  GetName
278  */
279 //=============================================================================
280 char* GEOM_Object::GetName()
281 {
282   Handle(TDataStd_Name) aNameAttr;
283   if(!_label.FindAttribute(TDataStd_Name::GetID(), aNameAttr)) return NULL;
284
285   TCollection_AsciiString aName(aNameAttr->Get());
286   // do not return pointer of local variable
287   // return aName.ToCString();
288   // the following code could lead to memory leak, so take care about recieved pointer
289   return strdup(aName.ToCString());
290 }
291
292 //=============================================================================
293 /*!
294  *  SetAuxData
295  */
296 //=============================================================================
297 void GEOM_Object::SetAuxData(const char* theData)
298 {
299   TDataStd_Comment::Set(_label, (char*)theData);
300 }
301
302 //=============================================================================
303 /*!
304  *  GetAuxData
305  */
306 //=============================================================================
307 TCollection_AsciiString GEOM_Object::GetAuxData()
308 {
309   TCollection_AsciiString aData;
310
311   Handle(TDataStd_Comment) aCommentAttr;
312   if (_label.FindAttribute(TDataStd_Comment::GetID(), aCommentAttr))
313     aData = aCommentAttr->Get();
314
315   return aData;
316 }
317
318
319 //=============================================================================
320 /*!
321  *  IsSubShape
322  */
323 //=============================================================================
324 bool GEOM_Object::IsMainShape()
325 {
326   Handle(GEOM_Function) aFunction = GetFunction(1);
327   if(aFunction.IsNull() || aFunction->GetDriverGUID() != GetSubShapeID()) return true; // mkr : IPAL9921
328   return false;
329 }
330
331
332 //=============================================================================
333 /*!
334  *  AddFunction
335  */
336 //=============================================================================
337 Handle(GEOM_Function) GEOM_Object::AddFunction(const Standard_GUID& theGUID, int theFunctionType)
338 {
339   Standard_Integer nb = GetNbFunctions();
340   if(nb == 1 && theGUID == GetSubShapeID()) return NULL; //It's impossible to add a function to sub shape
341   nb++;
342   TDF_Label aChild = FUNCTION_LABEL(nb);
343
344   Handle(TDataStd_TreeNode) aNode = TDataStd_TreeNode::Set(aChild);
345   _root->Append(aNode);
346
347   Handle(GEOM_Function) aFunction = new GEOM_Function(aChild, theGUID, theFunctionType);
348
349   return aFunction;
350
351 }
352
353 //=============================================================================
354 /*!
355  *  GetNbFunctions
356  */
357 //=============================================================================
358 int GEOM_Object::GetNbFunctions()
359 {
360   Standard_Integer nb = 0;
361   for(TDataStd_ChildNodeIterator CI(_root); CI.More(); CI.Next()) nb++;
362   return nb;
363 }
364
365 //=============================================================================
366 /*!
367  *  GetFunction
368  */
369 //=============================================================================
370 Handle(GEOM_Function) GEOM_Object::GetFunction(int theFunctionNumber)
371 {
372   TDF_Label aChild = FUNCTION_LABEL(theFunctionNumber);
373   return GEOM_Function::GetFunction(aChild);
374 }
375
376 //=============================================================================
377 /*!
378  *  GetlastFunction
379  */
380 //=============================================================================
381 Handle(GEOM_Function) GEOM_Object::GetLastFunction()
382 {
383   Standard_Integer nb = GetNbFunctions();
384   if(nb) return GetFunction(nb);
385
386   return NULL;
387 }
388
389
390 //=============================================================================
391 /*!
392  *  GetAllDependency
393  */
394 //=============================================================================
395 Handle(TColStd_HSequenceOfTransient) GEOM_Object::GetAllDependency()
396 {
397   Handle(TColStd_HSequenceOfTransient) anArray;
398   TDF_LabelSequence aSeq;
399   Standard_Integer nb = GetNbFunctions();
400   if(nb == 0) return anArray;
401   for(Standard_Integer i=1; i<=nb; i++) {
402     Handle(GEOM_Function) aFunction = GetFunction(i);
403     if(aFunction.IsNull()) continue;
404     aFunction->GetDependency(aSeq);
405   }
406
407   Standard_Integer aLength = aSeq.Length();
408   if(aLength > 0) {
409     anArray = new TColStd_HSequenceOfTransient;
410     for(Standard_Integer j =1; j<=aLength; j++) {
411       Handle(GEOM_Object) aRefObj = GetReferencedObject(aSeq(j));
412       if(!aRefObj.IsNull()) anArray->Append(aRefObj);
413     }
414   }
415
416   return anArray;
417 }
418
419 //=============================================================================
420 /*!
421  *  GetLastDependency
422  */
423 //=============================================================================
424 Handle(TColStd_HSequenceOfTransient) GEOM_Object::GetLastDependency()
425 {
426   Handle(TColStd_HSequenceOfTransient) anArray;
427   Handle(GEOM_Function) aFunction = GetLastFunction();
428   if (aFunction.IsNull()) return anArray;
429
430   TDF_LabelSequence aSeq;
431   aFunction->GetDependency(aSeq);
432   Standard_Integer aLength = aSeq.Length();
433   if (aLength > 0) {
434     anArray = new TColStd_HSequenceOfTransient;
435     for (Standard_Integer i = 1; i <= aLength; i++)
436       anArray->Append(GetReferencedObject(aSeq(i)));
437   }
438
439   return anArray;
440 }
441
442 //=============================================================================
443 /*!
444  *  GetFreeLabel
445  */
446 //=============================================================================
447 TDF_Label GEOM_Object::GetFreeLabel()
448 {
449   return _label.FindChild(FREE_LABEL);
450 }
451
452 //=======================================================================
453 //function :  GEOM_Object_Type_
454 //purpose  :
455 //=======================================================================
456 Standard_EXPORT Handle_Standard_Type& GEOM_Object_Type_()
457 {
458
459   static Handle_Standard_Type aType1 = STANDARD_TYPE(MMgt_TShared);
460   if ( aType1.IsNull()) aType1 = STANDARD_TYPE(MMgt_TShared);
461   static Handle_Standard_Type aType2 = STANDARD_TYPE(Standard_Transient);
462   if ( aType2.IsNull()) aType2 = STANDARD_TYPE(Standard_Transient);
463
464
465   static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,NULL};
466   static Handle_Standard_Type _aType = new Standard_Type("GEOM_Object",
467                                                          sizeof(GEOM_Object),
468                                                          1,
469                                                          (Standard_Address)_Ancestors,
470                                                          (Standard_Address)NULL);
471   return _aType;
472 }
473
474 //=======================================================================
475 //function : DownCast
476 //purpose  :
477 //=======================================================================
478
479 const Handle(GEOM_Object) Handle(GEOM_Object)::DownCast(const Handle(Standard_Transient)& AnObject)
480 {
481   Handle(GEOM_Object) _anOtherObject;
482
483   if (!AnObject.IsNull()) {
484      if (AnObject->IsKind(STANDARD_TYPE(GEOM_Object))) {
485        _anOtherObject = Handle(GEOM_Object)((Handle(GEOM_Object)&)AnObject);
486      }
487   }
488
489   return _anOtherObject ;
490 }
491
492