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