1 // Created on: 2000-10-02
2 // Created by: Pavel TELKOV
3 // Copyright (c) 2000-2012 OPEN CASCADE SAS
5 // The content of this file is subject to the Open CASCADE Technology Public
6 // License Version 6.5 (the "License"). You may not use the content of this file
7 // except in compliance with the License. Please obtain a copy of the License
8 // at http://www.opencascade.org and read it completely before using this file.
10 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13 // The Original Code and all software distributed under the License is
14 // distributed on an "AS IS" basis, without warranty of any kind, and the
15 // Initial Developer hereby disclaims all such warranties, including without
16 // limitation, any warranties of merchantability, fitness for a particular
17 // purpose or non-infringement. Please see the License for the specific terms
18 // and conditions governing the rights and limitations under the License.
22 #include <XCAFDoc_LayerTool.ixx>
23 #include <XCAFDoc_DocumentTool.hxx>
24 #include <XCAFDoc_GraphNode.hxx>
25 #include <TDataStd_Name.hxx>
26 #include <TDF_ChildIDIterator.hxx>
27 #include <TDF_ChildIterator.hxx>
28 #include <XCAFDoc.hxx>
29 #include <TDataStd_UAttribute.hxx>
31 //=======================================================================
32 //function : Constructor
34 //=======================================================================
36 XCAFDoc_LayerTool::XCAFDoc_LayerTool()
41 //=======================================================================
44 //=======================================================================
46 Handle(XCAFDoc_LayerTool) XCAFDoc_LayerTool::Set(const TDF_Label& L)
48 Handle(XCAFDoc_LayerTool) A;
49 if (!L.FindAttribute (XCAFDoc_LayerTool::GetID(), A)) {
50 A = new XCAFDoc_LayerTool ();
52 A->myShapeTool = XCAFDoc_DocumentTool::ShapeTool(L);
58 //=======================================================================
61 //=======================================================================
63 const Standard_GUID& XCAFDoc_LayerTool::GetID()
65 static Standard_GUID LayerTblID ("efd212f4-6dfd-11d4-b9c8-0060b0ee281b");
70 //=======================================================================
71 //function : BaseLabel
73 //=======================================================================
75 TDF_Label XCAFDoc_LayerTool::BaseLabel() const
81 //=======================================================================
82 //function : ShapeTool
84 //=======================================================================
86 const Handle(XCAFDoc_ShapeTool)& XCAFDoc_LayerTool::ShapeTool()
88 if (myShapeTool.IsNull())
89 myShapeTool = XCAFDoc_DocumentTool::ShapeTool( Label() );
94 //=======================================================================
97 //=======================================================================
99 Standard_Boolean XCAFDoc_LayerTool::IsLayer(const TDF_Label& lab) const
101 TCollection_ExtendedString aLayer;
102 return GetLayer ( lab, aLayer);
106 //=======================================================================
107 //function : GetLayer
109 //=======================================================================
111 Standard_Boolean XCAFDoc_LayerTool::GetLayer(const TDF_Label& lab,
112 TCollection_ExtendedString& aLayer) const
114 if ( lab.Father() != Label() ) return Standard_False;
115 // Handle(XCAFDoc_GraphNode) aGN;
116 // if (! lab.FindAttribute (XCAFDoc::LayerRefGUID(), aGN))
117 // return Standard_False;
118 Handle(TDataStd_Name) aName;
119 Standard_Boolean status = Standard_False;
120 if ( lab.FindAttribute (TDataStd_Name::GetID(), aName) ) {
121 aLayer = aName->Get();
122 status = Standard_True;
127 //=======================================================================
128 //function : FindLayer
130 //=======================================================================
132 Standard_Boolean XCAFDoc_LayerTool::FindLayer(const TCollection_ExtendedString& aLayer,
133 TDF_Label& lab) const
135 lab = FindLayer(aLayer);
136 return ( !lab.IsNull() );
140 //=======================================================================
141 //function : FindLayer
143 //=======================================================================
145 TDF_Label XCAFDoc_LayerTool::FindLayer(const TCollection_ExtendedString& aLayer) const
147 TDF_ChildIterator it( Label() );
149 for (; it.More(); it.Next()) {
150 TDF_Label aLabel = it.Value();
151 Handle(TDataStd_Name) aName;
152 if ( aLabel.FindAttribute (TDataStd_Name::GetID(), aName) && (aName->Get().IsEqual(aLayer)) ) {
161 //=======================================================================
162 //function : AddLayer
164 //=======================================================================
166 TDF_Label XCAFDoc_LayerTool::AddLayer(const TCollection_ExtendedString& aLayer) const
169 if ( FindLayer(aLayer, lab) )
172 TDF_Label aLabel = aTag.NewChild( Label() );
173 Handle(TDataStd_Name) aName = new TDataStd_Name;
174 aName->Set(aLabel, aLayer);
179 //=======================================================================
180 //function : RemoveLayer
182 //=======================================================================
184 void XCAFDoc_LayerTool::RemoveLayer(const TDF_Label& lab) const
186 lab.ForgetAllAttributes (Standard_True);
190 //=======================================================================
191 //function : GetLayerLabels
193 //=======================================================================
195 void XCAFDoc_LayerTool::GetLayerLabels(TDF_LabelSequence& Labels) const
198 TDF_ChildIterator ChildIterator( Label() );
199 for (; ChildIterator.More(); ChildIterator.Next()) {
200 TDF_Label L = ChildIterator.Value();
201 if ( IsLayer(L)) Labels.Append(L);
206 //=======================================================================
207 //function : SetLayer
209 //=======================================================================
211 void XCAFDoc_LayerTool::SetLayer(const TDF_Label& L,
212 const TDF_Label& LayerL,
213 const Standard_Boolean shapeInOneLayer) const
215 if (shapeInOneLayer) UnSetLayers( L );
216 Handle(XCAFDoc_GraphNode) FGNode;
217 Handle(XCAFDoc_GraphNode) ChGNode;
218 if (! LayerL.FindAttribute( XCAFDoc::LayerRefGUID(), FGNode) ) {
219 FGNode = new XCAFDoc_GraphNode;
220 FGNode = XCAFDoc_GraphNode::Set(LayerL);
222 if (! L.FindAttribute( XCAFDoc::LayerRefGUID(), ChGNode) ) {
223 ChGNode = new XCAFDoc_GraphNode;
224 ChGNode = XCAFDoc_GraphNode::Set(L);
226 FGNode->SetGraphID( XCAFDoc::LayerRefGUID() );
227 ChGNode->SetGraphID( XCAFDoc::LayerRefGUID() );
228 FGNode->SetChild(ChGNode);
229 ChGNode->SetFather(FGNode);
233 //=======================================================================
234 //function : SetLayer
236 //=======================================================================
238 void XCAFDoc_LayerTool::SetLayer(const TDF_Label& L,
239 const TCollection_ExtendedString& aLayer,
240 const Standard_Boolean shapeInOneLayer) const
242 TDF_Label aLayerL = AddLayer(aLayer);
243 SetLayer(L, aLayerL, shapeInOneLayer);
247 //=======================================================================
248 //function : UnSetLayers
250 //=======================================================================
252 void XCAFDoc_LayerTool::UnSetLayers(const TDF_Label& L) const
254 Handle(XCAFDoc_GraphNode) ChGNode, FGNode;
255 if ( L.FindAttribute (XCAFDoc::LayerRefGUID(), ChGNode) ) {
256 while (ChGNode->NbFathers()!= 0) {
257 FGNode = ChGNode->GetFather(1);
258 FGNode-> UnSetChild(ChGNode);
259 // ChGNode->GetFather(1)->UnSetChild(ChGNode);
261 L.ForgetAttribute ( XCAFDoc::LayerRefGUID() );
266 //=======================================================================
267 //function : UnSetOneLayer
269 //=======================================================================
271 Standard_Boolean XCAFDoc_LayerTool::UnSetOneLayer(const TDF_Label& L,
272 const TCollection_ExtendedString& aLayer) const
275 if ( !FindLayer(aLayer, alab) ) return Standard_False;
276 return UnSetOneLayer (L, alab);
279 //=======================================================================
280 //function : UnSetOneLayer
282 //=======================================================================
284 Standard_Boolean XCAFDoc_LayerTool::UnSetOneLayer(const TDF_Label& L,
285 const TDF_Label& aLayerL) const
287 Handle(XCAFDoc_GraphNode) FGNode, ChGNode;
288 if ( !L.FindAttribute (XCAFDoc::LayerRefGUID(), ChGNode) ) return Standard_False;
289 if ( !aLayerL.FindAttribute (XCAFDoc::LayerRefGUID(), FGNode) ) return Standard_False;
290 ChGNode->UnSetFather(FGNode);
291 return Standard_True;
294 //=======================================================================
297 //=======================================================================
299 Standard_Boolean XCAFDoc_LayerTool::IsSet(const TDF_Label& L,
300 const TCollection_ExtendedString& aLayer) const
302 Handle(XCAFDoc_GraphNode) Node;
303 Handle(TDataStd_Name) aName;
305 if (L.FindAttribute(XCAFDoc::LayerRefGUID(), Node) && (Node->NbFathers() != 0 ) ) {
306 Standard_Integer i = 1;
307 for (; i <= Node->NbFathers(); i++) {
308 lab = Node->GetFather(i)->Label();
309 if (lab.FindAttribute(TDataStd_Name::GetID(), aName) && ( aName->Get().IsEqual(aLayer) ) )
310 return Standard_True;
313 return Standard_False;
317 //=======================================================================
320 //=======================================================================
322 Standard_Boolean XCAFDoc_LayerTool::IsSet(const TDF_Label& L,
323 const TDF_Label& aLayerL) const
325 Handle(XCAFDoc_GraphNode) Node;
326 Handle(TDataStd_Name) aName;
328 if (L.FindAttribute(XCAFDoc::LayerRefGUID(), Node) && (Node->NbFathers() != 0 ) ) {
329 Standard_Integer i = 1;
330 for (; i <= Node->NbFathers(); i++) {
331 lab = Node->GetFather(i)->Label();
333 return Standard_True;
336 return Standard_False;
339 //=======================================================================
340 //function : GetLayers
342 //=======================================================================
344 Standard_Boolean XCAFDoc_LayerTool::GetLayers(const TDF_Label& L,
345 Handle(TColStd_HSequenceOfExtendedString)& aLayerS)
347 aLayerS = GetLayers(L);
348 return (aLayerS->Length() != 0);
351 //=======================================================================
352 //function : GetLayers
354 //=======================================================================
356 Standard_Boolean XCAFDoc_LayerTool::GetLayers(const TDF_Label& L,
357 TDF_LabelSequence& aLayerLS)
360 Handle(XCAFDoc_GraphNode) aGNode;
361 if ( L.FindAttribute( XCAFDoc::LayerRefGUID(), aGNode) ) {
362 for (Standard_Integer i = 1; i <= aGNode->NbFathers(); i++) {
363 aLayerLS.Append (aGNode->GetFather(i)->Label());
366 return aLayerLS.Length() > 0;
369 //=======================================================================
370 //function : GetLayers
372 //=======================================================================
374 Handle(TColStd_HSequenceOfExtendedString) XCAFDoc_LayerTool::GetLayers(const TDF_Label& L)
376 Handle(TColStd_HSequenceOfExtendedString) aLayerS = new TColStd_HSequenceOfExtendedString;
377 TDF_LabelSequence aLayerLS;
378 if ( GetLayers( L, aLayerLS ) ) {
379 for (Standard_Integer i = 1; i <= aLayerLS.Length(); ++i) {
380 const TDF_Label& aLab = aLayerLS(i);
381 Handle(TDataStd_Name) aName;
382 if ( aLab.FindAttribute( TDataStd_Name::GetID(), aName ) ) {
383 aLayerS->Append( aName->Get() );
390 //=======================================================================
391 //function : GetShapesOfLayer
393 //=======================================================================
395 void XCAFDoc_LayerTool::GetShapesOfLayer(const TDF_Label& layerL,
396 TDF_LabelSequence& ShLabels) const
399 Handle(XCAFDoc_GraphNode) aGNode;
400 if ( layerL.FindAttribute( XCAFDoc::LayerRefGUID(), aGNode) ) {
401 for (Standard_Integer i = 1; i <= aGNode->NbChildren(); i++) {
402 ShLabels.Append( aGNode->GetChild(i)->Label() );
408 //=======================================================================
409 //function : IsVisible
411 //=======================================================================
413 Standard_Boolean XCAFDoc_LayerTool::IsVisible (const TDF_Label& layerL) const
415 Handle(TDataStd_UAttribute) aUAttr;
416 return (!layerL.FindAttribute(XCAFDoc::InvisibleGUID(), aUAttr));
420 //=======================================================================
421 //function : SetVisibility
423 //=======================================================================
425 void XCAFDoc_LayerTool::SetVisibility (const TDF_Label& layerL,
426 const Standard_Boolean isvisible) const
428 Handle(TDataStd_UAttribute) aUAttr;
430 if (!layerL.FindAttribute(XCAFDoc::InvisibleGUID(), aUAttr)) {
431 aUAttr->Set( layerL, XCAFDoc::InvisibleGUID() );
434 else layerL.ForgetAttribute( XCAFDoc::InvisibleGUID() );
438 //=======================================================================
439 //function : SetLayer
441 //=======================================================================
443 Standard_Boolean XCAFDoc_LayerTool::SetLayer(const TopoDS_Shape& Sh,
444 const TDF_Label& LayerL,
445 const Standard_Boolean shapeInOneLayer)
448 // if (! myShapeTool->FindShape(Sh, aLab) ) return Standard_False;
449 // PTV 22.01.2003 set layer for shape with location if it is necessary
450 if (! myShapeTool->Search( Sh, aLab ) ) return Standard_False;
451 SetLayer(aLab, LayerL, shapeInOneLayer);
452 return Standard_True;
456 //=======================================================================
457 //function : SetLayer
459 //=======================================================================
461 Standard_Boolean XCAFDoc_LayerTool::SetLayer(const TopoDS_Shape& Sh,
462 const TCollection_ExtendedString& aLayer,
463 const Standard_Boolean shapeInOneLayer)
465 TDF_Label aLayerL = AddLayer(aLayer);
466 return SetLayer(Sh, aLayerL, shapeInOneLayer);
470 //=======================================================================
471 //function : UnSetLayers
473 //=======================================================================
475 Standard_Boolean XCAFDoc_LayerTool::UnSetLayers(const TopoDS_Shape& Sh)
478 if (! myShapeTool->FindShape(Sh, aLab) ) return Standard_False;
480 return Standard_True;
484 //=======================================================================
485 //function : UnSetOneLayer
487 //=======================================================================
489 Standard_Boolean XCAFDoc_LayerTool::UnSetOneLayer(const TopoDS_Shape& Sh,
490 const TCollection_ExtendedString& aLayer)
493 if (! myShapeTool->FindShape(Sh, aLab) ) return Standard_False;
494 return UnSetOneLayer(aLab, aLayer);
497 //=======================================================================
498 //function : UnSetOneLayer
500 //=======================================================================
502 Standard_Boolean XCAFDoc_LayerTool::UnSetOneLayer(const TopoDS_Shape& Sh,
503 const TDF_Label& aLayerL)
506 if (! myShapeTool->FindShape(Sh, aLab) ) return Standard_False;
507 return UnSetOneLayer(aLab, aLayerL);
510 //=======================================================================
513 //=======================================================================
515 Standard_Boolean XCAFDoc_LayerTool::IsSet(const TopoDS_Shape& Sh,
516 const TCollection_ExtendedString& aLayer)
519 if (! myShapeTool->FindShape(Sh, aLab) ) return Standard_False;
520 return IsSet(aLab, aLayer);
524 //=======================================================================
527 //=======================================================================
529 Standard_Boolean XCAFDoc_LayerTool::IsSet(const TopoDS_Shape& Sh,
530 const TDF_Label& aLayerL)
533 if (! myShapeTool->FindShape(Sh, aLab) ) return Standard_False;
534 return IsSet(aLab, aLayerL);
537 //=======================================================================
538 //function : GetLayers
540 //=======================================================================
542 Standard_Boolean XCAFDoc_LayerTool::GetLayers(const TopoDS_Shape& Sh,
543 Handle(TColStd_HSequenceOfExtendedString)& aLayerS)
546 if (! myShapeTool->FindShape(Sh, aLab) ) return Standard_False;
547 return GetLayers(aLab, aLayerS);
550 //=======================================================================
551 //function : GetLayers
553 //=======================================================================
555 Standard_Boolean XCAFDoc_LayerTool::GetLayers(const TopoDS_Shape& Sh,
556 TDF_LabelSequence& aLayerLS)
559 if (! myShapeTool->FindShape(Sh, aLab) ) return Standard_False;
560 return GetLayers(aLab, aLayerLS);
564 //=======================================================================
565 //function : GetLayers
567 //=======================================================================
569 Handle(TColStd_HSequenceOfExtendedString) XCAFDoc_LayerTool::GetLayers(const TopoDS_Shape& Sh)
571 Handle(TColStd_HSequenceOfExtendedString) aLayerS = new TColStd_HSequenceOfExtendedString;
573 if ( myShapeTool->FindShape(Sh, aLab) )
574 aLayerS = GetLayers(aLab);
579 //=======================================================================
582 //=======================================================================
584 const Standard_GUID& XCAFDoc_LayerTool::ID() const
590 //=======================================================================
593 //=======================================================================
595 void XCAFDoc_LayerTool::Restore(const Handle(TDF_Attribute)& /* with */)
600 //=======================================================================
601 //function : NewEmpty
603 //=======================================================================
605 Handle(TDF_Attribute) XCAFDoc_LayerTool::NewEmpty() const
607 return new XCAFDoc_LayerTool;
611 //=======================================================================
614 //=======================================================================
616 void XCAFDoc_LayerTool::Paste(const Handle(TDF_Attribute)& /* into */,
617 const Handle(TDF_RelocationTable)& /* RT */) const