0024167: Compiler warnings 'unreacheable code' and 'conditional expression is constan...
[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
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
7fd59977 21
22#define IMP051001 //GG Adds SetZDetected() and ZDetected() methods
23
24#include <AIS_InteractiveContext.jxx>
25
26#include <AIS_LocalContext.hxx>
27
28#include <AIS_GlobalStatus.hxx>
29#include <TColStd_ListIteratorOfListOfInteger.hxx>
30
31#include <AIS_DataMapIteratorOfDataMapOfIOStatus.hxx>
32#include <AIS_DataMapIteratorOfDataMapOfILC.hxx>
33#include <Graphic3d_StructureManager.hxx>
34#include <Graphic3d_Structure.hxx>
35#include <Graphic3d_MapOfStructure.hxx>
36#include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
37#include <AIS_Selection.hxx>
38
7fd59977 39//=======================================================================
40//function : OpenLocalContext
41//purpose :
42//=======================================================================
43
44Standard_Integer AIS_InteractiveContext::
45OpenLocalContext(const Standard_Boolean UseDisplayedObjects,
46 const Standard_Boolean AllowShapeDecomposition,
47 const Standard_Boolean AcceptEraseOfTemporary,
48 const Standard_Boolean /*BothViewers*/)
49{
50
81bba717 51 // the entities eventually detected just before the context was opened are unhighlighted...
7fd59977 52 if(!IsCurrent(myLastPicked)){
53 if(!myLastPicked.IsNull()){
54 Standard_Integer HiMod = myLastPicked->HasHilightMode()?myLastPicked->HilightMode():0;
55 myMainPM->Unhighlight(myLastPicked,HiMod);
56 }}
57
58 if(!mylastmoveview.IsNull()){
59 if(myCurLocalIndex>0)
60 myLocalContexts(myCurLocalIndex)->UnhilightLastDetected(mylastmoveview);
61 }
62
81bba717 63 // entities connected to dynamic selection at neutral point are set to 0.
7fd59977 64
65 myLastinMain.Nullify();
66 myLastinColl.Nullify();
67 myLastPicked.Nullify();
68 myWasLastMain = Standard_True;
69
70
71
72 Standard_Integer untilnow = myCurLocalIndex;
73
74 myCurLocalIndex = HighestIndex() + 1;
75
76 Handle(AIS_LocalContext) NewLocal= new AIS_LocalContext(this,myCurLocalIndex,
77 UseDisplayedObjects,
78 AllowShapeDecomposition,
79 AcceptEraseOfTemporary);
64e2d3bd 80 // the AIS_LocalContext bind itself to myLocalContexts
81 // because procedures performed in AIS_LocalContext constructor
82 // already may access myLocalContexts(myCurLocalIndex) (like methods AIS_LocalContext::IsSelected()).
83 //myLocalContexts.Bind (myCurLocalIndex, NewLocal);
84 NewLocal->MainSelector()->Set ((myLocalContexts.Extent() > 1)
ab943560 85 ? myLocalContexts (untilnow)->MainSelector()->Projector()
86 : myMainSel->Projector());
87
7fd59977 88 NewLocal->MainSelector()->UpdateConversion();
7fd59977 89
90#ifdef DEB
91 cout<<"\tOpen Local Context No "<<myCurLocalIndex<<endl;
92 if(UseDisplayedObjects){
93 cout<<"\t\tObjects from Neutral Point loaded"<<endl;
94 if(AllowShapeDecomposition)
95 cout<<"\t\tDecomposition Authorized for Loaded Shapes"<<endl;
96 else
97 cout<<"\t\tNo Decomposition Authorized for Loaded Shapes"<<endl;
98 }
99 else
100 cout<<"\t\tNo Objects Were Loaded "<<endl;
101#endif
102 return myCurLocalIndex;
7fd59977 103}
104
105//=======================================================================
106//function : CloseLocalContext
107//purpose :
108//=======================================================================
109
110void AIS_InteractiveContext::CloseLocalContext(const Standard_Integer Index,
111 const Standard_Boolean updateviewer)
112{
113
114 Standard_Boolean debugmode(Standard_False);
115#ifdef DEB
116 debugmode = Standard_True;
117#endif
118
119 Standard_Integer GoodIndex = (Index ==-1) ? myCurLocalIndex : Index;
120
121 if(debugmode) cout<<"Call to CloseLocalContext - Index "<<GoodIndex<<endl;
122 if(!HasOpenedContext()){
123 if(debugmode) cout<<"\t But No Local Context is opened"<<endl;
124 return;
125 }
126 if(!myLocalContexts.IsBound(GoodIndex)) {
127 if(debugmode) cout<<" Attempt to Close a non-existent Local Context"<<endl;
128 return;
129 }
130
81bba717 131 // the only open local context is closed...
7fd59977 132 if(myLocalContexts.Extent()==1 && GoodIndex == myCurLocalIndex){
133
134 Standard_Boolean updateproj = !(myLocalContexts(myCurLocalIndex)->HasSameProjector(myMainSel->Projector()));
135 myLocalContexts(myCurLocalIndex)->Terminate( updateviewer );
136 myLocalContexts.UnBind(myCurLocalIndex);
137 myCurLocalIndex = 0;
138
139 ResetOriginalState(Standard_False);
140 if(updateproj)
141 myMainSel->UpdateConversion();
142 else{
7fd59977 143 myMainSel->UpdateSort();
144 }
145 if(debugmode)
146 cout<<"No More Opened Local Context "<<endl;
147 }
148
81bba717 149 // Otherwise the local context will be still open after the current is closed
7fd59977 150 else{
151 Handle(StdSelect_ViewerSelector3d) VS = myLocalContexts(GoodIndex)->MainSelector();
152 myLocalContexts(GoodIndex)->Terminate();
153 myLocalContexts.UnBind(GoodIndex);
81bba717 154 // the current is closed...
7fd59977 155 if(GoodIndex==myCurLocalIndex){
156 myCurLocalIndex = HighestIndex();
157 const Handle(AIS_LocalContext)& LocCtx = myLocalContexts(myCurLocalIndex);
4269bd1b 158 if (!LocCtx->HasSameProjector (VS->Projector()))
159 {
7fd59977 160 LocCtx->MainSelector()->UpdateConversion();
4269bd1b 161 }
7fd59977 162 }
163 else if(debugmode)
164 cout<<"a No Current Local Context WasClosed"<<endl;
165
166 if(debugmode) cout<<"Index Of CurrentLocalContext:"<<myCurLocalIndex<<endl;
167
168 }
169
170
171 if(updateviewer) myMainVwr->Update();
172}
173
174//=======================================================================
175//function : CloseAllContexts
176//purpose :
177//=======================================================================
178
179void AIS_InteractiveContext::CloseAllContexts(const Standard_Boolean updateviewer)
180{
181
182 while(!myLocalContexts.IsEmpty()){
183 CloseLocalContext(myCurLocalIndex,Standard_False);
184 }
185
186 ResetOriginalState(Standard_False);
187
188 myMainSel->UpdateSort();
189 if(!myIsCollClosed && !myCollectorSel.IsNull())
190 myCollectorSel->UpdateSort();
191 if(updateviewer) myMainVwr->Update();
192}
193
194//=======================================================================
195//function : IndexOfCurrentLocal
196//purpose :
197//=======================================================================
198
199Standard_Integer AIS_InteractiveContext::IndexOfCurrentLocal() const
200{
201 return myCurLocalIndex;
202}
203
204//=======================================================================
205//function : ClearLocalContext
206//purpose :
207//=======================================================================
208
209void AIS_InteractiveContext::ClearLocalContext(const AIS_ClearMode aMode)
210{
211 if (!HasOpenedContext()) return;
212 myLocalContexts(myCurLocalIndex)->Clear(aMode);
213
214}
215
216//=======================================================================
217//function : HighestIndex
218//purpose :
219//=======================================================================
220
221Standard_Integer AIS_InteractiveContext::HighestIndex() const
222{
223 AIS_DataMapIteratorOfDataMapOfILC It(myLocalContexts);
224 Standard_Integer HiInd = 0;
225 for(;It.More();It.Next())
226 HiInd = (It.Key()>HiInd) ? It.Key() : HiInd;
227 return HiInd;
228
229}
230
231
232//=======================================================================
233//function : Activate
234//purpose :
235//=======================================================================
236
237void AIS_InteractiveContext::
238Activate(const Handle(AIS_InteractiveObject)& anIObj,
239 const Standard_Integer aMode)
240{
241 if(!HasOpenedContext()){
242 if(!myObjects.IsBound(anIObj)) return;
243 const Handle(AIS_GlobalStatus)& STAT = myObjects(anIObj);
244 if(STAT->GraphicStatus()==AIS_DS_Displayed)
245 mgrSelector->Activate(anIObj,aMode,myMainSel);
246 STAT ->AddSelectionMode(aMode);
247 }
248 else{
249 myLocalContexts(myCurLocalIndex)->ActivateMode(anIObj,aMode);
250 }
251}
252
253//=======================================================================
254//function : LocalSelector
255//purpose :
256//=======================================================================
257Handle( StdSelect_ViewerSelector3d ) AIS_InteractiveContext::LocalSelector() const
258{
259 if( !HasOpenedContext() )
260 return Handle( StdSelect_ViewerSelector3d )();
261 else
262 return myLocalContexts( myCurLocalIndex )->MainSelector();
263}
264
265
266//=======================================================================
267//function : DeActivate
268//purpose :
269//=======================================================================
270void AIS_InteractiveContext::
271Deactivate(const Handle(AIS_InteractiveObject)& anIObj)
272{
273 if(!HasOpenedContext()){
274 if(!myObjects.IsBound(anIObj)) return;
ab943560 275 TColStd_ListIteratorOfListOfInteger ItL;
7fd59977 276 for(ItL.Initialize(myObjects(anIObj)->SelectionModes());
277 ItL.More();
278 ItL.Next()){
279 if(myObjects(anIObj)->GraphicStatus() == AIS_DS_Displayed)
280 mgrSelector->Deactivate(anIObj,ItL.Value(),myMainSel);
281 }
282 myObjects(anIObj)->ClearSelectionModes();
283 }
284 else{
285 const Handle(AIS_LocalContext)& LC = myLocalContexts(myCurLocalIndex);
286 LC->Deactivate(anIObj);
287 }
288}
289
290//=======================================================================
291//function : Deactivate
292//purpose :
293//=======================================================================
294
295void AIS_InteractiveContext::Deactivate(const Handle(AIS_InteractiveObject)& anIObj,
296 const Standard_Integer aMode)
297{
298 if(!HasOpenedContext()){
299 if(!myObjects.IsBound(anIObj)) return;
300 const Handle(AIS_GlobalStatus)& STAT = myObjects(anIObj);
301
302 if(STAT->GraphicStatus() == AIS_DS_Displayed)
303 mgrSelector->Deactivate(anIObj,aMode,myMainSel);
304 STAT->RemoveSelectionMode(aMode);
305 }
306 else{
307 myLocalContexts(myCurLocalIndex)->DeactivateMode(anIObj,aMode);
308 }
309}
310
311//=======================================================================
312//function : ActivatedModes
313//purpose :
314//=======================================================================
315
316void AIS_InteractiveContext::
317ActivatedModes(const Handle(AIS_InteractiveObject)& anIObj,
318 TColStd_ListOfInteger& theList) const
319{
ab943560 320 TColStd_ListIteratorOfListOfInteger ItL;
7fd59977 321 if(!HasOpenedContext()){
322 if(myObjects.IsBound(anIObj)){
7fd59977 323 for(ItL.Initialize(myObjects(anIObj)->SelectionModes());
324 ItL.More();
325 ItL.Next())
326 theList.Append(ItL.Value());
327
328 }
329 }
330 else{
331 if(myLocalContexts(myCurLocalIndex)->IsIn(anIObj)){
332 for(ItL.Initialize(myLocalContexts(myCurLocalIndex)->SelectionModes(anIObj));
333 ItL.More();
334 ItL.Next())
335 theList.Append(ItL.Value());
336 }
337 }
338}
339
340//=======================================================================
341//function : SetShapeDecomposition
342//purpose :
343//=======================================================================
344
345void AIS_InteractiveContext::SetShapeDecomposition(const Handle(AIS_InteractiveObject)& anIObj,
346 const Standard_Boolean StdModeSensitive)
347{
348 if(!HasOpenedContext()) return;
349 myLocalContexts(myCurLocalIndex)->SetShapeDecomposition(anIObj,StdModeSensitive);
350}
351
352//=======================================================================
353//function : SetTemporaryAttributes
354//purpose :
355//=======================================================================
356
357void AIS_InteractiveContext::
358SetTemporaryAttributes(const Handle(AIS_InteractiveObject)& /*anObj*/,
359 const Handle(Prs3d_Drawer)& /*aDrawer*/,
360 const Standard_Boolean /*updateviewer*/)
361{
362}
363
364//=======================================================================
365//function : SubIntensityOn
366//purpose :
367//=======================================================================
368void AIS_InteractiveContext::
369SubIntensityOn(const Handle(AIS_InteractiveObject)& anIObj,
370 const Standard_Boolean updateviewer)
371{
372 if(!HasOpenedContext()){
373 if(!myObjects.IsBound(anIObj))
374 return;
375 const Handle(AIS_GlobalStatus)& GB=myObjects(anIObj);
376 if(GB->IsSubIntensityOn())
377 return;
378 GB->SubIntensityOn();
379 Standard_Boolean UpdMain(Standard_False),UpdColl(Standard_False);
380
381 for(TColStd_ListIteratorOfListOfInteger It(GB->DisplayedModes());It.More();It.Next()){
382 if(GB->GraphicStatus()==AIS_DS_Displayed){
383 myMainPM->Color(anIObj,mySubIntensity,It.Value());
384 UpdMain = Standard_True;}
385 else if(GB->GraphicStatus()==AIS_DS_Erased){
386 myCollectorPM->Color(anIObj,mySubIntensity,It.Value());
387 UpdColl=Standard_True;
388 }
389 }
390 if(updateviewer){
391 if(UpdMain)
392 myMainVwr->Update();
393 if(UpdColl)
394 myCollectorVwr->Update();
395 }
396 }
397 else {
398 if(myObjects.IsBound(anIObj)){
399 const Handle(AIS_GlobalStatus)& STAT = myObjects(anIObj);
400 STAT->SubIntensityOn();
ab943560 401 TColStd_ListIteratorOfListOfInteger ItL;
7fd59977 402 for (ItL.Initialize(STAT->DisplayedModes());ItL.More();ItL.Next())
403 myMainPM->Color(anIObj,mySubIntensity,ItL.Value());
404 }
405 else
406 myLocalContexts(myCurLocalIndex)->SubIntensityOn(anIObj);
407
408 if(updateviewer) myMainVwr->Update();
409 }
410}
411//=======================================================================
412//function : SubIntensityOff
413//purpose :
414//=======================================================================
415
416void AIS_InteractiveContext::
417SubIntensityOff(const Handle(AIS_InteractiveObject)& anIObj,
418 const Standard_Boolean updateviewer)
419{
420 if(!HasOpenedContext()){
421 if(!myObjects.IsBound(anIObj))
422 return;
423 const Handle(AIS_GlobalStatus)& GB=myObjects(anIObj);
424 if(!GB->IsSubIntensityOn())
425 return;
426 GB->SubIntensityOff();
427 Standard_Boolean UpdMain(Standard_False),UpdColl(Standard_False);
428
429 for(TColStd_ListIteratorOfListOfInteger It(GB->DisplayedModes());It.More();It.Next()){
430 if(GB->GraphicStatus()!=AIS_DS_Erased){
431 myMainPM->Unhighlight(anIObj,It.Value());
432 UpdMain = Standard_True;}
433 else {
434 myCollectorPM->Unhighlight(anIObj,It.Value());
435 UpdColl=Standard_True;
436 }
437 }
438
439 Standard_Integer DM,HM,SM;
440 GetDefModes(anIObj,DM,HM,SM);
441 if(AIS_Selection::IsSelected(anIObj))
442 myMainPM->Highlight(anIObj,HM);
443
444 if(updateviewer){
445 if(UpdMain)
446 myMainVwr->Update();
447 if(UpdColl)
448 myCollectorVwr->Update();
449 }
450 }
451 else {
452 if(myObjects.IsBound(anIObj)){
453 const Handle(AIS_GlobalStatus)& STAT = myObjects(anIObj);
454 STAT->SubIntensityOff();
ab943560 455 TColStd_ListIteratorOfListOfInteger ItL;
7fd59977 456 for (ItL.Initialize(STAT->DisplayedModes());ItL.More();ItL.Next())
457 myMainPM->Unhighlight(anIObj,ItL.Value());
458 if(STAT->IsHilighted())
459 Hilight(anIObj);
460 }
461 else
462 myLocalContexts(myCurLocalIndex)->SubIntensityOff(anIObj);
463 if(IsSelected(anIObj))
464 Hilight(anIObj);
465
466 if(updateviewer) myMainVwr->Update();
467 }
468}
469
470//=======================================================================
471//function : SubIntensityOn
472//purpose : ALL THE DISPLAYED OBJECTS HAVE SUBINTENSITY...
473//=======================================================================
474
475void AIS_InteractiveContext::SubIntensityOn(const Standard_Boolean updateviewer)
476{
477 if(!HasOpenedContext()) return;
478
479 AIS_DataMapIteratorOfDataMapOfIOStatus It (myObjects);
480 TColStd_ListIteratorOfListOfInteger ItM;
481 for(;It.More();It.Next()){
482 const Handle(AIS_GlobalStatus)& STAT = It.Value();
483 if(STAT->GraphicStatus()==AIS_DS_Displayed)
484 {
485 STAT->SubIntensityOn();
486 for(ItM.Initialize(STAT->DisplayedModes());ItM.More();ItM.Next())
487 {myMainPM->Color(It.Key(),mySubIntensity,ItM.Value());}
488 }
489 }
490 if(updateviewer) myMainVwr->Update();
491}
492
493//=======================================================================
494//function : SubIntensityOff
495//purpose :
496//=======================================================================
497void AIS_InteractiveContext::SubIntensityOff(const Standard_Boolean updateviewer)
498{
7fd59977 499 if(!HasOpenedContext()) return;
ab943560 500
7fd59977 501 AIS_DataMapIteratorOfDataMapOfIOStatus It (myObjects);
ab943560 502 TColStd_ListIteratorOfListOfInteger ItL;
7fd59977 503 for(;It.More();It.Next()){
504 const Handle(AIS_GlobalStatus)& STAT = It.Value();
505 if(STAT->IsSubIntensityOn())
506 STAT->SubIntensityOff();
507 for(ItL.Initialize(STAT->DisplayedModes());ItL.More();ItL.Next())
508 myMainPM->Unhighlight(It.Key());
509 }
ab943560 510
7fd59977 511 if(updateviewer) myMainVwr->Update();
512}
513
514//=======================================================================
515//function : AddFilter
516//purpose :
517//=======================================================================
518void AIS_InteractiveContext::AddFilter(const Handle(SelectMgr_Filter)& aFilter)
519{
520 if(HasOpenedContext())
521 myLocalContexts(myCurLocalIndex)->AddFilter(aFilter);
522 else
523 myFilters->Add(aFilter);
524}
525
526//=======================================================================
527//function : ActivateStandardMode
528//purpose :
529//=======================================================================
530void AIS_InteractiveContext::ActivateStandardMode(const TopAbs_ShapeEnum aStandardActivation)
531{
532 if(!HasOpenedContext()) return;
533 myLocalContexts(myCurLocalIndex)->ActivateStandardMode (aStandardActivation);
534}
535
536//=======================================================================
537//function : DeActivateStandardMode
538//purpose :
539//=======================================================================
540void AIS_InteractiveContext::DeactivateStandardMode(const TopAbs_ShapeEnum aStandardActivation)
541{
542 if(!HasOpenedContext()) return;
543 myLocalContexts(myCurLocalIndex)->DeactivateStandardMode (aStandardActivation);
544}
545
546//=======================================================================
547//function : RemoveFilter
548//purpose :
549//=======================================================================
550void AIS_InteractiveContext::RemoveFilter(const Handle(SelectMgr_Filter)& aFilter)
551{
552 if(HasOpenedContext())
553 myLocalContexts(myCurLocalIndex)->RemoveFilter (aFilter);
554 else
555 myFilters->Remove(aFilter);
556}
557
558//=======================================================================
559//function : RemoveFilters
560//purpose :
561//=======================================================================
562
563void AIS_InteractiveContext::RemoveFilters()
564{
565 if(!HasOpenedContext())
566 myFilters->Clear();
567 else
568 myLocalContexts(myCurLocalIndex)->Clear(AIS_CM_Filters);
569}
570
571//=======================================================================
572//function : ActivatedStandardModes
573//purpose :
574//=======================================================================
575const TColStd_ListOfInteger& AIS_InteractiveContext::ActivatedStandardModes() const
576{
577 return myLocalContexts(myCurLocalIndex)->StandardModes();
578}
579
580//=======================================================================
581//function : Filters
582//purpose :
583//=======================================================================
584const SelectMgr_ListOfFilter& AIS_InteractiveContext::Filters() const
585{
586 if(HasOpenedContext())
587 return myLocalContexts(myCurLocalIndex)->ListOfFilter();
588 return myFilters->StoredFilters();
589}
590
591//=======================================================================
592//function : DisplayActiveAreas
593//purpose :
594//=======================================================================
595void AIS_InteractiveContext::DisplayActiveAreas(const Handle(V3d_View)& aviou)
596{
597 if(HasOpenedContext())
598 myLocalContexts(myCurLocalIndex)->DisplayAreas(aviou);
599 else
600 myMainSel->DisplayAreas(aviou);
601
602}
603
604//=======================================================================
605//function : ClearActiveAreas
606//purpose :
607//=======================================================================
608void AIS_InteractiveContext::ClearActiveAreas(const Handle(V3d_View)& aviou)
609{
610 if(HasOpenedContext())
611 myLocalContexts(myCurLocalIndex)->ClearAreas(aviou);
612 else
613 myMainSel->ClearAreas(aviou);
614}
615
616//=======================================================================
617//function : DisplayActiveSensitive
618//purpose :
619//=======================================================================
620void AIS_InteractiveContext::DisplayActiveSensitive(const Handle(V3d_View)& aviou)
621{
622 if(HasOpenedContext())
623 myLocalContexts(myCurLocalIndex)->DisplaySensitive(aviou);
624 else
625 myMainSel->DisplaySensitive(aviou);
626}
627//=======================================================================
628//function : DisplayActiveSensitive
629//purpose :
630//=======================================================================
631
632void AIS_InteractiveContext::DisplayActiveSensitive(const Handle(AIS_InteractiveObject)& anIObj,
633 const Handle(V3d_View)& aviou)
634{
635 TColStd_ListIteratorOfListOfInteger It;
636 Handle(StdSelect_ViewerSelector3d) VS;
637 if(HasOpenedContext()){
638 const Handle(AIS_LocalContext)& LC = myLocalContexts(myCurLocalIndex);
639 if(!LC->IsIn(anIObj)) return;
640 It.Initialize(LC->SelectionModes(anIObj));
641 VS = LC->MainSelector();
642 }
643 else{
644 if(!myObjects.IsBound(anIObj)) return;
645 It.Initialize(myObjects(anIObj)->SelectionModes());
646 VS = myMainSel;
647 }
648
649
650 for(;It.More();It.Next()){
651 const Handle(SelectMgr_Selection)& Sel = anIObj->Selection(It.Value());
652 VS->DisplaySensitive(Sel,aviou,Standard_False);
653 }
654
655}
656
657//=======================================================================
658//function : DisplayActiveAreas
659//purpose :
660//=======================================================================
661
662void AIS_InteractiveContext::DisplayActiveAreas(const Handle(AIS_InteractiveObject)& anIObj,
663 const Handle(V3d_View)& aviou)
664{
665 TColStd_ListIteratorOfListOfInteger It;
666 Handle(StdSelect_ViewerSelector3d) VS;
667 if(HasOpenedContext()){
668 const Handle(AIS_LocalContext)& LC = myLocalContexts(myCurLocalIndex);
669 if(!LC->IsIn(anIObj)) return;
670 It.Initialize(LC->SelectionModes(anIObj));
671 VS = LC->MainSelector();
672 }
673 else{
674 if(!myObjects.IsBound(anIObj)) return;
675 It.Initialize(myObjects(anIObj)->SelectionModes());
676 VS = myMainSel;
677 }
678
679
680 for(;It.More();It.Next()){
681 const Handle(SelectMgr_Selection)& Sel = anIObj->Selection(It.Value());
682 VS->DisplayAreas(Sel,aviou,Standard_False);
683 }
684
685}
686
687//=======================================================================
688//function : ClearActiveSensitive
689//purpose :
690//=======================================================================
691void AIS_InteractiveContext::ClearActiveSensitive(const Handle(V3d_View)& aviou)
692{
693
694 if(HasOpenedContext())
695 myLocalContexts(myCurLocalIndex)->ClearSensitive(aviou);
696 else
697 myMainSel->ClearSensitive(aviou);
698}
699
700//=======================================================================
701//function : SetAutomaticHilight
702//purpose :
703//=======================================================================
704void AIS_InteractiveContext::SetAutomaticHilight(const Standard_Boolean aStatus)
705{
706
707 if(HasOpenedContext())
708 myLocalContexts(myCurLocalIndex)->SetAutomaticHilight(aStatus);
709}
710
711//=======================================================================
712//function : AutomaticHilight
713//purpose :
714//=======================================================================
715Standard_Boolean AIS_InteractiveContext::AutomaticHilight() const
716{
717 if(HasOpenedContext())
718 return myLocalContexts(myCurLocalIndex)->AutomaticHilight();
719 return Standard_True;
720}
721
722//=======================================================================
723//function : UseDisplayedObjects
724//purpose :
725//=======================================================================
726
727void AIS_InteractiveContext::UseDisplayedObjects()
728{
729 if(HasOpenedContext())
730 myLocalContexts(myCurLocalIndex)->LoadContextObjects();
731}
732
733//=======================================================================
734//function : NotUseDisplayedObjects
735//purpose :
736//=======================================================================
737
738void AIS_InteractiveContext::NotUseDisplayedObjects()
739{
740 if(HasOpenedContext())
741 myLocalContexts(myCurLocalIndex)->UnloadContextObjects();
742}
743
744
745
746
747//=======================================================================
748//function : PurgeDisplay
749//purpose :
750//=======================================================================
751
752Standard_Integer AIS_InteractiveContext::PurgeDisplay(const Standard_Boolean CollectorToo)
753{
754 if(HasOpenedContext()) return 0;
755
756 Standard_Integer NbStr = PurgeViewer(myMainVwr);
757 if(!myCollectorVwr.IsNull())
758 if(CollectorToo){
759 NbStr+=PurgeViewer(myCollectorVwr);
760 if(!IsCollectorClosed())
761 myCollectorVwr->Update();
762 }
763 myMainVwr->Update();
764 return NbStr;
765
766}
767
768
769//=======================================================================
770//function : PurgeViewer
771//purpose :
772//=======================================================================
773Standard_Integer AIS_InteractiveContext::PurgeViewer(const Handle(V3d_Viewer)& Vwr)
774{
775 const Handle(Graphic3d_StructureManager)& GSM = Vwr->Viewer();
776 Standard_Integer NbCleared(0);
777 Graphic3d_MapOfStructure SOS;
778 GSM->DisplayedStructures(SOS);
779
780 Handle(Graphic3d_Structure) G;
781 for(Graphic3d_MapIteratorOfMapOfStructure It(SOS); It.More();It.Next()){
782 G = It.Key();
783 Standard_Address Add = G->Owner();
784 if(Add==NULL){
785 G->Erase();
81bba717 786 G->Clear();// it means that it is not referenced as a presentation of InterfactiveObject...
7fd59977 787 NbCleared++;
788 }
789 Handle(AIS_InteractiveObject) IO = (AIS_InteractiveObject*)Add;
790 if(!myObjects.IsBound(IO)){
791 G->Erase();
792 NbCleared++;
793 }
794 }
795 return NbCleared;
796}
797
798
799//=======================================================================
800//function : IsImmediateModeOn
801//purpose :
802//=======================================================================
803Standard_Boolean AIS_InteractiveContext::IsImmediateModeOn() const
804{
805 if(!HasOpenedContext()) return Standard_False;
806 return myLocalContexts(myCurLocalIndex)->IsImmediateModeOn();
807}
808
809Standard_Boolean AIS_InteractiveContext::BeginImmediateDraw()
810{
811 if(HasOpenedContext())
812 return myLocalContexts(myCurLocalIndex)->BeginImmediateDraw();
813 return Standard_False;
814}
815
816//=======================================================================
817//function : ImmediateAdd
818//purpose :
819//=======================================================================
820
821Standard_Boolean AIS_InteractiveContext::ImmediateAdd(const Handle(AIS_InteractiveObject)& anIObj,
822 const Standard_Integer AMode)
823{
824 if(HasOpenedContext()){
825 return myLocalContexts(myCurLocalIndex)->ImmediateAdd(anIObj,AMode);}
826 return Standard_False;
827}
828
829//=======================================================================
830//function : ImmediateRemove
831//purpose :
832//=======================================================================
833
834Standard_Boolean AIS_InteractiveContext::ImmediateRemove(const Handle(AIS_InteractiveObject)& anIObj,
835 const Standard_Integer aMode)
836{
837 if(HasOpenedContext())
838 return myLocalContexts(myCurLocalIndex)->ImmediateRemove(anIObj,aMode);
839 return Standard_False;
840}
841
842//=======================================================================
843//function : EndImmediateDraw
844//purpose :
845//=======================================================================
846
847Standard_Boolean AIS_InteractiveContext::EndImmediateDraw(const Handle(V3d_View)& aView,
848 const Standard_Boolean DoubleBuf)
849{
850 if(HasOpenedContext())
851 return myLocalContexts(myCurLocalIndex)->EndImmediateDraw(aView,DoubleBuf);
852 return Standard_False;
853
854}
855
856//=======================================================================
857//function : EndImmediateDraw
858//purpose :
859//=======================================================================
860
861Standard_Boolean AIS_InteractiveContext::EndImmediateDraw(const Standard_Boolean DoubleBuf)
862{
863 if(HasOpenedContext()){
864 Handle(V3d_View) V ;
865 myMainVwr->InitActiveViews();
866 if(myMainVwr->MoreActiveViews()){
867 V = myMainVwr->ActiveView();
868
869 return myLocalContexts(myCurLocalIndex)->EndImmediateDraw(V,DoubleBuf);
870 }
871 }
872 return Standard_False;
873
874}
875
876
877//=======================================================================
878//function : ResetOriginalState
879//purpose :
880//=======================================================================
881
882void AIS_InteractiveContext::ResetOriginalState(const Standard_Boolean updateviewer)
883{
884 Standard_Boolean upd_main(Standard_False),upd_col(Standard_False);
885 TColStd_ListIteratorOfListOfInteger itl;
ab943560 886
7fd59977 887 for (AIS_DataMapIteratorOfDataMapOfIOStatus it(myObjects);it.More();it.Next()){
888 const Handle(AIS_InteractiveObject)& iobj = it.Key();
889 const Handle(AIS_GlobalStatus)& STAT = it.Value();
890 switch(STAT->GraphicStatus()){
891 case AIS_DS_Displayed:{
892 upd_main = Standard_True;
893
81bba717 894 // part display...
7fd59977 895 for(itl.Initialize(STAT->DisplayedModes());itl.More();itl.Next())
896 myMainPM->Display(iobj,itl.Value());
897 if(STAT->IsHilighted()){
898 if(STAT->HilightColor()!=Quantity_NOC_WHITE)
899 HilightWithColor(iobj,STAT->HilightColor(),Standard_False);
900 else
901 Hilight(iobj,Standard_False);
902 }
81bba717 903 //part selection
7fd59977 904 for(itl.Initialize(STAT->SelectionModes());itl.More();itl.Next()){
905 if(itl.Value()!=-1)
906 mgrSelector->Activate(iobj,itl.Value(),myMainSel);
907 }
908 break;
909 }
910 case AIS_DS_Erased:{
911 upd_col = Standard_True;
912 EraseGlobal(iobj,Standard_False,Standard_True);
913 break;
914 }
915 case AIS_DS_FullErased:{
916 EraseGlobal(iobj,Standard_False,Standard_False);
917 break;
918 }
919 default:
920 break;
921 }
922 }
923 if(updateviewer){
924 if(upd_main)
925 myMainVwr->Update();
926 if(upd_col)
927 myCollectorVwr->Update();
928 }
929}
930
931#ifdef IMP051001
932//=======================================================================
933//function : SetZDetection
934//purpose :
935//=======================================================================
936void AIS_InteractiveContext::SetZDetection(const Standard_Boolean aStatus)
937{
938 myZDetectionFlag = aStatus;
939}
940
941//=======================================================================
942//function : ZDetection
943//purpose :
944//=======================================================================
945Standard_Boolean AIS_InteractiveContext::ZDetection() const
946{
947 return myZDetectionFlag;
948}
949#endif