1 // Created on: 2000-10-02
2 // Created by: Pavel TELKOV
3 // Copyright (c) 2000-2014 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
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.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
16 #include <XCAFDoc_LayerTool.hxx>
18 #include <Standard_Type.hxx>
19 #include <TCollection_ExtendedString.hxx>
20 #include <TDataStd_Name.hxx>
21 #include <TDataStd_UAttribute.hxx>
22 #include <TDF_Attribute.hxx>
23 #include <TDF_ChildIDIterator.hxx>
24 #include <TDF_ChildIterator.hxx>
25 #include <TDF_Label.hxx>
26 #include <TDF_RelocationTable.hxx>
27 #include <TDF_Tool.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>
34 IMPLEMENT_DERIVED_ATTRIBUTE_WITH_TYPE(XCAFDoc_LayerTool,TDataStd_GenericEmpty,"xcaf","LayerTool")
36 //=======================================================================
37 //function : Constructor
39 //=======================================================================
40 XCAFDoc_LayerTool::XCAFDoc_LayerTool()
45 //=======================================================================
48 //=======================================================================
50 Handle(XCAFDoc_LayerTool) XCAFDoc_LayerTool::Set(const TDF_Label& L)
52 Handle(XCAFDoc_LayerTool) A;
53 if (!L.FindAttribute (XCAFDoc_LayerTool::GetID(), A)) {
54 A = new XCAFDoc_LayerTool ();
56 A->myShapeTool = XCAFDoc_DocumentTool::ShapeTool(L);
62 //=======================================================================
65 //=======================================================================
67 const Standard_GUID& XCAFDoc_LayerTool::GetID()
69 static Standard_GUID LayerTblID ("efd212f4-6dfd-11d4-b9c8-0060b0ee281b");
74 //=======================================================================
75 //function : BaseLabel
77 //=======================================================================
79 TDF_Label XCAFDoc_LayerTool::BaseLabel() const
85 //=======================================================================
86 //function : ShapeTool
88 //=======================================================================
90 const Handle(XCAFDoc_ShapeTool)& XCAFDoc_LayerTool::ShapeTool()
92 if (myShapeTool.IsNull())
93 myShapeTool = XCAFDoc_DocumentTool::ShapeTool( Label() );
98 //=======================================================================
101 //=======================================================================
103 Standard_Boolean XCAFDoc_LayerTool::IsLayer(const TDF_Label& lab) const
105 TCollection_ExtendedString aLayer;
106 return GetLayer ( lab, aLayer);
110 //=======================================================================
111 //function : GetLayer
113 //=======================================================================
115 Standard_Boolean XCAFDoc_LayerTool::GetLayer(const TDF_Label& lab,
116 TCollection_ExtendedString& aLayer) const
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;
131 //=======================================================================
132 //function : FindLayer
134 //=======================================================================
136 Standard_Boolean XCAFDoc_LayerTool::FindLayer(const TCollection_ExtendedString& aLayer,
137 TDF_Label& lab) const
139 lab = FindLayer(aLayer);
140 return ( !lab.IsNull() );
144 //=======================================================================
145 //function : FindLayer
147 //=======================================================================
149 TDF_Label XCAFDoc_LayerTool::FindLayer(const TCollection_ExtendedString& aLayer,
150 const Standard_Boolean theToFindWithProperty,
151 const Standard_Boolean theToFindVisible) const
153 TDF_ChildIterator it( Label() );
155 for (; it.More(); it.Next()) {
156 TDF_Label aLabel = it.Value();
157 Handle(TDataStd_Name) aName;
158 if ( aLabel.FindAttribute (TDataStd_Name::GetID(), aName) && (aName->Get().IsEqual(aLayer)) &&
159 (!theToFindWithProperty || (theToFindWithProperty && (IsVisible(aLabel) == theToFindVisible))) )
169 //=======================================================================
170 //function : AddLayer
172 //=======================================================================
174 TDF_Label XCAFDoc_LayerTool::AddLayer(const TCollection_ExtendedString& theLayer) const
177 if ( FindLayer(theLayer, lab) )
180 TDF_Label aLabel = aTag.NewChild( Label() );
181 Handle(TDataStd_Name) aName = new TDataStd_Name;
182 aName->Set(aLabel, theLayer);
186 //=======================================================================
187 //function : AddLayer
189 //=======================================================================
191 TDF_Label XCAFDoc_LayerTool::AddLayer(const TCollection_ExtendedString& theLayer,
192 const Standard_Boolean theToFindVisible) const
194 TDF_Label lab = FindLayer(theLayer, Standard_True, theToFindVisible);
198 TDF_Label aLabel = aTag.NewChild(Label());
199 Handle(TDataStd_Name) aName = new TDataStd_Name;
200 aName->Set(aLabel, theLayer);
204 //=======================================================================
205 //function : RemoveLayer
207 //=======================================================================
209 void XCAFDoc_LayerTool::RemoveLayer(const TDF_Label& lab) const
211 lab.ForgetAllAttributes (Standard_True);
215 //=======================================================================
216 //function : GetLayerLabels
218 //=======================================================================
220 void XCAFDoc_LayerTool::GetLayerLabels(TDF_LabelSequence& Labels) const
223 TDF_ChildIterator ChildIterator( Label() );
224 for (; ChildIterator.More(); ChildIterator.Next()) {
225 TDF_Label L = ChildIterator.Value();
226 if ( IsLayer(L)) Labels.Append(L);
231 //=======================================================================
232 //function : SetLayer
234 //=======================================================================
236 void XCAFDoc_LayerTool::SetLayer(const TDF_Label& L,
237 const TDF_Label& LayerL,
238 const Standard_Boolean shapeInOneLayer) const
240 if (shapeInOneLayer) UnSetLayers( L );
241 Handle(XCAFDoc_GraphNode) FGNode;
242 Handle(XCAFDoc_GraphNode) ChGNode;
243 if (! LayerL.FindAttribute( XCAFDoc::LayerRefGUID(), FGNode) ) {
244 FGNode = new XCAFDoc_GraphNode;
245 FGNode = XCAFDoc_GraphNode::Set(LayerL);
247 if (! L.FindAttribute( XCAFDoc::LayerRefGUID(), ChGNode) ) {
248 ChGNode = new XCAFDoc_GraphNode;
249 ChGNode = XCAFDoc_GraphNode::Set(L);
251 FGNode->SetGraphID( XCAFDoc::LayerRefGUID() );
252 ChGNode->SetGraphID( XCAFDoc::LayerRefGUID() );
253 FGNode->SetChild(ChGNode);
254 ChGNode->SetFather(FGNode);
258 //=======================================================================
259 //function : SetLayer
261 //=======================================================================
263 void XCAFDoc_LayerTool::SetLayer(const TDF_Label& L,
264 const TCollection_ExtendedString& aLayer,
265 const Standard_Boolean shapeInOneLayer) const
267 TDF_Label aLayerL = AddLayer(aLayer);
268 SetLayer(L, aLayerL, shapeInOneLayer);
272 //=======================================================================
273 //function : UnSetLayers
275 //=======================================================================
277 void XCAFDoc_LayerTool::UnSetLayers(const TDF_Label& L) const
279 Handle(XCAFDoc_GraphNode) ChGNode, FGNode;
280 if ( L.FindAttribute (XCAFDoc::LayerRefGUID(), ChGNode) ) {
281 while (ChGNode->NbFathers()!= 0) {
282 FGNode = ChGNode->GetFather(1);
283 FGNode-> UnSetChild(ChGNode);
284 // ChGNode->GetFather(1)->UnSetChild(ChGNode);
286 L.ForgetAttribute ( XCAFDoc::LayerRefGUID() );
291 //=======================================================================
292 //function : UnSetOneLayer
294 //=======================================================================
296 Standard_Boolean XCAFDoc_LayerTool::UnSetOneLayer(const TDF_Label& L,
297 const TCollection_ExtendedString& aLayer) const
300 if ( !FindLayer(aLayer, alab) ) return Standard_False;
301 return UnSetOneLayer (L, alab);
304 //=======================================================================
305 //function : UnSetOneLayer
307 //=======================================================================
309 Standard_Boolean XCAFDoc_LayerTool::UnSetOneLayer(const TDF_Label& L,
310 const TDF_Label& aLayerL) const
312 Handle(XCAFDoc_GraphNode) FGNode, ChGNode;
313 if ( !L.FindAttribute (XCAFDoc::LayerRefGUID(), ChGNode) ) return Standard_False;
314 if ( !aLayerL.FindAttribute (XCAFDoc::LayerRefGUID(), FGNode) ) return Standard_False;
315 ChGNode->UnSetFather(FGNode);
316 return Standard_True;
319 //=======================================================================
322 //=======================================================================
324 Standard_Boolean XCAFDoc_LayerTool::IsSet(const TDF_Label& L,
325 const TCollection_ExtendedString& aLayer) const
327 Handle(XCAFDoc_GraphNode) Node;
328 Handle(TDataStd_Name) aName;
330 if (L.FindAttribute(XCAFDoc::LayerRefGUID(), Node) && (Node->NbFathers() != 0 ) ) {
331 Standard_Integer i = 1;
332 for (; i <= Node->NbFathers(); i++) {
333 lab = Node->GetFather(i)->Label();
334 if (lab.FindAttribute(TDataStd_Name::GetID(), aName) && ( aName->Get().IsEqual(aLayer) ) )
335 return Standard_True;
338 return Standard_False;
342 //=======================================================================
345 //=======================================================================
347 Standard_Boolean XCAFDoc_LayerTool::IsSet(const TDF_Label& L,
348 const TDF_Label& aLayerL) const
350 Handle(XCAFDoc_GraphNode) Node;
351 Handle(TDataStd_Name) aName;
353 if (L.FindAttribute(XCAFDoc::LayerRefGUID(), Node) && (Node->NbFathers() != 0 ) ) {
354 Standard_Integer i = 1;
355 for (; i <= Node->NbFathers(); i++) {
356 lab = Node->GetFather(i)->Label();
358 return Standard_True;
361 return Standard_False;
364 //=======================================================================
365 //function : GetLayers
367 //=======================================================================
369 Standard_Boolean XCAFDoc_LayerTool::GetLayers(const TDF_Label& L,
370 Handle(TColStd_HSequenceOfExtendedString)& aLayerS)
372 aLayerS = GetLayers(L);
373 return (aLayerS->Length() != 0);
376 //=======================================================================
377 //function : GetLayers
379 //=======================================================================
381 Standard_Boolean XCAFDoc_LayerTool::GetLayers(const TDF_Label& L,
382 TDF_LabelSequence& aLayerLS)
385 Handle(XCAFDoc_GraphNode) aGNode;
386 if ( L.FindAttribute( XCAFDoc::LayerRefGUID(), aGNode) ) {
387 for (Standard_Integer i = 1; i <= aGNode->NbFathers(); i++) {
388 aLayerLS.Append (aGNode->GetFather(i)->Label());
391 return aLayerLS.Length() > 0;
394 //=======================================================================
395 //function : GetLayers
397 //=======================================================================
399 Handle(TColStd_HSequenceOfExtendedString) XCAFDoc_LayerTool::GetLayers(const TDF_Label& L)
401 Handle(TColStd_HSequenceOfExtendedString) aLayerS = new TColStd_HSequenceOfExtendedString;
402 TDF_LabelSequence aLayerLS;
403 if ( GetLayers( L, aLayerLS ) ) {
404 for (Standard_Integer i = 1; i <= aLayerLS.Length(); ++i) {
405 const TDF_Label& aLab = aLayerLS(i);
406 Handle(TDataStd_Name) aName;
407 if ( aLab.FindAttribute( TDataStd_Name::GetID(), aName ) ) {
408 aLayerS->Append( aName->Get() );
415 //=======================================================================
416 //function : GetShapesOfLayer
418 //=======================================================================
419 void XCAFDoc_LayerTool::GetShapesOfLayer(const TDF_Label& theLayerL,
420 TDF_LabelSequence& theShLabels)
423 Handle(XCAFDoc_GraphNode) aGNode;
424 if (theLayerL.FindAttribute(XCAFDoc::LayerRefGUID(), aGNode))
426 for (Standard_Integer aChildInd = 1; aChildInd <= aGNode->NbChildren(); aChildInd++)
428 theShLabels.Append(aGNode->GetChild(aChildInd)->Label());
433 //=======================================================================
434 //function : IsVisible
436 //=======================================================================
438 Standard_Boolean XCAFDoc_LayerTool::IsVisible (const TDF_Label& layerL) const
440 Handle(TDataStd_UAttribute) aUAttr;
441 return (!layerL.FindAttribute(XCAFDoc::InvisibleGUID(), aUAttr));
445 //=======================================================================
446 //function : SetVisibility
448 //=======================================================================
450 void XCAFDoc_LayerTool::SetVisibility (const TDF_Label& layerL,
451 const Standard_Boolean isvisible) const
453 Handle(TDataStd_UAttribute) aUAttr;
455 if (!layerL.FindAttribute(XCAFDoc::InvisibleGUID(), aUAttr)) {
456 TDataStd_UAttribute::Set( layerL, XCAFDoc::InvisibleGUID() );
459 else layerL.ForgetAttribute( XCAFDoc::InvisibleGUID() );
463 //=======================================================================
464 //function : SetLayer
466 //=======================================================================
468 Standard_Boolean XCAFDoc_LayerTool::SetLayer(const TopoDS_Shape& Sh,
469 const TDF_Label& LayerL,
470 const Standard_Boolean shapeInOneLayer)
473 // PTV 22.01.2003 set layer for shape with location if it is necessary
474 if (! myShapeTool->Search( Sh, aLab ) ) return Standard_False;
475 SetLayer(aLab, LayerL, shapeInOneLayer);
476 return Standard_True;
480 //=======================================================================
481 //function : SetLayer
483 //=======================================================================
485 Standard_Boolean XCAFDoc_LayerTool::SetLayer(const TopoDS_Shape& Sh,
486 const TCollection_ExtendedString& aLayer,
487 const Standard_Boolean shapeInOneLayer)
489 TDF_Label aLayerL = AddLayer(aLayer);
490 return SetLayer(Sh, aLayerL, shapeInOneLayer);
494 //=======================================================================
495 //function : UnSetLayers
497 //=======================================================================
499 Standard_Boolean XCAFDoc_LayerTool::UnSetLayers(const TopoDS_Shape& Sh)
502 if (!myShapeTool->Search(Sh, aLab) )
503 return Standard_False;
505 return Standard_True;
509 //=======================================================================
510 //function : UnSetOneLayer
512 //=======================================================================
514 Standard_Boolean XCAFDoc_LayerTool::UnSetOneLayer(const TopoDS_Shape& Sh,
515 const TCollection_ExtendedString& aLayer)
518 if (!myShapeTool->Search(Sh, aLab) )
519 return Standard_False;
520 return UnSetOneLayer(aLab, aLayer);
523 //=======================================================================
524 //function : UnSetOneLayer
526 //=======================================================================
528 Standard_Boolean XCAFDoc_LayerTool::UnSetOneLayer(const TopoDS_Shape& Sh,
529 const TDF_Label& aLayerL)
532 if (!myShapeTool->Search(Sh, aLab) )
533 return Standard_False;
534 return UnSetOneLayer(aLab, aLayerL);
537 //=======================================================================
540 //=======================================================================
542 Standard_Boolean XCAFDoc_LayerTool::IsSet(const TopoDS_Shape& Sh,
543 const TCollection_ExtendedString& aLayer)
546 if (! myShapeTool->Search(Sh, aLab) )
547 return Standard_False;
548 return IsSet(aLab, aLayer);
552 //=======================================================================
555 //=======================================================================
557 Standard_Boolean XCAFDoc_LayerTool::IsSet(const TopoDS_Shape& Sh,
558 const TDF_Label& aLayerL)
561 if (!myShapeTool->Search(Sh, aLab) )
562 return Standard_False;
563 return IsSet(aLab, aLayerL);
566 //=======================================================================
567 //function : GetLayers
569 //=======================================================================
571 Standard_Boolean XCAFDoc_LayerTool::GetLayers(const TopoDS_Shape& Sh,
572 Handle(TColStd_HSequenceOfExtendedString)& aLayerS)
575 if (!myShapeTool->Search(Sh, aLab))
576 return Standard_False;
577 return GetLayers(aLab, aLayerS);
580 //=======================================================================
581 //function : GetLayers
583 //=======================================================================
585 Standard_Boolean XCAFDoc_LayerTool::GetLayers(const TopoDS_Shape& Sh,
586 TDF_LabelSequence& aLayerLS)
589 if (!myShapeTool->Search(Sh, aLab))
590 return Standard_False;
591 return GetLayers(aLab, aLayerLS);
595 //=======================================================================
596 //function : GetLayers
598 //=======================================================================
600 Handle(TColStd_HSequenceOfExtendedString) XCAFDoc_LayerTool::GetLayers(const TopoDS_Shape& Sh)
602 Handle(TColStd_HSequenceOfExtendedString) aLayerS = new TColStd_HSequenceOfExtendedString;
604 if (myShapeTool->Search(Sh, aLab))
605 aLayerS = GetLayers(aLab);
610 //=======================================================================
613 //=======================================================================
615 const Standard_GUID& XCAFDoc_LayerTool::ID() const
620 //=======================================================================
621 //function : DumpJson
623 //=======================================================================
624 void XCAFDoc_LayerTool::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const
626 OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
628 OCCT_DUMP_BASE_CLASS (theOStream, theDepth, TDF_Attribute)
630 TDF_LabelSequence aLabels;
631 GetLayerLabels (aLabels);
632 for (TDF_LabelSequence::Iterator aLayerLabelIt (aLabels); aLayerLabelIt.More(); aLayerLabelIt.Next())
634 TCollection_AsciiString aLayerLabel;
635 TDF_Tool::Entry (aLayerLabelIt.Value(), aLayerLabel);
636 OCCT_DUMP_FIELD_VALUE_STRING (theOStream, aLayerLabel)