0029902: Data Exchange, XCAF - provide extended Material definition for visualization...
[occt.git] / src / XCAFDoc / XCAFDoc_ColorTool.cxx
1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14
15 #include <Quantity_Color.hxx>
16 #include <Standard_GUID.hxx>
17 #include <Standard_Type.hxx>
18 #include <TDataStd_Name.hxx>
19 #include <TDataStd_TreeNode.hxx>
20 #include <TDataStd_UAttribute.hxx>
21 #include <TDF_Attribute.hxx>
22 #include <TDF_ChildIDIterator.hxx>
23 #include <TDF_Label.hxx>
24 #include <TDF_RelocationTable.hxx>
25 #include <TNaming_NamedShape.hxx>
26 #include <TopoDS_Shape.hxx>
27 #include <XCAFDoc.hxx>
28 #include <XCAFDoc_Color.hxx>
29 #include <XCAFDoc_ColorTool.hxx>
30 #include <XCAFDoc_DocumentTool.hxx>
31 #include <XCAFDoc_GraphNode.hxx>
32 #include <XCAFDoc_ShapeTool.hxx>
33
34 IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_ColorTool,TDF_Attribute)
35
36 static Standard_Boolean XCAFDoc_ColorTool_AutoNaming = Standard_True;
37
38 //=======================================================================
39 //function : SetAutoNaming
40 //purpose  :
41 //=======================================================================
42 void XCAFDoc_ColorTool::SetAutoNaming (Standard_Boolean theIsAutoNaming)
43 {
44   XCAFDoc_ColorTool_AutoNaming = theIsAutoNaming;
45 }
46
47 //=======================================================================
48 //function : AutoNaming
49 //purpose  :
50 //=======================================================================
51 Standard_Boolean XCAFDoc_ColorTool::AutoNaming()
52 {
53   return XCAFDoc_ColorTool_AutoNaming;
54 }
55
56 //=======================================================================
57 //function : BaseLabel
58 //purpose  : 
59 //=======================================================================
60
61 TDF_Label XCAFDoc_ColorTool::BaseLabel() const
62 {
63   return Label();
64 }
65 //=======================================================================
66 //function : ShapeTool
67 //purpose  : 
68 //=======================================================================
69
70 const Handle(XCAFDoc_ShapeTool)& XCAFDoc_ColorTool::ShapeTool() 
71 {
72   if (myShapeTool.IsNull())
73     myShapeTool = XCAFDoc_DocumentTool::ShapeTool(Label());
74   return myShapeTool;
75 }
76
77
78 //=======================================================================
79 //function : IsColor
80 //purpose  : 
81 //=======================================================================
82
83 Standard_Boolean XCAFDoc_ColorTool::IsColor (const TDF_Label& lab) const
84 {
85   Quantity_Color C;
86   return GetColor ( lab, C );
87 }
88
89 //=======================================================================
90 //function : GetColor
91 //purpose  : 
92 //=======================================================================
93
94 Standard_Boolean XCAFDoc_ColorTool::GetColor (const TDF_Label& lab,
95                                                Quantity_Color& col) const
96 {
97   Quantity_ColorRGBA aCol;
98   Standard_Boolean isDone = GetColor(lab, aCol);
99   if (isDone)
100     col = aCol.GetRGB();
101   return isDone;
102 }
103
104 //=======================================================================
105 //function : GetColor
106 //purpose  : 
107 //=======================================================================
108
109 Standard_Boolean XCAFDoc_ColorTool::GetColor(const TDF_Label& lab,
110   Quantity_ColorRGBA& col) const
111 {
112   if (lab.Father() != Label()) return Standard_False;
113
114   Handle(XCAFDoc_Color) ColorAttribute;
115   if (!lab.FindAttribute(XCAFDoc_Color::GetID(), ColorAttribute))
116     return Standard_False;
117
118   col = ColorAttribute->GetColorRGBA();
119
120   return Standard_True;
121 }
122
123 //=======================================================================
124 //function : FindColor
125 //purpose  : 
126 //=======================================================================
127
128 Standard_Boolean XCAFDoc_ColorTool::FindColor (const Quantity_Color& col, TDF_Label& lab) const
129 {
130   Quantity_ColorRGBA aCol;
131   aCol.SetRGB(col);
132   return FindColor(aCol, lab);
133 }
134
135 //=======================================================================
136 //function : FindColor
137 //purpose  : 
138 //=======================================================================
139
140 Standard_Boolean XCAFDoc_ColorTool::FindColor(const Quantity_ColorRGBA& col, TDF_Label& lab) const
141 {
142   TDF_ChildIDIterator it(Label(), XCAFDoc_Color::GetID());
143   for (; it.More(); it.Next()) {
144     TDF_Label aLabel = it.Value()->Label();
145     Quantity_ColorRGBA C;
146     if (!GetColor(aLabel, C)) continue;
147     if (C.IsEqual(col)) {
148       lab = aLabel;
149       return Standard_True;
150     }
151   }
152   return Standard_False;
153 }
154
155 //=======================================================================
156 //function : FindColor
157 //purpose  : 
158 //=======================================================================
159
160 TDF_Label XCAFDoc_ColorTool::FindColor (const Quantity_ColorRGBA& col) const
161 {
162   TDF_Label L;
163   FindColor ( col, L );
164   return L;
165 }
166
167 //=======================================================================
168 //function : FindColor
169 //purpose  : 
170 //=======================================================================
171
172 TDF_Label XCAFDoc_ColorTool::FindColor(const Quantity_Color& col) const
173 {
174   TDF_Label L;
175   FindColor(col, L);
176   return L;
177 }
178
179 //=======================================================================
180 //function : AddColor
181 //purpose  : 
182 //=======================================================================
183
184 TDF_Label XCAFDoc_ColorTool::AddColor (const Quantity_Color& col) const
185 {
186   Quantity_ColorRGBA aCol;
187   aCol.SetRGB(col);
188   return AddColor(aCol);
189 }
190
191 //=======================================================================
192 //function : AddColor
193 //purpose  : 
194 //=======================================================================
195
196 TDF_Label XCAFDoc_ColorTool::AddColor (const Quantity_ColorRGBA& theColor) const
197 {
198   TDF_Label aLab;
199   if (FindColor (theColor, aLab))
200   {
201     return aLab;
202   }
203
204   // create a new color entry
205   TDF_TagSource aTag;
206   aLab = aTag.NewChild (Label());
207   XCAFDoc_Color::Set (aLab, theColor);
208
209   if (XCAFDoc_ColorTool_AutoNaming)
210   {
211     // set name according to color value
212     const NCollection_Vec4<float>& anRgbaF = theColor;
213     const NCollection_Vec4<unsigned int> anRgba (anRgbaF * 255.0f);
214     char aColorHex[32];
215     Sprintf (aColorHex, "%02X%02X%02X%02X", anRgba.r(), anRgba.g(), anRgba.b(), anRgba.a());
216     const TCollection_AsciiString aName = TCollection_AsciiString (Quantity_Color::StringName (theColor.GetRGB().Name()))
217                                         + " (#" + aColorHex + ")";
218     TDataStd_Name::Set (aLab, aName);
219   }
220
221   return aLab;
222 }
223
224 //=======================================================================
225 //function : RemoveColor
226 //purpose  : 
227 //=======================================================================
228
229 void XCAFDoc_ColorTool::RemoveColor (const TDF_Label& lab) const
230 {
231   lab.ForgetAllAttributes (Standard_True);
232 }
233
234 //=======================================================================
235 //function : GetColors
236 //purpose  : 
237 //=======================================================================
238
239 void XCAFDoc_ColorTool::GetColors (TDF_LabelSequence& Labels) const
240 {
241   Labels.Clear();
242
243   TDF_ChildIDIterator ChildIDIterator(Label(),XCAFDoc_Color::GetID()); 
244   for (; ChildIDIterator.More(); ChildIDIterator.Next()) {
245     TDF_Label L = ChildIDIterator.Value()->Label();
246     if ( IsColor ( L ) ) Labels.Append ( L );
247   }
248 }
249
250 //=======================================================================
251 //function : SetColor
252 //purpose  : 
253 //=======================================================================
254
255 void XCAFDoc_ColorTool::SetColor (const TDF_Label& L,
256                                const TDF_Label& colorL,
257                                const XCAFDoc_ColorType type) const
258 {
259   // set reference
260   Handle(TDataStd_TreeNode) refNode, mainNode;
261   mainNode = TDataStd_TreeNode::Set ( colorL, XCAFDoc::ColorRefGUID(type) );
262   refNode  = TDataStd_TreeNode::Set ( L,      XCAFDoc::ColorRefGUID(type) );
263   refNode->Remove(); // abv: fix against bug in TreeNode::Append()
264   mainNode->Prepend(refNode);
265 }
266
267 //=======================================================================
268 //function : SetColor
269 //purpose  : 
270 //=======================================================================
271
272 void XCAFDoc_ColorTool::SetColor (const TDF_Label& L,
273                                const Quantity_Color& Color,
274                                const XCAFDoc_ColorType type) const
275 {
276   TDF_Label colorL = AddColor ( Color );
277   SetColor ( L, colorL, type );
278 }
279
280 //=======================================================================
281 //function : SetColor
282 //purpose  : 
283 //=======================================================================
284
285 void XCAFDoc_ColorTool::SetColor(const TDF_Label& L,
286   const Quantity_ColorRGBA& Color,
287   const XCAFDoc_ColorType type) const
288 {
289   TDF_Label colorL = AddColor(Color);
290   SetColor(L, colorL, type);
291 }
292
293 //=======================================================================
294 //function : UnSetColor
295 //purpose  : 
296 //=======================================================================
297
298 void XCAFDoc_ColorTool::UnSetColor (const TDF_Label& L, const XCAFDoc_ColorType type) const
299 {
300   L.ForgetAttribute ( XCAFDoc::ColorRefGUID(type) );
301 }
302
303 //=======================================================================
304 //function : IsSet
305 //purpose  : 
306 //=======================================================================
307
308 Standard_Boolean XCAFDoc_ColorTool::IsSet (const TDF_Label& L, const XCAFDoc_ColorType type) const
309 {
310   Handle(TDataStd_TreeNode) Node;
311   return L.FindAttribute ( XCAFDoc::ColorRefGUID(type), Node) && Node->HasFather();
312 }
313
314 //=======================================================================
315 //function : GetColor
316 //purpose  : 
317 //=======================================================================
318
319 Standard_Boolean XCAFDoc_ColorTool::GetColor (const TDF_Label& L,
320                                            const XCAFDoc_ColorType type,
321                                            TDF_Label& colorL) 
322 {
323   Handle(TDataStd_TreeNode) Node;
324   if ( ! L.FindAttribute ( XCAFDoc::ColorRefGUID(type), Node) ||
325        ! Node->HasFather() ) return Standard_False;
326   colorL = Node->Father()->Label();
327   return Standard_True;
328 }
329
330 //=======================================================================
331 //function : GetColor
332 //purpose  : 
333 //=======================================================================
334
335 Standard_Boolean XCAFDoc_ColorTool::GetColor (const TDF_Label& L,
336                                            const XCAFDoc_ColorType type,
337                                            Quantity_Color& color) 
338 {
339   TDF_Label colorL;
340   if ( ! GetColor ( L, type, colorL ) ) return Standard_False;
341   return GetColor ( colorL, color );
342 }
343
344 //=======================================================================
345 //function : GetColor
346 //purpose  : 
347 //=======================================================================
348
349 Standard_Boolean XCAFDoc_ColorTool::GetColor(const TDF_Label& L,
350   const XCAFDoc_ColorType type,
351   Quantity_ColorRGBA& color)
352 {
353   TDF_Label colorL;
354   if (!GetColor(L, type, colorL)) return Standard_False;
355   return GetColor(colorL, color);
356 }
357
358 //=======================================================================
359 //function : SetColor
360 //purpose  : 
361 //=======================================================================
362
363 Standard_Boolean XCAFDoc_ColorTool::SetColor (const TopoDS_Shape& S,
364                                            const TDF_Label& colorL,
365                                            const XCAFDoc_ColorType type) 
366 {
367   TDF_Label L;
368   if ( ! ShapeTool()->Search ( S, L ) ) return Standard_False;
369   SetColor ( L, colorL, type );
370   return Standard_True;
371 }
372
373 //=======================================================================
374 //function : SetColor
375 //purpose  : 
376 //=======================================================================
377
378 Standard_Boolean XCAFDoc_ColorTool::SetColor (const TopoDS_Shape& S,
379                                            const Quantity_Color& Color,
380                                            const XCAFDoc_ColorType type) 
381 {
382   TDF_Label colorL = AddColor ( Color );
383   return SetColor ( S, colorL, type );
384 }
385
386 //=======================================================================
387 //function : SetColor
388 //purpose  : 
389 //=======================================================================
390
391 Standard_Boolean XCAFDoc_ColorTool::SetColor(const TopoDS_Shape& S,
392   const Quantity_ColorRGBA& Color,
393   const XCAFDoc_ColorType type)
394 {
395   TDF_Label colorL = AddColor(Color);
396   return SetColor(S, colorL, type);
397 }
398
399 //=======================================================================
400 //function : UnSetColor
401 //purpose  : 
402 //=======================================================================
403
404 Standard_Boolean XCAFDoc_ColorTool::UnSetColor (const TopoDS_Shape& S,
405                                              const XCAFDoc_ColorType type) 
406 {
407   TDF_Label L;
408   if ( ! ShapeTool()->Search ( S, L ) ) return Standard_False;
409   UnSetColor ( L, type );
410   return Standard_True;
411 }
412
413 //=======================================================================
414 //function : IsSet
415 //purpose  : 
416 //=======================================================================
417
418 Standard_Boolean XCAFDoc_ColorTool::IsSet (const TopoDS_Shape& S,
419                                         const XCAFDoc_ColorType type) 
420 {
421   TDF_Label L;
422   if ( ! ShapeTool()->Search ( S, L ) ) return Standard_False;
423   return IsSet ( L, type );
424 }
425
426 //=======================================================================
427 //function : GetColor
428 //purpose  : 
429 //=======================================================================
430
431 Standard_Boolean XCAFDoc_ColorTool::GetColor (const TopoDS_Shape& S, 
432                                            const XCAFDoc_ColorType type,
433                                            TDF_Label& colorL) 
434 {
435   TDF_Label L;
436   if ( ! ShapeTool()->Search ( S, L ) ) return Standard_False;
437   return GetColor ( L, type, colorL );
438 }
439
440 //=======================================================================
441 //function : GetColor
442 //purpose  : 
443 //=======================================================================
444
445 Standard_Boolean XCAFDoc_ColorTool::GetColor (const TopoDS_Shape& S,
446                                            const XCAFDoc_ColorType type,
447                                            Quantity_Color& color) 
448 {
449   TDF_Label colorL;
450   if ( ! GetColor ( S, type, colorL ) ) return Standard_False;
451   return GetColor ( colorL, color );
452 }
453
454 //=======================================================================
455 //function : GetColor
456 //purpose  : 
457 //=======================================================================
458
459 Standard_Boolean XCAFDoc_ColorTool::GetColor(const TopoDS_Shape& S,
460                                              const XCAFDoc_ColorType type,
461                                              Quantity_ColorRGBA& color)
462 {
463   TDF_Label colorL;
464   if (!GetColor(S, type, colorL)) return Standard_False;
465   return GetColor(colorL, color);
466 }
467
468 //=======================================================================
469 //function : GetID
470 //purpose  : 
471 //=======================================================================
472
473 const Standard_GUID& XCAFDoc_ColorTool::GetID() 
474 {
475   static Standard_GUID ColorTblID ("efd212ed-6dfd-11d4-b9c8-0060b0ee281b");
476   return ColorTblID; 
477 }
478
479 //=======================================================================
480 //function : Set
481 //purpose  : 
482 //=======================================================================
483
484 Handle(XCAFDoc_ColorTool) XCAFDoc_ColorTool::Set(const TDF_Label& L) 
485 {
486   Handle(XCAFDoc_ColorTool) A;
487   if (!L.FindAttribute (XCAFDoc_ColorTool::GetID(), A)) {
488     A = new XCAFDoc_ColorTool ();
489     L.AddAttribute(A);
490     A->myShapeTool = XCAFDoc_DocumentTool::ShapeTool(L);
491   }
492   return A;
493 }
494
495 //=======================================================================
496 //function : ID
497 //purpose  : 
498 //=======================================================================
499
500 const Standard_GUID& XCAFDoc_ColorTool::ID() const
501 {
502   return GetID();
503 }
504
505 //=======================================================================
506 //function : Restore
507 //purpose  : 
508 //=======================================================================
509
510 void XCAFDoc_ColorTool::Restore(const Handle(TDF_Attribute)& /*with*/) 
511 {
512 }
513
514 //=======================================================================
515 //function : NewEmpty
516 //purpose  : 
517 //=======================================================================
518
519 Handle(TDF_Attribute) XCAFDoc_ColorTool::NewEmpty() const
520 {
521   return new XCAFDoc_ColorTool;
522 }
523
524 //=======================================================================
525 //function : Paste
526 //purpose  : 
527 //=======================================================================
528
529 void XCAFDoc_ColorTool::Paste (const Handle(TDF_Attribute)& /*into*/,
530                                const Handle(TDF_RelocationTable)& /*RT*/) const
531 {
532 }
533
534 /**/
535
536 //=======================================================================
537 //function : XCAFDoc_ColorTool
538 //purpose  : 
539 //=======================================================================
540
541 XCAFDoc_ColorTool::XCAFDoc_ColorTool()
542 {
543 }
544
545 // PTV 23.01.2003 add visibility flag for objects (CAX-IF TRJ11)
546 //=======================================================================
547 //function : IsVisible
548 //purpose  : 
549 //=======================================================================
550
551 Standard_Boolean XCAFDoc_ColorTool::IsVisible (const TDF_Label& L) const
552 {
553   Handle(TDataStd_UAttribute) aUAttr;
554   return (!L.FindAttribute(XCAFDoc::InvisibleGUID(), aUAttr));
555 }
556
557 //=======================================================================
558 //function : SetVisibility
559 //purpose  : 
560 //=======================================================================
561
562 void XCAFDoc_ColorTool::SetVisibility (const TDF_Label& L,
563                                        const Standard_Boolean isvisible)
564 {
565   Handle(TDataStd_UAttribute) aUAttr;
566   if (! isvisible ) {
567     Handle(XCAFDoc_GraphNode) aSHUO;
568     if (ShapeTool()->IsShape(L) || ShapeTool()->GetSHUO( L, aSHUO ) )
569       if (!L.FindAttribute(XCAFDoc::InvisibleGUID(), aUAttr))
570         TDataStd_UAttribute::Set( L, XCAFDoc::InvisibleGUID() );
571   }
572   else L.ForgetAttribute( XCAFDoc::InvisibleGUID() );
573 }
574
575 //=======================================================================
576 //function : IsColorByLayer
577 //purpose  : 
578 //=======================================================================
579
580 Standard_Boolean XCAFDoc_ColorTool::IsColorByLayer (const TDF_Label& L) const
581 {
582   Handle(TDataStd_UAttribute) aUAttr;
583   return L.FindAttribute(XCAFDoc::ColorByLayerGUID(), aUAttr);
584 }
585
586 //=======================================================================
587 //function : SetColorByLayer
588 //purpose  : 
589 //=======================================================================
590
591 void XCAFDoc_ColorTool::SetColorByLayer (const TDF_Label& L,
592                                          const Standard_Boolean isColorByLayer)
593 {
594   Handle(TDataStd_UAttribute) aUAttr;
595   if ( isColorByLayer ) {
596     Handle(XCAFDoc_GraphNode) aSHUO;
597     if (ShapeTool()->IsShape(L) || ShapeTool()->GetSHUO( L, aSHUO ) )
598       if (!L.FindAttribute(XCAFDoc::ColorByLayerGUID(), aUAttr))
599         TDataStd_UAttribute::Set( L, XCAFDoc::ColorByLayerGUID() );
600   }
601   else L.ForgetAttribute( XCAFDoc::ColorByLayerGUID() );
602 }
603
604 //=======================================================================
605 //function : SetInstanceColor
606 //purpose  : 
607 //=======================================================================
608
609 Standard_Boolean XCAFDoc_ColorTool::SetInstanceColor (const TopoDS_Shape& theShape,
610                                                       const XCAFDoc_ColorType type,
611                                                       const Quantity_Color& color,
612                                                       const Standard_Boolean IsCreateSHUO)
613 {
614   Quantity_ColorRGBA aCol;
615   aCol.SetRGB(color);
616   return SetInstanceColor(theShape, type, aCol, IsCreateSHUO);
617 }
618
619 //=======================================================================
620 //function : SetInstanceColor
621 //purpose  : 
622 //=======================================================================
623
624 Standard_Boolean XCAFDoc_ColorTool::SetInstanceColor(const TopoDS_Shape& theShape,
625                                                      const XCAFDoc_ColorType type,
626                                                      const Quantity_ColorRGBA& color,
627                                                      const Standard_Boolean IsCreateSHUO)
628 {
629   // find shuo label structure 
630   TDF_LabelSequence aLabels;
631   if (!ShapeTool()->FindComponent(theShape, aLabels))
632     return Standard_False;
633   Handle(XCAFDoc_GraphNode) aSHUO;
634   // set the SHUO structure for this component if it is not exist
635   if (!ShapeTool()->FindSHUO(aLabels, aSHUO)) {
636     if (aLabels.Length() == 1) {
637       // set color directly for component as NAUO
638       SetColor(aLabels.Value(1), color, type);
639       return Standard_True;
640     }
641     else if (!IsCreateSHUO || !ShapeTool()->SetSHUO(aLabels, aSHUO)) {
642       return Standard_False;
643     }
644   }
645   TDF_Label aSHUOLabel = aSHUO->Label();
646   SetColor(aSHUOLabel, color, type);
647   return Standard_True;
648 }
649
650
651 //=======================================================================
652 //function : GetInstanceColor
653 //purpose  : 
654 //=======================================================================
655
656 Standard_Boolean XCAFDoc_ColorTool::GetInstanceColor (const TopoDS_Shape& theShape,
657                                                       const XCAFDoc_ColorType type,
658                                                       Quantity_Color& color)
659 {
660   Quantity_ColorRGBA aCol;
661   Standard_Boolean isDone = GetInstanceColor(theShape, type, aCol);
662   if (isDone)
663     color = aCol.GetRGB();
664   return isDone;
665 }
666
667 //=======================================================================
668 //function : GetInstanceColor
669 //purpose  : 
670 //=======================================================================
671
672 Standard_Boolean XCAFDoc_ColorTool::GetInstanceColor(const TopoDS_Shape& theShape,
673   const XCAFDoc_ColorType type,
674   Quantity_ColorRGBA& color)
675 {
676   // find shuo label structure 
677   TDF_LabelSequence aLabels;
678   if (!ShapeTool()->FindComponent(theShape, aLabels))
679     return Standard_False;
680   Handle(XCAFDoc_GraphNode) aSHUO;
681   // get shuo from document by label structure
682   TDF_Label aCompLab = aLabels.Value(aLabels.Length());
683   while (aLabels.Length() > 1) {
684     if (!ShapeTool()->FindSHUO(aLabels, aSHUO)) {
685       // try to find other shuo 
686       aLabels.Remove(aLabels.Length());
687       continue;
688     }
689     else {
690       TDF_Label aSHUOLabel = aSHUO->Label();
691       if (GetColor(aSHUOLabel, type, color))
692         return Standard_True;
693       else
694         // try to find other shuo 
695         aLabels.Remove(aLabels.Length());
696     }
697   }
698   // attempt to get color exactly of component
699   if (GetColor(aCompLab, type, color))
700     return Standard_True;
701
702   // attempt to get color of solid
703   TopLoc_Location aLoc;
704   TopoDS_Shape S0 = theShape;
705   S0.Location(aLoc);
706   TDF_Label aRefLab = ShapeTool()->FindShape(S0);
707   if (!aRefLab.IsNull())
708     return GetColor(aRefLab, type, color);
709   // no color assigned
710   return Standard_False;
711 }
712
713 //=======================================================================
714 //function : IsInstanceVisible
715 //purpose  : 
716 //=======================================================================
717
718 Standard_Boolean XCAFDoc_ColorTool::IsInstanceVisible (const TopoDS_Shape& theShape)
719 {
720   // check visibility status of top-level solid, cause it is have highest priority
721   TopLoc_Location NullLoc;
722   TopoDS_Shape S0 = theShape;
723   S0.Location( NullLoc );
724   TDF_Label aRefL = ShapeTool()->FindShape( S0 );
725   if (!aRefL.IsNull() && !IsVisible(aRefL))
726     return Standard_False;
727   // find shuo label structure 
728   TDF_LabelSequence aLabels;
729   if ( !ShapeTool()->FindComponent( theShape, aLabels ) )
730     return Standard_True;
731   TDF_Label aCompLab = aLabels.Value(aLabels.Length());
732   // visibility status of component withouts SHUO.
733   if (!IsVisible( aCompLab ))
734     return Standard_False;
735   // check by SHUO structure
736   TDF_LabelSequence aCurLabels;
737   aCurLabels.Append(aCompLab);
738   Standard_Integer i = aLabels.Length() - 1;
739   //   while (aCurLabels.Length() < aLabels.Length()) {
740   while (i >= 1) {
741     aCurLabels.Prepend( aLabels.Value(i--) );
742     // get shuo from document by label structure
743     Handle(XCAFDoc_GraphNode) aSHUO;
744     if ( !ShapeTool()->FindSHUO( aCurLabels, aSHUO ) )
745       continue;
746     if ( !IsVisible(aSHUO->Label()) )
747       return Standard_False;
748   }
749   return Standard_True; //visible, cause cannot find invisibility status
750 }
751
752
753 //=======================================================================
754 //function : ReverseTreeNodes
755 //purpose  : auxilary
756 //=======================================================================
757 static void ReverseTreeNodes(Handle(TDataStd_TreeNode)& mainNode)
758 {
759   if(mainNode->HasFirst()) {
760     Handle(TDataStd_TreeNode) tmpNode;
761     Handle(TDataStd_TreeNode) pNode = mainNode->First();
762     Handle(TDataStd_TreeNode) nNode = pNode->Next();
763     while(!nNode.IsNull()) {
764       tmpNode = pNode->Previous();
765       pNode->SetPrevious(nNode);
766       pNode->SetNext(tmpNode);
767       pNode = nNode;
768       nNode = pNode->Next();
769     }
770     tmpNode = pNode->Previous();
771     pNode->SetPrevious(nNode);
772     pNode->SetNext(tmpNode);
773     mainNode->SetFirst(pNode);
774   }
775 }
776
777
778 //=======================================================================
779 //function : ReverseChainsOfTreeNodes
780 //purpose  : 
781 //=======================================================================
782
783 Standard_Boolean XCAFDoc_ColorTool::ReverseChainsOfTreeNodes()
784 {
785   TDF_ChildIDIterator it(Label(),XCAFDoc_Color::GetID());
786   for (; it.More(); it.Next()) {
787     TDF_Label aLabel = it.Value()->Label();
788     Handle(TDataStd_TreeNode) mainNode;
789     if(aLabel.FindAttribute(XCAFDoc::ColorRefGUID(XCAFDoc_ColorSurf),mainNode)) {
790       ReverseTreeNodes(mainNode);
791     }
792     if(aLabel.FindAttribute(XCAFDoc::ColorRefGUID(XCAFDoc_ColorCurv),mainNode)) {
793       ReverseTreeNodes(mainNode);
794     }
795     if(aLabel.FindAttribute(XCAFDoc::ColorRefGUID(XCAFDoc_ColorGen),mainNode)) {
796       ReverseTreeNodes(mainNode);
797     }
798   }
799   return Standard_True;
800 }