1 // Created on: 1997-01-17
2 // Created by: Robert COUBLANC
3 // Copyright (c) 1997-1999 Matra Datavision
4 // Copyright (c) 1999-2012 OPEN CASCADE SAS
6 // The content of this file is subject to the Open CASCADE Technology Public
7 // License Version 6.5 (the "License"). You may not use the content of this file
8 // except in compliance with the License. Please obtain a copy of the License
9 // at http://www.opencascade.org and read it completely before using this file.
11 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
14 // The Original Code and all software distributed under the License is
15 // distributed on an "AS IS" basis, without warranty of any kind, and the
16 // Initial Developer hereby disclaims all such warranties, including without
17 // limitation, any warranties of merchantability, fitness for a particular
18 // purpose or non-infringement. Please see the License for the specific terms
19 // and conditions governing the rights and limitations under the License.
21 //Modified by ROB : Traque des UpdateConversion intempestifs.
23 #define BUC60688 //GG 25/05/00 Add SetSensitivity() methods.
25 #define BUC60722 //GG_040900 Disable detection on an unviewable object
27 #define IMP160701 //SZV Add InitDetected(),MoreDetected(),NextDetected(),
28 // DetectedCurrentShape(),DetectedCurrentObject()
31 #define ALE70590 //GG Avoid raise especially under W2000-SP2
32 // when opening many local context due to a
33 // system error in the selection name computation routine.
34 // Many thanks to Philippe CARRET for the helpfull he has
35 // give to accelerate the resolution of this problem.
37 #include <AIS_LocalContext.ixx>
38 #include <SelectMgr_OrFilter.hxx>
39 #include <SelectMgr_CompositionFilter.hxx>
40 #include <AIS_LocalStatus.hxx>
41 #include <AIS_Shape.hxx>
42 #include <TColStd_ListIteratorOfListOfInteger.hxx>
43 #include <AIS_ListIteratorOfListOfInteractive.hxx>
44 #include <AIS_ListOfInteractive.hxx>
45 #include <AIS_DataMapIteratorOfDataMapOfSelStat.hxx>
46 #include <TopAbs_ShapeEnum.hxx>
47 #include <Graphic3d_Structure.hxx>
48 #include <Prs3d_LineAspect.hxx>
49 #include <Prs3d_PlaneAspect.hxx>
50 #include <Prs3d_PointAspect.hxx>
51 #include <Prs3d_Presentation.hxx>
52 #include <Aspect_TypeOfMarker.hxx>
53 #include <StdSelect_ShapeTypeFilter.hxx>
54 #include <AIS_Selection.hxx>
55 #include <V3d_Viewer.hxx>
56 #include <V3d_View.hxx>
57 #include <Visual3d_TransientManager.hxx>
58 #include <Visual3d_View.hxx>
63 #include <Standard_SStream.hxx>
66 static TCollection_AsciiString AIS_Local_SelName(const Standard_Address address,
67 const Standard_Integer anIndex)
69 // TCollection_AsciiString SelName;
72 sprintf(string,"%p_%d", address, anIndex); // works under any system
73 TCollection_AsciiString SelName(string);
75 Standard_SStream stream;
76 stream<<address; // something is wrong here using the SStream because
77 // the following access to rdbuf crash for an unknown reason
78 // especially under W2000 with SP2 and sometime under WNT and W98.
79 // NOTE that stream is not ended by a NULL char and it's probably
80 // one of the reasons why this crash.
81 // In any case the resulting ascii string give a wrong and random
82 // name under WINDOWS !
83 TCollection_AsciiString SelName(stream.rdbuf()->str());
84 // SelName = TCollection_AsciiString("AIS_Local_");
85 TCollection_AsciiString theind(anIndex);
93 //=======================================================================
94 //function : AIS_LocalContext
96 //=======================================================================
99 AIS_LocalContext::AIS_LocalContext(){}
101 AIS_LocalContext::AIS_LocalContext(const Handle(AIS_InteractiveContext)& aCtx,
102 const Standard_Integer Index,
103 const Standard_Boolean LoadDisplayed,
104 const Standard_Boolean AcceptStandardModes,
105 const Standard_Boolean AcceptEraseOfTemp,
106 const Standard_Boolean BothViewers):
108 myLoadDisplayed(LoadDisplayed),
109 myAcceptStdMode(AcceptStandardModes),
110 myAcceptErase(AcceptEraseOfTemp),
111 mySM(aCtx->SelectionManager()),
112 myMainVS(new StdSelect_ViewerSelector3d(aCtx->MainSelector()->Projector())),
113 myFilters(new SelectMgr_OrFilter()),
114 myAutoHilight(Standard_True),
122 // bind self to AIS_InteractiveContext::myLocalContexts. Further, the
123 // constructor executes logic that implies that the context is already
124 // created and mapped.
125 aCtx->myLocalContexts.Bind (Index, this);
127 myMainPM = aCtx->MainPrsMgr();
128 mySelName = AIS_Local_SelName(this, Index);
129 AIS_Selection::CreateSelection(mySelName.ToCString());
132 if(myLoadDisplayed) LoadContextObjects();
133 Process(Standard_False);
138 //=======================================================================
139 //function : SetContext
141 //=======================================================================
143 void AIS_LocalContext::SetContext(const Handle(AIS_InteractiveContext)& aCtx)
146 //=======================================================================
149 //=======================================================================
151 Standard_Boolean AIS_LocalContext::Display(const Handle(AIS_InteractiveObject)& anInteractive,
152 const Standard_Integer WhichMode,
153 const Standard_Boolean AllowShapeDecomposition,
154 const Standard_Integer ActivationMode)
156 if(myActiveObjects.IsBound(anInteractive)){
157 const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anInteractive);
159 if(STAT->DisplayMode() == -1){
160 if(!myMainPM->IsDisplayed(anInteractive,WhichMode))
161 myMainPM->Display(anInteractive,WhichMode);
162 if(STAT->IsTemporary())
163 STAT->SetDisplayMode(WhichMode);
165 else if(STAT->DisplayMode()!=WhichMode && STAT->IsTemporary()){
166 myMainPM->Erase(anInteractive,STAT->DisplayMode());
167 STAT->SetDisplayMode(WhichMode);
168 if(!myMainPM->IsDisplayed(anInteractive,WhichMode))
169 myMainPM->Display(anInteractive,WhichMode);
172 if(ActivationMode!=-1){
173 if(!STAT->IsActivated(ActivationMode)){
174 STAT->ClearSelectionModes();
175 mySM->Load(anInteractive,myMainVS);
176 STAT->AddSelectionMode(ActivationMode);
177 mySM->Activate(anInteractive,ActivationMode,myMainVS);
182 Handle(AIS_LocalStatus) Att = new AIS_LocalStatus();
184 if(anInteractive->AcceptShapeDecomposition() && AllowShapeDecomposition)
185 Att->SetDecomposition(Standard_True);
187 Att->SetDecomposition(Standard_False);
188 // status temporary or not
189 if(myCTX->DisplayStatus(anInteractive) == AIS_DS_None ||
190 myCTX->DisplayStatus(anInteractive) == AIS_DS_Temporary)
191 Att->SetTemporary(Standard_True);
193 Att->SetTemporary(Standard_False);
197 if(!myCTX->IsDisplayed(anInteractive,WhichMode)){
199 //storing information....
200 Att->SetDisplayMode(WhichMode);
201 if (ActivationMode!=-1)
202 Att->AddSelectionMode(ActivationMode);
203 Standard_Integer HiMod = anInteractive->HasHilightMode()? anInteractive->HilightMode(): WhichMode;
204 Att->SetHilightMode(HiMod);
206 if(!myMainPM->IsDisplayed(anInteractive,WhichMode))
207 myMainPM->Display(anInteractive,WhichMode);
209 if(ActivationMode!=-1){
210 mySM->Load(anInteractive,myMainVS);
211 mySM->Activate(anInteractive,ActivationMode,myMainVS);
215 Standard_Integer HiMod = anInteractive->HasHilightMode()? anInteractive->HilightMode(): WhichMode;
216 Att->SetHilightMode(HiMod);
218 myActiveObjects.Bind(anInteractive,Att);
220 Process(anInteractive);
225 return Standard_True;
228 //=======================================================================
231 //=======================================================================
233 Standard_Boolean AIS_LocalContext::
234 Load(const Handle(AIS_InteractiveObject)& anInteractive,
235 const Standard_Boolean AllowShapeDecomposition,
236 const Standard_Integer ActivationMode)
238 if(myActiveObjects.IsBound(anInteractive)) return Standard_False;
239 Handle(AIS_LocalStatus) Att = new AIS_LocalStatus();
241 if(anInteractive->AcceptShapeDecomposition() && AllowShapeDecomposition)
242 Att->SetDecomposition(Standard_True);
244 Att->SetDecomposition(Standard_False);
246 if(!myCTX->IsDisplayed(anInteractive))
247 Att->SetTemporary(Standard_True);
249 Att->SetTemporary(Standard_False);
250 Att->SetDisplayMode(-1);
252 //storing information....
253 if(ActivationMode!=-1)
254 Att->AddSelectionMode(ActivationMode);
255 Standard_Integer HiMod = anInteractive->HasHilightMode()? anInteractive->HilightMode():0;
256 Att->SetHilightMode(HiMod);
259 mySM->Load(anInteractive,myMainVS);
260 if(ActivationMode != -1){
261 mySM->Activate(anInteractive,ActivationMode,myMainVS);
263 myActiveObjects.Bind(anInteractive,Att);
264 Process(anInteractive);
265 return Standard_True;
268 //=======================================================================
269 //function : ClearPrs
271 //=======================================================================
273 Standard_Boolean AIS_LocalContext::
274 ClearPrs(const Handle(AIS_InteractiveObject)& anInteractive,
275 const Standard_Integer aMode)
277 if(!myActiveObjects.IsBound(anInteractive))
278 return Standard_False;
280 Standard_Boolean jobdone(Standard_False);
281 const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anInteractive);
284 if(STAT->IsSubIntensityOn()) {
285 STAT->SubIntensityOff();
286 if(STAT->HilightMode()==aMode)
287 myMainPM->Unhighlight(anInteractive,STAT->HilightMode());
289 myMainPM->Clear(anInteractive,aMode); // correction connexions 23/09/97
290 jobdone = Standard_True;
291 if(STAT->DisplayMode()==aMode)
292 STAT->SetDisplayMode(-1);
295 //=======================================================================
298 //=======================================================================
300 Standard_Boolean AIS_LocalContext::
301 Erase(const Handle(AIS_InteractiveObject)& anInteractive)
303 if(!myActiveObjects.IsBound(anInteractive))
304 return Standard_False;
305 const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anInteractive);
308 if(STAT->IsSubIntensityOn()) {
309 STAT->SubIntensityOff();
310 myMainPM->Unhighlight(anInteractive,STAT->HilightMode());
313 Standard_Boolean status(Standard_False);
315 if(STAT->DisplayMode()!=-1) {
316 if(IsSelected(anInteractive))
317 AddOrRemoveSelected(anInteractive);
318 if(myMainPM->IsHighlighted(anInteractive,STAT->HilightMode()))
319 myMainPM->Unhighlight(anInteractive,STAT->HilightMode());
320 myMainPM->Erase(anInteractive,STAT->DisplayMode());
321 STAT->SetDisplayMode(-1);
322 status = Standard_True;
324 if(STAT->IsTemporary()){
325 if(myMainPM->IsDisplayed(anInteractive,STAT->HilightMode()))
326 myMainPM->Erase(anInteractive,STAT->HilightMode());
330 TColStd_ListIteratorOfListOfInteger It(STAT->SelectionModes());
331 for(;It.More();It.Next())
332 mySM->Deactivate(anInteractive,It.Value(),myMainVS);
333 // STAT->ClearSelectionModes();
338 //=======================================================================
339 //function : SetShapeDecomposition
341 //=======================================================================
343 void AIS_LocalContext::SetShapeDecomposition(const Handle(AIS_InteractiveObject)& aStoredObject,
344 const Standard_Boolean aStatus)
346 if(!myActiveObjects.IsBound(aStoredObject)) return;
348 if(aStatus == myActiveObjects(aStoredObject)->Decomposed())
351 myActiveObjects(aStoredObject)->SetDecomposition(aStatus);
353 Process(aStoredObject);
356 //=======================================================================
359 //=======================================================================
361 void AIS_LocalContext::Clear(const AIS_ClearMode aType)
368 while(!myListOfStandardMode.IsEmpty())
369 DeactivateStandardMode(AIS_Shape::SelectionType(myListOfStandardMode.Last()));
372 case AIS_CM_Interactive:
378 case AIS_CM_StandardModes:
380 while(!myListOfStandardMode.IsEmpty())
381 DeactivateStandardMode(AIS_Shape::SelectionType(myListOfStandardMode.Last()));
384 case AIS_CM_TemporaryShapePrs:
389 //=======================================================================
390 //function : ActivateMode
392 //=======================================================================
394 void AIS_LocalContext::ActivateMode(const Handle(AIS_InteractiveObject)& aSelectable,
395 const Standard_Integer aMode)
397 if(!myActiveObjects.IsBound(aSelectable)) return;
398 // if(myActiveObjects(aSelectable)->SelectionMode()!=aMode)
399 // mySM->Deactivate(aSelectable,aMode,myMainVS);
401 myActiveObjects(aSelectable)->AddSelectionMode(aMode);
402 mySM->Activate(aSelectable,aMode,myMainVS);
406 //=======================================================================
407 //function : ActivateMode
409 //=======================================================================
411 void AIS_LocalContext::DeactivateMode(const Handle(AIS_InteractiveObject)& aSelectable,
412 const Standard_Integer aMode)
414 if(!myActiveObjects.IsBound(aSelectable)) return;
416 if(aMode==-1) return;
418 myActiveObjects(aSelectable)->RemoveSelectionMode(aMode);
419 mySM->Deactivate(aSelectable,aMode,myMainVS);
423 //=======================================================================
424 //function : ActivateMode
426 //=======================================================================
428 void AIS_LocalContext::Deactivate(const Handle(AIS_InteractiveObject)& aSelectable)
430 if(!myActiveObjects.IsBound(aSelectable)) return;
432 mySM->Deactivate(aSelectable,myMainVS);
433 myActiveObjects(aSelectable)->ClearSelectionModes();
437 //=======================================================================
440 //=======================================================================
442 Standard_Boolean AIS_LocalContext::Remove(const Handle(AIS_InteractiveObject)& aSelectable)
444 if(!myActiveObjects.IsBound(aSelectable)) return Standard_False;
446 if(IsSelected(aSelectable))
447 AddOrRemoveSelected(aSelectable,Standard_False);
449 const Handle(AIS_LocalStatus)& Att = myActiveObjects(aSelectable);
451 TColStd_ListIteratorOfListOfInteger It;
452 Standard_Boolean jobdone(Standard_False);
453 // it is checked which were the temporary attributes
454 // and they are set to 0
456 // desactivate standard modes
457 if(Att->Decomposed()){
458 for(It.Initialize(myListOfStandardMode);It.More();It.Next()){
459 mySM->Deactivate(aSelectable,It.Value(),myMainVS);
463 // if object or temporary presentations...
464 if(Att->IsTemporary())
466 if(Att->IsSubIntensityOn())
467 myMainPM->Unhighlight(aSelectable,Att->HilightMode());
469 // remove if bug on clear correct...
470 myMainPM->Erase(aSelectable,Att->DisplayMode());
471 myMainPM->Clear(aSelectable,Att->DisplayMode());
472 if(myMainPM->IsDisplayed(aSelectable,Att->HilightMode()))
473 myMainPM->Erase(aSelectable,Att->HilightMode());
474 // myMainPM->Clear(aSelectable,Att->HilightMode());
475 jobdone = Standard_True;
477 // if below intensity
480 if(Att->IsSubIntensityOn())
481 myCTX->SubIntensityOff(aSelectable);
483 // desactivate stored proper modes
484 for(It.Initialize(Att->SelectionModes());It.More();It.Next()){
485 mySM->Deactivate(aSelectable,It.Value(),myMainVS);
487 // pop : si je laisses cela plantes dans les elements de construction
488 // alors a toi de jouer ROB
489 // RemoveSelected(aSelectable);
491 if(IsSelected(aSelectable))
492 AddOrRemoveSelected(aSelectable);
493 myActiveObjects.UnBind(aSelectable);
495 //Last detected object keeps for lastindex initialization.
496 Handle(SelectMgr_EntityOwner) aLastPicked = myMainVS->OnePicked();
500 //Object removes from SelectMgr
501 if( mySM->Contains(aSelectable) )
502 mySM->Remove(aSelectable);
504 //Object removes from Detected sequence
505 AIS_SequenceOfInteractive detectAIS;
507 Standard_Integer i = 1;
508 for(i = 1 ; i < myAISDetectedSeq.Length(); i++)
510 Handle(AIS_InteractiveObject) anObj = DetectedCurrentObject();
511 if( !anObj.IsNull() && anObj != aSelectable )
512 myAISDetectedSeq.Remove( i );
515 Standard_Integer aHM = aSelectable->HasHilightMode() ? aSelectable->HilightMode() : 0;
517 //EntityOwners remove from AIS_Selection
518 Handle(AIS_Selection) aSel = AIS_Selection::Selection(mySelName.ToCString());
519 AIS_NListTransient::Iterator anIter(aSel->Objects());
520 AIS_NListTransient removeEntites;
521 for(; anIter.More(); anIter.Next()){
522 const Handle(Standard_Transient)& Tr = anIter.Value();
524 const Handle(SelectMgr_EntityOwner)& anOwnr = *((const Handle(SelectMgr_EntityOwner)*) &Tr);
525 if(anOwnr->Selectable() == aSelectable){
526 removeEntites.Append(Tr);
527 if(IsSelected(anOwnr))
528 anOwnr->Unhilight(myMainPM, aHM);//Unhilight selected
532 AIS_NListTransient::Iterator anIterRemove(removeEntites);
533 for(; anIterRemove.More(); anIterRemove.Next())
534 aSel->Select(anIterRemove.Value());//EntityOwner removes from the selection data
536 //EntityOwners remove from myMapOfOwner
537 SelectMgr_IndexedMapOfOwner ownersToKeep;
538 const Handle(V3d_Viewer)& aViewer = myCTX->CurrentViewer();
539 for(i = 1; i <= myMapOfOwner.Extent(); i++){
540 const Handle(SelectMgr_EntityOwner)& anOwner = myMapOfOwner(i) ;
541 if(!anOwner.IsNull())
542 if(anOwner->Selectable() != aSelectable)
543 ownersToKeep.Add(anOwner);
546 if(anOwner->IsHilighted(myMainPM, aHM))
548 for(aViewer->InitActiveViews(); aViewer->MoreActiveViews(); aViewer->NextActiveViews())
549 Unhilight(anOwner, aViewer->ActiveView());
553 myMapOfOwner.Clear();
554 myMapOfOwner.Assign(ownersToKeep);
555 mylastindex = myMapOfOwner.FindIndex(aLastPicked);
557 return Standard_True;
560 //=======================================================================
561 //function : ActivateStandardMode
563 //=======================================================================
565 void AIS_LocalContext::ActivateStandardMode(const TopAbs_ShapeEnum aType)
568 //check if it is not in the list
569 TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
570 for(;It.More();It.Next())
571 if(It.Value()==aType) return;
572 Standard_Integer IMode = AIS_Shape::SelectionMode(aType);
575 // create a hidden filter answering ok to the type except for :
576 // if the type is shape...
577 // if the filters already impact at the type <aType>
578 if(aType != TopAbs_SHAPE){
579 if(myStdFilters[IMode].IsNull())
580 myStdFilters[IMode] = new StdSelect_ShapeTypeFilter(aType);
581 if(!HasFilters(aType))
582 myFilters->Add(myStdFilters[IMode]);
585 // the mode is activated for all objects of type Shape
586 // accepting the decomposition in standard mode.
587 myListOfStandardMode.Append(IMode);
589 AIS_DataMapIteratorOfDataMapOfSelStat ItM(myActiveObjects);
591 for(;ItM.More();ItM.Next()){
593 AIS_DisplayStatus DS =
594 myCTX->DisplayStatus(Handle(AIS_InteractiveObject)::DownCast(ItM.Key()));
595 if( ItM.Value()->Decomposed() && (DS != AIS_DS_FullErased) )
597 if(ItM.Value()->Decomposed())
599 myCTX->SelectionManager()->Activate(ItM.Key(),
606 //=======================================================================
607 //function : DeActivateStandardMode
609 //=======================================================================
611 void AIS_LocalContext::DeactivateStandardMode(const TopAbs_ShapeEnum aType)
613 TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
614 Standard_Integer IMode = AIS_Shape::SelectionMode(aType);
615 for(;It.More();It.Next())
616 if(It.Value()==IMode) {
617 AIS_DataMapIteratorOfDataMapOfSelStat ItM(myActiveObjects);
619 for(;ItM.More();ItM.Next()){
620 if(ItM.Value()->Decomposed()){
621 myCTX->SelectionManager()->Deactivate(ItM.Key(),
624 ItM.Value()->RemoveSelectionMode(IMode);
627 myListOfStandardMode.Remove(It);
628 if(myFilters->IsIn(myStdFilters[IMode]))
629 myFilters->Remove(myStdFilters[IMode]);
636 //=======================================================================
637 //function : AddFilter
639 //=======================================================================
641 void AIS_LocalContext::AddFilter(const Handle(SelectMgr_Filter)& aFilter)
643 // it is checked if the filter impacts at the type of active sub-shape
644 // for which a filter of type has been already implemented...
646 TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
648 for(;It.More();It.Next()){
649 if(aFilter->ActsOn(AIS_Shape::SelectionType(It.Value())))
650 if(myFilters->IsIn(myStdFilters[It.Value()]))
651 myFilters->Remove(myStdFilters[It.Value()]);
653 myFilters->Add(aFilter);
656 //=======================================================================
657 //function : RemoveFilter
659 //=======================================================================
661 void AIS_LocalContext::RemoveFilter(const Handle(SelectMgr_Filter)& aFilter)
663 if(myFilters->IsIn(aFilter)) myFilters->Remove(aFilter);
665 // it is checked if the filter for type standard is active.
666 // if yes, it is checked there are still similarities among the
667 // remaining filters...
668 // otherwise, the standard filter is restored to
669 // continu selecting active modes...
670 TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
672 for(;It.More();It.Next()){
673 SE = AIS_Shape::SelectionType(It.Value());
674 if(aFilter->ActsOn(SE))
676 myFilters->Add(myStdFilters[It.Value()]);
682 Standard_Boolean AIS_LocalContext::HasSameProjector(const Handle(Select3D_Projector)& thePrj) const
684 const Handle(Select3D_Projector)& aCurPrj = myMainVS->Projector();
685 if (aCurPrj->Perspective() != thePrj->Perspective())
686 return Standard_False;
687 if (aCurPrj->Perspective() && aCurPrj->Focus() != thePrj->Focus())
688 return Standard_False;
689 const gp_GTrsf& aCurTrsf = aCurPrj->Transformation();
690 const gp_GTrsf& aPrjTrsf = thePrj->Transformation();
692 for (Standard_Integer i = 1; i <= 3; ++i)
694 for (Standard_Integer j = 1; j <= 3 ; ++j)
696 if (aCurTrsf.Value (i, j) != aPrjTrsf.Value (i, j))
697 return Standard_False;
701 return Standard_True;
705 //=======================================================================
706 //function : Terminate
708 //=======================================================================
710 void AIS_LocalContext::Terminate( const Standard_Boolean updateviewer )
714 myMapOfOwner.Clear();
717 // clear the selector...
719 myCTX->SelectionManager()->Remove(myMainVS);
722 AIS_Selection::SetCurrentSelection(mySelName.ToCString());
723 Handle(AIS_Selection) S = AIS_Selection::CurrentSelection();
724 Handle(Standard_Transient) Tr;
725 for(S->Init();S->More();S->Next()){
727 (*((Handle(SelectMgr_EntityOwner)*)&Tr))->State(0);
731 AIS_Selection::Select();
732 AIS_Selection::Remove(mySelName.ToCString());
735 // const Handle(V3d_Viewer)& Vwr = myCTX->CurrentViewer();
736 Handle(V3d_Viewer) Vwr = myCTX->CurrentViewer();
738 Handle(V3d_View) curV;
739 for(Vwr->InitActiveViews();Vwr->MoreActiveViews();Vwr->NextActiveViews()){
740 curV = Vwr->ActiveView();
741 Visual3d_TransientManager::ClearDraw( curV->View(), updateviewer );
746 Handle(V3d_View) BidV;
747 myMainVS->ClearAreas(BidV);
748 myMainVS->ClearSensitive(BidV);
754 //=======================================================================
755 //function : SubIntensity
757 //=======================================================================
759 void AIS_LocalContext::SubIntensityOn(const Handle(AIS_InteractiveObject)& anObject)
761 if(!myActiveObjects.IsBound(anObject)) return;
763 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
765 if(Att->IsTemporary())
766 myMainPM->Color(anObject,myCTX->SubIntensityColor(),Att->DisplayMode());
768 Att->SubIntensityOn();
770 //=======================================================================
771 //function : SubIntensity
773 //=======================================================================
775 void AIS_LocalContext::SubIntensityOff(const Handle(AIS_InteractiveObject)& anObject)
777 if(!myActiveObjects.IsBound(anObject)) return;
779 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
781 if(Att->IsTemporary())
782 myMainPM->Unhighlight(anObject);
783 Att->SubIntensityOff();
787 //=======================================================================
790 //=======================================================================
792 void AIS_LocalContext::Hilight(const Handle(AIS_InteractiveObject)& anObject)
794 if(!myActiveObjects.IsBound(anObject)){
795 Standard_Integer HiMod = anObject->HasHilightMode()? anObject->HilightMode() : 0;
796 Handle(AIS_LocalStatus) Att = new AIS_LocalStatus(Standard_True,
799 myActiveObjects.Bind(anObject,Att);
802 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
803 myMainPM->Color(anObject,myCTX->HilightColor(),Att->HilightMode());
804 Att->SubIntensityOn();
806 //=======================================================================
809 //=======================================================================
811 void AIS_LocalContext::Hilight(const Handle(AIS_InteractiveObject)& anObject,
812 const Quantity_NameOfColor Col)
814 if(!myActiveObjects.IsBound(anObject)){
815 Standard_Integer HiMod = anObject->HasHilightMode()? anObject->HilightMode() : 0;
816 Handle(AIS_LocalStatus) Att = new AIS_LocalStatus(Standard_True,
819 myActiveObjects.Bind(anObject,Att);
822 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
823 myMainPM->Color(anObject,Col,Att->HilightMode());
824 Att->SubIntensityOn();
825 Att->SetHilightColor(Col);
828 //=======================================================================
829 //function : Unhilight
831 //=======================================================================
833 void AIS_LocalContext::Unhilight(const Handle(AIS_InteractiveObject)& anObject)
835 if(!myActiveObjects.IsBound(anObject)) return;
837 // chieck if by hazard the object is somewhere else...
838 Standard_Integer Indx;
839 Standard_Boolean IsSomeWhereElse =
840 myCTX->IsInLocal(anObject,Indx) && Indx != myCTX->IndexOfCurrentLocal();
842 const Handle(AIS_LocalStatus)& Att = myActiveObjects(anObject);
843 myMainPM->Unhighlight(anObject,Att->HilightMode());
844 if(Att->IsTemporary() && Att->DisplayMode()==-1)
846 myMainPM->Erase(anObject,Att->HilightMode());
848 Att->SubIntensityOff();
849 Att->SetHilightColor(Quantity_NOC_WHITE);
853 //=======================================================================
856 //=======================================================================
858 Standard_Boolean AIS_LocalContext::
859 IsIn(const Handle(AIS_InteractiveObject)& anObject) const
861 return myActiveObjects.IsBound(anObject);
864 //=======================================================================
865 //function : IsHilighted
867 //=======================================================================
869 Standard_Boolean AIS_LocalContext::IsHilighted(const Handle(AIS_InteractiveObject)& anObject) const
871 if(!myActiveObjects.IsBound(anObject)) return Standard_False;
872 return myActiveObjects(anObject)->IsSubIntensityOn();
875 Standard_Boolean AIS_LocalContext::IsHilighted(const Handle(AIS_InteractiveObject)& anObject,
876 Standard_Boolean& WithColor,
877 Quantity_NameOfColor& HiCol) const
879 if(!myActiveObjects.IsBound(anObject)) return Standard_False;
880 if( myActiveObjects(anObject)->IsSubIntensityOn()){
881 HiCol = myActiveObjects(anObject)->HilightColor();
882 if(HiCol==Quantity_NOC_WHITE)
883 WithColor = Standard_True;
885 WithColor = Standard_False;
886 return Standard_True;
888 return Standard_False;
892 void AIS_LocalContext::SetDisplayPriority(const Handle(AIS_InteractiveObject)& anObject,
893 const Standard_Integer Prior)
895 if(!myActiveObjects.IsBound(anObject)) return;
896 const Handle(AIS_LocalStatus)& STAT = myActiveObjects(anObject);
897 if(STAT->DisplayMode()==-1) return;
898 myMainPM->SetDisplayPriority(anObject,STAT->DisplayMode(),Prior);
899 if(STAT->IsSubIntensityOn())
900 myMainPM->SetDisplayPriority(anObject,STAT->HilightMode(),Prior);
905 //=======================================================================
906 //function : DisplayedObjects
908 //=======================================================================
909 Standard_Integer AIS_LocalContext::DisplayedObjects(TColStd_MapOfTransient& theMap) const
911 Standard_Integer NbDisp(0);
912 for(AIS_DataMapIteratorOfDataMapOfSelStat it(myActiveObjects);it.More();it.Next()){
913 const Handle(SelectMgr_SelectableObject)& SO = it.Key();
914 if(!theMap.Contains(SO))
915 if(it.Value()->DisplayMode()!=-1){
924 //=======================================================================
925 //function : IsDisplayed
927 //=======================================================================
929 Standard_Boolean AIS_LocalContext::IsDisplayed(const Handle(AIS_InteractiveObject)& anObject) const
931 if(!myActiveObjects.IsBound(anObject)) return Standard_False;
932 return (myActiveObjects(anObject)->DisplayMode()!=-1);
935 //=======================================================================
936 //function : IsDisplayed
938 //=======================================================================
940 Standard_Boolean AIS_LocalContext::IsDisplayed(const Handle(AIS_InteractiveObject)& anObject,
941 const Standard_Integer aMode) const
943 if(!myActiveObjects.IsBound(anObject)) return Standard_False;
944 return (myActiveObjects(anObject)->DisplayMode()==aMode);
947 //=======================================================================
948 //function : SelectionModes
950 //=======================================================================
952 const TColStd_ListOfInteger& AIS_LocalContext::
953 SelectionModes(const Handle(AIS_InteractiveObject)& anObject) const
955 return myActiveObjects(anObject)->SelectionModes();
958 //=======================================================================
961 //=======================================================================
963 TCollection_AsciiString AIS_LocalContext::Status() const
965 TCollection_AsciiString t;
969 const Handle(AIS_LocalStatus)& AIS_LocalContext::Status(const Handle(AIS_InteractiveObject)& anObject) const
971 return myActiveObjects(anObject);
974 //=======================================================================
975 //function : LoadContextObjects
977 //=======================================================================
979 void AIS_LocalContext::LoadContextObjects()
981 AIS_ListIteratorOfListOfInteractive It;
982 if(myLoadDisplayed) {
983 AIS_ListOfInteractive LL;
984 myCTX->DisplayedObjects(LL,Standard_True);
985 Handle(AIS_LocalStatus) Att;
986 for (It.Initialize(LL);It.More();It.Next()){
987 Att= new AIS_LocalStatus();
988 Att->SetDecomposition((It.Value()->AcceptShapeDecomposition() && myAcceptStdMode));
989 Att->SetTemporary(Standard_False);
990 Att->SetHilightMode(It.Value()->HasHilightMode()? It.Value()->HilightMode(): 0);
992 myActiveObjects.Bind(It.Value(),Att);
997 void AIS_LocalContext::UnloadContextObjects()
999 AIS_ListIteratorOfListOfInteractive It;
1002 AIS_ListOfInteractive LL;
1003 myCTX->DisplayedObjects(LL,Standard_True);
1005 for (It.Initialize(LL);It.More();It.Next())
1007 myActiveObjects.UnBind(It.Value());
1011 //=======================================================================
1012 //function : Process
1014 //=======================================================================
1016 void AIS_LocalContext::Process(const Handle(SelectMgr_SelectableObject)& anObject,
1017 const Standard_Boolean WithProj)
1019 if(!myActiveObjects.IsBound(anObject)) return;
1020 if(myActiveObjects(anObject)->Decomposed())
1021 ActivateStandardModes(anObject,WithProj);
1024 TColStd_ListIteratorOfListOfInteger It(myActiveObjects(anObject)->SelectionModes());
1025 for(;It.More();It.Next())
1026 myCTX->SelectionManager()->Activate(anObject,It.Value(),myMainVS,WithProj);
1030 //=======================================================================
1031 //function : Process
1033 //=======================================================================
1035 void AIS_LocalContext::Process(const Standard_Boolean WithProj)
1040 AIS_DataMapIteratorOfDataMapOfSelStat It(myActiveObjects);
1042 for(;It.More();It.Next()){
1043 myCTX->SelectionManager()->Load(It.Key(),myMainVS);
1044 if(It.Value()->Decomposed())
1045 ActivateStandardModes(It.Key(),WithProj);
1046 else if( myCTX->GetAutoActivateSelection() )
1048 It.Value()->AddSelectionMode(0);
1049 myCTX->SelectionManager()->Activate(It.Key(),0,myMainVS,WithProj);
1055 //=======================================================================
1056 //function : ActivateModes
1058 //=======================================================================
1060 void AIS_LocalContext::ActivateStandardModes(const Handle(SelectMgr_SelectableObject)& anObject,
1061 const Standard_Boolean WithProj)
1063 if(!myActiveObjects.IsBound(anObject)) return;
1065 TColStd_ListIteratorOfListOfInteger itl (myListOfStandardMode);
1067 const Handle(AIS_LocalStatus)& LS = myActiveObjects(anObject);
1068 if(LS->Decomposed()){
1069 for(;itl.More();itl.Next()){
1070 myCTX->SelectionManager()->Activate(anObject,itl.Value(),myMainVS,WithProj);
1071 LS->AddSelectionMode(itl.Value());
1077 //=======================================================================
1078 //function : ClearObjects
1080 //=======================================================================
1082 void AIS_LocalContext::ClearObjects()
1084 AIS_DataMapIteratorOfDataMapOfSelStat It(myActiveObjects);
1085 for(;It.More();It.Next())
1087 Handle(AIS_InteractiveObject) SO =
1088 Handle(AIS_InteractiveObject)::DownCast(It.Key());
1090 const Handle(AIS_LocalStatus)& CurAtt = It.Value();
1091 //TColStd_ListIteratorOfListOfInteger ItL;
1092 // if object is temporary the presentations managed by myMainPM are removed
1093 AIS_DisplayStatus TheDS = myCTX->DisplayStatus(SO);
1095 if(TheDS != AIS_DS_Displayed){
1096 if(myMainPM->IsDisplayed(SO,CurAtt->DisplayMode())){
1097 if(CurAtt->IsSubIntensityOn()&&
1098 myMainPM->IsHighlighted(SO,CurAtt->HilightMode()))
1099 myMainPM->Unhighlight(SO,CurAtt->HilightMode());
1100 myMainPM->Erase(SO,CurAtt->DisplayMode());
1103 if(CurAtt->IsTemporary()){
1104 myMainPM->Erase(SO,CurAtt->DisplayMode());}
1105 // myMainPM->Clear(SO,CurAtt->DisplayMode());}
1108 if (CurAtt->IsSubIntensityOn()){
1109 myCTX->SubIntensityOff(Handle(AIS_InteractiveObject)::DownCast(SO));}
1110 Standard_Integer DiMo = SO->HasDisplayMode()?
1111 SO->DisplayMode():myCTX->DisplayMode();
1112 if(CurAtt->DisplayMode()!=-1 &&
1113 CurAtt->DisplayMode()!= DiMo)
1114 myMainPM->Erase(SO,CurAtt->DisplayMode());
1117 TColStd_ListIteratorOfListOfInteger ITL(CurAtt->SelectionModes());
1118 for(;ITL.More();ITL.Next())
1119 mySM->Deactivate(SO,ITL.Value(),myMainVS);
1121 if(CurAtt->IsTemporary())
1122 mySM->Remove(SO,myMainVS);
1125 ClearSelected( Standard_False );
1126 myActiveObjects.Clear();
1127 // myMainVS->ClearAreas();myMainVS->ClearSensitive();
1131 Standard_Boolean AIS_LocalContext::IsDecompositionOn() const
1132 {return !myListOfStandardMode.IsEmpty();}
1137 //=======================================================================
1138 //function : HasAlreadyFilters
1140 //=======================================================================
1142 Standard_Boolean AIS_LocalContext::
1143 HasFilters(const TopAbs_ShapeEnum aType) const
1145 return myFilters->ActsOn(aType);
1148 void AIS_LocalContext::ClearDetected()
1150 for(Standard_Integer I=1;I<=myMapOfOwner.Extent();I++){
1152 if(!myMapOfOwner(I).IsNull()){
1153 if(myMapOfOwner(I)->IsHilighted(myMainPM))
1154 myMapOfOwner(I)->Unhilight(myMainPM);
1155 else if (myMapOfOwner(I)->IsHilighted(myCTX->CollectorPrsMgr()))
1156 myMapOfOwner(I)->Unhilight(myCTX->CollectorPrsMgr());
1159 const Handle(SelectMgr_SelectableObject)& SO =
1160 myMapOfOwner.FindKey(I)->Selectable();
1161 if(myActiveObjects.IsBound(SO)){
1162 const Handle(AIS_LocalStatus)& Att = myActiveObjects(SO);
1164 if(Att->IsTemporary() &&
1165 Att->DisplayMode()==-1 &&
1166 Att->SelectionModes().IsEmpty()){
1167 myMapOfOwner(I)->Clear(myMainPM);
1168 //myMapOfOwner(I)->Clear();//rob-jmi...
1177 void AIS_LocalContext::UpdateConversion()
1179 myMainVS->UpdateConversion();
1182 void AIS_LocalContext::UpdateSort()
1184 myMainVS->UpdateSort();
1189 //=======================================================================
1190 //function : IMMEDIATE MODE
1192 //=======================================================================
1194 Standard_Boolean AIS_LocalContext::BeginImmediateDraw()
1196 if(myMainPM->IsImmediateModeOn()){
1197 myMainPM->BeginDraw();
1198 return Standard_True;
1200 return Standard_False;
1204 Standard_Boolean AIS_LocalContext::ImmediateAdd(const Handle(AIS_InteractiveObject)& anIObj,
1205 const Standard_Integer aMode)
1207 if(!myMainPM->IsImmediateModeOn())
1208 return Standard_False;
1209 myMainPM->Add(anIObj,aMode);
1210 return Standard_True;
1213 Standard_Boolean AIS_LocalContext::ImmediateRemove(const Handle(AIS_InteractiveObject)& anIObj,
1214 const Standard_Integer aMode)
1216 if(!myMainPM->IsImmediateModeOn()) return Standard_False;
1217 myMainPM->Remove(anIObj,aMode);
1218 return Standard_True;
1221 Standard_Boolean AIS_LocalContext::EndImmediateDraw(const Handle(V3d_View)& aView,
1222 const Standard_Boolean DoubleBuf)
1224 if(!myMainPM->IsImmediateModeOn()) return Standard_False;
1225 myMainPM->EndDraw(aView,DoubleBuf);
1226 return Standard_True;
1229 Standard_Boolean AIS_LocalContext::IsImmediateModeOn() const
1230 {return myMainPM->IsImmediateModeOn();}
1232 void AIS_LocalContext::SetSensitivityMode(const StdSelect_SensitivityMode aMode) {
1234 myMainVS->SetSensitivityMode(aMode);
1237 StdSelect_SensitivityMode AIS_LocalContext::SensitivityMode() const {
1239 return myMainVS->SensitivityMode();
1242 void AIS_LocalContext::SetSensitivity(const Standard_Real aPrecision) {
1244 myMainVS->SetSensitivity(aPrecision);
1247 Standard_Real AIS_LocalContext::Sensitivity() const {
1249 return myMainVS->Sensitivity();
1252 void AIS_LocalContext::SetPixelTolerance(const Standard_Integer aPrecision) {
1254 myMainVS->SetPixelTolerance(aPrecision);
1257 Standard_Integer AIS_LocalContext::PixelTolerance() const {
1259 return myMainVS->PixelTolerance();
1262 //=======================================================================
1263 //function : SetZLayer
1265 //=======================================================================
1267 void AIS_LocalContext::SetZLayer (const Handle(AIS_InteractiveObject)& theIObj,
1268 const Standard_Integer theLayerId)
1270 if (!myActiveObjects.IsBound (theIObj))
1273 const Handle(AIS_LocalStatus)& aStatus = myActiveObjects (theIObj);
1274 if (aStatus->DisplayMode () == -1)
1277 theIObj->SetZLayer (myMainPM, theLayerId);
1280 //=======================================================================
1281 //function : GetZLayer
1283 //=======================================================================
1285 Standard_Integer AIS_LocalContext::GetZLayer (const Handle(AIS_InteractiveObject)& theIObj) const
1287 if (!myActiveObjects.IsBound (theIObj))
1290 return theIObj->GetZLayer (myMainPM);