0027818: Visualization - provide an interface to define highlight presentation properties
[occt.git] / src / AIS / AIS_InteractiveContext_2.cxx
1 // Created on: 1997-01-29
2 // Created by: Robert COUBLANC
3 // Copyright (c) 1997-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17
18 #include <AIS_DataMapIteratorOfDataMapOfILC.hxx>
19 #include <AIS_DataMapIteratorOfDataMapOfIOStatus.hxx>
20 #include <AIS_GlobalStatus.hxx>
21 #include <AIS_InteractiveContext.hxx>
22 #include <AIS_InteractiveObject.hxx>
23 #include <AIS_LocalContext.hxx>
24 #include <AIS_Selection.hxx>
25 #include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
26 #include <Graphic3d_MapOfStructure.hxx>
27 #include <Graphic3d_Structure.hxx>
28 #include <Graphic3d_StructureManager.hxx>
29 #include <Prs3d_BasicAspect.hxx>
30 #include <Prs3d_LineAspect.hxx>
31 #include <Quantity_Color.hxx>
32 #include <SelectMgr_EntityOwner.hxx>
33 #include <SelectMgr_Filter.hxx>
34 #include <SelectMgr_OrFilter.hxx>
35 #include <SelectMgr_SelectionManager.hxx>
36 #include <Standard_Transient.hxx>
37 #include <StdSelect_ViewerSelector3d.hxx>
38 #include <TCollection_AsciiString.hxx>
39 #include <TCollection_ExtendedString.hxx>
40 #include <TColStd_ListIteratorOfListOfInteger.hxx>
41 #include <TopLoc_Location.hxx>
42 #include <TopoDS_Shape.hxx>
43 #include <V3d_View.hxx>
44 #include <V3d_Viewer.hxx>
45
46 //=======================================================================
47 //function : OpenLocalContext
48 //purpose  : 
49 //=======================================================================
50 Standard_Integer AIS_InteractiveContext::
51 OpenLocalContext(const Standard_Boolean UseDisplayedObjects, 
52                  const Standard_Boolean AllowShapeDecomposition, 
53                  const Standard_Boolean AcceptEraseOfTemporary,
54                  const Standard_Boolean /*BothViewers*/)
55 {
56
57   // the entities eventually detected just before the context was opened are unhighlighted...
58   if(!IsSelected(myLastPicked)){
59     if(!myLastPicked.IsNull()){
60       const Handle(AIS_InteractiveObject) aLastPickedAIS =
61         Handle(AIS_InteractiveObject)::DownCast (myLastPicked->Selectable());
62       Standard_Integer HiMod = aLastPickedAIS->HasHilightMode()?aLastPickedAIS->HilightMode():0;
63       unhighlightGlobal (aLastPickedAIS, HiMod);
64     }}
65   
66   if(!mylastmoveview.IsNull()){
67     if(myCurLocalIndex>0)
68       myLocalContexts(myCurLocalIndex)->UnhilightLastDetected(mylastmoveview);
69   }
70   
71   // entities connected to dynamic selection at neutral point are set to 0.
72   
73   myLastinMain.Nullify();
74   myLastPicked.Nullify();
75   myWasLastMain = Standard_True;
76
77   myCurLocalIndex = HighestIndex() + 1;
78   
79   Handle(AIS_LocalContext) NewLocal= new AIS_LocalContext(this,myCurLocalIndex,
80                                                           UseDisplayedObjects,
81                                                           AllowShapeDecomposition,
82                                                           AcceptEraseOfTemporary);
83   // the AIS_LocalContext bind itself to myLocalContexts
84   // because procedures performed in AIS_LocalContext constructor
85   // already may access myLocalContexts(myCurLocalIndex) (like methods AIS_LocalContext::IsSelected()).
86
87 #ifdef OCCT_DEBUG
88   cout<<"\tOpen Local Context No "<<myCurLocalIndex<<endl;
89   if(UseDisplayedObjects){
90     cout<<"\t\tObjects from Neutral Point loaded"<<endl;
91     if(AllowShapeDecomposition)
92       cout<<"\t\tDecomposition Authorized for Loaded Shapes"<<endl;
93     else
94       cout<<"\t\tNo Decomposition Authorized for Loaded Shapes"<<endl;
95   }
96   else
97     cout<<"\t\tNo Objects Were Loaded "<<endl;
98 #endif
99   return myCurLocalIndex;
100 }
101
102 //=======================================================================
103 //function : CloseLocalContext
104 //purpose  : 
105 //=======================================================================
106
107 void AIS_InteractiveContext::CloseLocalContext(const Standard_Integer Index,
108                                                const Standard_Boolean updateviewer)
109 {
110
111  Standard_Boolean debugmode(Standard_False);
112 #ifdef OCCT_DEBUG
113  debugmode = Standard_True;
114 #endif
115  
116  Standard_Integer GoodIndex = (Index ==-1) ? myCurLocalIndex : Index;
117
118  if(debugmode) cout<<"Call to CloseLocalContext - Index  "<<GoodIndex<<endl;
119  if(!HasOpenedContext()){
120    if(debugmode) cout<<"\t But No Local Context is opened"<<endl;
121    return;
122  }
123  if(!myLocalContexts.IsBound(GoodIndex)) {
124    if(debugmode) cout<<" Attempt to Close a non-existent Local Context"<<endl;
125    return;
126  }
127  
128  // the only open local context is closed...
129  if(myLocalContexts.Extent()==1 && GoodIndex == myCurLocalIndex){
130    
131    myLocalContexts(myCurLocalIndex)->Terminate( updateviewer );
132    myLocalContexts.UnBind(myCurLocalIndex);
133    myCurLocalIndex = 0;
134
135    ResetOriginalState(Standard_False);
136    if(debugmode)
137      cout<<"No More Opened Local Context "<<endl;
138  }
139  
140  // Otherwise the local context will be still open after the current is closed
141  else{
142    Handle(StdSelect_ViewerSelector3d) VS = myLocalContexts(GoodIndex)->MainSelector();
143    myLocalContexts(GoodIndex)->Terminate();
144    myLocalContexts.UnBind(GoodIndex);
145    // the current is closed...
146    if(GoodIndex==myCurLocalIndex){
147      myCurLocalIndex = HighestIndex();
148    }
149    else if(debugmode)
150      cout<<"a No Current Local Context WasClosed"<<endl;
151
152    // restore activated selections of current local context
153    myLocalContexts (myCurLocalIndex)->RestoreActivatedModes();
154
155    if(debugmode) cout<<"Index Of CurrentLocalContext:"<<myCurLocalIndex<<endl;
156    
157  }
158    
159  
160  if(updateviewer) myMainVwr->Update();
161 }
162
163 //=======================================================================
164 //function : CloseAllContexts
165 //purpose  : 
166 //=======================================================================
167
168 void AIS_InteractiveContext::CloseAllContexts(const Standard_Boolean updateviewer)
169 {
170   
171   while(!myLocalContexts.IsEmpty()){
172     CloseLocalContext(myCurLocalIndex,Standard_False);
173   }
174   
175   ResetOriginalState(Standard_False);
176
177   if(updateviewer) myMainVwr->Update();
178 }
179
180 //=======================================================================
181 //function : IndexOfCurrentLocal
182 //purpose  : 
183 //=======================================================================
184
185 Standard_Integer AIS_InteractiveContext::IndexOfCurrentLocal() const
186 {
187   return myCurLocalIndex;
188 }
189
190 //=======================================================================
191 //function : ClearLocalContext
192 //purpose  : 
193 //=======================================================================
194
195 void AIS_InteractiveContext::ClearLocalContext(const AIS_ClearMode aMode)
196 {
197   if (!HasOpenedContext()) return;
198   myLocalContexts(myCurLocalIndex)->Clear(aMode);
199
200 }
201
202 //=======================================================================
203 //function : HighestIndex
204 //purpose  : 
205 //=======================================================================
206
207 Standard_Integer AIS_InteractiveContext::HighestIndex() const
208 {
209   AIS_DataMapIteratorOfDataMapOfILC It(myLocalContexts);
210   Standard_Integer HiInd = 0;
211   for(;It.More();It.Next())
212     HiInd = (It.Key()>HiInd) ? It.Key() : HiInd;
213   return HiInd;
214
215 }
216
217
218 //=======================================================================
219 //function : Activate
220 //purpose  : 
221 //=======================================================================
222
223 void AIS_InteractiveContext::
224 Activate(const Handle(AIS_InteractiveObject)& anIObj, 
225          const Standard_Integer aMode,
226          const Standard_Boolean theIsForce)
227 {
228   if(!HasOpenedContext()){
229     if(!myObjects.IsBound(anIObj)) return;
230     const Handle(AIS_GlobalStatus)& STAT = myObjects(anIObj);
231     if(STAT->GraphicStatus()==AIS_DS_Displayed || theIsForce)
232       mgrSelector->Activate(anIObj,aMode,myMainSel);
233     STAT ->AddSelectionMode(aMode);
234   }
235   else{
236    myLocalContexts(myCurLocalIndex)->ActivateMode(anIObj,aMode);
237   }
238 }
239
240 //=======================================================================
241 //function : LocalSelector
242 //purpose  : 
243 //=======================================================================
244 Handle( StdSelect_ViewerSelector3d ) AIS_InteractiveContext::LocalSelector() const
245 {
246   if( !HasOpenedContext() )
247       return Handle( StdSelect_ViewerSelector3d )();
248   else
249       return myLocalContexts( myCurLocalIndex )->MainSelector();
250 }
251
252
253 //=======================================================================
254 //function : DeActivate
255 //purpose  : 
256 //=======================================================================
257 void AIS_InteractiveContext::
258 Deactivate(const Handle(AIS_InteractiveObject)& anIObj)
259 {
260   if(!HasOpenedContext()){
261     if(!myObjects.IsBound(anIObj)) return;
262     TColStd_ListIteratorOfListOfInteger ItL;
263     for(ItL.Initialize(myObjects(anIObj)->SelectionModes());
264         ItL.More();
265         ItL.Next()){
266       if(myObjects(anIObj)->GraphicStatus() == AIS_DS_Displayed)
267         mgrSelector->Deactivate(anIObj,ItL.Value(),myMainSel);
268     }
269     myObjects(anIObj)->ClearSelectionModes();
270   }
271   else{
272     const Handle(AIS_LocalContext)& LC = myLocalContexts(myCurLocalIndex);
273     LC->Deactivate(anIObj);
274   }
275 }
276
277 //=======================================================================
278 //function : Deactivate
279 //purpose  : 
280 //=======================================================================
281
282 void AIS_InteractiveContext::Deactivate(const Handle(AIS_InteractiveObject)& anIObj, 
283            const Standard_Integer aMode)
284 {
285   if(!HasOpenedContext()){
286     if(!myObjects.IsBound(anIObj)) return;
287     const Handle(AIS_GlobalStatus)& STAT = myObjects(anIObj);
288
289     if(STAT->GraphicStatus() == AIS_DS_Displayed)
290       mgrSelector->Deactivate(anIObj,aMode,myMainSel);
291     STAT->RemoveSelectionMode(aMode);
292   }
293   else{
294    myLocalContexts(myCurLocalIndex)->DeactivateMode(anIObj,aMode);
295   }
296 }
297
298 //=======================================================================
299 //function : ActivatedModes
300 //purpose  : 
301 //=======================================================================
302
303 void AIS_InteractiveContext::
304 ActivatedModes(const Handle(AIS_InteractiveObject)& anIObj, 
305                TColStd_ListOfInteger& theList) const 
306 {
307   TColStd_ListIteratorOfListOfInteger ItL;
308   if(!HasOpenedContext()){
309     if(myObjects.IsBound(anIObj)){
310       for(ItL.Initialize(myObjects(anIObj)->SelectionModes());
311           ItL.More();
312           ItL.Next())
313         theList.Append(ItL.Value());
314       
315     }
316   }
317   else{
318     if(myLocalContexts(myCurLocalIndex)->IsIn(anIObj)){
319       for(ItL.Initialize(myLocalContexts(myCurLocalIndex)->SelectionModes(anIObj));
320           ItL.More();
321           ItL.Next())
322         theList.Append(ItL.Value());
323     }
324   }
325 }
326
327 //=======================================================================
328 //function : SetShapeDecomposition
329 //purpose  : 
330 //=======================================================================
331
332 void AIS_InteractiveContext::SetShapeDecomposition(const Handle(AIS_InteractiveObject)& anIObj,
333                                                    const Standard_Boolean StdModeSensitive)
334 {
335   if(!HasOpenedContext()) return;
336   myLocalContexts(myCurLocalIndex)->SetShapeDecomposition(anIObj,StdModeSensitive);
337 }
338
339 //=======================================================================
340 //function : SetTemporaryAttributes
341 //purpose  : 
342 //=======================================================================
343
344 void AIS_InteractiveContext::
345 SetTemporaryAttributes(const Handle(AIS_InteractiveObject)& /*anObj*/,
346                        const Handle(Prs3d_Drawer)& /*aDrawer*/,
347                        const Standard_Boolean /*updateviewer*/)
348 {
349 }
350
351 //=======================================================================
352 //function : SubIntensityOn
353 //purpose  : 
354 //=======================================================================
355 void AIS_InteractiveContext::
356 SubIntensityOn(const Handle(AIS_InteractiveObject)& anIObj,
357                const Standard_Boolean updateviewer)
358 {
359   if(!HasOpenedContext())
360   {
361     turnOnSubintensity (anIObj);
362   }
363   else
364   {
365     turnOnSubintensity (anIObj, -1, Standard_False);
366     myLocalContexts(myCurLocalIndex)->SubIntensityOn (anIObj);
367   }
368
369   if (updateviewer)
370     myMainVwr->Update();
371 }
372 //=======================================================================
373 //function : SubIntensityOff
374 //purpose  : 
375 //=======================================================================
376
377 void AIS_InteractiveContext::
378 SubIntensityOff(const Handle(AIS_InteractiveObject)& anIObj,
379                 const Standard_Boolean updateviewer)
380 {
381   if(!HasOpenedContext()){
382     if(!myObjects.IsBound(anIObj))
383       return;
384     const Handle(AIS_GlobalStatus)& GB=myObjects(anIObj);
385     if(!GB->IsSubIntensityOn())
386       return;
387     GB->SubIntensityOff();
388     Standard_Boolean UpdMain(Standard_False);
389     
390     if(GB->GraphicStatus() == AIS_DS_Displayed)
391     {
392       myMainPM->Unhighlight (anIObj, GB->DisplayMode());
393       UpdMain = Standard_True;
394     }
395     
396     Standard_Integer DM,HM,SM;
397     GetDefModes(anIObj,DM,HM,SM);
398     if(IsSelected(anIObj))
399       highlightSelected (anIObj->GlobalSelOwner());
400     
401     if(updateviewer){
402       if(UpdMain)
403         myMainVwr->Update();
404     }
405   }
406   else {
407     const Handle(Graphic3d_HighlightStyle)& anObjSelStyle =
408       getSelStyle (anIObj);
409     if(myObjects.IsBound(anIObj)){
410       const Handle(AIS_GlobalStatus)& STAT = myObjects(anIObj);
411       STAT->SubIntensityOff();
412       myMainPM->Unhighlight (anIObj, STAT->DisplayMode());
413       if (STAT->IsHilighted())
414         HilightWithColor (anIObj, anObjSelStyle, Standard_False);
415     }
416     else
417       myLocalContexts(myCurLocalIndex)->SubIntensityOff(anIObj);
418     if (IsSelected(anIObj))
419       HilightWithColor (anIObj, anObjSelStyle, Standard_False);
420     
421     if(updateviewer) myMainVwr->Update();
422   }
423 }
424
425 //=======================================================================
426 //function : SubIntensityOn
427 //purpose  : ALL THE DISPLAYED OBJECTS HAVE SUBINTENSITY...
428 //=======================================================================
429 void AIS_InteractiveContext::SubIntensityOn (const Standard_Boolean theIsToUpdateViewer)
430 {
431   if (!HasOpenedContext())
432     return;
433
434   turnOnSubintensity();
435
436   if (theIsToUpdateViewer)
437     myMainVwr->Update();
438 }
439
440 //=======================================================================
441 //function : SubIntensityOff
442 //purpose  : 
443 //=======================================================================
444 void AIS_InteractiveContext::SubIntensityOff(const Standard_Boolean updateviewer)
445 {
446   if(!HasOpenedContext()) return;
447
448   AIS_DataMapIteratorOfDataMapOfIOStatus It (myObjects);
449   for(;It.More();It.Next()){
450     const Handle(AIS_GlobalStatus)& STAT = It.Value();
451     if(STAT->IsSubIntensityOn())
452       STAT->SubIntensityOff();
453     myMainPM->Unhighlight (It.Key());
454   }
455
456   if(updateviewer) myMainVwr->Update();
457 }
458
459 //=======================================================================
460 //function : AddFilter
461 //purpose  : 
462 //=======================================================================
463 void AIS_InteractiveContext::AddFilter(const Handle(SelectMgr_Filter)& aFilter)
464 {
465   if(HasOpenedContext())
466     myLocalContexts(myCurLocalIndex)->AddFilter(aFilter);
467   else
468     myFilters->Add(aFilter);
469 }
470
471 //=======================================================================
472 //function : ActivateStandardMode
473 //purpose  : 
474 //=======================================================================
475 void AIS_InteractiveContext::ActivateStandardMode(const TopAbs_ShapeEnum aStandardActivation)
476 {
477   if(!HasOpenedContext()) return;
478   myLocalContexts(myCurLocalIndex)->ActivateStandardMode (aStandardActivation);
479 }
480
481 //=======================================================================
482 //function : DeActivateStandardMode
483 //purpose  : 
484 //=======================================================================
485 void AIS_InteractiveContext::DeactivateStandardMode(const TopAbs_ShapeEnum aStandardActivation)
486 {
487   if(!HasOpenedContext()) return;
488   myLocalContexts(myCurLocalIndex)->DeactivateStandardMode (aStandardActivation);
489 }
490
491 //=======================================================================
492 //function : RemoveFilter
493 //purpose  : 
494 //=======================================================================
495 void AIS_InteractiveContext::RemoveFilter(const Handle(SelectMgr_Filter)& aFilter)
496 {
497   if(HasOpenedContext())
498     myLocalContexts(myCurLocalIndex)->RemoveFilter (aFilter);
499   else
500     myFilters->Remove(aFilter);
501 }
502
503 //=======================================================================
504 //function : RemoveFilters
505 //purpose  : 
506 //=======================================================================
507
508 void AIS_InteractiveContext::RemoveFilters()
509 {
510   if(!HasOpenedContext())
511     myFilters->Clear();
512   else
513     myLocalContexts(myCurLocalIndex)->Clear(AIS_CM_Filters);
514 }
515
516 //=======================================================================
517 //function : ActivatedStandardModes
518 //purpose  : 
519 //=======================================================================
520 const TColStd_ListOfInteger& AIS_InteractiveContext::ActivatedStandardModes() const 
521 {
522   return myLocalContexts(myCurLocalIndex)->StandardModes();
523 }
524
525 //=======================================================================
526 //function : Filters
527 //purpose  : 
528 //=======================================================================
529 const SelectMgr_ListOfFilter& AIS_InteractiveContext::Filters() const 
530 {
531   if(HasOpenedContext())
532     return myLocalContexts(myCurLocalIndex)->ListOfFilter();
533   return myFilters->StoredFilters();
534 }
535
536 //=======================================================================
537 //function : DisplayActiveSensitive
538 //purpose  : 
539 //=======================================================================
540 void AIS_InteractiveContext::DisplayActiveSensitive(const Handle(V3d_View)& aviou)
541 {
542   if(HasOpenedContext())
543     myLocalContexts(myCurLocalIndex)->DisplaySensitive(aviou);
544   else
545     myMainSel->DisplaySensitive(aviou);
546 }
547 //=======================================================================
548 //function : DisplayActiveSensitive
549 //purpose  : 
550 //=======================================================================
551
552 void AIS_InteractiveContext::DisplayActiveSensitive(const Handle(AIS_InteractiveObject)& anIObj,
553                                                     const Handle(V3d_View)& aviou)
554 {
555   TColStd_ListIteratorOfListOfInteger It;
556   Handle(StdSelect_ViewerSelector3d) VS;
557   if(HasOpenedContext()){
558     const Handle(AIS_LocalContext)& LC = myLocalContexts(myCurLocalIndex);
559     if(!LC->IsIn(anIObj)) return;
560     It.Initialize(LC->SelectionModes(anIObj));
561     VS = LC->MainSelector();
562   }
563   else{
564     if(!myObjects.IsBound(anIObj)) return;
565     It.Initialize(myObjects(anIObj)->SelectionModes());
566     VS = myMainSel;
567   }
568   
569   
570   for(;It.More();It.Next()){
571     const Handle(SelectMgr_Selection)& Sel = anIObj->Selection(It.Value());
572     VS->DisplaySensitive(Sel,anIObj->Transformation(), aviou,Standard_False);
573   }  
574   
575 }
576
577 //=======================================================================
578 //function : ClearActiveSensitive
579 //purpose  : 
580 //=======================================================================
581 void AIS_InteractiveContext::ClearActiveSensitive(const Handle(V3d_View)& aviou)
582 {
583   
584   if(HasOpenedContext())
585     myLocalContexts(myCurLocalIndex)->ClearSensitive(aviou);
586   else
587     myMainSel->ClearSensitive(aviou);
588 }
589
590 //=======================================================================
591 //function : SetAutomaticHilight
592 //purpose  : 
593 //=======================================================================
594 void  AIS_InteractiveContext::SetAutomaticHilight(const Standard_Boolean aStatus)
595 {
596
597   if(HasOpenedContext())
598     myLocalContexts(myCurLocalIndex)->SetAutomaticHilight(aStatus);
599 }
600
601 //=======================================================================
602 //function : AutomaticHilight
603 //purpose  : 
604 //=======================================================================
605 Standard_Boolean AIS_InteractiveContext::AutomaticHilight() const 
606 {
607   if(HasOpenedContext())
608     return myLocalContexts(myCurLocalIndex)->AutomaticHilight();
609   return Standard_True;
610 }
611
612 //=======================================================================
613 //function : UseDisplayedObjects
614 //purpose  : 
615 //=======================================================================
616
617 void AIS_InteractiveContext::UseDisplayedObjects()
618 {
619   if(HasOpenedContext())
620     myLocalContexts(myCurLocalIndex)->LoadContextObjects();
621 }
622
623 //=======================================================================
624 //function : NotUseDisplayedObjects
625 //purpose  : 
626 //=======================================================================
627
628 void AIS_InteractiveContext::NotUseDisplayedObjects()
629 {
630   if(HasOpenedContext())
631     myLocalContexts(myCurLocalIndex)->UnloadContextObjects();
632 }
633
634
635
636
637 //=======================================================================
638 //function : PurgeDisplay
639 //purpose  : 
640 //=======================================================================
641
642 Standard_Integer AIS_InteractiveContext::PurgeDisplay()
643 {
644   if(HasOpenedContext()) return 0;
645   
646   Standard_Integer NbStr = PurgeViewer(myMainVwr);
647   myMainVwr->Update();
648   return NbStr;
649
650 }
651
652
653 //=======================================================================
654 //function : PurgeViewer
655 //purpose  : 
656 //=======================================================================
657 Standard_Integer AIS_InteractiveContext::PurgeViewer(const Handle(V3d_Viewer)& Vwr)
658 {
659   Handle(Graphic3d_StructureManager) GSM = Vwr->StructureManager();
660   Standard_Integer NbCleared(0);
661   Graphic3d_MapOfStructure SOS;
662   GSM->DisplayedStructures(SOS);
663
664   Handle(Graphic3d_Structure) G;
665   for(Graphic3d_MapIteratorOfMapOfStructure It(SOS); It.More();It.Next()){
666     G = It.Key();
667     Standard_Address Add = G->Owner();
668     if(Add==NULL){
669       G->Erase();
670       G->Clear();// it means that it is not referenced as a presentation of InterfactiveObject...
671       NbCleared++;
672     }
673     Handle(AIS_InteractiveObject) IO = (AIS_InteractiveObject*)Add;
674     if(!myObjects.IsBound(IO)){
675       G->Erase();
676       NbCleared++;
677     }
678   }
679   return NbCleared;
680 }
681
682 //=======================================================================
683 //function : IsImmediateModeOn
684 //purpose  :
685 //=======================================================================
686
687 Standard_Boolean AIS_InteractiveContext::IsImmediateModeOn()  const 
688 {
689   if(!HasOpenedContext()) return Standard_False;
690   return myLocalContexts(myCurLocalIndex)->IsImmediateModeOn();
691 }
692
693 //=======================================================================
694 //function : BeginImmediateDraw
695 //purpose  :
696 //=======================================================================
697
698 Standard_Boolean AIS_InteractiveContext::BeginImmediateDraw()
699 {
700   return HasOpenedContext()
701       && myLocalContexts (myCurLocalIndex)->BeginImmediateDraw();
702 }
703
704 //=======================================================================
705 //function : ImmediateAdd
706 //purpose  :
707 //=======================================================================
708
709 Standard_Boolean AIS_InteractiveContext::ImmediateAdd (const Handle(AIS_InteractiveObject)& theObj,
710                                                        const Standard_Integer               theMode)
711 {
712   return HasOpenedContext()
713       && myLocalContexts (myCurLocalIndex)->ImmediateAdd (theObj, theMode);
714 }
715
716 //=======================================================================
717 //function : EndImmediateDraw
718 //purpose  :
719 //=======================================================================
720
721 Standard_Boolean AIS_InteractiveContext::EndImmediateDraw (const Handle(V3d_View)& theView)
722 {
723   return HasOpenedContext()
724       && myLocalContexts (myCurLocalIndex)->EndImmediateDraw (theView->Viewer());
725 }
726
727 //=======================================================================
728 //function : EndImmediateDraw
729 //purpose  :
730 //=======================================================================
731
732 Standard_Boolean AIS_InteractiveContext::EndImmediateDraw()
733 {
734   if (!HasOpenedContext())
735   {
736     return Standard_False;
737   }
738
739   return myLocalContexts (myCurLocalIndex)->EndImmediateDraw (myMainVwr);
740 }
741
742
743 //=======================================================================
744 //function : ResetOriginalState
745 //purpose  : 
746 //=======================================================================
747
748 void AIS_InteractiveContext::ResetOriginalState(const Standard_Boolean updateviewer)
749 {
750   Standard_Boolean upd_main(Standard_False);
751   TColStd_ListIteratorOfListOfInteger itl;
752   myMainSel->ResetSelectionActivationStatus();
753
754   for (AIS_DataMapIteratorOfDataMapOfIOStatus it(myObjects);it.More();it.Next()){
755     const Handle(AIS_InteractiveObject)& iobj = it.Key();
756     const Handle(AIS_GlobalStatus)& STAT = it.Value();
757     switch(STAT->GraphicStatus()){
758     case AIS_DS_Displayed:{
759       upd_main = Standard_True;
760       
761       // part display...
762       myMainPM->Display (iobj, STAT->DisplayMode());
763       if(STAT->IsHilighted())
764       {
765         const Handle(Graphic3d_HighlightStyle)& aStyle = STAT->HilightStyle();
766         if (!aStyle.IsNull() && getSelStyle (iobj) != aStyle)
767           HilightWithColor(iobj,aStyle,Standard_False);
768       }
769       //part selection
770       for(itl.Initialize(STAT->SelectionModes());itl.More();itl.Next()){
771         if(itl.Value()!=-1)
772           mgrSelector->Activate(iobj,itl.Value(),myMainSel);
773       }
774       break; 
775     }
776     case AIS_DS_Erased:{
777       EraseGlobal(iobj,Standard_False);
778       break;
779     }
780     default:
781       break;
782     }
783   }
784   if(updateviewer){
785     if(upd_main) 
786       myMainVwr->Update();
787   }
788 }
789
790 //=======================================================================
791 //function : SetZDetection
792 //purpose  : 
793 //=======================================================================
794 void  AIS_InteractiveContext::SetZDetection(const Standard_Boolean aStatus)
795 {
796   myZDetectionFlag = aStatus;
797 }
798
799 //=======================================================================
800 //function : ZDetection 
801 //purpose  : 
802 //=======================================================================
803 Standard_Boolean AIS_InteractiveContext::ZDetection() const 
804 {
805   return myZDetectionFlag;
806 }