0031466: Data Exchange - Cannot import layers from STeP file (7.4.0 regression)
[occt.git] / src / XCAFDoc / XCAFDoc_LayerTool.cxx
CommitLineData
b311480e 1// Created on: 2000-10-02
2// Created by: Pavel TELKOV
973c2be1 3// Copyright (c) 2000-2014 OPEN CASCADE SAS
b311480e 4//
973c2be1 5// This file is part of Open CASCADE Technology software library.
b311480e 6//
d5f74e42 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
973c2be1 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.
b311480e 12//
973c2be1 13// Alternatively, this file may be used under the terms of Open CASCADE
14// commercial license or contractual agreement.
7fd59977 15
bc73b006 16#include <XCAFDoc_LayerTool.hxx>
42cf5bc1 17
18#include <Standard_GUID.hxx>
19#include <Standard_Type.hxx>
20#include <TCollection_ExtendedString.hxx>
7fd59977 21#include <TDataStd_Name.hxx>
42cf5bc1 22#include <TDataStd_UAttribute.hxx>
23#include <TDF_Attribute.hxx>
7fd59977 24#include <TDF_ChildIDIterator.hxx>
25#include <TDF_ChildIterator.hxx>
42cf5bc1 26#include <TDF_Label.hxx>
27#include <TDF_RelocationTable.hxx>
28#include <TopoDS_Shape.hxx>
7fd59977 29#include <XCAFDoc.hxx>
42cf5bc1 30#include <XCAFDoc_DocumentTool.hxx>
31#include <XCAFDoc_GraphNode.hxx>
42cf5bc1 32#include <XCAFDoc_ShapeTool.hxx>
7fd59977 33
c99ad5d7 34IMPLEMENT_DERIVED_ATTRIBUTE_WITH_TYPE(XCAFDoc_LayerTool,TDataStd_GenericEmpty,"xcaf","LayerTool")
92efcf78 35
7fd59977 36//=======================================================================
37//function : Constructor
38//purpose :
39//=======================================================================
7fd59977 40XCAFDoc_LayerTool::XCAFDoc_LayerTool()
41{
42}
43
44
45//=======================================================================
46//function : Set
47//purpose :
48//=======================================================================
49
50Handle(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
67const 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
79TDF_Label XCAFDoc_LayerTool::BaseLabel() const
80{
81 return Label();
82}
83
84
85//=======================================================================
86//function : ShapeTool
87//purpose :
88//=======================================================================
89
90const 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
103Standard_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
115Standard_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
136Standard_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
149TDF_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
170TDF_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
188void 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
199void 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
215void 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
242void 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
256void 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
275Standard_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;
a28d5778
RL
280 return UnSetOneLayer (L, alab);
281}
282
283//=======================================================================
284//function : UnSetOneLayer
285//purpose :
286//=======================================================================
287
288Standard_Boolean XCAFDoc_LayerTool::UnSetOneLayer(const TDF_Label& L,
289 const TDF_Label& aLayerL) const
290{
7fd59977 291 Handle(XCAFDoc_GraphNode) FGNode, ChGNode;
292 if ( !L.FindAttribute (XCAFDoc::LayerRefGUID(), ChGNode) ) return Standard_False;
a28d5778 293 if ( !aLayerL.FindAttribute (XCAFDoc::LayerRefGUID(), FGNode) ) return Standard_False;
7fd59977 294 ChGNode->UnSetFather(FGNode);
295 return Standard_True;
296}
a28d5778 297
7fd59977 298//=======================================================================
299//function : IsSet
300//purpose :
301//=======================================================================
302
303Standard_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
a28d5778
RL
321//=======================================================================
322//function : IsSet
323//purpose :
324//=======================================================================
325
326Standard_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
7fd59977 343//=======================================================================
344//function : GetLayers
345//purpose :
346//=======================================================================
347
348Standard_Boolean XCAFDoc_LayerTool::GetLayers(const TDF_Label& L,
349 Handle(TColStd_HSequenceOfExtendedString)& aLayerS)
350{
351 aLayerS = GetLayers(L);
a28d5778 352 return (aLayerS->Length() != 0);
7fd59977 353}
354
7fd59977 355//=======================================================================
356//function : GetLayers
357//purpose :
358//=======================================================================
359
a28d5778
RL
360Standard_Boolean XCAFDoc_LayerTool::GetLayers(const TDF_Label& L,
361 TDF_LabelSequence& aLayerLS)
7fd59977 362{
a28d5778 363 aLayerLS.Clear();
7fd59977 364 Handle(XCAFDoc_GraphNode) aGNode;
365 if ( L.FindAttribute( XCAFDoc::LayerRefGUID(), aGNode) ) {
a28d5778
RL
366 for (Standard_Integer i = 1; i <= aGNode->NbFathers(); i++) {
367 aLayerLS.Append (aGNode->GetFather(i)->Label());
7fd59977 368 }
a28d5778
RL
369 }
370 return aLayerLS.Length() > 0;
371}
372
373//=======================================================================
374//function : GetLayers
375//purpose :
376//=======================================================================
377
378Handle(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() );
7fd59977 388 }
389 }
390 }
391 return aLayerS;
392}
393
394//=======================================================================
395//function : GetShapesOfLayer
396//purpose :
397//=======================================================================
398
399void 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
417Standard_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
429void 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)) {
ad67e367 435 TDataStd_UAttribute::Set( layerL, XCAFDoc::InvisibleGUID() );
7fd59977 436 }
437 }
438 else layerL.ForgetAttribute( XCAFDoc::InvisibleGUID() );
439}
440
441
442//=======================================================================
443//function : SetLayer
444//purpose :
445//=======================================================================
446
447Standard_Boolean XCAFDoc_LayerTool::SetLayer(const TopoDS_Shape& Sh,
448 const TDF_Label& LayerL,
449 const Standard_Boolean shapeInOneLayer)
450{
451 TDF_Label aLab;
7fd59977 452 // PTV 22.01.2003 set layer for shape with location if it is necessary
453 if (! myShapeTool->Search( Sh, aLab ) ) return Standard_False;
454 SetLayer(aLab, LayerL, shapeInOneLayer);
455 return Standard_True;
456}
457
458
459//=======================================================================
460//function : SetLayer
461//purpose :
462//=======================================================================
463
464Standard_Boolean XCAFDoc_LayerTool::SetLayer(const TopoDS_Shape& Sh,
465 const TCollection_ExtendedString& aLayer,
466 const Standard_Boolean shapeInOneLayer)
467{
468 TDF_Label aLayerL = AddLayer(aLayer);
469 return SetLayer(Sh, aLayerL, shapeInOneLayer);
470}
471
472
473//=======================================================================
474//function : UnSetLayers
475//purpose :
476//=======================================================================
477
478Standard_Boolean XCAFDoc_LayerTool::UnSetLayers(const TopoDS_Shape& Sh)
479{
480 TDF_Label aLab;
b95caec4 481 if (!myShapeTool->Search(Sh, aLab) )
482 return Standard_False;
7fd59977 483 UnSetLayers(aLab);
484 return Standard_True;
485}
486
487
488//=======================================================================
489//function : UnSetOneLayer
490//purpose :
491//=======================================================================
492
493Standard_Boolean XCAFDoc_LayerTool::UnSetOneLayer(const TopoDS_Shape& Sh,
494 const TCollection_ExtendedString& aLayer)
495{
496 TDF_Label aLab;
b95caec4 497 if (!myShapeTool->Search(Sh, aLab) )
498 return Standard_False;
7fd59977 499 return UnSetOneLayer(aLab, aLayer);
500}
501
a28d5778
RL
502//=======================================================================
503//function : UnSetOneLayer
504//purpose :
505//=======================================================================
506
507Standard_Boolean XCAFDoc_LayerTool::UnSetOneLayer(const TopoDS_Shape& Sh,
508 const TDF_Label& aLayerL)
509{
510 TDF_Label aLab;
b95caec4 511 if (!myShapeTool->Search(Sh, aLab) )
512 return Standard_False;
a28d5778
RL
513 return UnSetOneLayer(aLab, aLayerL);
514}
515
7fd59977 516//=======================================================================
517//function : IsSet
518//purpose :
519//=======================================================================
520
521Standard_Boolean XCAFDoc_LayerTool::IsSet(const TopoDS_Shape& Sh,
522 const TCollection_ExtendedString& aLayer)
523{
524 TDF_Label aLab;
b95caec4 525 if (! myShapeTool->Search(Sh, aLab) )
526 return Standard_False;
7fd59977 527 return IsSet(aLab, aLayer);
528}
529
530
a28d5778
RL
531//=======================================================================
532//function : IsSet
533//purpose :
534//=======================================================================
535
536Standard_Boolean XCAFDoc_LayerTool::IsSet(const TopoDS_Shape& Sh,
537 const TDF_Label& aLayerL)
538{
539 TDF_Label aLab;
b95caec4 540 if (!myShapeTool->Search(Sh, aLab) )
541 return Standard_False;
a28d5778
RL
542 return IsSet(aLab, aLayerL);
543}
544
7fd59977 545//=======================================================================
546//function : GetLayers
547//purpose :
548//=======================================================================
549
550Standard_Boolean XCAFDoc_LayerTool::GetLayers(const TopoDS_Shape& Sh,
551 Handle(TColStd_HSequenceOfExtendedString)& aLayerS)
552{
553 TDF_Label aLab;
b95caec4 554 if (!myShapeTool->Search(Sh, aLab))
555 return Standard_False;
7fd59977 556 return GetLayers(aLab, aLayerS);
557}
558
a28d5778
RL
559//=======================================================================
560//function : GetLayers
561//purpose :
562//=======================================================================
563
564Standard_Boolean XCAFDoc_LayerTool::GetLayers(const TopoDS_Shape& Sh,
565 TDF_LabelSequence& aLayerLS)
566{
567 TDF_Label aLab;
b95caec4 568 if (!myShapeTool->Search(Sh, aLab))
569 return Standard_False;
a28d5778
RL
570 return GetLayers(aLab, aLayerLS);
571}
572
7fd59977 573
574//=======================================================================
575//function : GetLayers
576//purpose :
577//=======================================================================
578
579Handle(TColStd_HSequenceOfExtendedString) XCAFDoc_LayerTool::GetLayers(const TopoDS_Shape& Sh)
580{
581 Handle(TColStd_HSequenceOfExtendedString) aLayerS = new TColStd_HSequenceOfExtendedString;
582 TDF_Label aLab;
b95caec4 583 if (myShapeTool->Search(Sh, aLab))
7fd59977 584 aLayerS = GetLayers(aLab);
585 return aLayerS;
586}
587
588
589//=======================================================================
590//function : ID
591//purpose :
592//=======================================================================
593
594const Standard_GUID& XCAFDoc_LayerTool::ID() const
595{
596 return GetID();
597}
598
bc73b006 599//=======================================================================
600//function : DumpJson
601//purpose :
602//=======================================================================
603void XCAFDoc_LayerTool::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const
604{
605 OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
606
607 OCCT_DUMP_BASE_CLASS (theOStream, theDepth, TDF_Attribute)
608
609 OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, myShapeTool.get())
c99ad5d7 610}