5b0ba0967e6d1034cbe88f0220e471c875bb5f24
[occt.git] / src / Visual3d / Visual3d_ViewManager.cxx
1 // Copyright (c) 1995-1999 Matra Datavision
2 // Copyright (c) 1999-2012 OPEN CASCADE SAS
3 //
4 // The content of this file is subject to the Open CASCADE Technology Public
5 // License Version 6.5 (the "License"). You may not use the content of this file
6 // except in compliance with the License. Please obtain a copy of the License
7 // at http://www.opencascade.org and read it completely before using this file.
8 //
9 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
10 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
11 //
12 // The Original Code and all software distributed under the License is
13 // distributed on an "AS IS" basis, without warranty of any kind, and the
14 // Initial Developer hereby disclaims all such warranties, including without
15 // limitation, any warranties of merchantability, fitness for a particular
16 // purpose or non-infringement. Please see the License for the specific terms
17 // and conditions governing the rights and limitations under the License.
18
19
20 /***********************************************************************
21
22      FONCTION :
23      ----------
24         Classe Visual3d_ViewManager.cxx :
25
26         Declaration of variables specific to visualisers
27
28      HISTORIQUE DES MODIFICATIONS   :
29      --------------------------------
30       Mars 1992 : NW,JPB,CAL ; Creation.
31       19-06-96  : FMN ; Suppression variables inutiles
32       04-02-97  : FMN ; Suppression de PSOutput, XWDOutput ...
33       06-05-97  : CAL ; Ajout du Clear sur les TOS_COMPUTED.
34       19-09-97  : CAL ; Remplacement de Window->Position par Window->Size;
35       24-10-97  : CAL ; Retrait de DownCast.
36       20-11-97  : CAL ; Disparition de la dependance avec math
37       01-12-97  : CAL ; Retrait du test IsActive sur l'Update et le Redraw
38       31-12-97  : CAL ; Disparition de MathGra 
39       16-01-98  : CAL ; Ajout du SetTransform sur une TOS_COMPUTED
40       11-03-98  : CAL ; Visual3d_ViewManager::Remove ()
41       20-05-98  : CAL ; Perfs. Connection entre structures COMPUTED.
42       10-06-98  : CAL ; Modification des signatures de xxProjectRaster.
43       10-06-98  : CAL ; Modification de la signature de ViewExists.
44       01-12-98  : CAL ; S4062. Ajout des layers.
45       02-12-98  : CAL ; Remove () ne detruit plus les vues.
46
47 ************************************************************************/
48
49 /*----------------------------------------------------------------------*/
50 /*
51  * Constants
52  */
53
54 #define NO_DOWNCAST
55 #define NO_DESTROY
56
57 /*----------------------------------------------------------------------*/
58 /*
59  * Includes
60  */
61
62 // for the class
63 #include <Visual3d_ViewManager.ixx>
64 #include <Visual3d_ViewManager.pxx>
65
66 #include <Standard_ErrorHandler.hxx>
67
68 #include <Aspect.hxx>
69 #include <Aspect_IdentDefinitionError.hxx>
70
71 #include <Graphic3d_GraphicDriver.hxx>
72 #include <Graphic3d_MapOfStructure.hxx>
73 #include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
74
75 #include <Visual3d_PickPath.hxx>
76 #include <Visual3d_SetIteratorOfSetOfView.hxx>
77
78 #ifndef WNT
79 # include <Xw_Window.hxx>
80 #else
81 # include <WNT_Window.hxx>
82 #endif  // WNT
83
84 //-Aliases
85
86 //-Global data definitions
87
88 //      -- les vues definies
89 //      MyDefinedView           :       SetOfView;
90
91 //      -- le generateur d'identificateurs de vues
92 //      MyViewGenId             :       GenId;
93
94 //-Constructors
95
96 Visual3d_ViewManager::Visual3d_ViewManager (const Handle(Aspect_GraphicDevice)& aDevice):
97 Graphic3d_StructureManager (aDevice),
98 MyDefinedView (),
99 MyViewGenId (View_IDMIN+((View_IDMIN+View_IDMAX)/(Visual3d_ViewManager::Limit ()))*(Visual3d_ViewManager::CurrentId ()-1),View_IDMIN+((View_IDMIN+View_IDMAX)/(Visual3d_ViewManager::Limit ()))*Visual3d_ViewManager::CurrentId ()-1),
100 MyZBufferAuto (Standard_False),
101 MyTransparency (Standard_False)
102 {
103   // default layer is always presented in display layer sequence
104   // it can not be removed
105   myLayerIds.Add (0);
106   myLayerSeq.Append (0);
107
108   Handle(Aspect_GraphicDriver) agd = aDevice->GraphicDriver ();
109
110   MyGraphicDriver = *(Handle(Graphic3d_GraphicDriver) *) &agd;
111 }
112
113 //-Destructors
114
115 void Visual3d_ViewManager::Destroy () {
116
117 #ifdef DESTROY
118         cout << "Visual3d_ViewManager::Destroy (" << MyId << ")\n" << flush;
119 #endif
120
121         Remove ();
122 }
123
124 //-Methods, in order
125
126 void Visual3d_ViewManager::Remove () {
127
128 #ifdef DESTROY
129         cout << "Visual3d_ViewManager::Remove (" << MyId << ")\n" << flush;
130 #endif
131
132         //
133         // Destroy all defined views
134         //
135
136 #ifdef DESTROY
137         cout << "The Manager " << MyId << " have " << Length << " defined views\n";
138         cout << flush;
139 #endif
140  
141         MyDefinedView.Clear ();
142
143 }
144
145 void Visual3d_ViewManager::ChangeDisplayPriority (const Handle(Graphic3d_Structure)& AStructure, const Standard_Integer OldPriority, const Standard_Integer NewPriority) {
146
147 #ifdef TRACE
148         cout << "Visual3d_ViewManager::ChangeDisplayPriority ("
149              << AStructure->Identification ()
150              << ", " << OldPriority << ", " << NewPriority << ")\n";
151         cout << flush;
152 #endif
153
154         //
155         // Change structure priority in all defined views
156         //
157         Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
158  
159         while (MyIterator.More ()) {
160                 (MyIterator.Value ())->ChangeDisplayPriority
161                         (AStructure, OldPriority, NewPriority);
162
163                 // MyIterator.Next () is located on the next view
164                 MyIterator.Next ();
165         }
166
167 }
168
169 void Visual3d_ViewManager::ReCompute (const Handle(Graphic3d_Structure)& AStructure) { 
170
171   //Standard_Integer LengthD    = MyDisplayedStructure.Extent() ();
172
173   // Even if physically the structure cannot
174   // be displayed (pb of visualisation type)
175   // it has status Displayed.
176  
177   if (!MyDisplayedStructure.Contains(AStructure))
178     return;
179
180   //
181   // Recompute structure in all activated views
182   //
183   Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
184  
185   while (MyIterator.More ()) {
186     (MyIterator.Value ())->ReCompute (AStructure);
187
188     // MyIterator.Next () is located on the next view
189     MyIterator.Next ();
190   }
191   
192 }
193
194 void Visual3d_ViewManager::ReCompute (const Handle(Graphic3d_Structure)& AStructure, 
195                                       const Handle(Graphic3d_DataStructureManager)& AProjector) 
196
197
198   if (! AProjector->IsKind (STANDARD_TYPE (Visual3d_View))) return;
199
200 #ifdef DOWNCAST
201   Handle(Visual3d_View) theView = Handle(Visual3d_View)::DownCast (AProjector);
202 #else
203   Handle(Visual3d_View) theView = *(Handle(Visual3d_View) *) &AProjector;
204 #endif
205   Standard_Integer ViewId = theView->Identification ();
206
207   // Even if physically the structure cannot
208   // be displayed (pb of visualisation type)
209   // it has status Displayed.
210   if (!MyDisplayedStructure.Contains(AStructure))
211     return;
212         
213   //
214   // Recompute structure in all activated views
215   //
216   Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
217  
218   while (MyIterator.More ()) {
219     if ((MyIterator.Value ())->Identification () == ViewId)
220       theView->ReCompute (AStructure);
221
222     // MyIterator.Next () is located on the next view
223     MyIterator.Next ();
224   }
225
226 }
227
228 void Visual3d_ViewManager::Clear (const Handle(Graphic3d_Structure)& AStructure, const Standard_Boolean WithDestruction) {
229
230         Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
231  
232         while (MyIterator.More ()) {
233                 (MyIterator.Value ())->Clear (AStructure, WithDestruction);
234
235                 // MyIterator.Next ()  is located on the next view
236                 MyIterator.Next ();
237         }
238
239 }
240
241 void Visual3d_ViewManager::Connect (const Handle(Graphic3d_Structure)& AMother, const Handle(Graphic3d_Structure)& ADaughter) {
242
243         Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
244  
245         while (MyIterator.More ()) {
246                 (MyIterator.Value ())->Connect (AMother, ADaughter);
247
248                 // MyIterator.Next ()  is located on the next view
249                 MyIterator.Next ();
250         }
251
252 }
253
254 void Visual3d_ViewManager::Disconnect (const Handle(Graphic3d_Structure)& AMother, const Handle(Graphic3d_Structure)& ADaughter) {
255
256         Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
257  
258         while (MyIterator.More ()) {
259                 (MyIterator.Value ())->Disconnect (AMother, ADaughter);
260
261                 // MyIterator.Next ()  is located on the next view
262                 MyIterator.Next ();
263         }
264
265 }
266
267 void Visual3d_ViewManager::Display (const Handle(Graphic3d_Structure)& AStructure) { 
268
269
270  // Even if physically the structure cannot
271   // be displayed (pb of visualisation type)
272   // it has status Displayed.
273
274   MyDisplayedStructure.Add(AStructure);
275
276         //
277         // Display structure in all activated views
278         //
279         Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
280  
281         while (MyIterator.More ()) {
282                 (MyIterator.Value ())->Display (AStructure);
283
284                 // MyIterator.Next () is located on the next view
285                 MyIterator.Next ();
286         }
287
288 }
289
290 void Visual3d_ViewManager::Erase (const Handle(Graphic3d_Structure)& AStructure) {
291
292
293 // Even if physically the structure cannot
294   // be displayed (pb of visualisation type)
295   // it has status Displayed.
296
297  MyDisplayedStructure.Remove(AStructure);
298
299
300
301         //
302         // Erase structure in all defined views
303         //
304         Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
305  
306         while (MyIterator.More ()) {
307                 (MyIterator.Value ())->Erase (AStructure);
308
309                 // MyIterator.Next () is located on the next view
310                 MyIterator.Next ();
311         }
312
313         MyHighlightedStructure.Remove (AStructure);
314         MyVisibleStructure.Remove (AStructure);
315         MyPickStructure.Remove (AStructure);
316
317 }
318
319 void Visual3d_ViewManager::Erase () {
320
321  Graphic3d_MapIteratorOfMapOfStructure it( MyDisplayedStructure);
322  
323  for (; it.More(); it.Next()) {
324    Handle(Graphic3d_Structure) SG = it.Key();
325    SG->Erase();
326  }
327
328 }
329
330 void Visual3d_ViewManager::Highlight (const Handle(Graphic3d_Structure)& AStructure, const Aspect_TypeOfHighlightMethod AMethod) {
331
332   MyHighlightedStructure.Add(AStructure);
333
334         //
335         // Highlight in all activated views
336         //
337         Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
338  
339         while (MyIterator.More ()) {
340                 (MyIterator.Value ())->Highlight (AStructure, AMethod);
341
342                 // MyIterator.Next () is located on the next view
343                 MyIterator.Next ();
344         }
345
346 }
347
348 void Visual3d_ViewManager::SetTransform (const Handle(Graphic3d_Structure)& AStructure, const TColStd_Array2OfReal& ATrsf) {
349
350         Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
351  
352         while (MyIterator.More ()) {
353                 (MyIterator.Value ())->SetTransform (AStructure, ATrsf);
354
355                 // MyIterator.Next () is located on the next view
356                 MyIterator.Next ();
357         }
358
359 }
360
361 void Visual3d_ViewManager::UnHighlight () {
362
363   Graphic3d_MapIteratorOfMapOfStructure it(MyHighlightedStructure);
364   
365   for (; it.More(); it.Next()) {
366     Handle(Graphic3d_Structure) SG = it.Key();
367     SG->UnHighlight ();
368   }
369
370
371 }
372
373 void Visual3d_ViewManager::UnHighlight (const Handle(Graphic3d_Structure)& AStructure) {
374
375   MyHighlightedStructure.Remove(AStructure);
376
377
378         //
379         // UnHighlight in all activated views
380         //
381         Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
382  
383         while (MyIterator.More ()) {
384                 (MyIterator.Value ())->UnHighlight (AStructure);
385
386                 // MyIterator.Next () is located on the next view
387                 MyIterator.Next ();
388         }
389
390 }
391
392 void Visual3d_ViewManager::Redraw () const {
393
394 Standard_Integer MaxDx, MaxDy;
395 Standard_Integer Dx, Dy;
396         MaxDx = MaxDy = IntegerFirst ();
397
398         //
399         // Redraw all activated views
400         //
401         Standard_Integer j = MyDefinedView.Extent ();
402         if (j == 0) return;
403         Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
404  
405         if (! MyUnderLayer.IsNull () || ! MyOverLayer.IsNull ()) {
406             while (MyIterator.More ()) {
407                 (MyIterator.Value ())->Window ()->Size (Dx, Dy);
408                 if (Dx > MaxDx) MaxDx = Dx;
409                 if (Dy > MaxDy) MaxDy = Dy;
410
411                 // MyIterator.Next () is located on the next view
412                 MyIterator.Next ();
413             }
414             if (! MyUnderLayer.IsNull ())
415                 MyUnderLayer->SetViewport (MaxDx, MaxDy);
416             if (! MyOverLayer.IsNull ())
417                 MyOverLayer->SetViewport (MaxDx, MaxDy);
418         }
419  
420         if (! MyUnderLayer.IsNull () || ! MyOverLayer.IsNull ())
421             MyIterator.Initialize (MyDefinedView);
422         while (MyIterator.More ()) {
423             (MyIterator.Value ())->Redraw (MyUnderLayer, MyOverLayer);
424
425             // MyIterator.Next () is located on the next view
426             MyIterator.Next ();
427         }
428
429 }
430
431 void Visual3d_ViewManager::Update () const {
432
433         //
434         // Update all activated views
435         //
436         Standard_Integer j = MyDefinedView.Extent ();
437         if (j == 0) return;
438         Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
439  
440         while (MyIterator.More ()) {
441                 (MyIterator.Value ())->Update (MyUnderLayer, MyOverLayer);
442
443                 // MyIterator.Next () is located on the next view
444                 MyIterator.Next ();
445         }
446
447 }
448
449 Handle(Visual3d_HSetOfView) Visual3d_ViewManager::ActivatedView () const {
450
451 Handle (Visual3d_HSetOfView) SG = new Visual3d_HSetOfView ();
452
453 Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
454
455         while (MyIterator.More ()) {
456                 if ((MyIterator.Value ())->IsActive ())
457                         SG->Add (MyIterator.Value ());
458
459                 // MyIterator.Next () is located on the next view
460                 MyIterator.Next ();
461         }
462
463         return (SG);
464
465 }
466
467 #ifdef IMPLEMENTED
468 Standard_Boolean Visual3d_ViewManager::ContainsComputedStructure () const {
469
470 Standard_Boolean Result = Standard_False;
471
472         //
473         // Check all activated views
474         //
475         Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
476
477         Standard_Integer i      = MyDefinedView.Extent ();
478
479         while ((! Result) && (MyIterator.More ())) {
480                 if ((MyIterator.Value ())->IsActive ())
481                         Result  =
482                         (MyIterator.Value ())->ContainsComputedStructure ();
483
484                 // MyIterator.Next () is located on the next view
485                 MyIterator.Next ();
486         }
487
488         return Result;
489 }
490 #endif
491
492 Handle(Visual3d_HSetOfView) Visual3d_ViewManager::DefinedView () const {
493
494 Handle (Visual3d_HSetOfView) SG = new Visual3d_HSetOfView ();
495
496 Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
497
498         while (MyIterator.More ()) {
499                 SG->Add (MyIterator.Value ());
500
501                 // MyIterator.Next () is located on the next view
502                 MyIterator.Next ();
503         }
504
505         return (SG);
506
507 }
508
509 void Visual3d_ViewManager::ConvertCoord (const Handle(Aspect_Window)& AWindow, const Graphic3d_Vertex& AVertex, Standard_Integer& AU, Standard_Integer& AV) const {
510
511 // Convert only if the data is correct
512 Standard_Boolean Exist;
513 Graphic3d_CView  TheCView;
514 //Graphic3d_Vertex Point;
515
516 TColStd_Array2OfReal Ori_Matrix (0,3,0,3);
517 TColStd_Array2OfReal Map_Matrix (0,3,0,3);
518
519 Standard_Integer Width, Height;
520 Standard_Real AX, AY, AZ;
521 Standard_Real Dx, Dy, Ratio;
522
523         Exist   = ViewExists (AWindow, TheCView);
524
525         if (! Exist) {
526                 AU = AV = IntegerLast ();
527         }
528         else {
529     // NKV - 11.02.08 - Use graphic driver functions
530     Standard_Boolean Result;
531
532     AVertex.Coord (AX, AY, AZ);
533
534     Result = MyGraphicDriver->ProjectRaster (TheCView, 
535       Standard_ShortReal (AX), Standard_ShortReal (AY), Standard_ShortReal (AZ),
536       AU, AV);
537
538     // the old code
539     if (!Result) {
540
541       Standard_Real PtX, PtY, PtZ, PtT;
542       Standard_Real APX, APY, APZ;
543       Standard_Real APT;
544
545       Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
546
547       Standard_Integer stop = 0;
548
549       while ((! stop) && (MyIterator.More ())) {
550         if (TheCView.ViewId ==
551             (MyIterator.Value ())->Identification ()) {
552           Ori_Matrix    =
553             (MyIterator.Value ())->MatrixOfOrientation ();
554           Map_Matrix    =
555             (MyIterator.Value ())->MatrixOfMapping ();
556           stop  = 1;
557         }
558
559         // MyIterator.Next () is located on the next view
560         MyIterator.Next ();
561       }
562
563
564       // WCS -> View Reference Coordinate Space
565       PtX       = Ori_Matrix (0, 0) * AX
566                 + Ori_Matrix (0, 1) * AY
567                 + Ori_Matrix (0, 2) * AZ
568                 + Ori_Matrix (0, 3);
569       PtY       = Ori_Matrix (1, 0) * AX
570                 + Ori_Matrix (1, 1) * AY
571                 + Ori_Matrix (1, 2) * AZ
572                 + Ori_Matrix (1, 3);
573       PtZ       = Ori_Matrix (2, 0) * AX
574                 + Ori_Matrix (2, 1) * AY
575                 + Ori_Matrix (2, 2) * AZ
576                 + Ori_Matrix (2, 3);
577       PtT       = Ori_Matrix (3, 0) * AX
578                 + Ori_Matrix (3, 1) * AY
579                 + Ori_Matrix (3, 2) * AZ
580                 + Ori_Matrix (3, 3);
581
582       // VRCS -> Normalized Projection Coordinate Space
583       APX       = Map_Matrix (0, 0) * PtX
584                 + Map_Matrix (0, 1) * PtY
585                 + Map_Matrix (0, 2) * PtZ
586                 + Map_Matrix (0, 3) * PtT;
587       APY       = Map_Matrix (1, 0) * PtX
588                 + Map_Matrix (1, 1) * PtY
589                 + Map_Matrix (1, 2) * PtZ
590                 + Map_Matrix (1, 3) * PtT;
591       APZ       = Map_Matrix (2, 0) * PtX
592                 + Map_Matrix (2, 1) * PtY
593                 + Map_Matrix (2, 2) * PtZ
594                 + Map_Matrix (2, 3) * PtT;
595       APT       = Map_Matrix (3, 0) * PtX
596                 + Map_Matrix (3, 1) * PtY
597                 + Map_Matrix (3, 2) * PtZ
598                 + Map_Matrix (3, 3) * PtT;
599
600       if (APT == 0. || stop == 0) {
601         AU = AV = IntegerLast ();
602       }
603       else {
604         APX /= APT;
605         APY /= APT;
606         APZ /= APT;
607
608         // NPCS -> Device Coordinate Space
609         AWindow->Size (Width, Height);
610         Dx      = Standard_Real (Width);
611         Dy      = Standard_Real (Height);
612         Ratio   = Dx / Dy;
613         if (Ratio >= 1.) {
614           AU = Standard_Integer (APX * Dx);
615           AV = Standard_Integer (Dy - APY * Dy * Ratio);
616         }
617         else {
618           AU = Standard_Integer (APX * Dx / Ratio);
619           AV = Standard_Integer (Dy - APY * Dy);
620         }
621       }
622     }
623   }
624
625 }
626
627 Graphic3d_Vertex Visual3d_ViewManager::ConvertCoord (const Handle(Aspect_Window)& AWindow, const Standard_Integer AU, const Standard_Integer AV) const {
628
629 // Convert only if the data is correct
630 Graphic3d_CView TheCView;
631 Graphic3d_Vertex Point;
632
633         if (! ViewExists (AWindow, TheCView))
634             Point.SetCoord (RealLast (), RealLast (), RealLast ());
635         else {
636 Standard_Integer Width, Height;
637 Standard_ShortReal x, y, z;
638 Standard_Boolean Result;
639
640             AWindow->Size (Width, Height);
641
642             Result      = MyGraphicDriver->UnProjectRaster (TheCView,
643                                 0, 0, Width, Height,
644                                 AU, AV, x, y, z);
645
646             // unproject is done by UnProjectRaster
647             if (Result) {
648                 Point.SetCoord
649                     (Standard_Real (x), Standard_Real (y), Standard_Real (z));
650             }
651             // unproject cannot be done by UnProjectRaster
652             // Code suspended since drivers Phigs and Pex are abandoned.
653             else {
654
655 Standard_Real NPCX, NPCY, NPCZ;
656 Standard_Real VRCX, VRCY, VRCZ, VRCT;
657 Standard_Real WCX, WCY, WCZ, WCT;
658
659 TColStd_Array2OfReal TOri_Matrix (0,3,0,3);
660 TColStd_Array2OfReal TMap_Matrix (0,3,0,3);
661 TColStd_Array2OfReal TOri_Matrix_Inv (0,3,0,3);
662 TColStd_Array2OfReal TMap_Matrix_Inv (0,3,0,3);
663
664 Standard_Real Dx, Dy, Ratio;
665 Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
666 Standard_Integer j;
667
668 Standard_Integer stop = 0;
669
670 Standard_Boolean BResult;
671
672                 j = MyDefinedView.Extent ();
673
674                 while ((! stop) && (MyIterator.More ())) {
675                     if (TheCView.ViewId ==
676                         (MyIterator.Value ())->Identification ()) {
677                         TOri_Matrix     =
678                                 (MyIterator.Value ())->MatrixOfOrientation ();
679                         TMap_Matrix     =
680                                 (MyIterator.Value ())->MatrixOfMapping ();
681                         stop    = 1;
682                     }
683
684                     // MyIterator.Next () is located on the next view
685                     MyIterator.Next ();
686                 }
687
688                 // View Mapping Transformation and View Clip, inversion
689                 BResult = Aspect::Inverse (TMap_Matrix, TMap_Matrix_Inv);
690
691                 // View Orientation Transformation, inversion
692                 BResult = Aspect::Inverse (TOri_Matrix, TOri_Matrix_Inv);
693
694                 // (AU, AV) : Device Coordinate Space
695                 // DCS -> NPCS Normalized Projection Coordinate Space
696                 Dx      = Standard_Real (Width);
697                 Dy      = Standard_Real (Height);
698                 Ratio   = Dx / Dy;
699
700                 if (Ratio >= 1.) {
701                         NPCX    = Standard_Real (AU) / Dx;
702                         NPCY    = (Dy - Standard_Real (AV)) / Dx;
703                 }
704                 else {
705                         NPCX    = Standard_Real (AU) / Dy;
706                         NPCY    = (Dy - Standard_Real (AV)) / Dy;
707                 }
708                 NPCZ    = 0.0;
709
710                 // NPCS -> VRCS View Reference Coordinate Space
711                 // PtVRC = Map_Matrix_Inv.Multiplied (PtNPC);
712
713                 VRCX    = TMap_Matrix_Inv (0, 0) * NPCX
714                         + TMap_Matrix_Inv (0, 1) * NPCY
715                         + TMap_Matrix_Inv (0, 2) * NPCZ
716                         + TMap_Matrix_Inv (0, 3);
717                 VRCY    = TMap_Matrix_Inv (1, 0) * NPCX
718                         + TMap_Matrix_Inv (1, 1) * NPCY
719                         + TMap_Matrix_Inv (1, 2) * NPCZ
720                         + TMap_Matrix_Inv (1, 3);
721                 VRCZ    = TMap_Matrix_Inv (2, 0) * NPCX
722                         + TMap_Matrix_Inv (2, 1) * NPCY
723                         + TMap_Matrix_Inv (2, 2) * NPCZ
724                         + TMap_Matrix_Inv (2, 3);
725                 VRCT    = TMap_Matrix_Inv (3, 0) * NPCX
726                         + TMap_Matrix_Inv (3, 1) * NPCY
727                         + TMap_Matrix_Inv (3, 2) * NPCZ
728                         + TMap_Matrix_Inv (3, 3);
729
730                 // VRCS -> WCS World Coordinate Space
731                 // PtWC = Ori_Matrix_Inv.Multiplied (PtVRC);
732
733                 WCX     = TOri_Matrix_Inv (0, 0) * VRCX
734                         + TOri_Matrix_Inv (0, 1) * VRCY
735                         + TOri_Matrix_Inv (0, 2) * VRCZ
736                         + TOri_Matrix_Inv (0, 3) * VRCT;
737                 WCY     = TOri_Matrix_Inv (1, 0) * VRCX
738                         + TOri_Matrix_Inv (1, 1) * VRCY
739                         + TOri_Matrix_Inv (1, 2) * VRCZ
740                         + TOri_Matrix_Inv (1, 3) * VRCT;
741                 WCZ     = TOri_Matrix_Inv (2, 0) * VRCX
742                         + TOri_Matrix_Inv (2, 1) * VRCY
743                         + TOri_Matrix_Inv (2, 2) * VRCZ
744                         + TOri_Matrix_Inv (2, 3) * VRCT;
745                 WCT     = TOri_Matrix_Inv (3, 0) * VRCX
746                         + TOri_Matrix_Inv (3, 1) * VRCY
747                         + TOri_Matrix_Inv (3, 2) * VRCZ
748                         + TOri_Matrix_Inv (3, 3) * VRCT;
749
750                 if (WCT != 0.)
751                     Point.SetCoord (WCX/WCT, WCY/WCT, WCZ/WCT);
752                 else
753                     Point.SetCoord (RealLast (), RealLast (), RealLast ());
754             }
755         }
756
757         return (Point);
758
759 }
760
761 void Visual3d_ViewManager::ConvertCoordWithProj (const Handle(Aspect_Window)& AWindow, const Standard_Integer AU, const Standard_Integer AV, Graphic3d_Vertex& Point, Graphic3d_Vector& Proj) const {
762
763 // Conversion only if the data is correct
764 Graphic3d_CView TheCView;
765
766         if (! ViewExists (AWindow, TheCView)) {
767             Point.SetCoord (RealLast (), RealLast (), RealLast ());
768             Proj.SetCoord (0., 0., 0.);
769         }
770         else {
771 Standard_Integer Width, Height;
772 Standard_ShortReal x, y, z;
773 Standard_ShortReal dx, dy, dz;
774 Standard_Boolean Result;
775
776             AWindow->Size (Width, Height);
777
778             Result      = MyGraphicDriver->UnProjectRasterWithRay (TheCView,
779                                 0, 0, Width, Height,
780                                 AU, AV, x, y, z, dx, dy, dz);
781
782             // unproject is done by UnProjectRaster
783             if (Result) {
784                 Point.SetCoord
785                     (Standard_Real (x), Standard_Real (y), Standard_Real (z));
786                 Proj.SetCoord
787                     (Standard_Real (dx), Standard_Real (dy), Standard_Real (dz));
788                 Proj.Normalize();
789             }
790             // unproject cannot be done by UnProjectRaster
791             // Code is suspended since drivers Phigs are Pex abandoned.
792             else {
793
794 Standard_Real NPCX, NPCY, NPCZ;
795 Standard_Real VRCX, VRCY, VRCZ, VRCT;
796 Standard_Real WCX, WCY, WCZ, WCT;
797
798 TColStd_Array2OfReal TOri_Matrix (0,3,0,3);
799 TColStd_Array2OfReal TMap_Matrix (0,3,0,3);
800 TColStd_Array2OfReal TOri_Matrix_Inv (0,3,0,3);
801 TColStd_Array2OfReal TMap_Matrix_Inv (0,3,0,3);
802
803 Standard_Real Dx, Dy, Ratio;
804 Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
805 Standard_Integer j;
806
807 Standard_Integer stop = 0;
808
809 Standard_Boolean BResult;
810
811                 j = MyDefinedView.Extent ();
812
813                 while ((! stop) && (MyIterator.More ())) {
814                     if (TheCView.ViewId ==
815                         (MyIterator.Value ())->Identification ()) {
816                         TOri_Matrix     =
817                                 (MyIterator.Value ())->MatrixOfOrientation ();
818                         TMap_Matrix     =
819                                 (MyIterator.Value ())->MatrixOfMapping ();
820                         stop    = 1;
821                     }
822
823                     // MyIterator.Next () is located on the next view
824                     MyIterator.Next ();
825                 }
826
827                 // View Mapping Transformation and View Clip, inversion
828                 BResult = Aspect::Inverse (TMap_Matrix, TMap_Matrix_Inv);
829
830                 // View Orientation Transformation, inversion
831                 BResult = Aspect::Inverse (TOri_Matrix, TOri_Matrix_Inv);
832
833                 // (AU, AV) : Device Coordinate Space
834                 // DCS -> NPCS Normalized Projection Coordinate Space
835                 Dx      = Standard_Real (Width);
836                 Dy      = Standard_Real (Height);
837                 Ratio   = Dx / Dy;
838
839                 if (Ratio >= 1.) {
840                         NPCX    = Standard_Real (AU) / Dx;
841                         NPCY    = (Dy - Standard_Real (AV)) / Dx;
842                 }
843                 else {
844                         NPCX    = Standard_Real (AU) / Dy;
845                         NPCY    = (Dy - Standard_Real (AV)) / Dy;
846                 }
847                 NPCZ    = 0.0;
848
849                 // NPCS -> VRCS View Reference Coordinate Space
850                 // PtVRC = Map_Matrix_Inv.Multiplied (PtNPC);
851
852                 VRCX    = TMap_Matrix_Inv (0, 0) * NPCX
853                         + TMap_Matrix_Inv (0, 1) * NPCY
854                         + TMap_Matrix_Inv (0, 2) * NPCZ
855                         + TMap_Matrix_Inv (0, 3);
856                 VRCY    = TMap_Matrix_Inv (1, 0) * NPCX
857                         + TMap_Matrix_Inv (1, 1) * NPCY
858                         + TMap_Matrix_Inv (1, 2) * NPCZ
859                         + TMap_Matrix_Inv (1, 3);
860                 VRCZ    = TMap_Matrix_Inv (2, 0) * NPCX
861                         + TMap_Matrix_Inv (2, 1) * NPCY
862                         + TMap_Matrix_Inv (2, 2) * NPCZ
863                         + TMap_Matrix_Inv (2, 3);
864                 VRCT    = TMap_Matrix_Inv (3, 0) * NPCX
865                         + TMap_Matrix_Inv (3, 1) * NPCY
866                         + TMap_Matrix_Inv (3, 2) * NPCZ
867                         + TMap_Matrix_Inv (3, 3);
868
869                 // VRCS -> WCS World Coordinate Space
870                 // PtWC = Ori_Matrix_Inv.Multiplied (PtVRC);
871
872                 WCX     = TOri_Matrix_Inv (0, 0) * VRCX
873                         + TOri_Matrix_Inv (0, 1) * VRCY
874                         + TOri_Matrix_Inv (0, 2) * VRCZ
875                         + TOri_Matrix_Inv (0, 3) * VRCT;
876                 WCY     = TOri_Matrix_Inv (1, 0) * VRCX
877                         + TOri_Matrix_Inv (1, 1) * VRCY
878                         + TOri_Matrix_Inv (1, 2) * VRCZ
879                         + TOri_Matrix_Inv (1, 3) * VRCT;
880                 WCZ     = TOri_Matrix_Inv (2, 0) * VRCX
881                         + TOri_Matrix_Inv (2, 1) * VRCY
882                         + TOri_Matrix_Inv (2, 2) * VRCZ
883                         + TOri_Matrix_Inv (2, 3) * VRCT;
884                 WCT     = TOri_Matrix_Inv (3, 0) * VRCX
885                         + TOri_Matrix_Inv (3, 1) * VRCY
886                         + TOri_Matrix_Inv (3, 2) * VRCZ
887                         + TOri_Matrix_Inv (3, 3) * VRCT;
888
889                 if (WCT != 0.)
890                     Point.SetCoord (WCX/WCT, WCY/WCT, WCZ/WCT);
891                 else
892                     Point.SetCoord (RealLast (), RealLast (), RealLast ());
893
894                 // Define projection ray
895                 NPCZ    = 10.0;
896
897                 // NPCS -> VRCS View Reference Coordinate Space
898                 // PtVRC = Map_Matrix_Inv.Multiplied (PtNPC);
899
900                 VRCX    = TMap_Matrix_Inv (0, 0) * NPCX
901                         + TMap_Matrix_Inv (0, 1) * NPCY
902                         + TMap_Matrix_Inv (0, 2) * NPCZ
903                         + TMap_Matrix_Inv (0, 3);
904                 VRCY    = TMap_Matrix_Inv (1, 0) * NPCX
905                         + TMap_Matrix_Inv (1, 1) * NPCY
906                         + TMap_Matrix_Inv (1, 2) * NPCZ
907                         + TMap_Matrix_Inv (1, 3);
908                 VRCZ    = TMap_Matrix_Inv (2, 0) * NPCX
909                         + TMap_Matrix_Inv (2, 1) * NPCY
910                         + TMap_Matrix_Inv (2, 2) * NPCZ
911                         + TMap_Matrix_Inv (2, 3);
912                 VRCT    = TMap_Matrix_Inv (3, 0) * NPCX
913                         + TMap_Matrix_Inv (3, 1) * NPCY
914                         + TMap_Matrix_Inv (3, 2) * NPCZ
915                         + TMap_Matrix_Inv (3, 3);
916
917                 // VRCS -> WCS World Coordinate Space
918                 // PtWC = Ori_Matrix_Inv.Multiplied (PtVRC);
919
920                 WCX     = TOri_Matrix_Inv (0, 0) * VRCX
921                         + TOri_Matrix_Inv (0, 1) * VRCY
922                         + TOri_Matrix_Inv (0, 2) * VRCZ
923                         + TOri_Matrix_Inv (0, 3) * VRCT;
924                 WCY     = TOri_Matrix_Inv (1, 0) * VRCX
925                         + TOri_Matrix_Inv (1, 1) * VRCY
926                         + TOri_Matrix_Inv (1, 2) * VRCZ
927                         + TOri_Matrix_Inv (1, 3) * VRCT;
928                 WCZ     = TOri_Matrix_Inv (2, 0) * VRCX
929                         + TOri_Matrix_Inv (2, 1) * VRCY
930                         + TOri_Matrix_Inv (2, 2) * VRCZ
931                         + TOri_Matrix_Inv (2, 3) * VRCT;
932                 WCT     = TOri_Matrix_Inv (3, 0) * VRCX
933                         + TOri_Matrix_Inv (3, 1) * VRCY
934                         + TOri_Matrix_Inv (3, 2) * VRCZ
935                         + TOri_Matrix_Inv (3, 3) * VRCT;
936
937                 if (WCT != 0.) {
938                     Proj.SetCoord (WCX/WCT, WCY/WCT, WCZ/WCT);
939                     Proj.Normalize();
940                 }
941                 else
942                     Proj.SetCoord (0., 0., 0.);
943             }
944         }
945
946 }
947
948
949 Standard_Boolean Visual3d_ViewManager::ViewExists (const Handle(Aspect_Window)& AWindow, Graphic3d_CView& TheCView) const {
950
951 Standard_Boolean Exist = Standard_False;
952
953         // Parse the list of views to find
954         // a view with the specified window
955         Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
956         int TheWindowIdOfView;
957
958 #ifndef WNT
959 const Handle(Xw_Window) THEWindow = *(Handle(Xw_Window) *) &AWindow;
960         int TheSpecifiedWindowId = int (THEWindow->XWindow ());
961 #else
962 const Handle(WNT_Window) THEWindow = *(Handle(WNT_Window) *) &AWindow;
963         int TheSpecifiedWindowId = int (THEWindow->HWindow ());
964 #endif  // WNT
965
966         while ((! Exist) && (MyIterator.More ())) {
967
968            if ( ((MyIterator.Value ())->IsDefined ()) &&
969                 ((MyIterator.Value ())->IsActive ()) ) {
970
971 const Handle(Aspect_Window) AspectWindow = (MyIterator.Value ())->Window ();
972 #ifndef WNT
973 const Handle(Xw_Window) theWindow = *(Handle(Xw_Window) *) &AspectWindow;
974         TheWindowIdOfView = int (theWindow->XWindow ());
975 #else
976 const Handle(WNT_Window) theWindow = *(Handle(WNT_Window) *) &AspectWindow;
977         TheWindowIdOfView = int (theWindow->HWindow ());
978 #endif  // WNT
979                 // Comparaison on window IDs
980                 if (TheWindowIdOfView == TheSpecifiedWindowId) {
981                         Exist   = Standard_True;
982                         TheCView        = *(CALL_DEF_VIEW *)(MyIterator.Value ())->CView ();
983                 }
984            } /* if ((MyIterator.Value ())->IsDefined ()) */
985
986            // MyIterator.Next () is located on the next view
987            MyIterator.Next ();
988         }
989
990         return (Exist);
991
992 }
993
994 void Visual3d_ViewManager::Activate () {
995
996         //
997         // Activates all deactivated views
998         //
999         Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
1000  
1001         while (MyIterator.More ()) {
1002                 if (! (MyIterator.Value ())->IsActive ())
1003                         (MyIterator.Value ())->Activate ();
1004
1005                 // MyIterator.Next () is located on the next view
1006                 MyIterator.Next ();
1007         }
1008
1009 }
1010
1011 void Visual3d_ViewManager::Deactivate () {
1012
1013         //
1014         // Deactivates all activated views
1015         //
1016         Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
1017  
1018         while (MyIterator.More ()) {
1019                 if ((MyIterator.Value ())->IsActive ())
1020                         (MyIterator.Value ())->Deactivate ();
1021
1022                 // MyIterator.Next () is located on the next view
1023                 MyIterator.Next ();
1024         }
1025
1026 }
1027
1028 Standard_Integer Visual3d_ViewManager::MaxNumOfViews () const {
1029
1030         // Retourne the planned of definable views for the current
1031         // Visual3d_ViewManager.
1032         return
1033 (Standard_Integer ((View_IDMAX-View_IDMIN+1)/Visual3d_ViewManager::Limit ()));
1034
1035 }
1036
1037 Handle(Graphic3d_Structure) Visual3d_ViewManager::Identification (const Standard_Integer AId) const {
1038
1039         return (Graphic3d_StructureManager::Identification (AId));
1040
1041 }
1042
1043 Standard_Integer Visual3d_ViewManager::Identification () const {
1044  
1045         return (Graphic3d_StructureManager::Identification ());
1046
1047 }
1048
1049 Standard_Integer Visual3d_ViewManager::Identification (const Handle(Visual3d_View)& AView) {
1050
1051         MyDefinedView.Add (AView);
1052         return (MyViewGenId.Next ());
1053
1054 }
1055
1056 void Visual3d_ViewManager::UnIdentification (const Standard_Integer aViewId)
1057 {
1058   MyViewGenId.Free(aViewId);
1059 }
1060
1061 void Visual3d_ViewManager::SetTransparency (const Standard_Boolean AFlag) {
1062
1063         if (MyTransparency && AFlag) return;
1064         if (! MyTransparency && ! AFlag) return;
1065
1066         Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
1067         while (MyIterator.More ()) {
1068                 (MyIterator.Value ())->SetTransparency (AFlag);
1069                 // MyIterator.Next () is located on the next view
1070                 MyIterator.Next ();
1071         }
1072
1073         MyTransparency  = AFlag;
1074
1075 }
1076
1077 Standard_Boolean Visual3d_ViewManager::Transparency () const {
1078
1079         return (MyTransparency);
1080
1081 }
1082
1083 void Visual3d_ViewManager::SetZBufferAuto (const Standard_Boolean AFlag) {
1084
1085         if (MyZBufferAuto && AFlag) return;
1086         if (! MyZBufferAuto && ! AFlag) return;
1087
1088         // if pass from False to True :
1089         // no problem, at the next view update, it 
1090         // will properly ask questions to answer (SetVisualisation)
1091         // if pass from True to False :
1092         // it is necessary to modify ZBufferActivity at each view so that
1093         // zbuffer could be active only if required by context.
1094         // In this case -1 is passed so that the view ask itself the question
1095         // Note : 0 forces the desactivation, 1 forces the activation
1096         if (! AFlag) {
1097                 Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
1098                 while (MyIterator.More ()) {
1099                         (MyIterator.Value ())->SetZBufferActivity (-1);
1100                         // MyIterator.Next () is located on the next view
1101                         MyIterator.Next ();
1102                 }
1103         }
1104         MyZBufferAuto   = AFlag;
1105
1106 }
1107
1108 Standard_Boolean Visual3d_ViewManager::ZBufferAuto () const {
1109
1110         return (MyZBufferAuto);
1111
1112 }
1113
1114 void Visual3d_ViewManager::SetLayer (const Handle(Visual3d_Layer)& ALayer) {
1115
1116 #ifdef TRACE_LAYER
1117         cout << "Visual3d_ViewManager::SetLayer\n" << flush;
1118 #endif
1119
1120         if (ALayer->Type () == Aspect_TOL_OVERLAY) {
1121 #ifdef TRACE_LAYER
1122                 if (MyOverLayer.IsNull ())
1123                         cout << "MyOverLayer is defined" << endl;
1124                 else
1125                         cout << "MyOverLayer is redefined" << endl;
1126 #endif
1127                 MyOverLayer = ALayer;
1128         }
1129         else {
1130 #ifdef TRACE_LAYER
1131                 if (MyUnderLayer.IsNull ())
1132                         cout << "MyUnderLayer is defined" << endl;
1133                 else
1134                         cout << "MyUnderLayer is redefined" << endl;
1135 #endif
1136                 MyUnderLayer = ALayer;
1137         }
1138
1139 }
1140
1141 const Handle(Visual3d_Layer)& Visual3d_ViewManager::UnderLayer () const {
1142
1143         return (MyUnderLayer);
1144
1145 }
1146
1147 const Handle(Visual3d_Layer)& Visual3d_ViewManager::OverLayer () const {
1148
1149         return (MyOverLayer);
1150
1151 }
1152
1153 //=======================================================================
1154 //function : ChangeZLayer
1155 //purpose  : 
1156 //=======================================================================
1157
1158 void Visual3d_ViewManager::ChangeZLayer (const Handle(Graphic3d_Structure)& theStructure,
1159                                          const Standard_Integer theLayerId)
1160 {
1161   if (!myLayerIds.Contains (theLayerId))
1162     return;
1163   
1164   // change display layer for structure in all views
1165   if (MyDisplayedStructure.Contains (theStructure))
1166   {
1167     Visual3d_SetIteratorOfSetOfView aViewIt(MyDefinedView);
1168     for ( ; aViewIt.More (); aViewIt.Next ())
1169       (aViewIt.Value ())->ChangeZLayer (theStructure, theLayerId);
1170   }
1171   
1172   // tell graphic driver to update the structure's display layer
1173   MyGraphicDriver->ChangeZLayer (
1174     (*(Graphic3d_CStructure*)theStructure->CStructure ()), theLayerId);
1175 }
1176
1177 //=======================================================================
1178 //function : GetZLayer
1179 //purpose  :
1180 //=======================================================================
1181
1182 Standard_Integer Visual3d_ViewManager::GetZLayer (const Handle(Graphic3d_Structure)& theStructure) const
1183 {
1184   Graphic3d_CStructure& aStructure =
1185     (*(Graphic3d_CStructure*)theStructure->CStructure ());
1186
1187   return MyGraphicDriver->GetZLayer (aStructure);
1188 }
1189
1190 //=======================================================================
1191 //function : AddZLayer
1192 //purpose  :
1193 //=======================================================================
1194
1195 Standard_Boolean Visual3d_ViewManager::AddZLayer (Standard_Integer& theLayerId)
1196 {
1197   try
1198   {
1199     OCC_CATCH_SIGNALS
1200     theLayerId = getZLayerGenId ().Next ();
1201     myLayerIds.Add (theLayerId);
1202     myLayerSeq.Append (theLayerId);
1203   }
1204   catch (Aspect_IdentDefinitionError)
1205   {
1206     // new index can't be generated
1207     return Standard_False;
1208   }
1209
1210   // tell all managed views to remove display layers
1211   Visual3d_SetIteratorOfSetOfView aViewIt(MyDefinedView);
1212   for ( ; aViewIt.More (); aViewIt.Next ())
1213     (aViewIt.Value ())->AddZLayer (theLayerId);
1214
1215   return Standard_True;
1216 }
1217
1218 //=======================================================================
1219 //function : RemoveZLayer
1220 //purpose  : 
1221 //=======================================================================
1222
1223 Standard_Boolean Visual3d_ViewManager::RemoveZLayer (const Standard_Integer theLayerId)
1224 {
1225   if (!myLayerIds.Contains (theLayerId) || theLayerId == 0)
1226     return Standard_False;
1227
1228   // tell all managed views to remove display layers
1229   Visual3d_SetIteratorOfSetOfView aViewIt(MyDefinedView);
1230   for ( ; aViewIt.More (); aViewIt.Next ())
1231     (aViewIt.Value ())->RemoveZLayer (theLayerId);
1232
1233   MyGraphicDriver->UnsetZLayer (theLayerId);
1234
1235   // remove index
1236   for (int aIdx = 1; aIdx <= myLayerSeq.Length (); aIdx++)
1237     if (myLayerSeq(aIdx) == theLayerId)
1238     {
1239       myLayerSeq.Remove (aIdx);
1240       break;
1241     }
1242
1243   myLayerIds.Remove (theLayerId);
1244   getZLayerGenId ().Free (theLayerId);
1245
1246   return Standard_True;
1247 }
1248
1249 //=======================================================================
1250 //function : GetAllZLayers
1251 //purpose  :
1252 //=======================================================================
1253
1254 void Visual3d_ViewManager::GetAllZLayers (TColStd_SequenceOfInteger& theLayerSeq) const
1255 {
1256   theLayerSeq.Assign (myLayerSeq);
1257 }
1258
1259 //=======================================================================
1260 //function : getZLayerGenId
1261 //purpose  :
1262 //=======================================================================
1263
1264 Aspect_GenId& Visual3d_ViewManager::getZLayerGenId ()
1265 {
1266   static Aspect_GenId aGenId (1, IntegerLast());
1267   return aGenId;
1268 }
1269
1270 //=======================================================================
1271 //function : InstallZLayers
1272 //purpose  :
1273 //=======================================================================
1274
1275 void Visual3d_ViewManager::InstallZLayers(const Handle(Visual3d_View)& theView) const
1276 {
1277   if (!MyDefinedView.Contains (theView))
1278     return;
1279   
1280   // erase and insert layers iteratively to provide the same layer order as
1281   // in the view manager's sequence. This approach bases on the layer insertion
1282   // order: the new layers are always appended to the end of the list
1283   // inside of view, while layer remove operation doesn't affect the order.
1284   // Starting from second layer : no need to change the default z layer.
1285   for (Standard_Integer aSeqIdx = 2; aSeqIdx <= myLayerSeq.Length (); aSeqIdx++)
1286   {
1287     Standard_Integer aLayerID = myLayerSeq.Value (aSeqIdx);
1288     theView->RemoveZLayer (aLayerID);
1289     theView->AddZLayer (aLayerID);
1290   }
1291 }