1 // Created on: 1997-01-17
2 // Created by: Robert COUBLANC
3 // Copyright (c) 1997-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 //Modified by ROB : Traque des UpdateConversion intempestifs.
19 #include <AIS_DataMapIteratorOfDataMapOfSelStat.hxx>
20 #include <AIS_InteractiveContext.hxx>
21 #include <AIS_InteractiveObject.hxx>
22 #include <AIS_ListIteratorOfListOfInteractive.hxx>
23 #include <AIS_ListOfInteractive.hxx>
24 #include <AIS_LocalContext.hxx>
25 #include <AIS_LocalStatus.hxx>
26 #include <AIS_Selection.hxx>
27 #include <AIS_Shape.hxx>
28 #include <Aspect_TypeOfMarker.hxx>
29 #include <Graphic3d_Structure.hxx>
30 #include <Prs3d_LineAspect.hxx>
31 #include <Prs3d_PlaneAspect.hxx>
32 #include <Prs3d_PointAspect.hxx>
33 #include <Prs3d_Presentation.hxx>
34 #include <SelectMgr_CompositionFilter.hxx>
35 #include <SelectMgr_EntityOwner.hxx>
36 #include <SelectMgr_Filter.hxx>
37 #include <SelectMgr_OrFilter.hxx>
38 #include <SelectMgr_SelectableObject.hxx>
39 #include <SelectMgr_SelectionManager.hxx>
40 #include <Standard_Transient.hxx>
41 #include <Standard_Type.hxx>
42 #include <StdSelect_ShapeTypeFilter.hxx>
43 #include <StdSelect_ViewerSelector3d.hxx>
44 #include <TCollection_AsciiString.hxx>
45 #include <TColStd_ListIteratorOfListOfInteger.hxx>
46 #include <TopAbs_ShapeEnum.hxx>
47 #include <TopoDS_Shape.hxx>
48 #include <V3d_View.hxx>
49 #include <V3d_Viewer.hxx>
52 IMPLEMENT_STANDARD_RTTIEXT(AIS_LocalContext,MMgt_TShared)
54 static TCollection_AsciiString AIS_Local_SelName(const Standard_Address address,
55 const Standard_Integer anIndex)
57 // TCollection_AsciiString SelName;
59 sprintf(string,"%p_%d", address, anIndex); // works under any system
60 TCollection_AsciiString SelName(string);
65 //=======================================================================
66 //function : AIS_LocalContext
68 //=======================================================================
71 AIS_LocalContext::AIS_LocalContext(){}
73 AIS_LocalContext::AIS_LocalContext(const Handle(AIS_InteractiveContext)& aCtx,
74 const Standard_Integer Index,
75 const Standard_Boolean LoadDisplayed,
76 const Standard_Boolean AcceptStandardModes,
77 const Standard_Boolean AcceptEraseOfTemp,
78 const Standard_Boolean /*BothViewers*/):
80 myLoadDisplayed(LoadDisplayed),
81 myAcceptStdMode(AcceptStandardModes),
82 myAcceptErase(AcceptEraseOfTemp),
83 mySM(aCtx->SelectionManager()),
84 myMainVS(aCtx->MainSelector()),
85 myFilters(new SelectMgr_OrFilter()),
86 myAutoHilight(Standard_True),
87 myMapOfOwner (new SelectMgr_IndexedMapOfOwner()),
94 // bind self to AIS_InteractiveContext::myLocalContexts. Further, the
95 // constructor executes logic that implies that the context is already
96 // created and mapped.
97 aCtx->myLocalContexts.Bind (Index, this);
99 myMainVS->ResetSelectionActivationStatus();
100 myMainPM = aCtx->MainPrsMgr();
101 mySelName = AIS_Local_SelName(this, Index);
102 AIS_Selection::CreateSelection(mySelName.ToCString());
105 if(myLoadDisplayed) LoadContextObjects();
111 //=======================================================================
112 //function : SetContext
114 //=======================================================================
116 void AIS_LocalContext::SetContext(const Handle(AIS_InteractiveContext)& aCtx)
119 //=======================================================================
122 //=======================================================================
124 Standard_Boolean AIS_LocalContext::Display(const Handle(AIS_InteractiveObject)& anInteractive,
125 const Standard_Integer WhichMode,
126 const Standard_Boolean AllowShapeDecomposition,
127 const Standard_Integer ActivationMode)
129 if(myActiveObjects.IsBound(anInteractive)){
130 const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anInteractive);
132 if(STAT->DisplayMode() == -1){
133 if(!myMainPM->IsDisplayed(anInteractive,WhichMode))
134 myMainPM->Display(anInteractive,WhichMode);
135 if(STAT->IsTemporary())
136 STAT->SetDisplayMode(WhichMode);
138 else if(STAT->DisplayMode()!=WhichMode && STAT->IsTemporary()){
139 myMainPM->Erase(anInteractive,STAT->DisplayMode());
140 STAT->SetDisplayMode(WhichMode);
141 if(!myMainPM->IsDisplayed(anInteractive,WhichMode))
142 myMainPM->Display(anInteractive,WhichMode);
145 if(ActivationMode!=-1){
146 if(!STAT->IsActivated(ActivationMode)){
147 STAT->ClearSelectionModes();
148 mySM->Load(anInteractive,myMainVS);
149 STAT->AddSelectionMode(ActivationMode);
150 mySM->Activate(anInteractive,ActivationMode,myMainVS);
155 Handle(AIS_LocalStatus) Att = new AIS_LocalStatus();
157 if(anInteractive->AcceptShapeDecomposition() && AllowShapeDecomposition)
158 Att->SetDecomposition(Standard_True);
160 Att->SetDecomposition(Standard_False);
161 // status temporary or not
162 if(myCTX->DisplayStatus(anInteractive) == AIS_DS_None ||
163 myCTX->DisplayStatus(anInteractive) == AIS_DS_Temporary)
164 Att->SetTemporary(Standard_True);
166 Att->SetTemporary(Standard_False);
170 if(!myCTX->IsDisplayed(anInteractive,WhichMode)){
172 //storing information....
173 Att->SetDisplayMode(WhichMode);
174 if (ActivationMode!=-1)
175 Att->AddSelectionMode(ActivationMode);
176 Standard_Integer HiMod = anInteractive->HasHilightMode()? anInteractive->HilightMode(): WhichMode;
177 Att->SetHilightMode(HiMod);
179 if(!myMainPM->IsDisplayed(anInteractive,WhichMode))
180 myMainPM->Display(anInteractive,WhichMode);
182 if(ActivationMode!=-1){
183 mySM->Load(anInteractive,myMainVS);
184 mySM->Activate(anInteractive,ActivationMode,myMainVS);
188 Standard_Integer HiMod = anInteractive->HasHilightMode()? anInteractive->HilightMode(): WhichMode;
189 Att->SetHilightMode(HiMod);
191 myActiveObjects.Bind(anInteractive,Att);
193 Process(anInteractive);
198 return Standard_True;
201 //=======================================================================
204 //=======================================================================
206 Standard_Boolean AIS_LocalContext::
207 Load(const Handle(AIS_InteractiveObject)& anInteractive,
208 const Standard_Boolean AllowShapeDecomposition,
209 const Standard_Integer ActivationMode)
211 if (myActiveObjects.IsBound (anInteractive))
213 if (anInteractive->HasSelection (ActivationMode))
215 const Handle(SelectMgr_Selection)& aSel = anInteractive->Selection (ActivationMode);
216 if (aSel->GetSelectionState() != SelectMgr_SOS_Activated)
218 if (!myMainVS->Contains (anInteractive))
220 mySM->Load (anInteractive, myMainVS);
222 mySM->Activate (anInteractive, ActivationMode, myMainVS);
223 return Standard_True;
226 return Standard_False;
229 Handle(AIS_LocalStatus) Att = new AIS_LocalStatus();
231 if(anInteractive->AcceptShapeDecomposition() && AllowShapeDecomposition)
232 Att->SetDecomposition(Standard_True);
234 Att->SetDecomposition(Standard_False);
236 if(!myCTX->IsDisplayed(anInteractive))
237 Att->SetTemporary(Standard_True);
239 Att->SetTemporary(Standard_False);
240 Att->SetDisplayMode(-1);
242 //storing information....
243 if(ActivationMode!=-1)
244 Att->AddSelectionMode(ActivationMode);
245 Standard_Integer HiMod = anInteractive->HasHilightMode()? anInteractive->HilightMode():0;
246 Att->SetHilightMode(HiMod);
249 mySM->Load(anInteractive,myMainVS);
250 if(ActivationMode != -1){
251 mySM->Activate(anInteractive,ActivationMode,myMainVS);
253 myActiveObjects.Bind(anInteractive,Att);
254 Process(anInteractive);
255 return Standard_True;
258 //=======================================================================
259 //function : ClearPrs
261 //=======================================================================
263 Standard_Boolean AIS_LocalContext::
264 ClearPrs(const Handle(AIS_InteractiveObject)& anInteractive,
265 const Standard_Integer aMode)
267 if(!myActiveObjects.IsBound(anInteractive))
268 return Standard_False;
270 Standard_Boolean jobdone(Standard_False);
271 const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anInteractive);
274 if(STAT->IsSubIntensityOn()) {
275 STAT->SubIntensityOff();
276 if(STAT->HilightMode()==aMode)
277 myMainPM->Unhighlight(anInteractive,STAT->HilightMode());
279 myMainPM->Clear(anInteractive,aMode); // correction connexions 23/09/97
280 jobdone = Standard_True;
281 if(STAT->DisplayMode()==aMode)
282 STAT->SetDisplayMode(-1);
285 //=======================================================================
288 //=======================================================================
290 Standard_Boolean AIS_LocalContext::
291 Erase(const Handle(AIS_InteractiveObject)& anInteractive)
293 if(!myActiveObjects.IsBound(anInteractive))
294 return Standard_False;
295 const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anInteractive);
298 if(STAT->IsSubIntensityOn()) {
299 STAT->SubIntensityOff();
300 myMainPM->Unhighlight(anInteractive,STAT->HilightMode());
303 Standard_Boolean status(Standard_False);
305 if(STAT->DisplayMode()!=-1) {
306 if(IsSelected(anInteractive))
307 AddOrRemoveSelected(anInteractive);
308 if(myMainPM->IsHighlighted(anInteractive,STAT->HilightMode()))
309 myMainPM->Unhighlight(anInteractive,STAT->HilightMode());
310 myMainPM->SetVisibility (anInteractive, STAT->DisplayMode(), Standard_False);
311 STAT->SetDisplayMode(-1);
312 status = Standard_True;
314 if(STAT->IsTemporary()){
315 if(myMainPM->IsDisplayed(anInteractive,STAT->HilightMode()))
316 myMainPM->SetVisibility (anInteractive, STAT->HilightMode(), Standard_False);
319 // Deactivate selectable entities of interactive object
320 const Handle(SelectMgr_SelectableObject)& anObj = anInteractive; // to avoid ambiguity
321 if (mySM->Contains (anObj))
323 while (!STAT->SelectionModes().IsEmpty())
325 mySM->Deactivate (anInteractive, STAT->SelectionModes().Last(), myMainVS);
326 STAT->RemoveSelectionMode (STAT->SelectionModes().Last());
330 ClearOutdatedSelection (anInteractive, Standard_True);
336 //=======================================================================
337 //function : SetShapeDecomposition
339 //=======================================================================
341 void AIS_LocalContext::SetShapeDecomposition(const Handle(AIS_InteractiveObject)& aStoredObject,
342 const Standard_Boolean aStatus)
344 if(!myActiveObjects.IsBound(aStoredObject)) return;
346 if(aStatus == myActiveObjects(aStoredObject)->Decomposed())
349 myActiveObjects(aStoredObject)->SetDecomposition(aStatus);
351 Process(aStoredObject);
354 //=======================================================================
357 //=======================================================================
359 void AIS_LocalContext::Clear(const AIS_ClearMode aType)
366 while(!myListOfStandardMode.IsEmpty())
367 DeactivateStandardMode(AIS_Shape::SelectionType(myListOfStandardMode.Last()));
370 case AIS_CM_Interactive:
376 case AIS_CM_StandardModes:
378 while(!myListOfStandardMode.IsEmpty())
379 DeactivateStandardMode(AIS_Shape::SelectionType(myListOfStandardMode.Last()));
382 case AIS_CM_TemporaryShapePrs:
386 //=======================================================================
387 //function : ActivateMode
389 //=======================================================================
391 void AIS_LocalContext::ActivateMode(const Handle(AIS_InteractiveObject)& aSelectable,
392 const Standard_Integer aMode)
394 if(!myActiveObjects.IsBound(aSelectable)) return;
395 // if(myActiveObjects(aSelectable)->SelectionMode()!=aMode)
396 // mySM->Deactivate(aSelectable,aMode,myMainVS);
398 myActiveObjects(aSelectable)->AddSelectionMode(aMode);
399 mySM->Activate(aSelectable,aMode,myMainVS);
402 //=======================================================================
403 //function : ActivateMode
405 //=======================================================================
407 void AIS_LocalContext::DeactivateMode(const Handle(AIS_InteractiveObject)& aSelectable,
408 const Standard_Integer aMode)
410 if(!myActiveObjects.IsBound(aSelectable)) return;
412 if(aMode==-1) return;
414 myActiveObjects(aSelectable)->RemoveSelectionMode(aMode);
415 mySM->Deactivate(aSelectable,aMode,myMainVS);
417 //=======================================================================
418 //function : ActivateMode
420 //=======================================================================
422 void AIS_LocalContext::Deactivate(const Handle(AIS_InteractiveObject)& aSelectable)
424 if(!myActiveObjects.IsBound(aSelectable)) return;
426 mySM->Deactivate(aSelectable, -1, myMainVS);
427 myActiveObjects(aSelectable)->ClearSelectionModes();
430 //=======================================================================
433 //=======================================================================
435 Standard_Boolean AIS_LocalContext::Remove(const Handle(AIS_InteractiveObject)& aSelectable)
437 if(!myActiveObjects.IsBound (aSelectable))
439 return Standard_False;
442 if (IsSelected (aSelectable))
444 AddOrRemoveSelected (aSelectable, Standard_False);
447 const Handle(AIS_LocalStatus)& Att = myActiveObjects (aSelectable);
449 TColStd_ListIteratorOfListOfInteger It;
451 // Deactivate standard modes
452 if (Att->Decomposed())
454 for (It.Initialize (myListOfStandardMode); It.More(); It.Next())
456 mySM->Deactivate (aSelectable, It.Value(), myMainVS);
460 // If object or temporary presentations
461 if (Att->IsTemporary())
463 if (Att->IsSubIntensityOn())
465 myMainPM->Unhighlight (aSelectable, Att->HilightMode());
468 myMainPM->Erase (aSelectable, Att->DisplayMode());
469 myMainPM->Clear (aSelectable, Att->DisplayMode());
470 if (myMainPM->IsDisplayed (aSelectable, Att->HilightMode()))
472 myMainPM->Erase (aSelectable, Att->HilightMode());
475 // If subintensity used
476 else if (Att->IsSubIntensityOn())
478 myCTX->SubIntensityOff (aSelectable);
481 // Deactivate stored selection modes
482 for (It.Initialize (Att->SelectionModes()); It.More(); It.Next())
484 mySM->Deactivate (aSelectable, It.Value(), myMainVS);
487 // Remove the interactive object from selection manager
488 const Handle(SelectMgr_SelectableObject)& anObj = aSelectable; // to avoid ambiguity
489 if (mySM->Contains (anObj))
491 mySM->Remove (anObj);
493 ClearOutdatedSelection (aSelectable, Standard_True);
495 // This should be done at the very end because most methods use
496 // myActiveObjects even during clean-up
497 myActiveObjects.UnBind (aSelectable);
498 return Standard_True;
501 //=======================================================================
502 //function : ActivateStandardMode
504 //=======================================================================
506 void AIS_LocalContext::ActivateStandardMode(const TopAbs_ShapeEnum aType)
509 //check if it is not in the list
510 TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
511 for(;It.More();It.Next())
512 if(It.Value()==aType) return;
513 Standard_Integer IMode = AIS_Shape::SelectionMode(aType);
516 // create a hidden filter answering ok to the type except for :
517 // if the type is shape...
518 // if the filters already impact at the type <aType>
519 if(aType != TopAbs_SHAPE){
520 if(myStdFilters[IMode].IsNull())
521 myStdFilters[IMode] = new StdSelect_ShapeTypeFilter(aType);
522 if(!HasFilters(aType))
523 myFilters->Add(myStdFilters[IMode]);
526 // the mode is activated for all objects of type Shape
527 // accepting the decomposition in standard mode.
528 myListOfStandardMode.Append(IMode);
530 AIS_DataMapIteratorOfDataMapOfSelStat ItM(myActiveObjects);
532 for(;ItM.More();ItM.Next()){
533 if(ItM.Value()->Decomposed())
534 myCTX->SelectionManager()->Activate(ItM.Key(),
537 ItM.Value()->AddSelectionMode (IMode);
542 //=======================================================================
543 //function : DeActivateStandardMode
545 //=======================================================================
547 void AIS_LocalContext::DeactivateStandardMode(const TopAbs_ShapeEnum aType)
549 TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
550 Standard_Integer IMode = AIS_Shape::SelectionMode(aType);
551 for(;It.More();It.Next())
552 if(It.Value()==IMode) {
553 AIS_DataMapIteratorOfDataMapOfSelStat ItM(myActiveObjects);
555 for(;ItM.More();ItM.Next()){
556 if(ItM.Value()->Decomposed()){
557 myCTX->SelectionManager()->Deactivate(ItM.Key(),
560 ItM.Value()->RemoveSelectionMode(IMode);
563 myListOfStandardMode.Remove(It);
564 if(myFilters->IsIn(myStdFilters[IMode]))
565 myFilters->Remove(myStdFilters[IMode]);
570 //=======================================================================
571 //function : AddFilter
573 //=======================================================================
575 void AIS_LocalContext::AddFilter(const Handle(SelectMgr_Filter)& aFilter)
577 // it is checked if the filter impacts at the type of active sub-shape
578 // for which a filter of type has been already implemented...
580 TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
582 for(;It.More();It.Next()){
583 if(aFilter->ActsOn(AIS_Shape::SelectionType(It.Value())))
584 if(myFilters->IsIn(myStdFilters[It.Value()]))
585 myFilters->Remove(myStdFilters[It.Value()]);
587 myFilters->Add(aFilter);
590 //=======================================================================
591 //function : RemoveFilter
593 //=======================================================================
595 void AIS_LocalContext::RemoveFilter(const Handle(SelectMgr_Filter)& aFilter)
597 if(myFilters->IsIn(aFilter)) myFilters->Remove(aFilter);
599 // it is checked if the filter for type standard is active.
600 // if yes, it is checked there are still similarities among the
601 // remaining filters...
602 // otherwise, the standard filter is restored to
603 // continu selecting active modes...
604 TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
606 for(;It.More();It.Next()){
607 SE = AIS_Shape::SelectionType(It.Value());
608 if(aFilter->ActsOn(SE))
610 myFilters->Add(myStdFilters[It.Value()]);
614 //=======================================================================
615 //function : Terminate
617 //=======================================================================
619 void AIS_LocalContext::Terminate (const Standard_Boolean theToUpdate)
623 myMapOfOwner->Clear();
626 // clear the selector...
630 AIS_Selection::SetCurrentSelection(mySelName.ToCString());
631 Handle(AIS_Selection) S = AIS_Selection::CurrentSelection();
632 Handle(Standard_Transient) Tr;
633 for(S->Init();S->More();S->Next()){
635 Handle(SelectMgr_EntityOwner)::DownCast (Tr)->SetSelected (Standard_False);
639 AIS_Selection::Select();
640 AIS_Selection::Remove(mySelName.ToCString());
642 Handle(V3d_View) aDummyView;
643 myMainVS->ClearSensitive (aDummyView);
647 myCTX->UpdateCurrentViewer();
652 //=======================================================================
653 //function : SubIntensity
655 //=======================================================================
657 void AIS_LocalContext::SubIntensityOn(const Handle(AIS_InteractiveObject)& anObject)
659 if(!myActiveObjects.IsBound(anObject)) return;
661 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
663 if(Att->IsTemporary())
664 myMainPM->Color(anObject,myCTX->SubIntensityColor(),Att->DisplayMode());
666 Att->SubIntensityOn();
668 //=======================================================================
669 //function : SubIntensity
671 //=======================================================================
673 void AIS_LocalContext::SubIntensityOff(const Handle(AIS_InteractiveObject)& anObject)
675 if(!myActiveObjects.IsBound(anObject)) return;
677 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
679 if(Att->IsTemporary())
680 myMainPM->Unhighlight(anObject);
681 Att->SubIntensityOff();
685 //=======================================================================
688 //=======================================================================
690 void AIS_LocalContext::Hilight(const Handle(AIS_InteractiveObject)& anObject)
692 if(!myActiveObjects.IsBound(anObject)){
693 Standard_Integer HiMod = anObject->HasHilightMode()? anObject->HilightMode() : 0;
694 Handle(AIS_LocalStatus) Att = new AIS_LocalStatus(Standard_True,
697 myActiveObjects.Bind(anObject,Att);
700 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
701 myMainPM->Color(anObject,myCTX->HilightColor(),Att->HilightMode());
702 Att->SubIntensityOn();
704 //=======================================================================
707 //=======================================================================
709 void AIS_LocalContext::Hilight(const Handle(AIS_InteractiveObject)& anObject,
710 const Quantity_NameOfColor Col)
712 if(!myActiveObjects.IsBound(anObject)){
713 Standard_Integer HiMod = anObject->HasHilightMode()? anObject->HilightMode() : 0;
714 Handle(AIS_LocalStatus) Att = new AIS_LocalStatus(Standard_True,
717 myActiveObjects.Bind(anObject,Att);
720 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
721 myMainPM->Color(anObject,Col,Att->HilightMode());
722 Att->SubIntensityOn();
723 Att->SetHilightColor(Col);
726 //=======================================================================
727 //function : Unhilight
729 //=======================================================================
731 void AIS_LocalContext::Unhilight(const Handle(AIS_InteractiveObject)& anObject)
733 if(!myActiveObjects.IsBound(anObject)) return;
735 // chieck if by hazard the object is somewhere else...
736 Standard_Integer Indx;
737 Standard_Boolean IsSomeWhereElse =
738 myCTX->IsInLocal(anObject,Indx) && Indx != myCTX->IndexOfCurrentLocal();
740 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
741 myMainPM->Unhighlight(anObject,Att->HilightMode());
742 if(Att->IsTemporary() && Att->DisplayMode()==-1)
744 myMainPM->SetVisibility (anObject, Att->HilightMode(), Standard_False);
746 Att->SubIntensityOff();
747 Att->SetHilightColor(Quantity_NOC_WHITE);
751 //=======================================================================
754 //=======================================================================
756 Standard_Boolean AIS_LocalContext::
757 IsIn(const Handle(AIS_InteractiveObject)& anObject) const
759 return myActiveObjects.IsBound(anObject);
762 //=======================================================================
763 //function : IsHilighted
765 //=======================================================================
767 Standard_Boolean AIS_LocalContext::IsHilighted(const Handle(AIS_InteractiveObject)& anObject) const
769 if(!myActiveObjects.IsBound(anObject)) return Standard_False;
770 return myActiveObjects(anObject)->IsSubIntensityOn();
773 Standard_Boolean AIS_LocalContext::IsHilighted(const Handle(AIS_InteractiveObject)& anObject,
774 Standard_Boolean& WithColor,
775 Quantity_NameOfColor& HiCol) const
777 if(!myActiveObjects.IsBound(anObject)) return Standard_False;
778 if( myActiveObjects(anObject)->IsSubIntensityOn()){
779 HiCol = myActiveObjects(anObject)->HilightColor();
780 if(HiCol==Quantity_NOC_WHITE)
781 WithColor = Standard_True;
783 WithColor = Standard_False;
784 return Standard_True;
786 return Standard_False;
790 void AIS_LocalContext::SetDisplayPriority(const Handle(AIS_InteractiveObject)& anObject,
791 const Standard_Integer Prior)
793 if(!myActiveObjects.IsBound(anObject)) return;
794 const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anObject);
795 if(STAT->DisplayMode()==-1) return;
796 myMainPM->SetDisplayPriority(anObject,STAT->DisplayMode(),Prior);
797 if(STAT->IsSubIntensityOn())
798 myMainPM->SetDisplayPriority(anObject,STAT->HilightMode(),Prior);
803 //=======================================================================
804 //function : DisplayedObjects
806 //=======================================================================
807 Standard_Integer AIS_LocalContext::DisplayedObjects(TColStd_MapOfTransient& theMap) const
809 Standard_Integer NbDisp(0);
810 for(AIS_DataMapIteratorOfDataMapOfSelStat it(myActiveObjects);it.More();it.Next()){
811 const Handle(SelectMgr_SelectableObject)& SO = it.Key();
812 if(!theMap.Contains(SO))
813 if(it.Value()->DisplayMode()!=-1){
822 //=======================================================================
823 //function : IsDisplayed
825 //=======================================================================
827 Standard_Boolean AIS_LocalContext::IsDisplayed(const Handle(AIS_InteractiveObject)& anObject) const
829 if(!myActiveObjects.IsBound(anObject)) return Standard_False;
830 return (myActiveObjects(anObject)->DisplayMode()!=-1);
833 //=======================================================================
834 //function : IsDisplayed
836 //=======================================================================
838 Standard_Boolean AIS_LocalContext::IsDisplayed(const Handle(AIS_InteractiveObject)& anObject,
839 const Standard_Integer aMode) const
841 if(!myActiveObjects.IsBound(anObject)) return Standard_False;
842 return (myActiveObjects(anObject)->DisplayMode()==aMode);
845 //=======================================================================
846 //function : SelectionModes
848 //=======================================================================
850 const TColStd_ListOfInteger& AIS_LocalContext::
851 SelectionModes(const Handle(AIS_InteractiveObject)& anObject) const
853 return myActiveObjects(anObject)->SelectionModes();
856 //=======================================================================
859 //=======================================================================
861 TCollection_AsciiString AIS_LocalContext::Status() const
863 TCollection_AsciiString t;
867 const Handle(AIS_LocalStatus)& AIS_LocalContext::Status(const Handle(AIS_InteractiveObject)& anObject) const
869 return myActiveObjects(anObject);
872 //=======================================================================
873 //function : LoadContextObjects
875 //=======================================================================
877 void AIS_LocalContext::LoadContextObjects()
879 AIS_ListIteratorOfListOfInteractive It;
880 if(myLoadDisplayed) {
881 AIS_ListOfInteractive LL;
882 myCTX->DisplayedObjects(LL,Standard_True);
883 Handle(AIS_LocalStatus) Att;
884 for (It.Initialize(LL);It.More();It.Next()){
885 const Handle(AIS_InteractiveObject)& anObj = It.Value();
886 Att= new AIS_LocalStatus();
887 Att->SetDecomposition((anObj->AcceptShapeDecomposition() && myAcceptStdMode));
888 Att->SetTemporary(Standard_False);
889 Att->SetHilightMode(anObj->HasHilightMode()? anObj->HilightMode(): 0);
890 for (anObj->Init(); anObj->More(); anObj->Next())
892 const Handle(SelectMgr_Selection)& aSel = anObj->CurrentSelection();
893 aSel->SetSelectionState (SelectMgr_SOS_Deactivated);
895 myActiveObjects.Bind(anObj,Att);
900 void AIS_LocalContext::UnloadContextObjects()
902 AIS_ListIteratorOfListOfInteractive It;
905 AIS_ListOfInteractive LL;
906 myCTX->DisplayedObjects(LL,Standard_True);
908 for (It.Initialize(LL);It.More();It.Next())
910 myActiveObjects.UnBind(It.Value());
914 //=======================================================================
917 //=======================================================================
919 void AIS_LocalContext::Process(const Handle(SelectMgr_SelectableObject)& anObject)
921 if(!myActiveObjects.IsBound(anObject)) return;
922 if(myActiveObjects(anObject)->Decomposed())
923 ActivateStandardModes(anObject);
926 TColStd_ListIteratorOfListOfInteger It(myActiveObjects(anObject)->SelectionModes());
927 for(;It.More();It.Next())
928 myCTX->SelectionManager()->Activate(anObject,It.Value(),myMainVS);
932 //=======================================================================
935 //=======================================================================
937 void AIS_LocalContext::Process()
942 AIS_DataMapIteratorOfDataMapOfSelStat It(myActiveObjects);
944 for(;It.More();It.Next()){
945 myCTX->SelectionManager()->Load(It.Key(),myMainVS);
946 if(It.Value()->Decomposed())
947 ActivateStandardModes(It.Key());
948 else if( myCTX->GetAutoActivateSelection() )
950 It.Value()->AddSelectionMode(0);
951 myCTX->SelectionManager()->Activate(It.Key(),0,myMainVS);
957 //=======================================================================
958 //function : ActivateModes
960 //=======================================================================
962 void AIS_LocalContext::ActivateStandardModes(const Handle(SelectMgr_SelectableObject)& anObject)
964 if(!myActiveObjects.IsBound(anObject)) return;
966 TColStd_ListIteratorOfListOfInteger itl (myListOfStandardMode);
968 const Handle(AIS_LocalStatus)& LS = myActiveObjects(anObject);
969 if(LS->Decomposed()){
970 for(;itl.More();itl.Next()){
971 myCTX->SelectionManager()->Activate(anObject,itl.Value(),myMainVS);
972 LS->AddSelectionMode(itl.Value());
978 //=======================================================================
979 //function : ClearObjects
981 //=======================================================================
983 void AIS_LocalContext::ClearObjects()
985 AIS_DataMapIteratorOfDataMapOfSelStat It(myActiveObjects);
986 for(;It.More();It.Next())
988 Handle(AIS_InteractiveObject) SO =
989 Handle(AIS_InteractiveObject)::DownCast(It.Key());
991 const Handle(AIS_LocalStatus)& CurAtt = It.Value();
992 //TColStd_ListIteratorOfListOfInteger ItL;
993 // if object is temporary the presentations managed by myMainPM are removed
994 AIS_DisplayStatus TheDS = myCTX->DisplayStatus(SO);
996 if(TheDS != AIS_DS_Displayed){
997 if(myMainPM->IsDisplayed(SO,CurAtt->DisplayMode())){
998 if(CurAtt->IsSubIntensityOn()&&
999 myMainPM->IsHighlighted(SO,CurAtt->HilightMode()))
1000 myMainPM->Unhighlight(SO,CurAtt->HilightMode());
1001 myMainPM->Erase(SO,CurAtt->DisplayMode());
1004 if(CurAtt->IsTemporary()){
1005 myMainPM->Erase(SO,CurAtt->DisplayMode());}
1006 // myMainPM->Clear(SO,CurAtt->DisplayMode());}
1009 if (CurAtt->IsSubIntensityOn())
1011 myCTX->SubIntensityOff(SO);
1013 Standard_Integer DiMo = SO->HasDisplayMode()?
1014 SO->DisplayMode():myCTX->DisplayMode();
1015 if(CurAtt->DisplayMode()!=-1 &&
1016 CurAtt->DisplayMode()!= DiMo)
1017 myMainPM->Erase(SO,CurAtt->DisplayMode());
1020 TColStd_ListIteratorOfListOfInteger aSelModeIter (CurAtt->SelectionModes());
1021 for ( ; aSelModeIter.More(); aSelModeIter.Next())
1023 Standard_Integer aSelMode = aSelModeIter.Value();
1024 mySM->Deactivate (SO, aSelMode, myMainVS);
1028 ClearSelected( Standard_False );
1030 // Clear selection structures for temporary objects, created in local context
1031 for (AIS_DataMapIteratorOfDataMapOfSelStat anIter (myActiveObjects); anIter.More(); anIter.Next())
1033 if (anIter.Value()->IsTemporary())
1035 mySM->Remove (anIter.Key(), myMainVS);
1039 myActiveObjects.Clear();
1043 Standard_Boolean AIS_LocalContext::IsDecompositionOn() const
1044 {return !myListOfStandardMode.IsEmpty();}
1049 //=======================================================================
1050 //function : HasAlreadyFilters
1052 //=======================================================================
1054 Standard_Boolean AIS_LocalContext::
1055 HasFilters(const TopAbs_ShapeEnum aType) const
1057 return myFilters->ActsOn(aType);
1060 void AIS_LocalContext::ClearDetected()
1062 for(Standard_Integer I=1;I<=myMapOfOwner->Extent();I++)
1064 if(!myMapOfOwner->FindKey (I).IsNull())
1066 if(myMapOfOwner->FindKey (I)->IsHilighted(myMainPM))
1067 myMapOfOwner->FindKey (I)->Unhilight(myMainPM);
1070 const Handle(SelectMgr_SelectableObject)& SO =
1071 myMapOfOwner->FindKey (I)->Selectable();
1072 if(myActiveObjects.IsBound(SO))
1074 const Handle(AIS_LocalStatus)& Att = myActiveObjects(SO);
1076 if(Att->IsTemporary() &&
1077 Att->DisplayMode()==-1 &&
1078 Att->SelectionModes().IsEmpty())
1080 myMapOfOwner->FindKey (I)->Clear(myMainPM);
1088 //=======================================================================
1089 //function : BeginImmediateDraw
1091 //=======================================================================
1092 Standard_Boolean AIS_LocalContext::BeginImmediateDraw()
1094 if (myMainPM->IsImmediateModeOn())
1096 myMainPM->BeginImmediateDraw();
1097 return Standard_True;
1099 return Standard_False;
1102 //=======================================================================
1103 //function : ImmediateAdd
1105 //=======================================================================
1106 Standard_Boolean AIS_LocalContext::ImmediateAdd (const Handle(AIS_InteractiveObject)& theObj,
1107 const Standard_Integer theMode)
1109 if (!myMainPM->IsImmediateModeOn())
1111 return Standard_False;
1114 myMainPM->AddToImmediateList (myMainPM->Presentation (theObj, theMode)->Presentation());
1115 return Standard_True;
1118 //=======================================================================
1119 //function : EndImmediateDraw
1121 //=======================================================================
1122 Standard_Boolean AIS_LocalContext::EndImmediateDraw (const Handle(V3d_Viewer)& theViewer)
1124 if (!myMainPM->IsImmediateModeOn())
1126 return Standard_False;
1129 myMainPM->EndImmediateDraw (theViewer);
1130 return Standard_True;
1133 // =======================================================================
1134 // function : ClearImmediateDraw
1136 // =======================================================================
1137 void AIS_LocalContext::ClearImmediateDraw()
1139 myMainPM->ClearImmediateDraw();
1142 //=======================================================================
1143 //function : IsImmediateModeOn
1145 //=======================================================================
1146 Standard_Boolean AIS_LocalContext::IsImmediateModeOn() const
1148 return myMainPM->IsImmediateModeOn();
1151 void AIS_LocalContext::SetPixelTolerance(const Standard_Integer aPrecision) {
1153 myMainVS->SetPixelTolerance(aPrecision);
1156 Standard_Integer AIS_LocalContext::PixelTolerance() const {
1158 return myMainVS->PixelTolerance();
1161 //=======================================================================
1162 //function : SetSelectionSensitivity
1163 //purpose : Allows to manage sensitivity of a particular selection of interactive object theObject
1164 //=======================================================================
1165 void AIS_LocalContext::SetSelectionSensitivity (const Handle(AIS_InteractiveObject)& theObject,
1166 const Standard_Integer theMode,
1167 const Standard_Integer theNewSensitivity)
1169 mySM->SetSelectionSensitivity (theObject, theMode, theNewSensitivity);