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>
50 #include <Visual3d_View.hxx>
53 static TCollection_AsciiString AIS_Local_SelName(const Standard_Address address,
54 const Standard_Integer anIndex)
56 // TCollection_AsciiString SelName;
58 sprintf(string,"%p_%d", address, anIndex); // works under any system
59 TCollection_AsciiString SelName(string);
64 //=======================================================================
65 //function : AIS_LocalContext
67 //=======================================================================
70 AIS_LocalContext::AIS_LocalContext(){}
72 AIS_LocalContext::AIS_LocalContext(const Handle(AIS_InteractiveContext)& aCtx,
73 const Standard_Integer Index,
74 const Standard_Boolean LoadDisplayed,
75 const Standard_Boolean AcceptStandardModes,
76 const Standard_Boolean AcceptEraseOfTemp,
77 const Standard_Boolean /*BothViewers*/):
79 myLoadDisplayed(LoadDisplayed),
80 myAcceptStdMode(AcceptStandardModes),
81 myAcceptErase(AcceptEraseOfTemp),
82 mySM(aCtx->SelectionManager()),
83 myMainVS(aCtx->MainSelector()),
84 myFilters(new SelectMgr_OrFilter()),
85 myAutoHilight(Standard_True),
86 myMapOfOwner (new SelectMgr_IndexedMapOfOwner()),
93 // bind self to AIS_InteractiveContext::myLocalContexts. Further, the
94 // constructor executes logic that implies that the context is already
95 // created and mapped.
96 aCtx->myLocalContexts.Bind (Index, this);
98 myMainVS->ResetSelectionActivationStatus();
99 myMainPM = aCtx->MainPrsMgr();
100 mySelName = AIS_Local_SelName(this, Index);
101 AIS_Selection::CreateSelection(mySelName.ToCString());
104 if(myLoadDisplayed) LoadContextObjects();
110 //=======================================================================
111 //function : SetContext
113 //=======================================================================
115 void AIS_LocalContext::SetContext(const Handle(AIS_InteractiveContext)& aCtx)
118 //=======================================================================
121 //=======================================================================
123 Standard_Boolean AIS_LocalContext::Display(const Handle(AIS_InteractiveObject)& anInteractive,
124 const Standard_Integer WhichMode,
125 const Standard_Boolean AllowShapeDecomposition,
126 const Standard_Integer ActivationMode)
128 if(myActiveObjects.IsBound(anInteractive)){
129 const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anInteractive);
131 if(STAT->DisplayMode() == -1){
132 if(!myMainPM->IsDisplayed(anInteractive,WhichMode))
133 myMainPM->Display(anInteractive,WhichMode);
134 if(STAT->IsTemporary())
135 STAT->SetDisplayMode(WhichMode);
137 else if(STAT->DisplayMode()!=WhichMode && STAT->IsTemporary()){
138 myMainPM->Erase(anInteractive,STAT->DisplayMode());
139 STAT->SetDisplayMode(WhichMode);
140 if(!myMainPM->IsDisplayed(anInteractive,WhichMode))
141 myMainPM->Display(anInteractive,WhichMode);
144 if(ActivationMode!=-1){
145 if(!STAT->IsActivated(ActivationMode)){
146 STAT->ClearSelectionModes();
147 mySM->Load(anInteractive,myMainVS);
148 STAT->AddSelectionMode(ActivationMode);
149 mySM->Activate(anInteractive,ActivationMode,myMainVS);
154 Handle(AIS_LocalStatus) Att = new AIS_LocalStatus();
156 if(anInteractive->AcceptShapeDecomposition() && AllowShapeDecomposition)
157 Att->SetDecomposition(Standard_True);
159 Att->SetDecomposition(Standard_False);
160 // status temporary or not
161 if(myCTX->DisplayStatus(anInteractive) == AIS_DS_None ||
162 myCTX->DisplayStatus(anInteractive) == AIS_DS_Temporary)
163 Att->SetTemporary(Standard_True);
165 Att->SetTemporary(Standard_False);
169 if(!myCTX->IsDisplayed(anInteractive,WhichMode)){
171 //storing information....
172 Att->SetDisplayMode(WhichMode);
173 if (ActivationMode!=-1)
174 Att->AddSelectionMode(ActivationMode);
175 Standard_Integer HiMod = anInteractive->HasHilightMode()? anInteractive->HilightMode(): WhichMode;
176 Att->SetHilightMode(HiMod);
178 if(!myMainPM->IsDisplayed(anInteractive,WhichMode))
179 myMainPM->Display(anInteractive,WhichMode);
181 if(ActivationMode!=-1){
182 mySM->Load(anInteractive,myMainVS);
183 mySM->Activate(anInteractive,ActivationMode,myMainVS);
187 Standard_Integer HiMod = anInteractive->HasHilightMode()? anInteractive->HilightMode(): WhichMode;
188 Att->SetHilightMode(HiMod);
190 myActiveObjects.Bind(anInteractive,Att);
192 Process(anInteractive);
197 return Standard_True;
200 //=======================================================================
203 //=======================================================================
205 Standard_Boolean AIS_LocalContext::
206 Load(const Handle(AIS_InteractiveObject)& anInteractive,
207 const Standard_Boolean AllowShapeDecomposition,
208 const Standard_Integer ActivationMode)
210 if (myActiveObjects.IsBound (anInteractive))
212 if (anInteractive->HasSelection (ActivationMode))
214 const Handle(SelectMgr_Selection)& aSel = anInteractive->Selection (ActivationMode);
215 if (aSel->GetSelectionState() != SelectMgr_SOS_Activated)
217 if (!myMainVS->Contains (anInteractive))
219 mySM->Load (anInteractive, myMainVS);
221 mySM->Activate (anInteractive, ActivationMode, myMainVS);
222 return Standard_True;
225 return Standard_False;
228 Handle(AIS_LocalStatus) Att = new AIS_LocalStatus();
230 if(anInteractive->AcceptShapeDecomposition() && AllowShapeDecomposition)
231 Att->SetDecomposition(Standard_True);
233 Att->SetDecomposition(Standard_False);
235 if(!myCTX->IsDisplayed(anInteractive))
236 Att->SetTemporary(Standard_True);
238 Att->SetTemporary(Standard_False);
239 Att->SetDisplayMode(-1);
241 //storing information....
242 if(ActivationMode!=-1)
243 Att->AddSelectionMode(ActivationMode);
244 Standard_Integer HiMod = anInteractive->HasHilightMode()? anInteractive->HilightMode():0;
245 Att->SetHilightMode(HiMod);
248 mySM->Load(anInteractive,myMainVS);
249 if(ActivationMode != -1){
250 mySM->Activate(anInteractive,ActivationMode,myMainVS);
252 myActiveObjects.Bind(anInteractive,Att);
253 Process(anInteractive);
254 return Standard_True;
257 //=======================================================================
258 //function : ClearPrs
260 //=======================================================================
262 Standard_Boolean AIS_LocalContext::
263 ClearPrs(const Handle(AIS_InteractiveObject)& anInteractive,
264 const Standard_Integer aMode)
266 if(!myActiveObjects.IsBound(anInteractive))
267 return Standard_False;
269 Standard_Boolean jobdone(Standard_False);
270 const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anInteractive);
273 if(STAT->IsSubIntensityOn()) {
274 STAT->SubIntensityOff();
275 if(STAT->HilightMode()==aMode)
276 myMainPM->Unhighlight(anInteractive,STAT->HilightMode());
278 myMainPM->Clear(anInteractive,aMode); // correction connexions 23/09/97
279 jobdone = Standard_True;
280 if(STAT->DisplayMode()==aMode)
281 STAT->SetDisplayMode(-1);
284 //=======================================================================
287 //=======================================================================
289 Standard_Boolean AIS_LocalContext::
290 Erase(const Handle(AIS_InteractiveObject)& anInteractive)
292 if(!myActiveObjects.IsBound(anInteractive))
293 return Standard_False;
294 const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anInteractive);
297 if(STAT->IsSubIntensityOn()) {
298 STAT->SubIntensityOff();
299 myMainPM->Unhighlight(anInteractive,STAT->HilightMode());
302 Standard_Boolean status(Standard_False);
304 if(STAT->DisplayMode()!=-1) {
305 if(IsSelected(anInteractive))
306 AddOrRemoveSelected(anInteractive);
307 if(myMainPM->IsHighlighted(anInteractive,STAT->HilightMode()))
308 myMainPM->Unhighlight(anInteractive,STAT->HilightMode());
309 myMainPM->SetVisibility (anInteractive, STAT->DisplayMode(), Standard_False);
310 STAT->SetDisplayMode(-1);
311 status = Standard_True;
313 if(STAT->IsTemporary()){
314 if(myMainPM->IsDisplayed(anInteractive,STAT->HilightMode()))
315 myMainPM->SetVisibility (anInteractive, STAT->HilightMode(), Standard_False);
318 // Deactivate selectable entities of interactive object
319 const Handle(SelectMgr_SelectableObject)& anObj = anInteractive; // to avoid ambiguity
320 if (mySM->Contains (anObj))
322 while (!STAT->SelectionModes().IsEmpty())
324 mySM->Deactivate (anInteractive, STAT->SelectionModes().Last(), myMainVS);
325 STAT->RemoveSelectionMode (STAT->SelectionModes().Last());
329 ClearOutdatedSelection (anInteractive, Standard_True);
335 //=======================================================================
336 //function : SetShapeDecomposition
338 //=======================================================================
340 void AIS_LocalContext::SetShapeDecomposition(const Handle(AIS_InteractiveObject)& aStoredObject,
341 const Standard_Boolean aStatus)
343 if(!myActiveObjects.IsBound(aStoredObject)) return;
345 if(aStatus == myActiveObjects(aStoredObject)->Decomposed())
348 myActiveObjects(aStoredObject)->SetDecomposition(aStatus);
350 Process(aStoredObject);
353 //=======================================================================
356 //=======================================================================
358 void AIS_LocalContext::Clear(const AIS_ClearMode aType)
365 while(!myListOfStandardMode.IsEmpty())
366 DeactivateStandardMode(AIS_Shape::SelectionType(myListOfStandardMode.Last()));
369 case AIS_CM_Interactive:
375 case AIS_CM_StandardModes:
377 while(!myListOfStandardMode.IsEmpty())
378 DeactivateStandardMode(AIS_Shape::SelectionType(myListOfStandardMode.Last()));
381 case AIS_CM_TemporaryShapePrs:
385 //=======================================================================
386 //function : ActivateMode
388 //=======================================================================
390 void AIS_LocalContext::ActivateMode(const Handle(AIS_InteractiveObject)& aSelectable,
391 const Standard_Integer aMode)
393 if(!myActiveObjects.IsBound(aSelectable)) return;
394 // if(myActiveObjects(aSelectable)->SelectionMode()!=aMode)
395 // mySM->Deactivate(aSelectable,aMode,myMainVS);
397 myActiveObjects(aSelectable)->AddSelectionMode(aMode);
398 mySM->Activate(aSelectable,aMode,myMainVS);
401 //=======================================================================
402 //function : ActivateMode
404 //=======================================================================
406 void AIS_LocalContext::DeactivateMode(const Handle(AIS_InteractiveObject)& aSelectable,
407 const Standard_Integer aMode)
409 if(!myActiveObjects.IsBound(aSelectable)) return;
411 if(aMode==-1) return;
413 myActiveObjects(aSelectable)->RemoveSelectionMode(aMode);
414 mySM->Deactivate(aSelectable,aMode,myMainVS);
416 //=======================================================================
417 //function : ActivateMode
419 //=======================================================================
421 void AIS_LocalContext::Deactivate(const Handle(AIS_InteractiveObject)& aSelectable)
423 if(!myActiveObjects.IsBound(aSelectable)) return;
425 mySM->Deactivate(aSelectable, -1, myMainVS);
426 myActiveObjects(aSelectable)->ClearSelectionModes();
429 //=======================================================================
432 //=======================================================================
434 Standard_Boolean AIS_LocalContext::Remove(const Handle(AIS_InteractiveObject)& aSelectable)
436 if(!myActiveObjects.IsBound (aSelectable))
438 return Standard_False;
441 if (IsSelected (aSelectable))
443 AddOrRemoveSelected (aSelectable, Standard_False);
446 const Handle(AIS_LocalStatus)& Att = myActiveObjects (aSelectable);
448 TColStd_ListIteratorOfListOfInteger It;
450 // Deactivate standard modes
451 if (Att->Decomposed())
453 for (It.Initialize (myListOfStandardMode); It.More(); It.Next())
455 mySM->Deactivate (aSelectable, It.Value(), myMainVS);
459 // If object or temporary presentations
460 if (Att->IsTemporary())
462 if (Att->IsSubIntensityOn())
464 myMainPM->Unhighlight (aSelectable, Att->HilightMode());
467 myMainPM->Erase (aSelectable, Att->DisplayMode());
468 myMainPM->Clear (aSelectable, Att->DisplayMode());
469 if (myMainPM->IsDisplayed (aSelectable, Att->HilightMode()))
471 myMainPM->Erase (aSelectable, Att->HilightMode());
474 // If subintensity used
475 else if (Att->IsSubIntensityOn())
477 myCTX->SubIntensityOff (aSelectable);
480 // Deactivate stored selection modes
481 for (It.Initialize (Att->SelectionModes()); It.More(); It.Next())
483 mySM->Deactivate (aSelectable, It.Value(), myMainVS);
486 // Remove the interactive object from selection manager
487 const Handle(SelectMgr_SelectableObject)& anObj = aSelectable; // to avoid ambiguity
488 if (mySM->Contains (anObj))
490 mySM->Remove (anObj);
492 ClearOutdatedSelection (aSelectable, Standard_True);
494 // This should be done at the very end because most methods use
495 // myActiveObjects even during clean-up
496 myActiveObjects.UnBind (aSelectable);
497 return Standard_True;
500 //=======================================================================
501 //function : ActivateStandardMode
503 //=======================================================================
505 void AIS_LocalContext::ActivateStandardMode(const TopAbs_ShapeEnum aType)
508 //check if it is not in the list
509 TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
510 for(;It.More();It.Next())
511 if(It.Value()==aType) return;
512 Standard_Integer IMode = AIS_Shape::SelectionMode(aType);
515 // create a hidden filter answering ok to the type except for :
516 // if the type is shape...
517 // if the filters already impact at the type <aType>
518 if(aType != TopAbs_SHAPE){
519 if(myStdFilters[IMode].IsNull())
520 myStdFilters[IMode] = new StdSelect_ShapeTypeFilter(aType);
521 if(!HasFilters(aType))
522 myFilters->Add(myStdFilters[IMode]);
525 // the mode is activated for all objects of type Shape
526 // accepting the decomposition in standard mode.
527 myListOfStandardMode.Append(IMode);
529 AIS_DataMapIteratorOfDataMapOfSelStat ItM(myActiveObjects);
531 for(;ItM.More();ItM.Next()){
532 if(ItM.Value()->Decomposed())
533 myCTX->SelectionManager()->Activate(ItM.Key(),
540 //=======================================================================
541 //function : DeActivateStandardMode
543 //=======================================================================
545 void AIS_LocalContext::DeactivateStandardMode(const TopAbs_ShapeEnum aType)
547 TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
548 Standard_Integer IMode = AIS_Shape::SelectionMode(aType);
549 for(;It.More();It.Next())
550 if(It.Value()==IMode) {
551 AIS_DataMapIteratorOfDataMapOfSelStat ItM(myActiveObjects);
553 for(;ItM.More();ItM.Next()){
554 if(ItM.Value()->Decomposed()){
555 myCTX->SelectionManager()->Deactivate(ItM.Key(),
558 ItM.Value()->RemoveSelectionMode(IMode);
561 myListOfStandardMode.Remove(It);
562 if(myFilters->IsIn(myStdFilters[IMode]))
563 myFilters->Remove(myStdFilters[IMode]);
568 //=======================================================================
569 //function : AddFilter
571 //=======================================================================
573 void AIS_LocalContext::AddFilter(const Handle(SelectMgr_Filter)& aFilter)
575 // it is checked if the filter impacts at the type of active sub-shape
576 // for which a filter of type has been already implemented...
578 TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
580 for(;It.More();It.Next()){
581 if(aFilter->ActsOn(AIS_Shape::SelectionType(It.Value())))
582 if(myFilters->IsIn(myStdFilters[It.Value()]))
583 myFilters->Remove(myStdFilters[It.Value()]);
585 myFilters->Add(aFilter);
588 //=======================================================================
589 //function : RemoveFilter
591 //=======================================================================
593 void AIS_LocalContext::RemoveFilter(const Handle(SelectMgr_Filter)& aFilter)
595 if(myFilters->IsIn(aFilter)) myFilters->Remove(aFilter);
597 // it is checked if the filter for type standard is active.
598 // if yes, it is checked there are still similarities among the
599 // remaining filters...
600 // otherwise, the standard filter is restored to
601 // continu selecting active modes...
602 TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
604 for(;It.More();It.Next()){
605 SE = AIS_Shape::SelectionType(It.Value());
606 if(aFilter->ActsOn(SE))
608 myFilters->Add(myStdFilters[It.Value()]);
612 //=======================================================================
613 //function : Terminate
615 //=======================================================================
617 void AIS_LocalContext::Terminate (const Standard_Boolean theToUpdate)
621 myMapOfOwner->Clear();
624 // clear the selector...
628 AIS_Selection::SetCurrentSelection(mySelName.ToCString());
629 Handle(AIS_Selection) S = AIS_Selection::CurrentSelection();
630 Handle(Standard_Transient) Tr;
631 for(S->Init();S->More();S->Next()){
633 Handle(SelectMgr_EntityOwner)::DownCast (Tr)->SetSelected (Standard_False);
637 AIS_Selection::Select();
638 AIS_Selection::Remove(mySelName.ToCString());
640 Handle(V3d_View) aDummyView;
641 myMainVS->ClearSensitive (aDummyView);
645 myCTX->UpdateCurrentViewer();
650 //=======================================================================
651 //function : SubIntensity
653 //=======================================================================
655 void AIS_LocalContext::SubIntensityOn(const Handle(AIS_InteractiveObject)& anObject)
657 if(!myActiveObjects.IsBound(anObject)) return;
659 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
661 if(Att->IsTemporary())
662 myMainPM->Color(anObject,myCTX->SubIntensityColor(),Att->DisplayMode());
664 Att->SubIntensityOn();
666 //=======================================================================
667 //function : SubIntensity
669 //=======================================================================
671 void AIS_LocalContext::SubIntensityOff(const Handle(AIS_InteractiveObject)& anObject)
673 if(!myActiveObjects.IsBound(anObject)) return;
675 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
677 if(Att->IsTemporary())
678 myMainPM->Unhighlight(anObject);
679 Att->SubIntensityOff();
683 //=======================================================================
686 //=======================================================================
688 void AIS_LocalContext::Hilight(const Handle(AIS_InteractiveObject)& anObject)
690 if(!myActiveObjects.IsBound(anObject)){
691 Standard_Integer HiMod = anObject->HasHilightMode()? anObject->HilightMode() : 0;
692 Handle(AIS_LocalStatus) Att = new AIS_LocalStatus(Standard_True,
695 myActiveObjects.Bind(anObject,Att);
698 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
699 myMainPM->Color(anObject,myCTX->HilightColor(),Att->HilightMode());
700 Att->SubIntensityOn();
702 //=======================================================================
705 //=======================================================================
707 void AIS_LocalContext::Hilight(const Handle(AIS_InteractiveObject)& anObject,
708 const Quantity_NameOfColor Col)
710 if(!myActiveObjects.IsBound(anObject)){
711 Standard_Integer HiMod = anObject->HasHilightMode()? anObject->HilightMode() : 0;
712 Handle(AIS_LocalStatus) Att = new AIS_LocalStatus(Standard_True,
715 myActiveObjects.Bind(anObject,Att);
718 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
719 myMainPM->Color(anObject,Col,Att->HilightMode());
720 Att->SubIntensityOn();
721 Att->SetHilightColor(Col);
724 //=======================================================================
725 //function : Unhilight
727 //=======================================================================
729 void AIS_LocalContext::Unhilight(const Handle(AIS_InteractiveObject)& anObject)
731 if(!myActiveObjects.IsBound(anObject)) return;
733 // chieck if by hazard the object is somewhere else...
734 Standard_Integer Indx;
735 Standard_Boolean IsSomeWhereElse =
736 myCTX->IsInLocal(anObject,Indx) && Indx != myCTX->IndexOfCurrentLocal();
738 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
739 myMainPM->Unhighlight(anObject,Att->HilightMode());
740 if(Att->IsTemporary() && Att->DisplayMode()==-1)
742 myMainPM->SetVisibility (anObject, Att->HilightMode(), Standard_False);
744 Att->SubIntensityOff();
745 Att->SetHilightColor(Quantity_NOC_WHITE);
749 //=======================================================================
752 //=======================================================================
754 Standard_Boolean AIS_LocalContext::
755 IsIn(const Handle(AIS_InteractiveObject)& anObject) const
757 return myActiveObjects.IsBound(anObject);
760 //=======================================================================
761 //function : IsHilighted
763 //=======================================================================
765 Standard_Boolean AIS_LocalContext::IsHilighted(const Handle(AIS_InteractiveObject)& anObject) const
767 if(!myActiveObjects.IsBound(anObject)) return Standard_False;
768 return myActiveObjects(anObject)->IsSubIntensityOn();
771 Standard_Boolean AIS_LocalContext::IsHilighted(const Handle(AIS_InteractiveObject)& anObject,
772 Standard_Boolean& WithColor,
773 Quantity_NameOfColor& HiCol) const
775 if(!myActiveObjects.IsBound(anObject)) return Standard_False;
776 if( myActiveObjects(anObject)->IsSubIntensityOn()){
777 HiCol = myActiveObjects(anObject)->HilightColor();
778 if(HiCol==Quantity_NOC_WHITE)
779 WithColor = Standard_True;
781 WithColor = Standard_False;
782 return Standard_True;
784 return Standard_False;
788 void AIS_LocalContext::SetDisplayPriority(const Handle(AIS_InteractiveObject)& anObject,
789 const Standard_Integer Prior)
791 if(!myActiveObjects.IsBound(anObject)) return;
792 const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anObject);
793 if(STAT->DisplayMode()==-1) return;
794 myMainPM->SetDisplayPriority(anObject,STAT->DisplayMode(),Prior);
795 if(STAT->IsSubIntensityOn())
796 myMainPM->SetDisplayPriority(anObject,STAT->HilightMode(),Prior);
801 //=======================================================================
802 //function : DisplayedObjects
804 //=======================================================================
805 Standard_Integer AIS_LocalContext::DisplayedObjects(TColStd_MapOfTransient& theMap) const
807 Standard_Integer NbDisp(0);
808 for(AIS_DataMapIteratorOfDataMapOfSelStat it(myActiveObjects);it.More();it.Next()){
809 const Handle(SelectMgr_SelectableObject)& SO = it.Key();
810 if(!theMap.Contains(SO))
811 if(it.Value()->DisplayMode()!=-1){
820 //=======================================================================
821 //function : IsDisplayed
823 //=======================================================================
825 Standard_Boolean AIS_LocalContext::IsDisplayed(const Handle(AIS_InteractiveObject)& anObject) const
827 if(!myActiveObjects.IsBound(anObject)) return Standard_False;
828 return (myActiveObjects(anObject)->DisplayMode()!=-1);
831 //=======================================================================
832 //function : IsDisplayed
834 //=======================================================================
836 Standard_Boolean AIS_LocalContext::IsDisplayed(const Handle(AIS_InteractiveObject)& anObject,
837 const Standard_Integer aMode) const
839 if(!myActiveObjects.IsBound(anObject)) return Standard_False;
840 return (myActiveObjects(anObject)->DisplayMode()==aMode);
843 //=======================================================================
844 //function : SelectionModes
846 //=======================================================================
848 const TColStd_ListOfInteger& AIS_LocalContext::
849 SelectionModes(const Handle(AIS_InteractiveObject)& anObject) const
851 return myActiveObjects(anObject)->SelectionModes();
854 //=======================================================================
857 //=======================================================================
859 TCollection_AsciiString AIS_LocalContext::Status() const
861 TCollection_AsciiString t;
865 const Handle(AIS_LocalStatus)& AIS_LocalContext::Status(const Handle(AIS_InteractiveObject)& anObject) const
867 return myActiveObjects(anObject);
870 //=======================================================================
871 //function : LoadContextObjects
873 //=======================================================================
875 void AIS_LocalContext::LoadContextObjects()
877 AIS_ListIteratorOfListOfInteractive It;
878 if(myLoadDisplayed) {
879 AIS_ListOfInteractive LL;
880 myCTX->DisplayedObjects(LL,Standard_True);
881 Handle(AIS_LocalStatus) Att;
882 for (It.Initialize(LL);It.More();It.Next()){
883 const Handle(AIS_InteractiveObject)& anObj = It.Value();
884 Att= new AIS_LocalStatus();
885 Att->SetDecomposition((anObj->AcceptShapeDecomposition() && myAcceptStdMode));
886 Att->SetTemporary(Standard_False);
887 Att->SetHilightMode(anObj->HasHilightMode()? anObj->HilightMode(): 0);
888 for (anObj->Init(); anObj->More(); anObj->Next())
890 const Handle(SelectMgr_Selection)& aSel = anObj->CurrentSelection();
891 aSel->SetSelectionState (SelectMgr_SOS_Deactivated);
893 myActiveObjects.Bind(anObj,Att);
898 void AIS_LocalContext::UnloadContextObjects()
900 AIS_ListIteratorOfListOfInteractive It;
903 AIS_ListOfInteractive LL;
904 myCTX->DisplayedObjects(LL,Standard_True);
906 for (It.Initialize(LL);It.More();It.Next())
908 myActiveObjects.UnBind(It.Value());
912 //=======================================================================
915 //=======================================================================
917 void AIS_LocalContext::Process(const Handle(SelectMgr_SelectableObject)& anObject)
919 if(!myActiveObjects.IsBound(anObject)) return;
920 if(myActiveObjects(anObject)->Decomposed())
921 ActivateStandardModes(anObject);
924 TColStd_ListIteratorOfListOfInteger It(myActiveObjects(anObject)->SelectionModes());
925 for(;It.More();It.Next())
926 myCTX->SelectionManager()->Activate(anObject,It.Value(),myMainVS);
930 //=======================================================================
933 //=======================================================================
935 void AIS_LocalContext::Process()
940 AIS_DataMapIteratorOfDataMapOfSelStat It(myActiveObjects);
942 for(;It.More();It.Next()){
943 myCTX->SelectionManager()->Load(It.Key(),myMainVS);
944 if(It.Value()->Decomposed())
945 ActivateStandardModes(It.Key());
946 else if( myCTX->GetAutoActivateSelection() )
948 It.Value()->AddSelectionMode(0);
949 myCTX->SelectionManager()->Activate(It.Key(),0,myMainVS);
955 //=======================================================================
956 //function : ActivateModes
958 //=======================================================================
960 void AIS_LocalContext::ActivateStandardModes(const Handle(SelectMgr_SelectableObject)& anObject)
962 if(!myActiveObjects.IsBound(anObject)) return;
964 TColStd_ListIteratorOfListOfInteger itl (myListOfStandardMode);
966 const Handle(AIS_LocalStatus)& LS = myActiveObjects(anObject);
967 if(LS->Decomposed()){
968 for(;itl.More();itl.Next()){
969 myCTX->SelectionManager()->Activate(anObject,itl.Value(),myMainVS);
970 LS->AddSelectionMode(itl.Value());
976 //=======================================================================
977 //function : ClearObjects
979 //=======================================================================
981 void AIS_LocalContext::ClearObjects()
983 AIS_DataMapIteratorOfDataMapOfSelStat It(myActiveObjects);
984 for(;It.More();It.Next())
986 Handle(AIS_InteractiveObject) SO =
987 Handle(AIS_InteractiveObject)::DownCast(It.Key());
989 const Handle(AIS_LocalStatus)& CurAtt = It.Value();
990 //TColStd_ListIteratorOfListOfInteger ItL;
991 // if object is temporary the presentations managed by myMainPM are removed
992 AIS_DisplayStatus TheDS = myCTX->DisplayStatus(SO);
994 if(TheDS != AIS_DS_Displayed){
995 if(myMainPM->IsDisplayed(SO,CurAtt->DisplayMode())){
996 if(CurAtt->IsSubIntensityOn()&&
997 myMainPM->IsHighlighted(SO,CurAtt->HilightMode()))
998 myMainPM->Unhighlight(SO,CurAtt->HilightMode());
999 myMainPM->Erase(SO,CurAtt->DisplayMode());
1002 if(CurAtt->IsTemporary()){
1003 myMainPM->Erase(SO,CurAtt->DisplayMode());}
1004 // myMainPM->Clear(SO,CurAtt->DisplayMode());}
1007 if (CurAtt->IsSubIntensityOn()){
1008 myCTX->SubIntensityOff(Handle(AIS_InteractiveObject)::DownCast(SO));}
1009 Standard_Integer DiMo = SO->HasDisplayMode()?
1010 SO->DisplayMode():myCTX->DisplayMode();
1011 if(CurAtt->DisplayMode()!=-1 &&
1012 CurAtt->DisplayMode()!= DiMo)
1013 myMainPM->Erase(SO,CurAtt->DisplayMode());
1016 TColStd_ListIteratorOfListOfInteger aSelModeIter (CurAtt->SelectionModes());
1017 for ( ; aSelModeIter.More(); aSelModeIter.Next())
1019 Standard_Integer aSelMode = aSelModeIter.Value();
1020 mySM->Deactivate (SO, aSelMode, myMainVS);
1024 ClearSelected( Standard_False );
1026 // Clear selection structures for temporary objects, created in local context
1027 for (AIS_DataMapIteratorOfDataMapOfSelStat anIter (myActiveObjects); anIter.More(); anIter.Next())
1029 if (anIter.Value()->IsTemporary())
1031 mySM->Remove (anIter.Key(), myMainVS);
1035 myActiveObjects.Clear();
1039 Standard_Boolean AIS_LocalContext::IsDecompositionOn() const
1040 {return !myListOfStandardMode.IsEmpty();}
1045 //=======================================================================
1046 //function : HasAlreadyFilters
1048 //=======================================================================
1050 Standard_Boolean AIS_LocalContext::
1051 HasFilters(const TopAbs_ShapeEnum aType) const
1053 return myFilters->ActsOn(aType);
1056 void AIS_LocalContext::ClearDetected()
1058 for(Standard_Integer I=1;I<=myMapOfOwner->Extent();I++)
1060 if(!myMapOfOwner->FindKey (I).IsNull())
1062 if(myMapOfOwner->FindKey (I)->IsHilighted(myMainPM))
1063 myMapOfOwner->FindKey (I)->Unhilight(myMainPM);
1066 const Handle(SelectMgr_SelectableObject)& SO =
1067 myMapOfOwner->FindKey (I)->Selectable();
1068 if(myActiveObjects.IsBound(SO))
1070 const Handle(AIS_LocalStatus)& Att = myActiveObjects(SO);
1072 if(Att->IsTemporary() &&
1073 Att->DisplayMode()==-1 &&
1074 Att->SelectionModes().IsEmpty())
1076 myMapOfOwner->FindKey (I)->Clear(myMainPM);
1084 //=======================================================================
1085 //function : BeginImmediateDraw
1087 //=======================================================================
1088 Standard_Boolean AIS_LocalContext::BeginImmediateDraw()
1090 if (myMainPM->IsImmediateModeOn())
1092 myMainPM->BeginImmediateDraw();
1093 return Standard_True;
1095 return Standard_False;
1098 //=======================================================================
1099 //function : ImmediateAdd
1101 //=======================================================================
1102 Standard_Boolean AIS_LocalContext::ImmediateAdd (const Handle(AIS_InteractiveObject)& theObj,
1103 const Standard_Integer theMode)
1105 if (!myMainPM->IsImmediateModeOn())
1107 return Standard_False;
1110 myMainPM->AddToImmediateList (myMainPM->Presentation (theObj, theMode)->Presentation());
1111 return Standard_True;
1114 //=======================================================================
1115 //function : EndImmediateDraw
1117 //=======================================================================
1118 Standard_Boolean AIS_LocalContext::EndImmediateDraw (const Handle(V3d_Viewer)& theViewer)
1120 if (!myMainPM->IsImmediateModeOn())
1122 return Standard_False;
1125 myMainPM->EndImmediateDraw (theViewer);
1126 return Standard_True;
1129 // =======================================================================
1130 // function : ClearImmediateDraw
1132 // =======================================================================
1133 void AIS_LocalContext::ClearImmediateDraw()
1135 myMainPM->ClearImmediateDraw();
1138 //=======================================================================
1139 //function : IsImmediateModeOn
1141 //=======================================================================
1142 Standard_Boolean AIS_LocalContext::IsImmediateModeOn() const
1144 return myMainPM->IsImmediateModeOn();
1147 void AIS_LocalContext::SetPixelTolerance(const Standard_Integer aPrecision) {
1149 myMainVS->SetPixelTolerance(aPrecision);
1152 Standard_Integer AIS_LocalContext::PixelTolerance() const {
1154 return myMainVS->PixelTolerance();