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 #include <AIS_InteractiveContext.hxx>
19 #include <AIS_DataMapIteratorOfDataMapOfIOStatus.hxx>
20 #include <AIS_ConnectedInteractive.hxx>
21 #include <AIS_GlobalStatus.hxx>
22 #include <AIS_InteractiveObject.hxx>
23 #include <AIS_ListIteratorOfListOfInteractive.hxx>
24 #include <AIS_MapIteratorOfMapOfInteractive.hxx>
25 #include <AIS_MultipleConnectedInteractive.hxx>
26 #include <AIS_Shape.hxx>
27 #include <AIS_Trihedron.hxx>
28 #include <Geom_Axis2Placement.hxx>
29 #include <Graphic3d_AspectFillArea3d.hxx>
30 #include <HLRBRep.hxx>
31 #include <OSD_Environment.hxx>
32 #include <Precision.hxx>
33 #include <Prs3d_BasicAspect.hxx>
34 #include <Prs3d_DatumAspect.hxx>
35 #include <Prs3d_IsoAspect.hxx>
36 #include <Prs3d_LineAspect.hxx>
37 #include <Prs3d_PlaneAspect.hxx>
38 #include <Prs3d_PointAspect.hxx>
39 #include <Prs3d_ShadingAspect.hxx>
40 #include <PrsMgr_PresentableObject.hxx>
41 #include <Quantity_Color.hxx>
42 #include <SelectMgr_EntityOwner.hxx>
43 #include <SelectMgr_Filter.hxx>
44 #include <SelectMgr_OrFilter.hxx>
45 #include <SelectMgr_SelectionManager.hxx>
46 #include <Standard_Atomic.hxx>
47 #include <Standard_Transient.hxx>
48 #include <Standard_Type.hxx>
49 #include <StdSelect_ViewerSelector3d.hxx>
50 #include <TCollection_AsciiString.hxx>
51 #include <TCollection_ExtendedString.hxx>
52 #include <TColStd_ListIteratorOfListOfInteger.hxx>
53 #include <TColStd_MapIteratorOfMapOfTransient.hxx>
54 #include <TopLoc_Location.hxx>
55 #include <TopoDS_Shape.hxx>
56 #include <UnitsAPI.hxx>
57 #include <V3d_View.hxx>
58 #include <V3d_Viewer.hxx>
60 IMPLEMENT_STANDARD_RTTIEXT(AIS_InteractiveContext, Standard_Transient)
64 typedef NCollection_DataMap<Handle(SelectMgr_SelectableObject), Handle(SelectMgr_IndexedMapOfOwner)> AIS_MapOfObjectOwners;
65 typedef NCollection_DataMap<Handle(SelectMgr_SelectableObject), Handle(SelectMgr_IndexedMapOfOwner)>::Iterator AIS_MapIteratorOfMapOfObjectOwners;
67 //! Initialize default highlighting attributes.
68 static void initDefaultHilightAttributes (const Handle(Prs3d_Drawer)& theDrawer,
69 const Quantity_Color& theColor)
71 theDrawer->SetMethod (Aspect_TOHM_COLOR);
72 theDrawer->SetDisplayMode (0);
73 theDrawer->SetColor (theColor);
75 theDrawer->SetupOwnShadingAspect();
76 theDrawer->SetupOwnPointAspect();
77 theDrawer->SetLineAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
78 *theDrawer->LineAspect()->Aspect() = *theDrawer->Link()->LineAspect()->Aspect();
79 theDrawer->SetWireAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
80 *theDrawer->WireAspect()->Aspect() = *theDrawer->Link()->WireAspect()->Aspect();
81 theDrawer->SetPlaneAspect (new Prs3d_PlaneAspect());
82 *theDrawer->PlaneAspect()->EdgesAspect() = *theDrawer->Link()->PlaneAspect()->EdgesAspect();
83 theDrawer->SetFreeBoundaryAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
84 *theDrawer->FreeBoundaryAspect()->Aspect() = *theDrawer->Link()->FreeBoundaryAspect()->Aspect();
85 theDrawer->SetUnFreeBoundaryAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
86 *theDrawer->UnFreeBoundaryAspect()->Aspect() = *theDrawer->Link()->UnFreeBoundaryAspect()->Aspect();
87 theDrawer->SetDatumAspect (new Prs3d_DatumAspect());
89 theDrawer->ShadingAspect()->SetColor (theColor);
90 theDrawer->WireAspect()->SetColor (theColor);
91 theDrawer->LineAspect()->SetColor (theColor);
92 theDrawer->PlaneAspect()->ArrowAspect()->SetColor (theColor);
93 theDrawer->PlaneAspect()->IsoAspect()->SetColor (theColor);
94 theDrawer->PlaneAspect()->EdgesAspect()->SetColor (theColor);
95 theDrawer->FreeBoundaryAspect()->SetColor (theColor);
96 theDrawer->UnFreeBoundaryAspect()->SetColor (theColor);
97 theDrawer->PointAspect()->SetColor (theColor);
98 for (Standard_Integer aPartIter = 0; aPartIter < Prs3d_DP_None; ++aPartIter)
100 if (Handle(Prs3d_LineAspect) aLineAsp = theDrawer->DatumAspect()->LineAspect ((Prs3d_DatumParts )aPartIter))
102 aLineAsp->SetColor (theColor);
106 theDrawer->WireAspect()->SetWidth (2.0);
107 theDrawer->LineAspect()->SetWidth (2.0);
108 theDrawer->PlaneAspect()->EdgesAspect()->SetWidth (2.0);
109 theDrawer->FreeBoundaryAspect() ->SetWidth (2.0);
110 theDrawer->UnFreeBoundaryAspect()->SetWidth (2.0);
111 theDrawer->PointAspect()->SetTypeOfMarker (Aspect_TOM_O_POINT);
112 theDrawer->PointAspect()->SetScale (2.0);
114 // the triangulation should be computed using main presentation attributes,
115 // and should not be overridden by highlighting
116 theDrawer->SetAutoTriangulation (Standard_False);
120 //=======================================================================
121 //function : AIS_InteractiveContext
123 //=======================================================================
125 AIS_InteractiveContext::AIS_InteractiveContext(const Handle(V3d_Viewer)& MainViewer):
126 myMainPM(new PrsMgr_PresentationManager3d(MainViewer->StructureManager())),
127 myMainVwr(MainViewer),
128 myMainSel(new StdSelect_ViewerSelector3d()),
129 myToHilightSelected(Standard_True),
130 mySelection(new AIS_Selection()),
131 myFilters (new SelectMgr_AndOrFilter(SelectMgr_FilterType_OR)),
132 myDefaultDrawer(new Prs3d_Drawer()),
135 myPickingStrategy (SelectMgr_PickingStrategy_FirstAcceptable),
136 myAutoHilight(Standard_True),
137 myIsAutoActivateSelMode(Standard_True)
139 mgrSelector = new SelectMgr_SelectionManager (myMainSel);
141 myStyles[Prs3d_TypeOfHighlight_None] = myDefaultDrawer;
142 myStyles[Prs3d_TypeOfHighlight_Selected] = new Prs3d_Drawer();
143 myStyles[Prs3d_TypeOfHighlight_Dynamic] = new Prs3d_Drawer();
144 myStyles[Prs3d_TypeOfHighlight_LocalSelected] = new Prs3d_Drawer();
145 myStyles[Prs3d_TypeOfHighlight_LocalDynamic] = new Prs3d_Drawer();
146 myStyles[Prs3d_TypeOfHighlight_SubIntensity] = new Prs3d_Drawer();
148 myDefaultDrawer->SetZLayer(Graphic3d_ZLayerId_Default);
149 myDefaultDrawer->SetDisplayMode(0);
151 const Handle(Prs3d_Drawer)& aStyle = myStyles[Prs3d_TypeOfHighlight_Dynamic];
152 aStyle->Link (myDefaultDrawer);
153 initDefaultHilightAttributes (aStyle, Quantity_NOC_CYAN1);
154 aStyle->SetZLayer(Graphic3d_ZLayerId_Top);
157 const Handle(Prs3d_Drawer)& aStyle = myStyles[Prs3d_TypeOfHighlight_LocalDynamic];
158 aStyle->Link (myDefaultDrawer);
159 initDefaultHilightAttributes (aStyle, Quantity_NOC_CYAN1);
160 aStyle->SetZLayer(Graphic3d_ZLayerId_Topmost);
163 const Handle(Prs3d_Drawer)& aStyle = myStyles[Prs3d_TypeOfHighlight_Selected];
164 aStyle->Link (myDefaultDrawer);
165 initDefaultHilightAttributes (aStyle, Quantity_NOC_GRAY80);
166 aStyle->SetZLayer(Graphic3d_ZLayerId_UNKNOWN);
169 const Handle(Prs3d_Drawer)& aStyle = myStyles[Prs3d_TypeOfHighlight_LocalSelected];
170 aStyle->Link (myDefaultDrawer);
171 initDefaultHilightAttributes (aStyle, Quantity_NOC_GRAY80);
172 aStyle->SetZLayer(Graphic3d_ZLayerId_UNKNOWN);
175 const Handle(Prs3d_Drawer)& aStyle = myStyles[Prs3d_TypeOfHighlight_SubIntensity];
176 aStyle->SetZLayer(Graphic3d_ZLayerId_UNKNOWN);
177 aStyle->SetMethod(Aspect_TOHM_COLOR);
178 aStyle->SetColor (Quantity_NOC_GRAY40);
184 //=======================================================================
185 //function : ~AIS_InteractiveContext
187 //=======================================================================
188 AIS_InteractiveContext::~AIS_InteractiveContext()
190 // clear the current selection
191 mySelection->Clear();
192 mgrSelector.Nullify();
194 Handle(AIS_InteractiveContext) aNullContext;
195 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
197 const Handle(AIS_InteractiveObject)& anObj = anObjIter.Key();
198 anObj->SetContext (aNullContext);
199 for (SelectMgr_SequenceOfSelection::Iterator aSelIter (anObj->Selections()); aSelIter.More(); aSelIter.Next())
201 aSelIter.Value()->UpdateBVHStatus (SelectMgr_TBU_Renew);
206 //=======================================================================
207 //function : LastActiveView
209 //=======================================================================
210 Handle(V3d_View) AIS_InteractiveContext::LastActiveView() const
212 if (myLastActiveView == NULL
213 || myMainVwr.IsNull())
215 return Handle(V3d_View)();
218 // as a precaution - check that myLastActiveView pointer is a valid active View
219 for (V3d_ListOfViewIterator aViewIter = myMainVwr->ActiveViewIterator(); aViewIter.More(); aViewIter.Next())
221 if (aViewIter.Value() == myLastActiveView)
223 return aViewIter.Value();
226 return Handle(V3d_View)();
229 //=======================================================================
230 //function : UpdateCurrentViewer
232 //=======================================================================
234 void AIS_InteractiveContext::UpdateCurrentViewer()
236 if (!myMainVwr.IsNull())
240 //=======================================================================
241 //function : DisplayedObjects
243 //=======================================================================
244 void AIS_InteractiveContext::DisplayedObjects (AIS_ListOfInteractive& theListOfIO) const
246 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
248 if (anObjIter.Value()->GraphicStatus() == AIS_DS_Displayed)
250 theListOfIO.Append (anObjIter.Key());
255 //=======================================================================
256 //function : DisplayedObjects
258 //=======================================================================
259 void AIS_InteractiveContext::DisplayedObjects (const AIS_KindOfInteractive theKind,
260 const Standard_Integer theSign,
261 AIS_ListOfInteractive& theListOfIO) const
263 ObjectsByDisplayStatus (theKind, theSign, AIS_DS_Displayed, theListOfIO);
266 //=======================================================================
267 //function : ErasedObjects
269 //=======================================================================
270 void AIS_InteractiveContext::ErasedObjects (AIS_ListOfInteractive& theListOfIO) const
272 ObjectsByDisplayStatus (AIS_DS_Erased, theListOfIO);
275 //=======================================================================
276 //function : ErasedObjects
278 //=======================================================================
279 void AIS_InteractiveContext::ErasedObjects (const AIS_KindOfInteractive theKind,
280 const Standard_Integer theSign,
281 AIS_ListOfInteractive& theListOfIO) const
283 ObjectsByDisplayStatus (theKind, theSign, AIS_DS_Erased, theListOfIO);
286 //=======================================================================
287 //function : ObjectsByDisplayStatus
289 //=======================================================================
290 void AIS_InteractiveContext::ObjectsByDisplayStatus (const AIS_DisplayStatus theStatus,
291 AIS_ListOfInteractive& theListOfIO) const
293 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
295 if (anObjIter.Value()->GraphicStatus() == theStatus)
297 theListOfIO.Append (anObjIter.Key());
302 //=======================================================================
303 //function : ObjectsByDisplayStatus
305 //=======================================================================
306 void AIS_InteractiveContext::ObjectsByDisplayStatus (const AIS_KindOfInteractive theKind,
307 const Standard_Integer theSign,
308 const AIS_DisplayStatus theStatus,
309 AIS_ListOfInteractive& theListOfIO) const
311 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
313 if (theStatus != AIS_DS_None
314 && anObjIter.Value()->GraphicStatus() != theStatus)
318 else if (anObjIter.Key()->Type() != theKind)
324 || anObjIter.Key()->Signature() == theSign)
326 theListOfIO.Append (anObjIter.Key());
331 //=======================================================================
332 //function : ObjectsInside
334 //=======================================================================
335 void AIS_InteractiveContext::ObjectsInside (AIS_ListOfInteractive& theListOfIO,
336 const AIS_KindOfInteractive theKind,
337 const Standard_Integer theSign) const
339 if (theKind == AIS_KOI_None
342 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
344 theListOfIO.Append (anObjIter.Key());
349 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
351 if (anObjIter.Key()->Type() != theKind)
357 || anObjIter.Key()->Signature() == theSign)
359 theListOfIO.Append (anObjIter.Key());
364 //=======================================================================
365 //function : ObjectsForView
367 //=======================================================================
368 void AIS_InteractiveContext::ObjectsForView (AIS_ListOfInteractive& theListOfIO,
369 const Handle(V3d_View)& theView,
370 const Standard_Boolean theIsVisibleInView,
371 const AIS_DisplayStatus theStatus) const
373 Handle(Graphic3d_CView) aViewImpl = theView->View();
374 const Standard_Integer aViewId = aViewImpl->Identification();
375 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
377 if (theStatus != AIS_DS_None
378 && anObjIter.Value()->GraphicStatus() != theStatus)
380 theListOfIO.Append (anObjIter.Key());
384 Handle(Graphic3d_ViewAffinity) anAffinity = myMainVwr->StructureManager()->ObjectAffinity (anObjIter.Key());
385 const Standard_Boolean isVisible = anAffinity->IsVisible (aViewId);
386 if (isVisible == theIsVisibleInView)
388 theListOfIO.Append (anObjIter.Key());
393 //=======================================================================
396 //=======================================================================
397 void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIObj,
398 const Standard_Boolean theToUpdateViewer)
400 if (theIObj.IsNull())
405 Standard_Integer aDispMode = 0, aHiMod = -1, aSelMode = -1;
406 GetDefModes (theIObj, aDispMode, aHiMod, aSelMode);
407 Display (theIObj, aDispMode, myIsAutoActivateSelMode ? aSelMode : -1, theToUpdateViewer);
410 //=======================================================================
411 //function : SetViewAffinity
413 //=======================================================================
414 void AIS_InteractiveContext::SetViewAffinity (const Handle(AIS_InteractiveObject)& theIObj,
415 const Handle(V3d_View)& theView,
416 const Standard_Boolean theIsVisible)
419 || !myObjects.IsBound (theIObj))
424 Handle(Graphic3d_ViewAffinity) anAffinity = myMainVwr->StructureManager()->ObjectAffinity (theIObj);
425 Handle(Graphic3d_CView) aViewImpl = theView->View();
426 anAffinity->SetVisible (aViewImpl->Identification(), theIsVisible == Standard_True);
429 theView->View()->ChangeHiddenObjects()->Remove (theIObj.get());
433 theView->View()->ChangeHiddenObjects()->Add (theIObj.get());
437 //=======================================================================
440 //=======================================================================
441 void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIObj,
442 const Standard_Integer theDispMode,
443 const Standard_Integer theSelectionMode,
444 const Standard_Boolean theToUpdateViewer,
445 const AIS_DisplayStatus theDispStatus)
447 if (theIObj.IsNull())
452 if (theDispStatus == AIS_DS_Erased)
454 Erase (theIObj, theToUpdateViewer);
455 Load (theIObj, theSelectionMode);
456 if (Handle(AIS_GlobalStatus)* aStatusPtr = myObjects.ChangeSeek (theIObj))
458 (*aStatusPtr)->SetDisplayMode (theDispMode);
463 setContextToObject (theIObj);
464 if (!myObjects.IsBound (theIObj))
466 setObjectStatus (theIObj, AIS_DS_Displayed, theDispMode, theSelectionMode);
467 myMainVwr->StructureManager()->RegisterObject (theIObj);
468 myMainPM->Display(theIObj, theDispMode);
469 if (theSelectionMode != -1)
471 const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
472 if (!mgrSelector->Contains (anObj))
474 mgrSelector->Load (theIObj);
476 mgrSelector->Activate (theIObj, theSelectionMode);
481 Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
483 // Mark the presentation modes hidden of interactive object different from aDispMode.
484 // Then make sure aDispMode is displayed and maybe highlighted.
485 // Finally, activate selection mode <SelMode> if not yet activated.
486 const Standard_Integer anOldMode = aStatus->DisplayMode();
487 if (anOldMode != theDispMode)
489 if(myMainPM->IsHighlighted (theIObj, anOldMode))
491 unhighlightGlobal (theIObj);
493 myMainPM->SetVisibility (theIObj, anOldMode, Standard_False);
496 aStatus->SetDisplayMode (theDispMode);
498 myMainPM->Display (theIObj, theDispMode);
499 aStatus->SetGraphicStatus (AIS_DS_Displayed);
500 if (aStatus->IsHilighted())
502 highlightGlobal (theIObj, aStatus->HilightStyle(), theDispMode);
504 if (theSelectionMode != -1)
506 const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
507 if (!mgrSelector->Contains (anObj))
509 mgrSelector->Load (theIObj);
511 if (!mgrSelector->IsActivated (theIObj, theSelectionMode))
513 if (!aStatus->IsSModeIn (theSelectionMode))
514 aStatus->AddSelectionMode (theSelectionMode);
515 mgrSelector->Activate (theIObj, theSelectionMode);
520 if (theToUpdateViewer)
526 //=======================================================================
529 //=======================================================================
530 void AIS_InteractiveContext::Load (const Handle(AIS_InteractiveObject)& theIObj,
531 const Standard_Integer theSelMode)
533 if (theIObj.IsNull())
538 setContextToObject (theIObj);
539 if (!myObjects.IsBound (theIObj))
541 Standard_Integer aDispMode, aHiMod, aSelModeDef;
542 GetDefModes (theIObj, aDispMode, aHiMod, aSelModeDef);
543 setObjectStatus (theIObj, AIS_DS_Erased, aDispMode, theSelMode != -1 ? theSelMode : aSelModeDef);
544 myMainVwr->StructureManager()->RegisterObject (theIObj);
547 // Register theIObj in the selection manager to prepare further activation of selection
548 const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
549 if (!mgrSelector->Contains (anObj))
551 mgrSelector->Load (theIObj);
555 //=======================================================================
558 //=======================================================================
559 void AIS_InteractiveContext::Erase (const Handle(AIS_InteractiveObject)& theIObj,
560 const Standard_Boolean theToUpdateViewer)
562 if (theIObj.IsNull())
567 if (!theIObj->IsAutoHilight())
569 theIObj->ClearSelected();
572 EraseGlobal (theIObj, Standard_False);
573 if (theToUpdateViewer)
579 //=======================================================================
580 //function : EraseAll
582 //=======================================================================
583 void AIS_InteractiveContext::EraseAll (const Standard_Boolean theToUpdateViewer)
585 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
587 if (anObjIter.Value()->GraphicStatus() == AIS_DS_Displayed)
589 Erase (anObjIter.Key(), Standard_False);
593 if (theToUpdateViewer)
599 //=======================================================================
600 //function : DisplayAll
602 //=======================================================================
603 void AIS_InteractiveContext::DisplayAll (const Standard_Boolean theToUpdateViewer)
605 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
607 const AIS_DisplayStatus aStatus = anObjIter.Value()->GraphicStatus();
608 if (aStatus == AIS_DS_Erased)
610 Display (anObjIter.Key(), Standard_False);
614 if (theToUpdateViewer)
620 //=======================================================================
621 //function : DisplaySelected
623 //=======================================================================
624 void AIS_InteractiveContext::DisplaySelected (const Standard_Boolean theToUpdateViewer)
626 for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
628 Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (aSelIter.Value()->Selectable());
629 Display (anObj, Standard_False);
632 if (theToUpdateViewer && !mySelection->Objects().IsEmpty())
638 //=======================================================================
639 //function : EraseSelected
641 //=======================================================================
642 void AIS_InteractiveContext::EraseSelected (const Standard_Boolean theToUpdateViewer)
644 Standard_Boolean isFound = Standard_False;
645 for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Init (mySelection->Objects()))
647 Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (aSelIter.Value()->Selectable());
648 Erase (anObj, Standard_False);
649 isFound = Standard_True;
652 if (isFound && theToUpdateViewer)
658 //=======================================================================
659 //function : DisplayStatus
661 //=======================================================================
662 AIS_DisplayStatus AIS_InteractiveContext::DisplayStatus (const Handle(AIS_InteractiveObject)& theIObj) const
664 if (theIObj.IsNull())
668 const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
669 return aStatus != NULL ? (*aStatus)->GraphicStatus() : AIS_DS_None;
672 //=======================================================================
675 //=======================================================================
676 void AIS_InteractiveContext::Remove (const Handle(AIS_InteractiveObject)& theIObj,
677 const Standard_Boolean theToUpdateViewer)
679 if (theIObj.IsNull())
684 if (theIObj->HasInteractiveContext())
686 if (theIObj->myCTXPtr != this)
688 throw Standard_ProgramError("AIS_InteractiveContext - object has been displayed in another context!");
690 theIObj->SetContext (Handle(AIS_InteractiveContext)());
692 ClearGlobal (theIObj, theToUpdateViewer);
695 //=======================================================================
696 //function : RemoveAll
698 //=======================================================================
699 void AIS_InteractiveContext::RemoveAll (const Standard_Boolean theToUpdateViewer)
701 AIS_ListOfInteractive aList;
702 ObjectsInside (aList);
703 for (AIS_ListIteratorOfListOfInteractive aListIterator (aList); aListIterator.More(); aListIterator.Next())
705 Remove (aListIterator.Value(), Standard_False);
708 if (theToUpdateViewer)
714 //=======================================================================
715 //function : HilightWithColor
717 //=======================================================================
718 void AIS_InteractiveContext::HilightWithColor(const Handle(AIS_InteractiveObject)& theObj,
719 const Handle(Prs3d_Drawer)& theStyle,
720 const Standard_Boolean theIsToUpdate)
725 setContextToObject (theObj);
726 if (!myObjects.IsBound (theObj))
729 const Handle(AIS_GlobalStatus)& aStatus = myObjects (theObj);
730 aStatus->SetHilightStatus (Standard_True);
732 if (aStatus->GraphicStatus() == AIS_DS_Displayed)
734 highlightGlobal (theObj, theStyle, aStatus->DisplayMode());
735 aStatus->SetHilightStyle (theStyle);
742 //=======================================================================
743 //function : Unhilight
745 //=======================================================================
746 void AIS_InteractiveContext::Unhilight(const Handle(AIS_InteractiveObject)& anIObj, const Standard_Boolean updateviewer)
748 if(anIObj.IsNull()) return;
749 if(!myObjects.IsBound(anIObj)) return;
751 const Handle(AIS_GlobalStatus)& aStatus = myObjects(anIObj);
752 aStatus->SetHilightStatus (Standard_False);
753 aStatus->SetHilightStyle (Handle(Prs3d_Drawer)());
755 if (aStatus->GraphicStatus() == AIS_DS_Displayed)
757 unhighlightGlobal (anIObj);
760 if(updateviewer) myMainVwr->Update();
763 //=======================================================================
764 //function : IsHilighted
765 //purpose : Returns true if the objects global status is set to highlighted.
766 //=======================================================================
767 Standard_Boolean AIS_InteractiveContext::IsHilighted (const Handle(AIS_InteractiveObject)& theObj) const
769 const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theObj);
770 return aStatus != NULL
771 && (*aStatus)->IsHilighted();
774 //=======================================================================
775 //function : IsHilighted
776 //purpose : Returns true if the owner is highlighted with selection style.
777 //=======================================================================
778 Standard_Boolean AIS_InteractiveContext::IsHilighted (const Handle(SelectMgr_EntityOwner)& theOwner) const
780 if (theOwner.IsNull() || !theOwner->HasSelectable())
781 return Standard_False;
783 const Handle(AIS_InteractiveObject) anObj =
784 Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
786 if (anObj->GlobalSelOwner() == theOwner)
788 if (!myObjects.IsBound (anObj))
789 return Standard_False;
791 return myObjects (anObj)->IsHilighted();
794 const Handle(Prs3d_Drawer)& aStyle = getSelStyle (anObj, theOwner);
795 const Standard_Integer aHiMode = getHilightMode (anObj, aStyle, -1);
796 return theOwner->IsHilighted (myMainPM, aHiMode);
799 //=======================================================================
800 //function : HighlightStyle
802 //=======================================================================
803 Standard_Boolean AIS_InteractiveContext::HighlightStyle (const Handle(AIS_InteractiveObject)& theObj,
804 Handle(Prs3d_Drawer)& theStyle) const
806 const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theObj);
808 && (*aStatus)->IsHilighted())
810 theStyle = (*aStatus)->HilightStyle();
811 return Standard_True;
815 return Standard_False;
818 //=======================================================================
819 //function : HighlightStyle
821 //=======================================================================
822 Standard_Boolean AIS_InteractiveContext::HighlightStyle (const Handle(SelectMgr_EntityOwner)& theOwner,
823 Handle(Prs3d_Drawer)& theStyle) const
825 if (theOwner.IsNull() || !theOwner->HasSelectable())
826 return Standard_False;
828 if (IsHilighted (theOwner))
830 const Handle(AIS_InteractiveObject) anObj =
831 Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
832 if (anObj->GlobalSelOwner() == theOwner)
834 theStyle = myObjects (anObj)->HilightStyle();
838 // since part selection style is not stored in global status,
839 // check if the object has own selection style. If not, it can
840 // only be highlighted with default selection style (because
841 // sub-intensity does not modify any selection states)
842 theStyle = getSelStyle (anObj, theOwner);
844 return Standard_True;
849 return Standard_False;
853 //=======================================================================
854 //function : IsDisplayed
856 //=======================================================================
858 Standard_Boolean AIS_InteractiveContext::IsDisplayed(const Handle(AIS_InteractiveObject)& theObj) const
860 if(theObj.IsNull()) return Standard_False;
862 const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theObj);
863 return aStatus != NULL
864 && (*aStatus)->GraphicStatus() == AIS_DS_Displayed;
867 //=======================================================================
868 //function : IsDisplayed
870 //=======================================================================
871 Standard_Boolean AIS_InteractiveContext::IsDisplayed (const Handle(AIS_InteractiveObject)& theIObj,
872 const Standard_Integer theMode) const
874 if (theIObj.IsNull())
876 return Standard_False;
879 const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
880 return aStatus != NULL
881 && (*aStatus)->GraphicStatus() == AIS_DS_Displayed
882 && (*aStatus)->DisplayMode() == theMode;
885 //=======================================================================
886 //function : DisplayPriority
888 //=======================================================================
889 Standard_Integer AIS_InteractiveContext::DisplayPriority (const Handle(AIS_InteractiveObject)& theIObj) const
891 if (theIObj.IsNull())
896 const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
898 && ((*aStatus)->GraphicStatus() == AIS_DS_Displayed
899 || (*aStatus)->GraphicStatus() == AIS_DS_Erased))
901 Standard_Integer aDispMode = theIObj->HasDisplayMode()
902 ? theIObj->DisplayMode()
903 : (theIObj->AcceptDisplayMode (myDefaultDrawer->DisplayMode())
904 ? myDefaultDrawer->DisplayMode()
906 return myMainPM->DisplayPriority (theIObj, aDispMode);
911 //=======================================================================
912 //function : SetDisplayPriority
914 //=======================================================================
915 void AIS_InteractiveContext::SetDisplayPriority (const Handle(AIS_InteractiveObject)& theIObj,
916 const Standard_Integer thePriority)
918 if (theIObj.IsNull())
923 setContextToObject (theIObj);
924 const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
926 && ((*aStatus)->GraphicStatus() == AIS_DS_Displayed
927 || (*aStatus)->GraphicStatus() == AIS_DS_Erased))
929 Standard_Integer aDisplayMode = theIObj->HasDisplayMode()
930 ? theIObj->DisplayMode()
931 : (theIObj->AcceptDisplayMode (myDefaultDrawer->DisplayMode())
932 ? myDefaultDrawer->DisplayMode()
934 myMainPM->SetDisplayPriority (theIObj, aDisplayMode, thePriority);
938 //=======================================================================
939 //function : Redisplay
941 //=======================================================================
942 void AIS_InteractiveContext::Redisplay (const Handle(AIS_InteractiveObject)& theIObj,
943 const Standard_Boolean theToUpdateViewer,
944 const Standard_Boolean theAllModes)
946 RecomputePrsOnly (theIObj, theToUpdateViewer, theAllModes);
947 RecomputeSelectionOnly (theIObj);
950 //=======================================================================
951 //function : Redisplay
953 //=======================================================================
954 void AIS_InteractiveContext::Redisplay (const AIS_KindOfInteractive theKOI,
955 const Standard_Integer /*theSign*/,
956 const Standard_Boolean theToUpdateViewer)
958 Standard_Boolean isRedisplayed = Standard_False;
959 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
961 Handle(AIS_InteractiveObject) anObj = anObjIter.Key();
962 if (anObj->Type() != theKOI)
967 Redisplay (anObj, Standard_False);
968 isRedisplayed = anObjIter.Value()->GraphicStatus() == AIS_DS_Displayed
972 if (theToUpdateViewer
979 //=======================================================================
980 //function : RecomputePrsOnly
982 //=======================================================================
983 void AIS_InteractiveContext::RecomputePrsOnly (const Handle(AIS_InteractiveObject)& theIObj,
984 const Standard_Boolean theToUpdateViewer,
985 const Standard_Boolean theAllModes)
987 if (theIObj.IsNull())
992 theIObj->SetToUpdate();
993 theIObj->UpdatePresentations (theAllModes);
994 if (!theToUpdateViewer)
999 const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
1001 && (*aStatus)->GraphicStatus() == AIS_DS_Displayed)
1003 myMainVwr->Update();
1006 //=======================================================================
1007 //function : RecomputeSelectionOnly
1009 //=======================================================================
1010 void AIS_InteractiveContext::RecomputeSelectionOnly (const Handle(AIS_InteractiveObject)& theIO)
1017 mgrSelector->RecomputeSelection (theIO);
1019 const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIO);
1021 || (*aStatus)->GraphicStatus() != AIS_DS_Displayed)
1026 TColStd_ListOfInteger aModes;
1027 ActivatedModes (theIO, aModes);
1028 TColStd_ListIteratorOfListOfInteger aModesIter (aModes);
1029 for (; aModesIter.More(); aModesIter.Next())
1031 mgrSelector->Activate (theIO, aModesIter.Value());
1035 //=======================================================================
1038 //=======================================================================
1039 void AIS_InteractiveContext::Update (const Handle(AIS_InteractiveObject)& theIObj,
1040 const Standard_Boolean theUpdateViewer)
1042 if (theIObj.IsNull())
1047 theIObj->UpdatePresentations();
1048 mgrSelector->Update(theIObj);
1050 if (theUpdateViewer)
1052 const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
1054 && (*aStatus)->GraphicStatus() == AIS_DS_Displayed)
1056 myMainVwr->Update();
1061 //=======================================================================
1062 //function : SetLocation
1064 //=======================================================================
1065 void AIS_InteractiveContext::SetLocation (const Handle(AIS_InteractiveObject)& theIObj,
1066 const TopLoc_Location& theLoc)
1068 if (theIObj.IsNull())
1073 if (theIObj->HasTransformation()
1074 && theLoc.IsIdentity())
1076 theIObj->ResetTransformation();
1077 mgrSelector->Update (theIObj, Standard_False);
1080 else if (theLoc.IsIdentity())
1085 // first reset the previous location to properly clean everything...
1086 if (theIObj->HasTransformation())
1088 theIObj->ResetTransformation();
1091 theIObj->SetLocalTransformation (theLoc.Transformation());
1093 mgrSelector->Update (theIObj, Standard_False);
1095 // if the object or its part is highlighted dynamically, it is necessary to apply location transformation
1096 // to its highlight structure immediately
1097 if (!myLastPicked.IsNull() && myLastPicked->IsSameSelectable (theIObj))
1099 const Standard_Integer aHiMod = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
1100 myLastPicked->UpdateHighlightTrsf (myMainVwr,
1106 //=======================================================================
1107 //function : ResetLocation
1109 //=======================================================================
1110 void AIS_InteractiveContext::ResetLocation (const Handle(AIS_InteractiveObject)& theIObj)
1112 if (theIObj.IsNull())
1117 theIObj->ResetTransformation();
1118 mgrSelector->Update (theIObj, Standard_False);
1121 //=======================================================================
1122 //function : HasLocation
1124 //=======================================================================
1125 Standard_Boolean AIS_InteractiveContext::HasLocation (const Handle(AIS_InteractiveObject)& theIObj) const
1127 return !theIObj.IsNull()
1128 && theIObj->HasTransformation();
1131 //=======================================================================
1132 //function : Location
1134 //=======================================================================
1135 TopLoc_Location AIS_InteractiveContext::Location (const Handle(AIS_InteractiveObject)& theIObj) const
1137 return theIObj->Transformation();
1140 //=======================================================================
1141 //function : SetDeviationCoefficient
1143 //=======================================================================
1144 void AIS_InteractiveContext::SetDeviationCoefficient (const Standard_Real theCoefficient)
1146 myDefaultDrawer->SetDeviationCoefficient (theCoefficient);
1149 //=======================================================================
1150 //function : SetDeviationAngle
1152 //=======================================================================
1153 void AIS_InteractiveContext::SetDeviationAngle (const Standard_Real theAngle)
1155 myDefaultDrawer->SetDeviationAngle (theAngle);
1158 //=======================================================================
1159 //function : DeviationAngle
1160 //purpose : Gets deviationAngle
1161 //=======================================================================
1162 Standard_Real AIS_InteractiveContext::DeviationAngle() const
1164 return myDefaultDrawer->DeviationAngle();
1167 //=======================================================================
1168 //function : DeviationCoefficient
1170 //=======================================================================
1171 Standard_Real AIS_InteractiveContext::DeviationCoefficient() const
1173 return myDefaultDrawer->DeviationCoefficient();
1176 //=======================================================================
1177 //function : SetDisplayMode
1179 //=======================================================================
1180 void AIS_InteractiveContext::SetDisplayMode(const Standard_Integer theMode,
1181 const Standard_Boolean theToUpdateViewer)
1183 if (theMode == myDefaultDrawer->DisplayMode())
1188 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
1190 Handle(AIS_InteractiveObject) anObj = anObjIter.Key();
1191 Standard_Boolean toProcess = anObj->IsKind (STANDARD_TYPE(AIS_Shape))
1192 || anObj->IsKind (STANDARD_TYPE(AIS_ConnectedInteractive))
1193 || anObj->IsKind (STANDARD_TYPE(AIS_MultipleConnectedInteractive));
1196 || anObj->HasDisplayMode()
1197 || !anObj->AcceptDisplayMode (theMode))
1202 Handle(AIS_GlobalStatus) aStatus = anObjIter.Value();
1203 aStatus->SetDisplayMode (theMode);
1205 if (aStatus->GraphicStatus() == AIS_DS_Displayed)
1207 myMainPM->Display (anObj, theMode);
1208 if (!myLastPicked.IsNull() && myLastPicked->IsSameSelectable (anObj))
1210 myMainPM->BeginImmediateDraw();
1211 unhighlightGlobal (anObj);
1212 myMainPM->EndImmediateDraw (myMainVwr);
1214 if (aStatus->IsSubIntensityOn())
1216 highlightWithSubintensity (anObj, theMode);
1218 myMainPM->SetVisibility (anObj, myDefaultDrawer->DisplayMode(), Standard_False);
1222 myDefaultDrawer->SetDisplayMode (theMode);
1223 if (theToUpdateViewer)
1225 myMainVwr->Update();
1229 //=======================================================================
1230 //function : SetDisplayMode
1232 //=======================================================================
1233 void AIS_InteractiveContext::SetDisplayMode (const Handle(AIS_InteractiveObject)& theIObj,
1234 const Standard_Integer theMode,
1235 const Standard_Boolean theToUpdateViewer)
1237 setContextToObject (theIObj);
1238 if (!myObjects.IsBound (theIObj))
1240 theIObj->SetDisplayMode (theMode);
1243 else if (!theIObj->AcceptDisplayMode (theMode))
1248 Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
1249 if (aStatus->GraphicStatus() != AIS_DS_Displayed)
1251 aStatus->SetDisplayMode (theMode);
1252 theIObj->SetDisplayMode (theMode);
1256 // erase presentations for all display modes different from <aMode>
1257 const Standard_Integer anOldMode = aStatus->DisplayMode();
1258 if (anOldMode != theMode)
1260 if (myMainPM->IsHighlighted (theIObj, anOldMode))
1262 unhighlightGlobal (theIObj);
1264 myMainPM->SetVisibility (theIObj, anOldMode, Standard_False);
1267 aStatus->SetDisplayMode (theMode);
1269 myMainPM->Display (theIObj, theMode);
1270 if (aStatus->IsHilighted())
1272 highlightGlobal (theIObj, getSelStyle (theIObj, theIObj->GlobalSelOwner()), theMode);
1274 if (aStatus->IsSubIntensityOn())
1276 highlightWithSubintensity (theIObj, theMode);
1279 if (theToUpdateViewer)
1281 myMainVwr->Update();
1283 theIObj->SetDisplayMode (theMode);
1286 //=======================================================================
1287 //function : UnsetDisplayMode
1289 //=======================================================================
1290 void AIS_InteractiveContext::UnsetDisplayMode (const Handle(AIS_InteractiveObject)& theIObj,
1291 const Standard_Boolean theToUpdateViewer)
1293 if (theIObj.IsNull()
1294 || !theIObj->HasDisplayMode())
1299 if (!myObjects.IsBound (theIObj))
1301 theIObj->UnsetDisplayMode();
1305 const Standard_Integer anOldMode = theIObj->DisplayMode();
1306 if (myDefaultDrawer->DisplayMode() == anOldMode)
1311 const Handle(AIS_GlobalStatus)& aStatus = myObjects (theIObj);
1312 aStatus->SetDisplayMode (myDefaultDrawer->DisplayMode());
1314 if (aStatus->GraphicStatus() == AIS_DS_Displayed)
1316 if (myMainPM->IsHighlighted (theIObj, anOldMode))
1318 unhighlightGlobal (theIObj);
1320 myMainPM->SetVisibility (theIObj, anOldMode, Standard_False);
1321 myMainPM->Display (theIObj, myDefaultDrawer->DisplayMode());
1322 if (aStatus->IsHilighted())
1324 highlightSelected (theIObj->GlobalSelOwner());
1326 if (aStatus->IsSubIntensityOn())
1328 highlightWithSubintensity (theIObj, myDefaultDrawer->DisplayMode());
1331 if (theToUpdateViewer)
1333 myMainVwr->Update();
1337 theIObj->UnsetDisplayMode();
1340 //=======================================================================
1341 //function : SetCurrentFacingModel
1343 //=======================================================================
1344 void AIS_InteractiveContext::SetCurrentFacingModel (const Handle(AIS_InteractiveObject)& theIObj,
1345 const Aspect_TypeOfFacingModel theModel)
1347 if (!theIObj.IsNull())
1349 theIObj->SetCurrentFacingModel (theModel);
1353 //=======================================================================
1354 //function : SetColor
1356 //=======================================================================
1357 void AIS_InteractiveContext::SetColor (const Handle(AIS_InteractiveObject)& theIObj,
1358 const Quantity_Color& theColor,
1359 const Standard_Boolean theToUpdateViewer)
1361 if (theIObj.IsNull())
1366 setContextToObject (theIObj);
1367 theIObj->SetColor (theColor);
1368 theIObj->UpdatePresentations();
1369 if (theToUpdateViewer)
1371 UpdateCurrentViewer();
1375 //=======================================================================
1376 //function : SetIsoOnTriangulation
1378 //=======================================================================
1379 void AIS_InteractiveContext::IsoOnTriangulation (const Standard_Boolean theIsEnabled,
1380 const Handle(AIS_InteractiveObject)& theObject)
1382 if (theObject.IsNull())
1387 theObject->SetIsoOnTriangulation (theIsEnabled);
1390 //=======================================================================
1391 //function : SetDeviationCoefficient
1393 //=======================================================================
1394 void AIS_InteractiveContext::SetDeviationCoefficient (const Handle(AIS_InteractiveObject)& theIObj,
1395 const Standard_Real theCoefficient,
1396 const Standard_Boolean theToUpdateViewer)
1398 if (theIObj.IsNull())
1403 // to be modified after the related methods of AIS_Shape are passed to InteractiveObject
1404 setContextToObject (theIObj);
1405 if (theIObj->Type() != AIS_KOI_Object
1406 && theIObj->Type() != AIS_KOI_Shape)
1410 else if (theIObj->Signature() != 0)
1415 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1416 aShape->SetOwnDeviationCoefficient (theCoefficient);
1417 aShape->UpdatePresentations();
1418 if (theToUpdateViewer)
1420 UpdateCurrentViewer();
1424 //=======================================================================
1425 //function : SetDeviationAngle
1427 //=======================================================================
1428 void AIS_InteractiveContext::SetDeviationAngle (const Handle(AIS_InteractiveObject)& theIObj,
1429 const Standard_Real theAngle,
1430 const Standard_Boolean theToUpdateViewer)
1432 if (theIObj.IsNull())
1437 // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
1438 setContextToObject (theIObj);
1439 if (theIObj->Type() != AIS_KOI_Shape)
1443 else if (theIObj->Signature() != 0)
1448 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1449 aShape->SetOwnDeviationAngle (theAngle);
1450 aShape->UpdatePresentations();
1451 if (theToUpdateViewer)
1453 UpdateCurrentViewer();
1457 //=======================================================================
1458 //function : SetAngleAndDeviation
1460 //=======================================================================
1461 void AIS_InteractiveContext::SetAngleAndDeviation (const Handle(AIS_InteractiveObject)& theIObj,
1462 const Standard_Real theAngle,
1463 const Standard_Boolean theToUpdateViewer)
1465 if (theIObj.IsNull())
1470 // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
1471 setContextToObject (theIObj);
1472 if (theIObj->Type() != AIS_KOI_Shape)
1476 if (theIObj->Signature() != 0)
1481 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1482 aShape->SetAngleAndDeviation (theAngle);
1483 aShape->UpdatePresentations();
1484 if (theToUpdateViewer)
1486 UpdateCurrentViewer();
1490 //=======================================================================
1491 //function : UnsetColor
1493 //=======================================================================
1494 void AIS_InteractiveContext::UnsetColor (const Handle(AIS_InteractiveObject)& theIObj,
1495 const Standard_Boolean theToUpdateViewer)
1497 if (theIObj.IsNull())
1502 theIObj->UnsetColor();
1503 theIObj->UpdatePresentations();
1504 if (theToUpdateViewer)
1506 UpdateCurrentViewer();
1510 //=======================================================================
1511 //function : HasColor
1513 //=======================================================================
1514 Standard_Boolean AIS_InteractiveContext::HasColor (const Handle(AIS_InteractiveObject)& theIObj) const
1516 return theIObj->HasColor();
1519 //=======================================================================
1522 //=======================================================================
1523 void AIS_InteractiveContext::Color (const Handle(AIS_InteractiveObject)& theIObj,
1524 Quantity_Color& theColor) const
1526 theIObj->Color (theColor);
1529 //=======================================================================
1532 //=======================================================================
1533 Standard_Real AIS_InteractiveContext::Width (const Handle(AIS_InteractiveObject)& theIObj) const
1535 return theIObj->Width();
1538 //=======================================================================
1539 //function : SetWidth
1541 //=======================================================================
1542 void AIS_InteractiveContext::SetWidth (const Handle(AIS_InteractiveObject)& theIObj,
1543 const Standard_Real theWidth,
1544 const Standard_Boolean theToUpdateViewer)
1546 if (theIObj.IsNull())
1551 setContextToObject (theIObj);
1552 theIObj->SetWidth (theWidth);
1553 theIObj->UpdatePresentations();
1554 if (!myLastPicked.IsNull() && myLastPicked->IsSameSelectable (theIObj))
1556 if (myLastPicked->IsAutoHilight())
1558 const Standard_Integer aHiMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
1559 myLastPicked->HilightWithColor (myMainPM,
1560 myLastPicked->IsSelected() ? getSelStyle (theIObj, myLastPicked) : getHiStyle (theIObj, myLastPicked),
1565 theIObj->HilightOwnerWithColor (myMainPM,
1566 myLastPicked->IsSelected() ? getSelStyle (theIObj, myLastPicked) : getHiStyle (theIObj, myLastPicked),
1570 if (theToUpdateViewer)
1572 UpdateCurrentViewer();
1576 //=======================================================================
1577 //function : UnsetWidth
1579 //=======================================================================
1580 void AIS_InteractiveContext::UnsetWidth (const Handle(AIS_InteractiveObject)& theIObj,
1581 const Standard_Boolean theToUpdateViewer)
1583 if (theIObj.IsNull())
1588 theIObj->UnsetWidth();
1589 theIObj->UpdatePresentations();
1590 if (theToUpdateViewer)
1592 UpdateCurrentViewer();
1596 //=======================================================================
1597 //function : SetMaterial
1599 //=======================================================================
1600 void AIS_InteractiveContext::SetMaterial (const Handle(AIS_InteractiveObject)& theIObj,
1601 const Graphic3d_MaterialAspect& theMaterial,
1602 const Standard_Boolean theToUpdateViewer)
1604 if (theIObj.IsNull())
1609 setContextToObject (theIObj);
1610 theIObj->SetMaterial (theMaterial);
1611 theIObj->UpdatePresentations();
1612 if (theToUpdateViewer)
1614 UpdateCurrentViewer();
1618 //=======================================================================
1619 //function : UnsetMaterial
1621 //=======================================================================
1622 void AIS_InteractiveContext::UnsetMaterial (const Handle(AIS_InteractiveObject)& theIObj,
1623 const Standard_Boolean theToUpdateViewer)
1625 if (theIObj.IsNull())
1629 theIObj->UnsetMaterial();
1630 theIObj->UpdatePresentations();
1631 if (theToUpdateViewer)
1633 UpdateCurrentViewer();
1637 //=======================================================================
1638 //function : SetTransparency
1640 //=======================================================================
1641 void AIS_InteractiveContext::SetTransparency (const Handle(AIS_InteractiveObject)& theIObj,
1642 const Standard_Real theValue,
1643 const Standard_Boolean theToUpdateViewer)
1645 if (theIObj.IsNull())
1650 setContextToObject (theIObj);
1651 if (!theIObj->IsTransparent()
1652 && theValue <= 0.005)
1657 if (theValue <= 0.005)
1659 UnsetTransparency (theIObj, theToUpdateViewer);
1663 theIObj->SetTransparency (theValue);
1664 theIObj->UpdatePresentations();
1665 if (theToUpdateViewer)
1667 UpdateCurrentViewer();
1671 //=======================================================================
1672 //function : UnsetTransparency
1674 //=======================================================================
1675 void AIS_InteractiveContext::UnsetTransparency (const Handle(AIS_InteractiveObject)& theIObj,
1676 const Standard_Boolean theToUpdateViewer)
1678 if (theIObj.IsNull())
1683 theIObj->UnsetTransparency();
1684 theIObj->UpdatePresentations();
1685 if (theToUpdateViewer)
1687 UpdateCurrentViewer();
1691 //=======================================================================
1692 //function : SetSelectedAspect
1694 //=======================================================================
1695 void AIS_InteractiveContext::SetSelectedAspect (const Handle(Prs3d_BasicAspect)& theAspect,
1696 const Standard_Boolean theToUpdateViewer)
1698 Standard_DISABLE_DEPRECATION_WARNINGS
1699 Standard_Boolean isFound = Standard_False;
1700 for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
1702 isFound = Standard_True;
1703 Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (aSelIter.Value()->Selectable());
1704 anObj->SetAspect (theAspect);
1706 Standard_ENABLE_DEPRECATION_WARNINGS
1708 if (isFound && theToUpdateViewer)
1710 myMainVwr->Update();
1714 //=======================================================================
1715 //function : SetLocalAttributes
1717 //=======================================================================
1718 void AIS_InteractiveContext::SetLocalAttributes (const Handle(AIS_InteractiveObject)& theIObj,
1719 const Handle(Prs3d_Drawer)& theDrawer,
1720 const Standard_Boolean theToUpdateViewer)
1722 if (theIObj.IsNull())
1727 setContextToObject (theIObj);
1728 theIObj->SetAttributes (theDrawer);
1729 Update (theIObj, theToUpdateViewer);
1732 //=======================================================================
1733 //function : UnsetLocalAttributes
1735 //=======================================================================
1736 void AIS_InteractiveContext::UnsetLocalAttributes (const Handle(AIS_InteractiveObject)& theIObj,
1737 const Standard_Boolean theToUpdateViewer)
1739 if (theIObj.IsNull())
1744 setContextToObject (theIObj);
1745 theIObj->UnsetAttributes();
1746 Update (theIObj, theToUpdateViewer);
1749 //=======================================================================
1752 //=======================================================================
1753 void AIS_InteractiveContext::Status (const Handle(AIS_InteractiveObject)& theIObj,
1754 TCollection_ExtendedString& theStatus) const
1757 if (theIObj.IsNull()
1758 || !myObjects.IsBound (theIObj))
1763 theStatus += "\t ____________________________________________";
1764 theStatus += "\t| Known at Neutral Point:\n\tDisplayStatus:";
1765 const Handle(AIS_GlobalStatus)& aStatus = myObjects (theIObj);
1766 switch (aStatus->GraphicStatus())
1768 case AIS_DS_Displayed:
1770 theStatus += "\t| -->Displayed\n";
1775 theStatus += "\t| -->Erased\n";
1782 theStatus += "\t| Active Display Modes in the MainViewer :\n";
1783 theStatus += "\t|\t Mode ";
1784 theStatus += TCollection_AsciiString (aStatus->DisplayMode());
1787 if (IsSelected(theIObj)) theStatus +="\t| Selected\n";
1789 theStatus += "\t| Active Selection Modes in the MainViewer :\n";
1790 for (TColStd_ListIteratorOfListOfInteger aSelModeIter (aStatus->SelectionModes()); aSelModeIter.More(); aSelModeIter.Next())
1792 theStatus += "\t\t Mode ";
1793 theStatus += TCollection_AsciiString (aSelModeIter.Value());
1796 theStatus += "\t ____________________________________________";
1799 //=======================================================================
1800 //function : GetDefModes
1802 //=======================================================================
1803 void AIS_InteractiveContext::GetDefModes (const Handle(AIS_InteractiveObject)& theIObj,
1804 Standard_Integer& theDispMode,
1805 Standard_Integer& theHiMode,
1806 Standard_Integer& theSelMode) const
1808 if (theIObj.IsNull())
1813 theDispMode = theIObj->HasDisplayMode()
1814 ? theIObj->DisplayMode()
1815 : (theIObj->AcceptDisplayMode (myDefaultDrawer->DisplayMode())
1816 ? myDefaultDrawer->DisplayMode()
1818 theHiMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : theDispMode;
1819 theSelMode = theIObj->GlobalSelectionMode();
1822 //=======================================================================
1823 //function : EraseGlobal
1825 //=======================================================================
1826 void AIS_InteractiveContext::EraseGlobal (const Handle(AIS_InteractiveObject)& theIObj,
1827 const Standard_Boolean theToUpdateviewer)
1829 Handle(AIS_GlobalStatus) aStatus;
1830 if (theIObj.IsNull()
1831 || !myObjects.Find (theIObj, aStatus)
1832 || aStatus->GraphicStatus() == AIS_DS_Erased)
1837 const Standard_Integer aDispMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
1838 unselectOwners (theIObj);
1839 myMainPM->SetVisibility (theIObj, aStatus->DisplayMode(), Standard_False);
1841 if (!myLastPicked.IsNull()
1842 && myLastPicked->IsSameSelectable (theIObj))
1844 clearDynamicHighlight();
1847 // make sure highlighting presentations are properly erased
1848 theIObj->ErasePresentations (false);
1850 if (IsSelected (theIObj)
1851 && aStatus->DisplayMode() != aDispMode)
1853 myMainPM->SetVisibility (theIObj, aDispMode, Standard_False);
1856 for (TColStd_ListIteratorOfListOfInteger aSelModeIter (aStatus->SelectionModes()); aSelModeIter.More(); aSelModeIter.Next())
1858 mgrSelector->Deactivate (theIObj, aSelModeIter.Value());
1860 aStatus->ClearSelectionModes();
1861 aStatus->SetGraphicStatus (AIS_DS_Erased);
1863 if (theToUpdateviewer)
1865 myMainVwr->Update();
1869 //=======================================================================
1870 //function : unselectOwners
1872 //=======================================================================
1873 void AIS_InteractiveContext::unselectOwners (const Handle(AIS_InteractiveObject)& theObject)
1875 SelectMgr_SequenceOfOwner aSeq;
1876 for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
1878 if (aSelIter.Value()->IsSameSelectable (theObject))
1880 aSeq.Append (aSelIter.Value());
1883 for (SelectMgr_SequenceOfOwner::Iterator aDelIter (aSeq); aDelIter.More(); aDelIter.Next())
1885 AddOrRemoveSelected (aDelIter.Value(), Standard_False);
1889 //=======================================================================
1890 //function : ClearGlobal
1892 //=======================================================================
1893 void AIS_InteractiveContext::ClearGlobal (const Handle(AIS_InteractiveObject)& theIObj,
1894 const Standard_Boolean theToUpdateviewer)
1896 Handle(AIS_GlobalStatus) aStatus;
1897 if (theIObj.IsNull()
1898 || !myObjects.Find (theIObj, aStatus))
1900 // for cases when reference shape of connected interactives was not displayed
1901 // but its selection primitives were calculated
1902 const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
1903 mgrSelector->Remove (anObj);
1907 unselectOwners (theIObj);
1909 myMainPM->Erase (theIObj, -1);
1910 theIObj->ErasePresentations (true); // make sure highlighting presentations are properly erased
1912 // Object removes from Detected sequence
1913 Standard_DISABLE_DEPRECATION_WARNINGS
1914 for (Standard_Integer aDetIter = myDetectedSeq.Lower(); aDetIter <= myDetectedSeq.Upper();)
1916 Handle(SelectMgr_EntityOwner) aPicked = myMainSel->Picked (myDetectedSeq (aDetIter));
1917 Handle(AIS_InteractiveObject) anObj;
1918 if (!aPicked.IsNull())
1920 anObj = Handle(AIS_InteractiveObject)::DownCast (aPicked->Selectable());
1924 && anObj == theIObj)
1926 myDetectedSeq.Remove (aDetIter);
1927 if (myCurDetected == aDetIter)
1929 myCurDetected = Min (myDetectedSeq.Upper(), aDetIter);
1931 if (myCurHighlighted == aDetIter)
1933 myCurHighlighted = 0;
1941 Standard_ENABLE_DEPRECATION_WARNINGS
1943 // remove IO from the selection manager to avoid memory leaks
1944 const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
1945 mgrSelector->Remove (anObj);
1947 setObjectStatus (theIObj, AIS_DS_None, -1, -1);
1948 myMainVwr->StructureManager()->UnregisterObject (theIObj);
1950 for (V3d_ListOfViewIterator aDefViewIter (myMainVwr->DefinedViewIterator()); aDefViewIter.More(); aDefViewIter.Next())
1952 aDefViewIter.Value()->View()->ChangeHiddenObjects()->Remove (theIObj.get());
1955 if (!myLastPicked.IsNull())
1957 if (myLastPicked->IsSameSelectable (theIObj))
1959 clearDynamicHighlight();
1960 myLastPicked.Nullify();
1964 if (theToUpdateviewer && aStatus->GraphicStatus() == AIS_DS_Displayed)
1966 myMainVwr->Update();
1970 //=======================================================================
1971 //function : ClearGlobalPrs
1973 //=======================================================================
1974 void AIS_InteractiveContext::ClearGlobalPrs (const Handle(AIS_InteractiveObject)& theIObj,
1975 const Standard_Integer theMode,
1976 const Standard_Boolean theToUpdateViewer)
1978 if (theIObj.IsNull()
1979 || !myObjects.IsBound (theIObj))
1984 const Handle(AIS_GlobalStatus)& aStatus = myObjects (theIObj);
1985 if (aStatus->DisplayMode() == theMode)
1987 const Standard_Integer aDispMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
1988 if (aDispMode == theMode
1989 && myMainPM->IsHighlighted (theIObj, theMode))
1991 unhighlightGlobal (theIObj);
1994 myMainPM->Erase (theIObj, theMode);
1997 if (aStatus->GraphicStatus() == AIS_DS_Displayed
1998 && theToUpdateViewer)
2000 myMainVwr->Update();
2004 //=======================================================================
2005 //function : ClearDetected
2007 //=======================================================================
2008 Standard_Boolean AIS_InteractiveContext::ClearDetected (Standard_Boolean theToRedrawImmediate)
2011 myCurHighlighted = 0;
2012 myDetectedSeq.Clear();
2013 Standard_Boolean toUpdate = Standard_False;
2014 if (!myLastPicked.IsNull() && myLastPicked->HasSelectable())
2016 toUpdate = Standard_True;
2017 clearDynamicHighlight();
2019 myLastPicked.Nullify();
2020 myMainSel->ClearPicked();
2021 if (toUpdate && theToRedrawImmediate)
2023 myMainVwr->RedrawImmediate();
2028 //=======================================================================
2029 //function : DrawHiddenLine
2031 //=======================================================================
2032 Standard_Boolean AIS_InteractiveContext::DrawHiddenLine() const
2034 return myDefaultDrawer->DrawHiddenLine();
2037 //=======================================================================
2038 //function : EnableDrawHiddenLine
2040 //=======================================================================
2041 void AIS_InteractiveContext::EnableDrawHiddenLine() const
2043 myDefaultDrawer->EnableDrawHiddenLine();
2046 //=======================================================================
2047 //function : DisableDrawHiddenLine
2049 //=======================================================================
2050 void AIS_InteractiveContext::DisableDrawHiddenLine() const
2052 myDefaultDrawer->DisableDrawHiddenLine();
2055 //=======================================================================
2056 //function : HiddenLineAspect
2058 //=======================================================================
2059 Handle (Prs3d_LineAspect) AIS_InteractiveContext::HiddenLineAspect() const
2061 return myDefaultDrawer->HiddenLineAspect();
2064 //=======================================================================
2065 //function : SetHiddenLineAspect
2067 //=======================================================================
2068 void AIS_InteractiveContext::SetHiddenLineAspect (const Handle(Prs3d_LineAspect)& theAspect) const
2070 myDefaultDrawer->SetHiddenLineAspect (theAspect);
2073 //=======================================================================
2074 //function : SetIsoNumber
2076 //=======================================================================
2077 void AIS_InteractiveContext::SetIsoNumber (const Standard_Integer theNb,
2078 const AIS_TypeOfIso theType)
2083 myDefaultDrawer->UIsoAspect()->SetNumber (theNb);
2086 myDefaultDrawer->VIsoAspect()->SetNumber (theNb);
2089 myDefaultDrawer->UIsoAspect()->SetNumber (theNb);
2090 myDefaultDrawer->VIsoAspect()->SetNumber (theNb);
2095 //=======================================================================
2096 //function : IsoNumber
2098 //=======================================================================
2099 Standard_Integer AIS_InteractiveContext::IsoNumber (const AIS_TypeOfIso theType)
2103 case AIS_TOI_IsoU: return myDefaultDrawer->UIsoAspect()->Number();
2104 case AIS_TOI_IsoV: return myDefaultDrawer->VIsoAspect()->Number();
2105 case AIS_TOI_Both: return myDefaultDrawer->UIsoAspect()->Number() == myDefaultDrawer->VIsoAspect()->Number()
2106 ? myDefaultDrawer->UIsoAspect()->Number()
2112 //=======================================================================
2113 //function : IsoOnPlane
2115 //=======================================================================
2116 void AIS_InteractiveContext::IsoOnPlane (const Standard_Boolean theToSwitchOn)
2118 myDefaultDrawer->SetIsoOnPlane (theToSwitchOn);
2121 //=======================================================================
2122 //function : IsoOnPlane
2124 //=======================================================================
2125 Standard_Boolean AIS_InteractiveContext::IsoOnPlane() const
2127 return myDefaultDrawer->IsoOnPlane();
2130 //=======================================================================
2131 //function : IsoOnTriangulation
2133 //=======================================================================
2134 void AIS_InteractiveContext::IsoOnTriangulation (const Standard_Boolean theToSwitchOn)
2136 myDefaultDrawer->SetIsoOnTriangulation (theToSwitchOn);
2139 //=======================================================================
2140 //function : IsoOnTriangulation
2142 //=======================================================================
2143 Standard_Boolean AIS_InteractiveContext::IsoOnTriangulation() const
2145 return myDefaultDrawer->IsoOnTriangulation();
2148 //=======================================================================
2149 //function : SetPixelTolerance
2151 //=======================================================================
2152 void AIS_InteractiveContext::SetPixelTolerance (const Standard_Integer thePrecision)
2154 myMainSel->SetPixelTolerance (thePrecision);
2157 //=======================================================================
2158 //function : PixelTolerance
2160 //=======================================================================
2161 Standard_Integer AIS_InteractiveContext::PixelTolerance() const
2163 return myMainSel->PixelTolerance();
2166 //=======================================================================
2167 //function : SetSelectionSensitivity
2168 //purpose : Allows to manage sensitivity of a particular selection of interactive object theObject
2169 //=======================================================================
2170 void AIS_InteractiveContext::SetSelectionSensitivity (const Handle(AIS_InteractiveObject)& theObject,
2171 const Standard_Integer theMode,
2172 const Standard_Integer theNewSensitivity)
2174 mgrSelector->SetSelectionSensitivity (theObject, theMode, theNewSensitivity);
2177 //=======================================================================
2178 //function : InitAttributes
2180 //=======================================================================
2181 void AIS_InteractiveContext::InitAttributes()
2183 Graphic3d_MaterialAspect aMat (Graphic3d_NameOfMaterial_Brass);
2184 myDefaultDrawer->ShadingAspect()->SetMaterial (aMat);
2186 // myDefaultDrawer->ShadingAspect()->SetColor(Quantity_NOC_GRAY70);
2187 Handle(Prs3d_LineAspect) aLineAspect = myDefaultDrawer->HiddenLineAspect();
2188 aLineAspect->SetColor (Quantity_NOC_GRAY20);
2189 aLineAspect->SetWidth (1.0);
2190 aLineAspect->SetTypeOfLine (Aspect_TOL_DASH);
2192 // tolerance to 2 pixels...
2193 SetPixelTolerance (2);
2195 // Customizing the drawer for trihedrons and planes...
2196 Handle(Prs3d_DatumAspect) aTrihAspect = myDefaultDrawer->DatumAspect();
2197 const Standard_Real aLength = 100.0;
2198 aTrihAspect->SetAxisLength (aLength, aLength, aLength);
2199 const Quantity_Color aColor = Quantity_NOC_LIGHTSTEELBLUE4;
2200 aTrihAspect->LineAspect(Prs3d_DP_XAxis)->SetColor (aColor);
2201 aTrihAspect->LineAspect(Prs3d_DP_YAxis)->SetColor (aColor);
2202 aTrihAspect->LineAspect(Prs3d_DP_ZAxis)->SetColor (aColor);
2204 Handle(Prs3d_PlaneAspect) aPlaneAspect = myDefaultDrawer->PlaneAspect();
2205 const Standard_Real aPlaneLength = 200.0;
2206 aPlaneAspect->SetPlaneLength (aPlaneLength, aPlaneLength);
2207 aPlaneAspect->EdgesAspect()->SetColor (Quantity_NOC_SKYBLUE);
2210 //=======================================================================
2211 //function : TrihedronSize
2213 //=======================================================================
2214 Standard_Real AIS_InteractiveContext::TrihedronSize() const
2216 return myDefaultDrawer->DatumAspect()->AxisLength(Prs3d_DP_XAxis);
2219 //=======================================================================
2220 //function : SetTrihedronSize
2222 //=======================================================================
2223 void AIS_InteractiveContext::SetTrihedronSize (const Standard_Real theVal,
2224 const Standard_Boolean /*updateviewer*/)
2226 myDefaultDrawer->DatumAspect()->SetAxisLength (theVal, theVal, theVal);
2227 Redisplay (AIS_KOI_Datum, 3, Standard_False);
2228 Redisplay (AIS_KOI_Datum, 4, Standard_True);
2231 //=======================================================================
2232 //function : SetPlaneSize
2234 //=======================================================================
2235 void AIS_InteractiveContext::SetPlaneSize(const Standard_Real theValX,
2236 const Standard_Real theValY,
2237 const Standard_Boolean theToUpdateViewer)
2239 myDefaultDrawer->PlaneAspect()->SetPlaneLength (theValX, theValY);
2240 Redisplay (AIS_KOI_Datum, 7, theToUpdateViewer);
2243 //=======================================================================
2244 //function : SetPlaneSize
2246 //=======================================================================
2247 void AIS_InteractiveContext::SetPlaneSize (const Standard_Real theVal,
2248 const Standard_Boolean theToUpdateViewer)
2250 SetPlaneSize (theVal, theVal, theToUpdateViewer);
2253 //=======================================================================
2254 //function : PlaneSize
2256 //=======================================================================
2257 Standard_Boolean AIS_InteractiveContext::PlaneSize (Standard_Real& theX,
2258 Standard_Real& theY) const
2260 theX = myDefaultDrawer->PlaneAspect()->PlaneXLength();
2261 theY = myDefaultDrawer->PlaneAspect()->PlaneYLength();
2262 return (Abs (theX - theY) <= Precision::Confusion());
2265 //=======================================================================
2266 //function : SetZLayer
2268 //=======================================================================
2269 void AIS_InteractiveContext::SetZLayer (const Handle(AIS_InteractiveObject)& theIObj,
2270 const Graphic3d_ZLayerId theLayerId)
2272 if (theIObj.IsNull())
2275 theIObj->SetZLayer (theLayerId);
2278 //=======================================================================
2279 //function : GetZLayer
2281 //=======================================================================
2282 Graphic3d_ZLayerId AIS_InteractiveContext::GetZLayer (const Handle(AIS_InteractiveObject)& theIObj) const
2284 return !theIObj.IsNull()
2286 : Graphic3d_ZLayerId_UNKNOWN;
2289 //=======================================================================
2290 //function : RebuildSelectionStructs
2291 //purpose : Rebuilds 1st level of BVH selection forcibly
2292 //=======================================================================
2293 void AIS_InteractiveContext::RebuildSelectionStructs()
2295 myMainSel->RebuildObjectsTree (Standard_True);
2298 //=======================================================================
2299 //function : Disconnect
2300 //purpose : Disconnects selectable object from an assembly and updates selection structures
2301 //=======================================================================
2302 void AIS_InteractiveContext::Disconnect (const Handle(AIS_InteractiveObject)& theAssembly,
2303 const Handle(AIS_InteractiveObject)& theObjToDisconnect)
2305 if (theAssembly->IsInstance ("AIS_MultipleConnectedInteractive"))
2307 Handle(AIS_MultipleConnectedInteractive) theObj (Handle(AIS_MultipleConnectedInteractive)::DownCast (theAssembly));
2308 theObj->Disconnect (theObjToDisconnect);
2309 if (!myObjects.IsBound (theObjToDisconnect))
2311 // connected presentation might contain displayed presentations
2312 myMainPM->Erase (theObjToDisconnect, -1);
2313 theObjToDisconnect->ErasePresentations (true);
2316 const Handle(SelectMgr_SelectableObject)& anObj = theObjToDisconnect; // to avoid ambiguity
2317 mgrSelector->Remove (anObj);
2319 else if (theAssembly->IsInstance ("AIS_ConnectedInteractive") && theObjToDisconnect.IsNull())
2321 Handle(AIS_ConnectedInteractive) theObj (Handle(AIS_ConnectedInteractive)::DownCast (theAssembly));
2322 theObj->Disconnect();
2323 const Handle(SelectMgr_SelectableObject)& anObj = theObj; // to avoid ambiguity
2324 mgrSelector->Remove (anObj);
2330 //=======================================================================
2331 //function : FitSelected
2332 //purpose : Fits the view corresponding to the bounds of selected objects
2333 //=======================================================================
2334 void AIS_InteractiveContext::FitSelected (const Handle(V3d_View)& theView)
2336 FitSelected (theView, 0.01, Standard_True);
2339 //=======================================================================
2340 //function : BoundingBoxOfSelection
2342 //=======================================================================
2343 Bnd_Box AIS_InteractiveContext::BoundingBoxOfSelection() const
2345 Bnd_Box aBndSelected;
2346 AIS_MapOfObjectOwners anObjectOwnerMap;
2347 for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
2349 const Handle(SelectMgr_EntityOwner)& anOwner = aSelIter.Value();
2350 Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast(anOwner->Selectable());
2351 if (anObj->IsInfinite())
2356 if (anOwner == anObj->GlobalSelOwner())
2359 anObj->BoundingBox (aTmpBnd);
2360 aBndSelected.Add (aTmpBnd);
2364 Handle(SelectMgr_IndexedMapOfOwner) anOwnerMap;
2365 if (!anObjectOwnerMap.Find (anOwner->Selectable(), anOwnerMap))
2367 anOwnerMap = new SelectMgr_IndexedMapOfOwner();
2368 anObjectOwnerMap.Bind (anOwner->Selectable(), anOwnerMap);
2371 anOwnerMap->Add (anOwner);
2375 for (AIS_MapIteratorOfMapOfObjectOwners anIter (anObjectOwnerMap); anIter.More(); anIter.Next())
2377 const Handle(SelectMgr_SelectableObject) anObject = anIter.Key();
2378 Bnd_Box aTmpBox = anObject->BndBoxOfSelected (anIter.ChangeValue());
2379 aBndSelected.Add (aTmpBox);
2382 return aBndSelected;
2385 //=======================================================================
2386 //function : FitSelected
2387 //purpose : Fits the view corresponding to the bounds of selected objects
2388 //=======================================================================
2389 void AIS_InteractiveContext::FitSelected (const Handle(V3d_View)& theView,
2390 const Standard_Real theMargin,
2391 const Standard_Boolean theToUpdate)
2393 Bnd_Box aBndSelected = BoundingBoxOfSelection();
2394 if (!aBndSelected.IsVoid())
2396 theView->FitAll (aBndSelected, theMargin, theToUpdate);
2400 //=======================================================================
2401 //function : SetTransformPersistence
2403 //=======================================================================
2404 void AIS_InteractiveContext::SetTransformPersistence (const Handle(AIS_InteractiveObject)& theObject,
2405 const Handle(Graphic3d_TransformPers)& theTrsfPers)
2407 theObject->SetTransformPersistence (theTrsfPers);
2408 if (!myObjects.IsBound (theObject))
2413 mgrSelector->UpdateSelection (theObject);
2415 const Standard_Integer aLayerId = myObjects.Find (theObject)->GetLayerIndex();
2416 const Handle(V3d_Viewer)& aCurViewer = CurrentViewer();
2417 for (V3d_ListOfViewIterator anActiveViewIter (aCurViewer->ActiveViewIterator()); anActiveViewIter.More(); anActiveViewIter.Next())
2419 anActiveViewIter.Value()->View()->InvalidateBVHData (aLayerId);
2420 anActiveViewIter.Value()->View()->InvalidateZLayerBoundingBox (aLayerId);
2424 //=======================================================================
2425 //function : GravityPoint
2427 //=======================================================================
2428 gp_Pnt AIS_InteractiveContext::GravityPoint (const Handle(V3d_View)& theView) const
2430 return theView->GravityPoint();
2432 //=======================================================================
2433 //function : setObjectStatus
2435 //=======================================================================
2436 void AIS_InteractiveContext::setObjectStatus (const Handle(AIS_InteractiveObject)& theIObj,
2437 const AIS_DisplayStatus theStatus,
2438 const Standard_Integer theDispMode,
2439 const Standard_Integer theSelectionMode)
2441 if (theStatus != AIS_DS_None)
2443 Handle(AIS_GlobalStatus) aStatus = new AIS_GlobalStatus (AIS_DS_Displayed, theDispMode, theSelectionMode);
2444 myObjects.Bind (theIObj, aStatus);
2447 myObjects.UnBind (theIObj);
2449 for (PrsMgr_ListOfPresentableObjectsIter aPrsIter (theIObj->Children()); aPrsIter.More(); aPrsIter.Next())
2451 Handle(AIS_InteractiveObject) aChild (Handle(AIS_InteractiveObject)::DownCast (aPrsIter.Value()));
2452 if (aChild.IsNull())
2455 setObjectStatus (aChild, theStatus, theDispMode, theSelectionMode);