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