0031221: Visualization - selection filter in context
[occt.git] / src / AIS / AIS_InteractiveContext.cxx
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
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
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.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #include <AIS_InteractiveContext.hxx>
18
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>
59
60 IMPLEMENT_STANDARD_RTTIEXT(AIS_InteractiveContext, Standard_Transient)
61
62 namespace
63 {
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;
66
67   //! Initialize default highlighting attributes.
68   static void initDefaultHilightAttributes (const Handle(Prs3d_Drawer)& theDrawer,
69                                             const Quantity_Color& theColor)
70   {
71     theDrawer->SetMethod (Aspect_TOHM_COLOR);
72     theDrawer->SetDisplayMode (0);
73     theDrawer->SetColor (theColor);
74
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());
88
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)
99     {
100       if (Handle(Prs3d_LineAspect) aLineAsp = theDrawer->DatumAspect()->LineAspect ((Prs3d_DatumParts )aPartIter))
101       {
102         aLineAsp->SetColor (theColor);
103       }
104     }
105
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);
113
114     // the triangulation should be computed using main presentation attributes,
115     // and should not be overridden by highlighting
116     theDrawer->SetAutoTriangulation (Standard_False);
117   }
118 }
119
120 //=======================================================================
121 //function : AIS_InteractiveContext
122 //purpose  : 
123 //=======================================================================
124
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()),
133 myCurDetected(0),
134 myCurHighlighted(0),
135 myPickingStrategy (SelectMgr_PickingStrategy_FirstAcceptable),
136 myAutoHilight(Standard_True),
137 myIsAutoActivateSelMode(Standard_True)
138 {
139   mgrSelector = new SelectMgr_SelectionManager (myMainSel);
140
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();
147
148   myDefaultDrawer->SetZLayer(Graphic3d_ZLayerId_Default);
149   myDefaultDrawer->SetDisplayMode(0);
150   {
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);
155   }
156   {
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);
161   }
162   {
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);
167   }
168   {
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);
173   }
174   {
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);
179   }
180
181   InitAttributes();
182 }
183
184 //=======================================================================
185 //function : ~AIS_InteractiveContext
186 //purpose  :
187 //=======================================================================
188 AIS_InteractiveContext::~AIS_InteractiveContext()
189 {
190   // clear the current selection
191   mySelection->Clear();
192   mgrSelector.Nullify();
193
194   Handle(AIS_InteractiveContext) aNullContext;
195   for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
196   {
197     const Handle(AIS_InteractiveObject)& anObj = anObjIter.Key();
198     anObj->SetContext (aNullContext);
199     for (SelectMgr_SequenceOfSelection::Iterator aSelIter (anObj->Selections()); aSelIter.More(); aSelIter.Next())
200     {
201       aSelIter.Value()->UpdateBVHStatus (SelectMgr_TBU_Renew);
202     }
203   }
204 }
205
206 //=======================================================================
207 //function : LastActiveView
208 //purpose  :
209 //=======================================================================
210 Handle(V3d_View) AIS_InteractiveContext::LastActiveView() const
211 {
212   if (myLastActiveView == NULL
213    || myMainVwr.IsNull())
214   {
215     return Handle(V3d_View)();
216   }
217
218   // as a precaution - check that myLastActiveView pointer is a valid active View
219   for (V3d_ListOfViewIterator aViewIter = myMainVwr->ActiveViewIterator(); aViewIter.More(); aViewIter.Next())
220   {
221     if (aViewIter.Value() == myLastActiveView)
222     {
223       return aViewIter.Value();
224     }
225   }
226   return Handle(V3d_View)();
227 }
228
229 //=======================================================================
230 //function : UpdateCurrentViewer
231 //purpose  : 
232 //=======================================================================
233
234 void AIS_InteractiveContext::UpdateCurrentViewer()
235 {
236   if (!myMainVwr.IsNull())
237     myMainVwr->Update();
238 }
239
240 //=======================================================================
241 //function : DisplayedObjects
242 //purpose  :
243 //=======================================================================
244 void AIS_InteractiveContext::DisplayedObjects (AIS_ListOfInteractive& theListOfIO) const
245 {
246   for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
247   {
248     if (anObjIter.Value()->GraphicStatus() == AIS_DS_Displayed)
249     {
250       theListOfIO.Append (anObjIter.Key());
251     }
252   }
253 }
254
255 //=======================================================================
256 //function : DisplayedObjects
257 //purpose  :
258 //=======================================================================
259 void AIS_InteractiveContext::DisplayedObjects (const AIS_KindOfInteractive theKind,
260                                                const Standard_Integer      theSign,
261                                                AIS_ListOfInteractive&      theListOfIO) const
262 {
263   ObjectsByDisplayStatus (theKind, theSign, AIS_DS_Displayed, theListOfIO);
264 }
265
266 //=======================================================================
267 //function : ErasedObjects
268 //purpose  :
269 //=======================================================================
270 void AIS_InteractiveContext::ErasedObjects (AIS_ListOfInteractive& theListOfIO) const
271 {
272   ObjectsByDisplayStatus (AIS_DS_Erased, theListOfIO);
273 }
274
275 //=======================================================================
276 //function : ErasedObjects
277 //purpose  :
278 //=======================================================================
279 void AIS_InteractiveContext::ErasedObjects (const AIS_KindOfInteractive theKind,
280                                             const Standard_Integer      theSign,
281                                             AIS_ListOfInteractive&      theListOfIO) const
282 {
283   ObjectsByDisplayStatus (theKind, theSign, AIS_DS_Erased, theListOfIO);
284 }
285
286 //=======================================================================
287 //function : ObjectsByDisplayStatus
288 //purpose  :
289 //=======================================================================
290 void AIS_InteractiveContext::ObjectsByDisplayStatus (const AIS_DisplayStatus theStatus,
291                                                      AIS_ListOfInteractive&  theListOfIO) const
292 {
293   for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
294   {
295     if (anObjIter.Value()->GraphicStatus() == theStatus)
296     {
297       theListOfIO.Append (anObjIter.Key());
298     }
299   }
300 }
301
302 //=======================================================================
303 //function : ObjectsByDisplayStatus
304 //purpose  :
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
310 {
311   for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
312   {
313     if (theStatus != AIS_DS_None
314      && anObjIter.Value()->GraphicStatus() != theStatus)
315     {
316       continue;
317     }
318     else if (anObjIter.Key()->Type() != theKind)
319     {
320       continue;
321     }
322
323     if (theSign == -1
324      || anObjIter.Key()->Signature() == theSign)
325     {
326       theListOfIO.Append (anObjIter.Key());
327     }
328   }
329 }
330
331 //=======================================================================
332 //function : ObjectsInside
333 //purpose  :
334 //=======================================================================
335 void AIS_InteractiveContext::ObjectsInside (AIS_ListOfInteractive&      theListOfIO,
336                                             const AIS_KindOfInteractive theKind,
337                                             const Standard_Integer      theSign) const
338 {
339   if (theKind == AIS_KOI_None
340    && theSign == -1)
341   {
342     for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
343     {
344       theListOfIO.Append (anObjIter.Key());
345     }
346     return;
347   }
348
349   for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
350   {
351     if (anObjIter.Key()->Type() != theKind)
352     {
353       continue;
354     }
355
356     if (theSign == -1
357      || anObjIter.Key()->Signature() == theSign)
358     {
359       theListOfIO.Append (anObjIter.Key());
360     }
361   }
362 }
363
364 //=======================================================================
365 //function : ObjectsForView
366 //purpose  :
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
372 {
373   Handle(Graphic3d_CView) aViewImpl = theView->View();
374   const Standard_Integer  aViewId   = aViewImpl->Identification();
375   for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
376   {
377     if (theStatus != AIS_DS_None
378      && anObjIter.Value()->GraphicStatus() != theStatus)
379     {
380       theListOfIO.Append (anObjIter.Key());
381       continue;
382     }
383
384     Handle(Graphic3d_ViewAffinity) anAffinity = myMainVwr->StructureManager()->ObjectAffinity (anObjIter.Key());
385     const Standard_Boolean isVisible = anAffinity->IsVisible (aViewId);
386     if (isVisible == theIsVisibleInView)
387     {
388       theListOfIO.Append (anObjIter.Key());
389     }
390   }
391 }
392
393 //=======================================================================
394 //function : Display
395 //purpose  :
396 //=======================================================================
397 void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIObj,
398                                       const Standard_Boolean               theToUpdateViewer)
399 {
400   if (theIObj.IsNull())
401   {
402     return;
403   }
404
405   Standard_Integer aDispMode = 0, aHiMod = -1, aSelMode = -1;
406   GetDefModes (theIObj, aDispMode, aHiMod, aSelMode);
407   Display (theIObj, aDispMode, myIsAutoActivateSelMode ? aSelMode : -1, theToUpdateViewer);
408 }
409
410 //=======================================================================
411 //function : SetViewAffinity
412 //purpose  :
413 //=======================================================================
414 void AIS_InteractiveContext::SetViewAffinity (const Handle(AIS_InteractiveObject)& theIObj,
415                                               const Handle(V3d_View)&              theView,
416                                               const Standard_Boolean               theIsVisible)
417 {
418   if (theIObj.IsNull()
419   || !myObjects.IsBound (theIObj))
420   {
421     return;
422   }
423
424   Handle(Graphic3d_ViewAffinity) anAffinity = myMainVwr->StructureManager()->ObjectAffinity (theIObj);
425   Handle(Graphic3d_CView) aViewImpl = theView->View();
426   anAffinity->SetVisible (aViewImpl->Identification(), theIsVisible == Standard_True);
427   if (theIsVisible)
428   {
429     theView->View()->ChangeHiddenObjects()->Remove (theIObj.get());
430   }
431   else
432   {
433     theView->View()->ChangeHiddenObjects()->Add (theIObj.get());
434   }
435 }
436
437 //=======================================================================
438 //function : Display
439 //purpose  :
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)
446 {
447   if (theIObj.IsNull())
448   {
449     return;
450   }
451
452   if (theDispStatus == AIS_DS_Erased)
453   {
454     Erase  (theIObj, theToUpdateViewer);
455     Load (theIObj, theSelectionMode);
456     if (Handle(AIS_GlobalStatus)* aStatusPtr = myObjects.ChangeSeek (theIObj))
457     {
458       (*aStatusPtr)->SetDisplayMode (theDispMode);
459     }
460     return;
461   }
462
463   setContextToObject (theIObj);
464   if (!myObjects.IsBound (theIObj))
465   {
466     setObjectStatus (theIObj, AIS_DS_Displayed, theDispMode, theSelectionMode);
467     myMainVwr->StructureManager()->RegisterObject (theIObj);
468     myMainPM->Display(theIObj, theDispMode);
469     if (theSelectionMode != -1)
470     {
471       const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
472       if (!mgrSelector->Contains (anObj))
473       {
474         mgrSelector->Load (theIObj);
475       }
476       mgrSelector->Activate (theIObj, theSelectionMode);
477     }
478   }
479   else
480   {
481     Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
482
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)
488     {
489       if(myMainPM->IsHighlighted (theIObj, anOldMode))
490       {
491         unhighlightGlobal (theIObj);
492       }
493       myMainPM->SetVisibility (theIObj, anOldMode, Standard_False);
494     }
495
496     aStatus->SetDisplayMode (theDispMode);
497
498     myMainPM->Display (theIObj, theDispMode);
499     aStatus->SetGraphicStatus (AIS_DS_Displayed);
500     if (aStatus->IsHilighted())
501     {
502       highlightGlobal (theIObj, aStatus->HilightStyle(), theDispMode);
503     }
504     if (theSelectionMode != -1)
505     {
506       const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
507       if (!mgrSelector->Contains (anObj))
508       {
509         mgrSelector->Load (theIObj);
510       }
511       if (!mgrSelector->IsActivated (theIObj, theSelectionMode))
512       {
513         if (!aStatus->IsSModeIn (theSelectionMode))
514           aStatus->AddSelectionMode (theSelectionMode);
515         mgrSelector->Activate (theIObj, theSelectionMode);
516       }
517     }
518   }
519
520   if (theToUpdateViewer)
521   {
522     myMainVwr->Update();
523   }
524 }
525
526 //=======================================================================
527 //function : Load
528 //purpose  :
529 //=======================================================================
530 void AIS_InteractiveContext::Load (const Handle(AIS_InteractiveObject)& theIObj,
531                                    const Standard_Integer               theSelMode)
532 {
533   if (theIObj.IsNull())
534   {
535     return;
536   }
537
538   setContextToObject (theIObj);
539   if (!myObjects.IsBound (theIObj))
540   {
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);
545   }
546
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))
550   {
551     mgrSelector->Load (theIObj);
552   }
553 }
554
555 //=======================================================================
556 //function : Erase
557 //purpose  :
558 //=======================================================================
559 void AIS_InteractiveContext::Erase (const Handle(AIS_InteractiveObject)& theIObj,
560                                     const Standard_Boolean               theToUpdateViewer)
561 {
562   if (theIObj.IsNull())
563   {
564     return;
565   }
566   
567   if (!theIObj->IsAutoHilight())
568   {
569     theIObj->ClearSelected();
570   }
571
572   EraseGlobal (theIObj, Standard_False);
573   if (theToUpdateViewer)
574   {
575     myMainVwr->Update();
576   }
577 }
578
579 //=======================================================================
580 //function : EraseAll
581 //purpose  :
582 //=======================================================================
583 void AIS_InteractiveContext::EraseAll (const Standard_Boolean theToUpdateViewer)
584 {
585   for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
586   {
587     if (anObjIter.Value()->GraphicStatus() == AIS_DS_Displayed)
588     {
589       Erase (anObjIter.Key(), Standard_False);
590     }
591   }
592
593   if (theToUpdateViewer)
594   {
595     myMainVwr->Update();
596   }
597 }
598
599 //=======================================================================
600 //function : DisplayAll
601 //purpose  :
602 //=======================================================================
603 void AIS_InteractiveContext::DisplayAll (const Standard_Boolean theToUpdateViewer)
604 {
605   for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
606   {
607     const AIS_DisplayStatus aStatus = anObjIter.Value()->GraphicStatus();
608     if (aStatus == AIS_DS_Erased)
609     {
610       Display (anObjIter.Key(), Standard_False);
611     }
612   }
613
614   if (theToUpdateViewer)
615   {
616     myMainVwr->Update();
617   }
618 }
619
620 //=======================================================================
621 //function : DisplaySelected
622 //purpose  :
623 //=======================================================================
624 void AIS_InteractiveContext::DisplaySelected (const Standard_Boolean theToUpdateViewer)
625 {
626   for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
627   {
628     Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (aSelIter.Value()->Selectable());
629     Display (anObj, Standard_False);
630   }
631
632   if (theToUpdateViewer && !mySelection->Objects().IsEmpty())
633   {
634     myMainVwr->Update();
635   }
636 }
637
638 //=======================================================================
639 //function : EraseSelected
640 //purpose  :
641 //=======================================================================
642 void AIS_InteractiveContext::EraseSelected (const Standard_Boolean theToUpdateViewer)
643 {
644   Standard_Boolean isFound = Standard_False;
645   for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Init (mySelection->Objects()))
646   {
647     Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (aSelIter.Value()->Selectable());
648     Erase (anObj, Standard_False);
649     isFound = Standard_True;
650   }
651
652   if (isFound && theToUpdateViewer)
653   {
654     myMainVwr->Update();
655   }
656 }
657
658 //=======================================================================
659 //function : DisplayStatus
660 //purpose  :
661 //=======================================================================
662 AIS_DisplayStatus AIS_InteractiveContext::DisplayStatus (const Handle(AIS_InteractiveObject)& theIObj) const
663 {
664   if (theIObj.IsNull())
665   {
666     return AIS_DS_None;
667   }
668   const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
669   return aStatus != NULL ? (*aStatus)->GraphicStatus() : AIS_DS_None;
670 }
671
672 //=======================================================================
673 //function : Remove
674 //purpose  :
675 //=======================================================================
676 void AIS_InteractiveContext::Remove (const Handle(AIS_InteractiveObject)& theIObj,
677                                      const Standard_Boolean               theToUpdateViewer)
678 {
679   if (theIObj.IsNull())
680   {
681     return;
682   }
683
684   if (theIObj->HasInteractiveContext())
685   {
686     if (theIObj->myCTXPtr != this)
687     {
688       throw Standard_ProgramError("AIS_InteractiveContext - object has been displayed in another context!");
689     }
690     theIObj->SetContext (Handle(AIS_InteractiveContext)());
691   }
692   ClearGlobal (theIObj, theToUpdateViewer);
693 }
694
695 //=======================================================================
696 //function : RemoveAll
697 //purpose  :
698 //=======================================================================
699 void AIS_InteractiveContext::RemoveAll (const Standard_Boolean theToUpdateViewer)
700 {
701   AIS_ListOfInteractive aList;
702   ObjectsInside (aList);
703   for (AIS_ListIteratorOfListOfInteractive aListIterator (aList); aListIterator.More(); aListIterator.Next())
704   {
705     Remove (aListIterator.Value(), Standard_False);
706   }
707
708   if (theToUpdateViewer)
709   {
710     myMainVwr->Update();
711   }
712 }
713
714 //=======================================================================
715 //function : HilightWithColor
716 //purpose  : 
717 //=======================================================================
718 void AIS_InteractiveContext::HilightWithColor(const Handle(AIS_InteractiveObject)& theObj,
719                                               const Handle(Prs3d_Drawer)& theStyle,
720                                               const Standard_Boolean theIsToUpdate)
721 {
722   if (theObj.IsNull())
723     return;
724
725   setContextToObject (theObj);
726   if (!myObjects.IsBound (theObj))
727     return;
728
729   const Handle(AIS_GlobalStatus)& aStatus = myObjects (theObj);
730   aStatus->SetHilightStatus (Standard_True);
731
732   if (aStatus->GraphicStatus() == AIS_DS_Displayed)
733   {
734     highlightGlobal (theObj, theStyle, aStatus->DisplayMode());
735     aStatus->SetHilightStyle (theStyle);
736   }
737
738   if (theIsToUpdate)
739     myMainVwr->Update();
740 }
741
742 //=======================================================================
743 //function : Unhilight
744 //purpose  : 
745 //=======================================================================
746 void AIS_InteractiveContext::Unhilight(const Handle(AIS_InteractiveObject)& anIObj, const Standard_Boolean updateviewer)
747 {
748   if(anIObj.IsNull()) return;
749   if(!myObjects.IsBound(anIObj)) return;
750
751   const Handle(AIS_GlobalStatus)& aStatus = myObjects(anIObj);
752   aStatus->SetHilightStatus (Standard_False);
753   aStatus->SetHilightStyle (Handle(Prs3d_Drawer)());
754
755   if (aStatus->GraphicStatus() == AIS_DS_Displayed)
756   {
757     unhighlightGlobal (anIObj);
758   }
759
760   if(updateviewer) myMainVwr->Update();
761 }
762
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
768 {
769   const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theObj);
770   return aStatus != NULL
771       && (*aStatus)->IsHilighted();
772 }
773
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
779 {
780   if (theOwner.IsNull() || !theOwner->HasSelectable())
781     return Standard_False;
782
783   const Handle(AIS_InteractiveObject) anObj =
784     Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
785
786   if (anObj->GlobalSelOwner() == theOwner)
787   {
788     if (!myObjects.IsBound (anObj))
789       return Standard_False;
790
791     return myObjects (anObj)->IsHilighted();
792   }
793
794   const Handle(Prs3d_Drawer)& aStyle = getSelStyle (anObj, theOwner);
795   const Standard_Integer aHiMode = getHilightMode (anObj, aStyle, -1);
796   return theOwner->IsHilighted (myMainPM, aHiMode);
797 }
798
799 //=======================================================================
800 //function : HighlightStyle
801 //purpose  :
802 //=======================================================================
803 Standard_Boolean AIS_InteractiveContext::HighlightStyle (const Handle(AIS_InteractiveObject)& theObj,
804                                                          Handle(Prs3d_Drawer)& theStyle) const
805 {
806   const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theObj);
807   if (aStatus != NULL
808    && (*aStatus)->IsHilighted())
809   {
810     theStyle = (*aStatus)->HilightStyle();
811     return Standard_True;
812   }
813
814   theStyle.Nullify();
815   return Standard_False;
816 }
817
818 //=======================================================================
819 //function : HighlightStyle
820 //purpose  :
821 //=======================================================================
822 Standard_Boolean AIS_InteractiveContext::HighlightStyle (const Handle(SelectMgr_EntityOwner)& theOwner,
823                                                          Handle(Prs3d_Drawer)& theStyle) const
824 {
825   if (theOwner.IsNull() || !theOwner->HasSelectable())
826     return Standard_False;
827
828   if (IsHilighted (theOwner))
829   {
830     const Handle(AIS_InteractiveObject) anObj =
831       Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
832     if (anObj->GlobalSelOwner() == theOwner)
833     {
834       theStyle = myObjects (anObj)->HilightStyle();
835     }
836     else
837     {
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);
843     }
844     return Standard_True;
845   }
846   else
847   {
848     theStyle.Nullify();
849     return Standard_False;
850   }
851 }
852
853 //=======================================================================
854 //function : IsDisplayed
855 //purpose  : 
856 //=======================================================================
857
858 Standard_Boolean AIS_InteractiveContext::IsDisplayed(const Handle(AIS_InteractiveObject)& theObj) const 
859 {
860   if(theObj.IsNull()) return Standard_False;
861
862   const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theObj);
863   return aStatus != NULL
864     && (*aStatus)->GraphicStatus() == AIS_DS_Displayed; 
865 }
866
867 //=======================================================================
868 //function : IsDisplayed
869 //purpose  :
870 //=======================================================================
871 Standard_Boolean AIS_InteractiveContext::IsDisplayed (const Handle(AIS_InteractiveObject)& theIObj,
872                                                       const Standard_Integer               theMode) const
873 {
874   if (theIObj.IsNull())
875   {
876     return Standard_False;
877   }
878
879   const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
880   return aStatus != NULL
881       && (*aStatus)->GraphicStatus() == AIS_DS_Displayed
882       && (*aStatus)->DisplayMode() == theMode;
883 }
884
885 //=======================================================================
886 //function : DisplayPriority
887 //purpose  :
888 //=======================================================================
889 Standard_Integer AIS_InteractiveContext::DisplayPriority (const Handle(AIS_InteractiveObject)& theIObj) const
890 {
891   if (theIObj.IsNull())
892   {
893     return -1;
894   }
895
896   const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
897   if (aStatus != NULL
898    && ((*aStatus)->GraphicStatus() == AIS_DS_Displayed
899     || (*aStatus)->GraphicStatus() == AIS_DS_Erased))
900   {
901     Standard_Integer aDispMode = theIObj->HasDisplayMode()
902                                ? theIObj->DisplayMode()
903                                : (theIObj->AcceptDisplayMode (myDefaultDrawer->DisplayMode())
904                                 ? myDefaultDrawer->DisplayMode()
905                                 : 0);
906     return myMainPM->DisplayPriority (theIObj, aDispMode);
907   }
908   return 0;
909 }
910
911 //=======================================================================
912 //function : SetDisplayPriority
913 //purpose  :
914 //=======================================================================
915 void AIS_InteractiveContext::SetDisplayPriority (const Handle(AIS_InteractiveObject)& theIObj,
916                                                  const Standard_Integer               thePriority)
917 {
918   if (theIObj.IsNull())
919   {
920     return;
921   }
922
923   setContextToObject (theIObj);
924   const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
925   if (aStatus != NULL
926    && ((*aStatus)->GraphicStatus() == AIS_DS_Displayed
927     || (*aStatus)->GraphicStatus() == AIS_DS_Erased))
928   {
929     Standard_Integer aDisplayMode = theIObj->HasDisplayMode()
930                                   ? theIObj->DisplayMode()
931                                   : (theIObj->AcceptDisplayMode (myDefaultDrawer->DisplayMode())
932                                     ? myDefaultDrawer->DisplayMode()
933                                     : 0);
934     myMainPM->SetDisplayPriority (theIObj, aDisplayMode, thePriority);
935   }
936 }
937
938 //=======================================================================
939 //function : Redisplay
940 //purpose  :
941 //=======================================================================
942 void AIS_InteractiveContext::Redisplay (const Handle(AIS_InteractiveObject)& theIObj,
943                                         const Standard_Boolean               theToUpdateViewer,
944                                         const Standard_Boolean               theAllModes)
945 {
946   RecomputePrsOnly (theIObj, theToUpdateViewer, theAllModes);
947   RecomputeSelectionOnly (theIObj);
948 }
949
950 //=======================================================================
951 //function : Redisplay
952 //purpose  :
953 //=======================================================================
954 void AIS_InteractiveContext::Redisplay (const AIS_KindOfInteractive theKOI,
955                                         const Standard_Integer    /*theSign*/,
956                                         const Standard_Boolean      theToUpdateViewer)
957 {
958   Standard_Boolean isRedisplayed = Standard_False;
959   for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
960   {
961     Handle(AIS_InteractiveObject) anObj = anObjIter.Key();
962     if (anObj->Type() != theKOI)
963     {
964       continue;
965     }
966
967     Redisplay (anObj, Standard_False);
968     isRedisplayed = anObjIter.Value()->GraphicStatus() == AIS_DS_Displayed
969                  || isRedisplayed;
970   }
971
972   if (theToUpdateViewer
973    && isRedisplayed)
974   {
975     myMainVwr->Update();
976   }
977 }
978
979 //=======================================================================
980 //function : RecomputePrsOnly
981 //purpose  :
982 //=======================================================================
983 void AIS_InteractiveContext::RecomputePrsOnly (const Handle(AIS_InteractiveObject)& theIObj,
984                                                const Standard_Boolean               theToUpdateViewer,
985                                                const Standard_Boolean               theAllModes)
986 {
987   if (theIObj.IsNull())
988   {
989     return;
990   }
991
992   theIObj->SetToUpdate();
993   theIObj->UpdatePresentations (theAllModes);
994   if (!theToUpdateViewer)
995   {
996     return;
997   }
998
999   const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
1000   if (aStatus != NULL
1001    && (*aStatus)->GraphicStatus() == AIS_DS_Displayed)
1002   {
1003     myMainVwr->Update();
1004   }
1005 }
1006 //=======================================================================
1007 //function : RecomputeSelectionOnly
1008 //purpose  : 
1009 //=======================================================================
1010 void AIS_InteractiveContext::RecomputeSelectionOnly (const Handle(AIS_InteractiveObject)& theIO)
1011 {
1012   if (theIO.IsNull())
1013   {
1014     return;
1015   }
1016
1017   mgrSelector->RecomputeSelection (theIO);
1018
1019   const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIO);
1020   if (aStatus == NULL
1021   || (*aStatus)->GraphicStatus() != AIS_DS_Displayed)
1022   {
1023     return;
1024   }
1025
1026   TColStd_ListOfInteger aModes;
1027   ActivatedModes (theIO, aModes);
1028   TColStd_ListIteratorOfListOfInteger aModesIter (aModes);
1029   for (; aModesIter.More(); aModesIter.Next())
1030   {
1031     mgrSelector->Activate (theIO, aModesIter.Value());
1032   }
1033 }
1034
1035 //=======================================================================
1036 //function : Update
1037 //purpose  :
1038 //=======================================================================
1039 void AIS_InteractiveContext::Update (const Handle(AIS_InteractiveObject)& theIObj,
1040                                      const Standard_Boolean               theUpdateViewer)
1041 {
1042   if (theIObj.IsNull())
1043   {
1044     return;
1045   }
1046
1047   theIObj->UpdatePresentations();
1048   mgrSelector->Update(theIObj);
1049
1050   if (theUpdateViewer)
1051   {
1052     const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
1053     if (aStatus != NULL
1054      && (*aStatus)->GraphicStatus() == AIS_DS_Displayed)
1055     {
1056       myMainVwr->Update();
1057     }
1058   }
1059 }
1060
1061 //=======================================================================
1062 //function : SetLocation
1063 //purpose  :
1064 //=======================================================================
1065 void AIS_InteractiveContext::SetLocation (const Handle(AIS_InteractiveObject)& theIObj,
1066                                           const TopLoc_Location&               theLoc)
1067 {
1068   if (theIObj.IsNull())
1069   {
1070     return;
1071   }
1072
1073   if (theIObj->HasTransformation()
1074    && theLoc.IsIdentity())
1075   {
1076     theIObj->ResetTransformation();
1077     mgrSelector->Update (theIObj, Standard_False);
1078     return;
1079   }
1080   else if (theLoc.IsIdentity())
1081   {
1082     return;
1083   }
1084
1085   // first reset the previous location to properly clean everything...
1086   if (theIObj->HasTransformation())
1087   {
1088     theIObj->ResetTransformation();
1089   }
1090
1091   theIObj->SetLocalTransformation (theLoc.Transformation());
1092
1093   mgrSelector->Update (theIObj, Standard_False);
1094
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))
1098   {
1099     const Standard_Integer aHiMod = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
1100     myLastPicked->UpdateHighlightTrsf (myMainVwr,
1101                                        myMainPM,
1102                                        aHiMod);
1103   }
1104 }
1105
1106 //=======================================================================
1107 //function : ResetLocation
1108 //purpose  :
1109 //=======================================================================
1110 void AIS_InteractiveContext::ResetLocation (const Handle(AIS_InteractiveObject)& theIObj)
1111 {
1112   if (theIObj.IsNull())
1113   {
1114     return;
1115   }
1116
1117   theIObj->ResetTransformation();
1118   mgrSelector->Update (theIObj, Standard_False);
1119 }
1120
1121 //=======================================================================
1122 //function : HasLocation
1123 //purpose  :
1124 //=======================================================================
1125 Standard_Boolean AIS_InteractiveContext::HasLocation (const Handle(AIS_InteractiveObject)& theIObj) const
1126 {
1127   return !theIObj.IsNull()
1128        && theIObj->HasTransformation();
1129 }
1130
1131 //=======================================================================
1132 //function : Location
1133 //purpose  :
1134 //=======================================================================
1135 TopLoc_Location AIS_InteractiveContext::Location (const Handle(AIS_InteractiveObject)& theIObj) const
1136 {
1137   return theIObj->Transformation();
1138 }
1139
1140 //=======================================================================
1141 //function : SetDeviationCoefficient
1142 //purpose  :
1143 //=======================================================================
1144 void AIS_InteractiveContext::SetDeviationCoefficient (const Standard_Real theCoefficient)
1145 {
1146   myDefaultDrawer->SetDeviationCoefficient (theCoefficient);
1147 }
1148
1149 //=======================================================================
1150 //function : SetDeviationAngle
1151 //purpose  :
1152 //=======================================================================
1153 void AIS_InteractiveContext::SetDeviationAngle (const Standard_Real theAngle)
1154 {
1155   myDefaultDrawer->SetDeviationAngle (theAngle);
1156 }
1157
1158 //=======================================================================
1159 //function : DeviationAngle
1160 //purpose  : Gets  deviationAngle
1161 //=======================================================================
1162 Standard_Real AIS_InteractiveContext::DeviationAngle() const
1163 {
1164   return myDefaultDrawer->DeviationAngle();
1165 }
1166
1167 //=======================================================================
1168 //function : DeviationCoefficient
1169 //purpose  :
1170 //=======================================================================
1171 Standard_Real AIS_InteractiveContext::DeviationCoefficient() const
1172 {
1173   return myDefaultDrawer->DeviationCoefficient();
1174 }
1175
1176 //=======================================================================
1177 //function : SetDisplayMode
1178 //purpose  :
1179 //=======================================================================
1180 void AIS_InteractiveContext::SetDisplayMode(const Standard_Integer theMode,
1181                                             const Standard_Boolean theToUpdateViewer)
1182 {
1183   if (theMode == myDefaultDrawer->DisplayMode())
1184   {
1185     return;
1186   }
1187
1188   for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
1189   {
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));
1194     
1195     if (!toProcess
1196      ||  anObj->HasDisplayMode()
1197      || !anObj->AcceptDisplayMode (theMode))
1198     {
1199       continue;
1200     }
1201
1202     Handle(AIS_GlobalStatus) aStatus = anObjIter.Value();
1203     aStatus->SetDisplayMode (theMode);
1204
1205     if (aStatus->GraphicStatus() == AIS_DS_Displayed)
1206     {
1207       myMainPM->Display (anObj, theMode);
1208       if (!myLastPicked.IsNull() && myLastPicked->IsSameSelectable (anObj))
1209       {
1210         myMainPM->BeginImmediateDraw();
1211         unhighlightGlobal (anObj);
1212         myMainPM->EndImmediateDraw (myMainVwr);
1213       }
1214       if (aStatus->IsSubIntensityOn())
1215       {
1216         highlightWithSubintensity (anObj, theMode);
1217       }
1218       myMainPM->SetVisibility (anObj, myDefaultDrawer->DisplayMode(), Standard_False);
1219     }
1220   }
1221
1222   myDefaultDrawer->SetDisplayMode (theMode);
1223   if (theToUpdateViewer)
1224   {
1225     myMainVwr->Update();
1226   }
1227 }
1228
1229 //=======================================================================
1230 //function : SetDisplayMode
1231 //purpose  :
1232 //=======================================================================
1233 void AIS_InteractiveContext::SetDisplayMode (const Handle(AIS_InteractiveObject)& theIObj,
1234                                              const Standard_Integer               theMode,
1235                                              const Standard_Boolean               theToUpdateViewer)
1236 {
1237   setContextToObject (theIObj);
1238   if (!myObjects.IsBound (theIObj))
1239   {
1240     theIObj->SetDisplayMode (theMode);
1241     return;
1242   }
1243   else if (!theIObj->AcceptDisplayMode (theMode))
1244   {
1245     return;
1246   }
1247
1248   Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
1249   if (aStatus->GraphicStatus() != AIS_DS_Displayed)
1250   {
1251     aStatus->SetDisplayMode (theMode);
1252     theIObj->SetDisplayMode (theMode);
1253     return;
1254   }
1255
1256   // erase presentations for all display modes different from <aMode>
1257   const Standard_Integer anOldMode = aStatus->DisplayMode();
1258   if (anOldMode != theMode)
1259   {
1260     if (myMainPM->IsHighlighted (theIObj, anOldMode))
1261     {
1262       unhighlightGlobal (theIObj);
1263     }
1264     myMainPM->SetVisibility (theIObj, anOldMode, Standard_False);
1265   }
1266
1267   aStatus->SetDisplayMode (theMode);
1268
1269   myMainPM->Display (theIObj, theMode);
1270   if (aStatus->IsHilighted())
1271   {
1272     highlightGlobal (theIObj, getSelStyle (theIObj, theIObj->GlobalSelOwner()), theMode);
1273   }
1274   if (aStatus->IsSubIntensityOn())
1275   {
1276     highlightWithSubintensity (theIObj, theMode);
1277   }
1278
1279   if (theToUpdateViewer)
1280   {
1281     myMainVwr->Update();
1282   }
1283   theIObj->SetDisplayMode (theMode);
1284 }
1285
1286 //=======================================================================
1287 //function : UnsetDisplayMode
1288 //purpose  :
1289 //=======================================================================
1290 void AIS_InteractiveContext::UnsetDisplayMode (const Handle(AIS_InteractiveObject)& theIObj,
1291                                                const Standard_Boolean               theToUpdateViewer)
1292 {
1293   if (theIObj.IsNull()
1294   || !theIObj->HasDisplayMode())
1295   {
1296     return;
1297   }
1298
1299   if (!myObjects.IsBound (theIObj))
1300   {
1301     theIObj->UnsetDisplayMode();
1302     return;
1303   }
1304
1305   const Standard_Integer anOldMode = theIObj->DisplayMode();
1306   if (myDefaultDrawer->DisplayMode() == anOldMode)
1307   {
1308     return;
1309   }
1310
1311   const Handle(AIS_GlobalStatus)& aStatus = myObjects (theIObj);
1312   aStatus->SetDisplayMode (myDefaultDrawer->DisplayMode());
1313
1314   if (aStatus->GraphicStatus() == AIS_DS_Displayed)
1315   {
1316     if (myMainPM->IsHighlighted (theIObj, anOldMode))
1317     {
1318       unhighlightGlobal (theIObj);
1319     }
1320     myMainPM->SetVisibility (theIObj, anOldMode, Standard_False);
1321     myMainPM->Display (theIObj, myDefaultDrawer->DisplayMode());
1322     if (aStatus->IsHilighted())
1323     {
1324       highlightSelected (theIObj->GlobalSelOwner());
1325     }
1326     if (aStatus->IsSubIntensityOn())
1327     {
1328       highlightWithSubintensity (theIObj, myDefaultDrawer->DisplayMode());
1329     }
1330
1331     if (theToUpdateViewer)
1332     {
1333       myMainVwr->Update();
1334     }
1335   }
1336
1337   theIObj->UnsetDisplayMode();
1338 }
1339
1340 //=======================================================================
1341 //function : SetCurrentFacingModel
1342 //purpose  :
1343 //=======================================================================
1344 void AIS_InteractiveContext::SetCurrentFacingModel (const Handle(AIS_InteractiveObject)& theIObj,
1345                                                     const Aspect_TypeOfFacingModel       theModel)
1346 {
1347   if (!theIObj.IsNull())
1348   {
1349     theIObj->SetCurrentFacingModel (theModel);
1350   }
1351 }
1352
1353 //=======================================================================
1354 //function : SetColor
1355 //purpose  :
1356 //=======================================================================
1357 void AIS_InteractiveContext::SetColor (const Handle(AIS_InteractiveObject)& theIObj,
1358                                        const Quantity_Color&                theColor,
1359                                        const Standard_Boolean               theToUpdateViewer)
1360 {
1361   if (theIObj.IsNull())
1362   {
1363     return;
1364   }
1365
1366   setContextToObject (theIObj);
1367   theIObj->SetColor (theColor);
1368   theIObj->UpdatePresentations();
1369   if (theToUpdateViewer)
1370   {
1371     UpdateCurrentViewer();
1372   }
1373 }
1374
1375 //=======================================================================
1376 //function : SetIsoOnTriangulation
1377 //purpose  :
1378 //=======================================================================
1379 void AIS_InteractiveContext::IsoOnTriangulation (const Standard_Boolean theIsEnabled,
1380                                                  const Handle(AIS_InteractiveObject)& theObject)
1381 {
1382   if (theObject.IsNull())
1383   {
1384     return;
1385   }
1386
1387   theObject->SetIsoOnTriangulation (theIsEnabled);
1388 }
1389
1390 //=======================================================================
1391 //function : SetDeviationCoefficient
1392 //purpose  :
1393 //=======================================================================
1394 void AIS_InteractiveContext::SetDeviationCoefficient (const Handle(AIS_InteractiveObject)& theIObj,
1395                                                       const Standard_Real                  theCoefficient,
1396                                                       const Standard_Boolean               theToUpdateViewer)
1397 {
1398   if (theIObj.IsNull())
1399   {
1400     return;
1401   }
1402
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)
1407   {
1408     return;
1409   }
1410   else if (theIObj->Signature() != 0)
1411   {
1412     return;
1413   }
1414
1415   Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1416   aShape->SetOwnDeviationCoefficient (theCoefficient);
1417   aShape->UpdatePresentations();
1418   if (theToUpdateViewer)
1419   {
1420     UpdateCurrentViewer();
1421   }
1422 }
1423
1424 //=======================================================================
1425 //function : SetDeviationAngle
1426 //purpose  :
1427 //=======================================================================
1428 void AIS_InteractiveContext::SetDeviationAngle (const Handle(AIS_InteractiveObject)& theIObj,
1429                                                 const Standard_Real                  theAngle,
1430                                                 const Standard_Boolean               theToUpdateViewer)
1431 {
1432   if (theIObj.IsNull())
1433   {
1434     return;
1435   }
1436
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)
1440   {
1441     return;
1442   }
1443   else if (theIObj->Signature() != 0)
1444   {
1445     return;
1446   }
1447
1448   Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1449   aShape->SetOwnDeviationAngle (theAngle);
1450   aShape->UpdatePresentations();
1451   if (theToUpdateViewer)
1452   {
1453     UpdateCurrentViewer();
1454   }
1455 }
1456
1457 //=======================================================================
1458 //function : SetAngleAndDeviation
1459 //purpose  :
1460 //=======================================================================
1461 void AIS_InteractiveContext::SetAngleAndDeviation (const Handle(AIS_InteractiveObject)& theIObj,
1462                                                    const Standard_Real                  theAngle,
1463                                                    const Standard_Boolean               theToUpdateViewer)
1464 {
1465   if (theIObj.IsNull())
1466   {
1467     return;
1468   }
1469
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)
1473   {
1474     return;
1475   }
1476   if (theIObj->Signature() != 0)
1477   {
1478     return;
1479   }
1480
1481   Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1482   aShape->SetAngleAndDeviation (theAngle);
1483   aShape->UpdatePresentations();
1484   if (theToUpdateViewer)
1485   {
1486     UpdateCurrentViewer();
1487   }
1488 }
1489
1490 //=======================================================================
1491 //function : UnsetColor
1492 //purpose  :
1493 //=======================================================================
1494 void AIS_InteractiveContext::UnsetColor (const Handle(AIS_InteractiveObject)& theIObj,
1495                                          const Standard_Boolean               theToUpdateViewer)
1496 {
1497   if (theIObj.IsNull())
1498   {
1499     return;
1500   }
1501
1502   theIObj->UnsetColor();
1503   theIObj->UpdatePresentations();
1504   if (theToUpdateViewer)
1505   {
1506     UpdateCurrentViewer();
1507   }
1508 }
1509
1510 //=======================================================================
1511 //function : HasColor
1512 //purpose  :
1513 //=======================================================================
1514 Standard_Boolean AIS_InteractiveContext::HasColor (const Handle(AIS_InteractiveObject)& theIObj) const
1515 {
1516   return theIObj->HasColor();
1517 }
1518
1519 //=======================================================================
1520 //function : Color
1521 //purpose  :
1522 //=======================================================================
1523 void AIS_InteractiveContext::Color (const Handle(AIS_InteractiveObject)& theIObj,
1524                                     Quantity_Color&                      theColor) const
1525 {
1526   theIObj->Color (theColor);
1527 }
1528
1529 //=======================================================================
1530 //function : Width
1531 //purpose  :
1532 //=======================================================================
1533 Standard_Real AIS_InteractiveContext::Width (const Handle(AIS_InteractiveObject)& theIObj) const
1534 {
1535   return theIObj->Width();
1536 }
1537
1538 //=======================================================================
1539 //function : SetWidth
1540 //purpose  :
1541 //=======================================================================
1542 void AIS_InteractiveContext::SetWidth (const Handle(AIS_InteractiveObject)& theIObj,
1543                                        const Standard_Real                  theWidth,
1544                                        const Standard_Boolean               theToUpdateViewer)
1545 {
1546   if (theIObj.IsNull())
1547   {
1548     return;
1549   }
1550
1551   setContextToObject (theIObj);
1552   theIObj->SetWidth (theWidth);
1553   theIObj->UpdatePresentations();
1554   if (!myLastPicked.IsNull() && myLastPicked->IsSameSelectable (theIObj))
1555   {
1556     if (myLastPicked->IsAutoHilight())
1557     {
1558       const Standard_Integer aHiMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
1559       myLastPicked->HilightWithColor (myMainPM,
1560                                       myLastPicked->IsSelected() ? getSelStyle (theIObj, myLastPicked) : getHiStyle (theIObj, myLastPicked),
1561                                       aHiMode);
1562     }
1563     else
1564     {
1565       theIObj->HilightOwnerWithColor (myMainPM,
1566                                       myLastPicked->IsSelected() ? getSelStyle (theIObj, myLastPicked) : getHiStyle (theIObj, myLastPicked),
1567                                       myLastPicked);
1568     }
1569   }
1570   if (theToUpdateViewer)
1571   {
1572     UpdateCurrentViewer();
1573   }
1574 }
1575
1576 //=======================================================================
1577 //function : UnsetWidth
1578 //purpose  :
1579 //=======================================================================
1580 void AIS_InteractiveContext::UnsetWidth (const Handle(AIS_InteractiveObject)& theIObj,
1581                                          const Standard_Boolean               theToUpdateViewer)
1582 {
1583   if (theIObj.IsNull())
1584   {
1585     return;
1586   }
1587
1588   theIObj->UnsetWidth();
1589   theIObj->UpdatePresentations();
1590   if (theToUpdateViewer)
1591   {
1592     UpdateCurrentViewer();
1593   }
1594 }
1595
1596 //=======================================================================
1597 //function : SetMaterial
1598 //purpose  :
1599 //=======================================================================
1600 void AIS_InteractiveContext::SetMaterial (const Handle(AIS_InteractiveObject)& theIObj,
1601                                           const Graphic3d_MaterialAspect&      theMaterial,
1602                                           const Standard_Boolean               theToUpdateViewer)
1603 {
1604   if (theIObj.IsNull())
1605   {
1606     return;
1607   }
1608
1609   setContextToObject (theIObj);
1610   theIObj->SetMaterial (theMaterial);
1611   theIObj->UpdatePresentations();
1612   if (theToUpdateViewer)
1613   {
1614     UpdateCurrentViewer();
1615   }
1616 }
1617
1618 //=======================================================================
1619 //function : UnsetMaterial
1620 //purpose  :
1621 //=======================================================================
1622 void AIS_InteractiveContext::UnsetMaterial (const Handle(AIS_InteractiveObject)& theIObj,
1623                                             const Standard_Boolean               theToUpdateViewer)
1624 {
1625   if (theIObj.IsNull())
1626   {
1627     return;
1628   }
1629   theIObj->UnsetMaterial();
1630   theIObj->UpdatePresentations();
1631   if (theToUpdateViewer)
1632   {
1633     UpdateCurrentViewer();
1634   }
1635 }
1636
1637 //=======================================================================
1638 //function : SetTransparency
1639 //purpose  :
1640 //=======================================================================
1641 void AIS_InteractiveContext::SetTransparency (const Handle(AIS_InteractiveObject)& theIObj,
1642                                               const Standard_Real                  theValue,
1643                                               const Standard_Boolean               theToUpdateViewer)
1644 {
1645   if (theIObj.IsNull())
1646   {
1647     return;
1648   }
1649
1650   setContextToObject (theIObj);
1651   if (!theIObj->IsTransparent()
1652     && theValue <= 0.005)
1653   {
1654     return;
1655   }
1656
1657   if (theValue <= 0.005)
1658   {
1659     UnsetTransparency (theIObj, theToUpdateViewer);
1660     return;
1661   }
1662
1663   theIObj->SetTransparency (theValue);
1664   theIObj->UpdatePresentations();
1665   if (theToUpdateViewer)
1666   {
1667     UpdateCurrentViewer();
1668   }
1669 }
1670
1671 //=======================================================================
1672 //function : UnsetTransparency
1673 //purpose  :
1674 //=======================================================================
1675 void AIS_InteractiveContext::UnsetTransparency (const Handle(AIS_InteractiveObject)& theIObj,
1676                                                 const Standard_Boolean               theToUpdateViewer)
1677 {
1678   if (theIObj.IsNull())
1679   {
1680     return;
1681   }
1682
1683   theIObj->UnsetTransparency();
1684   theIObj->UpdatePresentations();
1685   if (theToUpdateViewer)
1686   {
1687     UpdateCurrentViewer();
1688   }
1689 }
1690
1691 //=======================================================================
1692 //function : SetSelectedAspect
1693 //purpose  :
1694 //=======================================================================
1695 void AIS_InteractiveContext::SetSelectedAspect (const Handle(Prs3d_BasicAspect)& theAspect,
1696                                                 const Standard_Boolean           theToUpdateViewer)
1697 {
1698   Standard_DISABLE_DEPRECATION_WARNINGS
1699   Standard_Boolean isFound = Standard_False;
1700   for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
1701   {
1702     isFound = Standard_True;
1703     Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (aSelIter.Value()->Selectable());
1704     anObj->SetAspect (theAspect);
1705   }
1706   Standard_ENABLE_DEPRECATION_WARNINGS
1707
1708   if (isFound && theToUpdateViewer)
1709   {
1710     myMainVwr->Update();
1711   }
1712 }
1713
1714 //=======================================================================
1715 //function : SetLocalAttributes
1716 //purpose  :
1717 //=======================================================================
1718 void AIS_InteractiveContext::SetLocalAttributes (const Handle(AIS_InteractiveObject)& theIObj,
1719                                                  const Handle(Prs3d_Drawer)&          theDrawer,
1720                                                  const Standard_Boolean               theToUpdateViewer)
1721 {
1722   if (theIObj.IsNull())
1723   {
1724     return;
1725   }
1726
1727   setContextToObject (theIObj);
1728   theIObj->SetAttributes (theDrawer);
1729   Update (theIObj, theToUpdateViewer);
1730 }
1731
1732 //=======================================================================
1733 //function : UnsetLocalAttributes
1734 //purpose  :
1735 //=======================================================================
1736 void AIS_InteractiveContext::UnsetLocalAttributes (const Handle(AIS_InteractiveObject)& theIObj,
1737                                                    const Standard_Boolean               theToUpdateViewer)
1738 {
1739   if (theIObj.IsNull())
1740   {
1741     return;
1742   }
1743
1744   setContextToObject (theIObj);
1745   theIObj->UnsetAttributes();
1746   Update (theIObj, theToUpdateViewer);
1747 }
1748
1749 //=======================================================================
1750 //function : Status
1751 //purpose  :
1752 //=======================================================================
1753 void AIS_InteractiveContext::Status (const Handle(AIS_InteractiveObject)& theIObj,
1754                                      TCollection_ExtendedString&          theStatus) const
1755 {
1756   theStatus = "";
1757   if (theIObj.IsNull()
1758   || !myObjects.IsBound (theIObj))
1759   {
1760     return;
1761   }
1762
1763   theStatus += "\t ____________________________________________";
1764   theStatus += "\t| Known at Neutral Point:\n\tDisplayStatus:";
1765   const Handle(AIS_GlobalStatus)& aStatus = myObjects (theIObj);
1766   switch (aStatus->GraphicStatus())
1767   {
1768     case AIS_DS_Displayed:
1769     {
1770       theStatus += "\t| -->Displayed\n";
1771       break;
1772     }
1773     case AIS_DS_Erased:
1774     {
1775       theStatus += "\t| -->Erased\n";
1776       break;
1777     }
1778     default:
1779       break;
1780   }
1781
1782   theStatus += "\t| Active Display Modes in the MainViewer :\n";
1783   theStatus += "\t|\t Mode ";
1784   theStatus += TCollection_AsciiString (aStatus->DisplayMode());
1785   theStatus += "\n";
1786
1787   if (IsSelected(theIObj)) theStatus +="\t| Selected\n";
1788
1789   theStatus += "\t| Active Selection Modes in the MainViewer :\n";
1790   for (TColStd_ListIteratorOfListOfInteger aSelModeIter (aStatus->SelectionModes()); aSelModeIter.More(); aSelModeIter.Next())
1791   {
1792     theStatus += "\t\t Mode ";
1793     theStatus += TCollection_AsciiString (aSelModeIter.Value());
1794     theStatus += "\n";
1795   }
1796   theStatus += "\t ____________________________________________";
1797 }
1798
1799 //=======================================================================
1800 //function : GetDefModes
1801 //purpose  :
1802 //=======================================================================
1803 void AIS_InteractiveContext::GetDefModes (const Handle(AIS_InteractiveObject)& theIObj,
1804                                           Standard_Integer&                    theDispMode,
1805                                           Standard_Integer&                    theHiMode,
1806                                           Standard_Integer&                    theSelMode) const
1807 {
1808   if (theIObj.IsNull())
1809   {
1810     return;
1811   }
1812
1813   theDispMode = theIObj->HasDisplayMode()
1814               ? theIObj->DisplayMode()
1815               : (theIObj->AcceptDisplayMode (myDefaultDrawer->DisplayMode())
1816                ? myDefaultDrawer->DisplayMode()
1817                : 0);
1818   theHiMode  = theIObj->HasHilightMode()   ? theIObj->HilightMode()   : theDispMode;
1819   theSelMode = theIObj->GlobalSelectionMode();
1820 }
1821
1822 //=======================================================================
1823 //function : EraseGlobal
1824 //purpose  :
1825 //=======================================================================
1826 void AIS_InteractiveContext::EraseGlobal (const Handle(AIS_InteractiveObject)& theIObj,
1827                                           const Standard_Boolean               theToUpdateviewer)
1828 {
1829   Handle(AIS_GlobalStatus) aStatus;
1830   if (theIObj.IsNull()
1831   || !myObjects.Find (theIObj, aStatus)
1832   ||  aStatus->GraphicStatus() == AIS_DS_Erased)
1833   {
1834     return;
1835   }
1836
1837   const Standard_Integer aDispMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
1838   unselectOwners (theIObj);
1839   myMainPM->SetVisibility (theIObj, aStatus->DisplayMode(), Standard_False);
1840
1841   if (!myLastPicked.IsNull()
1842     && myLastPicked->IsSameSelectable (theIObj))
1843   {
1844     clearDynamicHighlight();
1845   }
1846
1847   // make sure highlighting presentations are properly erased
1848   theIObj->ErasePresentations (false);
1849
1850   if (IsSelected (theIObj)
1851    && aStatus->DisplayMode() != aDispMode)
1852   {
1853     myMainPM->SetVisibility (theIObj, aDispMode, Standard_False);
1854   }
1855
1856   for (TColStd_ListIteratorOfListOfInteger aSelModeIter (aStatus->SelectionModes()); aSelModeIter.More(); aSelModeIter.Next())
1857   {
1858     mgrSelector->Deactivate (theIObj, aSelModeIter.Value());
1859   }
1860   aStatus->ClearSelectionModes();
1861   aStatus->SetGraphicStatus (AIS_DS_Erased);
1862
1863   if (theToUpdateviewer)
1864   {
1865     myMainVwr->Update();
1866   }
1867 }
1868
1869 //=======================================================================
1870 //function : unselectOwners
1871 //purpose  :
1872 //=======================================================================
1873 void AIS_InteractiveContext::unselectOwners (const Handle(AIS_InteractiveObject)& theObject)
1874 {
1875   SelectMgr_SequenceOfOwner aSeq;
1876   for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
1877   {
1878     if (aSelIter.Value()->IsSameSelectable (theObject))
1879     {
1880       aSeq.Append (aSelIter.Value());
1881     }
1882   }
1883   for (SelectMgr_SequenceOfOwner::Iterator aDelIter (aSeq); aDelIter.More(); aDelIter.Next())
1884   {
1885     AddOrRemoveSelected (aDelIter.Value(), Standard_False);
1886   }
1887 }
1888
1889 //=======================================================================
1890 //function : ClearGlobal
1891 //purpose  :
1892 //=======================================================================
1893 void AIS_InteractiveContext::ClearGlobal (const Handle(AIS_InteractiveObject)& theIObj,
1894                                           const Standard_Boolean               theToUpdateviewer)
1895 {
1896   Handle(AIS_GlobalStatus) aStatus;
1897   if (theIObj.IsNull()
1898   || !myObjects.Find (theIObj, aStatus))
1899   {
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);
1904     return;
1905   }
1906
1907   unselectOwners (theIObj);
1908
1909   myMainPM->Erase (theIObj, -1);
1910   theIObj->ErasePresentations (true); // make sure highlighting presentations are properly erased
1911
1912   // Object removes from Detected sequence
1913   Standard_DISABLE_DEPRECATION_WARNINGS
1914   for (Standard_Integer aDetIter = myDetectedSeq.Lower(); aDetIter <= myDetectedSeq.Upper();)
1915   {
1916     Handle(SelectMgr_EntityOwner) aPicked = myMainSel->Picked (myDetectedSeq (aDetIter));
1917     Handle(AIS_InteractiveObject) anObj;
1918     if (!aPicked.IsNull())
1919     {
1920       anObj = Handle(AIS_InteractiveObject)::DownCast (aPicked->Selectable());
1921     }
1922
1923     if (!anObj.IsNull()
1924       && anObj == theIObj)
1925     {
1926       myDetectedSeq.Remove (aDetIter);
1927       if (myCurDetected == aDetIter)
1928       {
1929         myCurDetected = Min (myDetectedSeq.Upper(), aDetIter);
1930       }
1931       if (myCurHighlighted == aDetIter)
1932       {
1933         myCurHighlighted = 0;
1934       }
1935     }
1936     else
1937     {
1938       aDetIter++;
1939     }
1940   }
1941   Standard_ENABLE_DEPRECATION_WARNINGS
1942
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);
1946
1947   setObjectStatus (theIObj, AIS_DS_None, -1, -1);
1948   myMainVwr->StructureManager()->UnregisterObject (theIObj);
1949
1950   for (V3d_ListOfViewIterator aDefViewIter (myMainVwr->DefinedViewIterator()); aDefViewIter.More(); aDefViewIter.Next())
1951   {
1952     aDefViewIter.Value()->View()->ChangeHiddenObjects()->Remove (theIObj.get());
1953   }
1954
1955   if (!myLastPicked.IsNull())
1956   {
1957     if (myLastPicked->IsSameSelectable (theIObj))
1958     {
1959       clearDynamicHighlight();
1960       myLastPicked.Nullify();
1961     }
1962   }
1963
1964   if (theToUpdateviewer && aStatus->GraphicStatus() == AIS_DS_Displayed)
1965   {
1966     myMainVwr->Update();
1967   }
1968 }
1969
1970 //=======================================================================
1971 //function : ClearGlobalPrs
1972 //purpose  :
1973 //=======================================================================
1974 void AIS_InteractiveContext::ClearGlobalPrs (const Handle(AIS_InteractiveObject)& theIObj,
1975                                              const Standard_Integer               theMode,
1976                                              const Standard_Boolean               theToUpdateViewer)
1977 {
1978   if (theIObj.IsNull()
1979   || !myObjects.IsBound (theIObj))
1980   {
1981     return;
1982   }
1983
1984   const Handle(AIS_GlobalStatus)& aStatus = myObjects (theIObj);
1985   if (aStatus->DisplayMode() == theMode)
1986   {
1987     const Standard_Integer aDispMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
1988     if (aDispMode == theMode
1989      && myMainPM->IsHighlighted (theIObj, theMode))
1990     {
1991       unhighlightGlobal (theIObj);
1992     }
1993
1994     myMainPM->Erase (theIObj, theMode);
1995   }
1996
1997   if (aStatus->GraphicStatus() == AIS_DS_Displayed
1998    && theToUpdateViewer)
1999   {
2000     myMainVwr->Update();
2001   }
2002 }
2003
2004 //=======================================================================
2005 //function : ClearDetected
2006 //purpose  :
2007 //=======================================================================
2008 Standard_Boolean AIS_InteractiveContext::ClearDetected (Standard_Boolean theToRedrawImmediate)
2009 {
2010   myCurDetected = 0;
2011   myCurHighlighted = 0;
2012   myDetectedSeq.Clear();
2013   Standard_Boolean toUpdate = Standard_False;
2014   if (!myLastPicked.IsNull() && myLastPicked->HasSelectable())
2015   {
2016     toUpdate = Standard_True;
2017     clearDynamicHighlight();
2018   }
2019   myLastPicked.Nullify();
2020   myMainSel->ClearPicked();
2021   if (toUpdate && theToRedrawImmediate)
2022   {
2023     myMainVwr->RedrawImmediate();
2024   }
2025   return toUpdate;
2026 }
2027
2028 //=======================================================================
2029 //function : DrawHiddenLine
2030 //purpose  :
2031 //=======================================================================
2032 Standard_Boolean AIS_InteractiveContext::DrawHiddenLine() const
2033 {
2034   return myDefaultDrawer->DrawHiddenLine();
2035 }
2036
2037 //=======================================================================
2038 //function : EnableDrawHiddenLine
2039 //purpose  :
2040 //=======================================================================
2041 void AIS_InteractiveContext::EnableDrawHiddenLine() const
2042 {
2043   myDefaultDrawer->EnableDrawHiddenLine();
2044 }
2045
2046 //=======================================================================
2047 //function : DisableDrawHiddenLine 
2048 //purpose  :
2049 //=======================================================================
2050 void AIS_InteractiveContext::DisableDrawHiddenLine() const
2051 {
2052   myDefaultDrawer->DisableDrawHiddenLine();
2053 }
2054
2055 //=======================================================================
2056 //function : HiddenLineAspect
2057 //purpose  :
2058 //=======================================================================
2059 Handle (Prs3d_LineAspect) AIS_InteractiveContext::HiddenLineAspect() const
2060 {
2061   return myDefaultDrawer->HiddenLineAspect();
2062 }
2063
2064 //=======================================================================
2065 //function : SetHiddenLineAspect
2066 //purpose  :
2067 //=======================================================================
2068 void AIS_InteractiveContext::SetHiddenLineAspect (const Handle(Prs3d_LineAspect)& theAspect) const
2069 {
2070   myDefaultDrawer->SetHiddenLineAspect (theAspect);
2071 }
2072
2073 //=======================================================================
2074 //function : SetIsoNumber
2075 //purpose  :
2076 //=======================================================================
2077 void AIS_InteractiveContext::SetIsoNumber (const Standard_Integer theNb,
2078                                            const AIS_TypeOfIso    theType)
2079 {
2080   switch (theType)
2081   {
2082     case AIS_TOI_IsoU:
2083       myDefaultDrawer->UIsoAspect()->SetNumber (theNb);
2084       break;
2085     case AIS_TOI_IsoV:
2086       myDefaultDrawer->VIsoAspect()->SetNumber (theNb);
2087       break;
2088     case AIS_TOI_Both:
2089       myDefaultDrawer->UIsoAspect()->SetNumber (theNb);
2090       myDefaultDrawer->VIsoAspect()->SetNumber (theNb);
2091       break;
2092   }
2093 }
2094
2095 //=======================================================================
2096 //function : IsoNumber
2097 //purpose  :
2098 //=======================================================================
2099 Standard_Integer AIS_InteractiveContext::IsoNumber (const AIS_TypeOfIso theType)
2100 {
2101   switch (theType)
2102   {
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()
2107                             : -1;
2108   }
2109   return 0;
2110 }
2111
2112 //=======================================================================
2113 //function : IsoOnPlane
2114 //purpose  :
2115 //=======================================================================
2116 void AIS_InteractiveContext::IsoOnPlane (const Standard_Boolean theToSwitchOn)
2117 {
2118   myDefaultDrawer->SetIsoOnPlane (theToSwitchOn);
2119 }
2120
2121 //=======================================================================
2122 //function : IsoOnPlane
2123 //purpose  :
2124 //=======================================================================
2125 Standard_Boolean AIS_InteractiveContext::IsoOnPlane() const
2126 {
2127   return myDefaultDrawer->IsoOnPlane();
2128 }
2129
2130 //=======================================================================
2131 //function : IsoOnTriangulation
2132 //purpose  :
2133 //=======================================================================
2134 void AIS_InteractiveContext::IsoOnTriangulation (const Standard_Boolean theToSwitchOn)
2135 {
2136   myDefaultDrawer->SetIsoOnTriangulation (theToSwitchOn);
2137 }
2138
2139 //=======================================================================
2140 //function : IsoOnTriangulation
2141 //purpose  :
2142 //=======================================================================
2143 Standard_Boolean AIS_InteractiveContext::IsoOnTriangulation() const
2144 {
2145   return myDefaultDrawer->IsoOnTriangulation();
2146 }
2147
2148 //=======================================================================
2149 //function : SetPixelTolerance
2150 //purpose  :
2151 //=======================================================================
2152 void AIS_InteractiveContext::SetPixelTolerance (const Standard_Integer thePrecision)
2153 {
2154   myMainSel->SetPixelTolerance (thePrecision);
2155 }
2156
2157 //=======================================================================
2158 //function : PixelTolerance
2159 //purpose  :
2160 //=======================================================================
2161 Standard_Integer AIS_InteractiveContext::PixelTolerance() const
2162 {
2163   return myMainSel->PixelTolerance();
2164 }
2165
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)
2173 {
2174   mgrSelector->SetSelectionSensitivity (theObject, theMode, theNewSensitivity);
2175 }
2176
2177 //=======================================================================
2178 //function : InitAttributes
2179 //purpose  :
2180 //=======================================================================
2181 void AIS_InteractiveContext::InitAttributes()
2182 {
2183   Graphic3d_MaterialAspect aMat (Graphic3d_NOM_BRASS);
2184   myDefaultDrawer->ShadingAspect()->SetMaterial (aMat);
2185
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);
2191
2192   // tolerance to 2 pixels...
2193   SetPixelTolerance (2);
2194
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);
2203
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);
2208 }
2209
2210 //=======================================================================
2211 //function : TrihedronSize
2212 //purpose  :
2213 //=======================================================================
2214 Standard_Real AIS_InteractiveContext::TrihedronSize() const
2215 {
2216   return myDefaultDrawer->DatumAspect()->AxisLength(Prs3d_DP_XAxis);
2217 }
2218
2219 //=======================================================================
2220 //function : SetTrihedronSize
2221 //purpose  :
2222 //=======================================================================
2223 void AIS_InteractiveContext::SetTrihedronSize (const Standard_Real    theVal,
2224                                                const Standard_Boolean /*updateviewer*/)
2225 {
2226   myDefaultDrawer->DatumAspect()->SetAxisLength (theVal, theVal, theVal);
2227   Redisplay (AIS_KOI_Datum, 3, Standard_False);
2228   Redisplay (AIS_KOI_Datum, 4, Standard_True);
2229 }
2230
2231 //=======================================================================
2232 //function : SetPlaneSize
2233 //purpose  :
2234 //=======================================================================
2235 void AIS_InteractiveContext::SetPlaneSize(const Standard_Real    theValX,
2236                                           const Standard_Real    theValY,
2237                                           const Standard_Boolean theToUpdateViewer)
2238 {
2239   myDefaultDrawer->PlaneAspect()->SetPlaneLength (theValX, theValY);
2240   Redisplay (AIS_KOI_Datum, 7, theToUpdateViewer);
2241 }
2242
2243 //=======================================================================
2244 //function : SetPlaneSize
2245 //purpose  :
2246 //=======================================================================
2247 void AIS_InteractiveContext::SetPlaneSize (const Standard_Real    theVal,
2248                                            const Standard_Boolean theToUpdateViewer)
2249 {
2250   SetPlaneSize (theVal, theVal, theToUpdateViewer);
2251 }
2252
2253 //=======================================================================
2254 //function : PlaneSize
2255 //purpose  :
2256 //=======================================================================
2257 Standard_Boolean AIS_InteractiveContext::PlaneSize (Standard_Real& theX,
2258                                                     Standard_Real& theY) const
2259 {
2260   theX = myDefaultDrawer->PlaneAspect()->PlaneXLength();
2261   theY = myDefaultDrawer->PlaneAspect()->PlaneYLength();
2262   return (Abs (theX - theY) <= Precision::Confusion());
2263 }
2264
2265 //=======================================================================
2266 //function : SetZLayer
2267 //purpose  :
2268 //=======================================================================
2269 void AIS_InteractiveContext::SetZLayer (const Handle(AIS_InteractiveObject)& theIObj,
2270                                         const Graphic3d_ZLayerId theLayerId)
2271 {
2272   if (theIObj.IsNull())
2273     return;
2274
2275   theIObj->SetZLayer (theLayerId);
2276 }
2277
2278 //=======================================================================
2279 //function : GetZLayer
2280 //purpose  :
2281 //=======================================================================
2282 Graphic3d_ZLayerId AIS_InteractiveContext::GetZLayer (const Handle(AIS_InteractiveObject)& theIObj) const
2283 {
2284   return !theIObj.IsNull()
2285        ?  theIObj->ZLayer()
2286        :  Graphic3d_ZLayerId_UNKNOWN;
2287 }
2288
2289 //=======================================================================
2290 //function : RebuildSelectionStructs
2291 //purpose  : Rebuilds 1st level of BVH selection forcibly
2292 //=======================================================================
2293 void AIS_InteractiveContext::RebuildSelectionStructs()
2294 {
2295   myMainSel->RebuildObjectsTree (Standard_True);
2296 }
2297
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)
2304 {
2305   if (theAssembly->IsInstance ("AIS_MultipleConnectedInteractive"))
2306   {
2307     Handle(AIS_MultipleConnectedInteractive) theObj (Handle(AIS_MultipleConnectedInteractive)::DownCast (theAssembly));
2308     theObj->Disconnect (theObjToDisconnect);
2309     if (!myObjects.IsBound (theObjToDisconnect))
2310     {
2311       // connected presentation might contain displayed presentations
2312       myMainPM->Erase (theObjToDisconnect, -1);
2313       theObjToDisconnect->ErasePresentations (true);
2314     }
2315
2316     const Handle(SelectMgr_SelectableObject)& anObj = theObjToDisconnect; // to avoid ambiguity
2317     mgrSelector->Remove (anObj);
2318   }
2319   else if (theAssembly->IsInstance ("AIS_ConnectedInteractive") && theObjToDisconnect.IsNull())
2320   {
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);
2325   }
2326   else
2327     return;
2328 }
2329
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)
2335 {
2336   FitSelected (theView, 0.01, Standard_True);
2337 }
2338
2339 //=======================================================================
2340 //function : BoundingBoxOfSelection
2341 //purpose  :
2342 //=======================================================================
2343 Bnd_Box AIS_InteractiveContext::BoundingBoxOfSelection() const
2344 {
2345   Bnd_Box aBndSelected;
2346   AIS_MapOfObjectOwners anObjectOwnerMap;
2347   for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
2348   {
2349     const Handle(SelectMgr_EntityOwner)& anOwner = aSelIter.Value();
2350     Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast(anOwner->Selectable());
2351     if (anObj->IsInfinite())
2352     {
2353       continue;
2354     }
2355
2356     if (anOwner == anObj->GlobalSelOwner())
2357     {
2358       Bnd_Box aTmpBnd;
2359       anObj->BoundingBox (aTmpBnd);
2360       aBndSelected.Add (aTmpBnd);
2361     }
2362     else
2363     {
2364       Handle(SelectMgr_IndexedMapOfOwner) anOwnerMap;
2365       if (!anObjectOwnerMap.Find (anOwner->Selectable(), anOwnerMap))
2366       {
2367         anOwnerMap = new SelectMgr_IndexedMapOfOwner();
2368         anObjectOwnerMap.Bind (anOwner->Selectable(), anOwnerMap);
2369       }
2370
2371       anOwnerMap->Add (anOwner);
2372     }
2373   }
2374
2375   for (AIS_MapIteratorOfMapOfObjectOwners anIter (anObjectOwnerMap); anIter.More(); anIter.Next())
2376   {
2377     const Handle(SelectMgr_SelectableObject) anObject = anIter.Key();
2378     Bnd_Box aTmpBox = anObject->BndBoxOfSelected (anIter.ChangeValue());
2379     aBndSelected.Add (aTmpBox);
2380   }
2381
2382   return aBndSelected;
2383 }
2384
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)
2392 {
2393   Bnd_Box aBndSelected = BoundingBoxOfSelection();
2394   if (!aBndSelected.IsVoid())
2395   {
2396     theView->FitAll (aBndSelected, theMargin, theToUpdate);
2397   }
2398 }
2399
2400 //=======================================================================
2401 //function : SetTransformPersistence
2402 //purpose  :
2403 //=======================================================================
2404 void AIS_InteractiveContext::SetTransformPersistence (const Handle(AIS_InteractiveObject)& theObject,
2405                                                       const Handle(Graphic3d_TransformPers)& theTrsfPers)
2406 {
2407   theObject->SetTransformPersistence (theTrsfPers);
2408   if (!myObjects.IsBound (theObject))
2409   {
2410     return;
2411   }
2412
2413   mgrSelector->UpdateSelection (theObject);
2414
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())
2418   {
2419     anActiveViewIter.Value()->View()->InvalidateBVHData (aLayerId);
2420     anActiveViewIter.Value()->View()->InvalidateZLayerBoundingBox (aLayerId);
2421   }
2422 }
2423
2424 //=======================================================================
2425 //function : GravityPoint
2426 //purpose  :
2427 //=======================================================================
2428 gp_Pnt AIS_InteractiveContext::GravityPoint (const Handle(V3d_View)& theView) const
2429 {
2430   return theView->GravityPoint();
2431 }
2432 //=======================================================================
2433 //function : setObjectStatus
2434 //purpose  :
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)
2440 {
2441   if (theStatus != AIS_DS_None)
2442   {
2443     Handle(AIS_GlobalStatus) aStatus = new AIS_GlobalStatus (AIS_DS_Displayed, theDispMode, theSelectionMode);
2444     myObjects.Bind (theIObj, aStatus);
2445   }
2446   else
2447     myObjects.UnBind (theIObj);
2448
2449   for (PrsMgr_ListOfPresentableObjectsIter aPrsIter (theIObj->Children()); aPrsIter.More(); aPrsIter.Next())
2450   {
2451     Handle(AIS_InteractiveObject) aChild (Handle(AIS_InteractiveObject)::DownCast (aPrsIter.Value()));
2452     if (aChild.IsNull())
2453       continue;
2454
2455     setObjectStatus (aChild, theStatus, theDispMode, theSelectionMode);
2456   }
2457 }