0027818: Visualization - provide an interface to define highlight presentation properties
[occt.git] / src / AIS / AIS_InteractiveContext_2.cxx
CommitLineData
b311480e 1// Created on: 1997-01-29
2// Created by: Robert COUBLANC
3// Copyright (c) 1997-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 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
973c2be1 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.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
7fd59977 16
7fd59977 17
7fd59977 18#include <AIS_DataMapIteratorOfDataMapOfILC.hxx>
42cf5bc1 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>
7fd59977 24#include <AIS_Selection.hxx>
42cf5bc1 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>
f751596e 37#include <StdSelect_ViewerSelector3d.hxx>
42cf5bc1 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>
f751596e 45
7fd59977 46//=======================================================================
47//function : OpenLocalContext
48//purpose :
49//=======================================================================
7fd59977 50Standard_Integer AIS_InteractiveContext::
51OpenLocalContext(const Standard_Boolean UseDisplayedObjects,
52 const Standard_Boolean AllowShapeDecomposition,
53 const Standard_Boolean AcceptEraseOfTemporary,
54 const Standard_Boolean /*BothViewers*/)
55{
56
81bba717 57 // the entities eventually detected just before the context was opened are unhighlighted...
c3282ec1 58 if(!IsSelected(myLastPicked)){
7fd59977 59 if(!myLastPicked.IsNull()){
c3282ec1 60 const Handle(AIS_InteractiveObject) aLastPickedAIS =
61 Handle(AIS_InteractiveObject)::DownCast (myLastPicked->Selectable());
62 Standard_Integer HiMod = aLastPickedAIS->HasHilightMode()?aLastPickedAIS->HilightMode():0;
8e5fb5ea 63 unhighlightGlobal (aLastPickedAIS, HiMod);
7fd59977 64 }}
65
66 if(!mylastmoveview.IsNull()){
67 if(myCurLocalIndex>0)
68 myLocalContexts(myCurLocalIndex)->UnhilightLastDetected(mylastmoveview);
69 }
70
81bba717 71 // entities connected to dynamic selection at neutral point are set to 0.
7fd59977 72
73 myLastinMain.Nullify();
7fd59977 74 myLastPicked.Nullify();
75 myWasLastMain = Standard_True;
76
7fd59977 77 myCurLocalIndex = HighestIndex() + 1;
78
79 Handle(AIS_LocalContext) NewLocal= new AIS_LocalContext(this,myCurLocalIndex,
80 UseDisplayedObjects,
81 AllowShapeDecomposition,
82 AcceptEraseOfTemporary);
64e2d3bd 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()).
7fd59977 86
0797d9d3 87#ifdef OCCT_DEBUG
7fd59977 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;
7fd59977 100}
101
102//=======================================================================
103//function : CloseLocalContext
104//purpose :
105//=======================================================================
106
107void AIS_InteractiveContext::CloseLocalContext(const Standard_Integer Index,
108 const Standard_Boolean updateviewer)
109{
110
111 Standard_Boolean debugmode(Standard_False);
0797d9d3 112#ifdef OCCT_DEBUG
7fd59977 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
81bba717 128 // the only open local context is closed...
7fd59977 129 if(myLocalContexts.Extent()==1 && GoodIndex == myCurLocalIndex){
130
7fd59977 131 myLocalContexts(myCurLocalIndex)->Terminate( updateviewer );
132 myLocalContexts.UnBind(myCurLocalIndex);
133 myCurLocalIndex = 0;
134
135 ResetOriginalState(Standard_False);
7fd59977 136 if(debugmode)
137 cout<<"No More Opened Local Context "<<endl;
138 }
139
81bba717 140 // Otherwise the local context will be still open after the current is closed
7fd59977 141 else{
142 Handle(StdSelect_ViewerSelector3d) VS = myLocalContexts(GoodIndex)->MainSelector();
143 myLocalContexts(GoodIndex)->Terminate();
144 myLocalContexts.UnBind(GoodIndex);
81bba717 145 // the current is closed...
7fd59977 146 if(GoodIndex==myCurLocalIndex){
147 myCurLocalIndex = HighestIndex();
7fd59977 148 }
149 else if(debugmode)
150 cout<<"a No Current Local Context WasClosed"<<endl;
325e442b 151
152 // restore activated selections of current local context
153 myLocalContexts (myCurLocalIndex)->RestoreActivatedModes();
154
7fd59977 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
168void 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
7fd59977 177 if(updateviewer) myMainVwr->Update();
178}
179
180//=======================================================================
181//function : IndexOfCurrentLocal
182//purpose :
183//=======================================================================
184
185Standard_Integer AIS_InteractiveContext::IndexOfCurrentLocal() const
186{
187 return myCurLocalIndex;
188}
189
190//=======================================================================
191//function : ClearLocalContext
192//purpose :
193//=======================================================================
194
195void 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
207Standard_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
223void AIS_InteractiveContext::
224Activate(const Handle(AIS_InteractiveObject)& anIObj,
f751596e 225 const Standard_Integer aMode,
226 const Standard_Boolean theIsForce)
7fd59977 227{
228 if(!HasOpenedContext()){
229 if(!myObjects.IsBound(anIObj)) return;
230 const Handle(AIS_GlobalStatus)& STAT = myObjects(anIObj);
f751596e 231 if(STAT->GraphicStatus()==AIS_DS_Displayed || theIsForce)
7fd59977 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//=======================================================================
244Handle( 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//=======================================================================
257void AIS_InteractiveContext::
258Deactivate(const Handle(AIS_InteractiveObject)& anIObj)
259{
260 if(!HasOpenedContext()){
261 if(!myObjects.IsBound(anIObj)) return;
ab943560 262 TColStd_ListIteratorOfListOfInteger ItL;
7fd59977 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
282void 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
303void AIS_InteractiveContext::
304ActivatedModes(const Handle(AIS_InteractiveObject)& anIObj,
305 TColStd_ListOfInteger& theList) const
306{
ab943560 307 TColStd_ListIteratorOfListOfInteger ItL;
7fd59977 308 if(!HasOpenedContext()){
309 if(myObjects.IsBound(anIObj)){
7fd59977 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
332void 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
344void AIS_InteractiveContext::
345SetTemporaryAttributes(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//=======================================================================
355void AIS_InteractiveContext::
356SubIntensityOn(const Handle(AIS_InteractiveObject)& anIObj,
357 const Standard_Boolean updateviewer)
358{
8e5fb5ea 359 if(!HasOpenedContext())
360 {
361 turnOnSubintensity (anIObj);
7fd59977 362 }
8e5fb5ea 363 else
364 {
365 turnOnSubintensity (anIObj, -1, Standard_False);
366 myLocalContexts(myCurLocalIndex)->SubIntensityOn (anIObj);
7fd59977 367 }
8e5fb5ea 368
369 if (updateviewer)
370 myMainVwr->Update();
7fd59977 371}
372//=======================================================================
373//function : SubIntensityOff
374//purpose :
375//=======================================================================
376
377void AIS_InteractiveContext::
378SubIntensityOff(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();
eb4320f2 388 Standard_Boolean UpdMain(Standard_False);
7fd59977 389
3db69e41 390 if(GB->GraphicStatus() == AIS_DS_Displayed)
391 {
392 myMainPM->Unhighlight (anIObj, GB->DisplayMode());
393 UpdMain = Standard_True;
7fd59977 394 }
395
396 Standard_Integer DM,HM,SM;
397 GetDefModes(anIObj,DM,HM,SM);
02974a19 398 if(IsSelected(anIObj))
8e5fb5ea 399 highlightSelected (anIObj->GlobalSelOwner());
7fd59977 400
401 if(updateviewer){
402 if(UpdMain)
403 myMainVwr->Update();
7fd59977 404 }
405 }
406 else {
8e5fb5ea 407 const Handle(Graphic3d_HighlightStyle)& anObjSelStyle =
408 getSelStyle (anIObj);
7fd59977 409 if(myObjects.IsBound(anIObj)){
410 const Handle(AIS_GlobalStatus)& STAT = myObjects(anIObj);
411 STAT->SubIntensityOff();
3db69e41 412 myMainPM->Unhighlight (anIObj, STAT->DisplayMode());
8e5fb5ea 413 if (STAT->IsHilighted())
414 HilightWithColor (anIObj, anObjSelStyle, Standard_False);
7fd59977 415 }
416 else
417 myLocalContexts(myCurLocalIndex)->SubIntensityOff(anIObj);
8e5fb5ea 418 if (IsSelected(anIObj))
419 HilightWithColor (anIObj, anObjSelStyle, Standard_False);
7fd59977 420
421 if(updateviewer) myMainVwr->Update();
422 }
423}
424
425//=======================================================================
426//function : SubIntensityOn
427//purpose : ALL THE DISPLAYED OBJECTS HAVE SUBINTENSITY...
428//=======================================================================
8e5fb5ea 429void AIS_InteractiveContext::SubIntensityOn (const Standard_Boolean theIsToUpdateViewer)
7fd59977 430{
8e5fb5ea 431 if (!HasOpenedContext())
432 return;
433
434 turnOnSubintensity();
435
436 if (theIsToUpdateViewer)
437 myMainVwr->Update();
7fd59977 438}
439
440//=======================================================================
441//function : SubIntensityOff
442//purpose :
443//=======================================================================
444void AIS_InteractiveContext::SubIntensityOff(const Standard_Boolean updateviewer)
445{
7fd59977 446 if(!HasOpenedContext()) return;
ab943560 447
7fd59977 448 AIS_DataMapIteratorOfDataMapOfIOStatus It (myObjects);
7fd59977 449 for(;It.More();It.Next()){
450 const Handle(AIS_GlobalStatus)& STAT = It.Value();
451 if(STAT->IsSubIntensityOn())
452 STAT->SubIntensityOff();
3db69e41 453 myMainPM->Unhighlight (It.Key());
7fd59977 454 }
ab943560 455
7fd59977 456 if(updateviewer) myMainVwr->Update();
457}
458
459//=======================================================================
460//function : AddFilter
461//purpose :
462//=======================================================================
463void 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//=======================================================================
475void 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//=======================================================================
485void 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//=======================================================================
495void 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
508void 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//=======================================================================
520const TColStd_ListOfInteger& AIS_InteractiveContext::ActivatedStandardModes() const
521{
522 return myLocalContexts(myCurLocalIndex)->StandardModes();
523}
524
525//=======================================================================
526//function : Filters
527//purpose :
528//=======================================================================
529const SelectMgr_ListOfFilter& AIS_InteractiveContext::Filters() const
530{
531 if(HasOpenedContext())
532 return myLocalContexts(myCurLocalIndex)->ListOfFilter();
533 return myFilters->StoredFilters();
534}
535
536//=======================================================================
7fd59977 537//function : DisplayActiveSensitive
538//purpose :
539//=======================================================================
540void 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
552void 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());
f751596e 572 VS->DisplaySensitive(Sel,anIObj->Transformation(), aviou,Standard_False);
7fd59977 573 }
574
575}
576
577//=======================================================================
7fd59977 578//function : ClearActiveSensitive
579//purpose :
580//=======================================================================
581void 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//=======================================================================
594void 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//=======================================================================
605Standard_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
617void AIS_InteractiveContext::UseDisplayedObjects()
618{
619 if(HasOpenedContext())
620 myLocalContexts(myCurLocalIndex)->LoadContextObjects();
621}
622
623//=======================================================================
624//function : NotUseDisplayedObjects
625//purpose :
626//=======================================================================
627
628void AIS_InteractiveContext::NotUseDisplayedObjects()
629{
630 if(HasOpenedContext())
631 myLocalContexts(myCurLocalIndex)->UnloadContextObjects();
632}
633
634
635
636
637//=======================================================================
638//function : PurgeDisplay
639//purpose :
640//=======================================================================
641
eb4320f2 642Standard_Integer AIS_InteractiveContext::PurgeDisplay()
7fd59977 643{
644 if(HasOpenedContext()) return 0;
645
646 Standard_Integer NbStr = PurgeViewer(myMainVwr);
7fd59977 647 myMainVwr->Update();
648 return NbStr;
649
650}
651
652
653//=======================================================================
654//function : PurgeViewer
655//purpose :
656//=======================================================================
657Standard_Integer AIS_InteractiveContext::PurgeViewer(const Handle(V3d_Viewer)& Vwr)
658{
c357e426 659 Handle(Graphic3d_StructureManager) GSM = Vwr->StructureManager();
7fd59977 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();
81bba717 670 G->Clear();// it means that it is not referenced as a presentation of InterfactiveObject...
7fd59977 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
7fd59977 682//=======================================================================
683//function : IsImmediateModeOn
679ecdee 684//purpose :
7fd59977 685//=======================================================================
679ecdee 686
7fd59977 687Standard_Boolean AIS_InteractiveContext::IsImmediateModeOn() const
688{
689 if(!HasOpenedContext()) return Standard_False;
690 return myLocalContexts(myCurLocalIndex)->IsImmediateModeOn();
691}
692
7fd59977 693//=======================================================================
679ecdee 694//function : BeginImmediateDraw
695//purpose :
7fd59977 696//=======================================================================
697
679ecdee 698Standard_Boolean AIS_InteractiveContext::BeginImmediateDraw()
699{
700 return HasOpenedContext()
701 && myLocalContexts (myCurLocalIndex)->BeginImmediateDraw();
7fd59977 702}
703
704//=======================================================================
679ecdee 705//function : ImmediateAdd
706//purpose :
7fd59977 707//=======================================================================
708
679ecdee 709Standard_Boolean AIS_InteractiveContext::ImmediateAdd (const Handle(AIS_InteractiveObject)& theObj,
710 const Standard_Integer theMode)
7fd59977 711{
679ecdee 712 return HasOpenedContext()
713 && myLocalContexts (myCurLocalIndex)->ImmediateAdd (theObj, theMode);
7fd59977 714}
715
716//=======================================================================
717//function : EndImmediateDraw
679ecdee 718//purpose :
7fd59977 719//=======================================================================
720
679ecdee 721Standard_Boolean AIS_InteractiveContext::EndImmediateDraw (const Handle(V3d_View)& theView)
7fd59977 722{
679ecdee 723 return HasOpenedContext()
c3282ec1 724 && myLocalContexts (myCurLocalIndex)->EndImmediateDraw (theView->Viewer());
7fd59977 725}
726
727//=======================================================================
728//function : EndImmediateDraw
679ecdee 729//purpose :
7fd59977 730//=======================================================================
731
679ecdee 732Standard_Boolean AIS_InteractiveContext::EndImmediateDraw()
7fd59977 733{
679ecdee 734 if (!HasOpenedContext())
735 {
736 return Standard_False;
7fd59977 737 }
679ecdee 738
6a24c6de 739 return myLocalContexts (myCurLocalIndex)->EndImmediateDraw (myMainVwr);
7fd59977 740}
741
742
743//=======================================================================
744//function : ResetOriginalState
745//purpose :
746//=======================================================================
747
748void AIS_InteractiveContext::ResetOriginalState(const Standard_Boolean updateviewer)
749{
eb4320f2 750 Standard_Boolean upd_main(Standard_False);
7fd59977 751 TColStd_ListIteratorOfListOfInteger itl;
f751596e 752 myMainSel->ResetSelectionActivationStatus();
ab943560 753
7fd59977 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
81bba717 761 // part display...
3db69e41 762 myMainPM->Display (iobj, STAT->DisplayMode());
8e5fb5ea 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);
7fd59977 768 }
81bba717 769 //part selection
7fd59977 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:{
eb4320f2 777 EraseGlobal(iobj,Standard_False);
7fd59977 778 break;
779 }
780 default:
781 break;
782 }
783 }
784 if(updateviewer){
785 if(upd_main)
786 myMainVwr->Update();
7fd59977 787 }
788}
789
7fd59977 790//=======================================================================
791//function : SetZDetection
792//purpose :
793//=======================================================================
794void AIS_InteractiveContext::SetZDetection(const Standard_Boolean aStatus)
795{
796 myZDetectionFlag = aStatus;
797}
798
799//=======================================================================
800//function : ZDetection
801//purpose :
802//=======================================================================
803Standard_Boolean AIS_InteractiveContext::ZDetection() const
804{
805 return myZDetectionFlag;
806}