0030773: Application Framework - To allow to inherit existing attributes to reuse...
[occt.git] / src / XCAFDoc / XCAFDoc_LayerTool.cxx
1 // Created on: 2000-10-02
2 // Created by: Pavel TELKOV
3 // Copyright (c) 2000-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #include <XCAFDoc_LayerTool.hxx>
17
18 #include <Standard_GUID.hxx>
19 #include <Standard_Type.hxx>
20 #include <TCollection_ExtendedString.hxx>
21 #include <TDataStd_Name.hxx>
22 #include <TDataStd_UAttribute.hxx>
23 #include <TDF_Attribute.hxx>
24 #include <TDF_ChildIDIterator.hxx>
25 #include <TDF_ChildIterator.hxx>
26 #include <TDF_Label.hxx>
27 #include <TDF_RelocationTable.hxx>
28 #include <TopoDS_Shape.hxx>
29 #include <XCAFDoc.hxx>
30 #include <XCAFDoc_DocumentTool.hxx>
31 #include <XCAFDoc_GraphNode.hxx>
32 #include <XCAFDoc_ShapeTool.hxx>
33
34 IMPLEMENT_DERIVED_ATTRIBUTE_WITH_TYPE(XCAFDoc_LayerTool,TDataStd_GenericEmpty,"xcaf","LayerTool")
35
36 //=======================================================================
37 //function : Constructor
38 //purpose  : 
39 //=======================================================================
40 XCAFDoc_LayerTool::XCAFDoc_LayerTool()
41 {
42 }
43
44
45 //=======================================================================
46 //function : Set
47 //purpose  : 
48 //=======================================================================
49
50 Handle(XCAFDoc_LayerTool) XCAFDoc_LayerTool::Set(const TDF_Label& L) 
51 {
52   Handle(XCAFDoc_LayerTool) A;
53   if (!L.FindAttribute (XCAFDoc_LayerTool::GetID(), A)) {
54     A = new XCAFDoc_LayerTool ();
55     L.AddAttribute(A);
56     A->myShapeTool = XCAFDoc_DocumentTool::ShapeTool(L);
57   }
58   return A;
59 }
60
61
62 //=======================================================================
63 //function : GetID
64 //purpose  : 
65 //=======================================================================
66
67 const Standard_GUID& XCAFDoc_LayerTool::GetID() 
68 {
69   static Standard_GUID LayerTblID ("efd212f4-6dfd-11d4-b9c8-0060b0ee281b");
70   return LayerTblID; 
71 }
72
73
74 //=======================================================================
75 //function : BaseLabel
76 //purpose  : 
77 //=======================================================================
78
79 TDF_Label XCAFDoc_LayerTool::BaseLabel() const
80 {
81   return Label();
82 }
83
84
85 //=======================================================================
86 //function : ShapeTool
87 //purpose  : 
88 //=======================================================================
89
90 const Handle(XCAFDoc_ShapeTool)& XCAFDoc_LayerTool::ShapeTool() 
91 {
92   if (myShapeTool.IsNull())
93     myShapeTool = XCAFDoc_DocumentTool::ShapeTool( Label() );
94   return myShapeTool;
95 }
96
97
98 //=======================================================================
99 //function : IsLayer
100 //purpose  : 
101 //=======================================================================
102
103 Standard_Boolean XCAFDoc_LayerTool::IsLayer(const TDF_Label& lab) const
104 {
105   TCollection_ExtendedString aLayer;
106   return GetLayer ( lab, aLayer);
107 }
108
109
110 //=======================================================================
111 //function : GetLayer
112 //purpose  : 
113 //=======================================================================
114
115 Standard_Boolean XCAFDoc_LayerTool::GetLayer(const TDF_Label& lab,
116                                              TCollection_ExtendedString& aLayer) const
117 {
118   if ( lab.Father() != Label() ) return Standard_False;
119 //   Handle(XCAFDoc_GraphNode) aGN;
120 //   if (! lab.FindAttribute (XCAFDoc::LayerRefGUID(), aGN))
121 //     return Standard_False;
122   Handle(TDataStd_Name) aName;
123   Standard_Boolean status = Standard_False;
124   if ( lab.FindAttribute (TDataStd_Name::GetID(), aName) ) {
125     aLayer = aName->Get();
126     status = Standard_True;
127   }
128   return status;
129 }
130
131 //=======================================================================
132 //function : FindLayer
133 //purpose  : 
134 //=======================================================================
135
136 Standard_Boolean XCAFDoc_LayerTool::FindLayer(const TCollection_ExtendedString& aLayer,
137                                               TDF_Label& lab) const
138 {
139   lab = FindLayer(aLayer);
140   return ( !lab.IsNull() );
141 }
142
143
144 //=======================================================================
145 //function : FindLayer
146 //purpose  : 
147 //=======================================================================
148
149 TDF_Label XCAFDoc_LayerTool::FindLayer(const TCollection_ExtendedString& aLayer) const
150 {
151   TDF_ChildIterator it( Label() );
152   TDF_Label lab;
153   for (; it.More(); it.Next()) {
154     TDF_Label aLabel = it.Value();
155     Handle(TDataStd_Name) aName;
156     if ( aLabel.FindAttribute (TDataStd_Name::GetID(), aName) && (aName->Get().IsEqual(aLayer)) ) {
157       lab =  aLabel;
158       break;
159     }
160   }
161   return lab;
162 }
163
164
165 //=======================================================================
166 //function : AddLayer
167 //purpose  : 
168 //=======================================================================
169
170 TDF_Label XCAFDoc_LayerTool::AddLayer(const TCollection_ExtendedString& aLayer) const
171 {
172   TDF_Label lab;
173   if ( FindLayer(aLayer, lab) )
174     return lab;
175   TDF_TagSource aTag;
176   TDF_Label aLabel = aTag.NewChild( Label() );
177   Handle(TDataStd_Name) aName = new TDataStd_Name;
178   aName->Set(aLabel, aLayer);
179   return aLabel;
180 }
181
182
183 //=======================================================================
184 //function : RemoveLayer
185 //purpose  : 
186 //=======================================================================
187
188 void XCAFDoc_LayerTool::RemoveLayer(const TDF_Label& lab) const
189 {
190   lab.ForgetAllAttributes (Standard_True);
191 }
192
193
194 //=======================================================================
195 //function : GetLayerLabels
196 //purpose  : 
197 //=======================================================================
198
199 void XCAFDoc_LayerTool::GetLayerLabels(TDF_LabelSequence& Labels) const
200 {
201   Labels.Clear();
202   TDF_ChildIterator ChildIterator( Label() ); 
203   for (; ChildIterator.More(); ChildIterator.Next()) {
204     TDF_Label L = ChildIterator.Value();
205     if ( IsLayer(L)) Labels.Append(L);
206   }
207 }
208
209
210 //=======================================================================
211 //function : SetLayer
212 //purpose  : 
213 //=======================================================================
214
215 void XCAFDoc_LayerTool::SetLayer(const TDF_Label& L,
216                                  const TDF_Label& LayerL,
217                                  const Standard_Boolean shapeInOneLayer) const
218 {
219   if (shapeInOneLayer) UnSetLayers( L );
220   Handle(XCAFDoc_GraphNode) FGNode;
221   Handle(XCAFDoc_GraphNode) ChGNode;
222   if (! LayerL.FindAttribute( XCAFDoc::LayerRefGUID(), FGNode) ) {
223     FGNode = new XCAFDoc_GraphNode;
224     FGNode = XCAFDoc_GraphNode::Set(LayerL);
225   }
226   if (! L.FindAttribute( XCAFDoc::LayerRefGUID(), ChGNode) ) {
227     ChGNode = new XCAFDoc_GraphNode;
228     ChGNode = XCAFDoc_GraphNode::Set(L);
229   }
230   FGNode->SetGraphID( XCAFDoc::LayerRefGUID() );
231   ChGNode->SetGraphID( XCAFDoc::LayerRefGUID() );
232   FGNode->SetChild(ChGNode);
233   ChGNode->SetFather(FGNode);
234 }
235
236
237 //=======================================================================
238 //function : SetLayer
239 //purpose  : 
240 //=======================================================================
241
242 void XCAFDoc_LayerTool::SetLayer(const TDF_Label& L,
243                                  const TCollection_ExtendedString& aLayer,
244                                  const Standard_Boolean shapeInOneLayer) const
245 {
246   TDF_Label aLayerL = AddLayer(aLayer);
247   SetLayer(L, aLayerL, shapeInOneLayer);
248 }
249
250
251 //=======================================================================
252 //function : UnSetLayers
253 //purpose  : 
254 //=======================================================================
255
256 void XCAFDoc_LayerTool::UnSetLayers(const TDF_Label& L) const
257 {
258   Handle(XCAFDoc_GraphNode) ChGNode, FGNode;
259   if ( L.FindAttribute (XCAFDoc::LayerRefGUID(), ChGNode) ) {
260     while (ChGNode->NbFathers()!= 0) {
261       FGNode = ChGNode->GetFather(1);
262       FGNode-> UnSetChild(ChGNode);
263 //       ChGNode->GetFather(1)->UnSetChild(ChGNode);
264     }
265     L.ForgetAttribute ( XCAFDoc::LayerRefGUID() );
266   }
267 }
268
269
270 //=======================================================================
271 //function : UnSetOneLayer
272 //purpose  : 
273 //=======================================================================
274
275 Standard_Boolean XCAFDoc_LayerTool::UnSetOneLayer(const TDF_Label& L,
276                                                   const TCollection_ExtendedString& aLayer) const
277 {
278   TDF_Label alab;
279   if ( !FindLayer(aLayer, alab) ) return Standard_False;
280   return UnSetOneLayer (L, alab);
281 }
282
283 //=======================================================================
284 //function : UnSetOneLayer
285 //purpose  : 
286 //=======================================================================
287
288 Standard_Boolean XCAFDoc_LayerTool::UnSetOneLayer(const TDF_Label& L,
289                                                   const TDF_Label& aLayerL) const
290 {
291   Handle(XCAFDoc_GraphNode) FGNode, ChGNode;
292   if ( !L.FindAttribute (XCAFDoc::LayerRefGUID(), ChGNode) ) return Standard_False;
293   if ( !aLayerL.FindAttribute (XCAFDoc::LayerRefGUID(), FGNode) ) return Standard_False;
294   ChGNode->UnSetFather(FGNode);
295   return Standard_True;
296 }
297
298 //=======================================================================
299 //function : IsSet
300 //purpose  : 
301 //=======================================================================
302
303 Standard_Boolean XCAFDoc_LayerTool::IsSet(const TDF_Label& L,
304                                           const TCollection_ExtendedString& aLayer) const
305 {
306   Handle(XCAFDoc_GraphNode) Node;
307   Handle(TDataStd_Name) aName;
308   TDF_Label lab;
309   if (L.FindAttribute(XCAFDoc::LayerRefGUID(), Node) && (Node->NbFathers() != 0 ) ) {
310     Standard_Integer i = 1;
311     for (; i <= Node->NbFathers(); i++) {
312       lab = Node->GetFather(i)->Label();
313       if (lab.FindAttribute(TDataStd_Name::GetID(), aName) && ( aName->Get().IsEqual(aLayer) ) )
314         return Standard_True;
315     }
316   }
317   return Standard_False;
318 }
319
320
321 //=======================================================================
322 //function : IsSet
323 //purpose  : 
324 //=======================================================================
325
326 Standard_Boolean XCAFDoc_LayerTool::IsSet(const TDF_Label& L,
327                                           const TDF_Label& aLayerL) const
328 {
329   Handle(XCAFDoc_GraphNode) Node;
330   Handle(TDataStd_Name) aName;
331   TDF_Label lab;
332   if (L.FindAttribute(XCAFDoc::LayerRefGUID(), Node) && (Node->NbFathers() != 0 ) ) {
333     Standard_Integer i = 1;
334     for (; i <= Node->NbFathers(); i++) {
335       lab = Node->GetFather(i)->Label();
336       if (lab == aLayerL)
337         return Standard_True;
338     }
339   }
340   return Standard_False;
341 }
342
343 //=======================================================================
344 //function : GetLayers
345 //purpose  : 
346 //=======================================================================
347
348 Standard_Boolean XCAFDoc_LayerTool::GetLayers(const TDF_Label& L,
349                                               Handle(TColStd_HSequenceOfExtendedString)& aLayerS) 
350 {
351   aLayerS = GetLayers(L);
352   return (aLayerS->Length() != 0);
353 }
354
355 //=======================================================================
356 //function : GetLayers
357 //purpose  : 
358 //=======================================================================
359
360 Standard_Boolean XCAFDoc_LayerTool::GetLayers(const TDF_Label& L,
361                                               TDF_LabelSequence& aLayerLS) 
362 {
363   aLayerLS.Clear();
364   Handle(XCAFDoc_GraphNode) aGNode;
365   if ( L.FindAttribute( XCAFDoc::LayerRefGUID(), aGNode) ) {
366     for (Standard_Integer i = 1; i <= aGNode->NbFathers(); i++) {
367       aLayerLS.Append (aGNode->GetFather(i)->Label());
368     }
369   }
370   return aLayerLS.Length() > 0;
371 }
372
373 //=======================================================================
374 //function : GetLayers
375 //purpose  : 
376 //=======================================================================
377
378 Handle(TColStd_HSequenceOfExtendedString) XCAFDoc_LayerTool::GetLayers(const TDF_Label& L) 
379 {
380   Handle(TColStd_HSequenceOfExtendedString) aLayerS = new TColStd_HSequenceOfExtendedString;
381   TDF_LabelSequence aLayerLS;
382   if ( GetLayers( L, aLayerLS ) ) {
383     for (Standard_Integer i = 1; i <= aLayerLS.Length(); ++i) {
384       const TDF_Label& aLab = aLayerLS(i);
385       Handle(TDataStd_Name) aName;
386       if ( aLab.FindAttribute( TDataStd_Name::GetID(), aName ) ) {
387         aLayerS->Append( aName->Get() );
388       }
389     }
390   }
391   return aLayerS;
392 }
393
394 //=======================================================================
395 //function : GetShapesOfLayer
396 //purpose  : 
397 //=======================================================================
398
399 void XCAFDoc_LayerTool::GetShapesOfLayer(const TDF_Label& layerL,
400                                          TDF_LabelSequence& ShLabels) const
401 {
402   ShLabels.Clear();
403   Handle(XCAFDoc_GraphNode) aGNode;
404   if ( layerL.FindAttribute( XCAFDoc::LayerRefGUID(), aGNode) ) {
405     for (Standard_Integer i = 1; i <= aGNode->NbChildren(); i++) {
406       ShLabels.Append( aGNode->GetChild(i)->Label() );
407     }
408   }
409 }
410
411
412 //=======================================================================
413 //function : IsVisible
414 //purpose  : 
415 //=======================================================================
416
417 Standard_Boolean XCAFDoc_LayerTool::IsVisible (const TDF_Label& layerL) const
418 {
419   Handle(TDataStd_UAttribute) aUAttr;
420   return (!layerL.FindAttribute(XCAFDoc::InvisibleGUID(), aUAttr));
421 }
422
423
424 //=======================================================================
425 //function : SetVisibility
426 //purpose  : 
427 //=======================================================================
428
429 void XCAFDoc_LayerTool::SetVisibility (const TDF_Label& layerL,
430                                        const Standard_Boolean isvisible) const
431 {
432   Handle(TDataStd_UAttribute) aUAttr;
433   if (! isvisible ) {
434     if (!layerL.FindAttribute(XCAFDoc::InvisibleGUID(), aUAttr)) {
435       TDataStd_UAttribute::Set( layerL, XCAFDoc::InvisibleGUID() );
436     }
437   }
438   else layerL.ForgetAttribute( XCAFDoc::InvisibleGUID() );
439 }
440        
441
442 //=======================================================================
443 //function : SetLayer
444 //purpose  : 
445 //=======================================================================
446
447 Standard_Boolean XCAFDoc_LayerTool::SetLayer(const TopoDS_Shape& Sh,
448                                              const TDF_Label& LayerL, 
449                                              const Standard_Boolean shapeInOneLayer)
450 {
451   TDF_Label aLab;
452 //   if (! myShapeTool->FindShape(Sh, aLab) ) return Standard_False;
453   // PTV 22.01.2003 set layer for shape with location if it is necessary
454   if (! myShapeTool->Search( Sh, aLab ) ) return Standard_False;
455   SetLayer(aLab, LayerL, shapeInOneLayer);
456   return Standard_True;
457 }
458
459
460 //=======================================================================
461 //function : SetLayer
462 //purpose  : 
463 //=======================================================================
464
465 Standard_Boolean XCAFDoc_LayerTool::SetLayer(const TopoDS_Shape& Sh,
466                                              const TCollection_ExtendedString& aLayer,
467                                              const Standard_Boolean shapeInOneLayer)
468 {
469   TDF_Label aLayerL = AddLayer(aLayer);
470   return SetLayer(Sh, aLayerL, shapeInOneLayer);
471 }
472
473
474 //=======================================================================
475 //function : UnSetLayers
476 //purpose  : 
477 //=======================================================================
478
479 Standard_Boolean XCAFDoc_LayerTool::UnSetLayers(const TopoDS_Shape& Sh) 
480 {
481   TDF_Label aLab;
482   if (! myShapeTool->FindShape(Sh, aLab) ) return Standard_False;
483   UnSetLayers(aLab);
484   return Standard_True;
485 }
486
487
488 //=======================================================================
489 //function : UnSetOneLayer
490 //purpose  : 
491 //=======================================================================
492
493 Standard_Boolean XCAFDoc_LayerTool::UnSetOneLayer(const TopoDS_Shape& Sh,
494                                                   const TCollection_ExtendedString& aLayer)
495 {
496   TDF_Label aLab;
497   if (! myShapeTool->FindShape(Sh, aLab) ) return Standard_False;
498   return UnSetOneLayer(aLab, aLayer);
499 }
500
501 //=======================================================================
502 //function : UnSetOneLayer
503 //purpose  : 
504 //=======================================================================
505
506 Standard_Boolean XCAFDoc_LayerTool::UnSetOneLayer(const TopoDS_Shape& Sh,
507                                                   const TDF_Label& aLayerL)
508 {
509   TDF_Label aLab;
510   if (! myShapeTool->FindShape(Sh, aLab) ) return Standard_False;
511   return UnSetOneLayer(aLab, aLayerL);
512 }
513
514 //=======================================================================
515 //function : IsSet
516 //purpose  : 
517 //=======================================================================
518
519 Standard_Boolean XCAFDoc_LayerTool::IsSet(const TopoDS_Shape& Sh,
520                                           const TCollection_ExtendedString& aLayer) 
521 {
522   TDF_Label aLab;
523   if (! myShapeTool->FindShape(Sh, aLab) ) return Standard_False;
524   return IsSet(aLab, aLayer);
525 }
526
527
528 //=======================================================================
529 //function : IsSet
530 //purpose  : 
531 //=======================================================================
532
533 Standard_Boolean XCAFDoc_LayerTool::IsSet(const TopoDS_Shape& Sh,
534                                           const TDF_Label& aLayerL) 
535 {
536   TDF_Label aLab;
537   if (! myShapeTool->FindShape(Sh, aLab) ) return Standard_False;
538   return IsSet(aLab, aLayerL);
539 }
540
541 //=======================================================================
542 //function : GetLayers
543 //purpose  : 
544 //=======================================================================
545
546 Standard_Boolean XCAFDoc_LayerTool::GetLayers(const TopoDS_Shape& Sh,
547                                               Handle(TColStd_HSequenceOfExtendedString)& aLayerS) 
548 {
549   TDF_Label aLab;
550   if (! myShapeTool->FindShape(Sh, aLab) ) return Standard_False;
551   return GetLayers(aLab, aLayerS);
552 }
553
554 //=======================================================================
555 //function : GetLayers
556 //purpose  : 
557 //=======================================================================
558
559 Standard_Boolean XCAFDoc_LayerTool::GetLayers(const TopoDS_Shape& Sh,
560                                               TDF_LabelSequence& aLayerLS) 
561 {
562   TDF_Label aLab;
563   if (! myShapeTool->FindShape(Sh, aLab) ) return Standard_False;
564   return GetLayers(aLab, aLayerLS);
565 }
566
567
568 //=======================================================================
569 //function : GetLayers
570 //purpose  : 
571 //=======================================================================
572
573 Handle(TColStd_HSequenceOfExtendedString) XCAFDoc_LayerTool::GetLayers(const TopoDS_Shape& Sh) 
574 {
575   Handle(TColStd_HSequenceOfExtendedString) aLayerS = new TColStd_HSequenceOfExtendedString;
576   TDF_Label aLab;
577   if ( myShapeTool->FindShape(Sh, aLab) )
578     aLayerS = GetLayers(aLab);
579   return aLayerS;
580 }
581
582
583 //=======================================================================
584 //function : ID
585 //purpose  : 
586 //=======================================================================
587
588 const Standard_GUID& XCAFDoc_LayerTool::ID() const
589 {
590   return GetID();
591 }
592
593 //=======================================================================
594 //function : DumpJson
595 //purpose  : 
596 //=======================================================================
597 void XCAFDoc_LayerTool::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const
598 {
599   OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
600
601   OCCT_DUMP_BASE_CLASS (theOStream, theDepth, TDF_Attribute)
602
603   OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myShapeTool.get())
604 }