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