0024167: Compiler warnings 'unreacheable code' and 'conditional expression is constan...
[occt.git] / src / AIS / AIS_InteractiveContext.cxx
1 // Created on: 1997-01-17
2 // Created by: Robert COUBLANC
3 // Copyright (c) 1997-1999 Matra Datavision
4 // Copyright (c) 1999-2012 OPEN CASCADE SAS
5 //
6 // The content of this file is subject to the Open CASCADE Technology Public
7 // License Version 6.5 (the "License"). You may not use the content of this file
8 // except in compliance with the License. Please obtain a copy of the License
9 // at http://www.opencascade.org and read it completely before using this file.
10 //
11 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
13 //
14 // The Original Code and all software distributed under the License is
15 // distributed on an "AS IS" basis, without warranty of any kind, and the
16 // Initial Developer hereby disclaims all such warranties, including without
17 // limitation, any warranties of merchantability, fitness for a particular
18 // purpose or non-infringement. Please see the License for the specific terms
19 // and conditions governing the rights and limitations under the License.
20
21 // Modified by  XAB & Serguei Dec 97 (angle &deviation coeffts)
22
23 #define BUC60577        //GG_101099     Enable to compute correctly
24 //                      transparency with more than one object in the view.
25
26 #define BUC60632        //GG 15/03/00 Add protection on SetDisplayMode()
27 //                      method, compute only authorized presentation.
28
29 #define BUC60688        //GG 25/05/00 Add SetSensitivity() methods.
30
31 #define BUC60722  //GG 04/09/00 Always enable viewer update when erasing something
32
33 #define IMP051001       //GG Adds SetZDetected() and ZDetected() methods
34
35 #define OCC172          //SAV clear static map before destroying context.
36
37 #define OCC204          //SAV 26/02/02 : pass <updateviewer> flag to 
38 // AddOrRemoveCurrentObject method from ClearGlobal.
39
40 #define OCC4373         //SAN 10/11/03 : improve display mode management in
41 // Display( IO, updateviewer ) and 
42 // SetDisplayMode( IO, mode, updateviewer ) methods
43
44 #include <AIS_InteractiveContext.ixx>
45
46 //#include <AIS_DataMapIteratorOfDataMapOfInteractiveInteger.hxx>
47 #include <TColStd_ListIteratorOfListOfInteger.hxx>
48 #include <TColStd_MapIteratorOfMapOfTransient.hxx>
49 #include <AIS_LocalContext.hxx>
50 #include <AIS_LocalStatus.hxx>
51 #include <Precision.hxx>
52 #include <AIS_Selection.hxx>
53 #include <AIS_DataMapIteratorOfDataMapOfIOStatus.hxx>
54 #include <AIS_ConnectedShape.hxx>
55 #include <AIS_MultipleConnectedShape.hxx>
56 #include <AIS_DataMapIteratorOfDataMapOfILC.hxx>
57 #include <AIS_GlobalStatus.hxx>
58 #include <AIS_MapIteratorOfMapOfInteractive.hxx>
59 #include <PrsMgr_ModedPresentation.hxx>
60 #include <Visual3d_ViewManager.hxx>
61 #include <Prs3d_ShadingAspect.hxx>
62 #include <AIS_Shape.hxx>
63 #include <Graphic3d_AspectFillArea3d.hxx>
64 #include <HLRBRep.hxx>
65 #include <Prs3d_IsoAspect.hxx>
66 #include <Prs3d_DatumAspect.hxx>
67 #include <Prs3d_PlaneAspect.hxx>
68 #include <PrsMgr_PresentableObject.hxx>
69 #include <Standard_Atomic.hxx>
70 #include <UnitsAPI.hxx>
71
72 #include <AIS_Trihedron.hxx>
73 #include <Geom_Axis2Placement.hxx>
74 #include <OSD_Environment.hxx>
75
76 #include <AIS_ListIteratorOfListOfInteractive.hxx>
77
78 // In the method GetDefModes() the returned value of the selection mode 
79 // is always equal to 0 if it is -1.
80 #define BUC61051
81
82 // The local context is closed the method ::ResetOriginalState() sets the selection mode equal to 0
83 // in spite of the selection mode of the interactive object in Natural Point.
84 #define OCC166
85
86 // An interactive Object being erased in the main viewer and put into collector should have the same selection mode.
87 // It impacts the performance!
88 #define OCC328
89
90 static Standard_Boolean AISDebugModeOn()
91 {
92 //  static OSD_Environment aisdb("AISDEBUGMODE");
93 //  return !aisdb.Value().IsEmpty();
94   static Standard_Integer isDebugMode(-1);
95   if (isDebugMode < 0) {
96     isDebugMode = 1;
97     OSD_Environment aisdb("AISDEBUGMODE");
98     if (aisdb.Value().IsEmpty())
99       isDebugMode = 0;
100   }
101   return (isDebugMode != 0);
102 }
103
104 namespace
105 {
106   static volatile Standard_Integer THE_AIS_INDEX_SEL = 0;
107   static volatile Standard_Integer THE_AIS_INDEX_CUR = 0;
108
109   static TCollection_AsciiString AIS_Context_NewSelName()
110   {
111     return TCollection_AsciiString ("AIS_SelContext_")
112          + TCollection_AsciiString (Standard_Atomic_Increment (&THE_AIS_INDEX_SEL));
113   }
114
115   static TCollection_AsciiString AIS_Context_NewCurName()
116   {
117     return TCollection_AsciiString ("AIS_CurContext_")
118          + TCollection_AsciiString (Standard_Atomic_Increment (&THE_AIS_INDEX_CUR));
119   }
120 };
121
122 //=======================================================================
123 //function : AIS_InteractiveContext
124 //purpose  : 
125 //=======================================================================
126
127 AIS_InteractiveContext::AIS_InteractiveContext(const Handle(V3d_Viewer)& MainViewer):
128 mgrSelector(new SelectMgr_SelectionManager()),
129 myMainPM(new PrsMgr_PresentationManager3d(MainViewer->Viewer())),
130 myMainVwr(MainViewer),
131 myMainSel(new StdSelect_ViewerSelector3d()),
132 myIsCollClosed(Standard_True),
133 myToHilightSelected( Standard_False ),
134 myFilters(new SelectMgr_OrFilter()),
135 myDefaultDrawer(new Prs3d_Drawer()),
136 myDefaultColor(Quantity_NOC_GOLDENROD),
137 myHilightColor(Quantity_NOC_CYAN1),
138 mySelectionColor(Quantity_NOC_GRAY80),
139 myPreselectionColor(Quantity_NOC_GREEN),
140 mySubIntensity(Quantity_NOC_GRAY40),
141 myDisplayMode(0),
142 myCurLocalIndex(0),
143 #ifdef IMP051001
144 myZDetectionFlag(0),
145 #endif
146 myIsAutoActivateSelMode( Standard_True )
147
148   InitAttributes();
149 }
150
151
152 //=======================================================================
153 //function : AIS_InteractiveContext
154 //purpose  : 
155 //=======================================================================
156
157 AIS_InteractiveContext::AIS_InteractiveContext(const Handle(V3d_Viewer)& MainViewer,
158                                              const Handle(V3d_Viewer)& Collector):
159 mgrSelector(new SelectMgr_SelectionManager()),
160 myMainPM(new PrsMgr_PresentationManager3d(MainViewer->Viewer())),
161 myMainVwr(MainViewer),
162 myMainSel(new StdSelect_ViewerSelector3d()),
163 myCollectorPM(new PrsMgr_PresentationManager3d(Collector->Viewer())),
164 myCollectorVwr(Collector),
165 myCollectorSel(new StdSelect_ViewerSelector3d()),
166 myIsCollClosed(Standard_False),
167 myToHilightSelected( Standard_False ),
168 myFilters(new SelectMgr_OrFilter()),
169 myDefaultDrawer(new Prs3d_Drawer()),
170 myDefaultColor(Quantity_NOC_GOLDENROD),
171 myHilightColor(Quantity_NOC_CYAN1),
172 mySelectionColor(Quantity_NOC_GRAY80),
173 myPreselectionColor(Quantity_NOC_GREEN),
174 mySubIntensity(Quantity_NOC_GRAY40),
175 myDisplayMode(0),
176 myCurLocalIndex(0),
177 #ifdef IMP051001
178 myZDetectionFlag(0),
179 #endif
180 myIsAutoActivateSelMode( Standard_True )
181 {
182   InitAttributes();
183   mgrSelector->Add(myCollectorSel);
184   SetPixelTolerance();
185 }
186
187 void AIS_InteractiveContext::Delete() const
188 {
189 #ifdef OCC172
190   // to avoid an exception
191   if ( AIS_Selection::Find( mySelectionName.ToCString() ) )
192     AIS_Selection::Remove( mySelectionName.ToCString() );
193
194   // to avoid an exception
195   if ( AIS_Selection::Find( myCurrentName.ToCString() ) )
196     AIS_Selection::Remove( myCurrentName.ToCString() );
197
198   // let's remove one reference explicitly. this operation's supposed to
199   // be performed when mgrSelector will be destroyed but anyway...
200   mgrSelector->Remove( myMainSel );
201 #endif
202   AIS_ListOfInteractive aList;
203   
204   AIS_DataMapIteratorOfDataMapOfIOStatus anIt(myObjects);
205   Handle(AIS_InteractiveContext) aNullContext;
206   for(; anIt.More() ; anIt.Next())
207   {
208     Handle(AIS_InteractiveObject) anObj = anIt.Key();
209     anObj->SetContext(aNullContext);
210     
211   }
212   MMgt_TShared::Delete();
213 }
214
215 //=======================================================================
216 //function : AIS_SelectionName
217 //purpose  : 
218 //=======================================================================
219 const TCollection_AsciiString& AIS_InteractiveContext::SelectionName() const 
220 {
221   if(!HasOpenedContext())
222     return mySelectionName;
223   return myLocalContexts(myCurLocalIndex)->SelectionName();
224
225
226
227
228
229 //=======================================================================
230 //function : UpdateCurrentViewer
231 //purpose  : 
232 //=======================================================================
233
234 void AIS_InteractiveContext::UpdateCurrentViewer()
235 {
236   if (!myMainVwr.IsNull())
237     myMainVwr->Update();
238 }
239
240 void AIS_InteractiveContext::OpenCollector()
241 {
242   myIsCollClosed = Standard_False;
243   // to be completed....
244 }
245
246
247
248 //=======================================================================
249 //function : DomainOfMainViewer
250 //purpose  : 
251 //=======================================================================
252
253 Standard_CString AIS_InteractiveContext::DomainOfMainViewer() const 
254 {
255   return myMainVwr->Domain();
256   
257 }
258
259 //=======================================================================
260 //function : DisplayedObjects
261 //purpose  : 
262 //=======================================================================
263
264 void AIS_InteractiveContext::DisplayedObjects(AIS_ListOfInteractive& aListOfIO,
265                                               const Standard_Boolean OnlyFromNeutral) const 
266 {
267 #ifdef DEBUG
268   cout<<"AIS_IC::DisplayedObjects"<<endl;
269 #endif
270
271   AIS_DataMapIteratorOfDataMapOfIOStatus It(myObjects);
272   if(!HasOpenedContext() || OnlyFromNeutral){
273     for(;It.More();It.Next()){
274       if(It.Value()->GraphicStatus()==AIS_DS_Displayed)
275         aListOfIO.Append(It.Key());
276     }
277   }
278   else{
279     TColStd_MapOfTransient theMap;
280     // neutral point
281     for(;It.More();It.Next()){
282       if(It.Value()->GraphicStatus()==AIS_DS_Displayed)
283         theMap.Add(It.Key());
284     }
285 #ifdef DEBUG
286     cout<<"\tFrom Neutral Point : "<<theMap.Extent()<<endl;
287 #endif
288
289     //parse all local contexts...
290     Standard_Integer NbDisp;
291     for(AIS_DataMapIteratorOfDataMapOfILC it1(myLocalContexts);it1.More();it1.Next()){
292       const Handle(AIS_LocalContext)& LC = it1.Value();
293       NbDisp =  LC->DisplayedObjects(theMap);
294 #ifdef DEBUG
295       cout<<"\tIn Local Context "<<it1.Key()<<" : "<<NbDisp<<endl;
296 #endif
297       
298     }
299     Handle(AIS_InteractiveObject) curIO;
300     Handle(Standard_Transient) Tr;
301       for(TColStd_MapIteratorOfMapOfTransient it2(theMap);it2.More();it2.Next()){
302         Tr = it2.Key();
303         curIO = *((Handle(AIS_InteractiveObject)*) &Tr);
304         aListOfIO.Append(curIO);
305       }
306     }
307 }
308 //=======================================================================
309 //function : DisplayedObjects
310 //purpose  : 
311 //=======================================================================
312
313 void AIS_InteractiveContext::DisplayedObjects(const AIS_KindOfInteractive TheKind,
314                                               const Standard_Integer TheSign,
315                                               AIS_ListOfInteractive& aListOfIO,
316                                               const Standard_Boolean /*OnlyFromNeutral*/) const 
317 {
318   ObjectsByDisplayStatus( TheKind, TheSign, AIS_DS_Displayed, aListOfIO );
319 }
320
321 //=======================================================================
322 //function : UpdateCollector
323 //purpose  : 
324 //=======================================================================
325
326 void AIS_InteractiveContext::UpdateCollector()
327 {
328   if (!myCollectorVwr.IsNull())
329     myCollectorVwr->Update();
330 }
331
332 //=======================================================================
333 //function : DomainOfCollector
334 //purpose  : 
335 //=======================================================================
336
337 Standard_CString AIS_InteractiveContext::DomainOfCollector() const 
338 {
339   if(myCollectorVwr.IsNull()) return "";
340   return  myCollectorVwr->Domain();
341 }
342
343 //=======================================================================
344 //function : ObjectsInCollector
345 //purpose  : 
346 //=======================================================================
347
348 void AIS_InteractiveContext::ObjectsInCollector(AIS_ListOfInteractive& aListOfIO) const 
349 {
350   ObjectsByDisplayStatus( AIS_DS_Erased, aListOfIO );
351 }
352
353 //=======================================================================
354 //function : ObjectsInCollector
355 //purpose  : 
356 //=======================================================================
357
358 void AIS_InteractiveContext::ObjectsInCollector(const AIS_KindOfInteractive TheKind,
359                                                 const Standard_Integer TheSign,
360                                                 AIS_ListOfInteractive& aListOfIO) const 
361 {
362   ObjectsByDisplayStatus( TheKind, TheSign, AIS_DS_Erased, aListOfIO );
363 }
364
365 //=======================================================================
366 //function : ErasedObjects
367 //purpose  : 
368 //=======================================================================
369
370 void AIS_InteractiveContext::ErasedObjects(AIS_ListOfInteractive& theListOfIO) const 
371 {
372   ObjectsByDisplayStatus( AIS_DS_FullErased, theListOfIO );
373 }
374
375 //=======================================================================
376 //function : ErasedObjects
377 //purpose  : 
378 //=======================================================================
379
380 void AIS_InteractiveContext::ErasedObjects(const AIS_KindOfInteractive TheKind,
381                                            const Standard_Integer TheSign,
382                                            AIS_ListOfInteractive& theListOfIO) const 
383 {
384   ObjectsByDisplayStatus( TheKind, TheSign, AIS_DS_FullErased, theListOfIO );
385 }
386
387 //=======================================================================
388 //function : ObjectsByDisplayStatus
389 //purpose  : 
390 //=======================================================================
391
392 void AIS_InteractiveContext::ObjectsByDisplayStatus(const AIS_DisplayStatus theStatus,
393                                                     AIS_ListOfInteractive&  theListOfIO) const 
394 {
395   AIS_DataMapIteratorOfDataMapOfIOStatus It(myObjects);
396   for(;It.More();It.Next()){
397     if(It.Value()->GraphicStatus() == theStatus)
398       theListOfIO.Append(It.Key());
399   }
400 }
401
402 //=======================================================================
403 //function : ObjectsByDisplayStatus
404 //purpose  : 
405 //=======================================================================
406
407 void AIS_InteractiveContext::ObjectsByDisplayStatus(const AIS_KindOfInteractive TheKind,
408                                                     const Standard_Integer TheSign,
409                                                     const AIS_DisplayStatus theStatus,
410                                                     AIS_ListOfInteractive& theListOfIO) const 
411 {
412   AIS_DataMapIteratorOfDataMapOfIOStatus It(myObjects);
413   for(;It.More();It.Next()){
414     if(It.Value()->GraphicStatus()==theStatus){
415       if(It.Key()->Type()==TheKind){
416         if(TheSign ==-1)
417           theListOfIO.Append(It.Key());
418         else{
419           if(It.Key()->Signature()==TheSign)
420             theListOfIO.Append(It.Key());
421         }
422       }
423     }
424   }
425 }
426
427 //=======================================================================
428 //function : ObjectsInside
429 //purpose  : 
430 //=======================================================================
431
432 void AIS_InteractiveContext::ObjectsInside(AIS_ListOfInteractive& aListOfIO,
433                                            const AIS_KindOfInteractive TheKind,
434                                            const Standard_Integer TheSign) const 
435 {
436   AIS_DataMapIteratorOfDataMapOfIOStatus It(myObjects);
437   if(TheKind==AIS_KOI_None && TheSign ==-1){
438     for(;It.More();It.Next()){
439         aListOfIO.Append(It.Key());
440     }
441   }
442   else{
443     for(;It.More();It.Next()){
444       if(It.Key()->Type()==TheKind){
445         if(TheSign ==-1)
446           aListOfIO.Append(It.Key());
447         else{
448           if(It.Key()->Signature()==TheSign)
449             aListOfIO.Append(It.Key());
450         }
451       }
452     }
453   }
454 }
455
456 //=======================================================================
457 //function : Display
458 //purpose  : 
459 //=======================================================================
460
461 void AIS_InteractiveContext::Display(const Handle(AIS_InteractiveObject)& anIObj,
462                                      const Standard_Boolean updateviewer )
463 {
464   if(anIObj.IsNull()) return;
465   
466   Standard_Integer DispMode,HiMod,SelMode;
467   
468   GetDefModes(anIObj,DispMode,HiMod,SelMode);
469   
470   Handle (AIS_InteractiveContext) aThis = this;
471   if(!anIObj->HasInteractiveContext()) 
472     anIObj->SetContext(aThis);
473   
474   //NO LOCAL CONTEXT OPEN
475   if(!HasOpenedContext()) {
476 #ifndef OCC4373
477     // SAN : Do not return here. Perform advanced display mode analysis a bit later...
478     if(IsDisplayed(anIObj)) return;
479 #endif
480     Standard_Boolean updcol = Standard_False;
481     
482     // it did not yet exist
483     if(!myObjects.IsBound(anIObj)){
484       
485       Handle(AIS_GlobalStatus) STATUS= 
486 #ifdef OCC166
487         new AIS_GlobalStatus(AIS_DS_Displayed,DispMode,SelMode);
488 #else
489       new AIS_GlobalStatus(AIS_DS_Displayed,DispMode,0);
490 #endif
491       myObjects.Bind (anIObj,STATUS);
492       myMainPM->Display(anIObj,DispMode);
493       if( myIsAutoActivateSelMode )
494       {
495         if(!mgrSelector->Contains(anIObj))
496            mgrSelector->Load(anIObj);
497         mgrSelector->Activate(anIObj,SelMode,myMainSel);
498       }
499         
500      if(updateviewer) myMainVwr->Update();
501     }
502     // it is somewhere else...
503     else {
504       // CLE
505       // const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj);
506       Handle(AIS_GlobalStatus) STATUS = myObjects(anIObj);
507       // ENDCLE
508       switch (STATUS->GraphicStatus()){
509       case AIS_DS_Erased:{
510         if(STATUS->IsHilighted())
511           myCollectorPM->Unhighlight(anIObj,HiMod);
512         myCollectorPM->Erase(anIObj,HiMod);
513         mgrSelector->Deactivate(anIObj,myCollectorSel);
514         updcol = updateviewer;
515                          }// attention the break is not set on purpose...
516       case AIS_DS_FullErased:{
517         TColStd_ListIteratorOfListOfInteger ItL (STATUS->DisplayedModes());
518         for (;ItL.More();ItL.Next()){
519           myMainPM->Display(anIObj,ItL.Value());
520           if(STATUS->IsSubIntensityOn())
521             myMainPM->Color(anIObj,mySubIntensity,ItL.Value());
522         }
523         if( myIsAutoActivateSelMode )        
524             for (ItL.Initialize(STATUS->SelectionModes());ItL.More();ItL.Next())
525                 mgrSelector->Activate(anIObj,ItL.Value(),myMainSel);
526         STATUS->SetGraphicStatus(AIS_DS_Displayed);
527         if(STATUS->IsHilighted())
528           myMainPM->Highlight(anIObj,HiMod);
529         break;
530                              }
531 #ifdef OCC4373
532       // SAN : erase presentations for all display modes different from <DispMode>;
533       //       then make sure <DispMode> is displayed and maybe highlighted;
534       //       Finally, activate selection mode <SelMode> if not yet activated.
535       case AIS_DS_Displayed:{
536         TColStd_ListOfInteger aModesToRemove;
537         TColStd_ListIteratorOfListOfInteger ItL (STATUS->DisplayedModes());
538         for(;ItL.More();ItL.Next()){
539
540           Standard_Integer OldMode = ItL.Value();
541
542           if(OldMode!=DispMode){
543             aModesToRemove.Append(OldMode);
544             if(myMainPM->IsHighlighted(anIObj,OldMode))
545               myMainPM->Unhighlight(anIObj,OldMode);
546             myMainPM->Erase(anIObj,OldMode);
547           }
548         }
549
550         for(ItL.Initialize(aModesToRemove);ItL.More();ItL.Next())
551           STATUS->RemoveDisplayMode(ItL.Value());
552
553         if(!STATUS->IsDModeIn(DispMode))
554           STATUS->AddDisplayMode(DispMode);
555
556         myMainPM->Display(anIObj,DispMode);
557         if(STATUS->IsHilighted()){
558           myMainPM->Highlight(anIObj,HiMod);
559         }
560         if( myIsAutoActivateSelMode )
561         {
562            if(!mgrSelector->Contains(anIObj))
563               mgrSelector->Load(anIObj);
564            if(!mgrSelector->IsActivated(anIObj,SelMode))
565               mgrSelector->Activate(anIObj,SelMode,myMainSel);
566         }
567
568         break;
569                             }
570 #endif
571       default:
572         break;
573       }
574     } 
575     
576     if(anIObj->IsTransparent() && !myMainVwr->Viewer()->Transparency())
577       myMainVwr->Viewer()->SetTransparency(Standard_True);
578     if(updateviewer) myMainVwr->Update();
579     if(updcol && !myCollectorVwr.IsNull()) myCollectorVwr->Update();
580   }
581   
582   //  LOCAL CONTEXT OPEN
583   else
584   {
585     myLocalContexts(myCurLocalIndex)->Display(anIObj,DispMode,anIObj->AcceptShapeDecomposition(),SelMode);
586     
587     if(anIObj->IsTransparent() && !myMainVwr->Viewer()->Transparency())
588       myMainVwr->Viewer()->SetTransparency(Standard_True);
589     
590     
591     if(updateviewer) myMainVwr->Update();
592   }
593 }
594
595 //=======================================================================
596 //function : Display
597 //purpose  : 
598 //=======================================================================
599
600 void AIS_InteractiveContext::Display(const Handle(AIS_InteractiveObject)& anIObj,
601                                     const Standard_Integer aDisplayMode, 
602                                     const Standard_Integer aSelectionMode, 
603                                     const Standard_Boolean updateviewer, 
604                                     const Standard_Boolean allowdecomposition)
605 {
606   if(anIObj.IsNull()) return;
607
608   if(!anIObj->HasInteractiveContext()) anIObj->SetContext(this);
609   
610   // if no local context...
611   if(!HasOpenedContext()) {
612     //    if(!anIObj->HasDisplayMode())
613     //      anIObj->SetDisplayMode(aDisplayMode);
614   
615     if(!myObjects.IsBound(anIObj)){
616       Handle(AIS_GlobalStatus) STATUS= 
617         new AIS_GlobalStatus(AIS_DS_Displayed,aDisplayMode,aSelectionMode);
618       myObjects.Bind (anIObj,STATUS);
619       myMainPM->Display(anIObj,aDisplayMode);
620       if(aSelectionMode!=-1){
621         if(!mgrSelector->Contains(anIObj))
622           mgrSelector->Load(anIObj,aSelectionMode);
623         mgrSelector->Activate(anIObj,aSelectionMode,myMainSel);
624       }
625       if(updateviewer) myMainVwr->Update();
626     }
627     //    anIObj->SelectionMode(aSelectionMode);
628     else{
629       // CLE
630       // const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj);
631       Handle(AIS_GlobalStatus) STATUS = myObjects(anIObj);
632       // ENDCLE
633       if(!STATUS->IsDModeIn(aDisplayMode)){
634         myMainPM->Display(anIObj,aDisplayMode);
635         STATUS->AddDisplayMode(aDisplayMode);
636         if(STATUS->IsSubIntensityOn())
637           myMainPM->Color(anIObj,mySubIntensity,aDisplayMode);
638       }
639       if(aSelectionMode!=-1){
640         STATUS->AddSelectionMode(aSelectionMode);
641         mgrSelector->Activate(anIObj,aSelectionMode,myMainSel);
642       }
643       if(updateviewer) myMainVwr->Update();
644       
645     }
646   }
647   else
648     {
649       myLocalContexts(myCurLocalIndex)->Display(anIObj,aDisplayMode,allowdecomposition,aSelectionMode);
650       if(updateviewer) myMainVwr->Update();
651     }  
652 }
653
654
655 //=======================================================================
656 //function : Load
657 //purpose  : 
658 //=======================================================================
659
660 void AIS_InteractiveContext::Load(const Handle(AIS_InteractiveObject)& anIObj,
661                                   const Standard_Integer SelMode,
662                                   const Standard_Boolean AllowDecomposition)
663 {
664   if(anIObj.IsNull()) return;
665   if(!anIObj->HasInteractiveContext()) anIObj->SetContext(this);
666   
667
668   if(!HasOpenedContext()) {
669     if(SelMode==-1 && !AllowDecomposition){
670       Standard_Integer DispMode,HiMod,SelModeDef;
671       
672       GetDefModes(anIObj,DispMode,HiMod,SelModeDef);
673       Handle(AIS_GlobalStatus) STATUS= 
674         new AIS_GlobalStatus(AIS_DS_FullErased,DispMode,SelModeDef);
675       myObjects.Bind (anIObj,STATUS);      
676       return;
677     }
678   }
679   myLocalContexts(myCurLocalIndex)->Load(anIObj,AllowDecomposition,SelMode);
680 }
681
682
683 //=======================================================================
684 //function : Erase
685 //purpose  : 
686 //=======================================================================
687
688 void AIS_InteractiveContext::Erase(const Handle(AIS_InteractiveObject)& anIObj, 
689                                    const Standard_Boolean updateviewer, 
690                                    const Standard_Boolean PutInCollector)
691 {
692   if(anIObj.IsNull()) return;
693   
694   if ( !anIObj->IsAutoHilight() )
695     anIObj->ClearSelected();
696   
697   if(!HasOpenedContext()){
698     EraseGlobal(anIObj,updateviewer,PutInCollector);
699   }
700   else
701     {
702       // First it is checked if it is possible to remove in the current local context
703       // then one tries to remove in other local contexts, if they allow it...
704       
705       Standard_Boolean WasInCtx = myLocalContexts(myCurLocalIndex)->Erase(anIObj);
706 //      if(!WasInCtx) {
707       AIS_DataMapIteratorOfDataMapOfILC It(myLocalContexts);
708       for (;It.More();It.Next()){
709         if(It.Value()->AcceptErase())
710 #ifdef BUC60722
711           WasInCtx |= It.Value()->Erase(anIObj);
712 #else
713           WasInCtx = It.Value()->Erase(anIObj);
714 #endif
715       }
716       
717       if(!WasInCtx)
718         EraseGlobal(anIObj,updateviewer,PutInCollector);
719       else
720         if(updateviewer) myMainVwr->Update();
721     }
722 }
723 //=======================================================================
724 //function : Erase
725 //purpose  : 
726 //=======================================================================
727
728 void AIS_InteractiveContext::EraseMode(const Handle(AIS_InteractiveObject)& anIObj,
729                                   const Standard_Integer aMode,
730                                   const Standard_Boolean /*updateviewer*/)
731 {
732   if(anIObj.IsNull()) return;
733
734   if(!myObjects.IsBound(anIObj)) return;
735   
736   if(anIObj->HasDisplayMode()){
737     if(anIObj->DisplayMode()==aMode) return;
738   }
739   else if(myDisplayMode==aMode) return;
740   // CLE
741   // const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj);
742   Handle(AIS_GlobalStatus) STATUS = myObjects(anIObj);
743   // ENDCLE
744   if(STATUS->GraphicStatus()!=AIS_DS_Displayed) return;
745   
746   
747 //  if(STATUS->IsDModeIn(aMode)) {}
748 }
749
750
751
752 //=======================================================================
753 //function : EraseAll
754 //purpose  : 
755 //=======================================================================
756
757 void AIS_InteractiveContext::EraseAll(const Standard_Boolean PutInCollector,
758                                       const Standard_Boolean updateviewer)
759 {
760   if(!HasOpenedContext()){
761     AIS_DataMapIteratorOfDataMapOfIOStatus ItM(myObjects);
762     
763     for(;ItM.More();ItM.Next()){
764       if(ItM.Value()->GraphicStatus() == AIS_DS_Displayed)
765         Erase(ItM.Key(),Standard_False,PutInCollector);
766     }
767     if(updateviewer){
768       myMainVwr->Update();
769       if (PutInCollector && !myCollectorVwr.IsNull()) 
770         myCollectorVwr->Update();
771     }
772   }
773   
774 }
775
776 //=======================================================================
777 //function : DisplayAll
778 //purpose  : 
779 //=======================================================================
780
781 void AIS_InteractiveContext::DisplayAll(const Standard_Boolean OnlyFromCollector,
782                                       const Standard_Boolean updateviewer)
783 {
784   if(!HasOpenedContext()){
785     Standard_Boolean FoundInCollector(Standard_False);
786     AIS_DisplayStatus aDStatus = OnlyFromCollector ? AIS_DS_Erased : AIS_DS_FullErased,TheStatus;
787
788     if(!HasOpenedContext()){
789       AIS_DataMapIteratorOfDataMapOfIOStatus ItM(myObjects);
790       
791       for(;ItM.More();ItM.Next()){
792         TheStatus = ItM.Value()->GraphicStatus();
793         if(TheStatus == aDStatus)
794           Display(ItM.Key(),Standard_False);
795         if(TheStatus == AIS_DS_Erased)
796           FoundInCollector = Standard_True;
797       }
798       if(updateviewer){
799         myMainVwr->Update();
800         if(FoundInCollector && !myCollectorVwr.IsNull())
801           myCollectorVwr->Update();
802       }
803     }
804   }
805   
806 }
807
808 //=======================================================================
809 //function : DisplaySelected
810 //purpose  : 
811 //=======================================================================
812
813 void AIS_InteractiveContext::DisplaySelected(const Standard_Boolean updateviewer)
814 {
815   
816   if(!HasOpenedContext()){
817     Standard_Boolean found = Standard_False;
818     Handle(AIS_Selection) sel = AIS_Selection::Selection(myCurrentName.ToCString());
819     Handle(AIS_InteractiveObject) iObj;
820     for (sel->Init();sel->More();sel->Next()) {
821       iObj = Handle(AIS_InteractiveObject)::DownCast(sel->Value());
822       Display(iObj,Standard_False);
823       found = Standard_True;
824     }
825     if(found && updateviewer) {
826       myMainVwr->Update();
827       if(!(myIsCollClosed && myCollectorVwr.IsNull())) 
828        
829         myCollectorVwr->Update();
830     }
831   }
832 }
833
834
835 //=======================================================================
836 //function : EraseSelected
837 //purpose  : 
838 //=======================================================================
839
840 void AIS_InteractiveContext::EraseSelected(const Standard_Boolean PutInCollector,
841                                            const Standard_Boolean updateviewer)
842 {
843   
844   if(!HasOpenedContext()){
845     Standard_Boolean found = Standard_False;
846     Handle(AIS_Selection) sel = AIS_Selection::Selection(myCurrentName.ToCString());
847     Handle(AIS_InteractiveObject) iObj;
848     for(sel->Init();sel->More();sel->Next()) {
849       iObj = Handle(AIS_InteractiveObject)::DownCast(sel->Value());
850       Erase(iObj,Standard_False,PutInCollector);
851       found = Standard_True;
852     }
853     if(found && updateviewer) {
854       myMainVwr->Update();
855       if(PutInCollector && !myCollectorVwr.IsNull())
856         myCollectorVwr->Update();
857     }
858   }
859 }
860 //=======================================================================
861 //function : 
862 //purpose  : 
863 //=======================================================================
864
865 Standard_Boolean AIS_InteractiveContext::KeepTemporary(const Handle(AIS_InteractiveObject)& anIObj,
866                                                        const Standard_Integer WhichContext)
867 {
868   if(anIObj.IsNull()) return Standard_False;
869
870   if(!HasOpenedContext()) return Standard_False;
871   if(myObjects.IsBound(anIObj)) return Standard_False;
872   if(WhichContext!=-1 && !myLocalContexts.IsBound(WhichContext)) return Standard_False;
873   
874   // Protection : if one tries to preserve a temporary object
875   // which is not in the local active context... rob 11-06-97
876
877   Standard_Integer IsItInLocal = myCurLocalIndex;
878   Standard_Boolean Found(Standard_False);
879
880   while(IsItInLocal>0 && !Found){
881     if(!myLocalContexts.IsBound(IsItInLocal))
882       IsItInLocal--;
883     else if(myLocalContexts(IsItInLocal)->IsIn(anIObj))
884       Found = Standard_True;
885     else
886       IsItInLocal--;
887   }
888
889   if(!Found) return Standard_False;
890   
891
892 //  const Handle(AIS_LocalStatus)& LS = (WhichContext== -1) ? 
893 //    myLocalContexts(IsItInLocal)->Status(anIObj):myLocalContexts(WhichContext)->Status(anIObj);
894   // CLE
895   // const Handle(AIS_LocalStatus)& LS = myLocalContexts(IsItInLocal)->Status(anIObj);
896   Handle(AIS_LocalStatus) LS = myLocalContexts(IsItInLocal)->Status(anIObj);
897   // ENDCLE
898   
899   
900   if(LS->IsTemporary()){
901     Standard_Integer DM,HM,SM;
902     GetDefModes(anIObj,DM,HM,SM);
903     
904     SM = LS->SelectionModes().IsEmpty() ? SM : LS->SelectionModes().First();
905     if(LS->DisplayMode()!= DM ){
906       Standard_Integer LSM =  LS->SelectionModes().IsEmpty() ? -1 : LS->SelectionModes().First();
907       myLocalContexts(IsItInLocal)->Display(anIObj,DM,LS->Decomposed(),LSM);
908     }
909
910     Handle (AIS_GlobalStatus) GS = new AIS_GlobalStatus(AIS_DS_Displayed,
911                                                         DM,
912                                                         SM,
913                                                         Standard_False);
914 //    GS->SubIntensityOn();
915     myObjects.Bind(anIObj,GS);
916     mgrSelector->Load(anIObj);
917     mgrSelector->Activate(anIObj,SM,myMainSel);
918     
919     LS->SetTemporary(Standard_False);
920   }                                 
921   return Standard_True;
922 }
923
924
925 //=======================================================================
926 //purpose  : 
927 //=======================================================================
928
929 AIS_DisplayStatus AIS_InteractiveContext::DisplayStatus(const Handle(AIS_InteractiveObject)& anIObj) const 
930 {
931   if(anIObj.IsNull()) return AIS_DS_None;
932
933   if(myObjects.IsBound(anIObj))
934     return myObjects(anIObj)->GraphicStatus();
935
936   AIS_DataMapIteratorOfDataMapOfILC ItM(myLocalContexts);
937   for(;ItM.More();ItM.Next()){
938     if(ItM.Value()->IsIn(anIObj))
939       return AIS_DS_Temporary;
940   }
941   
942   return AIS_DS_None;
943   
944 }
945
946
947
948
949 //=======================================================================
950 //function : DisplayedModes
951 //purpose  : 
952 //=======================================================================
953
954 const TColStd_ListOfInteger& AIS_InteractiveContext::
955 DisplayedModes(const Handle(AIS_InteractiveObject)& anIObj) const 
956 {
957   return myObjects(anIObj)->DisplayedModes();
958 }
959
960
961 //=======================================================================
962 //function : Remove
963 //purpose  : 
964 //=======================================================================
965 void AIS_InteractiveContext::Remove(const Handle(AIS_InteractiveObject)& anIObj,
966                                     const Standard_Boolean updateviewer)
967 {
968
969   if(anIObj.IsNull()) return;
970
971   if(!HasOpenedContext()){ 
972     ClearGlobal(anIObj,updateviewer);
973   }
974   else
975     {
976       Standard_Boolean  WasInCtx = myLocalContexts(myCurLocalIndex)->Remove(anIObj);
977       AIS_DataMapIteratorOfDataMapOfILC It(myLocalContexts);
978       for (;It.More() ;It.Next()){
979         if(It.Value()->AcceptErase())
980           WasInCtx = It.Value()->Remove(anIObj);
981         
982       }
983       //      if(!WasInCtx)
984       ClearGlobal(anIObj,updateviewer);
985 //      else
986 //      if(updateviewer) myMainVwr->Update();
987     }
988 }
989
990 //=======================================================================
991 //function : RemoveAll
992 //purpose  : 
993 //=======================================================================
994 void AIS_InteractiveContext::RemoveAll(const Standard_Boolean updateviewer)
995 {
996   AIS_ListOfInteractive aList;
997   ObjectsInside(aList);
998   AIS_ListIteratorOfListOfInteractive aListIterator;
999   for(aListIterator.Initialize(aList);aListIterator.More();aListIterator.Next()){
1000     Remove(aListIterator.Value(), Standard_False);
1001   }
1002         
1003   if(updateviewer)
1004     myMainVwr->Update();
1005 }
1006
1007 //=======================================================================
1008 //function : Clear
1009 //purpose  : 
1010 //=======================================================================
1011
1012 void AIS_InteractiveContext::Clear(const Handle(AIS_InteractiveObject)& anIObj,
1013                                    const Standard_Boolean updateviewer)
1014 {
1015   if(anIObj.IsNull()) return;
1016
1017   if(!HasOpenedContext()){ 
1018     ClearGlobal(anIObj,updateviewer);
1019   }
1020   else
1021     {
1022       
1023       Standard_Boolean  WasInCtx = myLocalContexts(myCurLocalIndex)->Remove(anIObj);
1024       AIS_DataMapIteratorOfDataMapOfILC It(myLocalContexts);
1025       for (;It.More() ;It.Next()){
1026         if(It.Value()->AcceptErase())
1027           WasInCtx = It.Value()->Remove(anIObj);
1028         
1029       }
1030       if(!WasInCtx)
1031         ClearGlobal(anIObj,updateviewer);
1032       else
1033         if(updateviewer) myMainVwr->Update();
1034     }
1035 }
1036
1037
1038
1039
1040 //=======================================================================
1041 //function : ClearPrs
1042 //purpose  : 
1043 //=======================================================================
1044
1045 void AIS_InteractiveContext::ClearPrs(const Handle(AIS_InteractiveObject)& anIObj,
1046                                       const Standard_Integer aMode,
1047                                       const Standard_Boolean updateviewer)
1048 {
1049   if(anIObj.IsNull()) return;
1050
1051   if(!HasOpenedContext()){
1052     ClearGlobalPrs(anIObj,aMode,updateviewer);
1053   }
1054   else
1055     {
1056       Standard_Boolean  WasInCtx = myLocalContexts(myCurLocalIndex)->ClearPrs(anIObj,aMode);
1057       AIS_DataMapIteratorOfDataMapOfILC It(myLocalContexts);
1058       for (;It.More() ;It.Next()){
1059         if(It.Value()->AcceptErase())
1060           WasInCtx = It.Value()->ClearPrs(anIObj,aMode);
1061       }
1062       if(!WasInCtx)
1063         ClearGlobalPrs(anIObj,aMode,updateviewer);
1064       else
1065         if(updateviewer) myMainVwr->Update();
1066       
1067     }
1068 }
1069
1070 //=======================================================================
1071 //function : Hilight
1072 //purpose  : 
1073 //=======================================================================
1074
1075 void AIS_InteractiveContext::Hilight(const Handle(AIS_InteractiveObject)& anIObj,
1076                                      const Standard_Boolean updateviewer)
1077 {
1078   if(anIObj.IsNull()) return;
1079
1080   if(!anIObj->HasInteractiveContext()) anIObj->SetContext(this);
1081   if (!HasOpenedContext())
1082     {
1083       if(!myObjects.IsBound(anIObj)) return;
1084
1085       // CLE
1086       // const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj);
1087       // const TColStd_ListOfInteger& LL = STATUS->DisplayedModes();
1088       Handle(AIS_GlobalStatus) STATUS = myObjects(anIObj);
1089
1090       // ENDCLE
1091       STATUS->SetHilightStatus (Standard_True);
1092       
1093       switch(STATUS->GraphicStatus()){
1094       case AIS_DS_Displayed:
1095         {
1096           Standard_Integer DispMode,HiMode,SelMode;
1097           GetDefModes(anIObj,DispMode,HiMode,SelMode);
1098 //        if(!STATUS->IsDModeIn(HiMode)){
1099 //          myMainPM->Display(anIObj,HiMode);
1100 //        }
1101           myMainPM->Highlight(anIObj,HiMode);
1102           if(updateviewer) myMainVwr->Update();
1103           break;
1104         }
1105       case AIS_DS_Erased:
1106         {
1107           Standard_Integer HiMode = anIObj->HasHilightMode()? anIObj->HilightMode():0;
1108           myCollectorPM->Highlight(anIObj,HiMode);
1109           if(updateviewer) myCollectorVwr->Update();
1110           break;
1111         }
1112       default:
1113         break;
1114       }
1115     }
1116   else
1117     myLocalContexts(myCurLocalIndex)->Hilight(anIObj);
1118   if(updateviewer) myMainVwr->Update();
1119 }
1120 //=======================================================================
1121 //function : Hilight
1122 //purpose  : 
1123 //=======================================================================
1124
1125 void AIS_InteractiveContext::HilightWithColor(const Handle(AIS_InteractiveObject)& anIObj,
1126                                               const Quantity_NameOfColor aCol,
1127                                               const Standard_Boolean updateviewer)
1128 {
1129   if(anIObj.IsNull()) return;
1130
1131   if(!anIObj->HasInteractiveContext()) anIObj->SetContext(this);
1132
1133   if (!HasOpenedContext())
1134     {
1135       if(!myObjects.IsBound(anIObj)) return;
1136
1137       const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj);
1138       STATUS->SetHilightStatus (Standard_True);
1139       
1140       switch(STATUS->GraphicStatus()){
1141       case AIS_DS_Displayed:
1142         {
1143           Standard_Integer DispMode,HiMode,SelMode;
1144           GetDefModes(anIObj,DispMode,HiMode,SelMode);
1145 //        if(!STATUS->IsDModeIn(HiMode)){
1146 //          myMainPM->Display(anIObj,HiMode);
1147 //        }
1148           myMainPM->Color(anIObj,aCol,HiMode);
1149           STATUS->SetHilightColor(aCol);
1150           if(updateviewer) myMainVwr->Update();
1151           break;
1152         }
1153       case AIS_DS_Erased:
1154         {
1155           Standard_Integer HiMode = anIObj->HasHilightMode()? anIObj->HilightMode():0;
1156           myCollectorPM->Color(anIObj,aCol,HiMode);
1157           if(updateviewer) myCollectorVwr->Update();
1158           break;
1159         }
1160       default:
1161         break;  
1162       }
1163     }
1164   else
1165     myLocalContexts(myCurLocalIndex)->Hilight(anIObj,aCol);
1166   if(updateviewer) myMainVwr->Update();
1167 }
1168
1169 //=======================================================================
1170 //function : Unhilight
1171 //purpose  : 
1172 //=======================================================================
1173
1174 void AIS_InteractiveContext::Unhilight(const Handle(AIS_InteractiveObject)& anIObj, const Standard_Boolean updateviewer)
1175 {
1176   if(anIObj.IsNull()) return;
1177
1178   if (!HasOpenedContext())
1179     {
1180       if(!myObjects.IsBound(anIObj)) return;
1181
1182       const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj);
1183       STATUS->SetHilightStatus (Standard_False);
1184       STATUS->SetHilightColor(Quantity_NOC_WHITE);
1185       
1186       switch(STATUS->GraphicStatus()){
1187       case AIS_DS_Displayed:
1188         {
1189           Standard_Integer DispMode,HiMode,SelMode;
1190           GetDefModes(anIObj,DispMode,HiMode,SelMode);
1191           myMainPM->Unhighlight(anIObj,HiMode);
1192 //        if(!STATUS->IsDModeIn(HiMode))
1193 //          myMainPM->Erase(anIObj,HiMode);
1194           if(updateviewer) myMainVwr->Update();
1195           break;
1196         }
1197       case AIS_DS_Erased:
1198         {
1199           Standard_Integer HiMode = anIObj->HasHilightMode()? anIObj->HilightMode():0;
1200           myCollectorPM->Unhighlight(anIObj,HiMode);
1201           if(updateviewer) myCollectorVwr->Update();
1202           break;
1203         }
1204       default:
1205         break;  
1206       }
1207     }
1208   else
1209     myLocalContexts(myCurLocalIndex)->Unhilight(anIObj);
1210   if(updateviewer) myMainVwr->Update();
1211 }
1212
1213 //=======================================================================
1214 //function : IsHilighted
1215 //purpose  : 
1216 //=======================================================================
1217
1218 Standard_Boolean AIS_InteractiveContext::IsHilighted(const Handle(AIS_InteractiveObject)& anIObj) const 
1219 {
1220   if(anIObj.IsNull()) return Standard_False;
1221
1222   if (!HasOpenedContext()){
1223     if(!myObjects.IsBound(anIObj)) 
1224       return Standard_False;
1225     return myObjects(anIObj)->IsHilighted();
1226   }
1227   AIS_DataMapIteratorOfDataMapOfILC ItM(myLocalContexts);
1228   for(;ItM.More();ItM.Next()){
1229     if(ItM.Value()->IsHilighted(anIObj))
1230       return Standard_True;
1231   }
1232   return Standard_False;
1233 }
1234
1235 Standard_Boolean AIS_InteractiveContext::IsHilighted(const Handle(AIS_InteractiveObject)& anIObj,
1236                                                      Standard_Boolean& WithColor,
1237                                                      Quantity_NameOfColor& TheHiCol) const
1238 {
1239   if(!HasOpenedContext()){
1240     if(myObjects.IsBound(anIObj)){
1241       const Handle(AIS_GlobalStatus)& STAT = myObjects(anIObj);
1242       if(STAT->IsHilighted()){
1243         if(STAT->HilightColor()!=Quantity_NOC_WHITE){
1244           WithColor=Standard_True;
1245           TheHiCol = STAT->HilightColor();
1246         }
1247         else
1248           WithColor = Standard_False;
1249         return Standard_True;
1250       }
1251     }
1252     return Standard_False;
1253   }
1254   Standard_Integer MaxIndex = HighestIndex();
1255   for(Standard_Integer i=MaxIndex;i>=1 ; i--){
1256     if(myLocalContexts.IsBound(i)){
1257       if(myLocalContexts(i)->IsHilighted(anIObj,WithColor,TheHiCol))
1258         return Standard_True;
1259     }
1260     
1261   }
1262   return Standard_False;
1263 }
1264
1265
1266
1267 //=======================================================================
1268 //function : IsDisplayed
1269 //purpose  : 
1270 //=======================================================================
1271
1272 Standard_Boolean AIS_InteractiveContext::IsDisplayed(const Handle(AIS_InteractiveObject)& anIObj) const 
1273 {
1274   if(anIObj.IsNull()) return Standard_False;
1275
1276
1277   if(myObjects.IsBound(anIObj)) 
1278     if(myObjects(anIObj)->GraphicStatus()==AIS_DS_Displayed)
1279       return Standard_True;
1280   
1281   AIS_DataMapIteratorOfDataMapOfILC ItM(myLocalContexts);
1282   for(;ItM.More();ItM.Next()){
1283     if(ItM.Value()->IsDisplayed(anIObj))
1284       return Standard_True;
1285   }
1286   return Standard_False;
1287   
1288 }
1289 //=======================================================================
1290 //function : IsDisplayed
1291 //purpose  : 
1292 //=======================================================================
1293
1294 Standard_Boolean AIS_InteractiveContext::IsInCollector(const Handle(AIS_InteractiveObject)& anIObj) const 
1295 {
1296   if(anIObj.IsNull()) return Standard_False;
1297
1298
1299   if(myObjects.IsBound(anIObj)) 
1300     return (myObjects(anIObj)->GraphicStatus()==AIS_DS_Erased);
1301   return Standard_False;
1302 }
1303
1304
1305 //=======================================================================
1306 //function : IsDisplayed
1307 //purpose  : 
1308 //=======================================================================
1309
1310 Standard_Boolean AIS_InteractiveContext::
1311 IsDisplayed(const Handle(AIS_InteractiveObject)& anIObj,
1312             const Standard_Integer aMode) const 
1313 {
1314   if(anIObj.IsNull()) return Standard_False;
1315   if(myObjects.IsBound(anIObj)) {
1316     if(myObjects(anIObj)->GraphicStatus()==AIS_DS_Displayed &&
1317        myObjects(anIObj)->IsDModeIn(aMode)) 
1318       return Standard_True;
1319   }
1320   
1321   AIS_DataMapIteratorOfDataMapOfILC ItM(myLocalContexts);
1322   for(;ItM.More();ItM.Next()){
1323     if(ItM.Value()->IsDisplayed(anIObj,aMode))
1324       return Standard_True;
1325   }
1326   return Standard_False;
1327 }
1328
1329
1330 //=======================================================================
1331 //function : DisplayPriority
1332 //purpose  : 
1333 //=======================================================================
1334
1335 Standard_Integer AIS_InteractiveContext::
1336 DisplayPriority(const Handle(AIS_InteractiveObject)& anIObj) const 
1337 {
1338   if(anIObj.IsNull()) return -1;
1339   if(myObjects.IsBound(anIObj)){
1340     // CLE
1341     // const Handle(AIS_GlobalStatus) & STATUS = myObjects(anIObj);
1342     Handle(AIS_GlobalStatus) STATUS = myObjects(anIObj);
1343     // ENDCLE
1344     Standard_Integer DM,HM,SM ;
1345     GetDefModes(anIObj,DM,HM,SM);
1346     switch(STATUS->GraphicStatus()){
1347     case AIS_DS_Displayed:
1348       {
1349         return myMainPM->DisplayPriority(anIObj,DM);
1350         break;
1351       }
1352     case AIS_DS_Erased:
1353       return myCollectorPM->DisplayPriority(anIObj,HM);
1354     default:
1355       break;
1356     }
1357     return 0;
1358   }
1359   return 0;
1360 }
1361 //=======================================================================
1362 //function : SetDisplayPriority
1363 //purpose  : 
1364 //=======================================================================
1365
1366 void AIS_InteractiveContext::SetDisplayPriority(const Handle(AIS_InteractiveObject)& anIObj,
1367                                                const Standard_Integer aPriority)
1368 {
1369   if(anIObj.IsNull())
1370     return;
1371   if(!anIObj->HasInteractiveContext())
1372     anIObj->SetContext(this);
1373   if(myObjects.IsBound(anIObj)){
1374     // CLE
1375     // const Handle(AIS_GlobalStatus) & STATUS = myObjects(anIObj);
1376     Handle(AIS_GlobalStatus) STATUS = myObjects(anIObj);
1377     // ENDCLE
1378     Standard_Integer DM,HM,SM ;
1379     GetDefModes(anIObj,DM,HM,SM);
1380     switch(STATUS->GraphicStatus()){
1381     case AIS_DS_Displayed:
1382       {
1383         myMainPM->SetDisplayPriority(anIObj,DM,aPriority);
1384         break;
1385       }
1386     case AIS_DS_Erased:
1387       {
1388         myCollectorPM->SetDisplayPriority(anIObj,HM,aPriority);
1389         break;
1390       }
1391     default:
1392       break;
1393     }
1394   }
1395   else if (HasOpenedContext())
1396     {myLocalContexts(myCurLocalIndex)->SetDisplayPriority(anIObj,aPriority);}
1397 }
1398
1399 //=======================================================================
1400 //function : Redisplay
1401 //purpose  : 
1402 //=======================================================================
1403
1404 void AIS_InteractiveContext::Redisplay(const Handle(AIS_InteractiveObject)& anIObj,
1405                                       const Standard_Boolean updateviewer,
1406                                       const Standard_Boolean allmodes)
1407 {
1408   if(AISDebugModeOn()){
1409     cout<<"===>AIS_InteractiveContext::Redisplay de :";
1410     cout<<anIObj->DynamicType()->Name()<<endl;
1411   }
1412
1413   RecomputePrsOnly(anIObj,updateviewer,allmodes);
1414   RecomputeSelectionOnly(anIObj);
1415 }
1416
1417 //=======================================================================
1418 //function : Redisplay
1419 //purpose  : 
1420 //=======================================================================
1421
1422 void AIS_InteractiveContext::Redisplay(const AIS_KindOfInteractive KOI,
1423                                        const Standard_Integer /*Sign*/,
1424                                       const Standard_Boolean updateviewer)
1425 {
1426   Standard_Boolean found_viewer(Standard_False),found_coll(Standard_False);
1427   // update
1428   for(AIS_DataMapIteratorOfDataMapOfIOStatus It(myObjects);It.More();It.Next()){
1429     // CLE
1430     // const Handle(AIS_InteractiveObject)& IO = It.Key();
1431     Handle(AIS_InteractiveObject) IO = It.Key();
1432     // ENDCLE
1433     if(IO->Type()== KOI){ 
1434 #ifdef DEB
1435 //      Standard_Boolean good = (Sign==-1)? Standard_True : 
1436 //        ((IO->Signature()==Sign)? Standard_True:Standard_False);
1437 #endif
1438       Redisplay(IO,Standard_False);
1439       switch(It.Value()->GraphicStatus()){
1440       case AIS_DS_Displayed:
1441         found_viewer = Standard_True;
1442         break;
1443       case AIS_DS_Erased:
1444         found_coll = Standard_True;
1445         break;
1446       default:
1447         break;
1448       }
1449     }
1450   }
1451   // update viewer...
1452   if(updateviewer){
1453     if(found_viewer)
1454       myMainVwr->Update();
1455     if(found_coll)
1456       myCollectorVwr->Update();
1457   }
1458 }
1459
1460
1461 //=======================================================================
1462 //function : RecomputePrsOnly
1463 //purpose  : 
1464 //=======================================================================
1465
1466 void AIS_InteractiveContext::RecomputePrsOnly(const Handle(AIS_InteractiveObject)& anIObj,
1467                                               const Standard_Boolean updateviewer,
1468                                               const Standard_Boolean allmodes)
1469 {
1470   if(anIObj.IsNull()) return;
1471   anIObj->Update(allmodes);
1472   
1473   if(updateviewer)  {
1474     if(HasOpenedContext())
1475       myMainVwr->Update();
1476     else{
1477       if(myObjects.IsBound(anIObj)){
1478         switch(myObjects(anIObj)->GraphicStatus()){
1479         case AIS_DS_Displayed:
1480           myMainVwr->Update();
1481           break;
1482         case AIS_DS_Erased:
1483           {
1484             if(!myCollectorVwr.IsNull())
1485               myCollectorVwr->Update();
1486           }
1487         default:
1488           break;
1489         }
1490       }
1491     }
1492   }
1493 }
1494 //=======================================================================
1495 //function : RecomputeSelectionOnly
1496 //purpose  : 
1497 //=======================================================================
1498 void AIS_InteractiveContext::RecomputeSelectionOnly(const Handle(AIS_InteractiveObject)& anIObj)
1499 {
1500   if(anIObj.IsNull()) return;
1501   mgrSelector->RecomputeSelection(anIObj);
1502
1503
1504
1505   TColStd_ListOfInteger LI;
1506   TColStd_ListIteratorOfListOfInteger Lit;
1507   ActivatedModes(anIObj,LI);
1508   if(!HasOpenedContext()){
1509     if(!myObjects.IsBound(anIObj)) return;
1510     switch(myObjects(anIObj)->GraphicStatus())
1511       {
1512       case AIS_DS_Displayed:
1513         {
1514           for(Lit.Initialize(LI);Lit.More();Lit.Next())
1515             mgrSelector->Activate(anIObj,Lit.Value(),myMainSel);
1516           break;
1517         }
1518       case AIS_DS_Erased:
1519         {
1520           for(Lit.Initialize(LI);Lit.More();Lit.Next())
1521             mgrSelector->Activate(anIObj,Lit.Value(),myCollectorSel);
1522           
1523           break;
1524         }
1525       default:
1526         break;
1527       }
1528   }
1529 }
1530
1531 //=======================================================================
1532 //function : Update
1533 //purpose  : 
1534 //=======================================================================
1535
1536 void AIS_InteractiveContext::Update(const Handle(AIS_InteractiveObject)& anIObj,
1537                                     const Standard_Boolean updateviewer)
1538 {
1539   if(anIObj.IsNull()) return;
1540
1541   
1542
1543   TColStd_ListOfInteger LL;
1544   anIObj->ToBeUpdated(LL);
1545   TColStd_ListIteratorOfListOfInteger ITI(LL);
1546   Standard_Boolean wasupdated(Standard_False);
1547   
1548   for (;ITI.More();ITI.Next()){
1549     anIObj->Update(ITI.Value(),Standard_False);
1550     wasupdated = Standard_True;
1551   }
1552   
1553   if(wasupdated)
1554     mgrSelector->Update(anIObj);
1555   
1556   if(updateviewer){
1557     if(!myObjects.IsBound(anIObj)) return;
1558     switch(myObjects(anIObj)->GraphicStatus()){
1559     case AIS_DS_Displayed:
1560     case AIS_DS_Temporary:
1561       myMainVwr->Update();
1562       break;
1563     case AIS_DS_Erased:
1564       myCollectorVwr->Update();
1565       break;
1566     default:
1567       break;
1568     }
1569   }
1570 }
1571
1572
1573
1574 //=======================================================================
1575 //function : SetLocation
1576 //purpose  : 
1577 //=======================================================================
1578
1579 void AIS_InteractiveContext::SetLocation(const Handle(AIS_InteractiveObject)& anIObj,
1580                                          const TopLoc_Location& aLoc)
1581 {
1582   if(anIObj.IsNull()) return;
1583
1584
1585   if(anIObj->HasLocation() && aLoc.IsIdentity()){
1586     anIObj->ResetLocation();
1587     mgrSelector->Update(anIObj,Standard_False);
1588     return;
1589   }
1590   if(aLoc.IsIdentity()) return ;
1591
1592   // first reset the previous location to properly clean everything...
1593   if(anIObj->HasLocation())
1594     anIObj->ResetLocation();
1595
1596
1597   anIObj->SetLocation(aLoc);
1598   
1599   if(!HasOpenedContext())
1600     mgrSelector->Update(anIObj,Standard_False);
1601   else
1602     {
1603       // CLE
1604       // const Handle(StdSelect_ViewerSelector3d)& tempSel = myLocalContexts(myCurLocalIndex)->MainSelector();
1605       Handle(StdSelect_ViewerSelector3d) tempSel = myLocalContexts(myCurLocalIndex)->MainSelector();
1606       // ENDCLE
1607       mgrSelector->Update(anIObj,tempSel,Standard_False);
1608     }
1609 }
1610 //=======================================================================
1611 //function : ResetLocation
1612 //purpose  : 
1613 //=======================================================================
1614 void AIS_InteractiveContext::ResetLocation(const Handle(AIS_InteractiveObject)& anIObj)
1615 {
1616   if(anIObj.IsNull()) return;
1617
1618   anIObj->ResetLocation();
1619   mgrSelector->Update(anIObj,Standard_False);
1620 }
1621
1622 //=======================================================================
1623 //function : HasLocation
1624 //purpose  : 
1625 //=======================================================================
1626
1627 Standard_Boolean AIS_InteractiveContext::
1628 HasLocation(const Handle(AIS_InteractiveObject)& anIObj) const
1629 {
1630   if(anIObj.IsNull()) return Standard_False;
1631
1632   return anIObj->HasLocation();
1633 }
1634
1635 const TopLoc_Location& AIS_InteractiveContext::
1636 Location(const Handle(AIS_InteractiveObject)& anIObj) const
1637 {
1638   return anIObj->Location();
1639 }
1640
1641 //=======================================================================
1642 //function : SetDeviationCoefficient
1643 //purpose  : 
1644 //=======================================================================
1645
1646 void AIS_InteractiveContext::SetDeviationCoefficient(const Standard_Real aCoefficient)
1647 {
1648   myDefaultDrawer->SetDeviationCoefficient(aCoefficient);
1649 }
1650 //=======================================================================
1651 //function : SetDeviationAngle
1652 //purpose  : 
1653 //=======================================================================
1654
1655 void AIS_InteractiveContext::SetDeviationAngle(const Standard_Real anAngle)
1656 {
1657   myDefaultDrawer->SetDeviationCoefficient(anAngle);
1658 }
1659
1660 //=======================================================================
1661 //function : DeviationAngle
1662 //purpose  : Gets  deviationAngle
1663 //=======================================================================
1664
1665 Standard_Real AIS_InteractiveContext::DeviationAngle() const
1666 {
1667   //return M_PI/180.0e0 ;
1668     return myDefaultDrawer->DeviationAngle();
1669 }
1670
1671 //=======================================================================
1672 //function : DeviationCoefficient
1673 //purpose  : 
1674 //=======================================================================
1675
1676 Standard_Real AIS_InteractiveContext::DeviationCoefficient() const 
1677 {
1678   return myDefaultDrawer->DeviationCoefficient();
1679 }
1680 //=======================================================================
1681 //function : SetHLRDeviationCoefficient
1682 //purpose  : 
1683 //=======================================================================
1684
1685 void AIS_InteractiveContext::SetHLRDeviationCoefficient(const Standard_Real aCoefficient)
1686 {
1687   myDefaultDrawer->SetHLRDeviationCoefficient(aCoefficient);
1688 }
1689
1690 //=======================================================================
1691 //function : HLRDeviationCoefficient
1692 //purpose  : 
1693 //=======================================================================
1694
1695 Standard_Real AIS_InteractiveContext::HLRDeviationCoefficient() const 
1696 {
1697   return myDefaultDrawer->HLRDeviationCoefficient();
1698 }
1699
1700 //=======================================================================
1701 //function : SetHLRAngle
1702 //purpose  : 
1703 //=======================================================================
1704
1705 void AIS_InteractiveContext::SetHLRAngle(const Standard_Real anAngle)
1706 {
1707   myDefaultDrawer->SetHLRAngle(anAngle);
1708 }
1709
1710 //=======================================================================
1711 //function : SetHLRAngleAndDeviation
1712 //purpose  : compute with anangle a HLRAngle and a HLRDeviationCoefficient 
1713 //           and set them in myHLRAngle and in myHLRDeviationCoefficient
1714 //           of myDefaultDrawer 
1715 //=======================================================================
1716
1717 void AIS_InteractiveContext::SetHLRAngleAndDeviation(const Standard_Real anAngle)
1718 {
1719
1720   Standard_Real OutAngl,OutDefl;
1721   HLRBRep::PolyHLRAngleAndDeflection(anAngle,OutAngl,OutDefl);
1722
1723   myDefaultDrawer->SetHLRAngle(OutAngl);
1724   myDefaultDrawer->SetHLRDeviationCoefficient(OutDefl);
1725
1726 }
1727
1728 //=======================================================================
1729 //function : HLRAngle
1730 //purpose  : 
1731 //=======================================================================
1732
1733 Standard_Real AIS_InteractiveContext::HLRAngle() const 
1734 {
1735   return myDefaultDrawer->HLRAngle();
1736 }
1737
1738 //=======================================================================
1739 //function : SetDisplayMode
1740 //purpose  : 
1741 //=======================================================================
1742
1743 void AIS_InteractiveContext::SetDisplayMode(const AIS_DisplayMode aMode,
1744                                            const Standard_Boolean updateviewer)
1745 {
1746   if(aMode==myDisplayMode) return;
1747   AIS_DataMapIteratorOfDataMapOfIOStatus It(myObjects);
1748
1749   for(;It.More();It.Next()){
1750     // CLE
1751     // const Handle(AIS_InteractiveObject)& anObj = It.Key();
1752     Handle(AIS_InteractiveObject) anObj = It.Key();
1753     // ENDCLE
1754     Standard_Boolean Processed = (anObj->IsKind(STANDARD_TYPE(AIS_Shape)) ||
1755                                   anObj->IsKind(STANDARD_TYPE(AIS_ConnectedShape)) ||
1756                                   anObj->IsKind(STANDARD_TYPE(AIS_MultipleConnectedShape)) );
1757     
1758     if ((!anObj->HasDisplayMode()) && Processed) 
1759       {
1760         if(anObj->AcceptDisplayMode(aMode)){
1761           // CLE
1762           // const Handle(AIS_GlobalStatus)& STATUS = It.Value();
1763           Handle(AIS_GlobalStatus) STATUS = It.Value();
1764           // ENDCLE
1765           if(STATUS->IsDModeIn(myDisplayMode))
1766             STATUS->RemoveDisplayMode(myDisplayMode);
1767           
1768           STATUS->AddDisplayMode(aMode);
1769           
1770           if(STATUS->GraphicStatus()== AIS_DS_Displayed){
1771             myMainPM->Erase(anObj, myDisplayMode);
1772             myMainPM->Display(anObj, aMode);
1773             if(STATUS->IsSubIntensityOn())
1774               myMainPM->Color(anObj,mySubIntensity,aMode);
1775           }
1776           //  myDisplayMode = aMode;
1777         }
1778       }
1779     
1780   } 
1781   myDisplayMode = aMode;
1782   if(updateviewer) myMainVwr->Update();
1783 }
1784
1785 //=======================================================================
1786 //function : SetDisplayMode
1787 //purpose  : 
1788 //=======================================================================
1789
1790 void AIS_InteractiveContext::SetDisplayMode(const Handle(AIS_InteractiveObject)& anIObj, 
1791                                            const Standard_Integer aMode,
1792                                            const Standard_Boolean updateviewer)
1793 {
1794   
1795   if(!anIObj->HasInteractiveContext())
1796     anIObj->SetContext(this);
1797   if(!HasOpenedContext()){
1798     
1799     if(!myObjects.IsBound(anIObj)) 
1800       anIObj->SetDisplayMode(aMode);
1801 #ifdef BUC60632
1802     else if( anIObj->AcceptDisplayMode(aMode) ) 
1803 #else
1804     else
1805 #endif
1806     {
1807       // CLE
1808       // const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj);
1809       Handle(AIS_GlobalStatus) STATUS = myObjects(anIObj);
1810       // ENDCLE
1811 #ifndef OCC4373      
1812       // the interactive object has no mode : OldMode = Mode Session
1813       //                    already has a mode : OldMode = old mode Propre
1814
1815       Standard_Integer OldMode = anIObj->HasDisplayMode() ?  anIObj->DisplayMode(): myDisplayMode;
1816       
1817       if(STATUS->IsDModeIn(OldMode))
1818         STATUS->RemoveDisplayMode(OldMode);
1819       STATUS->AddDisplayMode(aMode);
1820       
1821       if(STATUS->GraphicStatus()==AIS_DS_Displayed){
1822         if(aMode!=OldMode ){
1823           if(myMainPM->IsHighlighted(anIObj,OldMode))
1824             myMainPM->Unhighlight(anIObj,OldMode);
1825           
1826           myMainPM->Erase(anIObj,OldMode);
1827 #else
1828       // SAN : erase presentations for all display modes different from <aMode>
1829       if(STATUS->GraphicStatus()==AIS_DS_Displayed){
1830         TColStd_ListOfInteger aModesToRemove;
1831         TColStd_ListIteratorOfListOfInteger ItL (STATUS->DisplayedModes());
1832         for(;ItL.More();ItL.Next()){
1833
1834           Standard_Integer OldMode = ItL.Value();
1835
1836           if(OldMode!=aMode){
1837             aModesToRemove.Append(OldMode);
1838             if(myMainPM->IsHighlighted(anIObj,OldMode))
1839               myMainPM->Unhighlight(anIObj,OldMode);
1840             myMainPM->Erase(anIObj,OldMode);
1841           }
1842         }
1843
1844         for(ItL.Initialize(aModesToRemove);ItL.More();ItL.Next())
1845           STATUS->RemoveDisplayMode(ItL.Value());
1846
1847         if(!STATUS->IsDModeIn(aMode))
1848           STATUS->AddDisplayMode(aMode);
1849 #endif
1850         
1851         myMainPM->Display(anIObj,aMode);
1852         Standard_Integer DM,HM,SM;
1853         GetDefModes(anIObj,DM,HM,SM);
1854         if(STATUS->IsHilighted()){
1855           myMainPM->Highlight(anIObj,HM);
1856         }
1857         if(STATUS->IsSubIntensityOn()){
1858           myMainPM->Color(anIObj,mySubIntensity,aMode);
1859         }
1860         if(anIObj->IsTransparent() && !myMainVwr->Viewer()->Transparency())
1861           myMainVwr->Viewer()->SetTransparency(Standard_True);
1862         
1863         if(updateviewer) myMainVwr->Update();
1864 #ifndef OCC4373 
1865         }
1866 #endif
1867       }
1868       anIObj->SetDisplayMode(aMode);
1869     }
1870   }
1871 }
1872
1873 //=======================================================================
1874 //function : UnsetDisplayMode
1875 //purpose  : 
1876 //=======================================================================
1877
1878 void AIS_InteractiveContext::
1879 UnsetDisplayMode(const Handle(AIS_InteractiveObject)& anIObj,
1880                  const Standard_Boolean updateviewer)
1881 {
1882   if(anIObj.IsNull()) return ;
1883   if(!anIObj->HasDisplayMode()) return;
1884   
1885   if(!myObjects.IsBound(anIObj))
1886     anIObj->UnsetDisplayMode();
1887   else
1888     {
1889       Standard_Integer OldMode = anIObj->DisplayMode();
1890       if(myDisplayMode==OldMode) return;
1891       const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj);
1892       STATUS->RemoveDisplayMode(OldMode);
1893       if(!STATUS->IsDModeIn(myDisplayMode))
1894         STATUS->AddDisplayMode(myDisplayMode);
1895       if(STATUS->GraphicStatus()==AIS_DS_Displayed){
1896         if(myMainPM->IsHighlighted(anIObj,OldMode))
1897           myMainPM->Unhighlight(anIObj,OldMode);
1898         myMainPM->Erase(anIObj,OldMode);
1899         myMainPM->Display(anIObj,myDisplayMode);
1900         Standard_Integer DM,HM,SM;
1901         GetDefModes(anIObj,DM,HM,SM);
1902         if(STATUS->IsHilighted()){
1903           myMainPM->Highlight(anIObj,HM);
1904         }
1905         if(STATUS->IsSubIntensityOn()){
1906           myMainPM->Color(anIObj,mySubIntensity,myDisplayMode);
1907         }
1908         if(updateviewer) myMainVwr->Update();
1909       }
1910       anIObj->UnsetDisplayMode();
1911       
1912     }
1913 }
1914
1915 //=======================================================================
1916 //function : SetCurrentFacingModel
1917 //purpose  : 
1918 //=======================================================================
1919
1920 void AIS_InteractiveContext::SetCurrentFacingModel(
1921                         const Handle(AIS_InteractiveObject)& anIObj,
1922                         const Aspect_TypeOfFacingModel aModel)
1923 {
1924   if (  !anIObj.IsNull ()  )
1925     anIObj->SetCurrentFacingModel(aModel);
1926 }
1927
1928 //=======================================================================
1929 //function : SetColor
1930 //purpose  : 
1931 //=======================================================================
1932
1933 void AIS_InteractiveContext::SetColor(const Handle(AIS_InteractiveObject)& anIObj, 
1934                                      const Quantity_NameOfColor aColor,
1935                                      const Standard_Boolean updateviewer)
1936 {
1937   SetColor(anIObj,Quantity_Color(aColor),updateviewer);
1938 }
1939
1940 void AIS_InteractiveContext::SetColor(const Handle(AIS_InteractiveObject)& anIObj, 
1941                                      const Quantity_Color &aColor,
1942                                      const Standard_Boolean updateviewer)
1943 {
1944   if(anIObj.IsNull()) return ;
1945  
1946   if(!anIObj->HasInteractiveContext())
1947     anIObj->SetContext(this);
1948   anIObj->SetColor(aColor);
1949   if(anIObj->RecomputeEveryPrs())
1950     anIObj->Redisplay();
1951   else
1952     {
1953       Standard_Integer NbDisp=0;
1954       TColStd_ListIteratorOfListOfInteger ITI(anIObj->ListOfRecomputeModes());
1955       for (;ITI.More();ITI.Next())
1956         {
1957           anIObj->Update(ITI.Value(),Standard_False);
1958           NbDisp++;
1959         }
1960       anIObj->SetRecomputeOk();
1961 #ifdef DEB
1962       cout<<"nb of modes to recalculate : "<<NbDisp<<endl;
1963 #endif
1964     }
1965
1966
1967 #ifdef DEB
1968 //   // pour isg
1969 //   if(anIObj->Type()==AIS_KOI_Datum && anIObj->Signature()==3){
1970 //     Handle(AIS_Trihedron) Tr = *((Handle(AIS_Trihedron)*)&anIObj);
1971 //     Standard_Real Lx = myDefaultDrawer->DatumAspect()->FirstAxisLength();
1972 //     gp_Trsf T; 
1973 //     gp_Dir D =Tr->Component()->XDirection();
1974 //     gp_Pnt O = Tr->Component()->Location();
1975 //     gp_Vec V(D);V*=Lx/5.;
1976 //     T.SetRotation(gp_Ax1(O,D),M_PI/6.);
1977 //     T.SetTranslationPart(V);
1978 //     TopLoc_Location L,IncLoc(T);
1979    
1980 //     for(Standard_Integer I=1;I<90;I++){
1981 //       if(anIObj->HasLocation())
1982 //      L = anIObj->Location() * IncLoc;
1983 //       else
1984 //      L = IncLoc;
1985 //       SetLocation(anIObj,L);
1986 //       UpdateCurrentViewer();
1987 //     }
1988 //      for(I=1;I<90;I++){
1989 //        L = anIObj->Location() /IncLoc;
1990 //       SetLocation(anIObj,L);
1991 //       UpdateCurrentViewer();
1992 //     }
1993 //    ResetLocation(anIObj);
1994 //   }
1995  #endif
1996   if(updateviewer) UpdateCurrentViewer();
1997 }
1998
1999 //=======================================================================
2000 //function : SetDeviationCoefficient
2001 //purpose  : 
2002 //=======================================================================
2003
2004 void AIS_InteractiveContext::SetDeviationCoefficient(
2005                                      const Handle(AIS_InteractiveObject)& anIObj, 
2006                                      const Standard_Real   aCoefficient,
2007                                      const Standard_Boolean updateviewer)
2008 {
2009 //  cout<<" Coefficient:"<< aCoefficient <<endl;
2010   if(anIObj.IsNull()) return ;
2011  
2012   if(!anIObj->HasInteractiveContext())
2013     anIObj->SetContext(this);
2014
2015   // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
2016   if(anIObj->Type()!=AIS_KOI_Object && anIObj->Type()!=AIS_KOI_Shape) return;
2017   if(anIObj->Signature()!=0) return;
2018   (*((Handle(AIS_Shape)*)&anIObj))->SetOwnDeviationCoefficient(aCoefficient);
2019
2020
2021
2022   if(anIObj->RecomputeEveryPrs())
2023     anIObj->Redisplay();
2024   else
2025     {
2026       Standard_Integer NbDisp=0;
2027       TColStd_ListOfInteger LL;
2028       anIObj->ToBeUpdated(LL);
2029       TColStd_ListIteratorOfListOfInteger ITI(LL);
2030       for (;ITI.More();ITI.Next())
2031         {
2032           anIObj->Update(ITI.Value(),Standard_False);
2033           NbDisp++;
2034         }
2035       anIObj->SetRecomputeOk();
2036 #ifdef DEB
2037       cout<<"nb of modes to recalculate : "<<NbDisp<<endl;
2038 #endif
2039     }
2040   if(updateviewer) UpdateCurrentViewer();
2041 }
2042
2043 //=======================================================================
2044 //function : SetHLRDeviationCoefficient
2045 //purpose  : 
2046 //=======================================================================
2047
2048 void AIS_InteractiveContext::SetHLRDeviationCoefficient(
2049                                      const Handle(AIS_InteractiveObject)& anIObj, 
2050                                      const Standard_Real    aCoefficient,
2051                                      const Standard_Boolean updateviewer)
2052 {
2053 //  cout<<" HLRCoefficient:"<< aCoefficient <<endl;
2054   if(anIObj.IsNull()) return ;
2055  
2056   if(!anIObj->HasInteractiveContext())
2057     anIObj->SetContext(this);
2058   // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
2059   if(anIObj->Type()!=AIS_KOI_Object && anIObj->Type()!=AIS_KOI_Shape) return;
2060   if(anIObj->Signature()!=0) return;
2061   (*((Handle(AIS_Shape)*)&anIObj))->SetOwnHLRDeviationCoefficient(aCoefficient);
2062
2063
2064
2065   if(anIObj->RecomputeEveryPrs())
2066     anIObj->Redisplay();
2067   else
2068     {
2069       Standard_Integer NbDisp=0;
2070
2071       TColStd_ListOfInteger LL;
2072       anIObj->ToBeUpdated(LL);
2073       TColStd_ListIteratorOfListOfInteger ITI(LL);
2074       for (;ITI.More();ITI.Next())
2075         {
2076           anIObj->Update(ITI.Value(),Standard_False);
2077           NbDisp++;
2078         }
2079       anIObj->SetRecomputeOk();
2080 #ifdef DEB
2081       cout<<"nb of modes to recalculate : "<<NbDisp<<endl;
2082 #endif
2083     }
2084   if(updateviewer) UpdateCurrentViewer();
2085 }
2086
2087
2088 //=======================================================================
2089 //function : SetDeviationAngle
2090 //purpose  : 
2091 //=======================================================================
2092
2093 void AIS_InteractiveContext::SetDeviationAngle(
2094                                      const Handle(AIS_InteractiveObject)& anIObj, 
2095                                      const Standard_Real   anAngle,
2096                                      const Standard_Boolean updateviewer)
2097 {
2098 //  cout<<" Angle:"<< anAngle <<endl;
2099   if(anIObj.IsNull()) return ;
2100  
2101   if(!anIObj->HasInteractiveContext())
2102     anIObj->SetContext(this);
2103   // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
2104   if(anIObj->Type()!=AIS_KOI_Shape) return;
2105   if(anIObj->Signature()!=0) return;
2106   (*((Handle(AIS_Shape)*)&anIObj))->SetOwnDeviationAngle(anAngle);
2107
2108
2109   if(anIObj->RecomputeEveryPrs())
2110     anIObj->Redisplay();
2111   else
2112     {
2113       Standard_Integer NbDisp=0;
2114       TColStd_ListOfInteger LL;
2115       anIObj->ToBeUpdated(LL);
2116       TColStd_ListIteratorOfListOfInteger ITI(LL);
2117       for (;ITI.More();ITI.Next())
2118         {
2119           anIObj->Update(ITI.Value(),Standard_False);
2120           NbDisp++;
2121         }
2122       anIObj->SetRecomputeOk();
2123 #ifdef DEB
2124       cout<<"nb of modes to recalculate : "<<NbDisp<<endl;
2125 #endif
2126     }
2127   if(updateviewer) UpdateCurrentViewer();
2128 }
2129 //=======================================================================
2130 //function : SetDeviationAngle
2131 //purpose  : 
2132 //=======================================================================
2133
2134 void AIS_InteractiveContext::SetAngleAndDeviation(
2135                                      const Handle(AIS_InteractiveObject)& anIObj, 
2136                                      const Standard_Real   anAngle,
2137                                      const Standard_Boolean updateviewer)
2138 {
2139 //  cout<<" Angle:"<< anAngle <<endl;
2140   if(anIObj.IsNull()) return ;
2141 //   Standard_Real anAngleRad = M_PI*anAngle/180; test rob...
2142   if(!anIObj->HasInteractiveContext())
2143     anIObj->SetContext(this);
2144
2145   // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
2146   if(anIObj->Type()!=AIS_KOI_Shape) return;
2147   if(anIObj->Signature()!=0) return;
2148   (*((Handle(AIS_Shape)*)&anIObj))->SetAngleAndDeviation(anAngle);
2149
2150
2151   if(anIObj->RecomputeEveryPrs())
2152     anIObj->Redisplay();
2153   else
2154     Update(anIObj,updateviewer);
2155 }
2156
2157 //=======================================================================
2158 //function : SetDeviationAngle
2159 //purpose  : 
2160 //=======================================================================
2161
2162 void AIS_InteractiveContext::SetHLRAngleAndDeviation(
2163                                      const Handle(AIS_InteractiveObject)& anIObj, 
2164                                      const Standard_Real   anAngle,
2165                                      const Standard_Boolean updateviewer)
2166 {
2167 //  cout<<" Angle:"<< anAngle <<endl;
2168
2169   if(anIObj.IsNull()) return ;
2170    if(!anIObj->HasInteractiveContext())
2171     anIObj->SetContext(this);
2172
2173   // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
2174   if(anIObj->Type()!=AIS_KOI_Shape) return;
2175   if(anIObj->Signature()!=0) return;
2176   (*((Handle(AIS_Shape)*)&anIObj))->SetHLRAngleAndDeviation(anAngle);
2177
2178
2179   if(anIObj->RecomputeEveryPrs())
2180     anIObj->Redisplay();
2181   else
2182     {
2183       Standard_Integer NbDisp=0;
2184
2185       TColStd_ListOfInteger LL;
2186       anIObj->ToBeUpdated(LL);
2187       TColStd_ListIteratorOfListOfInteger ITI(LL);
2188       for (;ITI.More();ITI.Next())
2189         {
2190           anIObj->Update(ITI.Value(),Standard_False);
2191           NbDisp++;
2192         }
2193       anIObj->SetRecomputeOk();
2194 #ifdef DEB
2195       cout<<"nb of modes to recalculate : "<<NbDisp<<endl;
2196 #endif
2197     }
2198   if(updateviewer) UpdateCurrentViewer();
2199 }
2200
2201 //=======================================================================
2202 //function : SetHLRDeviationAngle
2203 //purpose  : 
2204 //=======================================================================
2205
2206 void AIS_InteractiveContext::SetHLRDeviationAngle(
2207                                      const Handle(AIS_InteractiveObject)& anIObj, 
2208                                      const Standard_Real   anAngle,
2209                                      const Standard_Boolean updateviewer)
2210 {
2211 //  cout<<" HLRAngle:"<< anAngle <<endl;
2212   if(anIObj.IsNull()) return ;
2213  
2214   if(!anIObj->HasInteractiveContext())
2215     anIObj->SetContext(this);
2216   // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
2217   if( anIObj->Type()!=AIS_KOI_Shape) return;
2218   if(anIObj->Signature()!=0) return;
2219   (*((Handle(AIS_Shape)*)&anIObj))->SetOwnHLRDeviationAngle(anAngle);
2220
2221
2222   if(anIObj->RecomputeEveryPrs())
2223     anIObj->Redisplay();
2224   else
2225     {
2226       Standard_Integer NbDisp=0;
2227       TColStd_ListOfInteger LL;
2228       anIObj->ToBeUpdated(LL);
2229       TColStd_ListIteratorOfListOfInteger ITI(LL);
2230       for (;ITI.More();ITI.Next())
2231         {
2232           anIObj->Update(ITI.Value(),Standard_False);
2233           NbDisp++;
2234         }
2235       anIObj->SetRecomputeOk();
2236 #ifdef DEB
2237       cout<<"nb of modes to recalculate : "<<NbDisp<<endl;
2238 #endif
2239     }
2240   if(updateviewer) UpdateCurrentViewer();
2241 }
2242
2243 //=======================================================================
2244 //function : UnsetColor
2245 //purpose  : 
2246 //=======================================================================
2247
2248 void AIS_InteractiveContext::UnsetColor(const Handle(AIS_InteractiveObject)& anIObj,
2249                                      const Standard_Boolean updateviewer)
2250 {
2251   if(anIObj.IsNull()) return ;
2252    anIObj->UnsetColor();
2253   if(anIObj->RecomputeEveryPrs())
2254     anIObj->Redisplay();
2255   else
2256     {
2257       Standard_Integer NbDisp =0;
2258       TColStd_ListIteratorOfListOfInteger ITI(anIObj->ListOfRecomputeModes());
2259       for (;ITI.More();ITI.Next())
2260         {
2261           anIObj->Update(ITI.Value(),Standard_False);
2262           NbDisp++;
2263         }
2264 #ifdef DEB
2265       cout<<"nb of modes to recalculate : "<<NbDisp<<endl;
2266 #endif
2267       anIObj->SetRecomputeOk();
2268     }
2269   if(updateviewer) 
2270     UpdateCurrentViewer();
2271 }
2272
2273 //=======================================================================
2274 //function : HasColor
2275 //purpose  : 
2276 //=======================================================================
2277
2278 Standard_Boolean AIS_InteractiveContext::HasColor(const Handle(AIS_InteractiveObject)& anIObj) const 
2279 {
2280   return anIObj->HasColor();
2281
2282 }
2283
2284 //=======================================================================
2285 //function : Color
2286 //purpose  : 
2287 //=======================================================================
2288
2289 Quantity_NameOfColor AIS_InteractiveContext::Color(const Handle(AIS_InteractiveObject)& anIObj) const 
2290 {
2291   return anIObj->Color();
2292 }
2293
2294 void AIS_InteractiveContext::Color(const Handle(AIS_InteractiveObject)& anIObj,
2295                                    Quantity_Color &aColor) const
2296 {
2297   anIObj->Color(aColor);
2298 }
2299
2300 //=======================================================================
2301 //function : Width
2302 //purpose  : 
2303 //=======================================================================
2304
2305 Standard_Real AIS_InteractiveContext::Width(const Handle(AIS_InteractiveObject)& anIObj) const 
2306 {
2307   return anIObj->Width();
2308 }
2309
2310 //=======================================================================
2311 //function : SetWidth
2312 //purpose  : 
2313 //=======================================================================
2314
2315 void AIS_InteractiveContext::SetWidth(const Handle(AIS_InteractiveObject)& anIObj,
2316                                      const Standard_Real aValue,
2317                                      const Standard_Boolean updateviewer)
2318 {
2319   if(anIObj.IsNull()) return ;
2320  
2321   if(!anIObj->HasInteractiveContext())
2322     anIObj->SetContext(this);
2323   anIObj->SetWidth(aValue);
2324   if(anIObj->RecomputeEveryPrs())
2325     anIObj->Redisplay();
2326   else
2327     {
2328       Standard_Integer NbDisp=0;
2329       TColStd_ListIteratorOfListOfInteger ITI(anIObj->ListOfRecomputeModes());
2330       for (;ITI.More();ITI.Next())
2331         {
2332           anIObj->Update(ITI.Value(),Standard_False);
2333           NbDisp++;
2334         }
2335 #ifdef DEB
2336       cout<<"nb of modes to recalculate : "<<NbDisp<<endl;
2337 #endif
2338       anIObj->SetRecomputeOk();
2339     }
2340    if(updateviewer) 
2341     UpdateCurrentViewer();
2342 }
2343
2344 //=======================================================================
2345 //function : UnsetWidth
2346 //purpose  : 
2347 //=======================================================================
2348
2349 void AIS_InteractiveContext::UnsetWidth(const Handle(AIS_InteractiveObject)& anIObj,
2350                                        const Standard_Boolean updateviewer)
2351 {
2352   if(anIObj.IsNull()) return ;
2353    anIObj->UnsetWidth();
2354   if(anIObj->RecomputeEveryPrs())
2355     anIObj->Redisplay();
2356   else
2357     {
2358       TColStd_ListIteratorOfListOfInteger ITI(anIObj->ListOfRecomputeModes());
2359       for (;ITI.More();ITI.Next())
2360         {
2361           anIObj->Update(ITI.Value(),Standard_False);
2362         }
2363       anIObj->SetRecomputeOk();
2364     }
2365    if(updateviewer) 
2366     UpdateCurrentViewer();
2367 }
2368
2369 //=======================================================================
2370 //function : SetMaterial
2371 //purpose  : 
2372 //=======================================================================
2373
2374 void AIS_InteractiveContext::SetMaterial(const Handle(AIS_InteractiveObject)& anIObj,
2375 //POP pour K4L
2376                                         const Graphic3d_NameOfMaterial aName,
2377 //                                      const Graphic3d_NameOfPhysicalMaterial aName,
2378                                         const Standard_Boolean updateviewer)
2379 {
2380   if(!anIObj->HasInteractiveContext())
2381     anIObj->SetContext(this);
2382   anIObj->SetMaterial(aName);
2383   if(anIObj->RecomputeEveryPrs())
2384     anIObj->Redisplay();
2385   else
2386     {
2387       TColStd_ListIteratorOfListOfInteger ITI(anIObj->ListOfRecomputeModes());
2388       for (;ITI.More();ITI.Next())
2389         {
2390           anIObj->Update(ITI.Value(),Standard_False);
2391         }
2392       anIObj->SetRecomputeOk();
2393     }
2394    if(updateviewer)
2395     UpdateCurrentViewer();
2396
2397 }
2398
2399 //=======================================================================
2400 //function : UnsetMaterial
2401 //purpose  : 
2402 //=======================================================================
2403
2404 void AIS_InteractiveContext::UnsetMaterial(const Handle(AIS_InteractiveObject)& anIObj,
2405                                           const Standard_Boolean updateviewer)
2406 {
2407   if(anIObj.IsNull()) return ;
2408   anIObj->UnsetMaterial();
2409   if(anIObj->RecomputeEveryPrs())
2410     anIObj->Redisplay();
2411   else
2412     {
2413       TColStd_ListIteratorOfListOfInteger ITI(anIObj->ListOfRecomputeModes());
2414       for (;ITI.More();ITI.Next())
2415         {
2416           anIObj->Update(ITI.Value(),Standard_False);
2417         }
2418       anIObj->SetRecomputeOk();
2419     }
2420   if(updateviewer)
2421     UpdateCurrentViewer();
2422 }
2423
2424 //=======================================================================
2425 //function : SetTransparency
2426 //purpose  : 
2427 //=======================================================================
2428
2429 void AIS_InteractiveContext::SetTransparency(const Handle(AIS_InteractiveObject)& anIObj,
2430                                             const Standard_Real aValue,
2431                                             const Standard_Boolean updateviewer)
2432 {
2433   if(anIObj.IsNull()) return ;
2434    if(!anIObj->HasInteractiveContext())
2435     anIObj->SetContext(this);
2436
2437 #ifdef BUC60577 //right optimization
2438   if(!anIObj->IsTransparent() && aValue<=0.05) return;
2439 #else  
2440 //  if(!anIObj->IsTransparent() && aValue<=0.05) return;
2441 #endif
2442   if(aValue<=0.05){
2443     UnsetTransparency(anIObj,updateviewer);
2444     return;
2445   }
2446   
2447   if(!myMainVwr->Viewer()->Transparency())
2448     myMainVwr->Viewer()->SetTransparency(Standard_True);
2449   anIObj->SetTransparency(aValue);
2450   if(anIObj->RecomputeEveryPrs())
2451     anIObj->Redisplay();
2452   else
2453     {
2454       TColStd_ListIteratorOfListOfInteger ITI(anIObj->ListOfRecomputeModes());
2455       for (;ITI.More();ITI.Next())
2456         {
2457           anIObj->Update(ITI.Value(),Standard_False);
2458         }
2459       anIObj->SetRecomputeOk();
2460     }
2461    if(updateviewer)
2462     UpdateCurrentViewer();
2463 }
2464
2465 //=======================================================================
2466 //function : UnsetTransparency
2467 //purpose  : 
2468 //=======================================================================
2469
2470 void AIS_InteractiveContext::UnsetTransparency(const Handle(AIS_InteractiveObject)& anIObj,
2471                                               const Standard_Boolean updateviewer)
2472 {
2473   if(anIObj.IsNull()) return ;
2474    anIObj->UnsetTransparency();
2475   if(anIObj->RecomputeEveryPrs())
2476     anIObj->Redisplay();
2477   else
2478     {
2479       TColStd_ListIteratorOfListOfInteger ITI(anIObj->ListOfRecomputeModes());
2480       for (;ITI.More();ITI.Next())
2481         {
2482           anIObj->Update(ITI.Value(),Standard_False);
2483         }
2484       anIObj->SetRecomputeOk();
2485     }
2486
2487   // To Unset transparency in the viewer, if no other object is transparent ...(Speed)
2488   AIS_DataMapIteratorOfDataMapOfIOStatus It(myObjects);
2489   Standard_Boolean FoundTransp(Standard_False);
2490   for(;It.More() && !FoundTransp ;It.Next()){
2491     if(It.Key()->IsTransparent())
2492       FoundTransp = Standard_True;
2493   }
2494   if(!FoundTransp)
2495     myMainVwr->Viewer()->SetTransparency(Standard_False);
2496   
2497   
2498   if(updateviewer)
2499     UpdateCurrentViewer();
2500 }
2501
2502 //=======================================================================
2503 //function : SetSelectedAspect
2504 //purpose  : 
2505 //=======================================================================
2506 void AIS_InteractiveContext::SetSelectedAspect(
2507                                 const Handle(Prs3d_BasicAspect)& anAspect,
2508                                 const Standard_Boolean globalChange,
2509                                 const Standard_Boolean updateViewer)
2510 {
2511   if( !HasOpenedContext() ) {
2512     Standard_Boolean found = Standard_False;
2513     Handle(AIS_Selection) sel = 
2514                 AIS_Selection::Selection(myCurrentName.ToCString());
2515     Handle(AIS_InteractiveObject) object;
2516     for( sel->Init() ; sel->More() ; sel->Next()) {
2517       found = Standard_True;
2518       object = Handle(AIS_InteractiveObject)::DownCast(sel->Value());
2519       object->SetAspect(anAspect,globalChange);
2520     }
2521     if( found && updateViewer) {
2522       myMainVwr->Update();
2523       if( !(myIsCollClosed && myCollectorVwr.IsNull()) ) 
2524         myCollectorVwr->Update();
2525     }
2526   }
2527 }
2528
2529 //=======================================================================
2530 //function : SetLocalAttributes
2531 //purpose  : 
2532 //=======================================================================
2533
2534 void AIS_InteractiveContext::SetLocalAttributes(const Handle(AIS_InteractiveObject)& anIObj, 
2535                                                 const Handle(AIS_Drawer)& aDrawer,
2536                                                 const Standard_Boolean updateviewer)
2537 {
2538   if(anIObj.IsNull()) return ;
2539   if(!anIObj->HasInteractiveContext())
2540     anIObj->SetContext(this);
2541   anIObj->SetAttributes(aDrawer);
2542   Update(anIObj,updateviewer);
2543   
2544 }
2545
2546 //=======================================================================
2547 //function : UnsetLocalAttributes
2548 //purpose  : 
2549 //=======================================================================
2550 void AIS_InteractiveContext::UnsetLocalAttributes(const Handle(AIS_InteractiveObject)& anIObj,
2551                                                   const Standard_Boolean updateviewer)
2552 {
2553   if(anIObj.IsNull()) return ;
2554   if(!anIObj->HasInteractiveContext())
2555     anIObj->SetContext(this);
2556   anIObj->UnsetAttributes();
2557   Update(anIObj,updateviewer);
2558 }
2559
2560
2561 //=======================================================================
2562 //function : Status
2563 //purpose  : 
2564 //=======================================================================
2565
2566 void AIS_InteractiveContext::Status(const Handle(AIS_InteractiveObject)& anIObj, TCollection_ExtendedString& astatus) const 
2567 {
2568   astatus = "";
2569
2570   if(anIObj.IsNull()) return ;
2571   if(myObjects.IsBound(anIObj)){
2572     astatus += "\t ____________________________________________";
2573     astatus += "\t| Known at Neutral Point:\n\tDisplayStatus:";
2574     const Handle(AIS_GlobalStatus)& ST = myObjects(anIObj);
2575     switch(ST->GraphicStatus()){
2576     case AIS_DS_Displayed:
2577       {
2578         astatus +="\t| -->Displayed\n";
2579         break;
2580       }
2581     case AIS_DS_Erased:
2582       {
2583         astatus +="\t| -->Erased\n";
2584         break;
2585       }
2586     case AIS_DS_FullErased:
2587       {
2588         astatus +="\t| -->Full Erased\n";
2589         break;
2590       }
2591     default:
2592       break;
2593     }
2594     astatus += "\t| Active Display Modes in the MainViewer :\n";
2595     TColStd_ListIteratorOfListOfInteger ItL (ST->DisplayedModes());
2596     for(;ItL.More();ItL.Next()){
2597       astatus += "\t|\t Mode ";
2598       astatus += TCollection_AsciiString(ItL.Value());
2599       astatus+="\n";
2600     }   
2601     if(IsCurrent(anIObj)) astatus +="\t| Current\n";
2602     if(IsSelected(anIObj)) astatus +="\t| Selected\n";
2603
2604     astatus += "\t| Active Selection Modes in the MainViewer :\n";
2605     for(ItL.Initialize(ST->SelectionModes());ItL.More();ItL.Next()){
2606       astatus += "\t\t Mode ";
2607       astatus += TCollection_AsciiString(ItL.Value());
2608       astatus+="\n";
2609     }   
2610     astatus += "\t ____________________________________________";
2611       
2612     }
2613 }
2614
2615
2616 //=======================================================================
2617 //function : GetDefModes
2618 //purpose  : 
2619 //=======================================================================
2620
2621 void AIS_InteractiveContext::GetDefModes(const Handle(AIS_InteractiveObject)& anIObj,
2622                                      Standard_Integer& DispMode,
2623                                      Standard_Integer& HiMode,
2624                                      Standard_Integer& SelMode) const 
2625 {
2626   if(anIObj.IsNull()) return ;
2627   DispMode = anIObj->HasDisplayMode() ? anIObj->DisplayMode() : 
2628   (anIObj->AcceptDisplayMode(myDisplayMode)? myDisplayMode : 0);
2629   
2630   HiMode = anIObj->HasHilightMode()? anIObj->HilightMode():DispMode;
2631 #ifdef BUC61051
2632   SelMode = anIObj->HasSelectionMode()? anIObj->SelectionMode() : -1;
2633 #else
2634   SelMode = anIObj->HasSelectionMode()? anIObj->SelectionMode() : 0;
2635 #endif
2636 }
2637
2638
2639 //=======================================================================
2640 //function : EraseGlobal
2641 //purpose  : 
2642 //=======================================================================
2643
2644 void AIS_InteractiveContext::EraseGlobal(const Handle(AIS_InteractiveObject)& anIObj, 
2645                                          const Standard_Boolean updateviewer, 
2646                                          const Standard_Boolean PutInCollector)
2647 {
2648   if(anIObj.IsNull()) return ;
2649   if(!myObjects.IsBound(anIObj)) return;
2650
2651   // CLE
2652   // const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj);
2653   Handle(AIS_GlobalStatus) STATUS = myObjects(anIObj);
2654   // ENDCLE
2655   Standard_Integer Dmode = anIObj->HasHilightMode() ? anIObj->HilightMode() : 0;
2656   if(STATUS->GraphicStatus()==AIS_DS_Displayed){
2657     
2658     TColStd_ListIteratorOfListOfInteger ItL (STATUS->DisplayedModes());
2659     for(;ItL.More();ItL.Next()){
2660       if(myMainPM->IsHighlighted(anIObj,ItL.Value()))
2661         myMainPM->Unhighlight(anIObj,ItL.Value());
2662       myMainPM->Erase(anIObj,ItL.Value());
2663     }
2664     if(IsCurrent(anIObj) && !STATUS->IsDModeIn(Dmode))
2665       myMainPM->Erase(anIObj,Dmode);
2666     
2667     for(ItL.Initialize(STATUS->SelectionModes());ItL.More();ItL.Next())
2668       mgrSelector->Deactivate(anIObj,ItL.Value(),myMainSel);
2669     if(updateviewer) myMainVwr->Update();
2670   }
2671   if(PutInCollector && !myCollectorPM.IsNull()){
2672     myCollectorPM->Display(anIObj,Dmode);
2673 #ifdef OCC328
2674     Standard_Integer SMode = anIObj->SelectionMode();
2675     mgrSelector->Activate(anIObj,SMode,myCollectorSel);
2676 #else
2677     mgrSelector->Activate(anIObj,0,myCollectorSel);
2678 #endif
2679     if(STATUS->IsHilighted())
2680       myCollectorPM->Highlight(anIObj,Dmode);
2681     STATUS->SetGraphicStatus(AIS_DS_Erased);
2682     if(updateviewer) myCollectorVwr->Update();
2683   }
2684   else
2685     STATUS->SetGraphicStatus(AIS_DS_FullErased);
2686   
2687 }
2688
2689 //=======================================================================
2690 //function : ClearGlobal
2691 //purpose  : 
2692 //=======================================================================
2693
2694 void AIS_InteractiveContext::ClearGlobal(const Handle(AIS_InteractiveObject)& anIObj, 
2695                                          const Standard_Boolean updateviewer)
2696 {
2697   if(anIObj.IsNull()) return ;
2698   if(!myObjects.IsBound(anIObj)) return;
2699   // CLE
2700   // const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj);
2701   Handle(AIS_GlobalStatus) STATUS = myObjects(anIObj);
2702   // ENDCLE
2703    TColStd_ListIteratorOfListOfInteger ItL (STATUS->DisplayedModes());
2704    for(;ItL.More();ItL.Next()){
2705      if(STATUS->IsHilighted()){
2706        if(IsCurrent(anIObj))
2707 #ifdef OCC204
2708          AddOrRemoveCurrentObject( anIObj, updateviewer );
2709 #else
2710          AddOrRemoveCurrentObject(anIObj);
2711 #endif
2712        else if(myMainPM->IsHighlighted(anIObj,ItL.Value()))
2713          myMainPM->Unhighlight(anIObj,ItL.Value());
2714      }
2715      myMainPM->Erase(anIObj,ItL.Value());
2716      myMainPM->Clear(anIObj,ItL.Value());
2717      if(anIObj->HasHilightMode()){
2718        Standard_Integer im = anIObj->HilightMode();
2719        myMainPM->Unhighlight(anIObj,im);
2720        myMainPM->Erase(anIObj,im);
2721   
2722      }
2723    }
2724
2725   //Object removes from Detected sequence
2726   Standard_Integer i = 1;
2727   for(i = 1; i < myAISDetectedSeq.Length(); i++)
2728   {
2729     Handle(AIS_InteractiveObject) anObj = DetectedCurrentObject();
2730     if( !anObj.IsNull() && anObj != anIObj )
2731       myAISDetectedSeq.Remove( i );
2732   }
2733
2734   if(myLastinMain == anIObj)
2735     myLastinMain.Nullify();
2736   if(myLastinColl == anIObj)
2737     myLastinColl.Nullify();
2738
2739   if(myLastPicked == anIObj)
2740     myLastPicked.Nullify();
2741
2742   // OCC21671: Remove IO from the selection manager in any case
2743   // to avoid memory leaks
2744   mgrSelector->Remove(anIObj);
2745
2746   switch(STATUS->GraphicStatus()){
2747   case AIS_DS_Erased:
2748      { 
2749        Standard_Integer DM = anIObj->HasHilightMode() ? anIObj->HilightMode() : 0; 
2750        if(STATUS->IsHilighted()){
2751          myCollectorPM->Unhighlight(anIObj,DM);
2752        }
2753        myCollectorPM->Erase(anIObj,DM);
2754        myCollectorPM->Clear(anIObj,DM);
2755        if(updateviewer) myCollectorVwr->Update();
2756        break;
2757      }
2758    case AIS_DS_Displayed:
2759      {
2760        if(updateviewer) myMainVwr->Update();
2761        break;
2762      }
2763    default:
2764      break;
2765    }
2766   myObjects.UnBind(anIObj);
2767   
2768 }
2769
2770 //=======================================================================
2771 //function : ClearGlobalPrs
2772 //purpose  : 
2773 //=======================================================================
2774
2775 void AIS_InteractiveContext::ClearGlobalPrs(const Handle(AIS_InteractiveObject)& anIObj, 
2776                                             const Standard_Integer aMode,
2777                                             const Standard_Boolean updateviewer)
2778 {
2779   if(anIObj.IsNull()) return ;
2780   if(!myObjects.IsBound(anIObj)) return;
2781   const Handle(AIS_GlobalStatus)& STATUS = myObjects(anIObj);
2782   
2783   Standard_Integer DM = anIObj->HasHilightMode() ? anIObj->HilightMode() : 0; 
2784   if(STATUS->IsDModeIn(aMode)){
2785     if(DM==aMode && myMainPM->IsHighlighted(anIObj,aMode))
2786       myMainPM->Unhighlight(anIObj,aMode);
2787     
2788     myMainPM->Erase(anIObj,aMode);
2789     myMainPM->Clear(anIObj,aMode);
2790   }
2791   
2792   if(STATUS->GraphicStatus()== AIS_DS_Erased)
2793     {
2794       if(DM==aMode){
2795         if(STATUS->IsHilighted())
2796           myCollectorPM->Unhighlight(anIObj,aMode);
2797         myCollectorPM->Erase(anIObj,DM);
2798         myCollectorPM->Clear(anIObj,DM);
2799       }
2800       if(updateviewer) myCollectorVwr->Update();
2801     }
2802   else if(STATUS->GraphicStatus()==AIS_DS_Displayed && updateviewer)
2803     myMainVwr->Update();
2804 }
2805
2806 //=======================================================================
2807 //function : DrawHiddenLine
2808 //purpose  : 
2809 //=======================================================================
2810
2811 Standard_Boolean AIS_InteractiveContext::DrawHiddenLine () const {
2812
2813   return myDefaultDrawer->DrawHiddenLine();
2814 }
2815
2816 //=======================================================================
2817 //function : EnableDrawHiddenLine
2818 //purpose  : 
2819 //=======================================================================
2820
2821 void AIS_InteractiveContext::EnableDrawHiddenLine () const {
2822   myDefaultDrawer->EnableDrawHiddenLine();
2823 }
2824
2825 //=======================================================================
2826 //function : DisableDrawHiddenLine 
2827 //purpose  : 
2828 //=======================================================================
2829
2830 void AIS_InteractiveContext::DisableDrawHiddenLine () const {
2831   myDefaultDrawer->DisableDrawHiddenLine();
2832 }
2833
2834 //=======================================================================
2835 //function : HiddenLineAspect
2836 //purpose  : 
2837 //=======================================================================
2838
2839 Handle (Prs3d_LineAspect) AIS_InteractiveContext::HiddenLineAspect () const  {
2840   return myDefaultDrawer->HiddenLineAspect();
2841 }
2842
2843 //=======================================================================
2844 //function : SetHiddenLineAspect
2845 //purpose  : 
2846 //=======================================================================
2847
2848 void AIS_InteractiveContext::SetHiddenLineAspect ( const Handle(Prs3d_LineAspect)& anAspect) const {
2849   myDefaultDrawer->SetHiddenLineAspect(anAspect);
2850 }
2851
2852 //=======================================================================
2853 //function : SetIsoNumber
2854 //purpose  : 
2855 //=======================================================================
2856
2857 void AIS_InteractiveContext::SetIsoNumber(const Standard_Integer Nb,const AIS_TypeOfIso Type)
2858 {
2859   switch(Type){
2860   case AIS_TOI_IsoU:
2861     myDefaultDrawer->UIsoAspect()->SetNumber(Nb);
2862     break;
2863   case AIS_TOI_IsoV:
2864     myDefaultDrawer->VIsoAspect()->SetNumber(Nb);
2865     break;
2866   case AIS_TOI_Both:
2867     myDefaultDrawer->UIsoAspect()->SetNumber(Nb);
2868     myDefaultDrawer->VIsoAspect()->SetNumber(Nb);
2869     break;
2870  
2871   }
2872 }
2873 //=======================================================================
2874 //function : IsoNumber
2875 //purpose  : 
2876 //=======================================================================
2877
2878 Standard_Integer AIS_InteractiveContext::IsoNumber(const AIS_TypeOfIso Type)
2879 {
2880   
2881   switch(Type){
2882   case AIS_TOI_IsoU:
2883     return myDefaultDrawer->UIsoAspect()->Number();
2884   case AIS_TOI_IsoV:
2885     return myDefaultDrawer->VIsoAspect()->Number();
2886   case AIS_TOI_Both:
2887     return (myDefaultDrawer->UIsoAspect()->Number()==
2888             myDefaultDrawer->VIsoAspect()->Number()) ? 
2889               myDefaultDrawer->UIsoAspect()->Number(): -1;
2890   }
2891   return 0;
2892 }
2893
2894 //=======================================================================
2895 //function : IsoOnPlane
2896 //purpose  : 
2897 //=======================================================================
2898
2899 void AIS_InteractiveContext::IsoOnPlane(const Standard_Boolean SwitchOn)
2900 {
2901   myDefaultDrawer->SetIsoOnPlane(SwitchOn);
2902 }
2903
2904 //=======================================================================
2905 //function : IsoOnPlane
2906 //purpose  : 
2907 //=======================================================================
2908
2909 Standard_Boolean AIS_InteractiveContext::IsoOnPlane() const 
2910 {
2911   return myDefaultDrawer->IsoOnPlane();
2912 }
2913
2914 //=======================================================================
2915 //function : SetSelectionMode
2916 //purpose  : 
2917 //=======================================================================
2918
2919 void AIS_InteractiveContext::SetSelectionMode(const Handle_AIS_InteractiveObject&, const Standard_Integer )
2920 {
2921 }
2922
2923 //=======================================================================
2924 //function : UnsetSelectionMode
2925 //purpose  : 
2926 //=======================================================================
2927
2928 void AIS_InteractiveContext::UnsetSelectionMode(const Handle_AIS_InteractiveObject&)
2929 {
2930 }
2931
2932 //=======================================================================
2933 //function : SetSensitivityMode
2934 //purpose  : 
2935 //=======================================================================
2936
2937 void AIS_InteractiveContext::SetSensitivityMode(const StdSelect_SensitivityMode aMode) {
2938
2939   if( HasOpenedContext() )
2940         myLocalContexts(myCurLocalIndex)->SetSensitivityMode(aMode);
2941   else {
2942     myMainSel->SetSensitivityMode(aMode);
2943     if( !myCollectorSel.IsNull() ) myCollectorSel->SetSensitivityMode(aMode);
2944   }
2945 }
2946
2947 //=======================================================================
2948 //function : SensitivityMode
2949 //purpose  : 
2950 //=======================================================================
2951
2952 StdSelect_SensitivityMode AIS_InteractiveContext::SensitivityMode() const {
2953
2954   if( HasOpenedContext() )
2955         return myLocalContexts(myCurLocalIndex)->SensitivityMode();
2956   return myMainSel->SensitivityMode();
2957 }
2958
2959 //=======================================================================
2960 //function : SetSensitivity
2961 //purpose  : 
2962 //=======================================================================
2963
2964 void AIS_InteractiveContext::SetSensitivity(const Standard_Real aPrecision) {
2965
2966   if( HasOpenedContext() )
2967         myLocalContexts(myCurLocalIndex)->SetSensitivity(aPrecision);
2968   else {
2969     myMainSel->SetSensitivity(aPrecision);
2970     if( !myCollectorSel.IsNull() ) myCollectorSel->SetSensitivity(aPrecision);
2971   }
2972 }
2973
2974 //=======================================================================
2975 //function : Sensitivity
2976 //purpose  : 
2977 //=======================================================================
2978
2979 Standard_Real AIS_InteractiveContext::Sensitivity() const {
2980
2981   if( HasOpenedContext() )
2982         return myLocalContexts(myCurLocalIndex)->Sensitivity();
2983   return myMainSel->Sensitivity();
2984 }
2985
2986 //=======================================================================
2987 //function : SetPixelTolerance
2988 //purpose  : 
2989 //=======================================================================
2990
2991 void AIS_InteractiveContext::SetPixelTolerance(const Standard_Integer aPrecision) {
2992
2993   if( HasOpenedContext() )
2994         myLocalContexts(myCurLocalIndex)->SetPixelTolerance(aPrecision);
2995   else {
2996     myMainSel->SetPixelTolerance(aPrecision);
2997     if( !myCollectorSel.IsNull() ) myCollectorSel->SetPixelTolerance(aPrecision);
2998   }
2999 }
3000
3001 //=======================================================================
3002 //function : PixelTolerance
3003 //purpose  : 
3004 //=======================================================================
3005
3006 Standard_Integer AIS_InteractiveContext::PixelTolerance() const {
3007
3008   if( HasOpenedContext() )
3009         return myLocalContexts(myCurLocalIndex)->PixelTolerance();
3010   return myMainSel->PixelTolerance();
3011 }
3012
3013 //=======================================================================
3014 //function : IsInLocal
3015 //purpose  : 
3016 //=======================================================================
3017
3018 Standard_Boolean AIS_InteractiveContext::IsInLocal(const Handle_AIS_InteractiveObject& anIObj,
3019                                                    Standard_Integer& TheIndex) const 
3020 {
3021   if(anIObj.IsNull()) return Standard_False;
3022   // if it exists at neutral point 0 index is returned
3023   if(myObjects.IsBound(anIObj)) {
3024     TheIndex = 0;
3025     return Standard_False;
3026   }
3027   for(Standard_Integer I=1;I<=myLocalContexts.Extent();I++){
3028     if(myLocalContexts.IsBound(I)){
3029       if(myLocalContexts(I)->IsIn(anIObj)){
3030         TheIndex = I;
3031         return Standard_True;
3032         
3033       }
3034     }
3035   }
3036   TheIndex =-1;
3037   return Standard_False;
3038 }  
3039   
3040 //=======================================================================
3041 //function : InitAttributes
3042 //purpose  : 
3043 //=======================================================================
3044
3045 void AIS_InteractiveContext::InitAttributes()
3046 {
3047
3048   mgrSelector->Add(myMainSel);
3049   myCurrentName   = AIS_Context_NewCurName();
3050   mySelectionName = AIS_Context_NewSelName();
3051
3052   AIS_Selection::CreateSelection(mySelectionName.ToCString());
3053   AIS_Selection::CreateSelection(myCurrentName.ToCString());
3054
3055   
3056   myDefaultDrawer->SetShadingAspectGlobal(Standard_False);
3057   Graphic3d_MaterialAspect aMat(Graphic3d_NOM_BRASS);
3058   myDefaultDrawer->ShadingAspect()->SetMaterial(aMat);
3059
3060 //  myDefaultDrawer->ShadingAspect()->SetColor(Quantity_NOC_GRAY70);
3061   Handle (Prs3d_LineAspect) HLA = myDefaultDrawer->HiddenLineAspect();
3062   HLA->SetColor(Quantity_NOC_GRAY20);
3063   HLA->SetWidth(1);
3064   HLA->SetTypeOfLine(Aspect_TOL_DASH);
3065
3066   // tolerance to 4 pixels...
3067   SetPixelTolerance();
3068
3069   // Customizing the drawer for trihedrons and planes...
3070
3071   Handle (Prs3d_DatumAspect) DA = myDefaultDrawer->DatumAspect();
3072   Standard_Real aLength(100.);
3073   DA->SetAxisLength(aLength,aLength,aLength);
3074   Quantity_NameOfColor col = Quantity_NOC_LIGHTSTEELBLUE4;
3075   DA->FirstAxisAspect()->SetColor(col);
3076   DA->SecondAxisAspect()->SetColor(col);
3077   DA->ThirdAxisAspect()->SetColor(col);
3078
3079   Handle(Prs3d_PlaneAspect)PA = myDefaultDrawer->PlaneAspect();
3080   aLength =200.;
3081   PA->SetPlaneLength(aLength,aLength);
3082   PA->EdgesAspect()->SetColor(Quantity_NOC_SKYBLUE);
3083   
3084
3085 }
3086
3087
3088 //=======================================================================
3089 //function : TrihedronSize
3090 //purpose  : 
3091 //=======================================================================
3092 Standard_Real AIS_InteractiveContext::TrihedronSize() const
3093 {
3094   return myDefaultDrawer->DatumAspect()->FirstAxisLength();
3095 }
3096 //=======================================================================
3097 //function : SetTrihedronSize
3098 //purpose  : 
3099 //=======================================================================
3100 void AIS_InteractiveContext::SetTrihedronSize(const Standard_Real aVal,const Standard_Boolean /*updateviewer*/)
3101 {
3102   myDefaultDrawer->DatumAspect()->SetAxisLength(aVal,aVal,aVal);
3103   Redisplay(AIS_KOI_Datum,3,Standard_False);
3104   Redisplay(AIS_KOI_Datum,4,Standard_True);
3105 }
3106
3107
3108
3109 //=======================================================================
3110 //function : SetPlaneSize
3111 //purpose  : 
3112 //=======================================================================
3113 void AIS_InteractiveContext::SetPlaneSize(const Standard_Real aValX,
3114                                           const Standard_Real aValY,
3115                                           const Standard_Boolean /*updateviewer*/)
3116 {
3117   myDefaultDrawer->PlaneAspect()->SetPlaneLength(aValX,aValY);
3118   Redisplay(AIS_KOI_Datum,7);
3119 }
3120
3121 //=======================================================================
3122 //function : SetPlaneSize
3123 //purpose  : 
3124 //=======================================================================
3125
3126 void AIS_InteractiveContext::SetPlaneSize(const Standard_Real aVal,
3127                                           const Standard_Boolean updateviewer)
3128 {
3129   SetPlaneSize(aVal,aVal,updateviewer);
3130 }
3131
3132 //=======================================================================
3133 //function : PlaneSize
3134 //purpose  : 
3135 //=======================================================================
3136
3137 Standard_Boolean AIS_InteractiveContext::PlaneSize(Standard_Real& LX,Standard_Real& LY) const
3138 {
3139   LX = myDefaultDrawer->PlaneAspect()->PlaneXLength();
3140   LY =  myDefaultDrawer->PlaneAspect()->PlaneYLength();
3141   return (Abs(LX-LY)<=Precision::Confusion());
3142 }
3143
3144
3145
3146 //=======================================================================
3147 //function :
3148 //purpose  : 
3149 //=======================================================================
3150 void AIS_InteractiveContext::SetAutoActivateSelection( const Standard_Boolean Auto )
3151 {
3152   myIsAutoActivateSelMode = Auto;
3153 }
3154
3155 //=======================================================================
3156 //function :
3157 //purpose  : 
3158 //=======================================================================
3159 Standard_Boolean AIS_InteractiveContext::GetAutoActivateSelection() const
3160 {
3161   return myIsAutoActivateSelMode;
3162 }
3163
3164 //=======================================================================
3165 //function : SetZLayer
3166 //purpose  : 
3167 //=======================================================================
3168
3169 void AIS_InteractiveContext::SetZLayer (const Handle(AIS_InteractiveObject)& theIObj,
3170                                         const Standard_Integer theLayerId)
3171 {
3172   if (theIObj.IsNull ())
3173     return;
3174
3175   if (myObjects.IsBound (theIObj))
3176   {
3177     switch (myObjects (theIObj)->GraphicStatus ())
3178     {
3179       case AIS_DS_Displayed:
3180       {
3181         theIObj->SetZLayer (myMainPM, theLayerId);
3182         break;
3183       }
3184       case AIS_DS_Erased:
3185       {
3186         theIObj->SetZLayer (myCollectorPM, theLayerId);
3187         break;
3188       }
3189       default:
3190         break;
3191     }
3192   }
3193   else if (HasOpenedContext ())
3194   {
3195     myLocalContexts (myCurLocalIndex)->SetZLayer (theIObj, theLayerId);
3196   }
3197 }
3198
3199 //=======================================================================
3200 //function : GetZLayer
3201 //purpose  : 
3202 //=======================================================================
3203
3204 Standard_Integer AIS_InteractiveContext::GetZLayer (const Handle(AIS_InteractiveObject)& theIObj) const
3205 {
3206   if (theIObj.IsNull ())
3207     return -1;
3208
3209   if (myObjects.IsBound (theIObj))
3210   {
3211     return theIObj->GetZLayer (myMainPM);
3212   }
3213   else if (HasOpenedContext ())
3214   {
3215     return myLocalContexts (myCurLocalIndex)->GetZLayer (theIObj);
3216   }
3217
3218   return -1;
3219 }