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 XAB & Serguei Dec 97 (angle &deviation coeffts)
19 #include <AIS_ConnectedInteractive.hxx>
20 #include <AIS_DataMapIteratorOfDataMapOfILC.hxx>
21 #include <AIS_DataMapIteratorOfDataMapOfIOStatus.hxx>
22 #include <AIS_GlobalStatus.hxx>
23 #include <AIS_InteractiveContext.hxx>
24 #include <AIS_InteractiveObject.hxx>
25 #include <AIS_ListIteratorOfListOfInteractive.hxx>
26 #include <AIS_LocalContext.hxx>
27 #include <AIS_LocalStatus.hxx>
28 #include <AIS_MapIteratorOfMapOfInteractive.hxx>
29 #include <AIS_MultipleConnectedInteractive.hxx>
30 #include <AIS_Selection.hxx>
31 #include <AIS_Shape.hxx>
32 #include <AIS_Trihedron.hxx>
33 #include <Geom_Axis2Placement.hxx>
34 #include <Graphic3d_AspectFillArea3d.hxx>
35 #include <HLRBRep.hxx>
36 #include <OSD_Environment.hxx>
37 #include <Precision.hxx>
38 #include <Prs3d_BasicAspect.hxx>
39 #include <Prs3d_DatumAspect.hxx>
40 #include <Prs3d_IsoAspect.hxx>
41 #include <Prs3d_LineAspect.hxx>
42 #include <Prs3d_PlaneAspect.hxx>
43 #include <Prs3d_ShadingAspect.hxx>
44 #include <PrsMgr_ModedPresentation.hxx>
45 #include <PrsMgr_PresentableObject.hxx>
46 #include <Quantity_Color.hxx>
47 #include <SelectMgr_EntityOwner.hxx>
48 #include <SelectMgr_Filter.hxx>
49 #include <SelectMgr_OrFilter.hxx>
50 #include <SelectMgr_SelectionManager.hxx>
51 #include <Standard_Atomic.hxx>
52 #include <Standard_Transient.hxx>
53 #include <Standard_Type.hxx>
54 #include <StdSelect_ViewerSelector3d.hxx>
55 #include <TCollection_AsciiString.hxx>
56 #include <TCollection_ExtendedString.hxx>
57 #include <TColStd_ListIteratorOfListOfInteger.hxx>
58 #include <TColStd_MapIteratorOfMapOfTransient.hxx>
59 #include <TopLoc_Location.hxx>
60 #include <TopoDS_Shape.hxx>
61 #include <UnitsAPI.hxx>
62 #include <V3d_View.hxx>
63 #include <V3d_Viewer.hxx>
64 #include <Visual3d_View.hxx>
65 #include <Visual3d_ViewManager.hxx>
67 //#include <AIS_DataMapIteratorOfDataMapOfInteractiveInteger.hxx>
70 static volatile Standard_Integer THE_AIS_INDEX_SEL = 0;
71 static volatile Standard_Integer THE_AIS_INDEX_CUR = 0;
73 static TCollection_AsciiString AIS_Context_NewSelName()
75 return TCollection_AsciiString ("AIS_SelContext_")
76 + TCollection_AsciiString (Standard_Atomic_Increment (&THE_AIS_INDEX_SEL));
79 static TCollection_AsciiString AIS_Context_NewCurName()
81 return TCollection_AsciiString ("AIS_CurContext_")
82 + TCollection_AsciiString (Standard_Atomic_Increment (&THE_AIS_INDEX_CUR));
85 typedef NCollection_DataMap<Handle(SelectMgr_SelectableObject), Handle(SelectMgr_IndexedMapOfOwner)> AIS_MapOfObjectOwners;
86 typedef NCollection_DataMap<Handle(SelectMgr_SelectableObject), Handle(SelectMgr_IndexedMapOfOwner)>::Iterator AIS_MapIteratorOfMapOfObjectOwners;
89 //=======================================================================
90 //function : AIS_InteractiveContext
92 //=======================================================================
94 AIS_InteractiveContext::AIS_InteractiveContext(const Handle(V3d_Viewer)& MainViewer):
95 mgrSelector(new SelectMgr_SelectionManager()),
96 myMainPM(new PrsMgr_PresentationManager3d(MainViewer->Viewer())),
97 myMainVwr(MainViewer),
98 myMainSel(new StdSelect_ViewerSelector3d()),
99 myWasLastMain(Standard_False),
100 myCurrentTouched(Standard_False),
101 mySelectedTouched(Standard_False),
102 myToHilightSelected(Standard_True),
103 myFilters(new SelectMgr_OrFilter()),
104 myDefaultDrawer(new Prs3d_Drawer()),
105 myDefaultColor(Quantity_NOC_GOLDENROD),
106 myHilightColor(Quantity_NOC_CYAN1),
107 mySelectionColor(Quantity_NOC_GRAY80),
108 myPreselectionColor(Quantity_NOC_GREEN),
109 mySubIntensity(Quantity_NOC_GRAY40),
114 myIsAutoActivateSelMode( Standard_True )
119 void AIS_InteractiveContext::Delete() const
121 // clear the static current selection
122 AIS_Selection::ClearCurrentSelection();
124 // to avoid an exception
125 if (AIS_Selection::Find (mySelectionName.ToCString()))
127 AIS_Selection::Remove (mySelectionName.ToCString());
130 // to avoid an exception
131 if (AIS_Selection::Find (myCurrentName.ToCString()))
133 AIS_Selection::Remove (myCurrentName.ToCString());
136 // let's remove one reference explicitly. this operation's supposed to
137 // be performed when mgrSelector will be destroyed but anyway...
138 const Handle(SelectMgr_ViewerSelector)& aSelector = myMainSel; // to avoid ambiguity
139 mgrSelector->Remove (aSelector);
141 Handle(AIS_InteractiveContext) aNullContext;
142 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
144 Handle(AIS_InteractiveObject) anObj = anObjIter.Key();
145 anObj->SetContext (aNullContext);
146 for (anObj->Init(); anObj->More(); anObj->Next())
148 anObj->CurrentSelection()->UpdateBVHStatus (SelectMgr_TBU_Renew);
151 MMgt_TShared::Delete();
154 //=======================================================================
155 //function : AIS_SelectionName
157 //=======================================================================
158 const TCollection_AsciiString& AIS_InteractiveContext::SelectionName() const
160 if(!HasOpenedContext())
161 return mySelectionName;
162 return myLocalContexts(myCurLocalIndex)->SelectionName();
168 //=======================================================================
169 //function : UpdateCurrentViewer
171 //=======================================================================
173 void AIS_InteractiveContext::UpdateCurrentViewer()
175 if (!myMainVwr.IsNull())
180 //=======================================================================
181 //function : DomainOfMainViewer
183 //=======================================================================
185 Standard_CString AIS_InteractiveContext::DomainOfMainViewer() const
187 return myMainVwr->Domain();
191 //=======================================================================
192 //function : DisplayedObjects
194 //=======================================================================
195 void AIS_InteractiveContext::DisplayedObjects (AIS_ListOfInteractive& theListOfIO,
196 const Standard_Boolean theOnlyFromNeutral) const
198 if (!HasOpenedContext()
199 || theOnlyFromNeutral)
201 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
203 if (anObjIter.Value()->GraphicStatus() == AIS_DS_Displayed)
205 theListOfIO.Append (anObjIter.Key());
212 TColStd_MapOfTransient aDispMap;
213 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
215 if (anObjIter.Value()->GraphicStatus() == AIS_DS_Displayed)
217 aDispMap.Add (anObjIter.Key());
221 // parse all local contexts...
222 for (AIS_DataMapIteratorOfDataMapOfILC aCtxIter (myLocalContexts); aCtxIter.More(); aCtxIter.Next())
224 const Handle(AIS_LocalContext)& aLocCtx = aCtxIter.Value();
225 aLocCtx->DisplayedObjects (aDispMap);
228 Handle(AIS_InteractiveObject) anObj;
229 for (TColStd_MapIteratorOfMapOfTransient aDispMapIter (aDispMap); aDispMapIter.More(); aDispMapIter.Next())
231 const Handle(Standard_Transient)& aTransient = aDispMapIter.Key();
232 anObj = Handle(AIS_InteractiveObject)::DownCast (aTransient);
233 theListOfIO.Append (anObj);
237 //=======================================================================
238 //function : DisplayedObjects
240 //=======================================================================
241 void AIS_InteractiveContext::DisplayedObjects (const AIS_KindOfInteractive theKind,
242 const Standard_Integer theSign,
243 AIS_ListOfInteractive& theListOfIO,
244 const Standard_Boolean /*OnlyFromNeutral*/) const
246 ObjectsByDisplayStatus (theKind, theSign, AIS_DS_Displayed, theListOfIO);
249 //=======================================================================
250 //function : ErasedObjects
252 //=======================================================================
253 void AIS_InteractiveContext::ErasedObjects (AIS_ListOfInteractive& theListOfIO) const
255 ObjectsByDisplayStatus (AIS_DS_Erased, theListOfIO);
258 //=======================================================================
259 //function : ErasedObjects
261 //=======================================================================
262 void AIS_InteractiveContext::ErasedObjects (const AIS_KindOfInteractive theKind,
263 const Standard_Integer theSign,
264 AIS_ListOfInteractive& theListOfIO) const
266 ObjectsByDisplayStatus (theKind, theSign, AIS_DS_Erased, theListOfIO);
269 //=======================================================================
270 //function : ObjectsByDisplayStatus
272 //=======================================================================
273 void AIS_InteractiveContext::ObjectsByDisplayStatus (const AIS_DisplayStatus theStatus,
274 AIS_ListOfInteractive& theListOfIO) const
276 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
278 if (anObjIter.Value()->GraphicStatus() == theStatus)
280 theListOfIO.Append (anObjIter.Key());
285 //=======================================================================
286 //function : ObjectsByDisplayStatus
288 //=======================================================================
289 void AIS_InteractiveContext::ObjectsByDisplayStatus (const AIS_KindOfInteractive theKind,
290 const Standard_Integer theSign,
291 const AIS_DisplayStatus theStatus,
292 AIS_ListOfInteractive& theListOfIO) const
294 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
296 if (theStatus != AIS_DS_None
297 && anObjIter.Value()->GraphicStatus() != theStatus)
301 else if (anObjIter.Key()->Type() != theKind)
307 || anObjIter.Key()->Signature() == theSign)
309 theListOfIO.Append (anObjIter.Key());
314 //=======================================================================
315 //function : ObjectsInside
317 //=======================================================================
318 void AIS_InteractiveContext::ObjectsInside (AIS_ListOfInteractive& theListOfIO,
319 const AIS_KindOfInteractive theKind,
320 const Standard_Integer theSign) const
322 if (theKind == AIS_KOI_None
325 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
327 theListOfIO.Append (anObjIter.Key());
332 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
334 if (anObjIter.Key()->Type() != theKind)
340 || anObjIter.Key()->Signature() == theSign)
342 theListOfIO.Append (anObjIter.Key());
347 //=======================================================================
348 //function : ObjectsForView
350 //=======================================================================
351 void AIS_InteractiveContext::ObjectsForView (AIS_ListOfInteractive& theListOfIO,
352 const Handle(V3d_View)& theView,
353 const Standard_Boolean theIsVisibleInView,
354 const AIS_DisplayStatus theStatus) const
356 const Graphic3d_CView* aCView = reinterpret_cast<const Graphic3d_CView* >(theView->View()->CView());
357 const Standard_Integer aViewId = aCView->ViewId;
358 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
360 if (theStatus != AIS_DS_None
361 && anObjIter.Value()->GraphicStatus() != theStatus)
363 theListOfIO.Append (anObjIter.Key());
367 Handle(Graphic3d_ViewAffinity) anAffinity = myMainVwr->Viewer()->ObjectAffinity (anObjIter.Key());
368 const Standard_Boolean isVisible = anAffinity->IsVisible (aViewId);
369 if (isVisible == theIsVisibleInView)
371 theListOfIO.Append (anObjIter.Key());
376 //=======================================================================
379 //=======================================================================
380 void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIObj,
381 const Standard_Boolean theToUpdateViewer)
383 if (theIObj.IsNull())
388 Standard_Integer aDispMode = 0, aHiMod = -1, aSelMode = -1;
389 GetDefModes (theIObj, aDispMode, aHiMod, aSelMode);
391 Display (theIObj, aDispMode, myIsAutoActivateSelMode ? aSelMode : -1,
392 theToUpdateViewer, theIObj->AcceptShapeDecomposition());
395 //=======================================================================
396 //function : SetViewAffinity
398 //=======================================================================
399 void AIS_InteractiveContext::SetViewAffinity (const Handle(AIS_InteractiveObject)& theIObj,
400 const Handle(V3d_View)& theView,
401 const Standard_Boolean theIsVisible)
404 || !myObjects.IsBound (theIObj))
409 Handle(Graphic3d_ViewAffinity) anAffinity = myMainVwr->Viewer()->ObjectAffinity (theIObj);
410 const Graphic3d_CView* aCView = reinterpret_cast<const Graphic3d_CView* >(theView->View()->CView());
411 anAffinity->SetVisible (aCView->ViewId, theIsVisible == Standard_True);
414 theView->View()->ChangeHiddenObjects()->Remove (theIObj.get());
418 theView->View()->ChangeHiddenObjects()->Add (theIObj.get());
422 //=======================================================================
425 //=======================================================================
426 void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIObj,
427 const Standard_Integer theDispMode,
428 const Standard_Integer theSelectionMode,
429 const Standard_Boolean theToUpdateViewer,
430 const Standard_Boolean theToAllowDecomposition,
431 const AIS_DisplayStatus theDispStatus)
433 if (theIObj.IsNull())
438 if (theDispStatus == AIS_DS_Erased)
440 Erase (theIObj, theToUpdateViewer);
441 Load (theIObj, theSelectionMode, theToAllowDecomposition);
445 if (!theIObj->HasInteractiveContext())
447 theIObj->SetContext (this);
450 if (theDispStatus == AIS_DS_Temporary
451 && !HasOpenedContext())
455 else if (HasOpenedContext())
457 if (theDispStatus == AIS_DS_None
458 || theDispStatus == AIS_DS_Temporary)
460 myLocalContexts (myCurLocalIndex)->Display (theIObj, theDispMode, theToAllowDecomposition, theSelectionMode);
461 if (theToUpdateViewer)
469 if (!myObjects.IsBound (theIObj))
471 Handle(AIS_GlobalStatus) aStatus = new AIS_GlobalStatus (AIS_DS_Displayed, theDispMode, theSelectionMode);
472 myObjects.Bind (theIObj, aStatus);
473 Handle(Graphic3d_ViewAffinity) anAffinity = myMainVwr->Viewer()->RegisterObject (theIObj);
474 myMainPM->Display(theIObj, theDispMode);
475 if (theSelectionMode != -1)
477 const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
478 if (!mgrSelector->Contains (anObj))
480 mgrSelector->Load (theIObj);
482 mgrSelector->Activate (theIObj, theSelectionMode, myMainSel);
487 Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
488 if (aStatus->GraphicStatus() == AIS_DS_Temporary)
493 // Erase presentations for all display modes different from aDispMode.
494 // Then make sure aDispMode is displayed and maybe highlighted.
495 // Finally, activate selection mode <SelMode> if not yet activated.
496 TColStd_ListOfInteger aModesToRemove;
497 for (TColStd_ListIteratorOfListOfInteger aDispModeIter (aStatus->DisplayedModes()); aDispModeIter.More(); aDispModeIter.Next())
499 const Standard_Integer anOldMode = aDispModeIter.Value();
500 if (anOldMode != theDispMode)
502 aModesToRemove.Append (anOldMode);
503 if(myMainPM->IsHighlighted (theIObj, anOldMode))
505 myMainPM->Unhighlight (theIObj, anOldMode);
507 myMainPM->Erase (theIObj, anOldMode);
511 for (TColStd_ListIteratorOfListOfInteger aRemModeIter (aModesToRemove); aRemModeIter.More(); aRemModeIter.Next())
513 aStatus->RemoveDisplayMode (aRemModeIter.Value());
516 if (!aStatus->IsDModeIn (theDispMode))
518 aStatus->AddDisplayMode (theDispMode);
521 myMainPM->Display (theIObj, theDispMode);
522 aStatus->SetGraphicStatus (AIS_DS_Displayed);
523 if (aStatus->IsHilighted())
525 const Standard_Integer aHiMod = theIObj->HasHilightMode() ? theIObj->HilightMode() : theDispMode;
526 myMainPM->Color (theIObj, aStatus->HilightColor(), aHiMod);
528 if (theSelectionMode != -1)
530 const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
531 if (!mgrSelector->Contains (anObj))
533 mgrSelector->Load (theIObj);
535 if (!mgrSelector->IsActivated (theIObj, theSelectionMode))
537 if (!aStatus->IsSModeIn (theSelectionMode))
538 aStatus->AddSelectionMode (theSelectionMode);
539 mgrSelector->Activate (theIObj, theSelectionMode, myMainSel);
544 if (theToUpdateViewer)
550 //=======================================================================
553 //=======================================================================
554 void AIS_InteractiveContext::Load (const Handle(AIS_InteractiveObject)& theIObj,
555 const Standard_Integer theSelMode,
556 const Standard_Boolean theToAllowDecomposition)
558 if (theIObj.IsNull())
563 if (!theIObj->HasInteractiveContext())
565 theIObj->SetContext (this);
568 if (HasOpenedContext())
570 myLocalContexts (myCurLocalIndex)->Load (theIObj, theToAllowDecomposition, theSelMode);
575 && !theToAllowDecomposition)
577 if (!myObjects.IsBound (theIObj))
579 Standard_Integer aDispMode, aHiMod, aSelModeDef;
580 GetDefModes (theIObj, aDispMode, aHiMod, aSelModeDef);
581 Handle(AIS_GlobalStatus) aStatus = new AIS_GlobalStatus (AIS_DS_Erased, aDispMode, aSelModeDef);
582 myObjects.Bind (theIObj, aStatus);
585 // Register theIObj in the selection manager to prepare further activation of selection
586 const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
587 if (!mgrSelector->Contains (anObj))
589 mgrSelector->Load (theIObj);
594 //=======================================================================
597 //=======================================================================
598 void AIS_InteractiveContext::Erase (const Handle(AIS_InteractiveObject)& theIObj,
599 const Standard_Boolean theToUpdateViewer)
601 if (theIObj.IsNull())
606 if (!theIObj->IsAutoHilight())
608 theIObj->ClearSelected();
611 Standard_Boolean wasInCtx = Standard_False;
612 if (HasOpenedContext())
614 // First it is checked if it is possible to remove in the current local context
615 // then one tries to remove in other local contexts, if they allow it...
616 wasInCtx = myLocalContexts (myCurLocalIndex)->Erase (theIObj);
617 for (AIS_DataMapIteratorOfDataMapOfILC aCtxIter (myLocalContexts); aCtxIter.More(); aCtxIter.Next())
619 if (aCtxIter.Value()->AcceptErase())
621 wasInCtx = aCtxIter.Value()->Erase (theIObj) || wasInCtx;
628 EraseGlobal (theIObj, Standard_False);
631 if (theToUpdateViewer)
637 //=======================================================================
638 //function : EraseAll
640 //=======================================================================
641 void AIS_InteractiveContext::EraseAll (const Standard_Boolean theToUpdateViewer)
643 if (HasOpenedContext())
648 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
650 if (anObjIter.Value()->GraphicStatus() == AIS_DS_Displayed)
652 Erase (anObjIter.Key(), Standard_False);
656 if (theToUpdateViewer)
662 //=======================================================================
663 //function : DisplayAll
665 //=======================================================================
666 void AIS_InteractiveContext::DisplayAll (const Standard_Boolean theToUpdateViewer)
668 if (HasOpenedContext())
673 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
675 const AIS_DisplayStatus aStatus = anObjIter.Value()->GraphicStatus();
676 if (aStatus == AIS_DS_Erased)
678 Display (anObjIter.Key(), Standard_False);
682 if (theToUpdateViewer)
688 //=======================================================================
689 //function : DisplaySelected
691 //=======================================================================
692 void AIS_InteractiveContext::DisplaySelected (const Standard_Boolean theToUpdateViewer)
694 if (HasOpenedContext())
699 Standard_Boolean isFound = Standard_False;
700 Handle(AIS_Selection) aSelIter = AIS_Selection::Selection (myCurrentName.ToCString());
701 for (aSelIter->Init(); aSelIter->More(); aSelIter->Next())
703 Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (aSelIter->Value());
704 Display (anObj, Standard_False);
705 isFound = Standard_True;
708 if (isFound && theToUpdateViewer)
714 //=======================================================================
715 //function : EraseSelected
717 //=======================================================================
718 void AIS_InteractiveContext::EraseSelected (const Standard_Boolean theToUpdateViewer)
720 if (HasOpenedContext())
725 Standard_Boolean isFound = Standard_False;
726 Handle(AIS_Selection) aSelIter = AIS_Selection::Selection(myCurrentName.ToCString());
729 while (aSelIter->More())
731 Handle(SelectMgr_EntityOwner) anOwner = Handle(SelectMgr_EntityOwner)::DownCast (aSelIter->Value());
732 Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
734 Erase (anObj, Standard_False);
735 isFound = Standard_True;
740 if (isFound && theToUpdateViewer)
746 //=======================================================================
749 //=======================================================================
751 Standard_Boolean AIS_InteractiveContext::KeepTemporary(const Handle(AIS_InteractiveObject)& anIObj,
752 const Standard_Integer WhichContext)
754 if(anIObj.IsNull()) return Standard_False;
756 if(!HasOpenedContext()) return Standard_False;
757 if(myObjects.IsBound(anIObj)) return Standard_False;
758 if(WhichContext!=-1 && !myLocalContexts.IsBound(WhichContext)) return Standard_False;
760 // Protection : if one tries to preserve a temporary object
761 // which is not in the local active context... rob 11-06-97
763 Standard_Integer IsItInLocal = myCurLocalIndex;
764 Standard_Boolean Found(Standard_False);
766 while(IsItInLocal>0 && !Found){
767 if(!myLocalContexts.IsBound(IsItInLocal))
769 else if(myLocalContexts(IsItInLocal)->IsIn(anIObj))
770 Found = Standard_True;
775 if(!Found) return Standard_False;
778 // const Handle(AIS_LocalStatus)& LS = (WhichContext== -1) ?
779 // myLocalContexts(IsItInLocal)->Status(anIObj):myLocalContexts(WhichContext)->Status(anIObj);
781 // const Handle(AIS_LocalStatus)& LS = myLocalContexts(IsItInLocal)->Status(anIObj);
782 Handle(AIS_LocalStatus) LS = myLocalContexts(IsItInLocal)->Status(anIObj);
786 if(LS->IsTemporary()){
787 Standard_Integer DM,HM,SM;
788 GetDefModes(anIObj,DM,HM,SM);
790 SM = LS->SelectionModes().IsEmpty() ? SM : LS->SelectionModes().First();
791 if(LS->DisplayMode()!= DM ){
792 Standard_Integer LSM = LS->SelectionModes().IsEmpty() ? -1 : LS->SelectionModes().First();
793 myLocalContexts(IsItInLocal)->Display(anIObj,DM,LS->Decomposed(),LSM);
796 Handle (AIS_GlobalStatus) GS = new AIS_GlobalStatus(AIS_DS_Displayed,
800 // GS->SubIntensityOn();
801 myObjects.Bind(anIObj,GS);
802 mgrSelector->Load(anIObj);
803 mgrSelector->Activate(anIObj,SM,myMainSel);
805 LS->SetTemporary(Standard_False);
807 return Standard_True;
810 //=======================================================================
811 //function : DisplayStatus
813 //=======================================================================
814 AIS_DisplayStatus AIS_InteractiveContext::DisplayStatus (const Handle(AIS_InteractiveObject)& theIObj) const
816 if (theIObj.IsNull())
820 else if (myObjects.IsBound (theIObj))
822 return myObjects (theIObj)->GraphicStatus();
825 for (AIS_DataMapIteratorOfDataMapOfILC aCtxIter (myLocalContexts); aCtxIter.More(); aCtxIter.Next())
827 if (aCtxIter.Value()->IsIn (theIObj))
829 return AIS_DS_Temporary;
835 //=======================================================================
836 //function : DisplayedModes
838 //=======================================================================
839 const TColStd_ListOfInteger& AIS_InteractiveContext::DisplayedModes (const Handle(AIS_InteractiveObject)& theIObj) const
841 return myObjects (theIObj)->DisplayedModes();
844 //=======================================================================
847 //=======================================================================
848 void AIS_InteractiveContext::Remove (const Handle(AIS_InteractiveObject)& theIObj,
849 const Standard_Boolean theToUpdateViewer)
851 if (theIObj.IsNull())
856 if (HasOpenedContext())
858 myLocalContexts (myCurLocalIndex)->Remove (theIObj);
859 for (AIS_DataMapIteratorOfDataMapOfILC aCtxIter (myLocalContexts); aCtxIter.More(); aCtxIter.Next())
861 if (aCtxIter.Value()->AcceptErase())
863 aCtxIter.Value()->Remove (theIObj);
868 ClearGlobal (theIObj, theToUpdateViewer);
871 //=======================================================================
872 //function : RemoveAll
874 //=======================================================================
875 void AIS_InteractiveContext::RemoveAll (const Standard_Boolean theToUpdateViewer)
877 AIS_ListOfInteractive aList;
878 ObjectsInside (aList);
879 for (AIS_ListIteratorOfListOfInteractive aListIterator (aList); aListIterator.More(); aListIterator.Next())
881 Remove (aListIterator.Value(), Standard_False);
884 if (theToUpdateViewer)
890 //=======================================================================
891 //function : ClearPrs
893 //=======================================================================
894 void AIS_InteractiveContext::ClearPrs (const Handle(AIS_InteractiveObject)& theIObj,
895 const Standard_Integer theMode,
896 const Standard_Boolean theToUpdateViewer)
898 if (theIObj.IsNull())
903 if (!HasOpenedContext())
905 ClearGlobalPrs (theIObj, theMode, theToUpdateViewer);
909 Standard_Boolean wasInCtx = myLocalContexts (myCurLocalIndex)->ClearPrs (theIObj, theMode);
910 for (AIS_DataMapIteratorOfDataMapOfILC aCtxIter (myLocalContexts); aCtxIter.More(); aCtxIter.Next())
912 if (aCtxIter.Value()->AcceptErase())
914 wasInCtx = aCtxIter.Value()->ClearPrs (theIObj, theMode) || wasInCtx;
919 ClearGlobalPrs (theIObj, theMode, theToUpdateViewer);
921 else if (theToUpdateViewer)
927 //=======================================================================
930 //=======================================================================
931 void AIS_InteractiveContext::Hilight (const Handle(AIS_InteractiveObject)& theIObj,
932 const Standard_Boolean theToUpdateViewer)
934 if (theIObj.IsNull())
939 if (!theIObj->HasInteractiveContext())
941 theIObj->SetContext (this);
943 if (!HasOpenedContext())
945 if (!myObjects.IsBound (theIObj))
950 Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
951 aStatus->SetHilightStatus (Standard_True);
952 if (aStatus->GraphicStatus() == AIS_DS_Displayed)
954 Standard_Integer aHilightMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
955 myMainPM->Highlight (theIObj, aHilightMode);
960 myLocalContexts (myCurLocalIndex)->Hilight (theIObj);
963 if (theToUpdateViewer)
968 //=======================================================================
971 //=======================================================================
973 void AIS_InteractiveContext::HilightWithColor(const Handle(AIS_InteractiveObject)& anIObj,
974 const Quantity_NameOfColor aCol,
975 const Standard_Boolean updateviewer)
977 if(anIObj.IsNull()) return;
979 if(!anIObj->HasInteractiveContext()) anIObj->SetContext(this);
981 if (!HasOpenedContext())
983 if(!myObjects.IsBound(anIObj)) return;
985 const Handle(AIS_GlobalStatus)& aStatus = myObjects(anIObj);
986 aStatus->SetHilightStatus (Standard_True);
988 if (aStatus->GraphicStatus() == AIS_DS_Displayed)
990 const Standard_Integer aHilightMode = anIObj->HasHilightMode() ? anIObj->HilightMode() : 0;
991 myMainPM->Color (anIObj, aCol, aHilightMode);
992 aStatus->SetHilightColor (aCol);
997 myLocalContexts(myCurLocalIndex)->Hilight(anIObj,aCol);
999 if(updateviewer) myMainVwr->Update();
1002 //=======================================================================
1003 //function : Unhilight
1005 //=======================================================================
1007 void AIS_InteractiveContext::Unhilight(const Handle(AIS_InteractiveObject)& anIObj, const Standard_Boolean updateviewer)
1009 if(anIObj.IsNull()) return;
1011 if (!HasOpenedContext())
1013 if(!myObjects.IsBound(anIObj)) return;
1015 const Handle(AIS_GlobalStatus)& aStatus = myObjects(anIObj);
1016 aStatus->SetHilightStatus (Standard_False);
1017 aStatus->SetHilightColor(Quantity_NOC_WHITE);
1019 if (aStatus->GraphicStatus() == AIS_DS_Displayed)
1021 Standard_Integer aHilightMode = anIObj->HasHilightMode() ? anIObj->HilightMode() : 0;
1022 myMainPM->Unhighlight (anIObj, aHilightMode);
1027 myLocalContexts(myCurLocalIndex)->Unhilight(anIObj);
1029 if(updateviewer) myMainVwr->Update();
1032 //=======================================================================
1033 //function : IsHilighted
1035 //=======================================================================
1037 Standard_Boolean AIS_InteractiveContext::IsHilighted(const Handle(AIS_InteractiveObject)& anIObj) const
1039 if(anIObj.IsNull()) return Standard_False;
1041 if (!HasOpenedContext()){
1042 if(!myObjects.IsBound(anIObj))
1043 return Standard_False;
1044 return myObjects(anIObj)->IsHilighted();
1046 AIS_DataMapIteratorOfDataMapOfILC ItM(myLocalContexts);
1047 for(;ItM.More();ItM.Next()){
1048 if(ItM.Value()->IsHilighted(anIObj))
1049 return Standard_True;
1051 return Standard_False;
1054 Standard_Boolean AIS_InteractiveContext::IsHilighted(const Handle(AIS_InteractiveObject)& anIObj,
1055 Standard_Boolean& WithColor,
1056 Quantity_NameOfColor& TheHiCol) const
1058 if(!HasOpenedContext()){
1059 if(myObjects.IsBound(anIObj)){
1060 const Handle(AIS_GlobalStatus)& STAT = myObjects(anIObj);
1061 if(STAT->IsHilighted()){
1062 if(STAT->HilightColor()!=Quantity_NOC_WHITE){
1063 WithColor=Standard_True;
1064 TheHiCol = STAT->HilightColor();
1067 WithColor = Standard_False;
1068 return Standard_True;
1071 return Standard_False;
1073 Standard_Integer MaxIndex = HighestIndex();
1074 for(Standard_Integer i=MaxIndex;i>=1 ; i--){
1075 if(myLocalContexts.IsBound(i)){
1076 if(myLocalContexts(i)->IsHilighted(anIObj,WithColor,TheHiCol))
1077 return Standard_True;
1081 return Standard_False;
1084 //=======================================================================
1085 //function : IsHilighted
1086 //purpose : Returns true if the objects global status is set to highlighted.
1087 // theIsCustomColor flag defines if highlight color is not equal to OCCT's
1088 // default Quantity_NOC_WHITE color. If theIsCustomColor is true,
1089 // custom highlight color name will be stored to theCustomColorName
1090 //=======================================================================
1091 Standard_Boolean AIS_InteractiveContext::IsHilighted (const Handle(SelectMgr_EntityOwner)& theOwner,
1092 Standard_Boolean& theIsCustomColor,
1093 Quantity_NameOfColor& theCustomColorName) const
1095 if (theOwner.IsNull() || !theOwner->HasSelectable())
1096 return Standard_False;
1098 const Handle(AIS_InteractiveObject) anObj =
1099 Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
1101 if (!myObjects.IsBound (anObj))
1102 return Standard_False;
1104 const Handle(AIS_GlobalStatus)& anObjStatus = myObjects (anObj);
1105 if (anObjStatus->IsHilighted())
1107 if (anObjStatus->HilightColor() != Quantity_NOC_WHITE)
1109 theIsCustomColor = Standard_True;
1110 theCustomColorName = anObjStatus->HilightColor();
1114 theIsCustomColor = Standard_False;
1117 return Standard_True;
1120 return Standard_False;
1123 //=======================================================================
1124 //function : IsDisplayed
1126 //=======================================================================
1128 Standard_Boolean AIS_InteractiveContext::IsDisplayed(const Handle(AIS_InteractiveObject)& anIObj) const
1130 if(anIObj.IsNull()) return Standard_False;
1133 if(myObjects.IsBound(anIObj))
1134 if(myObjects(anIObj)->GraphicStatus()==AIS_DS_Displayed)
1135 return Standard_True;
1137 AIS_DataMapIteratorOfDataMapOfILC ItM(myLocalContexts);
1138 for(;ItM.More();ItM.Next()){
1139 if(ItM.Value()->IsDisplayed(anIObj))
1140 return Standard_True;
1142 return Standard_False;
1146 //=======================================================================
1147 //function : IsDisplayed
1149 //=======================================================================
1150 Standard_Boolean AIS_InteractiveContext::IsDisplayed (const Handle(AIS_InteractiveObject)& theIObj,
1151 const Standard_Integer theMode) const
1153 if (theIObj.IsNull())
1155 return Standard_False;
1158 if (myObjects.IsBound (theIObj))
1160 Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
1161 if (aStatus->GraphicStatus() == AIS_DS_Displayed
1162 && aStatus->IsDModeIn (theMode))
1164 return Standard_True;
1168 for (AIS_DataMapIteratorOfDataMapOfILC aCtxIter (myLocalContexts); aCtxIter.More(); aCtxIter.Next())
1170 if (aCtxIter.Value()->IsDisplayed (theIObj, theMode))
1172 return Standard_True;
1175 return Standard_False;
1178 //=======================================================================
1179 //function : DisplayPriority
1181 //=======================================================================
1182 Standard_Integer AIS_InteractiveContext::DisplayPriority (const Handle(AIS_InteractiveObject)& theIObj) const
1184 if (theIObj.IsNull())
1188 else if (!myObjects.IsBound (theIObj))
1193 Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
1194 if (aStatus->GraphicStatus() == AIS_DS_Displayed
1195 || aStatus->GraphicStatus() == AIS_DS_Erased)
1197 Standard_Integer aDispMode = theIObj->HasDisplayMode()
1198 ? theIObj->DisplayMode()
1199 : (theIObj->AcceptDisplayMode (myDisplayMode)
1202 return myMainPM->DisplayPriority (theIObj, aDispMode);
1207 //=======================================================================
1208 //function : SetDisplayPriority
1210 //=======================================================================
1211 void AIS_InteractiveContext::SetDisplayPriority (const Handle(AIS_InteractiveObject)& theIObj,
1212 const Standard_Integer thePriority)
1214 if (theIObj.IsNull())
1219 if (!theIObj->HasInteractiveContext())
1221 theIObj->SetContext (this);
1224 if (myObjects.IsBound (theIObj))
1226 Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
1227 if (aStatus->GraphicStatus() == AIS_DS_Displayed
1228 || aStatus->GraphicStatus() == AIS_DS_Erased)
1230 Standard_Integer aDisplayMode = theIObj->HasDisplayMode()
1231 ? theIObj->DisplayMode()
1232 : (theIObj->AcceptDisplayMode (myDisplayMode)
1235 myMainPM->SetDisplayPriority (theIObj, aDisplayMode, thePriority);
1238 else if (HasOpenedContext())
1240 myLocalContexts (myCurLocalIndex)->SetDisplayPriority (theIObj, thePriority);
1244 //=======================================================================
1245 //function : Redisplay
1247 //=======================================================================
1248 void AIS_InteractiveContext::Redisplay (const Handle(AIS_InteractiveObject)& theIObj,
1249 const Standard_Boolean theToUpdateViewer,
1250 const Standard_Boolean theAllModes)
1252 RecomputePrsOnly (theIObj, theToUpdateViewer, theAllModes);
1253 RecomputeSelectionOnly (theIObj);
1256 //=======================================================================
1257 //function : Redisplay
1259 //=======================================================================
1260 void AIS_InteractiveContext::Redisplay (const AIS_KindOfInteractive theKOI,
1261 const Standard_Integer /*theSign*/,
1262 const Standard_Boolean theToUpdateViewer)
1264 Standard_Boolean isRedisplayed = Standard_False;
1265 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
1267 Handle(AIS_InteractiveObject) anObj = anObjIter.Key();
1268 if (anObj->Type() != theKOI)
1273 Redisplay (anObj, Standard_False);
1274 isRedisplayed = anObjIter.Value()->GraphicStatus() == AIS_DS_Displayed
1278 if (theToUpdateViewer
1281 myMainVwr->Update();
1285 //=======================================================================
1286 //function : RecomputePrsOnly
1288 //=======================================================================
1289 void AIS_InteractiveContext::RecomputePrsOnly (const Handle(AIS_InteractiveObject)& theIObj,
1290 const Standard_Boolean theToUpdateViewer,
1291 const Standard_Boolean theAllModes)
1293 if (theIObj.IsNull())
1298 theIObj->Update (theAllModes);
1299 if (!theToUpdateViewer)
1304 if (HasOpenedContext()
1305 || (myObjects.IsBound (theIObj)
1306 && myObjects (theIObj)->GraphicStatus() == AIS_DS_Displayed))
1308 myMainVwr->Update();
1311 //=======================================================================
1312 //function : RecomputeSelectionOnly
1314 //=======================================================================
1315 void AIS_InteractiveContext::RecomputeSelectionOnly (const Handle(AIS_InteractiveObject)& theIO)
1322 mgrSelector->RecomputeSelection (theIO);
1324 if (HasOpenedContext())
1326 for (Standard_Integer aContextIdx = 1; aContextIdx <= myLocalContexts.Extent(); aContextIdx++)
1328 myLocalContexts (aContextIdx)->ClearOutdatedSelection (theIO, Standard_False);
1333 if (!myObjects.IsBound (theIO) ||
1334 myObjects (theIO)->GraphicStatus() != AIS_DS_Displayed)
1339 TColStd_ListOfInteger aModes;
1340 ActivatedModes (theIO, aModes);
1341 TColStd_ListIteratorOfListOfInteger aModesIter (aModes);
1342 for (; aModesIter.More(); aModesIter.Next())
1344 mgrSelector->Activate (theIO, aModesIter.Value(), myMainSel);
1348 //=======================================================================
1351 //=======================================================================
1352 void AIS_InteractiveContext::Update (const Handle(AIS_InteractiveObject)& theIObj,
1353 const Standard_Boolean theUpdateViewer)
1355 if (theIObj.IsNull())
1360 TColStd_ListOfInteger aPrsModes;
1361 theIObj->ToBeUpdated (aPrsModes);
1362 for (TColStd_ListIteratorOfListOfInteger aPrsModesIt (aPrsModes); aPrsModesIt.More(); aPrsModesIt.Next())
1364 theIObj->Update (aPrsModesIt.Value(), Standard_False);
1367 mgrSelector->Update(theIObj);
1369 for (Standard_Integer aContextIdx = 1; aContextIdx <= myLocalContexts.Extent(); aContextIdx++)
1371 myLocalContexts (aContextIdx)->ClearOutdatedSelection (theIObj, Standard_False);
1374 if (theUpdateViewer)
1376 if (!myObjects.IsBound (theIObj))
1381 switch (myObjects (theIObj)->GraphicStatus())
1383 case AIS_DS_Displayed:
1384 case AIS_DS_Temporary:
1385 myMainVwr->Update();
1393 //=======================================================================
1394 //function : SetLocation
1396 //=======================================================================
1397 void AIS_InteractiveContext::SetLocation (const Handle(AIS_InteractiveObject)& theIObj,
1398 const TopLoc_Location& theLoc)
1400 if (theIObj.IsNull())
1405 if (theIObj->HasTransformation()
1406 && theLoc.IsIdentity())
1408 theIObj->ResetTransformation();
1409 mgrSelector->Update (theIObj, Standard_False);
1412 else if (theLoc.IsIdentity())
1417 // first reset the previous location to properly clean everything...
1418 if (theIObj->HasTransformation())
1420 theIObj->ResetTransformation();
1423 theIObj->SetLocalTransformation (theLoc.Transformation());
1425 if (!HasOpenedContext())
1427 mgrSelector->Update (theIObj, Standard_False);
1431 Handle(StdSelect_ViewerSelector3d) aTempSel = myLocalContexts (myCurLocalIndex)->MainSelector();
1432 mgrSelector->Update (theIObj, aTempSel, Standard_False);
1436 //=======================================================================
1437 //function : ResetLocation
1439 //=======================================================================
1440 void AIS_InteractiveContext::ResetLocation (const Handle(AIS_InteractiveObject)& theIObj)
1442 if (theIObj.IsNull())
1447 theIObj->ResetTransformation();
1448 mgrSelector->Update (theIObj, Standard_False);
1451 //=======================================================================
1452 //function : HasLocation
1454 //=======================================================================
1455 Standard_Boolean AIS_InteractiveContext::HasLocation (const Handle(AIS_InteractiveObject)& theIObj) const
1457 return !theIObj.IsNull()
1458 && theIObj->HasTransformation();
1461 //=======================================================================
1462 //function : Location
1464 //=======================================================================
1465 TopLoc_Location AIS_InteractiveContext::Location (const Handle(AIS_InteractiveObject)& theIObj) const
1467 return theIObj->Transformation();
1470 //=======================================================================
1471 //function : SetDeviationCoefficient
1473 //=======================================================================
1474 void AIS_InteractiveContext::SetDeviationCoefficient (const Standard_Real theCoefficient)
1476 myDefaultDrawer->SetDeviationCoefficient (theCoefficient);
1479 //=======================================================================
1480 //function : SetDeviationAngle
1482 //=======================================================================
1483 void AIS_InteractiveContext::SetDeviationAngle (const Standard_Real theAngle)
1485 myDefaultDrawer->SetDeviationCoefficient (theAngle);
1488 //=======================================================================
1489 //function : DeviationAngle
1490 //purpose : Gets deviationAngle
1491 //=======================================================================
1492 Standard_Real AIS_InteractiveContext::DeviationAngle() const
1494 return myDefaultDrawer->DeviationAngle();
1497 //=======================================================================
1498 //function : DeviationCoefficient
1500 //=======================================================================
1501 Standard_Real AIS_InteractiveContext::DeviationCoefficient() const
1503 return myDefaultDrawer->DeviationCoefficient();
1506 //=======================================================================
1507 //function : SetHLRDeviationCoefficient
1509 //=======================================================================
1510 void AIS_InteractiveContext::SetHLRDeviationCoefficient (const Standard_Real theCoefficient)
1512 myDefaultDrawer->SetHLRDeviationCoefficient (theCoefficient);
1515 //=======================================================================
1516 //function : HLRDeviationCoefficient
1518 //=======================================================================
1519 Standard_Real AIS_InteractiveContext::HLRDeviationCoefficient() const
1521 return myDefaultDrawer->HLRDeviationCoefficient();
1524 //=======================================================================
1525 //function : SetHLRAngle
1527 //=======================================================================
1528 void AIS_InteractiveContext::SetHLRAngle (const Standard_Real theAngle)
1530 myDefaultDrawer->SetHLRAngle (theAngle);
1533 //=======================================================================
1534 //function : SetHLRAngleAndDeviation
1535 //purpose : compute with anangle a HLRAngle and a HLRDeviationCoefficient
1536 // and set them in myHLRAngle and in myHLRDeviationCoefficient
1537 // of myDefaultDrawer
1538 //=======================================================================
1539 void AIS_InteractiveContext::SetHLRAngleAndDeviation (const Standard_Real theAngle)
1541 Standard_Real anOutAngl, anOutDefl;
1542 HLRBRep::PolyHLRAngleAndDeflection (theAngle, anOutAngl, anOutDefl);
1544 myDefaultDrawer->SetHLRAngle (anOutAngl);
1545 myDefaultDrawer->SetHLRDeviationCoefficient (anOutDefl);
1548 //=======================================================================
1549 //function : HLRAngle
1551 //=======================================================================
1552 Standard_Real AIS_InteractiveContext::HLRAngle() const
1554 return myDefaultDrawer->HLRAngle();
1557 //=======================================================================
1558 //function : SetDisplayMode
1560 //=======================================================================
1561 void AIS_InteractiveContext::SetDisplayMode (const AIS_DisplayMode theMode,
1562 const Standard_Boolean theToUpdateViewer)
1564 if (theMode == myDisplayMode)
1569 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
1571 Handle(AIS_InteractiveObject) anObj = anObjIter.Key();
1572 Standard_Boolean toProcess = anObj->IsKind (STANDARD_TYPE(AIS_Shape))
1573 || anObj->IsKind (STANDARD_TYPE(AIS_ConnectedInteractive))
1574 || anObj->IsKind (STANDARD_TYPE(AIS_MultipleConnectedInteractive));
1577 || anObj->HasDisplayMode()
1578 || !anObj->AcceptDisplayMode (theMode))
1583 Handle(AIS_GlobalStatus) aStatus = anObjIter.Value();
1584 if (aStatus->IsDModeIn (myDisplayMode))
1586 aStatus->RemoveDisplayMode (myDisplayMode);
1589 aStatus->AddDisplayMode (theMode);
1590 if (aStatus->GraphicStatus() == AIS_DS_Displayed)
1592 myMainPM->Display (anObj, theMode);
1593 if (!myLastPicked.IsNull() && myLastPicked->Selectable() == anObj)
1595 myMainPM->BeginImmediateDraw();
1596 myMainPM->Unhighlight (anObj, myDisplayMode);
1597 myMainPM->EndImmediateDraw (myMainVwr);
1599 if (aStatus->IsSubIntensityOn())
1601 myMainPM->Color (anObj, mySubIntensity, theMode);
1603 myMainPM->SetVisibility (anObj, myDisplayMode, Standard_False);
1607 myDisplayMode = theMode;
1608 if (theToUpdateViewer)
1610 myMainVwr->Update();
1614 //=======================================================================
1615 //function : SetDisplayMode
1617 //=======================================================================
1618 void AIS_InteractiveContext::SetDisplayMode (const Handle(AIS_InteractiveObject)& theIObj,
1619 const Standard_Integer theMode,
1620 const Standard_Boolean theToUpdateViewer)
1622 if (!theIObj->HasInteractiveContext())
1624 theIObj->SetContext(this);
1627 if (!myObjects.IsBound (theIObj))
1629 theIObj->SetDisplayMode (theMode);
1632 else if (!theIObj->AcceptDisplayMode (theMode))
1637 Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
1638 if (aStatus->GraphicStatus() != AIS_DS_Displayed)
1640 theIObj->SetDisplayMode (theMode);
1644 // erase presentations for all display modes different from <aMode>
1645 TColStd_ListOfInteger aModesToRemove;
1646 for (TColStd_ListIteratorOfListOfInteger aDispModeIter (aStatus->DisplayedModes()); aDispModeIter.More(); aDispModeIter.Next())
1648 const Standard_Integer anOldMode = aDispModeIter.Value();
1649 if (anOldMode != theMode)
1651 aModesToRemove.Append (anOldMode);
1652 if (myMainPM->IsHighlighted (theIObj, anOldMode))
1654 myMainPM->Unhighlight (theIObj, anOldMode);
1656 myMainPM->SetVisibility (theIObj, anOldMode, Standard_False);
1660 for (TColStd_ListIteratorOfListOfInteger aRemModeIter (aModesToRemove); aRemModeIter.More(); aRemModeIter.Next())
1662 aStatus->RemoveDisplayMode (aRemModeIter.Value());
1665 if (!aStatus->IsDModeIn (theMode))
1667 aStatus->AddDisplayMode (theMode);
1670 myMainPM->Display (theIObj, theMode);
1671 Standard_Integer aDispMode, aHiMode, aSelMode;
1672 GetDefModes (theIObj, aDispMode, aHiMode, aSelMode);
1673 if (aStatus->IsHilighted())
1675 myMainPM->Highlight (theIObj, aHiMode);
1677 if (aStatus->IsSubIntensityOn())
1679 myMainPM->Color (theIObj, mySubIntensity, theMode);
1682 if (theToUpdateViewer)
1684 myMainVwr->Update();
1686 theIObj->SetDisplayMode (theMode);
1689 //=======================================================================
1690 //function : UnsetDisplayMode
1692 //=======================================================================
1693 void AIS_InteractiveContext::UnsetDisplayMode (const Handle(AIS_InteractiveObject)& theIObj,
1694 const Standard_Boolean theToUpdateViewer)
1696 if (theIObj.IsNull()
1697 || !theIObj->HasDisplayMode())
1702 if (!myObjects.IsBound (theIObj))
1704 theIObj->UnsetDisplayMode();
1708 const Standard_Integer anOldMode = theIObj->DisplayMode();
1709 if (myDisplayMode == anOldMode)
1714 const Handle(AIS_GlobalStatus)& aStatus = myObjects (theIObj);
1715 aStatus->RemoveDisplayMode (anOldMode);
1716 if (!aStatus->IsDModeIn(myDisplayMode))
1718 aStatus->AddDisplayMode (myDisplayMode);
1721 if (aStatus->GraphicStatus() == AIS_DS_Displayed)
1723 if (myMainPM->IsHighlighted (theIObj, anOldMode))
1725 myMainPM->Unhighlight (theIObj, anOldMode);
1727 myMainPM->SetVisibility (theIObj, anOldMode, Standard_False);
1728 myMainPM->Display (theIObj, myDisplayMode);
1730 Standard_Integer aDispMode, aHiMode, aSelMode;
1731 GetDefModes (theIObj, aDispMode, aHiMode, aSelMode);
1732 if (aStatus->IsHilighted())
1734 myMainPM->Highlight (theIObj, aHiMode);
1736 if (aStatus->IsSubIntensityOn())
1738 myMainPM->Color (theIObj, mySubIntensity, myDisplayMode);
1741 if (theToUpdateViewer)
1743 myMainVwr->Update();
1747 theIObj->UnsetDisplayMode();
1750 //=======================================================================
1751 //function : SetCurrentFacingModel
1753 //=======================================================================
1754 void AIS_InteractiveContext::SetCurrentFacingModel (const Handle(AIS_InteractiveObject)& theIObj,
1755 const Aspect_TypeOfFacingModel theModel)
1757 if (!theIObj.IsNull())
1759 theIObj->SetCurrentFacingModel (theModel);
1763 //=======================================================================
1764 //function : redisplayPrsRecModes
1766 //=======================================================================
1767 void AIS_InteractiveContext::redisplayPrsRecModes (const Handle(AIS_InteractiveObject)& theIObj,
1768 const Standard_Boolean theToUpdateViewer)
1770 if (theIObj->RecomputeEveryPrs())
1772 theIObj->Update (Standard_True);
1773 theIObj->UpdateSelection();
1777 for (TColStd_ListIteratorOfListOfInteger aModes (theIObj->ListOfRecomputeModes()); aModes.More(); aModes.Next())
1779 theIObj->Update (aModes.Value(), Standard_False);
1781 theIObj->UpdateSelection();
1782 theIObj->SetRecomputeOk();
1785 if (theToUpdateViewer)
1787 UpdateCurrentViewer();
1791 //=======================================================================
1792 //function : redisplayPrsModes
1794 //=======================================================================
1795 void AIS_InteractiveContext::redisplayPrsModes (const Handle(AIS_InteractiveObject)& theIObj,
1796 const Standard_Boolean theToUpdateViewer)
1798 if (theIObj->RecomputeEveryPrs())
1800 theIObj->Update (Standard_True);
1801 theIObj->UpdateSelection();
1805 TColStd_ListOfInteger aModes;
1806 theIObj->ToBeUpdated (aModes);
1807 for (TColStd_ListIteratorOfListOfInteger aModeIter (aModes); aModeIter.More(); aModeIter.Next())
1809 theIObj->Update (aModeIter.Value(), Standard_False);
1811 theIObj->SetRecomputeOk();
1814 if (theToUpdateViewer)
1816 UpdateCurrentViewer();
1820 //=======================================================================
1821 //function : SetColor
1823 //=======================================================================
1824 void AIS_InteractiveContext::SetColor (const Handle(AIS_InteractiveObject)& theIObj,
1825 const Quantity_NameOfColor theColor,
1826 const Standard_Boolean theToUpdateViewer)
1828 SetColor (theIObj, Quantity_Color(theColor), theToUpdateViewer);
1831 //=======================================================================
1832 //function : SetColor
1834 //=======================================================================
1835 void AIS_InteractiveContext::SetColor (const Handle(AIS_InteractiveObject)& theIObj,
1836 const Quantity_Color& theColor,
1837 const Standard_Boolean theToUpdateViewer)
1839 if (theIObj.IsNull())
1844 if (!theIObj->HasInteractiveContext())
1846 theIObj->SetContext (this);
1848 theIObj->SetColor (theColor);
1849 redisplayPrsRecModes (theIObj, theToUpdateViewer);
1852 //=======================================================================
1853 //function : SetIsoOnTriangulation
1855 //=======================================================================
1856 void AIS_InteractiveContext::IsoOnTriangulation (const Standard_Boolean theIsEnabled,
1857 const Handle(AIS_InteractiveObject)& theObject)
1859 if (theObject.IsNull())
1864 theObject->SetIsoOnTriangulation (theIsEnabled);
1867 //=======================================================================
1868 //function : SetDeviationCoefficient
1870 //=======================================================================
1871 void AIS_InteractiveContext::SetDeviationCoefficient (const Handle(AIS_InteractiveObject)& theIObj,
1872 const Standard_Real theCoefficient,
1873 const Standard_Boolean theToUpdateViewer)
1875 if (theIObj.IsNull())
1880 if (!theIObj->HasInteractiveContext())
1882 theIObj->SetContext (this);
1885 // to be modified after the related methods of AIS_Shape are passed to InteractiveObject
1886 if (theIObj->Type() != AIS_KOI_Object
1887 && theIObj->Type() != AIS_KOI_Shape)
1891 else if (theIObj->Signature() != 0)
1896 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1897 aShape->SetOwnDeviationCoefficient (theCoefficient);
1898 redisplayPrsModes (theIObj, theToUpdateViewer);
1901 //=======================================================================
1902 //function : SetHLRDeviationCoefficient
1904 //=======================================================================
1905 void AIS_InteractiveContext::SetHLRDeviationCoefficient (const Handle(AIS_InteractiveObject)& theIObj,
1906 const Standard_Real theCoefficient,
1907 const Standard_Boolean theToUpdateViewer)
1909 if (theIObj.IsNull())
1914 if (!theIObj->HasInteractiveContext())
1916 theIObj->SetContext (this);
1919 // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
1920 if (theIObj->Type() != AIS_KOI_Object
1921 && theIObj->Type() != AIS_KOI_Shape)
1925 else if (theIObj->Signature() != 0)
1930 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1931 aShape->SetOwnHLRDeviationCoefficient (theCoefficient);
1932 redisplayPrsModes (theIObj, theToUpdateViewer);
1935 //=======================================================================
1936 //function : SetDeviationAngle
1938 //=======================================================================
1939 void AIS_InteractiveContext::SetDeviationAngle (const Handle(AIS_InteractiveObject)& theIObj,
1940 const Standard_Real theAngle,
1941 const Standard_Boolean theToUpdateViewer)
1943 if (theIObj.IsNull())
1948 if (!theIObj->HasInteractiveContext())
1950 theIObj->SetContext (this);
1953 // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
1954 if (theIObj->Type() != AIS_KOI_Shape)
1958 else if (theIObj->Signature() != 0)
1963 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1964 aShape->SetOwnDeviationAngle (theAngle);
1965 redisplayPrsModes (theIObj, theToUpdateViewer);
1968 //=======================================================================
1969 //function : SetAngleAndDeviation
1971 //=======================================================================
1972 void AIS_InteractiveContext::SetAngleAndDeviation (const Handle(AIS_InteractiveObject)& theIObj,
1973 const Standard_Real theAngle,
1974 const Standard_Boolean theToUpdateViewer)
1976 if (theIObj.IsNull())
1981 if (!theIObj->HasInteractiveContext())
1983 theIObj->SetContext (this);
1986 // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
1987 if (theIObj->Type() != AIS_KOI_Shape)
1991 if (theIObj->Signature() != 0)
1996 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1997 aShape->SetAngleAndDeviation (theAngle);
1999 if (theIObj->RecomputeEveryPrs())
2001 theIObj->Update (Standard_True);
2002 theIObj->UpdateSelection();
2006 Update (theIObj, theToUpdateViewer);
2010 //=======================================================================
2011 //function : SetHLRAngleAndDeviation
2013 //=======================================================================
2014 void AIS_InteractiveContext::SetHLRAngleAndDeviation (const Handle(AIS_InteractiveObject)& theIObj,
2015 const Standard_Real theAngle,
2016 const Standard_Boolean theToUpdateViewer)
2018 if (theIObj.IsNull())
2023 if (!theIObj->HasInteractiveContext())
2025 theIObj->SetContext (this);
2028 // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
2029 if (theIObj->Type() != AIS_KOI_Shape)
2033 if (theIObj->Signature() != 0)
2037 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
2038 aShape->SetHLRAngleAndDeviation (theAngle);
2039 redisplayPrsModes (theIObj, theToUpdateViewer);
2042 //=======================================================================
2043 //function : SetHLRDeviationAngle
2045 //=======================================================================
2046 void AIS_InteractiveContext::SetHLRDeviationAngle (const Handle(AIS_InteractiveObject)& theIObj,
2047 const Standard_Real theAngle,
2048 const Standard_Boolean theToUpdateViewer)
2050 if (theIObj.IsNull())
2055 if (!theIObj->HasInteractiveContext())
2057 theIObj->SetContext (this);
2060 // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
2061 if (theIObj->Type() != AIS_KOI_Shape)
2065 if (theIObj->Signature() != 0)
2069 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
2070 aShape->SetOwnHLRDeviationAngle (theAngle);
2071 redisplayPrsModes (theIObj, theToUpdateViewer);
2074 //=======================================================================
2075 //function : UnsetColor
2077 //=======================================================================
2078 void AIS_InteractiveContext::UnsetColor (const Handle(AIS_InteractiveObject)& theIObj,
2079 const Standard_Boolean theToUpdateViewer)
2081 if (theIObj.IsNull())
2086 theIObj->UnsetColor();
2087 redisplayPrsRecModes (theIObj, theToUpdateViewer);
2090 //=======================================================================
2091 //function : HasColor
2093 //=======================================================================
2094 Standard_Boolean AIS_InteractiveContext::HasColor (const Handle(AIS_InteractiveObject)& theIObj) const
2096 return theIObj->HasColor();
2099 //=======================================================================
2102 //=======================================================================
2103 Quantity_NameOfColor AIS_InteractiveContext::Color (const Handle(AIS_InteractiveObject)& theIObj) const
2105 return theIObj->Color();
2108 //=======================================================================
2111 //=======================================================================
2112 void AIS_InteractiveContext::Color (const Handle(AIS_InteractiveObject)& theIObj,
2113 Quantity_Color& theColor) const
2115 theIObj->Color (theColor);
2118 //=======================================================================
2121 //=======================================================================
2122 Standard_Real AIS_InteractiveContext::Width (const Handle(AIS_InteractiveObject)& theIObj) const
2124 return theIObj->Width();
2127 //=======================================================================
2128 //function : SetWidth
2130 //=======================================================================
2131 void AIS_InteractiveContext::SetWidth (const Handle(AIS_InteractiveObject)& theIObj,
2132 const Standard_Real theWidth,
2133 const Standard_Boolean theToUpdateViewer)
2135 if (theIObj.IsNull())
2140 if (!theIObj->HasInteractiveContext())
2142 theIObj->SetContext (this);
2145 theIObj->SetWidth (theWidth);
2146 redisplayPrsRecModes (theIObj, theToUpdateViewer);
2147 if (!myLastinMain.IsNull() && myLastinMain->Selectable() == theIObj)
2149 if (myLastinMain->IsAutoHilight())
2151 const Standard_Integer aHiMode =
2152 theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
2153 myLastinMain->HilightWithColor (myMainPM, myLastinMain->IsSelected() ? mySelectionColor : myHilightColor, aHiMode);
2157 theIObj->HilightOwnerWithColor (myMainPM, myLastinMain->IsSelected() ? mySelectionColor : myHilightColor, myLastinMain);
2162 //=======================================================================
2163 //function : UnsetWidth
2165 //=======================================================================
2166 void AIS_InteractiveContext::UnsetWidth (const Handle(AIS_InteractiveObject)& theIObj,
2167 const Standard_Boolean theToUpdateViewer)
2169 if (theIObj.IsNull())
2174 theIObj->UnsetWidth();
2175 redisplayPrsRecModes (theIObj, theToUpdateViewer);
2178 //=======================================================================
2179 //function : SetMaterial
2181 //=======================================================================
2182 void AIS_InteractiveContext::SetMaterial (const Handle(AIS_InteractiveObject)& theIObj,
2183 const Graphic3d_NameOfMaterial theName,
2184 const Standard_Boolean theToUpdateViewer)
2186 if (theIObj.IsNull())
2191 if (!theIObj->HasInteractiveContext())
2193 theIObj->SetContext (this);
2196 theIObj->SetMaterial (theName);
2197 redisplayPrsRecModes (theIObj, theToUpdateViewer);
2200 //=======================================================================
2201 //function : UnsetMaterial
2203 //=======================================================================
2204 void AIS_InteractiveContext::UnsetMaterial (const Handle(AIS_InteractiveObject)& theIObj,
2205 const Standard_Boolean theToUpdateViewer)
2207 if (theIObj.IsNull())
2211 theIObj->UnsetMaterial();
2212 redisplayPrsRecModes (theIObj, theToUpdateViewer);
2215 //=======================================================================
2216 //function : SetTransparency
2218 //=======================================================================
2219 void AIS_InteractiveContext::SetTransparency (const Handle(AIS_InteractiveObject)& theIObj,
2220 const Standard_Real theValue,
2221 const Standard_Boolean theToUpdateViewer)
2223 if (theIObj.IsNull())
2228 if (!theIObj->HasInteractiveContext())
2230 theIObj->SetContext (this);
2233 if (!theIObj->IsTransparent()
2234 && theValue <= 0.05)
2239 if (theValue <= 0.05)
2241 UnsetTransparency (theIObj, theToUpdateViewer);
2245 theIObj->SetTransparency (theValue);
2246 redisplayPrsRecModes (theIObj, theToUpdateViewer);
2249 //=======================================================================
2250 //function : UnsetTransparency
2252 //=======================================================================
2253 void AIS_InteractiveContext::UnsetTransparency (const Handle(AIS_InteractiveObject)& theIObj,
2254 const Standard_Boolean theToUpdateViewer)
2256 if (theIObj.IsNull())
2261 theIObj->UnsetTransparency();
2262 redisplayPrsRecModes (theIObj, theToUpdateViewer);
2265 //=======================================================================
2266 //function : SetSelectedAspect
2268 //=======================================================================
2269 void AIS_InteractiveContext::SetSelectedAspect (const Handle(Prs3d_BasicAspect)& theAspect,
2270 const Standard_Boolean theIsGlobalChange,
2271 const Standard_Boolean theToUpdateViewer)
2273 if (HasOpenedContext())
2278 Standard_Boolean isFound = Standard_False;
2279 Handle(AIS_Selection) aSelIter = AIS_Selection::Selection (myCurrentName.ToCString());
2280 for (aSelIter->Init(); aSelIter->More(); aSelIter->Next())
2282 isFound = Standard_True;
2283 Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (aSelIter->Value());
2284 anObj->SetAspect (theAspect, theIsGlobalChange);
2288 && theToUpdateViewer)
2290 myMainVwr->Update();
2294 //=======================================================================
2295 //function : SetLocalAttributes
2297 //=======================================================================
2298 void AIS_InteractiveContext::SetLocalAttributes (const Handle(AIS_InteractiveObject)& theIObj,
2299 const Handle(Prs3d_Drawer)& theDrawer,
2300 const Standard_Boolean theToUpdateViewer)
2302 if (theIObj.IsNull())
2307 if (!theIObj->HasInteractiveContext())
2309 theIObj->SetContext (this);
2312 theIObj->SetAttributes (theDrawer);
2313 Update (theIObj, theToUpdateViewer);
2316 //=======================================================================
2317 //function : UnsetLocalAttributes
2319 //=======================================================================
2320 void AIS_InteractiveContext::UnsetLocalAttributes (const Handle(AIS_InteractiveObject)& theIObj,
2321 const Standard_Boolean theToUpdateViewer)
2323 if (theIObj.IsNull())
2328 if (!theIObj->HasInteractiveContext())
2330 theIObj->SetContext (this);
2332 theIObj->UnsetAttributes();
2333 Update (theIObj, theToUpdateViewer);
2336 //=======================================================================
2339 //=======================================================================
2340 void AIS_InteractiveContext::Status (const Handle(AIS_InteractiveObject)& theIObj,
2341 TCollection_ExtendedString& theStatus) const
2344 if (theIObj.IsNull()
2345 || !myObjects.IsBound (theIObj))
2350 theStatus += "\t ____________________________________________";
2351 theStatus += "\t| Known at Neutral Point:\n\tDisplayStatus:";
2352 const Handle(AIS_GlobalStatus)& aStatus = myObjects (theIObj);
2353 switch (aStatus->GraphicStatus())
2355 case AIS_DS_Displayed:
2357 theStatus += "\t| -->Displayed\n";
2362 theStatus += "\t| -->Erased\n";
2369 theStatus += "\t| Active Display Modes in the MainViewer :\n";
2370 for (TColStd_ListIteratorOfListOfInteger aDispModeIter (aStatus->DisplayedModes()); aDispModeIter.More(); aDispModeIter.Next())
2372 theStatus += "\t|\t Mode ";
2373 theStatus += TCollection_AsciiString (aDispModeIter.Value());
2376 if (IsSelected(theIObj)) theStatus +="\t| Selected\n";
2378 theStatus += "\t| Active Selection Modes in the MainViewer :\n";
2379 for (TColStd_ListIteratorOfListOfInteger aSelModeIter (aStatus->SelectionModes()); aSelModeIter.More(); aSelModeIter.Next())
2381 theStatus += "\t\t Mode ";
2382 theStatus += TCollection_AsciiString (aSelModeIter.Value());
2385 theStatus += "\t ____________________________________________";
2388 //=======================================================================
2389 //function : GetDefModes
2391 //=======================================================================
2392 void AIS_InteractiveContext::GetDefModes (const Handle(AIS_InteractiveObject)& theIObj,
2393 Standard_Integer& theDispMode,
2394 Standard_Integer& theHiMode,
2395 Standard_Integer& theSelMode) const
2397 if (theIObj.IsNull())
2402 theDispMode = theIObj->HasDisplayMode()
2403 ? theIObj->DisplayMode()
2404 : (theIObj->AcceptDisplayMode (myDisplayMode)
2407 theHiMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : theDispMode;
2408 theSelMode = theIObj->GlobalSelectionMode();
2411 //=======================================================================
2412 //function : EraseGlobal
2414 //=======================================================================
2415 void AIS_InteractiveContext::EraseGlobal (const Handle(AIS_InteractiveObject)& theIObj,
2416 const Standard_Boolean theToUpdateviewer)
2418 if (theIObj.IsNull()
2419 || !myObjects.IsBound (theIObj))
2424 Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
2426 const Standard_Integer aDispMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
2427 if (aStatus->GraphicStatus() == AIS_DS_Temporary
2428 || aStatus->GraphicStatus() == AIS_DS_Erased)
2433 for (TColStd_ListIteratorOfListOfInteger aDispModeIter (aStatus->DisplayedModes()); aDispModeIter.More(); aDispModeIter.Next())
2435 if (aStatus->IsHilighted())
2437 if (IsCurrent (theIObj))
2439 AddOrRemoveCurrentObject (theIObj, Standard_False);
2441 else if (myMainPM->IsHighlighted (theIObj, aDispModeIter.Value()))
2443 myMainPM->Unhighlight (theIObj, aDispModeIter.Value());
2447 myMainPM->SetVisibility (theIObj, aDispModeIter.Value(), Standard_False);
2450 if (IsSelected (theIObj)
2451 && !aStatus->IsDModeIn (aDispMode))
2453 myMainPM->SetVisibility (theIObj, aDispMode, Standard_False);
2456 for (TColStd_ListIteratorOfListOfInteger aSelModeIter (aStatus->SelectionModes()); aSelModeIter.More(); aSelModeIter.Next())
2458 mgrSelector->Deactivate (theIObj, aSelModeIter.Value(), myMainSel);
2460 aStatus->ClearSelectionModes();
2461 aStatus->SetGraphicStatus (AIS_DS_Erased);
2463 if (theToUpdateviewer)
2465 myMainVwr->Update();
2469 //=======================================================================
2470 //function : unhighlightOwners
2472 //=======================================================================
2473 void AIS_InteractiveContext::unhighlightOwners (const Handle(AIS_InteractiveObject)& theObject)
2475 Handle(AIS_Selection) aSel = AIS_Selection::Selection (myCurrentName.ToCString());
2477 while (aSel->More())
2479 const Handle(SelectMgr_EntityOwner) anOwner =
2480 Handle(SelectMgr_EntityOwner)::DownCast (aSel->Value());
2481 if (anOwner->Selectable() == theObject)
2483 if (anOwner->IsSelected())
2485 AddOrRemoveSelected (anOwner, Standard_False);
2494 //=======================================================================
2495 //function : ClearGlobal
2497 //=======================================================================
2498 void AIS_InteractiveContext::ClearGlobal (const Handle(AIS_InteractiveObject)& theIObj,
2499 const Standard_Boolean theToUpdateviewer)
2501 if (theIObj.IsNull()
2502 || !myObjects.IsBound (theIObj))
2504 // for cases when reference shape of connected interactives was not displayed
2505 // but its selection primitives were calculated
2506 const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
2507 mgrSelector->Remove (anObj);
2511 Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
2512 unhighlightOwners (theIObj);
2513 for (TColStd_ListIteratorOfListOfInteger aDispModeIter (aStatus->DisplayedModes()); aDispModeIter.More(); aDispModeIter.Next())
2515 myMainPM->Erase (theIObj, aDispModeIter.Value());
2516 myMainPM->Clear (theIObj, aDispModeIter.Value());
2519 // Object removes from Detected sequence
2520 for(Standard_Integer aDetIter = 1; aDetIter < myAISDetectedSeq.Length(); ++aDetIter)
2522 Handle(AIS_InteractiveObject) anObj = DetectedCurrentObject();
2524 && anObj != theIObj)
2526 myAISDetectedSeq.Remove (aDetIter);
2530 // remove IO from the selection manager to avoid memory leaks
2531 const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
2532 mgrSelector->Remove (anObj);
2534 myObjects.UnBind (theIObj);
2535 myMainVwr->Viewer()->UnregisterObject (theIObj);
2536 for (myMainVwr->InitDefinedViews(); myMainVwr->MoreDefinedViews(); myMainVwr->NextDefinedViews())
2538 myMainVwr->DefinedView()->View()->ChangeHiddenObjects()->Remove (theIObj.get());
2541 if (!myLastinMain.IsNull() && myLastinMain->Selectable() == theIObj)
2542 myLastinMain.Nullify();
2543 if (!myLastPicked.IsNull() && myLastPicked->Selectable() == theIObj)
2544 myLastPicked.Nullify();
2545 myMainPM->ClearImmediateDraw();
2547 if (theToUpdateviewer && aStatus->GraphicStatus() == AIS_DS_Displayed)
2549 myMainVwr->Update();
2553 //=======================================================================
2554 //function : ClearGlobalPrs
2556 //=======================================================================
2557 void AIS_InteractiveContext::ClearGlobalPrs (const Handle(AIS_InteractiveObject)& theIObj,
2558 const Standard_Integer theMode,
2559 const Standard_Boolean theToUpdateViewer)
2561 if (theIObj.IsNull()
2562 || !myObjects.IsBound (theIObj))
2567 const Handle(AIS_GlobalStatus)& aStatus = myObjects (theIObj);
2568 if (aStatus->IsDModeIn (theMode))
2570 const Standard_Integer aDispMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
2571 if (aDispMode == theMode
2572 && myMainPM->IsHighlighted (theIObj, theMode))
2574 myMainPM->Unhighlight (theIObj, theMode);
2577 myMainPM->Erase (theIObj, theMode);
2578 myMainPM->Clear (theIObj, theMode);
2581 if (aStatus->GraphicStatus() == AIS_DS_Displayed
2582 && theToUpdateViewer)
2584 myMainVwr->Update();
2588 //=======================================================================
2589 //function : DrawHiddenLine
2591 //=======================================================================
2592 Standard_Boolean AIS_InteractiveContext::DrawHiddenLine() const
2594 return myDefaultDrawer->DrawHiddenLine();
2597 //=======================================================================
2598 //function : EnableDrawHiddenLine
2600 //=======================================================================
2601 void AIS_InteractiveContext::EnableDrawHiddenLine() const
2603 myDefaultDrawer->EnableDrawHiddenLine();
2606 //=======================================================================
2607 //function : DisableDrawHiddenLine
2609 //=======================================================================
2610 void AIS_InteractiveContext::DisableDrawHiddenLine() const
2612 myDefaultDrawer->DisableDrawHiddenLine();
2615 //=======================================================================
2616 //function : HiddenLineAspect
2618 //=======================================================================
2619 Handle (Prs3d_LineAspect) AIS_InteractiveContext::HiddenLineAspect() const
2621 return myDefaultDrawer->HiddenLineAspect();
2624 //=======================================================================
2625 //function : SetHiddenLineAspect
2627 //=======================================================================
2628 void AIS_InteractiveContext::SetHiddenLineAspect (const Handle(Prs3d_LineAspect)& theAspect) const
2630 myDefaultDrawer->SetHiddenLineAspect (theAspect);
2633 //=======================================================================
2634 //function : SetIsoNumber
2636 //=======================================================================
2637 void AIS_InteractiveContext::SetIsoNumber (const Standard_Integer theNb,
2638 const AIS_TypeOfIso theType)
2643 myDefaultDrawer->UIsoAspect()->SetNumber (theNb);
2646 myDefaultDrawer->VIsoAspect()->SetNumber (theNb);
2649 myDefaultDrawer->UIsoAspect()->SetNumber (theNb);
2650 myDefaultDrawer->VIsoAspect()->SetNumber (theNb);
2655 //=======================================================================
2656 //function : IsoNumber
2658 //=======================================================================
2659 Standard_Integer AIS_InteractiveContext::IsoNumber (const AIS_TypeOfIso theType)
2663 case AIS_TOI_IsoU: return myDefaultDrawer->UIsoAspect()->Number();
2664 case AIS_TOI_IsoV: return myDefaultDrawer->VIsoAspect()->Number();
2665 case AIS_TOI_Both: return myDefaultDrawer->UIsoAspect()->Number() == myDefaultDrawer->VIsoAspect()->Number()
2666 ? myDefaultDrawer->UIsoAspect()->Number()
2672 //=======================================================================
2673 //function : IsoOnPlane
2675 //=======================================================================
2676 void AIS_InteractiveContext::IsoOnPlane (const Standard_Boolean theToSwitchOn)
2678 myDefaultDrawer->SetIsoOnPlane (theToSwitchOn);
2681 //=======================================================================
2682 //function : IsoOnPlane
2684 //=======================================================================
2685 Standard_Boolean AIS_InteractiveContext::IsoOnPlane() const
2687 return myDefaultDrawer->IsoOnPlane();
2690 //=======================================================================
2691 //function : IsoOnTriangulation
2693 //=======================================================================
2694 void AIS_InteractiveContext::IsoOnTriangulation (const Standard_Boolean theToSwitchOn)
2696 myDefaultDrawer->SetIsoOnTriangulation (theToSwitchOn);
2699 //=======================================================================
2700 //function : IsoOnTriangulation
2702 //=======================================================================
2703 Standard_Boolean AIS_InteractiveContext::IsoOnTriangulation() const
2705 return myDefaultDrawer->IsoOnTriangulation();
2708 //function : SetPixelTolerance
2709 //purpose : Disables the mechanism of adaptive tolerance calculation in
2710 // SelectMgr_ViewerSelector and sets the given tolerance for ALL
2711 // sensitive entities activated. For more information, see
2712 // SelectMgr_ViewerSelector.hxx
2713 //=======================================================================
2714 void AIS_InteractiveContext::SetPixelTolerance (const Standard_Integer thePrecision)
2716 if (HasOpenedContext())
2718 myLocalContexts (myCurLocalIndex)->SetPixelTolerance (thePrecision);
2722 myMainSel->SetPixelTolerance (thePrecision);
2726 //=======================================================================
2727 //function : PixelTolerance
2729 //=======================================================================
2730 Standard_Integer AIS_InteractiveContext::PixelTolerance() const
2732 return HasOpenedContext()
2733 ? myLocalContexts (myCurLocalIndex)->PixelTolerance()
2734 : myMainSel->PixelTolerance();
2737 //=======================================================================
2738 //function : SetSelectionSensitivity
2739 //purpose : Allows to manage sensitivity of a particular selection of interactive object theObject
2740 //=======================================================================
2741 void AIS_InteractiveContext::SetSelectionSensitivity (const Handle(AIS_InteractiveObject)& theObject,
2742 const Standard_Integer theMode,
2743 const Standard_Integer theNewSensitivity)
2745 if (HasOpenedContext())
2747 myLocalContexts (myCurLocalIndex)->SetSelectionSensitivity (theObject, theMode, theNewSensitivity);
2751 mgrSelector->SetSelectionSensitivity (theObject, theMode, theNewSensitivity);
2754 //=======================================================================
2755 //function : IsInLocal
2757 //=======================================================================
2758 Standard_Boolean AIS_InteractiveContext::IsInLocal (const Handle(AIS_InteractiveObject)& theIObj,
2759 Standard_Integer& theIndex) const
2761 if (theIObj.IsNull())
2763 return Standard_False;
2766 // if it exists at neutral point 0 index is returned
2767 if (myObjects.IsBound (theIObj))
2770 return Standard_False;
2773 for (Standard_Integer aCtxIter = 1; aCtxIter <= myLocalContexts.Extent(); ++aCtxIter)
2775 if (myLocalContexts.IsBound (aCtxIter))
2777 if(myLocalContexts (aCtxIter)->IsIn (theIObj))
2779 theIndex = aCtxIter;
2780 return Standard_True;
2785 return Standard_False;
2788 //=======================================================================
2789 //function : InitAttributes
2791 //=======================================================================
2792 void AIS_InteractiveContext::InitAttributes()
2794 mgrSelector->Add (myMainSel);
2795 myCurrentName = AIS_Context_NewCurName();
2796 mySelectionName = AIS_Context_NewSelName();
2798 AIS_Selection::CreateSelection (mySelectionName.ToCString());
2799 AIS_Selection::CreateSelection (myCurrentName.ToCString());
2801 myDefaultDrawer->SetShadingAspectGlobal (Standard_False);
2802 Graphic3d_MaterialAspect aMat (Graphic3d_NOM_BRASS);
2803 myDefaultDrawer->ShadingAspect()->SetMaterial (aMat);
2805 // myDefaultDrawer->ShadingAspect()->SetColor(Quantity_NOC_GRAY70);
2806 Handle(Prs3d_LineAspect) aLineAspect = myDefaultDrawer->HiddenLineAspect();
2807 aLineAspect->SetColor (Quantity_NOC_GRAY20);
2808 aLineAspect->SetWidth (1.0);
2809 aLineAspect->SetTypeOfLine (Aspect_TOL_DASH);
2811 // tolerance to 2 pixels...
2812 SetPixelTolerance (2);
2814 // Customizing the drawer for trihedrons and planes...
2815 Handle(Prs3d_DatumAspect) aTrihAspect = myDefaultDrawer->DatumAspect();
2816 const Standard_Real aLength = 100.0;
2817 aTrihAspect->SetAxisLength (aLength, aLength, aLength);
2818 const Quantity_NameOfColor aColor = Quantity_NOC_LIGHTSTEELBLUE4;
2819 aTrihAspect->FirstAxisAspect() ->SetColor (aColor);
2820 aTrihAspect->SecondAxisAspect()->SetColor (aColor);
2821 aTrihAspect->ThirdAxisAspect() ->SetColor (aColor);
2823 Handle(Prs3d_PlaneAspect) aPlaneAspect = myDefaultDrawer->PlaneAspect();
2824 const Standard_Real aPlaneLength = 200.0;
2825 aPlaneAspect->SetPlaneLength (aPlaneLength, aPlaneLength);
2826 aPlaneAspect->EdgesAspect()->SetColor (Quantity_NOC_SKYBLUE);
2829 //=======================================================================
2830 //function : TrihedronSize
2832 //=======================================================================
2833 Standard_Real AIS_InteractiveContext::TrihedronSize() const
2835 return myDefaultDrawer->DatumAspect()->FirstAxisLength();
2838 //=======================================================================
2839 //function : SetTrihedronSize
2841 //=======================================================================
2842 void AIS_InteractiveContext::SetTrihedronSize (const Standard_Real theVal,
2843 const Standard_Boolean /*updateviewer*/)
2845 myDefaultDrawer->DatumAspect()->SetAxisLength (theVal, theVal, theVal);
2846 Redisplay (AIS_KOI_Datum, 3, Standard_False);
2847 Redisplay (AIS_KOI_Datum, 4, Standard_True);
2850 //=======================================================================
2851 //function : SetPlaneSize
2853 //=======================================================================
2854 void AIS_InteractiveContext::SetPlaneSize(const Standard_Real theValX,
2855 const Standard_Real theValY,
2856 const Standard_Boolean /*updateviewer*/)
2858 myDefaultDrawer->PlaneAspect()->SetPlaneLength (theValX, theValY);
2859 Redisplay (AIS_KOI_Datum, 7);
2862 //=======================================================================
2863 //function : SetPlaneSize
2865 //=======================================================================
2866 void AIS_InteractiveContext::SetPlaneSize (const Standard_Real theVal,
2867 const Standard_Boolean theToUpdateViewer)
2869 SetPlaneSize (theVal, theVal, theToUpdateViewer);
2872 //=======================================================================
2873 //function : PlaneSize
2875 //=======================================================================
2876 Standard_Boolean AIS_InteractiveContext::PlaneSize (Standard_Real& theX,
2877 Standard_Real& theY) const
2879 theX = myDefaultDrawer->PlaneAspect()->PlaneXLength();
2880 theY = myDefaultDrawer->PlaneAspect()->PlaneYLength();
2881 return (Abs (theX - theY) <= Precision::Confusion());
2884 //=======================================================================
2885 //function : SetAutoActivateSelection
2887 //=======================================================================
2888 void AIS_InteractiveContext::SetAutoActivateSelection (const Standard_Boolean theIsAuto)
2890 myIsAutoActivateSelMode = theIsAuto;
2893 //=======================================================================
2894 //function : GetAutoActivateSelection
2896 //=======================================================================
2897 Standard_Boolean AIS_InteractiveContext::GetAutoActivateSelection() const
2899 return myIsAutoActivateSelMode;
2902 //=======================================================================
2903 //function : SetZLayer
2905 //=======================================================================
2906 void AIS_InteractiveContext::SetZLayer (const Handle(AIS_InteractiveObject)& theIObj,
2907 const Standard_Integer theLayerId)
2909 if (theIObj.IsNull())
2912 theIObj->SetZLayer (theLayerId);
2915 //=======================================================================
2916 //function : GetZLayer
2918 //=======================================================================
2919 Standard_Integer AIS_InteractiveContext::GetZLayer (const Handle(AIS_InteractiveObject)& theIObj) const
2921 return !theIObj.IsNull()
2923 : Graphic3d_ZLayerId_UNKNOWN;
2926 //=======================================================================
2927 //function : RebuildSelectionStructs
2928 //purpose : Rebuilds 1st level of BVH selection forcibly
2929 //=======================================================================
2930 void AIS_InteractiveContext::RebuildSelectionStructs()
2932 myMainSel->RebuildObjectsTree (Standard_True);
2935 //=======================================================================
2936 //function : Disconnect
2937 //purpose : Disconnects selectable object from an assembly and updates selection structures
2938 //=======================================================================
2939 void AIS_InteractiveContext::Disconnect (const Handle(AIS_InteractiveObject)& theAssembly,
2940 const Handle(AIS_InteractiveObject)& theObjToDisconnect)
2942 if (theAssembly->IsInstance ("AIS_MultipleConnectedInteractive"))
2944 Handle(AIS_MultipleConnectedInteractive) theObj (Handle(AIS_MultipleConnectedInteractive)::DownCast (theAssembly));
2945 theObj->Disconnect (theObjToDisconnect);
2946 const Handle(SelectMgr_SelectableObject)& anObj = theObjToDisconnect; // to avoid ambiguity
2947 mgrSelector->Remove (anObj);
2949 else if (theAssembly->IsInstance ("AIS_ConnectedInteractive") && theObjToDisconnect.IsNull())
2951 Handle(AIS_ConnectedInteractive) theObj (Handle(AIS_ConnectedInteractive)::DownCast (theAssembly));
2952 theObj->Disconnect();
2953 const Handle(SelectMgr_SelectableObject)& anObj = theObj; // to avoid ambiguity
2954 mgrSelector->Remove (anObj);
2960 //=======================================================================
2961 //function : FitSelected
2962 //purpose : Fits the view corresponding to the bounds of selected objects
2963 //=======================================================================
2964 void AIS_InteractiveContext::FitSelected (const Handle(V3d_View)& theView,
2965 const Standard_Real theMargin,
2966 const Standard_Boolean theToUpdate)
2968 Standard_CString aSelName = HasOpenedContext() ?
2969 myLocalContexts (myCurLocalIndex)->SelectionName().ToCString()
2970 : myCurrentName.ToCString();
2972 Bnd_Box aBndSelected;
2974 const Handle(AIS_Selection)& aSelection = AIS_Selection::Selection (aSelName);
2975 AIS_MapOfObjectOwners anObjectOwnerMap;
2976 for (aSelection->Init(); aSelection->More(); aSelection->Next())
2978 Handle(AIS_InteractiveObject) anObj (Handle(AIS_InteractiveObject)::DownCast (aSelection->Value()));
2979 if (!anObj.IsNull())
2981 if (anObj->IsInfinite())
2985 anObj->BoundingBox (aTmpBnd);
2986 aBndSelected.Add (aTmpBnd);
2990 Handle(SelectMgr_EntityOwner) anOwner (Handle(SelectMgr_EntityOwner)::DownCast (aSelection->Value()));
2991 if (anOwner.IsNull())
2994 Handle(SelectMgr_IndexedMapOfOwner) anOwnerMap;
2995 if (!anObjectOwnerMap.Find (anOwner->Selectable(), anOwnerMap))
2997 anOwnerMap = new SelectMgr_IndexedMapOfOwner();
2998 anObjectOwnerMap.Bind (anOwner->Selectable(), anOwnerMap);
3001 anOwnerMap->Add (anOwner);
3005 for (AIS_MapIteratorOfMapOfObjectOwners anIter (anObjectOwnerMap); anIter.More(); anIter.Next())
3007 const Handle(SelectMgr_SelectableObject) anObject = anIter.Key();
3008 Bnd_Box aTmpBox = anObject->BndBoxOfSelected (anIter.ChangeValue());
3009 aBndSelected.Add (aTmpBox);
3012 anObjectOwnerMap.Clear();
3014 if (aBndSelected.IsVoid())
3017 theView->FitAll (aBndSelected, theMargin, theToUpdate);