0023710: Simplification of presentation managment classes
[occt.git] / src / AIS / AIS_LocalContext.cxx
CommitLineData
b311480e 1// Created on: 1997-01-17
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.
b311480e 16
7fd59977 17//Modified by ROB : Traque des UpdateConversion intempestifs.
18
19#define BUC60688 //GG 25/05/00 Add SetSensitivity() methods.
20
21#define BUC60722 //GG_040900 Disable detection on an unviewable object
22
23#define IMP160701 //SZV Add InitDetected(),MoreDetected(),NextDetected(),
24// DetectedCurrentShape(),DetectedCurrentObject()
25// methods
26
27#define ALE70590 //GG Avoid raise especially under W2000-SP2
28// when opening many local context due to a
29// system error in the selection name computation routine.
30// Many thanks to Philippe CARRET for the helpfull he has
31// give to accelerate the resolution of this problem.
32
33#include <AIS_LocalContext.ixx>
34#include <SelectMgr_OrFilter.hxx>
35#include <SelectMgr_CompositionFilter.hxx>
36#include <AIS_LocalStatus.hxx>
37#include <AIS_Shape.hxx>
38#include <TColStd_ListIteratorOfListOfInteger.hxx>
39#include <AIS_ListIteratorOfListOfInteractive.hxx>
40#include <AIS_ListOfInteractive.hxx>
41#include <AIS_DataMapIteratorOfDataMapOfSelStat.hxx>
42#include <TopAbs_ShapeEnum.hxx>
43#include <Graphic3d_Structure.hxx>
44#include <Prs3d_LineAspect.hxx>
45#include <Prs3d_PlaneAspect.hxx>
46#include <Prs3d_PointAspect.hxx>
47#include <Prs3d_Presentation.hxx>
48#include <Aspect_TypeOfMarker.hxx>
49#include <StdSelect_ShapeTypeFilter.hxx>
50#include <AIS_Selection.hxx>
51#include <V3d_Viewer.hxx>
52#include <V3d_View.hxx>
7fd59977 53#include <Visual3d_View.hxx>
54
55#ifdef ALE70590
56#include <stdio.h>
57#else
58#include <Standard_SStream.hxx>
59#endif
60
61static TCollection_AsciiString AIS_Local_SelName(const Standard_Address address,
62 const Standard_Integer anIndex)
63{
64// TCollection_AsciiString SelName;
65#ifdef ALE70590
66 char string[100];
67 sprintf(string,"%p_%d", address, anIndex); // works under any system
68 TCollection_AsciiString SelName(string);
69#else
70 Standard_SStream stream;
71 stream<<address; // something is wrong here using the SStream because
72// the following access to rdbuf crash for an unknown reason
73// especially under W2000 with SP2 and sometime under WNT and W98.
74// NOTE that stream is not ended by a NULL char and it's probably
75// one of the reasons why this crash.
76// In any case the resulting ascii string give a wrong and random
77// name under WINDOWS !
78 TCollection_AsciiString SelName(stream.rdbuf()->str());
79// SelName = TCollection_AsciiString("AIS_Local_");
80 TCollection_AsciiString theind(anIndex);
81 SelName += "_";
82 SelName += theind;
83#endif
84 return SelName;
85}
86
87
88//=======================================================================
89//function : AIS_LocalContext
90//purpose :
91//=======================================================================
92
93
94AIS_LocalContext::AIS_LocalContext(){}
95
96AIS_LocalContext::AIS_LocalContext(const Handle(AIS_InteractiveContext)& aCtx,
97 const Standard_Integer Index,
98 const Standard_Boolean LoadDisplayed,
99 const Standard_Boolean AcceptStandardModes,
100 const Standard_Boolean AcceptEraseOfTemp,
35e08fe8 101 const Standard_Boolean /*BothViewers*/):
7fd59977 102myCTX(aCtx),
103myLoadDisplayed(LoadDisplayed),
104myAcceptStdMode(AcceptStandardModes),
105myAcceptErase(AcceptEraseOfTemp),
106mySM(aCtx->SelectionManager()),
107myMainVS(new StdSelect_ViewerSelector3d(aCtx->MainSelector()->Projector())),
108myFilters(new SelectMgr_OrFilter()),
109myAutoHilight(Standard_True),
110mylastindex(0),
111mylastgood(0),
112myCurDetected(0)
113#ifdef IMP160701
114,myAISCurDetected(0)
115#endif
116{
64e2d3bd 117 // bind self to AIS_InteractiveContext::myLocalContexts. Further, the
118 // constructor executes logic that implies that the context is already
119 // created and mapped.
120 aCtx->myLocalContexts.Bind (Index, this);
121
7fd59977 122 myMainPM = aCtx->MainPrsMgr();
123 mySelName = AIS_Local_SelName(this, Index);
124 AIS_Selection::CreateSelection(mySelName.ToCString());
125
126 mySM->Add(myMainVS);
127 if(myLoadDisplayed) LoadContextObjects();
128 Process(Standard_False);
129
130}
131
132
133//=======================================================================
134//function : SetContext
135//purpose :
136//=======================================================================
137
138void AIS_LocalContext::SetContext(const Handle(AIS_InteractiveContext)& aCtx)
139{ myCTX = aCtx;}
140
141//=======================================================================
142//function : Display
143//purpose :
144//=======================================================================
145
146Standard_Boolean AIS_LocalContext::Display(const Handle(AIS_InteractiveObject)& anInteractive,
147 const Standard_Integer WhichMode,
148 const Standard_Boolean AllowShapeDecomposition,
149 const Standard_Integer ActivationMode)
150{
151 if(myActiveObjects.IsBound(anInteractive)){
152 const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anInteractive);
153
154 if(STAT->DisplayMode() == -1){
155 if(!myMainPM->IsDisplayed(anInteractive,WhichMode))
156 myMainPM->Display(anInteractive,WhichMode);
157 if(STAT->IsTemporary())
158 STAT->SetDisplayMode(WhichMode);
159 }
160 else if(STAT->DisplayMode()!=WhichMode && STAT->IsTemporary()){
161 myMainPM->Erase(anInteractive,STAT->DisplayMode());
162 STAT->SetDisplayMode(WhichMode);
163 if(!myMainPM->IsDisplayed(anInteractive,WhichMode))
164 myMainPM->Display(anInteractive,WhichMode);
165 }
166
167 if(ActivationMode!=-1){
168 if(!STAT->IsActivated(ActivationMode)){
169 STAT->ClearSelectionModes();
170 mySM->Load(anInteractive,myMainVS);
171 STAT->AddSelectionMode(ActivationMode);
172 mySM->Activate(anInteractive,ActivationMode,myMainVS);
173 }
174 }
175 }
176 else {
177 Handle(AIS_LocalStatus) Att = new AIS_LocalStatus();
178
179 if(anInteractive->AcceptShapeDecomposition() && AllowShapeDecomposition)
180 Att->SetDecomposition(Standard_True);
181 else
182 Att->SetDecomposition(Standard_False);
81bba717 183 // status temporary or not
7fd59977 184 if(myCTX->DisplayStatus(anInteractive) == AIS_DS_None ||
185 myCTX->DisplayStatus(anInteractive) == AIS_DS_Temporary)
186 Att->SetTemporary(Standard_True);
187 else
188 Att->SetTemporary(Standard_False);
189
190
191
192 if(!myCTX->IsDisplayed(anInteractive,WhichMode)){
193
194 //storing information....
195 Att->SetDisplayMode(WhichMode);
196 if (ActivationMode!=-1)
197 Att->AddSelectionMode(ActivationMode);
198 Standard_Integer HiMod = anInteractive->HasHilightMode()? anInteractive->HilightMode(): WhichMode;
199 Att->SetHilightMode(HiMod);
200
201 if(!myMainPM->IsDisplayed(anInteractive,WhichMode))
202 myMainPM->Display(anInteractive,WhichMode);
203
204 if(ActivationMode!=-1){
205 mySM->Load(anInteractive,myMainVS);
206 mySM->Activate(anInteractive,ActivationMode,myMainVS);
207 }
208 }
209 else{
210 Standard_Integer HiMod = anInteractive->HasHilightMode()? anInteractive->HilightMode(): WhichMode;
211 Att->SetHilightMode(HiMod);
212 }
213 myActiveObjects.Bind(anInteractive,Att);
214 }
215 Process(anInteractive);
216
217
218
219
220 return Standard_True;
221}
222
223//=======================================================================
224//function : Load
225//purpose :
226//=======================================================================
227
228Standard_Boolean AIS_LocalContext::
229Load(const Handle(AIS_InteractiveObject)& anInteractive,
230 const Standard_Boolean AllowShapeDecomposition,
231 const Standard_Integer ActivationMode)
232{
233 if(myActiveObjects.IsBound(anInteractive)) return Standard_False;
234 Handle(AIS_LocalStatus) Att = new AIS_LocalStatus();
235
236 if(anInteractive->AcceptShapeDecomposition() && AllowShapeDecomposition)
237 Att->SetDecomposition(Standard_True);
238 else
239 Att->SetDecomposition(Standard_False);
240
241 if(!myCTX->IsDisplayed(anInteractive))
242 Att->SetTemporary(Standard_True);
243 else
244 Att->SetTemporary(Standard_False);
245 Att->SetDisplayMode(-1);
246
247 //storing information....
248 if(ActivationMode!=-1)
249 Att->AddSelectionMode(ActivationMode);
250 Standard_Integer HiMod = anInteractive->HasHilightMode()? anInteractive->HilightMode():0;
251 Att->SetHilightMode(HiMod);
252 //Action
253
254 mySM->Load(anInteractive,myMainVS);
255 if(ActivationMode != -1){
256 mySM->Activate(anInteractive,ActivationMode,myMainVS);
257 }
258 myActiveObjects.Bind(anInteractive,Att);
259 Process(anInteractive);
260 return Standard_True;
261}
262
263//=======================================================================
264//function : ClearPrs
265//purpose :
266//=======================================================================
267
268Standard_Boolean AIS_LocalContext::
269ClearPrs(const Handle(AIS_InteractiveObject)& anInteractive,
270 const Standard_Integer aMode)
271{
272 if(!myActiveObjects.IsBound(anInteractive))
273 return Standard_False;
274
275 Standard_Boolean jobdone(Standard_False);
276 const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anInteractive);
277
278 //Display step
279 if(STAT->IsSubIntensityOn()) {
280 STAT->SubIntensityOff();
281 if(STAT->HilightMode()==aMode)
282 myMainPM->Unhighlight(anInteractive,STAT->HilightMode());
283 }
284 myMainPM->Clear(anInteractive,aMode); // correction connexions 23/09/97
285 jobdone = Standard_True;
286 if(STAT->DisplayMode()==aMode)
287 STAT->SetDisplayMode(-1);
288 return jobdone;
289}
290//=======================================================================
291//function : Erase
292//purpose :
293//=======================================================================
294
295Standard_Boolean AIS_LocalContext::
296Erase(const Handle(AIS_InteractiveObject)& anInteractive)
297{
298 if(!myActiveObjects.IsBound(anInteractive))
299 return Standard_False;
300 const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anInteractive);
301
302 //Display step
303 if(STAT->IsSubIntensityOn()) {
304 STAT->SubIntensityOff();
305 myMainPM->Unhighlight(anInteractive,STAT->HilightMode());
306 }
307
308 Standard_Boolean status(Standard_False);
309
310 if(STAT->DisplayMode()!=-1) {
311 if(IsSelected(anInteractive))
312 AddOrRemoveSelected(anInteractive);
313 if(myMainPM->IsHighlighted(anInteractive,STAT->HilightMode()))
314 myMainPM->Unhighlight(anInteractive,STAT->HilightMode());
eb4320f2 315 myMainPM->SetVisibility (anInteractive, STAT->DisplayMode(), Standard_False);
7fd59977 316 STAT->SetDisplayMode(-1);
317 status = Standard_True;
318 }
319 if(STAT->IsTemporary()){
320 if(myMainPM->IsDisplayed(anInteractive,STAT->HilightMode()))
eb4320f2 321 myMainPM->SetVisibility (anInteractive, STAT->HilightMode(), Standard_False);
7fd59977 322 }
323 //selection step
324
325 TColStd_ListIteratorOfListOfInteger It(STAT->SelectionModes());
326 for(;It.More();It.Next())
327 mySM->Deactivate(anInteractive,It.Value(),myMainVS);
328 // STAT->ClearSelectionModes();
329 return status;
330}
331
332
333//=======================================================================
334//function : SetShapeDecomposition
335//purpose :
336//=======================================================================
337
338void AIS_LocalContext::SetShapeDecomposition(const Handle(AIS_InteractiveObject)& aStoredObject,
339 const Standard_Boolean aStatus)
340{
341 if(!myActiveObjects.IsBound(aStoredObject)) return;
342
343 if(aStatus == myActiveObjects(aStoredObject)->Decomposed())
344 return;
345
346 myActiveObjects(aStoredObject)->SetDecomposition(aStatus);
347
348 Process(aStoredObject);
349}
350
351//=======================================================================
352//function : Clear
353//purpose :
354//=======================================================================
355
356void AIS_LocalContext::Clear(const AIS_ClearMode aType)
357{
358 switch (aType){
359 case AIS_CM_All:
360 {
361 ClearObjects();
362 myFilters->Clear();
363 while(!myListOfStandardMode.IsEmpty())
364 DeactivateStandardMode(AIS_Shape::SelectionType(myListOfStandardMode.Last()));
365 break;
366 }
367 case AIS_CM_Interactive:
368 ClearObjects();
369 break;
370 case AIS_CM_Filters:
371 myFilters->Clear();
372 break;
373 case AIS_CM_StandardModes:
374 {
375 while(!myListOfStandardMode.IsEmpty())
376 DeactivateStandardMode(AIS_Shape::SelectionType(myListOfStandardMode.Last()));
377 break;
378 }
379 case AIS_CM_TemporaryShapePrs:
380 ClearDetected();
381 }
382 UpdateSort();
383}
384//=======================================================================
385//function : ActivateMode
386//purpose :
387//=======================================================================
388
389void AIS_LocalContext::ActivateMode(const Handle(AIS_InteractiveObject)& aSelectable,
390 const Standard_Integer aMode)
391{
392 if(!myActiveObjects.IsBound(aSelectable)) return;
393// if(myActiveObjects(aSelectable)->SelectionMode()!=aMode)
394// mySM->Deactivate(aSelectable,aMode,myMainVS);
395 if(aMode != -1){
396 myActiveObjects(aSelectable)->AddSelectionMode(aMode);
397 mySM->Activate(aSelectable,aMode,myMainVS);
398 }
399 UpdateSort();
400}
401//=======================================================================
402//function : ActivateMode
403//purpose :
404//=======================================================================
405
406void AIS_LocalContext::DeactivateMode(const Handle(AIS_InteractiveObject)& aSelectable,
407 const Standard_Integer aMode)
408{
409 if(!myActiveObjects.IsBound(aSelectable)) return;
410
411 if(aMode==-1) return;
412
413 myActiveObjects(aSelectable)->RemoveSelectionMode(aMode);
414 mySM->Deactivate(aSelectable,aMode,myMainVS);
415 UpdateSort();
416
417}
418//=======================================================================
419//function : ActivateMode
420//purpose :
421//=======================================================================
422
423void AIS_LocalContext::Deactivate(const Handle(AIS_InteractiveObject)& aSelectable)
424{
425 if(!myActiveObjects.IsBound(aSelectable)) return;
426
427 mySM->Deactivate(aSelectable,myMainVS);
428 myActiveObjects(aSelectable)->ClearSelectionModes();
429 UpdateSort();
430}
431
432//=======================================================================
433//function : Remove
434//purpose :
435//=======================================================================
436
437Standard_Boolean AIS_LocalContext::Remove(const Handle(AIS_InteractiveObject)& aSelectable)
438{
439 if(!myActiveObjects.IsBound(aSelectable)) return Standard_False;
440
441 if(IsSelected(aSelectable))
442 AddOrRemoveSelected(aSelectable,Standard_False);
443
444 const Handle(AIS_LocalStatus)& Att = myActiveObjects(aSelectable);
445
446 TColStd_ListIteratorOfListOfInteger It;
81bba717 447 // it is checked which were the temporary attributes
448 // and they are set to 0
7fd59977 449
81bba717 450 // desactivate standard modes
7fd59977 451 if(Att->Decomposed()){
452 for(It.Initialize(myListOfStandardMode);It.More();It.Next()){
453 mySM->Deactivate(aSelectable,It.Value(),myMainVS);
454 }
455 }
456
81bba717 457 // if object or temporary presentations...
7fd59977 458 if(Att->IsTemporary())
459 {
460 if(Att->IsSubIntensityOn())
461 myMainPM->Unhighlight(aSelectable,Att->HilightMode());
462
81bba717 463 // remove if bug on clear correct...
7fd59977 464 myMainPM->Erase(aSelectable,Att->DisplayMode());
465 myMainPM->Clear(aSelectable,Att->DisplayMode());
466 if(myMainPM->IsDisplayed(aSelectable,Att->HilightMode()))
467 myMainPM->Erase(aSelectable,Att->HilightMode());
468 // myMainPM->Clear(aSelectable,Att->HilightMode());
7fd59977 469 }
81bba717 470 // if below intensity
7fd59977 471 else
472 {
473 if(Att->IsSubIntensityOn())
474 myCTX->SubIntensityOff(aSelectable);
475 }
81bba717 476 // desactivate stored proper modes
7fd59977 477 for(It.Initialize(Att->SelectionModes());It.More();It.Next()){
478 mySM->Deactivate(aSelectable,It.Value(),myMainVS);
479 }
ab943560 480// pop : si je laisses cela plantes dans les elements de construction
481// alors a toi de jouer ROB
7fd59977 482// RemoveSelected(aSelectable);
483
484 if(IsSelected(aSelectable))
485 AddOrRemoveSelected(aSelectable);
486 myActiveObjects.UnBind(aSelectable);
487
488 //Last detected object keeps for lastindex initialization.
489 Handle(SelectMgr_EntityOwner) aLastPicked = myMainVS->OnePicked();
490
491 UpdateSort();
492
493 //Object removes from SelectMgr
494 if( mySM->Contains(aSelectable) )
495 mySM->Remove(aSelectable);
496
497 //Object removes from Detected sequence
498 AIS_SequenceOfInteractive detectAIS;
499
500 Standard_Integer i = 1;
501 for(i = 1 ; i < myAISDetectedSeq.Length(); i++)
502 {
503 Handle(AIS_InteractiveObject) anObj = DetectedCurrentObject();
504 if( !anObj.IsNull() && anObj != aSelectable )
505 myAISDetectedSeq.Remove( i );
506 }
507
508 Standard_Integer aHM = aSelectable->HasHilightMode() ? aSelectable->HilightMode() : 0;
509
510 //EntityOwners remove from AIS_Selection
511 Handle(AIS_Selection) aSel = AIS_Selection::Selection(mySelName.ToCString());
512 AIS_NListTransient::Iterator anIter(aSel->Objects());
513 AIS_NListTransient removeEntites;
514 for(; anIter.More(); anIter.Next()){
515 const Handle(Standard_Transient)& Tr = anIter.Value();
516 if (!Tr.IsNull()){
517 const Handle(SelectMgr_EntityOwner)& anOwnr = *((const Handle(SelectMgr_EntityOwner)*) &Tr);
518 if(anOwnr->Selectable() == aSelectable){
519 removeEntites.Append(Tr);
520 if(IsSelected(anOwnr))
521 anOwnr->Unhilight(myMainPM, aHM);//Unhilight selected
522 }
523 }
524 }
525 AIS_NListTransient::Iterator anIterRemove(removeEntites);
526 for(; anIterRemove.More(); anIterRemove.Next())
527 aSel->Select(anIterRemove.Value());//EntityOwner removes from the selection data
528
529 //EntityOwners remove from myMapOfOwner
530 SelectMgr_IndexedMapOfOwner ownersToKeep;
531 const Handle(V3d_Viewer)& aViewer = myCTX->CurrentViewer();
532 for(i = 1; i <= myMapOfOwner.Extent(); i++){
533 const Handle(SelectMgr_EntityOwner)& anOwner = myMapOfOwner(i) ;
eafb234b 534 if(!anOwner.IsNull()) {
7fd59977 535 if(anOwner->Selectable() != aSelectable)
536 ownersToKeep.Add(anOwner);
537 else
538 {
539 if(anOwner->IsHilighted(myMainPM, aHM))
540 {
541 for(aViewer->InitActiveViews(); aViewer->MoreActiveViews(); aViewer->NextActiveViews())
542 Unhilight(anOwner, aViewer->ActiveView());
543 }
544 }
eafb234b 545 }
7fd59977 546 }
547 myMapOfOwner.Clear();
548 myMapOfOwner.Assign(ownersToKeep);
549 mylastindex = myMapOfOwner.FindIndex(aLastPicked);
550
551 return Standard_True;
552}
553
554//=======================================================================
555//function : ActivateStandardMode
556//purpose :
557//=======================================================================
558
559void AIS_LocalContext::ActivateStandardMode(const TopAbs_ShapeEnum aType)
560{
561
81bba717 562 //check if it is not in the list
7fd59977 563 TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
564 for(;It.More();It.Next())
565 if(It.Value()==aType) return;
566 Standard_Integer IMode = AIS_Shape::SelectionMode(aType);
567
568
81bba717 569 // create a hidden filter answering ok to the type except for :
570 // if the type is shape...
571 // if the filters already impact at the type <aType>
7fd59977 572 if(aType != TopAbs_SHAPE){
573 if(myStdFilters[IMode].IsNull())
574 myStdFilters[IMode] = new StdSelect_ShapeTypeFilter(aType);
575 if(!HasFilters(aType))
576 myFilters->Add(myStdFilters[IMode]);
577 }
578
81bba717 579 // the mode is activated for all objects of type Shape
580 // accepting the decomposition in standard mode.
7fd59977 581 myListOfStandardMode.Append(IMode);
582
583 AIS_DataMapIteratorOfDataMapOfSelStat ItM(myActiveObjects);
584
585 for(;ItM.More();ItM.Next()){
7fd59977 586 if(ItM.Value()->Decomposed())
7fd59977 587 myCTX->SelectionManager()->Activate(ItM.Key(),
588 IMode,
589 myMainVS);
590 }
591
592}
593
594//=======================================================================
595//function : DeActivateStandardMode
596//purpose :
597//=======================================================================
598
599void AIS_LocalContext::DeactivateStandardMode(const TopAbs_ShapeEnum aType)
600{
601 TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
602 Standard_Integer IMode = AIS_Shape::SelectionMode(aType);
603 for(;It.More();It.Next())
604 if(It.Value()==IMode) {
605 AIS_DataMapIteratorOfDataMapOfSelStat ItM(myActiveObjects);
606
607 for(;ItM.More();ItM.Next()){
608 if(ItM.Value()->Decomposed()){
609 myCTX->SelectionManager()->Deactivate(ItM.Key(),
610 IMode,
611 myMainVS);
612 ItM.Value()->RemoveSelectionMode(IMode);
613 }
614 }
615 myListOfStandardMode.Remove(It);
616 if(myFilters->IsIn(myStdFilters[IMode]))
617 myFilters->Remove(myStdFilters[IMode]);
618 UpdateSort();
619 return;
620 }
621 UpdateSort();
622}
623
624//=======================================================================
625//function : AddFilter
626//purpose :
627//=======================================================================
628
629void AIS_LocalContext::AddFilter(const Handle(SelectMgr_Filter)& aFilter)
630{
81bba717 631 // it is checked if the filter impacts at the type of active sub-shape
632 // for which a filter of type has been already implemented...
7fd59977 633
634 TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
635
636 for(;It.More();It.Next()){
637 if(aFilter->ActsOn(AIS_Shape::SelectionType(It.Value())))
638 if(myFilters->IsIn(myStdFilters[It.Value()]))
639 myFilters->Remove(myStdFilters[It.Value()]);
640 }
641 myFilters->Add(aFilter);
642}
643
644//=======================================================================
645//function : RemoveFilter
646//purpose :
647//=======================================================================
648
649void AIS_LocalContext::RemoveFilter(const Handle(SelectMgr_Filter)& aFilter)
650{
651 if(myFilters->IsIn(aFilter)) myFilters->Remove(aFilter);
652
81bba717 653 // it is checked if the filter for type standard is active.
654 // if yes, it is checked there are still similarities among the
655 // remaining filters...
656 // otherwise, the standard filter is restored to
657 // continu selecting active modes...
7fd59977 658 TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
659 TopAbs_ShapeEnum SE;
660 for(;It.More();It.Next()){
661 SE = AIS_Shape::SelectionType(It.Value());
662 if(aFilter->ActsOn(SE))
663 if(!HasFilters(SE))
664 myFilters->Add(myStdFilters[It.Value()]);
665 }
666}
667
668
669
ab943560 670Standard_Boolean AIS_LocalContext::HasSameProjector(const Handle(Select3D_Projector)& thePrj) const
7fd59977 671{
ab943560 672 const Handle(Select3D_Projector)& aCurPrj = myMainVS->Projector();
673 if (aCurPrj->Perspective() != thePrj->Perspective())
674 return Standard_False;
675 if (aCurPrj->Perspective() && aCurPrj->Focus() != thePrj->Focus())
676 return Standard_False;
677 const gp_GTrsf& aCurTrsf = aCurPrj->Transformation();
678 const gp_GTrsf& aPrjTrsf = thePrj->Transformation();
679
680 for (Standard_Integer i = 1; i <= 3; ++i)
681 {
682 for (Standard_Integer j = 1; j <= 3 ; ++j)
683 {
684 if (aCurTrsf.Value (i, j) != aPrjTrsf.Value (i, j))
685 return Standard_False;
7fd59977 686 }
687 }
ab943560 688
7fd59977 689 return Standard_True;
690}
691
692
693//=======================================================================
694//function : Terminate
679ecdee 695//purpose :
7fd59977 696//=======================================================================
697
679ecdee 698void AIS_LocalContext::Terminate (const Standard_Boolean theToUpdate)
7fd59977 699{
700 ClearDetected();
701 Clear();
702 myMapOfOwner.Clear();
703
704 mylastindex=0;
81bba717 705 // clear the selector...
7fd59977 706 myMainVS->Clear();
707 myCTX->SelectionManager()->Remove(myMainVS);
708
709
710 AIS_Selection::SetCurrentSelection(mySelName.ToCString());
711 Handle(AIS_Selection) S = AIS_Selection::CurrentSelection();
712 Handle(Standard_Transient) Tr;
713 for(S->Init();S->More();S->Next()){
714 Tr = S->Value();
715 (*((Handle(SelectMgr_EntityOwner)*)&Tr))->State(0);
716 }
717
718
719 AIS_Selection::Select();
720 AIS_Selection::Remove(mySelName.ToCString());
721
679ecdee 722 Handle(V3d_Viewer) aViewer = myCTX->CurrentViewer();
723 for (aViewer->InitActiveViews(); aViewer->MoreActiveViews(); aViewer->NextActiveViews())
724 {
725 Handle(V3d_View) aView = aViewer->ActiveView();
726 aView->View()->ClearImmediate();
7fd59977 727 }
728
679ecdee 729 Handle(V3d_View) aDummyView;
730 myMainVS->ClearAreas (aDummyView);
731 myMainVS->ClearSensitive (aDummyView);
7fd59977 732
679ecdee 733 if (theToUpdate)
734 {
735 myCTX->UpdateCurrentViewer();
736 }
7fd59977 737}
738
739
740//=======================================================================
741//function : SubIntensity
742//purpose :
743//=======================================================================
744
745void AIS_LocalContext::SubIntensityOn(const Handle(AIS_InteractiveObject)& anObject)
746{
747 if(!myActiveObjects.IsBound(anObject)) return;
748
749 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
750
751 if(Att->IsTemporary())
752 myMainPM->Color(anObject,myCTX->SubIntensityColor(),Att->DisplayMode());
753
754 Att->SubIntensityOn();
755}
756//=======================================================================
757//function : SubIntensity
758//purpose :
759//=======================================================================
760
761void AIS_LocalContext::SubIntensityOff(const Handle(AIS_InteractiveObject)& anObject)
762{
763 if(!myActiveObjects.IsBound(anObject)) return;
764
765 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
766
767 if(Att->IsTemporary())
768 myMainPM->Unhighlight(anObject);
769 Att->SubIntensityOff();
770}
771
772
773//=======================================================================
774//function : Hilight
775//purpose :
776//=======================================================================
777
778void AIS_LocalContext::Hilight(const Handle(AIS_InteractiveObject)& anObject)
779{
780 if(!myActiveObjects.IsBound(anObject)){
781 Standard_Integer HiMod = anObject->HasHilightMode()? anObject->HilightMode() : 0;
782 Handle(AIS_LocalStatus) Att = new AIS_LocalStatus(Standard_True,
783 Standard_False,
784 -1,-1,HiMod);
785 myActiveObjects.Bind(anObject,Att);
786
787 }
788 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
789 myMainPM->Color(anObject,myCTX->HilightColor(),Att->HilightMode());
790 Att->SubIntensityOn();
791}
792//=======================================================================
793//function : Hilight
794//purpose :
795//=======================================================================
796
797void AIS_LocalContext::Hilight(const Handle(AIS_InteractiveObject)& anObject,
798 const Quantity_NameOfColor Col)
799{
800 if(!myActiveObjects.IsBound(anObject)){
801 Standard_Integer HiMod = anObject->HasHilightMode()? anObject->HilightMode() : 0;
802 Handle(AIS_LocalStatus) Att = new AIS_LocalStatus(Standard_True,
803 Standard_False,
804 -1,-1,HiMod);
805 myActiveObjects.Bind(anObject,Att);
806
807 }
808 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
809 myMainPM->Color(anObject,Col,Att->HilightMode());
810 Att->SubIntensityOn();
811 Att->SetHilightColor(Col);
812}
813
814//=======================================================================
815//function : Unhilight
816//purpose :
817//=======================================================================
818
819void AIS_LocalContext::Unhilight(const Handle(AIS_InteractiveObject)& anObject)
820{
821 if(!myActiveObjects.IsBound(anObject)) return;
822
81bba717 823 // chieck if by hazard the object is somewhere else...
7fd59977 824 Standard_Integer Indx;
825 Standard_Boolean IsSomeWhereElse =
826 myCTX->IsInLocal(anObject,Indx) && Indx != myCTX->IndexOfCurrentLocal();
827
828 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
829 myMainPM->Unhighlight(anObject,Att->HilightMode());
830 if(Att->IsTemporary() && Att->DisplayMode()==-1)
831 if(!IsSomeWhereElse)
eb4320f2 832 myMainPM->SetVisibility (anObject, Att->HilightMode(), Standard_False);
833
7fd59977 834 Att->SubIntensityOff();
835 Att->SetHilightColor(Quantity_NOC_WHITE);
836}
837
838
839//=======================================================================
840//function : IsIn
841//purpose :
842//=======================================================================
843
844Standard_Boolean AIS_LocalContext::
845IsIn(const Handle(AIS_InteractiveObject)& anObject) const
846{
847 return myActiveObjects.IsBound(anObject);
848}
849
850//=======================================================================
851//function : IsHilighted
852//purpose :
853//=======================================================================
854
855Standard_Boolean AIS_LocalContext::IsHilighted(const Handle(AIS_InteractiveObject)& anObject) const
856{
857 if(!myActiveObjects.IsBound(anObject)) return Standard_False;
858 return myActiveObjects(anObject)->IsSubIntensityOn();
859}
860
861Standard_Boolean AIS_LocalContext::IsHilighted(const Handle(AIS_InteractiveObject)& anObject,
862 Standard_Boolean& WithColor,
863 Quantity_NameOfColor& HiCol) const
864{
865 if(!myActiveObjects.IsBound(anObject)) return Standard_False;
866 if( myActiveObjects(anObject)->IsSubIntensityOn()){
867 HiCol = myActiveObjects(anObject)->HilightColor();
868 if(HiCol==Quantity_NOC_WHITE)
869 WithColor = Standard_True;
870 else
871 WithColor = Standard_False;
872 return Standard_True;
873 }
874 return Standard_False;
875}
876
877
878void AIS_LocalContext::SetDisplayPriority(const Handle(AIS_InteractiveObject)& anObject,
879 const Standard_Integer Prior)
880{
881 if(!myActiveObjects.IsBound(anObject)) return;
882 const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anObject);
883 if(STAT->DisplayMode()==-1) return;
884 myMainPM->SetDisplayPriority(anObject,STAT->DisplayMode(),Prior);
885 if(STAT->IsSubIntensityOn())
886 myMainPM->SetDisplayPriority(anObject,STAT->HilightMode(),Prior);
887
888
889}
890
7fd59977 891//=======================================================================
892//function : DisplayedObjects
893//purpose :
894//=======================================================================
895Standard_Integer AIS_LocalContext::DisplayedObjects(TColStd_MapOfTransient& theMap) const
896{
897 Standard_Integer NbDisp(0);
898 for(AIS_DataMapIteratorOfDataMapOfSelStat it(myActiveObjects);it.More();it.Next()){
899 const Handle(SelectMgr_SelectableObject)& SO = it.Key();
900 if(!theMap.Contains(SO))
901 if(it.Value()->DisplayMode()!=-1){
902 theMap.Add(SO);
903 NbDisp++;
904 }
905 }
906 return NbDisp;
907}
908
909
910//=======================================================================
911//function : IsDisplayed
912//purpose :
913//=======================================================================
914
915Standard_Boolean AIS_LocalContext::IsDisplayed(const Handle(AIS_InteractiveObject)& anObject) const
916{
917 if(!myActiveObjects.IsBound(anObject)) return Standard_False;
918 return (myActiveObjects(anObject)->DisplayMode()!=-1);
919}
920
921//=======================================================================
922//function : IsDisplayed
923//purpose :
924//=======================================================================
925
926Standard_Boolean AIS_LocalContext::IsDisplayed(const Handle(AIS_InteractiveObject)& anObject,
927 const Standard_Integer aMode) const
928{
929 if(!myActiveObjects.IsBound(anObject)) return Standard_False;
930 return (myActiveObjects(anObject)->DisplayMode()==aMode);
931}
932
933//=======================================================================
934//function : SelectionModes
935//purpose :
936//=======================================================================
937
938const TColStd_ListOfInteger& AIS_LocalContext::
939SelectionModes(const Handle(AIS_InteractiveObject)& anObject) const
940{
941 return myActiveObjects(anObject)->SelectionModes();
942}
943
944//=======================================================================
945//function : Status
946//purpose :
947//=======================================================================
948
949TCollection_AsciiString AIS_LocalContext::Status() const
950{
951 TCollection_AsciiString t;
952 return t;
953}
954
955const Handle(AIS_LocalStatus)& AIS_LocalContext::Status(const Handle(AIS_InteractiveObject)& anObject) const
956{
957 return myActiveObjects(anObject);
958}
959
960//=======================================================================
961//function : LoadContextObjects
962//purpose :
963//=======================================================================
964
965void AIS_LocalContext::LoadContextObjects()
966{
967 AIS_ListIteratorOfListOfInteractive It;
968 if(myLoadDisplayed) {
969 AIS_ListOfInteractive LL;
970 myCTX->DisplayedObjects(LL,Standard_True);
971 Handle(AIS_LocalStatus) Att;
972 for (It.Initialize(LL);It.More();It.Next()){
973 Att= new AIS_LocalStatus();
974 Att->SetDecomposition((It.Value()->AcceptShapeDecomposition() && myAcceptStdMode));
975 Att->SetTemporary(Standard_False);
976 Att->SetHilightMode(It.Value()->HasHilightMode()? It.Value()->HilightMode(): 0);
977
978 myActiveObjects.Bind(It.Value(),Att);
979 }
980 }
981}
982
983void AIS_LocalContext::UnloadContextObjects()
984{
985 AIS_ListIteratorOfListOfInteractive It;
986 if(myLoadDisplayed)
987 {
988 AIS_ListOfInteractive LL;
989 myCTX->DisplayedObjects(LL,Standard_True);
990
991 for (It.Initialize(LL);It.More();It.Next())
992 {
993 myActiveObjects.UnBind(It.Value());
994 }
995 }
996}
997//=======================================================================
998//function : Process
999//purpose :
1000//=======================================================================
1001
1002void AIS_LocalContext::Process(const Handle(SelectMgr_SelectableObject)& anObject,
1003 const Standard_Boolean WithProj)
1004{
1005 if(!myActiveObjects.IsBound(anObject)) return;
1006 if(myActiveObjects(anObject)->Decomposed())
1007 ActivateStandardModes(anObject,WithProj);
1008 else
1009 {
1010 TColStd_ListIteratorOfListOfInteger It(myActiveObjects(anObject)->SelectionModes());
1011 for(;It.More();It.Next())
1012 myCTX->SelectionManager()->Activate(anObject,It.Value(),myMainVS,WithProj);
1013 }
1014}
1015
1016//=======================================================================
1017//function : Process
1018//purpose :
1019//=======================================================================
1020
1021void AIS_LocalContext::Process(const Standard_Boolean WithProj)
1022{
1023
1024 myMainVS->Clear();
1025
1026 AIS_DataMapIteratorOfDataMapOfSelStat It(myActiveObjects);
1027
1028 for(;It.More();It.Next()){
1029 myCTX->SelectionManager()->Load(It.Key(),myMainVS);
1030 if(It.Value()->Decomposed())
1031 ActivateStandardModes(It.Key(),WithProj);
1032 else if( myCTX->GetAutoActivateSelection() )
1033 {
1034 It.Value()->AddSelectionMode(0);
1035 myCTX->SelectionManager()->Activate(It.Key(),0,myMainVS,WithProj);
1036 }
1037 }
1038
1039}
1040
1041//=======================================================================
1042//function : ActivateModes
1043//purpose :
1044//=======================================================================
1045
1046void AIS_LocalContext::ActivateStandardModes(const Handle(SelectMgr_SelectableObject)& anObject,
1047 const Standard_Boolean WithProj)
1048{
1049 if(!myActiveObjects.IsBound(anObject)) return;
1050
1051 TColStd_ListIteratorOfListOfInteger itl (myListOfStandardMode);
1052
1053 const Handle(AIS_LocalStatus)& LS = myActiveObjects(anObject);
1054 if(LS->Decomposed()){
1055 for(;itl.More();itl.Next()){
1056 myCTX->SelectionManager()->Activate(anObject,itl.Value(),myMainVS,WithProj);
1057 LS->AddSelectionMode(itl.Value());
1058 }
1059 }
1060}
1061
1062
1063//=======================================================================
1064//function : ClearObjects
1065//purpose :
1066//=======================================================================
1067
1068void AIS_LocalContext::ClearObjects()
1069{
1070 AIS_DataMapIteratorOfDataMapOfSelStat It(myActiveObjects);
1071 for(;It.More();It.Next())
1072 {
1073 Handle(AIS_InteractiveObject) SO =
1074 Handle(AIS_InteractiveObject)::DownCast(It.Key());
1075
1076 const Handle(AIS_LocalStatus)& CurAtt = It.Value();
1077 //TColStd_ListIteratorOfListOfInteger ItL;
81bba717 1078 // if object is temporary the presentations managed by myMainPM are removed
7fd59977 1079 AIS_DisplayStatus TheDS = myCTX->DisplayStatus(SO);
1080
1081 if(TheDS != AIS_DS_Displayed){
1082 if(myMainPM->IsDisplayed(SO,CurAtt->DisplayMode())){
1083 if(CurAtt->IsSubIntensityOn()&&
1084 myMainPM->IsHighlighted(SO,CurAtt->HilightMode()))
1085 myMainPM->Unhighlight(SO,CurAtt->HilightMode());
1086 myMainPM->Erase(SO,CurAtt->DisplayMode());
1087 }
1088
1089 if(CurAtt->IsTemporary()){
1090 myMainPM->Erase(SO,CurAtt->DisplayMode());}
1091// myMainPM->Clear(SO,CurAtt->DisplayMode());}
1092 }
1093 else {
1094 if (CurAtt->IsSubIntensityOn()){
1095 myCTX->SubIntensityOff(Handle(AIS_InteractiveObject)::DownCast(SO));}
1096 Standard_Integer DiMo = SO->HasDisplayMode()?
1097 SO->DisplayMode():myCTX->DisplayMode();
1098 if(CurAtt->DisplayMode()!=-1 &&
1099 CurAtt->DisplayMode()!= DiMo)
1100 myMainPM->Erase(SO,CurAtt->DisplayMode());
1101 }
1102
1103 TColStd_ListIteratorOfListOfInteger ITL(CurAtt->SelectionModes());
1104 for(;ITL.More();ITL.Next())
1105 mySM->Deactivate(SO,ITL.Value(),myMainVS);
1106
1107 if(CurAtt->IsTemporary())
1108 mySM->Remove(SO,myMainVS);
1109
1110 }
1111 ClearSelected( Standard_False );
1112 myActiveObjects.Clear();
1113// myMainVS->ClearAreas();myMainVS->ClearSensitive();
1114}
1115
1116
1117Standard_Boolean AIS_LocalContext::IsDecompositionOn() const
1118{return !myListOfStandardMode.IsEmpty();}
1119
1120
1121
1122
1123//=======================================================================
1124//function : HasAlreadyFilters
1125//purpose :
1126//=======================================================================
1127
1128Standard_Boolean AIS_LocalContext::
1129HasFilters(const TopAbs_ShapeEnum aType) const
1130{
1131 return myFilters->ActsOn(aType);
1132}
1133
1134void AIS_LocalContext::ClearDetected()
1135{
eb4320f2 1136 for(Standard_Integer I=1;I<=myMapOfOwner.Extent();I++)
1137 {
1138 if(!myMapOfOwner(I).IsNull())
1139 {
7fd59977 1140 if(myMapOfOwner(I)->IsHilighted(myMainPM))
eb4320f2 1141 myMapOfOwner(I)->Unhilight(myMainPM);
1142 else
1143 {
1144 const Handle(SelectMgr_SelectableObject)& SO =
1145 myMapOfOwner.FindKey(I)->Selectable();
1146 if(myActiveObjects.IsBound(SO))
1147 {
1148 const Handle(AIS_LocalStatus)& Att = myActiveObjects(SO);
1149
1150 if(Att->IsTemporary() &&
1151 Att->DisplayMode()==-1 &&
1152 Att->SelectionModes().IsEmpty())
1153 {
1154 myMapOfOwner(I)->Clear(myMainPM);
1155 }
1156 }
7fd59977 1157 }
1158 }
1159 }
7fd59977 1160}
1161
1162void AIS_LocalContext::UpdateConversion()
1163{
1164 myMainVS->UpdateConversion();
1165}
1166
1167void AIS_LocalContext::UpdateSort()
1168{
1169 myMainVS->UpdateSort();
1170}
1171
7fd59977 1172//=======================================================================
679ecdee 1173//function : BeginImmediateDraw
1174//purpose :
7fd59977 1175//=======================================================================
679ecdee 1176Standard_Boolean AIS_LocalContext::BeginImmediateDraw()
7fd59977 1177{
679ecdee 1178 if (myMainPM->IsImmediateModeOn())
1179 {
1180 myMainPM->BeginImmediateDraw();
7fd59977 1181 return Standard_True;
1182 }
1183 return Standard_False;
1184}
1185
679ecdee 1186//=======================================================================
1187//function : ImmediateAdd
1188//purpose :
1189//=======================================================================
1190Standard_Boolean AIS_LocalContext::ImmediateAdd (const Handle(AIS_InteractiveObject)& theObj,
1191 const Standard_Integer theMode)
7fd59977 1192{
679ecdee 1193 if (!myMainPM->IsImmediateModeOn())
1194 {
7fd59977 1195 return Standard_False;
679ecdee 1196 }
1197
af324faa 1198 myMainPM->AddToImmediateList (myMainPM->Presentation (theObj, theMode)->Presentation());
7fd59977 1199 return Standard_True;
1200}
1201
679ecdee 1202//=======================================================================
1203//function : EndImmediateDraw
1204//purpose :
1205//=======================================================================
1206Standard_Boolean AIS_LocalContext::EndImmediateDraw (const Handle(V3d_View)& theView)
7fd59977 1207{
679ecdee 1208 if (!myMainPM->IsImmediateModeOn())
1209 {
1210 return Standard_False;
1211 }
1212
1213 myMainPM->EndImmediateDraw (theView);
7fd59977 1214 return Standard_True;
1215}
1216
679ecdee 1217// =======================================================================
1218// function : ClearImmediateDraw
1219// purpose :
1220// =======================================================================
1221void AIS_LocalContext::ClearImmediateDraw()
7fd59977 1222{
679ecdee 1223 myMainPM->ClearImmediateDraw();
7fd59977 1224}
1225
679ecdee 1226//=======================================================================
1227//function : IsImmediateModeOn
1228//purpose :
1229//=======================================================================
7fd59977 1230Standard_Boolean AIS_LocalContext::IsImmediateModeOn() const
679ecdee 1231{
1232 return myMainPM->IsImmediateModeOn();
1233}
7fd59977 1234
3c982548 1235void AIS_LocalContext::SetSensitivityMode(const StdSelect_SensitivityMode aMode) {
1236
1237 myMainVS->SetSensitivityMode(aMode);
1238}
1239
1240StdSelect_SensitivityMode AIS_LocalContext::SensitivityMode() const {
1241
1242 return myMainVS->SensitivityMode();
1243}
1244
7fd59977 1245void AIS_LocalContext::SetSensitivity(const Standard_Real aPrecision) {
1246
1247 myMainVS->SetSensitivity(aPrecision);
1248}
1249
3c982548 1250Standard_Real AIS_LocalContext::Sensitivity() const {
7fd59977 1251
3c982548 1252 return myMainVS->Sensitivity();
1253}
1254
1255void AIS_LocalContext::SetPixelTolerance(const Standard_Integer aPrecision) {
1256
1257 myMainVS->SetPixelTolerance(aPrecision);
1258}
1259
1260Standard_Integer AIS_LocalContext::PixelTolerance() const {
1261
1262 return myMainVS->PixelTolerance();
7fd59977 1263}
59f45b7c 1264
1265//=======================================================================
1266//function : SetZLayer
1267//purpose :
1268//=======================================================================
1269
1270void AIS_LocalContext::SetZLayer (const Handle(AIS_InteractiveObject)& theIObj,
1271 const Standard_Integer theLayerId)
1272{
1273 if (!myActiveObjects.IsBound (theIObj))
1274 return;
1275
1276 const Handle(AIS_LocalStatus)& aStatus = myActiveObjects (theIObj);
1277 if (aStatus->DisplayMode () == -1)
1278 return;
1279
1280 theIObj->SetZLayer (myMainPM, theLayerId);
1281}
1282
1283//=======================================================================
1284//function : GetZLayer
1285//purpose :
1286//=======================================================================
1287
1288Standard_Integer AIS_LocalContext::GetZLayer (const Handle(AIS_InteractiveObject)& theIObj) const
1289{
1290 if (!myActiveObjects.IsBound (theIObj))
1291 return -1;
1292
1293 return theIObj->GetZLayer (myMainPM);
1294}