0025180: Visualization - Homogeneous transformation API in TKV3d
[occt.git] / src / Graphic3d / Graphic3d_Structure.cxx
1 // Created by: NW,JPB,CAL
2 // Copyright (c) 1991-1999 Matra Datavision
3 // Copyright (c) 1999-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
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.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #include <Graphic3d_Structure.hxx>
17
18 #include <Bnd_Box.hxx>
19 #include <gp_Pnt.hxx>
20 #include <Graphic3d_DataStructureManager.hxx>
21 #include <Graphic3d_GraphicDriver.hxx>
22 #include <Graphic3d_Group.hxx>
23 #include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
24 #include <Graphic3d_MapOfStructure.hxx>
25 #include <Graphic3d_PriorityDefinitionError.hxx>
26 #include <Graphic3d_StructureDefinitionError.hxx>
27 #include <Graphic3d_StructureManager.hxx>
28 #include <Graphic3d_TransformError.hxx>
29 #include <Graphic3d_Vector.hxx>
30 #include <Quantity_Color.hxx>
31 #include <Standard_Type.hxx>
32
33 #include "Graphic3d_Structure.pxx"
34
35 #include <stdio.h>
36
37 IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_Structure,MMgt_TShared)
38
39 //=============================================================================
40 //function : Graphic3d_Structure
41 //purpose  :
42 //=============================================================================
43 Graphic3d_Structure::Graphic3d_Structure (const Handle(Graphic3d_StructureManager)& theManager)
44 : myStructureManager      (theManager.operator->()),
45   myFirstStructureManager (theManager.operator->()),
46   myComputeVisual         (Graphic3d_TOS_ALL),
47   myHighlightColor        (Quantity_NOC_WHITE),
48   myHighlightMethod       (Aspect_TOHM_COLOR),
49   myOwner                 (NULL),
50   myVisual                (Graphic3d_TOS_ALL)
51 {
52   myCStructure = theManager->GraphicDriver()->CreateStructure (theManager);
53 }
54
55 //=============================================================================
56 //function : Graphic3d_Structure
57 //purpose  :
58 //=============================================================================
59 Graphic3d_Structure::Graphic3d_Structure (const Handle(Graphic3d_StructureManager)& theManager,
60                                           const Handle(Graphic3d_Structure)&        thePrs)
61 : myStructureManager      (theManager.operator->()),
62   myFirstStructureManager (theManager.operator->()),
63   myComputeVisual         (thePrs->myComputeVisual),
64   myHighlightColor        (thePrs->myHighlightColor),
65   myHighlightMethod       (thePrs->myHighlightMethod),
66   myOwner                 (thePrs->myOwner),
67   myVisual                (thePrs->myVisual)
68 {
69   myCStructure = thePrs->myCStructure->ShadowLink (theManager);
70 }
71
72 //=============================================================================
73 //function : ~Graphic3d_Structure
74 //purpose  :
75 //=============================================================================
76 Graphic3d_Structure::~Graphic3d_Structure()
77 {
78   // as myFirstStructureManager can be already destroyed,
79   // avoid attempts to access it
80   myFirstStructureManager = NULL;
81   Remove();
82 }
83
84 //=============================================================================
85 //function : Clear
86 //purpose  :
87 //=============================================================================
88 void Graphic3d_Structure::Clear (const Standard_Boolean theWithDestruction)
89 {
90   if (IsDeleted()) return;
91
92   // clean groups in graphics driver at first
93   GraphicClear (theWithDestruction);
94
95   myCStructure->ContainsFacet = 0;
96   myStructureManager->Clear (this, theWithDestruction);
97
98   Update (true);
99 }
100
101 //=======================================================================
102 //function : CalculateBoundBox
103 //purpose  : Calculates AABB of a structure.
104 //=======================================================================
105 void Graphic3d_Structure::CalculateBoundBox()
106 {
107   Graphic3d_BndBox4d aBox;
108   addTransformed (aBox, Standard_True);
109   if (aBox.IsValid())
110   {
111     Graphic3d_Vec4 aMinPt (RealToShortReal (aBox.CornerMin().x()),
112                            RealToShortReal (aBox.CornerMin().y()),
113                            RealToShortReal (aBox.CornerMin().z()),
114                            1.0f);
115     Graphic3d_Vec4 aMaxPt (RealToShortReal (aBox.CornerMax().x()),
116                            RealToShortReal (aBox.CornerMax().y()),
117                            RealToShortReal (aBox.CornerMax().z()),
118                            1.0f);
119     myCStructure->ChangeBoundingBox() = Graphic3d_BndBox4f (aMinPt, aMaxPt);
120   }
121   else
122   {
123     myCStructure->ChangeBoundingBox().Clear();
124   }
125 }
126
127 //=============================================================================
128 //function : Remove
129 //purpose  :
130 //=============================================================================
131 void Graphic3d_Structure::Remove()
132 {
133   if (IsDeleted()) return;
134
135   // clean groups in graphics driver at first; this is also should be done
136   // to avoid unwanted group cleaning in group's destructor
137   // Pass Standard_False to Clear(..) method to avoid updating in
138   // structure manager, it isn't necessary, besides of it structure manager
139   // could be already destroyed and invalid pointers used in structure;
140   for (Graphic3d_SequenceOfGroup::Iterator aGroupIter (myCStructure->Groups()); aGroupIter.More(); aGroupIter.Next())
141   {
142     aGroupIter.ChangeValue()->Clear (Standard_False);
143   }
144
145   Standard_Address APtr = (void *) this;
146   // It is necessary to remove the eventual pointer on the structure
147   // that can be destroyed, in the list of descendants
148   // of ancestors of this structure and in the list of ancestors
149   // of descendants of the same structure.
150
151   for (Standard_Integer aStructIdx = 1, aNbDesc = myDescendants.Size(); aStructIdx <= aNbDesc; ++aStructIdx)
152   {
153     ((Graphic3d_Structure *)myDescendants.FindKey (aStructIdx))->Remove (APtr, Graphic3d_TOC_ANCESTOR);
154   }
155
156   for (Standard_Integer aStructIdx = 1, aNbAnces = myAncestors.Size(); aStructIdx <= aNbAnces; ++aStructIdx)
157   {
158     ((Graphic3d_Structure *)myAncestors.FindKey (aStructIdx))->Remove (APtr, Graphic3d_TOC_DESCENDANT);
159   }
160
161   // Destruction of me in the graphic library
162   const Standard_Integer aStructId = myCStructure->Id;
163   myCStructure->GraphicDriver()->RemoveIdentification(aStructId);
164   myCStructure->GraphicDriver()->RemoveStructure (myCStructure);
165   myCStructure.Nullify();
166 }
167
168 //=============================================================================
169 //function : Display
170 //purpose  :
171 //=============================================================================
172 void Graphic3d_Structure::Display()
173 {
174   if (IsDeleted()) return;
175
176   if (!myCStructure->stick)
177   {
178     myCStructure->stick = 1;
179     myStructureManager->Display (this);
180   }
181
182   if (myCStructure->visible != 1)
183   {
184     myCStructure->visible = 1;
185     myCStructure->OnVisibilityChanged();
186   }
187 }
188
189 //=============================================================================
190 //function : SetIsForHighlight
191 //purpose  :
192 //=============================================================================
193 void Graphic3d_Structure::SetIsForHighlight (const Standard_Boolean isForHighlight)
194 {
195   myCStructure->IsForHighlight = isForHighlight;
196 }
197
198 //=============================================================================
199 //function : SetDisplayPriority
200 //purpose  :
201 //=============================================================================
202 void Graphic3d_Structure::SetDisplayPriority (const Standard_Integer thePriority)
203 {
204   if (IsDeleted()
205    || thePriority == myCStructure->Priority)
206   {
207     return;
208   }
209
210   myCStructure->PreviousPriority = myCStructure->Priority;
211   myCStructure->Priority         = thePriority;
212
213   if (myCStructure->Priority != myCStructure->PreviousPriority)
214   {
215     Graphic3d_PriorityDefinitionError_Raise_if ((myCStructure->Priority > Structure_MAX_PRIORITY)
216                                              || (myCStructure->Priority < Structure_MIN_PRIORITY),
217                                                 "Bad value for StructurePriority");
218     if (myCStructure->stick)
219     {
220       myStructureManager->ChangeDisplayPriority (this, myCStructure->PreviousPriority, myCStructure->Priority);
221     }
222   }
223 }
224
225 //=============================================================================
226 //function : ResetDisplayPriority
227 //purpose  :
228 //=============================================================================
229 void Graphic3d_Structure::ResetDisplayPriority()
230 {
231   if (IsDeleted()
232    || myCStructure->Priority == myCStructure->PreviousPriority)
233   {
234     return;
235   }
236
237   const Standard_Integer aPriority = myCStructure->Priority;
238   myCStructure->Priority = myCStructure->PreviousPriority;
239   if (myCStructure->stick)
240   {
241     myStructureManager->ChangeDisplayPriority (this, aPriority, myCStructure->Priority);
242   }
243 }
244
245 //=============================================================================
246 //function : DisplayPriority
247 //purpose  :
248 //=============================================================================
249 Standard_Integer Graphic3d_Structure::DisplayPriority() const
250 {
251   return myCStructure->Priority;
252 }
253
254 //=============================================================================
255 //function : Erase
256 //purpose  :
257 //=============================================================================
258 void Graphic3d_Structure::Erase()
259 {
260   if (IsDeleted())
261   {
262     return;
263   }
264
265   if (myCStructure->stick)
266   {
267     myCStructure->stick = 0;
268     myStructureManager->Erase (this);
269   }
270 }
271
272 //=============================================================================
273 //function : Highlight
274 //purpose  :
275 //=============================================================================
276 void Graphic3d_Structure::Highlight (const Aspect_TypeOfHighlightMethod theMethod,
277                                      const Quantity_Color&              theColor,
278                                      const Standard_Boolean             theToUpdateMgr)
279 {
280   if (IsDeleted())
281   {
282     return;
283   }
284
285   myHighlightColor = theColor;
286
287   // Highlight on already Highlighted structure.
288   if (myCStructure->highlight)
289   {
290     Aspect_TypeOfUpdate anUpdateMode = myStructureManager->UpdateMode();
291     if (anUpdateMode == Aspect_TOU_WAIT)
292     {
293       UnHighlight();
294     }
295     else
296     {
297       // To avoid call of method : Update()
298       // Not useful and can be costly.
299       myStructureManager->SetUpdateMode (Aspect_TOU_WAIT);
300       UnHighlight();
301       myStructureManager->SetUpdateMode (anUpdateMode);
302     }
303   }
304
305   SetDisplayPriority (Structure_MAX_PRIORITY - 1);
306
307   GraphicHighlight (theMethod);
308
309   if (!theToUpdateMgr)
310   {
311     return;
312   }
313
314   if (myCStructure->stick)
315   {
316     myStructureManager->Highlight (this, theMethod);
317   }
318
319   Update();
320 }
321
322 //=============================================================================
323 //function : SetVisible
324 //purpose  :
325 //=============================================================================
326 void Graphic3d_Structure::SetVisible (const Standard_Boolean theValue)
327 {
328   if (IsDeleted()) return;
329
330   const unsigned isVisible = theValue ? 1 : 0;
331   if (myCStructure->visible == isVisible)
332   {
333     return;
334   }
335
336   myCStructure->visible = isVisible;
337   myCStructure->OnVisibilityChanged();
338   Update (true);
339 }
340
341 //=============================================================================
342 //function : UnHighlight
343 //purpose  :
344 //=============================================================================
345 void Graphic3d_Structure::UnHighlight()
346 {
347   if (IsDeleted()) return;
348
349   if (myCStructure->highlight)
350   {
351     myCStructure->highlight = 0;
352
353     GraphicUnHighlight();
354     myStructureManager->UnHighlight (this);
355
356     ResetDisplayPriority();
357     Update();
358   }
359 }
360
361 //=============================================================================
362 //function : HighlightColor
363 //purpose  :
364 //=============================================================================
365 const Quantity_Color& Graphic3d_Structure::HighlightColor() const
366 {
367   return myHighlightColor;
368 }
369
370 //=============================================================================
371 //function : IsDisplayed
372 //purpose  :
373 //=============================================================================
374 Standard_Boolean Graphic3d_Structure::IsDisplayed() const
375 {
376   return myCStructure->stick ? Standard_True : Standard_False;
377 }
378
379 //=============================================================================
380 //function : IsDeleted
381 //purpose  :
382 //=============================================================================
383 Standard_Boolean Graphic3d_Structure::IsDeleted() const
384 {
385   return myCStructure.IsNull();
386 }
387
388 //=============================================================================
389 //function : IsHighlighted
390 //purpose  :
391 //=============================================================================
392 Standard_Boolean Graphic3d_Structure::IsHighlighted() const
393 {
394   return myCStructure->highlight ? Standard_True : Standard_False;
395 }
396
397 //=============================================================================
398 //function : IsVisible
399 //purpose  :
400 //=============================================================================
401 Standard_Boolean Graphic3d_Structure::IsVisible() const
402 {
403   return myCStructure->visible ? Standard_True : Standard_False;
404 }
405
406 //=============================================================================
407 //function : IsTransformed
408 //purpose  :
409 //=============================================================================
410 Standard_Boolean Graphic3d_Structure::IsTransformed() const
411 {
412   return !myCStructure->Transformation().IsNull()
413        && myCStructure->Transformation()->Form() != gp_Identity;
414 }
415
416 //=============================================================================
417 //function : ContainsFacet
418 //purpose  :
419 //=============================================================================
420 Standard_Boolean Graphic3d_Structure::ContainsFacet() const
421 {
422   if (IsDeleted())
423   {
424     return Standard_False;
425   }
426   else if (myCStructure->ContainsFacet > 0)
427   {
428     // if one of groups contains at least one facet, the structure contains it too
429     return Standard_True;
430   }
431
432   // stop at the first descendant containing at least one facet
433   for (Graphic3d_IndexedMapOfAddress::Iterator anIter (myDescendants); anIter.More(); anIter.Next())
434   {
435     if (((const Graphic3d_Structure *)anIter.Value())->ContainsFacet())
436     {
437       return Standard_True;
438     }
439   }
440   return Standard_False;
441 }
442
443 //=============================================================================
444 //function : IsEmpty
445 //purpose  :
446 //=============================================================================
447 Standard_Boolean Graphic3d_Structure::IsEmpty() const
448 {
449   if (IsDeleted())
450   {
451     return Standard_True;
452   }
453
454   // structure is empty:
455   // - if all these groups are empty
456   // - or if all groups are empty and all their descendants are empty
457   // - or if all its descendants are empty
458   for (Graphic3d_SequenceOfGroup::Iterator aGroupIter (myCStructure->Groups()); aGroupIter.More(); aGroupIter.Next())
459   {
460     if (!aGroupIter.Value()->IsEmpty())
461     {
462       return Standard_False;
463     }
464   }
465
466   // stop at the first non-empty descendant
467   for (Graphic3d_IndexedMapOfAddress::Iterator anIter (myDescendants); anIter.More(); anIter.Next())
468   {
469     if (!((const Graphic3d_Structure* )anIter.Value())->IsEmpty())
470     {
471       return Standard_False;
472     }
473   }
474   return Standard_True;
475 }
476
477 //=============================================================================
478 //function : GroupsWithFacet
479 //purpose  :
480 //=============================================================================
481 void Graphic3d_Structure::GroupsWithFacet (const Standard_Integer theDelta)
482 {
483   myCStructure->ContainsFacet = myCStructure->ContainsFacet + theDelta;
484   if (myCStructure->ContainsFacet < 0)
485   {
486     myCStructure->ContainsFacet = 0;
487   }
488 }
489
490 //=============================================================================
491 //function : Compute
492 //purpose  :
493 //=============================================================================
494 void Graphic3d_Structure::Compute()
495 {
496   // Implemented by Presentation
497 }
498
499 //=============================================================================
500 //function : Compute
501 //purpose  :
502 //=============================================================================
503 Handle(Graphic3d_Structure) Graphic3d_Structure::Compute (const Handle(Graphic3d_DataStructureManager)& )
504 {
505   // Implemented by Presentation
506   return this;
507 }
508
509 //=============================================================================
510 //function : Compute
511 //purpose  :
512 //=============================================================================
513 Handle(Graphic3d_Structure) Graphic3d_Structure::Compute (const Handle(Graphic3d_DataStructureManager)& ,
514                                                           const Handle(Geom_Transformation)& )
515 {
516   // Implemented by Presentation
517   return this;
518 }
519
520 //=============================================================================
521 //function : Compute
522 //purpose  :
523 //=============================================================================
524 void Graphic3d_Structure::Compute (const Handle(Graphic3d_DataStructureManager)& ,
525                                    Handle(Graphic3d_Structure)& )
526 {
527   // Implemented by Presentation
528 }
529
530 //=============================================================================
531 //function : Compute
532 //purpose  :
533 //=============================================================================
534 void Graphic3d_Structure::Compute (const Handle(Graphic3d_DataStructureManager)& ,
535                                    const Handle(Geom_Transformation)& ,
536                                    Handle(Graphic3d_Structure)& )
537 {
538   // Implemented by Presentation
539 }
540
541 //=============================================================================
542 //function : ReCompute
543 //purpose  :
544 //=============================================================================
545 void Graphic3d_Structure::ReCompute()
546 {
547   myStructureManager->ReCompute (this);
548 }
549
550 //=============================================================================
551 //function : ReCompute
552 //purpose  :
553 //=============================================================================
554 void Graphic3d_Structure::ReCompute (const Handle(Graphic3d_DataStructureManager)& theProjector)
555 {
556   myStructureManager->ReCompute (this, theProjector);
557 }
558
559 //=============================================================================
560 //function : SetInfiniteState
561 //purpose  :
562 //=============================================================================
563 void Graphic3d_Structure::SetInfiniteState (const Standard_Boolean theToSet)
564 {
565   myCStructure->IsInfinite = theToSet ? 1 : 0;
566 }
567
568 //=============================================================================
569 //function : IsInfinite
570 //purpose  :
571 //=============================================================================
572 Standard_Boolean Graphic3d_Structure::IsInfinite() const
573 {
574   return IsDeleted()
575        || myCStructure->IsInfinite;
576 }
577
578 //=============================================================================
579 //function : GraphicClear
580 //purpose  :
581 //=============================================================================
582 void Graphic3d_Structure::GraphicClear (const Standard_Boolean theWithDestruction)
583 {
584   if (myCStructure.IsNull())
585   {
586     return;
587   }
588
589   // clean and empty each group
590   for (Graphic3d_SequenceOfGroup::Iterator aGroupIter (myCStructure->Groups()); aGroupIter.More(); aGroupIter.Next())
591   {
592     aGroupIter.ChangeValue()->Clear();
593   }
594   if (!theWithDestruction)
595   {
596     return;
597   }
598
599   while (!myCStructure->Groups().IsEmpty())
600   {
601     Handle(Graphic3d_Group) aGroup = myCStructure->Groups().First();
602     aGroup->Remove();
603   }
604   myCStructure->Clear();
605 }
606
607 //=============================================================================
608 //function : GraphicConnect
609 //purpose  :
610 //=============================================================================
611 void Graphic3d_Structure::GraphicConnect (const Handle(Graphic3d_Structure)& theDaughter)
612 {
613   myCStructure->Connect (*theDaughter->myCStructure);
614 }
615
616 //=============================================================================
617 //function : GraphicDisconnect
618 //purpose  :
619 //=============================================================================
620 void Graphic3d_Structure::GraphicDisconnect (const Handle(Graphic3d_Structure)& theDaughter)
621 {
622   myCStructure->Disconnect (*theDaughter->myCStructure);
623 }
624
625 //=============================================================================
626 //function : Groups
627 //purpose  :
628 //=============================================================================
629 const Graphic3d_SequenceOfGroup& Graphic3d_Structure::Groups() const
630 {
631   return myCStructure->Groups();
632 }
633
634 //=============================================================================
635 //function : NumberOfGroups
636 //purpose  :
637 //=============================================================================
638 Standard_Integer Graphic3d_Structure::NumberOfGroups() const
639 {
640   return myCStructure->Groups().Length();
641 }
642
643 //=============================================================================
644 //function : SetVisual
645 //purpose  :
646 //=============================================================================
647 void Graphic3d_Structure::SetVisual (const Graphic3d_TypeOfStructure theVisual)
648 {
649   if (IsDeleted()
650    || myVisual == theVisual)
651   {
652     return;
653   }
654
655   if (!myCStructure->stick)
656   {
657     myVisual = theVisual;
658     SetComputeVisual (theVisual);
659   }
660   else
661   {
662     Aspect_TypeOfUpdate anUpdateMode  = myStructureManager->UpdateMode();
663     if (anUpdateMode == Aspect_TOU_WAIT)
664     {
665       Erase();
666       myVisual = theVisual;
667       SetComputeVisual (theVisual);
668       Display();
669     }
670     else {
671       // To avoid calling method : Update ()
672       // Not useful and can be costly.
673       myStructureManager->SetUpdateMode (Aspect_TOU_WAIT);
674       Erase();
675       myVisual = theVisual;
676       SetComputeVisual (theVisual);
677       myStructureManager->SetUpdateMode (anUpdateMode);
678       Display();
679     }
680   }
681 }
682
683 //=============================================================================
684 //function : SetZoomLimit
685 //purpose  :
686 //=============================================================================
687 void Graphic3d_Structure::SetZoomLimit (const Standard_Real theLimitInf,
688                                         const Standard_Real theLimitSup)
689 {
690   (void )theLimitInf;
691   (void )theLimitSup;
692   Graphic3d_StructureDefinitionError_Raise_if (theLimitInf <= 0.0,
693                                                "Bad value for ZoomLimit inf");
694   Graphic3d_StructureDefinitionError_Raise_if (theLimitSup <= 0.0,
695                                                "Bad value for ZoomLimit sup");
696   Graphic3d_StructureDefinitionError_Raise_if (theLimitSup < theLimitInf,
697                                                "ZoomLimit sup < ZoomLimit inf");
698 }
699
700 //=============================================================================
701 //function : Visual
702 //purpose  :
703 //=============================================================================
704 Graphic3d_TypeOfStructure Graphic3d_Structure::Visual() const
705 {
706   return myVisual;
707 }
708
709 //=============================================================================
710 //function : AcceptConnection
711 //purpose  :
712 //=============================================================================
713 Standard_Boolean Graphic3d_Structure::AcceptConnection (const Handle(Graphic3d_Structure)& theStructure1,
714                                                         const Handle(Graphic3d_Structure)& theStructure2,
715                                                         const Graphic3d_TypeOfConnection   theType)
716 {
717   // cycle detection
718   Graphic3d_MapOfStructure aSet;
719   Graphic3d_Structure::Network (theStructure2, theType, aSet);
720   return !aSet.Contains (theStructure1);
721 }
722
723 //=============================================================================
724 //function : Ancestors
725 //purpose  :
726 //=============================================================================
727 void Graphic3d_Structure::Ancestors (Graphic3d_MapOfStructure& theSet) const
728 {
729   for (Graphic3d_IndexedMapOfAddress::Iterator anIter (myAncestors); anIter.More(); anIter.Next())
730   {
731     theSet.Add ((Graphic3d_Structure* )anIter.Value());
732   }
733 }
734
735 //=============================================================================
736 //function : SetOwner
737 //purpose  :
738 //=============================================================================
739 void Graphic3d_Structure::SetOwner (const Standard_Address theOwner)
740 {
741   myOwner = theOwner;
742 }
743
744 //=============================================================================
745 //function : Owner
746 //purpose  :
747 //=============================================================================
748 Standard_Address Graphic3d_Structure::Owner() const
749 {
750   return myOwner;
751 }
752
753 //=============================================================================
754 //function : Descendants
755 //purpose  :
756 //=============================================================================
757 void Graphic3d_Structure::Descendants (Graphic3d_MapOfStructure& theSet) const
758 {
759   for (Graphic3d_IndexedMapOfAddress::Iterator anIter (myDescendants); anIter.More(); anIter.Next())
760   {
761     theSet.Add ((Graphic3d_Structure* )anIter.Value());
762   }
763 }
764
765 //=============================================================================
766 //function : AppendAncestor
767 //purpose  :
768 //=============================================================================
769 Standard_Boolean Graphic3d_Structure::AppendAncestor (const Standard_Address theAncestor)
770 {
771   const Standard_Integer aSize = myAncestors.Size();
772
773   return myAncestors.Add (theAncestor) > aSize; // new object
774 }
775
776 //=============================================================================
777 //function : AppendDescendant
778 //purpose  :
779 //=============================================================================
780 Standard_Boolean Graphic3d_Structure::AppendDescendant (const Standard_Address theDescendant)
781 {
782   const Standard_Integer aSize = myDescendants.Size();
783
784   return myDescendants.Add (theDescendant) > aSize; // new object
785 }
786
787 //=============================================================================
788 //function : RemoveAncestor
789 //purpose  :
790 //=============================================================================
791 Standard_Boolean Graphic3d_Structure::RemoveAncestor (const Standard_Address theAncestor)
792 {
793   const Standard_Integer anIndex = myAncestors.FindIndex (theAncestor);
794
795   if (anIndex != 0)
796   {
797     myAncestors.Swap (anIndex, myAncestors.Size());
798     myAncestors.RemoveLast();
799   }
800
801   return anIndex != 0; // object was found
802 }
803
804 //=============================================================================
805 //function : RemoveDescendant
806 //purpose  :
807 //=============================================================================
808 Standard_Boolean Graphic3d_Structure::RemoveDescendant (const Standard_Address theDescendant)
809 {
810   const Standard_Integer anIndex = myDescendants.FindIndex (theDescendant);
811
812   if (anIndex != 0)
813   {
814     myDescendants.Swap (anIndex, myDescendants.Size());
815     myDescendants.RemoveLast();
816   }
817
818   return anIndex != 0; // object was found
819 }
820
821 //=============================================================================
822 //function : Connect
823 //purpose  :
824 //=============================================================================
825 void Graphic3d_Structure::Connect (const Handle(Graphic3d_Structure)& theStructure,
826                                    const Graphic3d_TypeOfConnection   theType,
827                                    const Standard_Boolean             theWithCheck)
828 {
829   if (IsDeleted())
830   {
831     return;
832   }
833
834   // cycle detection
835   if (theWithCheck
836    && !Graphic3d_Structure::AcceptConnection (this, theStructure, theType))
837   {
838     return;
839   }
840
841   const Standard_Address aStructure = theStructure.operator->();
842
843   if (theType == Graphic3d_TOC_DESCENDANT)
844   {
845     if (!AppendDescendant (aStructure))
846     {
847       return;
848     }
849
850     CalculateBoundBox();
851     theStructure->Connect (this, Graphic3d_TOC_ANCESTOR);
852
853     GraphicConnect (theStructure);
854     myStructureManager->Connect (this, theStructure);
855
856     Update (true);
857   }
858   else // Graphic3d_TOC_ANCESTOR
859   {
860     if (!AppendAncestor (aStructure))
861     {
862       return;
863     }
864
865     CalculateBoundBox();
866     theStructure->Connect (this, Graphic3d_TOC_DESCENDANT);
867
868     // myStructureManager->Connect is called in case if connection between parent and child
869   }
870 }
871
872 //=============================================================================
873 //function : Disconnect
874 //purpose  :
875 //=============================================================================
876 void Graphic3d_Structure::Disconnect (const Handle(Graphic3d_Structure)& theStructure)
877 {
878   if (IsDeleted())
879   {
880     return;
881   }
882
883   const Standard_Address aStructure = theStructure.operator->();
884
885   if (RemoveDescendant (aStructure))
886   {
887     theStructure->Disconnect (this);
888
889     GraphicDisconnect (theStructure);
890     myStructureManager->Disconnect (this, theStructure);
891
892     CalculateBoundBox();
893     Update (true);
894   }
895   else if (RemoveAncestor (aStructure))
896   {
897     theStructure->Disconnect (this);
898     CalculateBoundBox();
899
900     // no call of myStructureManager->Disconnect in case of an ancestor
901   }
902 }
903
904 //=============================================================================
905 //function : DisconnectAll
906 //purpose  :
907 //=============================================================================
908 void Graphic3d_Structure::DisconnectAll (const Graphic3d_TypeOfConnection theType)
909 {
910   if (IsDeleted()) return;
911
912   switch (theType)
913   {
914     case Graphic3d_TOC_DESCENDANT:
915     {
916       for (Standard_Integer anIdx = 1, aLength = myDescendants.Size(); anIdx <= aLength; ++anIdx)
917       {
918         // Value (1) instead of Value (i) as myDescendants
919         // is modified by :
920         // Graphic3d_Structure::Disconnect (AStructure)
921         // that takes AStructure from myDescendants
922         ((Graphic3d_Structure* )(myDescendants.FindKey (1)))->Disconnect (this);
923       }
924       break;
925     }
926     case Graphic3d_TOC_ANCESTOR:
927     {
928       for (Standard_Integer anIdx = 1, aLength = myAncestors.Size(); anIdx <= aLength; ++anIdx)
929       {
930         // Value (1) instead of Value (i) as myAncestors
931         // is modified by :
932         // Graphic3d_Structure::Disconnect (AStructure)
933         // that takes AStructure from myAncestors
934         ((Graphic3d_Structure* )(myAncestors.FindKey (1)))->Disconnect (this);
935       }
936       break;
937     }
938   }
939 }
940
941 //=============================================================================
942 //function : SetTransform
943 //purpose  :
944 //=============================================================================
945 void Graphic3d_Structure::SetTransformation (const Handle(Geom_Transformation)& theTrsf)
946 {
947   if (IsDeleted()) return;
948
949   const Standard_Boolean wasTransformed = IsTransformed();
950
951   if (!theTrsf.IsNull()
952     && theTrsf->Trsf().Form() == gp_Identity)
953   {
954     myCStructure->SetTransformation (Handle(Geom_Transformation)());
955   }
956   else
957   {
958     myCStructure->SetTransformation (theTrsf);
959   }
960
961   // If transformation, no validation of hidden already calculated parts
962   if (IsTransformed() || (!IsTransformed() && wasTransformed))
963   {
964     ReCompute();
965   }
966
967   myStructureManager->SetTransform (this, theTrsf);
968
969   Update (true);
970 }
971
972 //=============================================================================
973 //function : MinMaxValues
974 //purpose  :
975 //=============================================================================
976 Bnd_Box Graphic3d_Structure::MinMaxValues (const Standard_Boolean theToIgnoreInfiniteFlag) const
977 {
978   Graphic3d_BndBox4d aBox;
979   Bnd_Box aResult;
980   addTransformed (aBox, theToIgnoreInfiniteFlag);
981   if (aBox.IsValid())
982   {
983     aResult.Add (gp_Pnt (aBox.CornerMin().x(),
984                          aBox.CornerMin().y(),
985                          aBox.CornerMin().z()));
986     aResult.Add (gp_Pnt (aBox.CornerMax().x(),
987                          aBox.CornerMax().y(),
988                          aBox.CornerMax().z()));
989
990     Standard_Real aLimMin = ShortRealFirst() + 1.0;
991     Standard_Real aLimMax = ShortRealLast() - 1.0;
992     gp_Pnt aMin = aResult.CornerMin();
993     gp_Pnt aMax = aResult.CornerMax();
994     if (aMin.X() < aLimMin && aMin.Y() < aLimMin && aMin.Z() < aLimMin &&
995         aMax.X() > aLimMax && aMax.Y() > aLimMax && aMax.Z() > aLimMax)
996     {
997       //For structure which infinite in all three dimensions the Whole bounding box will be returned
998       aResult.SetWhole();
999     }
1000   }
1001   return aResult;
1002 }
1003
1004 //=============================================================================
1005 //function : Identification
1006 //purpose  :
1007 //=============================================================================
1008 Standard_Integer Graphic3d_Structure::Identification() const
1009 {
1010   return myCStructure->Id;
1011 }
1012
1013 //=============================================================================
1014 //function : SetTransformPersistence
1015 //purpose  :
1016 //=============================================================================
1017 void Graphic3d_Structure::SetTransformPersistence (const Handle(Graphic3d_TransformPers)& theTrsfPers)
1018 {
1019   if (IsDeleted())
1020   {
1021     return;
1022   }
1023
1024   myCStructure->SetTransformPersistence (theTrsfPers);
1025 }
1026
1027 //=============================================================================
1028 //function : Remove
1029 //purpose  :
1030 //=============================================================================
1031 void Graphic3d_Structure::Remove (const Standard_Address           thePtr,
1032                                   const Graphic3d_TypeOfConnection theType)
1033 {
1034   if (theType == Graphic3d_TOC_DESCENDANT)
1035   {
1036     RemoveDescendant (thePtr);
1037   }
1038   else
1039   {
1040     RemoveAncestor (thePtr);
1041   }
1042 }
1043
1044 //=============================================================================
1045 //function : NewGroup
1046 //purpose  :
1047 //=============================================================================
1048 Handle(Graphic3d_Group) Graphic3d_Structure::NewGroup()
1049 {
1050   return myCStructure->NewGroup (this);
1051 }
1052
1053 //=============================================================================
1054 //function : Remove
1055 //purpose  :
1056 //=============================================================================
1057 void Graphic3d_Structure::Remove (const Handle(Graphic3d_Group)& theGroup)
1058 {
1059   if (theGroup.IsNull()
1060    || theGroup->myStructure != this)
1061   {
1062     return;
1063   }
1064
1065   myCStructure->RemoveGroup (theGroup);
1066   theGroup->myStructure = NULL;
1067 }
1068
1069 //=============================================================================
1070 //function : StructureManager
1071 //purpose  :
1072 //=============================================================================
1073 Handle(Graphic3d_StructureManager) Graphic3d_Structure::StructureManager() const
1074 {
1075   return myStructureManager;
1076 }
1077
1078 //=============================================================================
1079 //function : minMaxCoord
1080 //purpose  :
1081 //=============================================================================
1082 Graphic3d_BndBox4f Graphic3d_Structure::minMaxCoord() const
1083 {
1084   Graphic3d_BndBox4f aBnd;
1085   for (Graphic3d_SequenceOfGroup::Iterator aGroupIter (myCStructure->Groups()); aGroupIter.More(); aGroupIter.Next())
1086   {
1087     aBnd.Combine (aGroupIter.Value()->BoundingBox());
1088   }
1089   return aBnd;
1090 }
1091
1092 //=============================================================================
1093 //function : addTransformed
1094 //purpose  :
1095 //=============================================================================
1096 void Graphic3d_Structure::getBox (Graphic3d_BndBox4d&    theBox,
1097                                   const Standard_Boolean theToIgnoreInfiniteFlag) const
1098 {
1099   Graphic3d_BndBox4f aBoxF = minMaxCoord();
1100   if (aBoxF.IsValid())
1101   {
1102     theBox = Graphic3d_BndBox4d (Graphic3d_Vec4d ((Standard_Real )aBoxF.CornerMin().x(),
1103                                                   (Standard_Real )aBoxF.CornerMin().y(),
1104                                                   (Standard_Real )aBoxF.CornerMin().z(),
1105                                                   (Standard_Real )aBoxF.CornerMin().w()),
1106                                  Graphic3d_Vec4d ((Standard_Real )aBoxF.CornerMax().x(),
1107                                                   (Standard_Real )aBoxF.CornerMax().y(),
1108                                                   (Standard_Real )aBoxF.CornerMax().z(),
1109                                                   (Standard_Real )aBoxF.CornerMax().w()));
1110     if (IsInfinite()
1111     && !theToIgnoreInfiniteFlag)
1112     {
1113       const Graphic3d_Vec4d aDiagVec = theBox.CornerMax() - theBox.CornerMin();
1114       if (aDiagVec.xyz().SquareModulus() >= 500000.0 * 500000.0)
1115       {
1116         // bounding borders of infinite line has been calculated as own point in center of this line
1117         theBox = Graphic3d_BndBox4d ((theBox.CornerMin() + theBox.CornerMax()) * 0.5);
1118       }
1119       else
1120       {
1121         theBox = Graphic3d_BndBox4d (Graphic3d_Vec4d (RealFirst(), RealFirst(), RealFirst(), 1.0),
1122                                      Graphic3d_Vec4d (RealLast(),  RealLast(),  RealLast(),  1.0));
1123         return;
1124       }
1125     }
1126   }
1127 }
1128
1129 //=============================================================================
1130 //function : addTransformed
1131 //purpose  :
1132 //=============================================================================
1133 void Graphic3d_Structure::addTransformed (Graphic3d_BndBox4d&    theBox,
1134                                           const Standard_Boolean theToIgnoreInfiniteFlag) const
1135 {
1136   Graphic3d_BndBox4d aCombinedBox, aBox;
1137   getBox (aCombinedBox, theToIgnoreInfiniteFlag);
1138
1139   for (Graphic3d_IndexedMapOfAddress::Iterator anIter (myDescendants); anIter.More(); anIter.Next())
1140   {
1141     const Graphic3d_Structure* aStruct = (const Graphic3d_Structure* )anIter.Value();
1142     aStruct->getBox (aBox, theToIgnoreInfiniteFlag);
1143     aCombinedBox.Combine (aBox);
1144   }
1145
1146   aBox = aCombinedBox;
1147   if (aBox.IsValid())
1148   {
1149     if (!myCStructure->Transformation().IsNull())
1150     {
1151       TransformBoundaries (myCStructure->Transformation()->Trsf(),
1152                            aBox.CornerMin().x(), aBox.CornerMin().y(), aBox.CornerMin().z(),
1153                            aBox.CornerMax().x(), aBox.CornerMax().y(), aBox.CornerMax().z());
1154     }
1155
1156     // if box is still valid after transformation
1157     if (aBox.IsValid())
1158     {
1159       theBox.Combine (aBox);
1160     }
1161     else // it was infinite, return untransformed
1162     {
1163       theBox.Combine (aCombinedBox);
1164     }
1165   }
1166 }
1167
1168 //=============================================================================
1169 //function : Transforms
1170 //purpose  :
1171 //=============================================================================
1172 void Graphic3d_Structure::Transforms (const gp_Trsf& theTrsf,
1173                                       const Standard_Real theX,    const Standard_Real theY,    const Standard_Real theZ,
1174                                       Standard_Real&      theNewX, Standard_Real&      theNewY, Standard_Real&      theNewZ)
1175 {
1176   const Standard_Real aRL = RealLast();
1177   const Standard_Real aRF = RealFirst();
1178   theNewX = theX;
1179   theNewY = theY;
1180   theNewZ = theZ;
1181   if ((theX == aRF) || (theY == aRF) || (theZ == aRF)
1182    || (theX == aRL) || (theY == aRL) || (theZ == aRL))
1183   {
1184     return;
1185   }
1186
1187   theTrsf.Transforms (theNewX, theNewY, theNewZ);
1188 }
1189
1190 //=============================================================================
1191 //function : Transforms
1192 //purpose  :
1193 //=============================================================================
1194 void Graphic3d_Structure::TransformBoundaries (const gp_Trsf& theTrsf,
1195                                                Standard_Real& theXMin,
1196                                                Standard_Real& theYMin,
1197                                                Standard_Real& theZMin,
1198                                                Standard_Real& theXMax,
1199                                                Standard_Real& theYMax,
1200                                                Standard_Real& theZMax)
1201 {
1202   Standard_Real aXMin, aYMin, aZMin, aXMax, aYMax, aZMax, anU, aV, aW;
1203
1204   Graphic3d_Structure::Transforms (theTrsf, theXMin, theYMin, theZMin, aXMin, aYMin, aZMin);
1205   Graphic3d_Structure::Transforms (theTrsf, theXMax, theYMax, theZMax, aXMax, aYMax, aZMax);
1206
1207   Graphic3d_Structure::Transforms (theTrsf, theXMin, theYMin, theZMax, anU, aV, aW);
1208   aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
1209   aYMin = Min (aV,  aYMin); aYMax = Max (aV,  aYMax);
1210   aZMin = Min (aW,  aZMin); aZMax = Max (aW,  aZMax);
1211
1212   Graphic3d_Structure::Transforms (theTrsf, theXMax, theYMin, theZMax, anU, aV, aW);
1213   aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
1214   aYMin = Min (aV,  aYMin); aYMax = Max (aV,  aYMax);
1215   aZMin = Min (aW,  aZMin); aZMax = Max (aW,  aZMax);
1216
1217   Graphic3d_Structure::Transforms (theTrsf, theXMax, theYMin, theZMin, anU, aV, aW);
1218   aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
1219   aYMin = Min (aV,  aYMin); aYMax = Max (aV,  aYMax);
1220   aZMin = Min (aW,  aZMin); aZMax = Max (aW,  aZMax);
1221
1222   Graphic3d_Structure::Transforms (theTrsf, theXMax, theYMax, theZMin, anU, aV, aW);
1223   aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
1224   aYMin = Min (aV,  aYMin); aYMax = Max (aV,  aYMax);
1225   aZMin = Min (aW,  aZMin); aZMax = Max (aW,  aZMax);
1226
1227   Graphic3d_Structure::Transforms (theTrsf, theXMin, theYMax, theZMax, anU, aV, aW);
1228   aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
1229   aYMin = Min (aV,  aYMin); aYMax = Max (aV,  aYMax);
1230   aZMin = Min (aW,  aZMin); aZMax = Max (aW,  aZMax);
1231
1232   Graphic3d_Structure::Transforms (theTrsf, theXMin, theYMax, theZMin, anU, aV, aW);
1233   aXMin = Min (anU, aXMin); aXMax = Max (anU, aXMax);
1234   aYMin = Min (aV,  aYMin); aYMax = Max (aV,  aYMax);
1235   aZMin = Min (aW,  aZMin); aZMax = Max (aW,  aZMax);
1236
1237   theXMin = aXMin;
1238   theYMin = aYMin;
1239   theZMin = aZMin;
1240   theXMax = aXMax;
1241   theYMax = aYMax;
1242   theZMax = aZMax;
1243 }
1244
1245 //=============================================================================
1246 //function : Network
1247 //purpose  :
1248 //=============================================================================
1249 void Graphic3d_Structure::Network (const Handle(Graphic3d_Structure)& theStructure,
1250                                    const Graphic3d_TypeOfConnection   theType,
1251                                    Graphic3d_MapOfStructure&          theSet)
1252 {
1253   Graphic3d_MapOfStructure aSetD, aSetA;
1254   theStructure->Descendants (aSetD);
1255   theStructure->Ancestors   (aSetA);
1256   theSet.Add (theStructure);
1257   switch (theType)
1258   {
1259     case Graphic3d_TOC_DESCENDANT:
1260       for (Graphic3d_MapIteratorOfMapOfStructure anIter (aSetD); anIter.More(); anIter.Next())
1261       {
1262         Graphic3d_Structure::Network (anIter.Key(), theType, theSet);
1263       }
1264       break;
1265     case Graphic3d_TOC_ANCESTOR:
1266       for (Graphic3d_MapIteratorOfMapOfStructure anIter (aSetA); anIter.More(); anIter.Next())
1267       {
1268         Graphic3d_Structure::Network (anIter.Key (), theType, theSet);
1269       }
1270       break;
1271   }
1272 }
1273
1274 //=============================================================================
1275 //function : PrintNetwork
1276 //purpose  :
1277 //=============================================================================
1278 void Graphic3d_Structure::PrintNetwork (const Handle(Graphic3d_Structure)& theStructure,
1279                                         const Graphic3d_TypeOfConnection   theType)
1280 {
1281   Graphic3d_MapOfStructure aSet;
1282   Graphic3d_Structure::Network (theStructure, theType, aSet);
1283   for (Graphic3d_MapIteratorOfMapOfStructure anIter (aSet); anIter.More(); anIter.Next())
1284   {
1285     std::cout << "\tIdent " << (anIter.Key())->Identification () << "\n";
1286   }
1287   std::cout << std::flush;
1288 }
1289
1290 //=============================================================================
1291 //function : Update
1292 //purpose  :
1293 //=============================================================================
1294 void Graphic3d_Structure::Update (const bool theUpdateLayer) const
1295 {
1296   if (IsDeleted())
1297   {
1298     return;
1299   }
1300
1301   myStructureManager->Update (myStructureManager->UpdateMode(),
1302                               theUpdateLayer ? myCStructure->ZLayer() : Graphic3d_ZLayerId_UNKNOWN);
1303 }
1304
1305 //=============================================================================
1306 //function : GraphicHighlight
1307 //purpose  :
1308 //=============================================================================
1309 void Graphic3d_Structure::GraphicHighlight (const Aspect_TypeOfHighlightMethod theMethod)
1310 {
1311   myCStructure->highlight = 1;
1312   myHighlightMethod = theMethod;
1313   switch (theMethod)
1314   {
1315     case Aspect_TOHM_COLOR:
1316     {
1317       myCStructure->HighlightWithColor (myHighlightColor, Standard_True);
1318       break;
1319     }
1320     case Aspect_TOHM_BOUNDBOX:
1321     {
1322       myCStructure->HighlightColor = myHighlightColor;
1323       myCStructure->HighlightWithBndBox (this, Standard_True);
1324       break;
1325     }
1326   }
1327 }
1328
1329 //=============================================================================
1330 //function : GraphicTransform
1331 //purpose  :
1332 //=============================================================================
1333 void Graphic3d_Structure::GraphicTransform (const Handle(Geom_Transformation)& theTrsf)
1334 {
1335   myCStructure->SetTransformation (theTrsf);
1336 }
1337
1338 //=============================================================================
1339 //function : GraphicUnHighlight
1340 //purpose  :
1341 //=============================================================================
1342 void Graphic3d_Structure::GraphicUnHighlight()
1343 {
1344   myCStructure->highlight = 0;
1345   switch (myHighlightMethod)
1346   {
1347     case Aspect_TOHM_COLOR:
1348       myCStructure->HighlightWithColor (Graphic3d_Vec3 (0.0f, 0.0f, 0.0f), Standard_False);
1349       break;
1350     case Aspect_TOHM_BOUNDBOX:
1351       myCStructure->HighlightWithBndBox (this, Standard_False);
1352       break;
1353   }
1354 }
1355
1356 //=============================================================================
1357 //function : ComputeVisual
1358 //purpose  :
1359 //=============================================================================
1360 Graphic3d_TypeOfStructure Graphic3d_Structure::ComputeVisual() const
1361 {
1362   return myComputeVisual;
1363 }
1364
1365 //=============================================================================
1366 //function : SetComputeVisual
1367 //purpose  :
1368 //=============================================================================
1369 void Graphic3d_Structure::SetComputeVisual (const Graphic3d_TypeOfStructure theVisual)
1370 {
1371   // The ComputeVisual is saved only if the structure is declared TOS_ALL, TOS_WIREFRAME or TOS_SHADING.
1372   // This declaration permits to calculate proper representation of the structure calculated by Compute instead of passage to TOS_COMPUTED.
1373   if (theVisual != Graphic3d_TOS_COMPUTED)
1374   {
1375     myComputeVisual = theVisual;
1376   }
1377 }
1378
1379 //=============================================================================
1380 //function : SetHLRValidation
1381 //purpose  :
1382 //=============================================================================
1383 void Graphic3d_Structure::SetHLRValidation (const Standard_Boolean theFlag)
1384 {
1385   myCStructure->HLRValidation = theFlag ? 1 : 0;
1386 }
1387
1388 //=============================================================================
1389 //function : HLRValidation
1390 //purpose  :
1391 //=============================================================================
1392 Standard_Boolean Graphic3d_Structure::HLRValidation() const
1393 {
1394   // Hidden parts stored in <me> are valid if :
1395   // 1/ the owner is defined.
1396   // 2/ they are not invalid.
1397   return myOwner != NULL
1398       && myCStructure->HLRValidation != 0;
1399 }
1400
1401 //=======================================================================
1402 //function : SetZLayer
1403 //purpose  :
1404 //=======================================================================
1405 void Graphic3d_Structure::SetZLayer (const Graphic3d_ZLayerId theLayerId)
1406 {
1407   // if the structure is not displayed, unable to change its display layer
1408   if (IsDeleted ())
1409     return;
1410
1411   myStructureManager->ChangeZLayer (this, theLayerId);
1412   myCStructure->SetZLayer (theLayerId);
1413 }
1414
1415 //=======================================================================
1416 //function : GetZLayer
1417 //purpose  :
1418 //=======================================================================
1419 Graphic3d_ZLayerId Graphic3d_Structure::GetZLayer() const
1420 {
1421   return myCStructure->ZLayer();
1422 }
1423
1424 //=======================================================================
1425 //function : SetClipPlanes
1426 //purpose  :
1427 //=======================================================================
1428 void Graphic3d_Structure::SetClipPlanes (const Handle(Graphic3d_SequenceOfHClipPlane)& thePlanes)
1429 {
1430   myCStructure->SetClipPlanes (thePlanes);
1431 }
1432
1433 //=======================================================================
1434 //function : GetClipPlanes
1435 //purpose  :
1436 //=======================================================================
1437 const Handle(Graphic3d_SequenceOfHClipPlane)& Graphic3d_Structure::ClipPlanes() const
1438 {
1439   return myCStructure->ClipPlanes();
1440 }
1441
1442 //=======================================================================
1443 //function : SetMutable
1444 //purpose  :
1445 //=======================================================================
1446 void Graphic3d_Structure::SetMutable (const Standard_Boolean theIsMutable)
1447 {
1448   myCStructure->IsMutable = theIsMutable;
1449 }
1450
1451 //=======================================================================
1452 //function : IsMutable
1453 //purpose  :
1454 //=======================================================================
1455 Standard_Boolean Graphic3d_Structure::IsMutable() const
1456 {
1457   return myCStructure->IsMutable;
1458 }