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,MMgt_TShared)
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()),
83 // bind self to AIS_InteractiveContext::myLocalContexts. Further, the
84 // constructor executes logic that implies that the context is already
85 // created and mapped.
86 aCtx->myLocalContexts.Bind (Index, this);
88 myMainVS->ResetSelectionActivationStatus();
89 myMainPM = aCtx->MainPrsMgr();
92 if(myLoadDisplayed) LoadContextObjects();
98 //=======================================================================
99 //function : SetContext
101 //=======================================================================
103 void AIS_LocalContext::SetContext(const Handle(AIS_InteractiveContext)& aCtx)
106 //=======================================================================
109 //=======================================================================
111 Standard_Boolean AIS_LocalContext::Display(const Handle(AIS_InteractiveObject)& anInteractive,
112 const Standard_Integer WhichMode,
113 const Standard_Boolean AllowShapeDecomposition,
114 const Standard_Integer ActivationMode)
116 if(myActiveObjects.IsBound(anInteractive)){
117 const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anInteractive);
119 if(STAT->DisplayMode() == -1){
120 if(!myMainPM->IsDisplayed(anInteractive,WhichMode))
121 myMainPM->Display(anInteractive,WhichMode);
122 if(STAT->IsTemporary())
123 STAT->SetDisplayMode(WhichMode);
125 else if(STAT->DisplayMode()!=WhichMode && STAT->IsTemporary()){
126 myMainPM->Erase(anInteractive,STAT->DisplayMode());
127 STAT->SetDisplayMode(WhichMode);
128 if(!myMainPM->IsDisplayed(anInteractive,WhichMode))
129 myMainPM->Display(anInteractive,WhichMode);
132 if(ActivationMode!=-1){
133 if(!STAT->IsActivated(ActivationMode)){
134 STAT->ClearSelectionModes();
135 mySM->Load(anInteractive,myMainVS);
136 STAT->AddSelectionMode(ActivationMode);
137 mySM->Activate(anInteractive,ActivationMode,myMainVS);
142 Handle(AIS_LocalStatus) Att = new AIS_LocalStatus();
144 if(anInteractive->AcceptShapeDecomposition() && AllowShapeDecomposition)
145 Att->SetDecomposition(Standard_True);
147 Att->SetDecomposition(Standard_False);
148 // status temporary or not
149 if(myCTX->DisplayStatus(anInteractive) == AIS_DS_None ||
150 myCTX->DisplayStatus(anInteractive) == AIS_DS_Temporary)
151 Att->SetTemporary(Standard_True);
153 Att->SetTemporary(Standard_False);
157 if(!myCTX->IsDisplayed(anInteractive,WhichMode)){
159 //storing information....
160 Att->SetDisplayMode(WhichMode);
161 if (ActivationMode!=-1)
162 Att->AddSelectionMode(ActivationMode);
163 Standard_Integer HiMod = anInteractive->HasHilightMode()? anInteractive->HilightMode(): WhichMode;
164 Att->SetHilightMode(HiMod);
166 if(!myMainPM->IsDisplayed(anInteractive,WhichMode))
167 myMainPM->Display(anInteractive,WhichMode);
169 if(ActivationMode!=-1){
170 mySM->Load(anInteractive,myMainVS);
171 mySM->Activate(anInteractive,ActivationMode,myMainVS);
175 Standard_Integer HiMod = anInteractive->HasHilightMode()? anInteractive->HilightMode(): WhichMode;
176 Att->SetHilightMode(HiMod);
178 myActiveObjects.Bind(anInteractive,Att);
180 Process(anInteractive);
185 return Standard_True;
188 //=======================================================================
191 //=======================================================================
193 Standard_Boolean AIS_LocalContext::
194 Load(const Handle(AIS_InteractiveObject)& anInteractive,
195 const Standard_Boolean AllowShapeDecomposition,
196 const Standard_Integer ActivationMode)
198 if (myActiveObjects.IsBound (anInteractive))
200 if (anInteractive->HasSelection (ActivationMode))
202 const Handle(SelectMgr_Selection)& aSel = anInteractive->Selection (ActivationMode);
203 if (aSel->GetSelectionState() != SelectMgr_SOS_Activated)
205 if (!myMainVS->Contains (anInteractive))
207 mySM->Load (anInteractive, myMainVS);
209 mySM->Activate (anInteractive, ActivationMode, myMainVS);
210 return Standard_True;
213 return Standard_False;
216 Handle(AIS_LocalStatus) Att = new AIS_LocalStatus();
218 if(anInteractive->AcceptShapeDecomposition() && AllowShapeDecomposition)
219 Att->SetDecomposition(Standard_True);
221 Att->SetDecomposition(Standard_False);
223 if(!myCTX->IsDisplayed(anInteractive))
224 Att->SetTemporary(Standard_True);
226 Att->SetTemporary(Standard_False);
227 Att->SetDisplayMode(-1);
229 //storing information....
230 if(ActivationMode!=-1)
231 Att->AddSelectionMode(ActivationMode);
232 Standard_Integer HiMod = anInteractive->HasHilightMode()? anInteractive->HilightMode():0;
233 Att->SetHilightMode(HiMod);
236 mySM->Load(anInteractive,myMainVS);
237 if(ActivationMode != -1){
238 mySM->Activate(anInteractive,ActivationMode,myMainVS);
240 myActiveObjects.Bind(anInteractive,Att);
241 Process(anInteractive);
242 return Standard_True;
245 //=======================================================================
246 //function : ClearPrs
248 //=======================================================================
250 Standard_Boolean AIS_LocalContext::
251 ClearPrs(const Handle(AIS_InteractiveObject)& anInteractive,
252 const Standard_Integer aMode)
254 if(!myActiveObjects.IsBound(anInteractive))
255 return Standard_False;
257 Standard_Boolean jobdone(Standard_False);
258 const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anInteractive);
261 if(STAT->IsSubIntensityOn()) {
262 STAT->SubIntensityOff();
263 if(STAT->HilightMode()==aMode)
264 myMainPM->Unhighlight(anInteractive,STAT->HilightMode());
266 myMainPM->Clear(anInteractive,aMode); // correction connexions 23/09/97
267 jobdone = Standard_True;
268 if(STAT->DisplayMode()==aMode)
269 STAT->SetDisplayMode(-1);
272 //=======================================================================
275 //=======================================================================
277 Standard_Boolean AIS_LocalContext::
278 Erase(const Handle(AIS_InteractiveObject)& anInteractive)
280 if(!myActiveObjects.IsBound(anInteractive))
281 return Standard_False;
282 const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anInteractive);
285 if(STAT->IsSubIntensityOn()) {
286 STAT->SubIntensityOff();
287 myMainPM->Unhighlight(anInteractive,STAT->HilightMode());
290 Standard_Boolean status(Standard_False);
292 if(STAT->DisplayMode()!=-1) {
293 if(IsSelected(anInteractive))
294 AddOrRemoveSelected(anInteractive);
295 if(myMainPM->IsHighlighted(anInteractive,STAT->HilightMode()))
296 myMainPM->Unhighlight(anInteractive,STAT->HilightMode());
297 myMainPM->SetVisibility (anInteractive, STAT->DisplayMode(), Standard_False);
298 STAT->SetDisplayMode(-1);
299 status = Standard_True;
301 if(STAT->IsTemporary()){
302 if(myMainPM->IsDisplayed(anInteractive,STAT->HilightMode()))
303 myMainPM->SetVisibility (anInteractive, STAT->HilightMode(), Standard_False);
306 // Deactivate selectable entities of interactive object
307 const Handle(SelectMgr_SelectableObject)& anObj = anInteractive; // to avoid ambiguity
308 if (mySM->Contains (anObj))
310 while (!STAT->SelectionModes().IsEmpty())
312 mySM->Deactivate (anInteractive, STAT->SelectionModes().Last(), myMainVS);
313 STAT->RemoveSelectionMode (STAT->SelectionModes().Last());
317 ClearOutdatedSelection (anInteractive, Standard_True);
323 //=======================================================================
324 //function : SetShapeDecomposition
326 //=======================================================================
328 void AIS_LocalContext::SetShapeDecomposition(const Handle(AIS_InteractiveObject)& aStoredObject,
329 const Standard_Boolean aStatus)
331 if(!myActiveObjects.IsBound(aStoredObject)) return;
333 if(aStatus == myActiveObjects(aStoredObject)->Decomposed())
336 myActiveObjects(aStoredObject)->SetDecomposition(aStatus);
338 Process(aStoredObject);
341 //=======================================================================
344 //=======================================================================
346 void AIS_LocalContext::Clear(const AIS_ClearMode aType)
353 while(!myListOfStandardMode.IsEmpty())
354 DeactivateStandardMode(AIS_Shape::SelectionType(myListOfStandardMode.Last()));
357 case AIS_CM_Interactive:
363 case AIS_CM_StandardModes:
365 while(!myListOfStandardMode.IsEmpty())
366 DeactivateStandardMode(AIS_Shape::SelectionType(myListOfStandardMode.Last()));
369 case AIS_CM_TemporaryShapePrs:
373 //=======================================================================
374 //function : ActivateMode
376 //=======================================================================
378 void AIS_LocalContext::ActivateMode(const Handle(AIS_InteractiveObject)& aSelectable,
379 const Standard_Integer aMode)
381 if(!myActiveObjects.IsBound(aSelectable)) return;
382 // if(myActiveObjects(aSelectable)->SelectionMode()!=aMode)
383 // mySM->Deactivate(aSelectable,aMode,myMainVS);
385 myActiveObjects(aSelectable)->AddSelectionMode(aMode);
386 mySM->Activate(aSelectable,aMode,myMainVS);
389 //=======================================================================
390 //function : ActivateMode
392 //=======================================================================
394 void AIS_LocalContext::DeactivateMode(const Handle(AIS_InteractiveObject)& aSelectable,
395 const Standard_Integer aMode)
397 if(!myActiveObjects.IsBound(aSelectable)) return;
399 if(aMode==-1) return;
401 myActiveObjects(aSelectable)->RemoveSelectionMode(aMode);
402 mySM->Deactivate(aSelectable,aMode,myMainVS);
404 //=======================================================================
405 //function : ActivateMode
407 //=======================================================================
409 void AIS_LocalContext::Deactivate(const Handle(AIS_InteractiveObject)& aSelectable)
411 if(!myActiveObjects.IsBound(aSelectable)) return;
413 mySM->Deactivate(aSelectable, -1, myMainVS);
414 myActiveObjects(aSelectable)->ClearSelectionModes();
417 //=======================================================================
420 //=======================================================================
422 Standard_Boolean AIS_LocalContext::Remove(const Handle(AIS_InteractiveObject)& aSelectable)
424 if(!myActiveObjects.IsBound (aSelectable))
426 return Standard_False;
429 if (IsSelected (aSelectable))
431 AddOrRemoveSelected (aSelectable, Standard_False);
434 const Handle(AIS_LocalStatus)& Att = myActiveObjects (aSelectable);
436 TColStd_ListIteratorOfListOfInteger It;
438 // Deactivate standard modes
439 if (Att->Decomposed())
441 for (It.Initialize (myListOfStandardMode); It.More(); It.Next())
443 mySM->Deactivate (aSelectable, It.Value(), myMainVS);
447 // If object or temporary presentations
448 if (Att->IsTemporary())
450 if (Att->IsSubIntensityOn())
452 myMainPM->Unhighlight (aSelectable, Att->HilightMode());
455 myMainPM->Erase (aSelectable, Att->DisplayMode());
456 if (myMainPM->IsDisplayed (aSelectable, Att->HilightMode()))
458 myMainPM->Erase (aSelectable, Att->HilightMode());
461 // If subintensity used
462 else if (Att->IsSubIntensityOn())
464 myCTX->SubIntensityOff (aSelectable);
467 // Deactivate stored selection modes
468 for (It.Initialize (Att->SelectionModes()); It.More(); It.Next())
470 mySM->Deactivate (aSelectable, It.Value(), myMainVS);
473 // Remove the interactive object from selection manager
474 const Handle(SelectMgr_SelectableObject)& anObj = aSelectable; // to avoid ambiguity
475 if (mySM->Contains (anObj))
477 mySM->Remove (anObj);
479 ClearOutdatedSelection (aSelectable, Standard_True);
481 // This should be done at the very end because most methods use
482 // myActiveObjects even during clean-up
483 myActiveObjects.UnBind (aSelectable);
484 return Standard_True;
487 //=======================================================================
488 //function : ActivateStandardMode
490 //=======================================================================
492 void AIS_LocalContext::ActivateStandardMode(const TopAbs_ShapeEnum aType)
495 //check if it is not in the list
496 TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
497 for(;It.More();It.Next())
498 if(It.Value()==aType) return;
499 Standard_Integer IMode = AIS_Shape::SelectionMode(aType);
502 // create a hidden filter answering ok to the type except for :
503 // if the type is shape...
504 // if the filters already impact at the type <aType>
505 if(aType != TopAbs_SHAPE){
506 if(myStdFilters[IMode].IsNull())
507 myStdFilters[IMode] = new StdSelect_ShapeTypeFilter(aType);
508 if(!HasFilters(aType))
509 myFilters->Add(myStdFilters[IMode]);
512 // the mode is activated for all objects of type Shape
513 // accepting the decomposition in standard mode.
514 myListOfStandardMode.Append(IMode);
516 AIS_DataMapIteratorOfDataMapOfSelStat ItM(myActiveObjects);
518 for(;ItM.More();ItM.Next()){
519 if(ItM.Value()->Decomposed())
520 myCTX->SelectionManager()->Activate(ItM.Key(),
523 ItM.Value()->AddSelectionMode (IMode);
528 //=======================================================================
529 //function : DeActivateStandardMode
531 //=======================================================================
533 void AIS_LocalContext::DeactivateStandardMode(const TopAbs_ShapeEnum aType)
535 TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
536 Standard_Integer IMode = AIS_Shape::SelectionMode(aType);
537 for(;It.More();It.Next())
538 if(It.Value()==IMode) {
539 AIS_DataMapIteratorOfDataMapOfSelStat ItM(myActiveObjects);
541 for(;ItM.More();ItM.Next()){
542 if(ItM.Value()->Decomposed()){
543 myCTX->SelectionManager()->Deactivate(ItM.Key(),
546 ItM.Value()->RemoveSelectionMode(IMode);
549 myListOfStandardMode.Remove(It);
550 if(myFilters->IsIn(myStdFilters[IMode]))
551 myFilters->Remove(myStdFilters[IMode]);
556 //=======================================================================
557 //function : AddFilter
559 //=======================================================================
561 void AIS_LocalContext::AddFilter(const Handle(SelectMgr_Filter)& aFilter)
563 // it is checked if the filter impacts at the type of active sub-shape
564 // for which a filter of type has been already implemented...
566 TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
568 for(;It.More();It.Next()){
569 if(aFilter->ActsOn(AIS_Shape::SelectionType(It.Value())))
570 if(myFilters->IsIn(myStdFilters[It.Value()]))
571 myFilters->Remove(myStdFilters[It.Value()]);
573 myFilters->Add(aFilter);
576 //=======================================================================
577 //function : RemoveFilter
579 //=======================================================================
581 void AIS_LocalContext::RemoveFilter(const Handle(SelectMgr_Filter)& aFilter)
583 if(myFilters->IsIn(aFilter)) myFilters->Remove(aFilter);
585 // it is checked if the filter for type standard is active.
586 // if yes, it is checked there are still similarities among the
587 // remaining filters...
588 // otherwise, the standard filter is restored to
589 // continu selecting active modes...
590 TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
592 for(;It.More();It.Next()){
593 SE = AIS_Shape::SelectionType(It.Value());
594 if(aFilter->ActsOn(SE))
596 myFilters->Add(myStdFilters[It.Value()]);
600 //=======================================================================
601 //function : Terminate
603 //=======================================================================
605 void AIS_LocalContext::Terminate (const Standard_Boolean theToUpdate)
609 myMapOfOwner->Clear();
612 // clear the selector...
615 Handle(Standard_Transient) Tr;
616 for (mySelection->Init(); mySelection->More(); mySelection->Next()){
617 Tr = mySelection->Value();
618 Handle(SelectMgr_EntityOwner)::DownCast (Tr)->SetSelected (Standard_False);
621 mySelection->Select();
623 Handle(V3d_View) aDummyView;
624 myMainVS->ClearSensitive (aDummyView);
628 myCTX->UpdateCurrentViewer();
633 //=======================================================================
634 //function : SubIntensity
636 //=======================================================================
638 void AIS_LocalContext::SubIntensityOn(const Handle(AIS_InteractiveObject)& anObject)
640 if(!myActiveObjects.IsBound(anObject)) return;
642 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
644 if(Att->IsTemporary())
645 myMainPM->Color(anObject,myCTX->SubIntensityColor(),Att->DisplayMode());
647 Att->SubIntensityOn();
649 //=======================================================================
650 //function : SubIntensity
652 //=======================================================================
654 void AIS_LocalContext::SubIntensityOff(const Handle(AIS_InteractiveObject)& anObject)
656 if(!myActiveObjects.IsBound(anObject)) return;
658 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
660 if(Att->IsTemporary())
661 myMainPM->Unhighlight(anObject);
662 Att->SubIntensityOff();
666 //=======================================================================
669 //=======================================================================
671 void AIS_LocalContext::Hilight(const Handle(AIS_InteractiveObject)& anObject)
673 if(!myActiveObjects.IsBound(anObject)){
674 Standard_Integer HiMod = anObject->HasHilightMode()? anObject->HilightMode() : 0;
675 Handle(AIS_LocalStatus) Att = new AIS_LocalStatus(Standard_True,
678 myActiveObjects.Bind(anObject,Att);
681 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
682 myMainPM->Color(anObject,myCTX->HilightColor(),Att->HilightMode());
683 Att->SubIntensityOn();
685 //=======================================================================
688 //=======================================================================
690 void AIS_LocalContext::Hilight(const Handle(AIS_InteractiveObject)& anObject,
691 const Quantity_NameOfColor Col)
693 if(!myActiveObjects.IsBound(anObject)){
694 Standard_Integer HiMod = anObject->HasHilightMode()? anObject->HilightMode() : 0;
695 Handle(AIS_LocalStatus) Att = new AIS_LocalStatus(Standard_True,
698 myActiveObjects.Bind(anObject,Att);
701 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
702 myMainPM->Color(anObject,Col,Att->HilightMode());
703 Att->SubIntensityOn();
704 Att->SetHilightColor(Col);
707 //=======================================================================
708 //function : Unhilight
710 //=======================================================================
712 void AIS_LocalContext::Unhilight(const Handle(AIS_InteractiveObject)& anObject)
714 if(!myActiveObjects.IsBound(anObject)) return;
716 // chieck if by hazard the object is somewhere else...
717 Standard_Integer Indx;
718 Standard_Boolean IsSomeWhereElse =
719 myCTX->IsInLocal(anObject,Indx) && Indx != myCTX->IndexOfCurrentLocal();
721 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
722 myMainPM->Unhighlight(anObject,Att->HilightMode());
723 if(Att->IsTemporary() && Att->DisplayMode()==-1)
725 myMainPM->SetVisibility (anObject, Att->HilightMode(), Standard_False);
727 Att->SubIntensityOff();
728 Att->SetHilightColor(Quantity_NOC_WHITE);
732 //=======================================================================
735 //=======================================================================
737 Standard_Boolean AIS_LocalContext::
738 IsIn(const Handle(AIS_InteractiveObject)& anObject) const
740 return myActiveObjects.IsBound(anObject);
743 //=======================================================================
744 //function : IsHilighted
746 //=======================================================================
748 Standard_Boolean AIS_LocalContext::IsHilighted(const Handle(AIS_InteractiveObject)& anObject) const
750 if(!myActiveObjects.IsBound(anObject)) return Standard_False;
751 return myActiveObjects(anObject)->IsSubIntensityOn();
754 Standard_Boolean AIS_LocalContext::IsHilighted(const Handle(AIS_InteractiveObject)& anObject,
755 Standard_Boolean& WithColor,
756 Quantity_NameOfColor& HiCol) const
758 if(!myActiveObjects.IsBound(anObject)) return Standard_False;
759 if( myActiveObjects(anObject)->IsSubIntensityOn()){
760 HiCol = myActiveObjects(anObject)->HilightColor();
761 if(HiCol==Quantity_NOC_WHITE)
762 WithColor = Standard_True;
764 WithColor = Standard_False;
765 return Standard_True;
767 return Standard_False;
771 void AIS_LocalContext::SetDisplayPriority(const Handle(AIS_InteractiveObject)& anObject,
772 const Standard_Integer Prior)
774 if(!myActiveObjects.IsBound(anObject)) return;
775 const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anObject);
776 if(STAT->DisplayMode()==-1) return;
777 myMainPM->SetDisplayPriority(anObject,STAT->DisplayMode(),Prior);
778 if(STAT->IsSubIntensityOn())
779 myMainPM->SetDisplayPriority(anObject,STAT->HilightMode(),Prior);
784 //=======================================================================
785 //function : DisplayedObjects
787 //=======================================================================
788 Standard_Integer AIS_LocalContext::DisplayedObjects(TColStd_MapOfTransient& theMap) const
790 Standard_Integer NbDisp(0);
791 for(AIS_DataMapIteratorOfDataMapOfSelStat it(myActiveObjects);it.More();it.Next()){
792 const Handle(SelectMgr_SelectableObject)& SO = it.Key();
793 if(!theMap.Contains(SO))
794 if(it.Value()->DisplayMode()!=-1){
803 //=======================================================================
804 //function : IsDisplayed
806 //=======================================================================
808 Standard_Boolean AIS_LocalContext::IsDisplayed(const Handle(AIS_InteractiveObject)& anObject) const
810 if(!myActiveObjects.IsBound(anObject)) return Standard_False;
811 return (myActiveObjects(anObject)->DisplayMode()!=-1);
814 //=======================================================================
815 //function : IsDisplayed
817 //=======================================================================
819 Standard_Boolean AIS_LocalContext::IsDisplayed(const Handle(AIS_InteractiveObject)& anObject,
820 const Standard_Integer aMode) const
822 if(!myActiveObjects.IsBound(anObject)) return Standard_False;
823 return (myActiveObjects(anObject)->DisplayMode()==aMode);
826 //=======================================================================
827 //function : SelectionModes
829 //=======================================================================
831 const TColStd_ListOfInteger& AIS_LocalContext::
832 SelectionModes(const Handle(AIS_InteractiveObject)& anObject) const
834 return myActiveObjects(anObject)->SelectionModes();
837 //=======================================================================
840 //=======================================================================
842 TCollection_AsciiString AIS_LocalContext::Status() const
844 TCollection_AsciiString t;
848 const Handle(AIS_LocalStatus)& AIS_LocalContext::Status(const Handle(AIS_InteractiveObject)& anObject) const
850 return myActiveObjects(anObject);
853 //=======================================================================
854 //function : LoadContextObjects
856 //=======================================================================
858 void AIS_LocalContext::LoadContextObjects()
860 AIS_ListIteratorOfListOfInteractive It;
861 if(myLoadDisplayed) {
862 AIS_ListOfInteractive LL;
863 myCTX->DisplayedObjects(LL,Standard_True);
864 Handle(AIS_LocalStatus) Att;
865 for (It.Initialize(LL);It.More();It.Next()){
866 const Handle(AIS_InteractiveObject)& anObj = It.Value();
867 Att= new AIS_LocalStatus();
868 Att->SetDecomposition((anObj->AcceptShapeDecomposition() && myAcceptStdMode));
869 Att->SetTemporary(Standard_False);
870 Att->SetHilightMode(anObj->HasHilightMode()? anObj->HilightMode(): 0);
871 for (anObj->Init(); anObj->More(); anObj->Next())
873 const Handle(SelectMgr_Selection)& aSel = anObj->CurrentSelection();
874 aSel->SetSelectionState (SelectMgr_SOS_Deactivated);
876 myActiveObjects.Bind(anObj,Att);
881 void AIS_LocalContext::UnloadContextObjects()
883 AIS_ListIteratorOfListOfInteractive It;
886 AIS_ListOfInteractive LL;
887 myCTX->DisplayedObjects(LL,Standard_True);
889 for (It.Initialize(LL);It.More();It.Next())
891 myActiveObjects.UnBind(It.Value());
895 //=======================================================================
898 //=======================================================================
900 void AIS_LocalContext::Process(const Handle(SelectMgr_SelectableObject)& anObject)
902 if(!myActiveObjects.IsBound(anObject)) return;
903 if(myActiveObjects(anObject)->Decomposed())
904 ActivateStandardModes(anObject);
907 TColStd_ListIteratorOfListOfInteger It(myActiveObjects(anObject)->SelectionModes());
908 for(;It.More();It.Next())
909 myCTX->SelectionManager()->Activate(anObject,It.Value(),myMainVS);
913 //=======================================================================
916 //=======================================================================
918 void AIS_LocalContext::Process()
923 AIS_DataMapIteratorOfDataMapOfSelStat It(myActiveObjects);
925 for(;It.More();It.Next()){
926 myCTX->SelectionManager()->Load(It.Key(),myMainVS);
927 if(It.Value()->Decomposed())
928 ActivateStandardModes(It.Key());
929 else if( myCTX->GetAutoActivateSelection() )
931 It.Value()->AddSelectionMode(0);
932 myCTX->SelectionManager()->Activate(It.Key(),0,myMainVS);
938 //=======================================================================
939 //function : ActivateModes
941 //=======================================================================
943 void AIS_LocalContext::ActivateStandardModes(const Handle(SelectMgr_SelectableObject)& anObject)
945 if(!myActiveObjects.IsBound(anObject)) return;
947 TColStd_ListIteratorOfListOfInteger itl (myListOfStandardMode);
949 const Handle(AIS_LocalStatus)& LS = myActiveObjects(anObject);
950 if(LS->Decomposed()){
951 for(;itl.More();itl.Next()){
952 myCTX->SelectionManager()->Activate(anObject,itl.Value(),myMainVS);
953 LS->AddSelectionMode(itl.Value());
959 //=======================================================================
960 //function : ClearObjects
962 //=======================================================================
964 void AIS_LocalContext::ClearObjects()
966 AIS_DataMapIteratorOfDataMapOfSelStat It(myActiveObjects);
967 for(;It.More();It.Next())
969 Handle(AIS_InteractiveObject) SO =
970 Handle(AIS_InteractiveObject)::DownCast(It.Key());
972 const Handle(AIS_LocalStatus)& CurAtt = It.Value();
973 //TColStd_ListIteratorOfListOfInteger ItL;
974 // if object is temporary the presentations managed by myMainPM are removed
975 AIS_DisplayStatus TheDS = myCTX->DisplayStatus(SO);
977 if(TheDS != AIS_DS_Displayed){
978 if(myMainPM->IsDisplayed(SO,CurAtt->DisplayMode())){
979 if(CurAtt->IsSubIntensityOn()&&
980 myMainPM->IsHighlighted(SO,CurAtt->HilightMode()))
981 myMainPM->Unhighlight(SO,CurAtt->HilightMode());
982 myMainPM->Erase(SO,CurAtt->DisplayMode());
985 if(CurAtt->IsTemporary()){
986 myMainPM->Erase(SO,CurAtt->DisplayMode());}
987 // myMainPM->Clear(SO,CurAtt->DisplayMode());}
990 if (CurAtt->IsSubIntensityOn())
992 myCTX->SubIntensityOff(SO);
994 Standard_Integer DiMo = SO->HasDisplayMode()?
995 SO->DisplayMode():myCTX->DisplayMode();
996 if(CurAtt->DisplayMode()!=-1 &&
997 CurAtt->DisplayMode()!= DiMo)
998 myMainPM->Erase(SO,CurAtt->DisplayMode());
1001 TColStd_ListIteratorOfListOfInteger aSelModeIter (CurAtt->SelectionModes());
1002 for ( ; aSelModeIter.More(); aSelModeIter.Next())
1004 Standard_Integer aSelMode = aSelModeIter.Value();
1005 mySM->Deactivate (SO, aSelMode, myMainVS);
1009 ClearSelected( Standard_False );
1011 // Clear selection structures for temporary objects, created in local context
1012 for (AIS_DataMapIteratorOfDataMapOfSelStat anIter (myActiveObjects); anIter.More(); anIter.Next())
1014 if (anIter.Value()->IsTemporary())
1016 mySM->Remove (anIter.Key(), myMainVS);
1020 myActiveObjects.Clear();
1024 Standard_Boolean AIS_LocalContext::IsDecompositionOn() const
1025 {return !myListOfStandardMode.IsEmpty();}
1030 //=======================================================================
1031 //function : HasAlreadyFilters
1033 //=======================================================================
1035 Standard_Boolean AIS_LocalContext::
1036 HasFilters(const TopAbs_ShapeEnum aType) const
1038 return myFilters->ActsOn(aType);
1041 void AIS_LocalContext::ClearDetected()
1043 for(Standard_Integer I=1;I<=myMapOfOwner->Extent();I++)
1045 if(!myMapOfOwner->FindKey (I).IsNull())
1047 if(myMapOfOwner->FindKey (I)->IsHilighted(myMainPM))
1048 myMapOfOwner->FindKey (I)->Unhilight(myMainPM);
1051 const Handle(SelectMgr_SelectableObject)& SO =
1052 myMapOfOwner->FindKey (I)->Selectable();
1053 if(myActiveObjects.IsBound(SO))
1055 const Handle(AIS_LocalStatus)& Att = myActiveObjects(SO);
1057 if(Att->IsTemporary() &&
1058 Att->DisplayMode()==-1 &&
1059 Att->SelectionModes().IsEmpty())
1061 myMapOfOwner->FindKey (I)->Clear(myMainPM);
1069 //=======================================================================
1070 //function : BeginImmediateDraw
1072 //=======================================================================
1073 Standard_Boolean AIS_LocalContext::BeginImmediateDraw()
1075 if (myMainPM->IsImmediateModeOn())
1077 myMainPM->BeginImmediateDraw();
1078 return Standard_True;
1080 return Standard_False;
1083 //=======================================================================
1084 //function : ImmediateAdd
1086 //=======================================================================
1087 Standard_Boolean AIS_LocalContext::ImmediateAdd (const Handle(AIS_InteractiveObject)& theObj,
1088 const Standard_Integer theMode)
1090 if (!myMainPM->IsImmediateModeOn())
1092 return Standard_False;
1095 myMainPM->AddToImmediateList (myMainPM->Presentation (theObj, theMode)->Presentation());
1096 return Standard_True;
1099 //=======================================================================
1100 //function : EndImmediateDraw
1102 //=======================================================================
1103 Standard_Boolean AIS_LocalContext::EndImmediateDraw (const Handle(V3d_Viewer)& theViewer)
1105 if (!myMainPM->IsImmediateModeOn())
1107 return Standard_False;
1110 myMainPM->EndImmediateDraw (theViewer);
1111 return Standard_True;
1114 // =======================================================================
1115 // function : ClearImmediateDraw
1117 // =======================================================================
1118 void AIS_LocalContext::ClearImmediateDraw()
1120 myMainPM->ClearImmediateDraw();
1123 //=======================================================================
1124 //function : IsImmediateModeOn
1126 //=======================================================================
1127 Standard_Boolean AIS_LocalContext::IsImmediateModeOn() const
1129 return myMainPM->IsImmediateModeOn();
1132 void AIS_LocalContext::SetPixelTolerance(const Standard_Integer aPrecision) {
1134 myMainVS->SetPixelTolerance(aPrecision);
1137 Standard_Integer AIS_LocalContext::PixelTolerance() const {
1139 return myMainVS->PixelTolerance();
1142 //=======================================================================
1143 //function : SetSelectionSensitivity
1144 //purpose : Allows to manage sensitivity of a particular selection of interactive object theObject
1145 //=======================================================================
1146 void AIS_LocalContext::SetSelectionSensitivity (const Handle(AIS_InteractiveObject)& theObject,
1147 const Standard_Integer theMode,
1148 const Standard_Integer theNewSensitivity)
1150 mySM->SetSelectionSensitivity (theObject, theMode, theNewSensitivity);