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