737d03ba9617e074841f8396337d589127aa1a63
[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->SetToUpdate();
956   theIObj->UpdatePresentations (theAllModes);
957   if (!theToUpdateViewer)
958   {
959     return;
960   }
961
962   const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
963   if (aStatus != NULL
964    && (*aStatus)->GraphicStatus() == AIS_DS_Displayed)
965   {
966     myMainVwr->Update();
967   }
968 }
969 //=======================================================================
970 //function : RecomputeSelectionOnly
971 //purpose  : 
972 //=======================================================================
973 void AIS_InteractiveContext::RecomputeSelectionOnly (const Handle(AIS_InteractiveObject)& theIO)
974 {
975   if (theIO.IsNull())
976   {
977     return;
978   }
979
980   mgrSelector->RecomputeSelection (theIO);
981
982   const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIO);
983   if (aStatus == NULL
984   || (*aStatus)->GraphicStatus() != AIS_DS_Displayed)
985   {
986     return;
987   }
988
989   TColStd_ListOfInteger aModes;
990   ActivatedModes (theIO, aModes);
991   TColStd_ListIteratorOfListOfInteger aModesIter (aModes);
992   for (; aModesIter.More(); aModesIter.Next())
993   {
994     mgrSelector->Activate (theIO, aModesIter.Value());
995   }
996 }
997
998 //=======================================================================
999 //function : Update
1000 //purpose  :
1001 //=======================================================================
1002 void AIS_InteractiveContext::Update (const Handle(AIS_InteractiveObject)& theIObj,
1003                                      const Standard_Boolean               theUpdateViewer)
1004 {
1005   if (theIObj.IsNull())
1006   {
1007     return;
1008   }
1009
1010   theIObj->UpdatePresentations();
1011   mgrSelector->Update(theIObj);
1012
1013   if (theUpdateViewer)
1014   {
1015     const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
1016     if (aStatus != NULL
1017      && (*aStatus)->GraphicStatus() == AIS_DS_Displayed)
1018     {
1019       myMainVwr->Update();
1020     }
1021   }
1022 }
1023
1024 //=======================================================================
1025 //function : SetLocation
1026 //purpose  :
1027 //=======================================================================
1028 void AIS_InteractiveContext::SetLocation (const Handle(AIS_InteractiveObject)& theIObj,
1029                                           const TopLoc_Location&               theLoc)
1030 {
1031   if (theIObj.IsNull())
1032   {
1033     return;
1034   }
1035
1036   if (theIObj->HasTransformation()
1037    && theLoc.IsIdentity())
1038   {
1039     theIObj->ResetTransformation();
1040     mgrSelector->Update (theIObj, Standard_False);
1041     return;
1042   }
1043   else if (theLoc.IsIdentity())
1044   {
1045     return;
1046   }
1047
1048   // first reset the previous location to properly clean everything...
1049   if (theIObj->HasTransformation())
1050   {
1051     theIObj->ResetTransformation();
1052   }
1053
1054   theIObj->SetLocalTransformation (theLoc.Transformation());
1055
1056   mgrSelector->Update (theIObj, Standard_False);
1057
1058   // if the object or its part is highlighted dynamically, it is necessary to apply location transformation
1059   // to its highlight structure immediately
1060   if (!myLastPicked.IsNull() && myLastPicked->IsSameSelectable (theIObj))
1061   {
1062     const Standard_Integer aHiMod = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
1063     myLastPicked->UpdateHighlightTrsf (myMainVwr,
1064                                        myMainPM,
1065                                        aHiMod);
1066   }
1067 }
1068
1069 //=======================================================================
1070 //function : ResetLocation
1071 //purpose  :
1072 //=======================================================================
1073 void AIS_InteractiveContext::ResetLocation (const Handle(AIS_InteractiveObject)& theIObj)
1074 {
1075   if (theIObj.IsNull())
1076   {
1077     return;
1078   }
1079
1080   theIObj->ResetTransformation();
1081   mgrSelector->Update (theIObj, Standard_False);
1082 }
1083
1084 //=======================================================================
1085 //function : HasLocation
1086 //purpose  :
1087 //=======================================================================
1088 Standard_Boolean AIS_InteractiveContext::HasLocation (const Handle(AIS_InteractiveObject)& theIObj) const
1089 {
1090   return !theIObj.IsNull()
1091        && theIObj->HasTransformation();
1092 }
1093
1094 //=======================================================================
1095 //function : Location
1096 //purpose  :
1097 //=======================================================================
1098 TopLoc_Location AIS_InteractiveContext::Location (const Handle(AIS_InteractiveObject)& theIObj) const
1099 {
1100   return theIObj->Transformation();
1101 }
1102
1103 //=======================================================================
1104 //function : SetDeviationCoefficient
1105 //purpose  :
1106 //=======================================================================
1107 void AIS_InteractiveContext::SetDeviationCoefficient (const Standard_Real theCoefficient)
1108 {
1109   myDefaultDrawer->SetDeviationCoefficient (theCoefficient);
1110 }
1111
1112 //=======================================================================
1113 //function : SetDeviationAngle
1114 //purpose  :
1115 //=======================================================================
1116 void AIS_InteractiveContext::SetDeviationAngle (const Standard_Real theAngle)
1117 {
1118   myDefaultDrawer->SetDeviationAngle (theAngle);
1119 }
1120
1121 //=======================================================================
1122 //function : DeviationAngle
1123 //purpose  : Gets  deviationAngle
1124 //=======================================================================
1125 Standard_Real AIS_InteractiveContext::DeviationAngle() const
1126 {
1127   return myDefaultDrawer->DeviationAngle();
1128 }
1129
1130 //=======================================================================
1131 //function : DeviationCoefficient
1132 //purpose  :
1133 //=======================================================================
1134 Standard_Real AIS_InteractiveContext::DeviationCoefficient() const
1135 {
1136   return myDefaultDrawer->DeviationCoefficient();
1137 }
1138
1139 //=======================================================================
1140 //function : SetHLRDeviationCoefficient
1141 //purpose  :
1142 //=======================================================================
1143 void AIS_InteractiveContext::SetHLRDeviationCoefficient (const Standard_Real theCoefficient)
1144 {
1145   myDefaultDrawer->SetHLRDeviationCoefficient (theCoefficient);
1146 }
1147
1148 //=======================================================================
1149 //function : HLRDeviationCoefficient
1150 //purpose  :
1151 //=======================================================================
1152 Standard_Real AIS_InteractiveContext::HLRDeviationCoefficient() const
1153 {
1154   return myDefaultDrawer->HLRDeviationCoefficient();
1155 }
1156
1157 //=======================================================================
1158 //function : SetHLRAngle
1159 //purpose  :
1160 //=======================================================================
1161 void AIS_InteractiveContext::SetHLRAngle (const Standard_Real theAngle)
1162 {
1163   myDefaultDrawer->SetHLRAngle (theAngle);
1164 }
1165
1166 //=======================================================================
1167 //function : SetHLRAngleAndDeviation
1168 //purpose  : compute with anangle a HLRAngle and a HLRDeviationCoefficient 
1169 //           and set them in myHLRAngle and in myHLRDeviationCoefficient
1170 //           of myDefaultDrawer 
1171 //=======================================================================
1172 void AIS_InteractiveContext::SetHLRAngleAndDeviation (const Standard_Real theAngle)
1173 {
1174   Standard_Real anOutAngl, anOutDefl;
1175   HLRBRep::PolyHLRAngleAndDeflection (theAngle, anOutAngl, anOutDefl);
1176
1177   myDefaultDrawer->SetHLRAngle                (anOutAngl);
1178   myDefaultDrawer->SetHLRDeviationCoefficient (anOutDefl);
1179 }
1180
1181 //=======================================================================
1182 //function : HLRAngle
1183 //purpose  :
1184 //=======================================================================
1185 Standard_Real AIS_InteractiveContext::HLRAngle() const 
1186 {
1187   return myDefaultDrawer->HLRAngle();
1188 }
1189
1190 //=======================================================================
1191 //function : SetDisplayMode
1192 //purpose  :
1193 //=======================================================================
1194 void AIS_InteractiveContext::SetDisplayMode(const Standard_Integer theMode,
1195                                             const Standard_Boolean theToUpdateViewer)
1196 {
1197   if (theMode == myDefaultDrawer->DisplayMode())
1198   {
1199     return;
1200   }
1201
1202   for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
1203   {
1204     Handle(AIS_InteractiveObject) anObj = anObjIter.Key();
1205     Standard_Boolean toProcess = anObj->IsKind (STANDARD_TYPE(AIS_Shape))
1206                               || anObj->IsKind (STANDARD_TYPE(AIS_ConnectedInteractive))
1207                               || anObj->IsKind (STANDARD_TYPE(AIS_MultipleConnectedInteractive));
1208     
1209     if (!toProcess
1210      ||  anObj->HasDisplayMode()
1211      || !anObj->AcceptDisplayMode (theMode))
1212     {
1213       continue;
1214     }
1215
1216     Handle(AIS_GlobalStatus) aStatus = anObjIter.Value();
1217     aStatus->SetDisplayMode (theMode);
1218
1219     if (aStatus->GraphicStatus() == AIS_DS_Displayed)
1220     {
1221       myMainPM->Display (anObj, theMode);
1222       if (!myLastPicked.IsNull() && myLastPicked->IsSameSelectable (anObj))
1223       {
1224         myMainPM->BeginImmediateDraw();
1225         unhighlightGlobal (anObj);
1226         myMainPM->EndImmediateDraw (myMainVwr);
1227       }
1228       if (aStatus->IsSubIntensityOn())
1229       {
1230         highlightWithSubintensity (anObj, theMode);
1231       }
1232       myMainPM->SetVisibility (anObj, myDefaultDrawer->DisplayMode(), Standard_False);
1233     }
1234   }
1235
1236   myDefaultDrawer->SetDisplayMode (theMode);
1237   if (theToUpdateViewer)
1238   {
1239     myMainVwr->Update();
1240   }
1241 }
1242
1243 //=======================================================================
1244 //function : SetDisplayMode
1245 //purpose  :
1246 //=======================================================================
1247 void AIS_InteractiveContext::SetDisplayMode (const Handle(AIS_InteractiveObject)& theIObj,
1248                                              const Standard_Integer               theMode,
1249                                              const Standard_Boolean               theToUpdateViewer)
1250 {
1251   setContextToObject (theIObj);
1252   if (!myObjects.IsBound (theIObj))
1253   {
1254     theIObj->SetDisplayMode (theMode);
1255     return;
1256   }
1257   else if (!theIObj->AcceptDisplayMode (theMode))
1258   {
1259     return;
1260   }
1261
1262   Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
1263   if (aStatus->GraphicStatus() != AIS_DS_Displayed)
1264   {
1265     aStatus->SetDisplayMode (theMode);
1266     theIObj->SetDisplayMode (theMode);
1267     return;
1268   }
1269
1270   // erase presentations for all display modes different from <aMode>
1271   const Standard_Integer anOldMode = aStatus->DisplayMode();
1272   if (anOldMode != theMode)
1273   {
1274     if (myMainPM->IsHighlighted (theIObj, anOldMode))
1275     {
1276       unhighlightGlobal (theIObj);
1277     }
1278     myMainPM->SetVisibility (theIObj, anOldMode, Standard_False);
1279   }
1280
1281   aStatus->SetDisplayMode (theMode);
1282
1283   myMainPM->Display (theIObj, theMode);
1284   if (aStatus->IsHilighted())
1285   {
1286     highlightGlobal (theIObj, getSelStyle (theIObj, theIObj->GlobalSelOwner()), theMode);
1287   }
1288   if (aStatus->IsSubIntensityOn())
1289   {
1290     highlightWithSubintensity (theIObj, theMode);
1291   }
1292
1293   if (theToUpdateViewer)
1294   {
1295     myMainVwr->Update();
1296   }
1297   theIObj->SetDisplayMode (theMode);
1298 }
1299
1300 //=======================================================================
1301 //function : UnsetDisplayMode
1302 //purpose  :
1303 //=======================================================================
1304 void AIS_InteractiveContext::UnsetDisplayMode (const Handle(AIS_InteractiveObject)& theIObj,
1305                                                const Standard_Boolean               theToUpdateViewer)
1306 {
1307   if (theIObj.IsNull()
1308   || !theIObj->HasDisplayMode())
1309   {
1310     return;
1311   }
1312
1313   if (!myObjects.IsBound (theIObj))
1314   {
1315     theIObj->UnsetDisplayMode();
1316     return;
1317   }
1318
1319   const Standard_Integer anOldMode = theIObj->DisplayMode();
1320   if (myDefaultDrawer->DisplayMode() == anOldMode)
1321   {
1322     return;
1323   }
1324
1325   const Handle(AIS_GlobalStatus)& aStatus = myObjects (theIObj);
1326   aStatus->SetDisplayMode (myDefaultDrawer->DisplayMode());
1327
1328   if (aStatus->GraphicStatus() == AIS_DS_Displayed)
1329   {
1330     if (myMainPM->IsHighlighted (theIObj, anOldMode))
1331     {
1332       unhighlightGlobal (theIObj);
1333     }
1334     myMainPM->SetVisibility (theIObj, anOldMode, Standard_False);
1335     myMainPM->Display (theIObj, myDefaultDrawer->DisplayMode());
1336     if (aStatus->IsHilighted())
1337     {
1338       highlightSelected (theIObj->GlobalSelOwner());
1339     }
1340     if (aStatus->IsSubIntensityOn())
1341     {
1342       highlightWithSubintensity (theIObj, myDefaultDrawer->DisplayMode());
1343     }
1344
1345     if (theToUpdateViewer)
1346     {
1347       myMainVwr->Update();
1348     }
1349   }
1350
1351   theIObj->UnsetDisplayMode();
1352 }
1353
1354 //=======================================================================
1355 //function : SetCurrentFacingModel
1356 //purpose  :
1357 //=======================================================================
1358 void AIS_InteractiveContext::SetCurrentFacingModel (const Handle(AIS_InteractiveObject)& theIObj,
1359                                                     const Aspect_TypeOfFacingModel       theModel)
1360 {
1361   if (!theIObj.IsNull())
1362   {
1363     theIObj->SetCurrentFacingModel (theModel);
1364   }
1365 }
1366
1367 //=======================================================================
1368 //function : SetColor
1369 //purpose  :
1370 //=======================================================================
1371 void AIS_InteractiveContext::SetColor (const Handle(AIS_InteractiveObject)& theIObj,
1372                                        const Quantity_Color&                theColor,
1373                                        const Standard_Boolean               theToUpdateViewer)
1374 {
1375   if (theIObj.IsNull())
1376   {
1377     return;
1378   }
1379
1380   setContextToObject (theIObj);
1381   theIObj->SetColor (theColor);
1382   theIObj->UpdatePresentations();
1383   if (theToUpdateViewer)
1384   {
1385     UpdateCurrentViewer();
1386   }
1387 }
1388
1389 //=======================================================================
1390 //function : SetIsoOnTriangulation
1391 //purpose  :
1392 //=======================================================================
1393 void AIS_InteractiveContext::IsoOnTriangulation (const Standard_Boolean theIsEnabled,
1394                                                  const Handle(AIS_InteractiveObject)& theObject)
1395 {
1396   if (theObject.IsNull())
1397   {
1398     return;
1399   }
1400
1401   theObject->SetIsoOnTriangulation (theIsEnabled);
1402 }
1403
1404 //=======================================================================
1405 //function : SetDeviationCoefficient
1406 //purpose  :
1407 //=======================================================================
1408 void AIS_InteractiveContext::SetDeviationCoefficient (const Handle(AIS_InteractiveObject)& theIObj,
1409                                                       const Standard_Real                  theCoefficient,
1410                                                       const Standard_Boolean               theToUpdateViewer)
1411 {
1412   if (theIObj.IsNull())
1413   {
1414     return;
1415   }
1416
1417   // to be modified after the related methods of AIS_Shape are passed to InteractiveObject
1418   setContextToObject (theIObj);
1419   if (theIObj->Type() != AIS_KOI_Object
1420    && theIObj->Type() != AIS_KOI_Shape)
1421   {
1422     return;
1423   }
1424   else if (theIObj->Signature() != 0)
1425   {
1426     return;
1427   }
1428
1429   Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1430   aShape->SetOwnDeviationCoefficient (theCoefficient);
1431   aShape->UpdatePresentations();
1432   if (theToUpdateViewer)
1433   {
1434     UpdateCurrentViewer();
1435   }
1436 }
1437
1438 //=======================================================================
1439 //function : SetHLRDeviationCoefficient
1440 //purpose  :
1441 //=======================================================================
1442 void AIS_InteractiveContext::SetHLRDeviationCoefficient (const Handle(AIS_InteractiveObject)& theIObj,
1443                                                          const Standard_Real                  theCoefficient,
1444                                                          const Standard_Boolean               theToUpdateViewer)
1445 {
1446   if (theIObj.IsNull())
1447   {
1448     return;
1449   }
1450
1451   // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
1452   setContextToObject (theIObj);
1453   if (theIObj->Type() != AIS_KOI_Object
1454    && theIObj->Type() != AIS_KOI_Shape)
1455   {
1456     return;
1457   }
1458   else if (theIObj->Signature() != 0)
1459   {
1460     return;
1461   }
1462
1463   Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1464   aShape->SetOwnHLRDeviationCoefficient (theCoefficient);
1465   aShape->UpdatePresentations();
1466   if (theToUpdateViewer)
1467   {
1468     UpdateCurrentViewer();
1469   }
1470 }
1471
1472 //=======================================================================
1473 //function : SetDeviationAngle
1474 //purpose  :
1475 //=======================================================================
1476 void AIS_InteractiveContext::SetDeviationAngle (const Handle(AIS_InteractiveObject)& theIObj,
1477                                                 const Standard_Real                  theAngle,
1478                                                 const Standard_Boolean               theToUpdateViewer)
1479 {
1480   if (theIObj.IsNull())
1481   {
1482     return;
1483   }
1484
1485   // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
1486   setContextToObject (theIObj);
1487   if (theIObj->Type() != AIS_KOI_Shape)
1488   {
1489     return;
1490   }
1491   else if (theIObj->Signature() != 0)
1492   {
1493     return;
1494   }
1495
1496   Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1497   aShape->SetOwnDeviationAngle (theAngle);
1498   aShape->UpdatePresentations();
1499   if (theToUpdateViewer)
1500   {
1501     UpdateCurrentViewer();
1502   }
1503 }
1504
1505 //=======================================================================
1506 //function : SetAngleAndDeviation
1507 //purpose  :
1508 //=======================================================================
1509 void AIS_InteractiveContext::SetAngleAndDeviation (const Handle(AIS_InteractiveObject)& theIObj,
1510                                                    const Standard_Real                  theAngle,
1511                                                    const Standard_Boolean               theToUpdateViewer)
1512 {
1513   if (theIObj.IsNull())
1514   {
1515     return;
1516   }
1517
1518   // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
1519   setContextToObject (theIObj);
1520   if (theIObj->Type() != AIS_KOI_Shape)
1521   {
1522     return;
1523   }
1524   if (theIObj->Signature() != 0)
1525   {
1526     return;
1527   }
1528
1529   Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1530   aShape->SetAngleAndDeviation (theAngle);
1531   aShape->UpdatePresentations();
1532   if (theToUpdateViewer)
1533   {
1534     UpdateCurrentViewer();
1535   }
1536 }
1537
1538 //=======================================================================
1539 //function : SetHLRAngleAndDeviation
1540 //purpose  :
1541 //=======================================================================
1542 void AIS_InteractiveContext::SetHLRAngleAndDeviation (const Handle(AIS_InteractiveObject)& theIObj,
1543                                                       const Standard_Real                  theAngle,
1544                                                       const Standard_Boolean               theToUpdateViewer)
1545 {
1546   if (theIObj.IsNull())
1547   {
1548     return;
1549   }
1550
1551   // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
1552   setContextToObject (theIObj);
1553   if (theIObj->Type() != AIS_KOI_Shape)
1554   {
1555     return;
1556   }
1557   if (theIObj->Signature() != 0)
1558   {
1559     return;
1560   }
1561   Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1562   aShape->SetHLRAngleAndDeviation (theAngle);
1563   aShape->UpdatePresentations();
1564   if (theToUpdateViewer)
1565   {
1566     UpdateCurrentViewer();
1567   }
1568 }
1569
1570 //=======================================================================
1571 //function : SetHLRDeviationAngle
1572 //purpose  :
1573 //=======================================================================
1574 void AIS_InteractiveContext::SetHLRDeviationAngle (const Handle(AIS_InteractiveObject)& theIObj,
1575                                                    const Standard_Real                  theAngle,
1576                                                    const Standard_Boolean               theToUpdateViewer)
1577 {
1578   if (theIObj.IsNull())
1579   {
1580     return;
1581   }
1582
1583   // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
1584   setContextToObject (theIObj);
1585   if (theIObj->Type() != AIS_KOI_Shape)
1586   {
1587     return;
1588   }
1589   if (theIObj->Signature() != 0)
1590   {
1591     return;
1592   }
1593   Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1594   aShape->SetOwnHLRDeviationAngle (theAngle);
1595   aShape->UpdatePresentations();
1596   if (theToUpdateViewer)
1597   {
1598     UpdateCurrentViewer();
1599   }
1600 }
1601
1602 //=======================================================================
1603 //function : UnsetColor
1604 //purpose  :
1605 //=======================================================================
1606 void AIS_InteractiveContext::UnsetColor (const Handle(AIS_InteractiveObject)& theIObj,
1607                                          const Standard_Boolean               theToUpdateViewer)
1608 {
1609   if (theIObj.IsNull())
1610   {
1611     return;
1612   }
1613
1614   theIObj->UnsetColor();
1615   theIObj->UpdatePresentations();
1616   if (theToUpdateViewer)
1617   {
1618     UpdateCurrentViewer();
1619   }
1620 }
1621
1622 //=======================================================================
1623 //function : HasColor
1624 //purpose  :
1625 //=======================================================================
1626 Standard_Boolean AIS_InteractiveContext::HasColor (const Handle(AIS_InteractiveObject)& theIObj) const
1627 {
1628   return theIObj->HasColor();
1629 }
1630
1631 //=======================================================================
1632 //function : Color
1633 //purpose  :
1634 //=======================================================================
1635 void AIS_InteractiveContext::Color (const Handle(AIS_InteractiveObject)& theIObj,
1636                                     Quantity_Color&                      theColor) const
1637 {
1638   theIObj->Color (theColor);
1639 }
1640
1641 //=======================================================================
1642 //function : Width
1643 //purpose  :
1644 //=======================================================================
1645 Standard_Real AIS_InteractiveContext::Width (const Handle(AIS_InteractiveObject)& theIObj) const
1646 {
1647   return theIObj->Width();
1648 }
1649
1650 //=======================================================================
1651 //function : SetWidth
1652 //purpose  :
1653 //=======================================================================
1654 void AIS_InteractiveContext::SetWidth (const Handle(AIS_InteractiveObject)& theIObj,
1655                                        const Standard_Real                  theWidth,
1656                                        const Standard_Boolean               theToUpdateViewer)
1657 {
1658   if (theIObj.IsNull())
1659   {
1660     return;
1661   }
1662
1663   setContextToObject (theIObj);
1664   theIObj->SetWidth (theWidth);
1665   theIObj->UpdatePresentations();
1666   if (!myLastinMain.IsNull() && myLastinMain->IsSameSelectable (theIObj))
1667   {
1668     if (myLastinMain->IsAutoHilight())
1669     {
1670       const Standard_Integer aHiMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
1671       myLastinMain->HilightWithColor (myMainPM,
1672                                       myLastinMain->IsSelected() ? getSelStyle (theIObj, myLastinMain) : getHiStyle (theIObj, myLastinMain),
1673                                       aHiMode);
1674     }
1675     else
1676     {
1677       theIObj->HilightOwnerWithColor (myMainPM,
1678                                       myLastinMain->IsSelected() ? getSelStyle (theIObj, myLastinMain) : getHiStyle (theIObj, myLastinMain),
1679                                       myLastinMain);
1680     }
1681   }
1682   if (theToUpdateViewer)
1683   {
1684     UpdateCurrentViewer();
1685   }
1686 }
1687
1688 //=======================================================================
1689 //function : UnsetWidth
1690 //purpose  :
1691 //=======================================================================
1692 void AIS_InteractiveContext::UnsetWidth (const Handle(AIS_InteractiveObject)& theIObj,
1693                                          const Standard_Boolean               theToUpdateViewer)
1694 {
1695   if (theIObj.IsNull())
1696   {
1697     return;
1698   }
1699
1700   theIObj->UnsetWidth();
1701   theIObj->UpdatePresentations();
1702   if (theToUpdateViewer)
1703   {
1704     UpdateCurrentViewer();
1705   }
1706 }
1707
1708 //=======================================================================
1709 //function : SetMaterial
1710 //purpose  :
1711 //=======================================================================
1712 void AIS_InteractiveContext::SetMaterial (const Handle(AIS_InteractiveObject)& theIObj,
1713                                           const Graphic3d_MaterialAspect&      theMaterial,
1714                                           const Standard_Boolean               theToUpdateViewer)
1715 {
1716   if (theIObj.IsNull())
1717   {
1718     return;
1719   }
1720
1721   setContextToObject (theIObj);
1722   theIObj->SetMaterial (theMaterial);
1723   theIObj->UpdatePresentations();
1724   if (theToUpdateViewer)
1725   {
1726     UpdateCurrentViewer();
1727   }
1728 }
1729
1730 //=======================================================================
1731 //function : UnsetMaterial
1732 //purpose  :
1733 //=======================================================================
1734 void AIS_InteractiveContext::UnsetMaterial (const Handle(AIS_InteractiveObject)& theIObj,
1735                                             const Standard_Boolean               theToUpdateViewer)
1736 {
1737   if (theIObj.IsNull())
1738   {
1739     return;
1740   }
1741   theIObj->UnsetMaterial();
1742   theIObj->UpdatePresentations();
1743   if (theToUpdateViewer)
1744   {
1745     UpdateCurrentViewer();
1746   }
1747 }
1748
1749 //=======================================================================
1750 //function : SetTransparency
1751 //purpose  :
1752 //=======================================================================
1753 void AIS_InteractiveContext::SetTransparency (const Handle(AIS_InteractiveObject)& theIObj,
1754                                               const Standard_Real                  theValue,
1755                                               const Standard_Boolean               theToUpdateViewer)
1756 {
1757   if (theIObj.IsNull())
1758   {
1759     return;
1760   }
1761
1762   setContextToObject (theIObj);
1763   if (!theIObj->IsTransparent()
1764     && theValue <= 0.005)
1765   {
1766     return;
1767   }
1768
1769   if (theValue <= 0.005)
1770   {
1771     UnsetTransparency (theIObj, theToUpdateViewer);
1772     return;
1773   }
1774
1775   theIObj->SetTransparency (theValue);
1776   theIObj->UpdatePresentations();
1777   if (theToUpdateViewer)
1778   {
1779     UpdateCurrentViewer();
1780   }
1781 }
1782
1783 //=======================================================================
1784 //function : UnsetTransparency
1785 //purpose  :
1786 //=======================================================================
1787 void AIS_InteractiveContext::UnsetTransparency (const Handle(AIS_InteractiveObject)& theIObj,
1788                                                 const Standard_Boolean               theToUpdateViewer)
1789 {
1790   if (theIObj.IsNull())
1791   {
1792     return;
1793   }
1794
1795   theIObj->UnsetTransparency();
1796   theIObj->UpdatePresentations();
1797   if (theToUpdateViewer)
1798   {
1799     UpdateCurrentViewer();
1800   }
1801 }
1802
1803 //=======================================================================
1804 //function : SetSelectedAspect
1805 //purpose  :
1806 //=======================================================================
1807 void AIS_InteractiveContext::SetSelectedAspect (const Handle(Prs3d_BasicAspect)& theAspect,
1808                                                 const Standard_Boolean           theToUpdateViewer)
1809 {
1810   Standard_DISABLE_DEPRECATION_WARNINGS
1811   Standard_Boolean isFound = Standard_False;
1812   for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
1813   {
1814     isFound = Standard_True;
1815     Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (aSelIter.Value()->Selectable());
1816     anObj->SetAspect (theAspect);
1817   }
1818   Standard_ENABLE_DEPRECATION_WARNINGS
1819
1820   if (isFound && theToUpdateViewer)
1821   {
1822     myMainVwr->Update();
1823   }
1824 }
1825
1826 //=======================================================================
1827 //function : SetLocalAttributes
1828 //purpose  :
1829 //=======================================================================
1830 void AIS_InteractiveContext::SetLocalAttributes (const Handle(AIS_InteractiveObject)& theIObj,
1831                                                  const Handle(Prs3d_Drawer)&          theDrawer,
1832                                                  const Standard_Boolean               theToUpdateViewer)
1833 {
1834   if (theIObj.IsNull())
1835   {
1836     return;
1837   }
1838
1839   setContextToObject (theIObj);
1840   theIObj->SetAttributes (theDrawer);
1841   Update (theIObj, theToUpdateViewer);
1842 }
1843
1844 //=======================================================================
1845 //function : UnsetLocalAttributes
1846 //purpose  :
1847 //=======================================================================
1848 void AIS_InteractiveContext::UnsetLocalAttributes (const Handle(AIS_InteractiveObject)& theIObj,
1849                                                    const Standard_Boolean               theToUpdateViewer)
1850 {
1851   if (theIObj.IsNull())
1852   {
1853     return;
1854   }
1855
1856   setContextToObject (theIObj);
1857   theIObj->UnsetAttributes();
1858   Update (theIObj, theToUpdateViewer);
1859 }
1860
1861 //=======================================================================
1862 //function : Status
1863 //purpose  :
1864 //=======================================================================
1865 void AIS_InteractiveContext::Status (const Handle(AIS_InteractiveObject)& theIObj,
1866                                      TCollection_ExtendedString&          theStatus) const
1867 {
1868   theStatus = "";
1869   if (theIObj.IsNull()
1870   || !myObjects.IsBound (theIObj))
1871   {
1872     return;
1873   }
1874
1875   theStatus += "\t ____________________________________________";
1876   theStatus += "\t| Known at Neutral Point:\n\tDisplayStatus:";
1877   const Handle(AIS_GlobalStatus)& aStatus = myObjects (theIObj);
1878   switch (aStatus->GraphicStatus())
1879   {
1880     case AIS_DS_Displayed:
1881     {
1882       theStatus += "\t| -->Displayed\n";
1883       break;
1884     }
1885     case AIS_DS_Erased:
1886     {
1887       theStatus += "\t| -->Erased\n";
1888       break;
1889     }
1890     default:
1891       break;
1892   }
1893
1894   theStatus += "\t| Active Display Modes in the MainViewer :\n";
1895   theStatus += "\t|\t Mode ";
1896   theStatus += TCollection_AsciiString (aStatus->DisplayMode());
1897   theStatus += "\n";
1898
1899   if (IsSelected(theIObj)) theStatus +="\t| Selected\n";
1900
1901   theStatus += "\t| Active Selection Modes in the MainViewer :\n";
1902   for (TColStd_ListIteratorOfListOfInteger aSelModeIter (aStatus->SelectionModes()); aSelModeIter.More(); aSelModeIter.Next())
1903   {
1904     theStatus += "\t\t Mode ";
1905     theStatus += TCollection_AsciiString (aSelModeIter.Value());
1906     theStatus += "\n";
1907   }
1908   theStatus += "\t ____________________________________________";
1909 }
1910
1911 //=======================================================================
1912 //function : GetDefModes
1913 //purpose  :
1914 //=======================================================================
1915 void AIS_InteractiveContext::GetDefModes (const Handle(AIS_InteractiveObject)& theIObj,
1916                                           Standard_Integer&                    theDispMode,
1917                                           Standard_Integer&                    theHiMode,
1918                                           Standard_Integer&                    theSelMode) const
1919 {
1920   if (theIObj.IsNull())
1921   {
1922     return;
1923   }
1924
1925   theDispMode = theIObj->HasDisplayMode()
1926               ? theIObj->DisplayMode()
1927               : (theIObj->AcceptDisplayMode (myDefaultDrawer->DisplayMode())
1928                ? myDefaultDrawer->DisplayMode()
1929                : 0);
1930   theHiMode  = theIObj->HasHilightMode()   ? theIObj->HilightMode()   : theDispMode;
1931   theSelMode = theIObj->GlobalSelectionMode();
1932 }
1933
1934 //=======================================================================
1935 //function : EraseGlobal
1936 //purpose  :
1937 //=======================================================================
1938 void AIS_InteractiveContext::EraseGlobal (const Handle(AIS_InteractiveObject)& theIObj,
1939                                           const Standard_Boolean               theToUpdateviewer)
1940 {
1941   if (theIObj.IsNull()
1942   || !myObjects.IsBound (theIObj))
1943   {
1944     return;
1945   }
1946
1947   Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
1948
1949   const Standard_Integer aDispMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
1950   if (aStatus->GraphicStatus() == AIS_DS_Erased)
1951   {
1952     return;
1953   }
1954
1955   if (aStatus->IsHilighted())
1956   {
1957     Standard_DISABLE_DEPRECATION_WARNINGS
1958     if (IsCurrent (theIObj))
1959     {
1960       AddOrRemoveCurrentObject (theIObj, Standard_False);
1961     }
1962     else if (myMainPM->IsHighlighted (theIObj, aStatus->DisplayMode()))
1963     {
1964       unhighlightGlobal (theIObj);
1965     }
1966     Standard_ENABLE_DEPRECATION_WARNINGS
1967   }
1968
1969   myMainPM->SetVisibility (theIObj, aStatus->DisplayMode(), Standard_False);
1970
1971   if (aStatus->IsHilighted()
1972    && theIObj->HasHilightMode())
1973   {
1974     unhighlightGlobal (theIObj);
1975   }
1976
1977   if (!myLastPicked.IsNull()
1978     && myLastPicked->IsSameSelectable (theIObj))
1979   {
1980     clearDynamicHighlight();
1981   }
1982
1983   // make sure highlighting presentations are properly erased
1984   theIObj->ErasePresentations (false);
1985
1986   if (IsSelected (theIObj)
1987    && aStatus->DisplayMode() != aDispMode)
1988   {
1989     myMainPM->SetVisibility (theIObj, aDispMode, Standard_False);
1990   }
1991
1992   for (TColStd_ListIteratorOfListOfInteger aSelModeIter (aStatus->SelectionModes()); aSelModeIter.More(); aSelModeIter.Next())
1993   {
1994     mgrSelector->Deactivate (theIObj, aSelModeIter.Value());
1995   }
1996   aStatus->ClearSelectionModes();
1997   aStatus->SetGraphicStatus (AIS_DS_Erased);
1998
1999   if (theToUpdateviewer)
2000   {
2001     myMainVwr->Update();
2002   }
2003 }
2004
2005 //=======================================================================
2006 //function : unhighlightOwners
2007 //purpose  :
2008 //=======================================================================
2009 void AIS_InteractiveContext::unhighlightOwners (const Handle(AIS_InteractiveObject)& theObject)
2010 {
2011   SelectMgr_SequenceOfOwner aSeq;
2012   for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
2013   {
2014     if (aSelIter.Value()->IsSameSelectable (theObject))
2015     {
2016       aSeq.Append (aSelIter.Value());
2017     }
2018   }
2019   for (SelectMgr_SequenceOfOwner::Iterator aDelIter (aSeq); aDelIter.More(); aDelIter.Next())
2020   {
2021     AddOrRemoveSelected (aDelIter.Value(), Standard_False);
2022   }
2023 }
2024
2025 //=======================================================================
2026 //function : ClearGlobal
2027 //purpose  :
2028 //=======================================================================
2029 void AIS_InteractiveContext::ClearGlobal (const Handle(AIS_InteractiveObject)& theIObj,
2030                                           const Standard_Boolean               theToUpdateviewer)
2031 {
2032   if (theIObj.IsNull()
2033   || !myObjects.IsBound (theIObj))
2034   {
2035     // for cases when reference shape of connected interactives was not displayed
2036     // but its selection primitives were calculated
2037     const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
2038     mgrSelector->Remove (anObj);
2039     return;
2040   }
2041
2042   Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
2043   unhighlightOwners (theIObj);
2044
2045   myMainPM->Erase (theIObj, -1);
2046   theIObj->ErasePresentations (true); // make sure highlighting presentations are properly erased
2047
2048   // Object removes from Detected sequence
2049   Standard_DISABLE_DEPRECATION_WARNINGS
2050   for (Standard_Integer aDetIter = myDetectedSeq.Lower(); aDetIter <= myDetectedSeq.Upper();)
2051   {
2052     Handle(SelectMgr_EntityOwner) aPicked = myMainSel->Picked (myDetectedSeq (aDetIter));
2053     Handle(AIS_InteractiveObject) anObj;
2054     if (!aPicked.IsNull())
2055     {
2056       anObj = Handle(AIS_InteractiveObject)::DownCast (aPicked->Selectable());
2057     }
2058
2059     if (!anObj.IsNull()
2060       && anObj == theIObj)
2061     {
2062       myDetectedSeq.Remove (aDetIter);
2063       if (myCurDetected == aDetIter)
2064       {
2065         myCurDetected = Min (myDetectedSeq.Upper(), aDetIter);
2066       }
2067       if (myCurHighlighted == aDetIter)
2068       {
2069         myCurHighlighted = 0;
2070       }
2071     }
2072     else
2073     {
2074       aDetIter++;
2075     }
2076   }
2077   Standard_ENABLE_DEPRECATION_WARNINGS
2078
2079   // remove IO from the selection manager to avoid memory leaks
2080   const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
2081   mgrSelector->Remove (anObj);
2082
2083   myObjects.UnBind (theIObj);
2084   myMainVwr->StructureManager()->UnregisterObject (theIObj);
2085
2086   for (V3d_ListOfViewIterator aDefViewIter (myMainVwr->DefinedViewIterator()); aDefViewIter.More(); aDefViewIter.Next())
2087   {
2088     aDefViewIter.Value()->View()->ChangeHiddenObjects()->Remove (theIObj.get());
2089   }
2090
2091   if (!myLastinMain.IsNull())
2092   {
2093     if (myLastinMain->IsSameSelectable (theIObj)
2094      || myLastPicked->IsSameSelectable(theIObj))
2095     {
2096       clearDynamicHighlight();
2097       myLastinMain.Nullify();
2098       myLastPicked.Nullify();
2099     }
2100   }
2101
2102   if (theToUpdateviewer && aStatus->GraphicStatus() == AIS_DS_Displayed)
2103   {
2104     myMainVwr->Update();
2105   }
2106 }
2107
2108 //=======================================================================
2109 //function : ClearGlobalPrs
2110 //purpose  :
2111 //=======================================================================
2112 void AIS_InteractiveContext::ClearGlobalPrs (const Handle(AIS_InteractiveObject)& theIObj,
2113                                              const Standard_Integer               theMode,
2114                                              const Standard_Boolean               theToUpdateViewer)
2115 {
2116   if (theIObj.IsNull()
2117   || !myObjects.IsBound (theIObj))
2118   {
2119     return;
2120   }
2121
2122   const Handle(AIS_GlobalStatus)& aStatus = myObjects (theIObj);
2123   if (aStatus->DisplayMode() == theMode)
2124   {
2125     const Standard_Integer aDispMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
2126     if (aDispMode == theMode
2127      && myMainPM->IsHighlighted (theIObj, theMode))
2128     {
2129       unhighlightGlobal (theIObj);
2130     }
2131
2132     myMainPM->Erase (theIObj, theMode);
2133   }
2134
2135   if (aStatus->GraphicStatus() == AIS_DS_Displayed
2136    && theToUpdateViewer)
2137   {
2138     myMainVwr->Update();
2139   }
2140 }
2141
2142 //=======================================================================
2143 //function : ClearDetected
2144 //purpose  :
2145 //=======================================================================
2146 Standard_Boolean AIS_InteractiveContext::ClearDetected (Standard_Boolean theToRedrawImmediate)
2147 {
2148   myCurDetected = 0;
2149   myCurHighlighted = 0;
2150   myDetectedSeq.Clear();
2151   myLastPicked  = myLastinMain;
2152   myWasLastMain = Standard_True;
2153   Standard_Boolean toUpdate = Standard_False;
2154   if (!myLastPicked.IsNull() && myLastPicked->HasSelectable())
2155   {
2156     toUpdate = Standard_True;
2157     clearDynamicHighlight();
2158   }
2159   myLastinMain.Nullify();
2160   myLastPicked.Nullify();
2161   myMainSel->ClearPicked();
2162   if (toUpdate && theToRedrawImmediate)
2163   {
2164     myMainVwr->RedrawImmediate();
2165   }
2166   return toUpdate;
2167 }
2168
2169 //=======================================================================
2170 //function : DrawHiddenLine
2171 //purpose  :
2172 //=======================================================================
2173 Standard_Boolean AIS_InteractiveContext::DrawHiddenLine() const
2174 {
2175   return myDefaultDrawer->DrawHiddenLine();
2176 }
2177
2178 //=======================================================================
2179 //function : EnableDrawHiddenLine
2180 //purpose  :
2181 //=======================================================================
2182 void AIS_InteractiveContext::EnableDrawHiddenLine() const
2183 {
2184   myDefaultDrawer->EnableDrawHiddenLine();
2185 }
2186
2187 //=======================================================================
2188 //function : DisableDrawHiddenLine 
2189 //purpose  :
2190 //=======================================================================
2191 void AIS_InteractiveContext::DisableDrawHiddenLine() const
2192 {
2193   myDefaultDrawer->DisableDrawHiddenLine();
2194 }
2195
2196 //=======================================================================
2197 //function : HiddenLineAspect
2198 //purpose  :
2199 //=======================================================================
2200 Handle (Prs3d_LineAspect) AIS_InteractiveContext::HiddenLineAspect() const
2201 {
2202   return myDefaultDrawer->HiddenLineAspect();
2203 }
2204
2205 //=======================================================================
2206 //function : SetHiddenLineAspect
2207 //purpose  :
2208 //=======================================================================
2209 void AIS_InteractiveContext::SetHiddenLineAspect (const Handle(Prs3d_LineAspect)& theAspect) const
2210 {
2211   myDefaultDrawer->SetHiddenLineAspect (theAspect);
2212 }
2213
2214 //=======================================================================
2215 //function : SetIsoNumber
2216 //purpose  :
2217 //=======================================================================
2218 void AIS_InteractiveContext::SetIsoNumber (const Standard_Integer theNb,
2219                                            const AIS_TypeOfIso    theType)
2220 {
2221   switch (theType)
2222   {
2223     case AIS_TOI_IsoU:
2224       myDefaultDrawer->UIsoAspect()->SetNumber (theNb);
2225       break;
2226     case AIS_TOI_IsoV:
2227       myDefaultDrawer->VIsoAspect()->SetNumber (theNb);
2228       break;
2229     case AIS_TOI_Both:
2230       myDefaultDrawer->UIsoAspect()->SetNumber (theNb);
2231       myDefaultDrawer->VIsoAspect()->SetNumber (theNb);
2232       break;
2233   }
2234 }
2235
2236 //=======================================================================
2237 //function : IsoNumber
2238 //purpose  :
2239 //=======================================================================
2240 Standard_Integer AIS_InteractiveContext::IsoNumber (const AIS_TypeOfIso theType)
2241 {
2242   switch (theType)
2243   {
2244     case AIS_TOI_IsoU: return myDefaultDrawer->UIsoAspect()->Number();
2245     case AIS_TOI_IsoV: return myDefaultDrawer->VIsoAspect()->Number();
2246     case AIS_TOI_Both: return myDefaultDrawer->UIsoAspect()->Number() == myDefaultDrawer->VIsoAspect()->Number()
2247                             ? myDefaultDrawer->UIsoAspect()->Number()
2248                             : -1;
2249   }
2250   return 0;
2251 }
2252
2253 //=======================================================================
2254 //function : IsoOnPlane
2255 //purpose  :
2256 //=======================================================================
2257 void AIS_InteractiveContext::IsoOnPlane (const Standard_Boolean theToSwitchOn)
2258 {
2259   myDefaultDrawer->SetIsoOnPlane (theToSwitchOn);
2260 }
2261
2262 //=======================================================================
2263 //function : IsoOnPlane
2264 //purpose  :
2265 //=======================================================================
2266 Standard_Boolean AIS_InteractiveContext::IsoOnPlane() const
2267 {
2268   return myDefaultDrawer->IsoOnPlane();
2269 }
2270
2271 //=======================================================================
2272 //function : IsoOnTriangulation
2273 //purpose  :
2274 //=======================================================================
2275 void AIS_InteractiveContext::IsoOnTriangulation (const Standard_Boolean theToSwitchOn)
2276 {
2277   myDefaultDrawer->SetIsoOnTriangulation (theToSwitchOn);
2278 }
2279
2280 //=======================================================================
2281 //function : IsoOnTriangulation
2282 //purpose  :
2283 //=======================================================================
2284 Standard_Boolean AIS_InteractiveContext::IsoOnTriangulation() const
2285 {
2286   return myDefaultDrawer->IsoOnTriangulation();
2287 }
2288
2289 //=======================================================================
2290 //function : SetPixelTolerance
2291 //purpose  :
2292 //=======================================================================
2293 void AIS_InteractiveContext::SetPixelTolerance (const Standard_Integer thePrecision)
2294 {
2295   myMainSel->SetPixelTolerance (thePrecision);
2296 }
2297
2298 //=======================================================================
2299 //function : PixelTolerance
2300 //purpose  :
2301 //=======================================================================
2302 Standard_Integer AIS_InteractiveContext::PixelTolerance() const
2303 {
2304   return myMainSel->PixelTolerance();
2305 }
2306
2307 //=======================================================================
2308 //function : SetSelectionSensitivity
2309 //purpose  : Allows to manage sensitivity of a particular selection of interactive object theObject
2310 //=======================================================================
2311 void AIS_InteractiveContext::SetSelectionSensitivity (const Handle(AIS_InteractiveObject)& theObject,
2312                                                       const Standard_Integer theMode,
2313                                                       const Standard_Integer theNewSensitivity)
2314 {
2315   mgrSelector->SetSelectionSensitivity (theObject, theMode, theNewSensitivity);
2316 }
2317
2318 //=======================================================================
2319 //function : InitAttributes
2320 //purpose  :
2321 //=======================================================================
2322 void AIS_InteractiveContext::InitAttributes()
2323 {
2324   Graphic3d_MaterialAspect aMat (Graphic3d_NOM_BRASS);
2325   myDefaultDrawer->ShadingAspect()->SetMaterial (aMat);
2326
2327 //  myDefaultDrawer->ShadingAspect()->SetColor(Quantity_NOC_GRAY70);
2328   Handle(Prs3d_LineAspect) aLineAspect = myDefaultDrawer->HiddenLineAspect();
2329   aLineAspect->SetColor      (Quantity_NOC_GRAY20);
2330   aLineAspect->SetWidth      (1.0);
2331   aLineAspect->SetTypeOfLine (Aspect_TOL_DASH);
2332
2333   // tolerance to 2 pixels...
2334   SetPixelTolerance (2);
2335
2336   // Customizing the drawer for trihedrons and planes...
2337   Handle(Prs3d_DatumAspect) aTrihAspect = myDefaultDrawer->DatumAspect();
2338   const Standard_Real aLength = 100.0;
2339   aTrihAspect->SetAxisLength (aLength, aLength, aLength);
2340   const Quantity_Color aColor = Quantity_NOC_LIGHTSTEELBLUE4;
2341   aTrihAspect->LineAspect(Prs3d_DP_XAxis)->SetColor (aColor);
2342   aTrihAspect->LineAspect(Prs3d_DP_YAxis)->SetColor (aColor);
2343   aTrihAspect->LineAspect(Prs3d_DP_ZAxis)->SetColor (aColor);
2344
2345   Handle(Prs3d_PlaneAspect) aPlaneAspect = myDefaultDrawer->PlaneAspect();
2346   const Standard_Real aPlaneLength = 200.0;
2347   aPlaneAspect->SetPlaneLength (aPlaneLength, aPlaneLength);
2348   aPlaneAspect->EdgesAspect()->SetColor (Quantity_NOC_SKYBLUE);
2349 }
2350
2351 //=======================================================================
2352 //function : TrihedronSize
2353 //purpose  :
2354 //=======================================================================
2355 Standard_Real AIS_InteractiveContext::TrihedronSize() const
2356 {
2357   return myDefaultDrawer->DatumAspect()->AxisLength(Prs3d_DP_XAxis);
2358 }
2359
2360 //=======================================================================
2361 //function : SetTrihedronSize
2362 //purpose  :
2363 //=======================================================================
2364 void AIS_InteractiveContext::SetTrihedronSize (const Standard_Real    theVal,
2365                                                const Standard_Boolean /*updateviewer*/)
2366 {
2367   myDefaultDrawer->DatumAspect()->SetAxisLength (theVal, theVal, theVal);
2368   Redisplay (AIS_KOI_Datum, 3, Standard_False);
2369   Redisplay (AIS_KOI_Datum, 4, Standard_True);
2370 }
2371
2372 //=======================================================================
2373 //function : SetPlaneSize
2374 //purpose  :
2375 //=======================================================================
2376 void AIS_InteractiveContext::SetPlaneSize(const Standard_Real    theValX,
2377                                           const Standard_Real    theValY,
2378                                           const Standard_Boolean theToUpdateViewer)
2379 {
2380   myDefaultDrawer->PlaneAspect()->SetPlaneLength (theValX, theValY);
2381   Redisplay (AIS_KOI_Datum, 7, theToUpdateViewer);
2382 }
2383
2384 //=======================================================================
2385 //function : SetPlaneSize
2386 //purpose  :
2387 //=======================================================================
2388 void AIS_InteractiveContext::SetPlaneSize (const Standard_Real    theVal,
2389                                            const Standard_Boolean theToUpdateViewer)
2390 {
2391   SetPlaneSize (theVal, theVal, theToUpdateViewer);
2392 }
2393
2394 //=======================================================================
2395 //function : PlaneSize
2396 //purpose  :
2397 //=======================================================================
2398 Standard_Boolean AIS_InteractiveContext::PlaneSize (Standard_Real& theX,
2399                                                     Standard_Real& theY) const
2400 {
2401   theX = myDefaultDrawer->PlaneAspect()->PlaneXLength();
2402   theY = myDefaultDrawer->PlaneAspect()->PlaneYLength();
2403   return (Abs (theX - theY) <= Precision::Confusion());
2404 }
2405
2406 //=======================================================================
2407 //function : SetZLayer
2408 //purpose  :
2409 //=======================================================================
2410 void AIS_InteractiveContext::SetZLayer (const Handle(AIS_InteractiveObject)& theIObj,
2411                                         const Graphic3d_ZLayerId theLayerId)
2412 {
2413   if (theIObj.IsNull())
2414     return;
2415
2416   theIObj->SetZLayer (theLayerId);
2417 }
2418
2419 //=======================================================================
2420 //function : GetZLayer
2421 //purpose  :
2422 //=======================================================================
2423 Graphic3d_ZLayerId AIS_InteractiveContext::GetZLayer (const Handle(AIS_InteractiveObject)& theIObj) const
2424 {
2425   return !theIObj.IsNull()
2426        ?  theIObj->ZLayer()
2427        :  Graphic3d_ZLayerId_UNKNOWN;
2428 }
2429
2430 //=======================================================================
2431 //function : RebuildSelectionStructs
2432 //purpose  : Rebuilds 1st level of BVH selection forcibly
2433 //=======================================================================
2434 void AIS_InteractiveContext::RebuildSelectionStructs()
2435 {
2436   myMainSel->RebuildObjectsTree (Standard_True);
2437 }
2438
2439 //=======================================================================
2440 //function : Disconnect
2441 //purpose  : Disconnects selectable object from an assembly and updates selection structures
2442 //=======================================================================
2443 void AIS_InteractiveContext::Disconnect (const Handle(AIS_InteractiveObject)& theAssembly,
2444                                          const Handle(AIS_InteractiveObject)& theObjToDisconnect)
2445 {
2446   if (theAssembly->IsInstance ("AIS_MultipleConnectedInteractive"))
2447   {
2448     Handle(AIS_MultipleConnectedInteractive) theObj (Handle(AIS_MultipleConnectedInteractive)::DownCast (theAssembly));
2449     theObj->Disconnect (theObjToDisconnect);
2450     const Handle(SelectMgr_SelectableObject)& anObj = theObjToDisconnect; // to avoid ambiguity
2451     mgrSelector->Remove (anObj);
2452   }
2453   else if (theAssembly->IsInstance ("AIS_ConnectedInteractive") && theObjToDisconnect.IsNull())
2454   {
2455     Handle(AIS_ConnectedInteractive) theObj (Handle(AIS_ConnectedInteractive)::DownCast (theAssembly));
2456     theObj->Disconnect();
2457     const Handle(SelectMgr_SelectableObject)& anObj = theObj; // to avoid ambiguity
2458     mgrSelector->Remove (anObj);
2459   }
2460   else
2461     return;
2462 }
2463
2464 //=======================================================================
2465 //function : FitSelected
2466 //purpose  : Fits the view corresponding to the bounds of selected objects
2467 //=======================================================================
2468 void AIS_InteractiveContext::FitSelected (const Handle(V3d_View)& theView)
2469 {
2470   FitSelected (theView, 0.01, Standard_True);
2471 }
2472
2473 //=======================================================================
2474 //function : FitSelected
2475 //purpose  : Fits the view corresponding to the bounds of selected objects
2476 //=======================================================================
2477 void AIS_InteractiveContext::FitSelected (const Handle(V3d_View)& theView,
2478                                           const Standard_Real theMargin,
2479                                           const Standard_Boolean theToUpdate)
2480 {
2481   Bnd_Box aBndSelected;
2482   AIS_MapOfObjectOwners anObjectOwnerMap;
2483   for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
2484   {
2485     const Handle(SelectMgr_EntityOwner)& anOwner = aSelIter.Value();
2486     Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast(anOwner->Selectable());
2487     if (anObj->IsInfinite())
2488     {
2489       continue;
2490     }
2491
2492     if (anOwner == anObj->GlobalSelOwner())
2493     {
2494       Bnd_Box aTmpBnd;
2495       anObj->BoundingBox (aTmpBnd);
2496       aBndSelected.Add (aTmpBnd);
2497     }
2498     else
2499     {
2500       Handle(SelectMgr_IndexedMapOfOwner) anOwnerMap;
2501       if (!anObjectOwnerMap.Find (anOwner->Selectable(), anOwnerMap))
2502       {
2503         anOwnerMap = new SelectMgr_IndexedMapOfOwner();
2504         anObjectOwnerMap.Bind (anOwner->Selectable(), anOwnerMap);
2505       }
2506
2507       anOwnerMap->Add (anOwner);
2508     }
2509   }
2510
2511   for (AIS_MapIteratorOfMapOfObjectOwners anIter (anObjectOwnerMap); anIter.More(); anIter.Next())
2512   {
2513     const Handle(SelectMgr_SelectableObject) anObject = anIter.Key();
2514     Bnd_Box aTmpBox = anObject->BndBoxOfSelected (anIter.ChangeValue());
2515     aBndSelected.Add (aTmpBox);
2516   }
2517
2518   anObjectOwnerMap.Clear();
2519
2520   if (aBndSelected.IsVoid())
2521     return;
2522
2523   theView->FitAll (aBndSelected, theMargin, theToUpdate);
2524 }
2525
2526 //=======================================================================
2527 //function : SetTransformPersistence
2528 //purpose  :
2529 //=======================================================================
2530 void AIS_InteractiveContext::SetTransformPersistence (const Handle(AIS_InteractiveObject)& theObject,
2531                                                       const Handle(Graphic3d_TransformPers)& theTrsfPers)
2532 {
2533   theObject->SetTransformPersistence (theTrsfPers);
2534   if (!myObjects.IsBound (theObject))
2535   {
2536     return;
2537   }
2538
2539   mgrSelector->UpdateSelection (theObject);
2540
2541   const Standard_Integer    aLayerId   = myObjects.Find (theObject)->GetLayerIndex();
2542   const Handle(V3d_Viewer)& aCurViewer = CurrentViewer();
2543   for (V3d_ListOfViewIterator anActiveViewIter (aCurViewer->ActiveViewIterator()); anActiveViewIter.More(); anActiveViewIter.Next())
2544   {
2545     anActiveViewIter.Value()->View()->InvalidateBVHData (aLayerId);
2546     anActiveViewIter.Value()->View()->InvalidateZLayerBoundingBox (aLayerId);
2547   }
2548 }