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