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_Shape.hxx>
27 #include <Aspect_TypeOfMarker.hxx>
28 #include <Graphic3d_Structure.hxx>
29 #include <Prs3d_LineAspect.hxx>
30 #include <Prs3d_PlaneAspect.hxx>
31 #include <Prs3d_PointAspect.hxx>
32 #include <Prs3d_Presentation.hxx>
33 #include <SelectMgr_CompositionFilter.hxx>
34 #include <SelectMgr_EntityOwner.hxx>
35 #include <SelectMgr_Filter.hxx>
36 #include <SelectMgr_OrFilter.hxx>
37 #include <SelectMgr_SelectableObject.hxx>
38 #include <SelectMgr_SelectionManager.hxx>
39 #include <Standard_Transient.hxx>
40 #include <Standard_Type.hxx>
41 #include <StdSelect_ShapeTypeFilter.hxx>
42 #include <StdSelect_ViewerSelector3d.hxx>
43 #include <TCollection_AsciiString.hxx>
44 #include <TColStd_ListIteratorOfListOfInteger.hxx>
45 #include <TopAbs_ShapeEnum.hxx>
46 #include <TopoDS_Shape.hxx>
47 #include <V3d_View.hxx>
48 #include <V3d_Viewer.hxx>
51 IMPLEMENT_STANDARD_RTTIEXT(AIS_LocalContext,Standard_Transient)
53 //=======================================================================
54 //function : AIS_LocalContext
56 //=======================================================================
59 AIS_LocalContext::AIS_LocalContext(){}
61 AIS_LocalContext::AIS_LocalContext(const Handle(AIS_InteractiveContext)& aCtx,
62 const Standard_Integer Index,
63 const Standard_Boolean LoadDisplayed,
64 const Standard_Boolean AcceptStandardModes,
65 const Standard_Boolean AcceptEraseOfTemp,
66 const Standard_Boolean /*BothViewers*/):
68 myLoadDisplayed(LoadDisplayed),
69 myAcceptStdMode(AcceptStandardModes),
70 myAcceptErase(AcceptEraseOfTemp),
71 mySM(aCtx->SelectionManager()),
72 myMainVS(aCtx->MainSelector()),
73 myFilters(new SelectMgr_OrFilter()),
74 myAutoHilight(Standard_True),
75 myMapOfOwner (new SelectMgr_IndexedMapOfOwner()),
76 mySelection(new AIS_Selection()),
81 mySubintStyle (new Prs3d_Drawer())
83 mySubintStyle->Link (aCtx->SelectionStyle());
84 mySubintStyle->SetColor (aCtx->SelectionStyle()->Color());
85 mySubintStyle->SetTransparency (aCtx->SelectionStyle()->Transparency());
86 mySubintStyle->SetMethod (aCtx->SelectionStyle()->Method());
88 // bind self to AIS_InteractiveContext::myLocalContexts. Further, the
89 // constructor executes logic that implies that the context is already
90 // created and mapped.
91 aCtx->myLocalContexts.Bind (Index, this);
93 myMainVS->ResetSelectionActivationStatus();
94 myMainPM = aCtx->MainPrsMgr();
97 if(myLoadDisplayed) LoadContextObjects();
103 //=======================================================================
104 //function : SetContext
106 //=======================================================================
108 void AIS_LocalContext::SetContext(const Handle(AIS_InteractiveContext)& aCtx)
111 //=======================================================================
114 //=======================================================================
116 Standard_Boolean AIS_LocalContext::Display(const Handle(AIS_InteractiveObject)& anInteractive,
117 const Standard_Integer WhichMode,
118 const Standard_Boolean AllowShapeDecomposition,
119 const Standard_Integer ActivationMode)
121 if(myActiveObjects.IsBound(anInteractive)){
122 const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anInteractive);
124 if(STAT->DisplayMode() == -1){
125 if(!myMainPM->IsDisplayed(anInteractive,WhichMode))
126 myMainPM->Display(anInteractive,WhichMode);
127 if(STAT->IsTemporary())
128 STAT->SetDisplayMode(WhichMode);
130 else if(STAT->DisplayMode()!=WhichMode && STAT->IsTemporary()){
131 myMainPM->Erase(anInteractive,STAT->DisplayMode());
132 STAT->SetDisplayMode(WhichMode);
133 if(!myMainPM->IsDisplayed(anInteractive,WhichMode))
134 myMainPM->Display(anInteractive,WhichMode);
137 if(ActivationMode!=-1){
138 if(!STAT->IsActivated(ActivationMode)){
139 STAT->ClearSelectionModes();
140 mySM->Load(anInteractive,myMainVS);
141 STAT->AddSelectionMode(ActivationMode);
142 mySM->Activate(anInteractive,ActivationMode,myMainVS);
147 Handle(AIS_LocalStatus) Att = new AIS_LocalStatus();
149 if(anInteractive->AcceptShapeDecomposition() && AllowShapeDecomposition)
150 Att->SetDecomposition(Standard_True);
152 Att->SetDecomposition(Standard_False);
153 // status temporary or not
154 if(myCTX->DisplayStatus(anInteractive) == AIS_DS_None ||
155 myCTX->DisplayStatus(anInteractive) == AIS_DS_Temporary)
156 Att->SetTemporary(Standard_True);
158 Att->SetTemporary(Standard_False);
162 if(!myCTX->IsDisplayed(anInteractive,WhichMode)){
164 //storing information....
165 Att->SetDisplayMode(WhichMode);
166 if (ActivationMode!=-1)
167 Att->AddSelectionMode(ActivationMode);
168 Standard_Integer HiMod = anInteractive->HasHilightMode()? anInteractive->HilightMode(): WhichMode;
169 Att->SetHilightMode(HiMod);
171 if(!myMainPM->IsDisplayed(anInteractive,WhichMode))
172 myMainPM->Display(anInteractive,WhichMode);
174 if(ActivationMode!=-1){
175 mySM->Load(anInteractive,myMainVS);
176 mySM->Activate(anInteractive,ActivationMode,myMainVS);
180 Standard_Integer HiMod = anInteractive->HasHilightMode()? anInteractive->HilightMode(): WhichMode;
181 Att->SetHilightMode(HiMod);
183 myActiveObjects.Bind(anInteractive,Att);
185 Process(anInteractive);
190 return Standard_True;
193 //=======================================================================
196 //=======================================================================
198 Standard_Boolean AIS_LocalContext::
199 Load(const Handle(AIS_InteractiveObject)& anInteractive,
200 const Standard_Boolean AllowShapeDecomposition,
201 const Standard_Integer ActivationMode)
203 if (myActiveObjects.IsBound (anInteractive))
205 if (const Handle(SelectMgr_Selection)& aSel = anInteractive->Selection (ActivationMode))
207 if (aSel->GetSelectionState() != SelectMgr_SOS_Activated)
209 if (!myMainVS->Contains (anInteractive))
211 mySM->Load (anInteractive, myMainVS);
213 mySM->Activate (anInteractive, ActivationMode, myMainVS);
214 return Standard_True;
217 return Standard_False;
220 Handle(AIS_LocalStatus) Att = new AIS_LocalStatus();
222 if(anInteractive->AcceptShapeDecomposition() && AllowShapeDecomposition)
223 Att->SetDecomposition(Standard_True);
225 Att->SetDecomposition(Standard_False);
227 if(!myCTX->IsDisplayed(anInteractive))
228 Att->SetTemporary(Standard_True);
230 Att->SetTemporary(Standard_False);
231 Att->SetDisplayMode(-1);
233 //storing information....
234 if(ActivationMode!=-1)
235 Att->AddSelectionMode(ActivationMode);
236 Standard_Integer HiMod = anInteractive->HasHilightMode()? anInteractive->HilightMode():0;
237 Att->SetHilightMode(HiMod);
240 mySM->Load(anInteractive,myMainVS);
241 if(ActivationMode != -1){
242 mySM->Activate(anInteractive,ActivationMode,myMainVS);
244 myActiveObjects.Bind(anInteractive,Att);
245 Process(anInteractive);
246 return Standard_True;
249 //=======================================================================
250 //function : ClearPrs
252 //=======================================================================
254 Standard_Boolean AIS_LocalContext::
255 ClearPrs(const Handle(AIS_InteractiveObject)& anInteractive,
256 const Standard_Integer aMode)
258 if(!myActiveObjects.IsBound(anInteractive))
259 return Standard_False;
261 Standard_Boolean jobdone(Standard_False);
262 const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anInteractive);
265 if(STAT->IsSubIntensityOn()) {
266 STAT->SubIntensityOff();
267 if(STAT->HilightMode()==aMode)
268 myMainPM->Unhighlight(anInteractive);
270 myMainPM->Clear(anInteractive,aMode); // correction connexions 23/09/97
271 jobdone = Standard_True;
272 if(STAT->DisplayMode()==aMode)
273 STAT->SetDisplayMode(-1);
276 //=======================================================================
279 //=======================================================================
281 Standard_Boolean AIS_LocalContext::
282 Erase(const Handle(AIS_InteractiveObject)& anInteractive)
284 if(!myActiveObjects.IsBound(anInteractive))
285 return Standard_False;
286 const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anInteractive);
289 if(STAT->IsSubIntensityOn()) {
290 STAT->SubIntensityOff();
291 myMainPM->Unhighlight (anInteractive);
294 Standard_Boolean status(Standard_False);
296 if(STAT->DisplayMode()!=-1) {
297 if(IsSelected(anInteractive))
298 AddOrRemoveSelected(anInteractive);
299 if(myMainPM->IsHighlighted(anInteractive,STAT->HilightMode()))
301 myMainPM->Unhighlight (anInteractive);
303 myMainPM->SetVisibility (anInteractive, STAT->DisplayMode(), Standard_False);
304 STAT->SetDisplayMode(-1);
305 status = Standard_True;
307 if(STAT->IsTemporary()){
308 if(myMainPM->IsDisplayed(anInteractive,STAT->HilightMode()))
309 myMainPM->SetVisibility (anInteractive, STAT->HilightMode(), Standard_False);
312 // Deactivate selectable entities of interactive object
313 const Handle(SelectMgr_SelectableObject)& anObj = anInteractive; // to avoid ambiguity
314 if (mySM->Contains (anObj))
316 while (!STAT->SelectionModes().IsEmpty())
318 mySM->Deactivate (anInteractive, STAT->SelectionModes().Last(), myMainVS);
319 STAT->RemoveSelectionMode (STAT->SelectionModes().Last());
323 ClearOutdatedSelection (anInteractive, Standard_True);
329 //=======================================================================
330 //function : SetShapeDecomposition
332 //=======================================================================
334 void AIS_LocalContext::SetShapeDecomposition(const Handle(AIS_InteractiveObject)& aStoredObject,
335 const Standard_Boolean aStatus)
337 if(!myActiveObjects.IsBound(aStoredObject)) return;
339 if(aStatus == myActiveObjects(aStoredObject)->Decomposed())
342 myActiveObjects(aStoredObject)->SetDecomposition(aStatus);
344 Process(aStoredObject);
347 //=======================================================================
350 //=======================================================================
352 void AIS_LocalContext::Clear(const AIS_ClearMode aType)
359 while(!myListOfStandardMode.IsEmpty())
360 DeactivateStandardMode(AIS_Shape::SelectionType(myListOfStandardMode.Last()));
363 case AIS_CM_Interactive:
369 case AIS_CM_StandardModes:
371 while(!myListOfStandardMode.IsEmpty())
372 DeactivateStandardMode(AIS_Shape::SelectionType(myListOfStandardMode.Last()));
375 case AIS_CM_TemporaryShapePrs:
379 //=======================================================================
380 //function : ActivateMode
382 //=======================================================================
384 void AIS_LocalContext::ActivateMode(const Handle(AIS_InteractiveObject)& aSelectable,
385 const Standard_Integer aMode)
387 if(!myActiveObjects.IsBound(aSelectable)) return;
388 // if(myActiveObjects(aSelectable)->SelectionMode()!=aMode)
389 // mySM->Deactivate(aSelectable,aMode,myMainVS);
391 myActiveObjects(aSelectable)->AddSelectionMode(aMode);
392 mySM->Activate(aSelectable,aMode,myMainVS);
395 //=======================================================================
396 //function : ActivateMode
398 //=======================================================================
400 void AIS_LocalContext::DeactivateMode(const Handle(AIS_InteractiveObject)& aSelectable,
401 const Standard_Integer aMode)
403 if(!myActiveObjects.IsBound(aSelectable)) return;
405 if(aMode==-1) return;
407 myActiveObjects(aSelectable)->RemoveSelectionMode(aMode);
408 mySM->Deactivate(aSelectable,aMode,myMainVS);
410 //=======================================================================
411 //function : ActivateMode
413 //=======================================================================
415 void AIS_LocalContext::Deactivate(const Handle(AIS_InteractiveObject)& aSelectable)
417 if(!myActiveObjects.IsBound(aSelectable)) return;
419 mySM->Deactivate(aSelectable, -1, myMainVS);
420 myActiveObjects(aSelectable)->ClearSelectionModes();
423 //=======================================================================
426 //=======================================================================
428 Standard_Boolean AIS_LocalContext::Remove(const Handle(AIS_InteractiveObject)& aSelectable)
430 if(!myActiveObjects.IsBound (aSelectable))
432 return Standard_False;
435 if (IsSelected (aSelectable))
437 AddOrRemoveSelected (aSelectable, Standard_False);
440 const Handle(AIS_LocalStatus)& Att = myActiveObjects (aSelectable);
442 TColStd_ListIteratorOfListOfInteger It;
444 // Deactivate standard modes
445 if (Att->Decomposed())
447 for (It.Initialize (myListOfStandardMode); It.More(); It.Next())
449 mySM->Deactivate (aSelectable, It.Value(), myMainVS);
453 // If object or temporary presentations
454 if (Att->IsTemporary())
456 if (Att->IsSubIntensityOn())
458 myMainPM->Unhighlight (aSelectable);
461 myMainPM->Erase (aSelectable, Att->DisplayMode());
462 if (myMainPM->IsDisplayed (aSelectable, Att->HilightMode()))
464 myMainPM->Erase (aSelectable, Att->HilightMode());
467 // If subintensity used
468 else if (Att->IsSubIntensityOn())
470 myCTX->SubIntensityOff (aSelectable, Standard_False);
473 // Deactivate stored selection modes
474 for (It.Initialize (Att->SelectionModes()); It.More(); It.Next())
476 mySM->Deactivate (aSelectable, It.Value(), myMainVS);
479 // Remove the interactive object from selection manager
480 const Handle(SelectMgr_SelectableObject)& anObj = aSelectable; // to avoid ambiguity
481 if (mySM->Contains (anObj))
483 mySM->Remove (anObj);
485 ClearOutdatedSelection (aSelectable, Standard_True);
487 // This should be done at the very end because most methods use
488 // myActiveObjects even during clean-up
489 myActiveObjects.UnBind (aSelectable);
490 return Standard_True;
493 //=======================================================================
494 //function : ActivateStandardMode
496 //=======================================================================
498 void AIS_LocalContext::ActivateStandardMode(const TopAbs_ShapeEnum aType)
501 //check if it is not in the list
502 TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
503 for(;It.More();It.Next())
504 if(It.Value()==aType) return;
505 Standard_Integer IMode = AIS_Shape::SelectionMode(aType);
508 // create a hidden filter answering ok to the type except for :
509 // if the type is shape...
510 // if the filters already impact at the type <aType>
511 if(aType != TopAbs_SHAPE){
512 if(myStdFilters[IMode].IsNull())
513 myStdFilters[IMode] = new StdSelect_ShapeTypeFilter(aType);
514 if(!HasFilters(aType))
515 myFilters->Add(myStdFilters[IMode]);
518 // the mode is activated for all objects of type Shape
519 // accepting the decomposition in standard mode.
520 myListOfStandardMode.Append(IMode);
522 AIS_DataMapIteratorOfDataMapOfSelStat ItM(myActiveObjects);
524 for(;ItM.More();ItM.Next()){
525 if(ItM.Value()->Decomposed())
526 myCTX->SelectionManager()->Activate(ItM.Key(),
529 ItM.Value()->AddSelectionMode (IMode);
534 //=======================================================================
535 //function : DeActivateStandardMode
537 //=======================================================================
539 void AIS_LocalContext::DeactivateStandardMode(const TopAbs_ShapeEnum aType)
541 TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
542 Standard_Integer IMode = AIS_Shape::SelectionMode(aType);
543 for(;It.More();It.Next())
544 if(It.Value()==IMode) {
545 AIS_DataMapIteratorOfDataMapOfSelStat ItM(myActiveObjects);
547 for(;ItM.More();ItM.Next()){
548 if(ItM.Value()->Decomposed()){
549 myCTX->SelectionManager()->Deactivate(ItM.Key(),
552 ItM.Value()->RemoveSelectionMode(IMode);
555 myListOfStandardMode.Remove(It);
556 if(myFilters->IsIn(myStdFilters[IMode]))
557 myFilters->Remove(myStdFilters[IMode]);
562 //=======================================================================
563 //function : AddFilter
565 //=======================================================================
567 void AIS_LocalContext::AddFilter(const Handle(SelectMgr_Filter)& aFilter)
569 // it is checked if the filter impacts at the type of active sub-shape
570 // for which a filter of type has been already implemented...
572 TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
574 for(;It.More();It.Next()){
575 if(aFilter->ActsOn(AIS_Shape::SelectionType(It.Value())))
576 if(myFilters->IsIn(myStdFilters[It.Value()]))
577 myFilters->Remove(myStdFilters[It.Value()]);
579 myFilters->Add(aFilter);
582 //=======================================================================
583 //function : RemoveFilter
585 //=======================================================================
587 void AIS_LocalContext::RemoveFilter(const Handle(SelectMgr_Filter)& aFilter)
589 if(myFilters->IsIn(aFilter)) myFilters->Remove(aFilter);
591 // it is checked if the filter for type standard is active.
592 // if yes, it is checked there are still similarities among the
593 // remaining filters...
594 // otherwise, the standard filter is restored to
595 // continu selecting active modes...
596 TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
598 for(;It.More();It.Next()){
599 SE = AIS_Shape::SelectionType(It.Value());
600 if(aFilter->ActsOn(SE))
602 myFilters->Add(myStdFilters[It.Value()]);
606 //=======================================================================
607 //function : Terminate
609 //=======================================================================
611 void AIS_LocalContext::Terminate (const Standard_Boolean theToUpdate)
615 myMapOfOwner->Clear();
618 // clear the selector...
621 for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
623 aSelIter.Value()->SetSelected (Standard_False);
625 mySelection->Clear();
627 Handle(V3d_View) aDummyView;
628 myMainVS->ClearSensitive (aDummyView);
632 myCTX->UpdateCurrentViewer();
637 //=======================================================================
638 //function : SubIntensity
640 //=======================================================================
642 void AIS_LocalContext::SubIntensityOn(const Handle(AIS_InteractiveObject)& anObject)
644 if(!myActiveObjects.IsBound(anObject)) return;
645 mySubintStyle->SetColor (myCTX->SubIntensityColor());
647 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
649 if(Att->IsTemporary())
651 myMainPM->Color (anObject, mySubintStyle, Att->DisplayMode());
654 Att->SubIntensityOn();
656 //=======================================================================
657 //function : SubIntensity
659 //=======================================================================
661 void AIS_LocalContext::SubIntensityOff(const Handle(AIS_InteractiveObject)& anObject)
663 if(!myActiveObjects.IsBound(anObject)) return;
665 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
667 if(Att->IsTemporary())
668 myMainPM->Unhighlight(anObject);
669 Att->SubIntensityOff();
673 //=======================================================================
676 //=======================================================================
678 void AIS_LocalContext::Hilight(const Handle(AIS_InteractiveObject)& anObject)
680 if(!myActiveObjects.IsBound(anObject)){
681 Standard_Integer HiMod = anObject->HasHilightMode()? anObject->HilightMode() : 0;
682 Handle(AIS_LocalStatus) Att = new AIS_LocalStatus(Standard_True,
685 myActiveObjects.Bind(anObject,Att);
688 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
689 myMainPM->Color(anObject, myCTX->getHiStyle (anObject, anObject->GlobalSelOwner()), Att->HilightMode());
690 Att->SubIntensityOn();
692 //=======================================================================
695 //=======================================================================
697 void AIS_LocalContext::Hilight (const Handle(AIS_InteractiveObject)& theObj,
698 const Handle(Prs3d_Drawer)& theStyle)
700 if (!myActiveObjects.IsBound (theObj))
702 Handle(AIS_LocalStatus) aStatus = new AIS_LocalStatus
703 (Standard_True, Standard_False, -1, -1, theObj->HasHilightMode() ? theObj->HilightMode() : 0);
704 myActiveObjects.Bind (theObj, aStatus);
706 const Handle(AIS_LocalStatus)& aStatus = myActiveObjects (theObj);
707 myMainPM->Color (theObj, theStyle, aStatus->HilightMode());
708 aStatus->SubIntensityOn();
709 aStatus->SetHilightStyle (theStyle);
712 //=======================================================================
713 //function : Unhilight
715 //=======================================================================
717 void AIS_LocalContext::Unhilight(const Handle(AIS_InteractiveObject)& anObject)
719 if(!myActiveObjects.IsBound(anObject)) return;
721 // chieck if by hazard the object is somewhere else...
722 Standard_Integer Indx;
723 Standard_DISABLE_DEPRECATION_WARNINGS
724 Standard_Boolean IsSomeWhereElse =
725 myCTX->IsInLocal(anObject,Indx) && Indx != myCTX->IndexOfCurrentLocal();
726 Standard_ENABLE_DEPRECATION_WARNINGS
728 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
729 myMainPM->Unhighlight (anObject);
730 if(Att->IsTemporary() && Att->DisplayMode()==-1)
732 myMainPM->SetVisibility (anObject, Att->HilightMode(), Standard_False);
734 Att->SubIntensityOff();
735 Att->SetHilightStyle (Handle(Prs3d_Drawer)());
739 //=======================================================================
742 //=======================================================================
744 Standard_Boolean AIS_LocalContext::
745 IsIn(const Handle(AIS_InteractiveObject)& anObject) const
747 return myActiveObjects.IsBound(anObject);
750 //=======================================================================
751 //function : IsHilighted
753 //=======================================================================
755 Standard_Boolean AIS_LocalContext::IsHilighted(const Handle(AIS_InteractiveObject)& anObject) const
757 if(!myActiveObjects.IsBound(anObject)) return Standard_False;
758 return myActiveObjects(anObject)->IsSubIntensityOn();
761 Standard_Boolean AIS_LocalContext::HighlightStyle (const Handle(AIS_InteractiveObject)& theObject,
762 Handle(Prs3d_Drawer)& theStyle) const
764 if (!myActiveObjects.IsBound (theObject))
765 return Standard_False;
767 if (myActiveObjects (theObject)->IsSubIntensityOn())
769 theStyle = myActiveObjects (theObject)->HilightStyle();
770 return Standard_True;
773 return Standard_False;
777 void AIS_LocalContext::SetDisplayPriority(const Handle(AIS_InteractiveObject)& anObject,
778 const Standard_Integer Prior)
780 if(!myActiveObjects.IsBound(anObject)) return;
781 const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anObject);
782 if(STAT->DisplayMode()==-1) return;
783 myMainPM->SetDisplayPriority(anObject,STAT->DisplayMode(),Prior);
784 if(STAT->IsSubIntensityOn())
785 myMainPM->SetDisplayPriority(anObject,STAT->HilightMode(),Prior);
790 //=======================================================================
791 //function : DisplayedObjects
793 //=======================================================================
794 Standard_Integer AIS_LocalContext::DisplayedObjects(TColStd_MapOfTransient& theMap) const
796 Standard_Integer NbDisp(0);
797 for(AIS_DataMapIteratorOfDataMapOfSelStat it(myActiveObjects);it.More();it.Next()){
798 const Handle(SelectMgr_SelectableObject)& SO = it.Key();
799 if(!theMap.Contains(SO))
800 if(it.Value()->DisplayMode()!=-1){
809 //=======================================================================
810 //function : IsDisplayed
812 //=======================================================================
814 Standard_Boolean AIS_LocalContext::IsDisplayed(const Handle(AIS_InteractiveObject)& anObject) const
816 if(!myActiveObjects.IsBound(anObject)) return Standard_False;
817 return (myActiveObjects(anObject)->DisplayMode()!=-1);
820 //=======================================================================
821 //function : IsDisplayed
823 //=======================================================================
825 Standard_Boolean AIS_LocalContext::IsDisplayed(const Handle(AIS_InteractiveObject)& anObject,
826 const Standard_Integer aMode) const
828 if(!myActiveObjects.IsBound(anObject)) return Standard_False;
829 return (myActiveObjects(anObject)->DisplayMode()==aMode);
832 //=======================================================================
833 //function : SelectionModes
835 //=======================================================================
837 const TColStd_ListOfInteger& AIS_LocalContext::
838 SelectionModes(const Handle(AIS_InteractiveObject)& anObject) const
840 return myActiveObjects(anObject)->SelectionModes();
843 //=======================================================================
846 //=======================================================================
848 TCollection_AsciiString AIS_LocalContext::Status() const
850 TCollection_AsciiString t;
854 const Handle(AIS_LocalStatus)& AIS_LocalContext::Status(const Handle(AIS_InteractiveObject)& anObject) const
856 return myActiveObjects(anObject);
859 //=======================================================================
860 //function : LoadContextObjects
862 //=======================================================================
864 void AIS_LocalContext::LoadContextObjects()
866 if (!myLoadDisplayed)
871 AIS_ListOfInteractive LL;
872 myCTX->DisplayedObjects(LL,Standard_True);
873 for (AIS_ListIteratorOfListOfInteractive It (LL); It.More(); It.Next())
875 const Handle(AIS_InteractiveObject)& anObj = It.Value();
876 Handle(AIS_LocalStatus) Att = new AIS_LocalStatus();
877 Att->SetDecomposition((anObj->AcceptShapeDecomposition() && myAcceptStdMode));
878 Att->SetTemporary(Standard_False);
879 Att->SetHilightMode(anObj->HasHilightMode()? anObj->HilightMode(): 0);
880 for (SelectMgr_SequenceOfSelection::Iterator aSelIter (anObj->Selections()); aSelIter.More(); aSelIter.Next())
882 const Handle(SelectMgr_Selection)& aSel = aSelIter.Value();
883 aSel->SetSelectionState (SelectMgr_SOS_Deactivated);
885 myActiveObjects.Bind(anObj,Att);
889 void AIS_LocalContext::UnloadContextObjects()
891 AIS_ListIteratorOfListOfInteractive It;
894 AIS_ListOfInteractive LL;
895 myCTX->DisplayedObjects(LL,Standard_True);
897 for (It.Initialize(LL);It.More();It.Next())
899 myActiveObjects.UnBind(It.Value());
903 //=======================================================================
906 //=======================================================================
908 void AIS_LocalContext::Process(const Handle(SelectMgr_SelectableObject)& anObject)
910 if(!myActiveObjects.IsBound(anObject)) return;
911 if(myActiveObjects(anObject)->Decomposed())
912 ActivateStandardModes(anObject);
915 TColStd_ListIteratorOfListOfInteger It(myActiveObjects(anObject)->SelectionModes());
916 for(;It.More();It.Next())
917 myCTX->SelectionManager()->Activate(anObject,It.Value(),myMainVS);
921 //=======================================================================
924 //=======================================================================
926 void AIS_LocalContext::Process()
931 AIS_DataMapIteratorOfDataMapOfSelStat It(myActiveObjects);
933 for(;It.More();It.Next()){
934 myCTX->SelectionManager()->Load(It.Key(),myMainVS);
935 if(It.Value()->Decomposed())
936 ActivateStandardModes(It.Key());
937 else if( myCTX->GetAutoActivateSelection() )
939 It.Value()->AddSelectionMode(0);
940 myCTX->SelectionManager()->Activate(It.Key(),0,myMainVS);
946 //=======================================================================
947 //function : ActivateModes
949 //=======================================================================
951 void AIS_LocalContext::ActivateStandardModes(const Handle(SelectMgr_SelectableObject)& anObject)
953 if(!myActiveObjects.IsBound(anObject)) return;
955 TColStd_ListIteratorOfListOfInteger itl (myListOfStandardMode);
957 const Handle(AIS_LocalStatus)& LS = myActiveObjects(anObject);
958 if(LS->Decomposed()){
959 for(;itl.More();itl.Next()){
960 myCTX->SelectionManager()->Activate(anObject,itl.Value(),myMainVS);
961 LS->AddSelectionMode(itl.Value());
967 //=======================================================================
968 //function : ClearObjects
970 //=======================================================================
972 void AIS_LocalContext::ClearObjects()
974 AIS_DataMapIteratorOfDataMapOfSelStat It(myActiveObjects);
975 for(;It.More();It.Next())
977 Handle(AIS_InteractiveObject) SO =
978 Handle(AIS_InteractiveObject)::DownCast(It.Key());
980 const Handle(AIS_LocalStatus)& CurAtt = It.Value();
981 //TColStd_ListIteratorOfListOfInteger ItL;
982 // if object is temporary the presentations managed by myMainPM are removed
983 AIS_DisplayStatus TheDS = myCTX->DisplayStatus(SO);
985 if(TheDS != AIS_DS_Displayed)
987 if (myMainPM->IsDisplayed(SO,CurAtt->DisplayMode()))
989 if (CurAtt->IsSubIntensityOn() && myMainPM->IsHighlighted (SO, CurAtt->HilightMode()))
991 myMainPM->Unhighlight (SO);
993 myMainPM->Erase (SO, CurAtt->DisplayMode());
996 if (CurAtt->IsTemporary())
998 myMainPM->Erase (SO, CurAtt->DisplayMode());
999 //myMainPM->Clear(SO,CurAtt->DisplayMode());
1003 if (CurAtt->IsSubIntensityOn())
1005 myCTX->SubIntensityOff(SO, Standard_False);
1007 Standard_Integer DiMo = SO->HasDisplayMode()?
1008 SO->DisplayMode():myCTX->DisplayMode();
1009 if(CurAtt->DisplayMode()!=-1 &&
1010 CurAtt->DisplayMode()!= DiMo)
1011 myMainPM->Erase(SO,CurAtt->DisplayMode());
1014 TColStd_ListIteratorOfListOfInteger aSelModeIter (CurAtt->SelectionModes());
1015 for ( ; aSelModeIter.More(); aSelModeIter.Next())
1017 Standard_Integer aSelMode = aSelModeIter.Value();
1018 mySM->Deactivate (SO, aSelMode, myMainVS);
1022 ClearSelected( Standard_False );
1024 // Clear selection structures for temporary objects, created in local context
1025 for (AIS_DataMapIteratorOfDataMapOfSelStat anIter (myActiveObjects); anIter.More(); anIter.Next())
1027 if (anIter.Value()->IsTemporary())
1029 mySM->Remove (anIter.Key(), myMainVS);
1033 myActiveObjects.Clear();
1037 Standard_Boolean AIS_LocalContext::IsDecompositionOn() const
1038 {return !myListOfStandardMode.IsEmpty();}
1043 //=======================================================================
1044 //function : HasAlreadyFilters
1046 //=======================================================================
1048 Standard_Boolean AIS_LocalContext::
1049 HasFilters(const TopAbs_ShapeEnum aType) const
1051 return myFilters->ActsOn(aType);
1054 void AIS_LocalContext::ClearDetected()
1056 for(Standard_Integer I=1;I<=myMapOfOwner->Extent();I++)
1058 if(!myMapOfOwner->FindKey (I).IsNull())
1060 if(myMapOfOwner->FindKey (I)->IsHilighted(myMainPM))
1061 myMapOfOwner->FindKey (I)->Unhilight(myMainPM);
1064 const Handle(SelectMgr_SelectableObject)& SO =
1065 myMapOfOwner->FindKey (I)->Selectable();
1066 if(myActiveObjects.IsBound(SO))
1068 const Handle(AIS_LocalStatus)& Att = myActiveObjects(SO);
1070 if(Att->IsTemporary() &&
1071 Att->DisplayMode()==-1 &&
1072 Att->SelectionModes().IsEmpty())
1074 myMapOfOwner->FindKey (I)->Clear(myMainPM);
1082 //=======================================================================
1083 //function : BeginImmediateDraw
1085 //=======================================================================
1086 Standard_Boolean AIS_LocalContext::BeginImmediateDraw()
1088 if (myMainPM->IsImmediateModeOn())
1090 myMainPM->BeginImmediateDraw();
1091 return Standard_True;
1093 return Standard_False;
1096 //=======================================================================
1097 //function : ImmediateAdd
1099 //=======================================================================
1100 Standard_Boolean AIS_LocalContext::ImmediateAdd (const Handle(AIS_InteractiveObject)& theObj,
1101 const Standard_Integer theMode)
1103 if (!myMainPM->IsImmediateModeOn())
1105 return Standard_False;
1108 myMainPM->AddToImmediateList (myMainPM->Presentation (theObj, theMode)->Presentation());
1109 return Standard_True;
1112 //=======================================================================
1113 //function : EndImmediateDraw
1115 //=======================================================================
1116 Standard_Boolean AIS_LocalContext::EndImmediateDraw (const Handle(V3d_Viewer)& theViewer)
1118 if (!myMainPM->IsImmediateModeOn())
1120 return Standard_False;
1123 myMainPM->EndImmediateDraw (theViewer);
1124 return Standard_True;
1127 // =======================================================================
1128 // function : ClearImmediateDraw
1130 // =======================================================================
1131 void AIS_LocalContext::ClearImmediateDraw()
1133 myMainPM->ClearImmediateDraw();
1136 //=======================================================================
1137 //function : IsImmediateModeOn
1139 //=======================================================================
1140 Standard_Boolean AIS_LocalContext::IsImmediateModeOn() const
1142 return myMainPM->IsImmediateModeOn();
1145 void AIS_LocalContext::SetPixelTolerance(const Standard_Integer aPrecision) {
1147 myMainVS->SetPixelTolerance(aPrecision);
1150 Standard_Integer AIS_LocalContext::PixelTolerance() const {
1152 return myMainVS->PixelTolerance();
1155 //=======================================================================
1156 //function : SetSelectionSensitivity
1157 //purpose : Allows to manage sensitivity of a particular selection of interactive object theObject
1158 //=======================================================================
1159 void AIS_LocalContext::SetSelectionSensitivity (const Handle(AIS_InteractiveObject)& theObject,
1160 const Standard_Integer theMode,
1161 const Standard_Integer theNewSensitivity)
1163 mySM->SetSelectionSensitivity (theObject, theMode, theNewSensitivity);