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.
17 #include <Standard_GUID.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 <TopoDS_Shape.hxx>
28 #include <XCAFDoc.hxx>
29 #include <XCAFDoc_DocumentTool.hxx>
30 #include <XCAFDoc_GraphNode.hxx>
31 #include <XCAFDoc_LayerTool.hxx>
32 #include <XCAFDoc_ShapeTool.hxx>
34 IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_LayerTool,TDF_Attribute)
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) const
151 TDF_ChildIterator it( Label() );
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)) ) {
165 //=======================================================================
166 //function : AddLayer
168 //=======================================================================
170 TDF_Label XCAFDoc_LayerTool::AddLayer(const TCollection_ExtendedString& aLayer) const
173 if ( FindLayer(aLayer, lab) )
176 TDF_Label aLabel = aTag.NewChild( Label() );
177 Handle(TDataStd_Name) aName = new TDataStd_Name;
178 aName->Set(aLabel, aLayer);
183 //=======================================================================
184 //function : RemoveLayer
186 //=======================================================================
188 void XCAFDoc_LayerTool::RemoveLayer(const TDF_Label& lab) const
190 lab.ForgetAllAttributes (Standard_True);
194 //=======================================================================
195 //function : GetLayerLabels
197 //=======================================================================
199 void XCAFDoc_LayerTool::GetLayerLabels(TDF_LabelSequence& Labels) const
202 TDF_ChildIterator ChildIterator( Label() );
203 for (; ChildIterator.More(); ChildIterator.Next()) {
204 TDF_Label L = ChildIterator.Value();
205 if ( IsLayer(L)) Labels.Append(L);
210 //=======================================================================
211 //function : SetLayer
213 //=======================================================================
215 void XCAFDoc_LayerTool::SetLayer(const TDF_Label& L,
216 const TDF_Label& LayerL,
217 const Standard_Boolean shapeInOneLayer) const
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);
226 if (! L.FindAttribute( XCAFDoc::LayerRefGUID(), ChGNode) ) {
227 ChGNode = new XCAFDoc_GraphNode;
228 ChGNode = XCAFDoc_GraphNode::Set(L);
230 FGNode->SetGraphID( XCAFDoc::LayerRefGUID() );
231 ChGNode->SetGraphID( XCAFDoc::LayerRefGUID() );
232 FGNode->SetChild(ChGNode);
233 ChGNode->SetFather(FGNode);
237 //=======================================================================
238 //function : SetLayer
240 //=======================================================================
242 void XCAFDoc_LayerTool::SetLayer(const TDF_Label& L,
243 const TCollection_ExtendedString& aLayer,
244 const Standard_Boolean shapeInOneLayer) const
246 TDF_Label aLayerL = AddLayer(aLayer);
247 SetLayer(L, aLayerL, shapeInOneLayer);
251 //=======================================================================
252 //function : UnSetLayers
254 //=======================================================================
256 void XCAFDoc_LayerTool::UnSetLayers(const TDF_Label& L) const
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);
265 L.ForgetAttribute ( XCAFDoc::LayerRefGUID() );
270 //=======================================================================
271 //function : UnSetOneLayer
273 //=======================================================================
275 Standard_Boolean XCAFDoc_LayerTool::UnSetOneLayer(const TDF_Label& L,
276 const TCollection_ExtendedString& aLayer) const
279 if ( !FindLayer(aLayer, alab) ) return Standard_False;
280 return UnSetOneLayer (L, alab);
283 //=======================================================================
284 //function : UnSetOneLayer
286 //=======================================================================
288 Standard_Boolean XCAFDoc_LayerTool::UnSetOneLayer(const TDF_Label& L,
289 const TDF_Label& aLayerL) const
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;
298 //=======================================================================
301 //=======================================================================
303 Standard_Boolean XCAFDoc_LayerTool::IsSet(const TDF_Label& L,
304 const TCollection_ExtendedString& aLayer) const
306 Handle(XCAFDoc_GraphNode) Node;
307 Handle(TDataStd_Name) aName;
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;
317 return Standard_False;
321 //=======================================================================
324 //=======================================================================
326 Standard_Boolean XCAFDoc_LayerTool::IsSet(const TDF_Label& L,
327 const TDF_Label& aLayerL) const
329 Handle(XCAFDoc_GraphNode) Node;
330 Handle(TDataStd_Name) aName;
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();
337 return Standard_True;
340 return Standard_False;
343 //=======================================================================
344 //function : GetLayers
346 //=======================================================================
348 Standard_Boolean XCAFDoc_LayerTool::GetLayers(const TDF_Label& L,
349 Handle(TColStd_HSequenceOfExtendedString)& aLayerS)
351 aLayerS = GetLayers(L);
352 return (aLayerS->Length() != 0);
355 //=======================================================================
356 //function : GetLayers
358 //=======================================================================
360 Standard_Boolean XCAFDoc_LayerTool::GetLayers(const TDF_Label& L,
361 TDF_LabelSequence& aLayerLS)
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());
370 return aLayerLS.Length() > 0;
373 //=======================================================================
374 //function : GetLayers
376 //=======================================================================
378 Handle(TColStd_HSequenceOfExtendedString) XCAFDoc_LayerTool::GetLayers(const TDF_Label& L)
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() );
394 //=======================================================================
395 //function : GetShapesOfLayer
397 //=======================================================================
399 void XCAFDoc_LayerTool::GetShapesOfLayer(const TDF_Label& layerL,
400 TDF_LabelSequence& ShLabels) const
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() );
412 //=======================================================================
413 //function : IsVisible
415 //=======================================================================
417 Standard_Boolean XCAFDoc_LayerTool::IsVisible (const TDF_Label& layerL) const
419 Handle(TDataStd_UAttribute) aUAttr;
420 return (!layerL.FindAttribute(XCAFDoc::InvisibleGUID(), aUAttr));
424 //=======================================================================
425 //function : SetVisibility
427 //=======================================================================
429 void XCAFDoc_LayerTool::SetVisibility (const TDF_Label& layerL,
430 const Standard_Boolean isvisible) const
432 Handle(TDataStd_UAttribute) aUAttr;
434 if (!layerL.FindAttribute(XCAFDoc::InvisibleGUID(), aUAttr)) {
435 TDataStd_UAttribute::Set( layerL, XCAFDoc::InvisibleGUID() );
438 else layerL.ForgetAttribute( XCAFDoc::InvisibleGUID() );
442 //=======================================================================
443 //function : SetLayer
445 //=======================================================================
447 Standard_Boolean XCAFDoc_LayerTool::SetLayer(const TopoDS_Shape& Sh,
448 const TDF_Label& LayerL,
449 const Standard_Boolean shapeInOneLayer)
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;
460 //=======================================================================
461 //function : SetLayer
463 //=======================================================================
465 Standard_Boolean XCAFDoc_LayerTool::SetLayer(const TopoDS_Shape& Sh,
466 const TCollection_ExtendedString& aLayer,
467 const Standard_Boolean shapeInOneLayer)
469 TDF_Label aLayerL = AddLayer(aLayer);
470 return SetLayer(Sh, aLayerL, shapeInOneLayer);
474 //=======================================================================
475 //function : UnSetLayers
477 //=======================================================================
479 Standard_Boolean XCAFDoc_LayerTool::UnSetLayers(const TopoDS_Shape& Sh)
482 if (! myShapeTool->FindShape(Sh, aLab) ) return Standard_False;
484 return Standard_True;
488 //=======================================================================
489 //function : UnSetOneLayer
491 //=======================================================================
493 Standard_Boolean XCAFDoc_LayerTool::UnSetOneLayer(const TopoDS_Shape& Sh,
494 const TCollection_ExtendedString& aLayer)
497 if (! myShapeTool->FindShape(Sh, aLab) ) return Standard_False;
498 return UnSetOneLayer(aLab, aLayer);
501 //=======================================================================
502 //function : UnSetOneLayer
504 //=======================================================================
506 Standard_Boolean XCAFDoc_LayerTool::UnSetOneLayer(const TopoDS_Shape& Sh,
507 const TDF_Label& aLayerL)
510 if (! myShapeTool->FindShape(Sh, aLab) ) return Standard_False;
511 return UnSetOneLayer(aLab, aLayerL);
514 //=======================================================================
517 //=======================================================================
519 Standard_Boolean XCAFDoc_LayerTool::IsSet(const TopoDS_Shape& Sh,
520 const TCollection_ExtendedString& aLayer)
523 if (! myShapeTool->FindShape(Sh, aLab) ) return Standard_False;
524 return IsSet(aLab, aLayer);
528 //=======================================================================
531 //=======================================================================
533 Standard_Boolean XCAFDoc_LayerTool::IsSet(const TopoDS_Shape& Sh,
534 const TDF_Label& aLayerL)
537 if (! myShapeTool->FindShape(Sh, aLab) ) return Standard_False;
538 return IsSet(aLab, aLayerL);
541 //=======================================================================
542 //function : GetLayers
544 //=======================================================================
546 Standard_Boolean XCAFDoc_LayerTool::GetLayers(const TopoDS_Shape& Sh,
547 Handle(TColStd_HSequenceOfExtendedString)& aLayerS)
550 if (! myShapeTool->FindShape(Sh, aLab) ) return Standard_False;
551 return GetLayers(aLab, aLayerS);
554 //=======================================================================
555 //function : GetLayers
557 //=======================================================================
559 Standard_Boolean XCAFDoc_LayerTool::GetLayers(const TopoDS_Shape& Sh,
560 TDF_LabelSequence& aLayerLS)
563 if (! myShapeTool->FindShape(Sh, aLab) ) return Standard_False;
564 return GetLayers(aLab, aLayerLS);
568 //=======================================================================
569 //function : GetLayers
571 //=======================================================================
573 Handle(TColStd_HSequenceOfExtendedString) XCAFDoc_LayerTool::GetLayers(const TopoDS_Shape& Sh)
575 Handle(TColStd_HSequenceOfExtendedString) aLayerS = new TColStd_HSequenceOfExtendedString;
577 if ( myShapeTool->FindShape(Sh, aLab) )
578 aLayerS = GetLayers(aLab);
583 //=======================================================================
586 //=======================================================================
588 const Standard_GUID& XCAFDoc_LayerTool::ID() const
594 //=======================================================================
597 //=======================================================================
599 void XCAFDoc_LayerTool::Restore(const Handle(TDF_Attribute)& /* with */)
604 //=======================================================================
605 //function : NewEmpty
607 //=======================================================================
609 Handle(TDF_Attribute) XCAFDoc_LayerTool::NewEmpty() const
611 return new XCAFDoc_LayerTool;
615 //=======================================================================
618 //=======================================================================
620 void XCAFDoc_LayerTool::Paste(const Handle(TDF_Attribute)& /* into */,
621 const Handle(TDF_RelocationTable)& /* RT */) const