0023886: Visualizing planar faces with "notches" depends heavily on the deflection...
[occt.git] / src / AIS / AIS_LocalContext_1.cxx
1 // Created on: 1996-10-30
2 // Created by: Robert COUBLANC
3 // Copyright (c) 1996-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 rob Thu Apr 02 1998 
18 //              - use of optimisation in SelectMgr_ViewerSelector
19 //              -> Best management in detected entities...
20
21 #define BUC60569        //GG_051199 Enable to select the local context 
22 //                      in any case and especially in multi selection mode.
23 //                      Note that right now when an hilighted owner is selected
24 //                      this owner is unhilighted,this permits to see the selection!
25 //                      Principle : an owner can have 3 state :
26 //                      1 : The owner is selected and no more highlightable
27 //                      0 : The owner is NOT selected
28 //                      -1: The owner is selected but stay highlightable (NEW)
29
30 // IMP230600    //GG Add protection on selection methodes
31 //                      when nothing is selected
32
33 #define BUC60726        //GG_040900 When nothing is detected, 
34 //                      Clear the last temporary stuff in any case
35
36 #define BUC60765        //GG_121000 Avoid to raise when the same selection 
37 //                      is attached to several local context.
38
39 #define BUC60771        //GG_261000     Avoid to crash after closing a view
40 //                      containing a selected entity and creating a new one.
41
42 #define BUC60774        //GG_261000     Returns right select status on
43 //                      bounding-box selection type.
44
45 #define BUC60818        //GG_300101     Enable detection even if
46 //                      SetAutomaticHilight(FALSE) has been used.
47
48 #define IMP300101       //GG Enable to use polygon highlighting
49
50 #define BUC60876        //GG_050401 Clear selection always even
51 //                      if the current highlight mode is not 0.
52
53 #define BUC60953        //SAV_060701 For Select optimization. Selection by rectangle case.
54 // for single selection no optimization done.
55
56 #define IMP120701       //SZV made a shape valid for selection
57 //                      when required.
58
59 #define IMP160701       //SZV Add InitDetected(),MoreDetected(),NextDetected(),
60 //                       DetectedCurrentShape(),DetectedCurrentObject()
61 //                       methods
62
63 #define OCC138          //VTN Avoding infinit loop in AddOrRemoveSelected method.
64
65 #define OCC189          //SAV: 18/03/02 AIS_Selection::Objects() returns ListOfTransient
66 // instead of array.
67
68 #define USE_MAP         //san : 18/04/03 USE_MAP - additional datamap is used to speed up access 
69 //to certain owners in AIS_Selection::myresult list  
70
71 #define OCC9026         //AEL Performance optimization of the FindSelectedOwnerFromShape() method.
72
73 #include <AIS_LocalContext.jxx>
74 #include <StdSelect_BRepOwner.hxx>
75 #include <TColStd_MapOfTransient.hxx>
76 #include <TColStd_MapIteratorOfMapOfTransient.hxx>
77 #include <Prs3d_Presentation.hxx>
78 #include <Prs3d_Drawer.hxx>
79 #include <Prs3d_ShadingAspect.hxx>
80 #include <AIS_LocalStatus.hxx>
81 #include <StdPrs_WFShape.hxx>
82 #include <Graphic3d_ArrayOfTriangles.hxx>
83 #include <Graphic3d_Group.hxx>
84 #include <Select3D_SensitiveTriangulation.hxx>
85 #include <SelectBasics_SensitiveEntity.hxx>
86 #include <TCollection_AsciiString.hxx>
87 #include <NCollection_Map.hxx>
88
89 #ifdef OCC9026
90 #include <SelectMgr_DataMapIteratorOfDataMapOfIntegerSensitive.hxx>
91 #endif
92 #include <SelectMgr_Selection.hxx>
93 #include <SelectMgr_SequenceOfOwner.hxx>
94 #include <OSD_Environment.hxx>
95
96 #include <Geom_Transformation.hxx>
97 #include <AIS_Selection.hxx>
98 #include <Aspect_Grid.hxx>
99 #ifdef IMP120701
100 #include <AIS_Shape.hxx>
101 #endif
102
103
104 static Standard_Integer GetHiMod(const Handle(AIS_InteractiveObject)& IO)
105 {
106   return IO->HasHilightMode() ? IO->HilightMode():0;
107 }
108
109 //==================================================
110 // Function: MoveTo
111 // Purpose :
112 //==================================================
113 AIS_StatusOfDetection AIS_LocalContext::MoveTo (const Standard_Integer  theXpix,
114                                                 const Standard_Integer  theYpix,
115                                                 const Handle(V3d_View)& theView,
116                                                 const Standard_Boolean  theToRedrawImmediate)
117 {
118   // check that ViewerSelector gives
119   if (theView->Viewer() != myCTX->CurrentViewer())
120   {
121     return AIS_SOD_Error;
122   }
123
124   myAISCurDetected = 0;
125   myAISDetectedSeq.Clear();
126
127   myCurDetected = 0;
128   myDetectedSeq.Clear();
129   myMainVS->Pick (theXpix, theYpix, theView);
130
131   const Standard_Integer aDetectedNb = myMainVS->NbPicked();
132   for (Standard_Integer aDetIter = 1; aDetIter <= aDetectedNb; ++aDetIter)
133   {
134     Handle(SelectMgr_EntityOwner) anOwner = myMainVS->Picked (aDetIter);
135     if (anOwner.IsNull()
136      || !myFilters->IsOk (anOwner))
137     {
138       continue;
139     }
140
141     myDetectedSeq.Append (aDetIter); // normally they are already arranged in correct order...
142     Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
143     if (!anObj.IsNull())
144     {
145       myAISDetectedSeq.Append (anObj);
146     }
147   }
148
149   // result of courses..
150   if (aDetectedNb == 0 || myDetectedSeq.IsEmpty())
151   {
152     if (mylastindex != 0 && mylastindex <= myMapOfOwner.Extent())
153     {
154       Unhilight (myMapOfOwner (mylastindex), theView);
155       if (theToRedrawImmediate)
156       {
157         theView->RedrawImmediate();
158       }
159     }
160
161     mylastindex = 0;
162     return aDetectedNb == 0
163          ? AIS_SOD_Nothing
164          : AIS_SOD_AllBad;
165   }
166
167   // all owners detected by the selector are passed to the
168   // filters and correct ones are preserved...
169   myCurDetected = 1;
170   Handle(SelectMgr_EntityOwner) anOwner = myMainVS->Picked (myDetectedSeq (myCurDetected));
171   manageDetected (anOwner, theView, theToRedrawImmediate);
172   if (myDetectedSeq.Length() == 1)
173   {
174     return aDetectedNb == 1
175          ? AIS_SOD_OnlyOneDetected
176          : AIS_SOD_OnlyOneGood;
177   }
178   else
179   {
180     return AIS_SOD_SeveralGood;
181   }
182 }
183
184 //=======================================================================
185 //function : Select
186 //purpose  : 
187 //=======================================================================
188 AIS_StatusOfPick AIS_LocalContext::Select (const Standard_Boolean toUpdateViewer)
189 {
190   if (myAutoHilight)
191   {
192     UnhilightPicked (Standard_False);
193   }
194
195   AIS_Selection::SetCurrentSelection (mySelName.ToCString());
196
197   Standard_Integer aDetIndex = DetectedIndex();
198   if (aDetIndex <= 0)
199   {
200     ClearSelected (toUpdateViewer);
201     return (AIS_Selection::Extent() == 0) ? AIS_SOP_NothingSelected : AIS_SOP_Removed;
202   }
203
204   const Handle(SelectMgr_EntityOwner)& anOwner = myMapOfOwner (aDetIndex);
205
206   ClearSelected (Standard_False);
207
208   if (!anOwner->IsSelected()) // anOwner is not selected
209   {
210     anOwner->SetSelected (Standard_True);
211     AIS_Selection::Select (anOwner);
212   }
213
214   if (myAutoHilight)
215   {
216     const Handle(V3d_Viewer)& aViewer = myCTX->CurrentViewer();
217     for (aViewer->InitActiveViews(); aViewer->MoreActiveViews(); aViewer->NextActiveViews())
218     {
219       Unhilight (anOwner, aViewer->ActiveView());
220     }
221
222     // advanced selection highlighting mechanism
223     if (!anOwner->IsAutoHilight() && anOwner->HasSelectable())
224     {
225       Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast(anOwner->Selectable());
226       UpdateSelected (anIO, Standard_False);
227     }
228
229     if (toUpdateViewer)
230     {
231       myCTX->CurrentViewer()->Update();
232     }
233   }
234
235   return (AIS_Selection::Extent() == 1) ? AIS_SOP_OneSelected : AIS_SOP_SeveralSelected;
236 }
237
238 //=======================================================================
239 //function : Select
240 //purpose  : 
241 //=======================================================================
242 AIS_StatusOfPick AIS_LocalContext::Select (const Standard_Integer  theXPMin,
243                                            const Standard_Integer  theYPMin,
244                                            const Standard_Integer  theXPMax,
245                                            const Standard_Integer  theYPMax,
246                                            const Handle(V3d_View)& theView,
247                                            const Standard_Boolean  toUpdateViewer)
248 {
249   if (theView->Viewer() == myCTX->CurrentViewer())
250   {
251     myMainVS->Pick (theXPMin, theYPMin, theXPMax, theYPMax, theView);
252     if (myAutoHilight)
253     {
254       UnhilightPicked (Standard_False);
255     }
256
257     AIS_Selection::SetCurrentSelection (mySelName.ToCString());
258     Standard_Integer aSelNum = AIS_Selection::Extent();
259
260     myMainVS->Init();
261     if (!myMainVS->More())
262     {
263       ClearSelected (toUpdateViewer);
264       mylastindex = 0;
265       return aSelNum == 0 ? AIS_SOP_NothingSelected : AIS_SOP_Removed;
266     }
267
268     ClearSelected (Standard_False);
269
270     for (myMainVS->Init(); myMainVS->More(); myMainVS->Next())
271     {
272       const Handle(SelectMgr_EntityOwner)& anOwner = myMainVS->Picked();
273       if (myFilters->IsOk (anOwner))
274       {
275         // it can be helpful to classify this owner immediately...
276         if (!anOwner->IsSelected())
277         {
278           anOwner->SetSelected (Standard_True);
279           AIS_Selection::Select (anOwner);
280         }
281       }
282     }
283
284     if (myAutoHilight)
285     {
286       HilightPicked (toUpdateViewer);
287     }
288   }
289
290   Standard_Integer aSelNum = AIS_Selection::Extent();
291
292   return (aSelNum == 1) ? AIS_SOP_OneSelected
293                         : (aSelNum > 1) ? AIS_SOP_SeveralSelected
294                                         : AIS_SOP_Error;
295 }
296
297 //==================================================
298 // Function: Select
299 // Purpose : Selection by polyline
300 //==================================================
301 AIS_StatusOfPick AIS_LocalContext::Select (const TColgp_Array1OfPnt2d& thePolyline,
302                                            const Handle(V3d_View)& theView,
303                                            const Standard_Boolean toUpdateViewer)
304 {
305   if (theView->Viewer() == myCTX->CurrentViewer())
306   {
307     myMainVS->Pick (thePolyline, theView);
308
309     AIS_Selection::SetCurrentSelection (mySelName.ToCString());
310
311     Standard_Integer aLastSelNum = AIS_Selection::Extent();
312     myMainVS->Init();
313     if (!myMainVS->More())
314     {
315       // Nothing is selected clear selection.
316       ClearSelected (toUpdateViewer);
317       mylastindex = 0;
318
319       // Return state to know if something was unselected
320       return aLastSelNum == 0 ? AIS_SOP_NothingSelected : AIS_SOP_Removed;
321     }
322
323     if (myAutoHilight)
324     {
325       UnhilightPicked (Standard_False);
326     }
327
328     // Clear previous selection without update to process this selection
329     ClearSelected (Standard_False);
330
331     for (myMainVS->Init(); myMainVS->More(); myMainVS->Next())
332     {
333       const Handle(SelectMgr_EntityOwner)& anOwner = myMainVS->Picked();
334       if (myFilters->IsOk (anOwner))
335       {
336         // it can be helpful to classify this owner immediately...
337         if (!anOwner->IsSelected())
338         {
339           AIS_Selection::AddSelect (anOwner);
340           anOwner->SetSelected (Standard_True);
341         }
342       }
343     }
344
345     if (myAutoHilight)
346     {
347       HilightPicked (toUpdateViewer);
348     }
349   }
350
351   Standard_Integer aSelNum = AIS_Selection::Extent();
352   return (aSelNum == 1) ? AIS_SOP_OneSelected
353                         : (aSelNum > 1) ? AIS_SOP_SeveralSelected
354                                         : AIS_SOP_Error;
355 }
356
357 //=======================================================================
358 //function : ShiftSelect
359 //purpose  : 
360 //=======================================================================
361 AIS_StatusOfPick AIS_LocalContext::ShiftSelect (const Standard_Boolean toUpdateViewer)
362 {
363   Standard_Integer aDetIndex = DetectedIndex();
364   AIS_Selection::SetCurrentSelection (mySelName.ToCString());
365
366   if(aDetIndex > 0)
367   {
368     AIS_Selection::SetCurrentSelection (mySelName.ToCString());
369     Standard_Integer aSelNum = AIS_Selection::Extent();
370     const Handle(SelectMgr_EntityOwner)& anOwner = myMapOfOwner (aDetIndex);
371     Standard_Boolean toSelect = anOwner->IsSelected() ? Standard_False : Standard_True;
372     AIS_Selection::Select (anOwner);
373     anOwner->SetSelected (toSelect);
374
375     if(myAutoHilight)
376     {
377       const Handle(V3d_Viewer)& aViewer = myCTX->CurrentViewer();
378       for (aViewer->InitActiveViews(); aViewer->MoreActiveViews(); aViewer->NextActiveViews())
379       {
380         Unhilight (anOwner, aViewer->ActiveView());
381       }
382
383       // advanced selection highlighting mechanism
384       if (!anOwner->IsAutoHilight() && anOwner->HasSelectable())
385       {
386         Handle(AIS_InteractiveObject) anIO = Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
387         UpdateSelected (anIO, Standard_False);
388       }
389
390       if (toUpdateViewer)
391       {
392         myCTX->CurrentViewer()->Update();
393       }
394     } 
395
396 #ifdef BUC60774
397     Standard_Integer NS = AIS_Selection::Extent();
398     if( NS == 1 ) return AIS_SOP_OneSelected;
399     else if( NS > 1 ) return AIS_SOP_SeveralSelected;
400     return aSelNum == 0 ? AIS_SOP_NothingSelected : AIS_SOP_Removed;
401 #endif
402   }
403   return AIS_SOP_Error;
404 }
405
406 //=======================================================================
407 //function : ShiftSelect
408 //purpose  : 
409 //=======================================================================
410 AIS_StatusOfPick AIS_LocalContext::ShiftSelect (const Standard_Integer  theXPMin,
411                                                 const Standard_Integer  theYPMin,
412                                                 const Standard_Integer  theXPMax,
413                                                 const Standard_Integer  theYPMax,
414                                                 const Handle(V3d_View)& theView,
415                                                 const Standard_Boolean  toUpdateViewer)
416 {
417   myMainPM->ClearImmediateDraw();
418
419   if (theView->Viewer() == myCTX->CurrentViewer())
420   {
421     myMainVS->Pick (theXPMin, theYPMin, theXPMax, theYPMax, theView);
422
423     AIS_Selection::SetCurrentSelection (mySelName.ToCString());
424     Standard_Integer aLastSelNum = AIS_Selection::Extent();
425
426     myMainVS->Init();
427     if (!myMainVS->More())
428     {
429       // Nothing is selected clear selection, but don't clear the selection
430       // as it is shift selection and previous selection matters.
431       // Return state to know if something was unselected
432       return aLastSelNum == 0 ? AIS_SOP_NothingSelected : AIS_SOP_Removed;
433     }
434
435     if (myAutoHilight)
436     {
437       UnhilightPicked (Standard_False);
438     }
439
440     for (myMainVS->Init(); myMainVS->More(); myMainVS->Next())
441     {
442       const Handle(SelectMgr_EntityOwner)& anOwner = myMainVS->Picked();
443       if(myFilters->IsOk (anOwner))
444       {
445         Standard_Boolean toSelect = anOwner->IsSelected() ? Standard_False : Standard_True;
446         AIS_Selection::Select (anOwner);
447         anOwner->SetSelected (toSelect);
448       }
449     }
450
451     if (myAutoHilight)
452     {
453       HilightPicked (toUpdateViewer);
454     }
455   }
456
457   Standard_Integer aSelNum = AIS_Selection::Extent();
458
459   return (aSelNum == 1) ? AIS_SOP_OneSelected
460                         : (aSelNum > 1) ? AIS_SOP_SeveralSelected
461                                         : AIS_SOP_Error;
462 }
463
464 //==================================================
465 // Function: Select
466 // Purpose : Selection by polyline
467 //==================================================
468 AIS_StatusOfPick AIS_LocalContext::ShiftSelect (const TColgp_Array1OfPnt2d& thePolyline,
469                                                 const Handle(V3d_View)&     theView,
470                                                 const Standard_Boolean      toUpdateViewer)
471 {
472   if (theView->Viewer() == myCTX->CurrentViewer())
473   {
474     myMainVS->Pick (thePolyline, theView);
475
476     AIS_Selection::SetCurrentSelection (mySelName.ToCString());
477
478     Standard_Integer aLastSelNum = AIS_Selection::Extent();
479     myMainVS->Init();
480     if(!myMainVS->More())
481     {
482       // Nothing is selected clear selection, but don't clear the selection
483       // as it is shift selection and previous selection matters.
484       // Return state to know if something was unselected
485       return aLastSelNum == 0 ? AIS_SOP_NothingSelected : AIS_SOP_Removed;
486     }
487
488     if (myAutoHilight)
489     {
490       UnhilightPicked (Standard_False);
491     }
492
493     for (myMainVS->Init(); myMainVS->More(); myMainVS->Next())
494     {
495       const Handle(SelectMgr_EntityOwner)& anOwner = myMainVS->Picked();
496       if (myFilters->IsOk (anOwner))
497       {
498         Standard_Boolean toSelect = anOwner->IsSelected() ? Standard_False : Standard_True;
499         AIS_Selection::Select (anOwner);
500         anOwner->SetSelected (toSelect);
501       }
502     }
503     if (myAutoHilight)
504     {
505       HilightPicked (toUpdateViewer);
506     }
507   }
508
509   Standard_Integer aSelNum = AIS_Selection::Extent();
510
511   return (aSelNum == 1) ? AIS_SOP_OneSelected
512                         : (aSelNum > 1) ? AIS_SOP_SeveralSelected
513                                         : AIS_SOP_Error;
514 }
515
516 //==================================================
517 // Function: Hilight
518 // Purpose :
519 //==================================================
520 void AIS_LocalContext::Hilight (const Handle(SelectMgr_EntityOwner)& theOwner,
521                                 const Handle(V3d_View)&              theView)
522 {
523   if (theView.IsNull())
524   {
525     return;
526   }
527
528   const Standard_Integer aHilightMode = GetHiMod (Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable()));
529   myMainPM->BeginImmediateDraw();
530   theOwner->HilightWithColor (myMainPM, myCTX->HilightColor(), aHilightMode);
531   myMainPM->EndImmediateDraw (theView);
532 }
533
534 //==================================================
535 // Function: Unhilight
536 // Purpose :
537 //==================================================
538 void AIS_LocalContext::Unhilight (const Handle(SelectMgr_EntityOwner)& theOwner,
539                                   const Handle(V3d_View)&              theView)
540 {
541   if (theView.IsNull())
542   {
543     return;
544   }
545
546   myMainPM->ClearImmediateDraw();
547   const Standard_Integer aHilightMode = GetHiMod (Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable()));
548   if (IsSelected (theOwner))
549   {
550     if (theOwner->IsAutoHilight())
551     {
552       theOwner->HilightWithColor (myMainPM, myCTX->SelectionColor(), aHilightMode);
553     }
554   }
555   else
556   {
557     theOwner->Unhilight (myMainPM, aHilightMode);
558   }
559 }
560
561 //=======================================================================
562 //function : HilightPicked
563 //purpose  : 
564 //=======================================================================
565 void AIS_LocalContext::HilightPicked(const Standard_Boolean updateviewer)
566 {
567   Standard_Boolean updMain(Standard_False);
568
569   Handle(AIS_Selection) Sel = AIS_Selection::Selection(mySelName.ToCString());
570 #ifdef BUC60765
571   if( Sel.IsNull() ) return;
572 #endif
573
574   typedef NCollection_DataMap <Handle(SelectMgr_SelectableObject), NCollection_Handle<SelectMgr_SequenceOfOwner> > SelectMgr_DataMapOfObjectOwners;
575   SelectMgr_DataMapOfObjectOwners aMap;
576
577   Handle (PrsMgr_PresentationManager3d) PM = myMainPM;
578   
579   // to avoid problems when there is a loop searching for selected objects...
580 #if !defined OCC189 && !defined USE_MAP
581   const TColStd_Array1OfTransient& Obj = Sel->Objects()->Array1();
582   for(Standard_Integer i =Obj.Lower();i<=Sel->NbStored();i++)
583   {
584     const Handle(Standard_Transient)& Tr = Obj(i);
585 #else
586   const AIS_NListTransient& Obj = Sel->Objects();
587   AIS_NListTransient::Iterator anIter( Obj );
588   for(; anIter.More(); anIter.Next())
589   {
590     const Handle(Standard_Transient)& Tr = anIter.Value();
591 #endif
592     if(!Tr.IsNull()){
593       const Handle(SelectMgr_EntityOwner)& Ownr =
594         *((const Handle(SelectMgr_EntityOwner)*) &Tr);
595       Handle(AIS_InteractiveObject) IO;
596       if(Ownr->HasSelectable()){
597         Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast(Ownr);
598         if(BROwnr.IsNull() || !BROwnr->ComesFromDecomposition()){
599           Handle(SelectMgr_SelectableObject) SO  = Ownr->Selectable();
600           IO = *((Handle(AIS_InteractiveObject)*)&SO);
601           updMain = Standard_True;
602         }
603         else
604           updMain = Standard_True;
605       }
606       else
607         updMain = Standard_True;
608       Handle(SelectMgr_SelectableObject) SO = Ownr->Selectable();
609       Standard_Integer HM = GetHiMod(*((Handle(AIS_InteractiveObject)*)&SO));
610       if ( Ownr->IsAutoHilight() )
611         Ownr->HilightWithColor(PM,myCTX->SelectionColor(),HM);
612       else if ( aMap.IsBound (SO) )
613         aMap(SO)->Append ( Ownr );        
614       else {
615         NCollection_Handle<SelectMgr_SequenceOfOwner> aSeq = new SelectMgr_SequenceOfOwner;
616         aSeq->Append ( Ownr );
617         aMap.Bind ( SO, aSeq );
618       }      
619     }
620   }
621
622   for ( SelectMgr_DataMapOfObjectOwners::Iterator aMapIter(aMap); 
623         aMapIter.More(); aMapIter.Next() )
624   {
625     aMapIter.Key()->HilightSelected (myMainPM, *aMapIter.Value());
626   }
627
628   if (updateviewer)
629   {
630     myCTX->CurrentViewer()->Update();
631   }
632 }
633
634 //==================================================
635 // Function: 
636 // Purpose :
637 //==================================================
638 void AIS_LocalContext::UnhilightPicked (const Standard_Boolean updateviewer)
639 {
640   myMainPM->ClearImmediateDraw();
641
642   Standard_Boolean updMain(Standard_False);
643
644   Handle(AIS_Selection) Sel = AIS_Selection::Selection(mySelName.ToCString());
645 #ifdef BUC60765
646   if( Sel.IsNull() ) return;
647 #endif
648   Handle (PrsMgr_PresentationManager3d) PM = myMainPM;
649   NCollection_Map<Handle(SelectMgr_SelectableObject)> anObjMap;
650   
651 #if !defined OCC189 && !defined USE_MAP  
652   const TColStd_Array1OfTransient& Obj = Sel->Objects()->Array1();
653   for(Standard_Integer i =Obj.Lower();i<=Sel->NbStored();i++){
654     const Handle(Standard_Transient)& Tr = Obj(i);
655 #else
656   const AIS_NListTransient& Obj = Sel->Objects();
657   AIS_NListTransient::Iterator anIter( Obj );
658   for(; anIter.More(); anIter.Next()){
659     const Handle(Standard_Transient)& Tr = anIter.Value();
660 #endif
661     if(!Tr.IsNull()){
662       const Handle(SelectMgr_EntityOwner)& Ownr =
663         *((const Handle(SelectMgr_EntityOwner)*) &Tr);
664       Standard_Integer HM(0);
665       if(Ownr->HasSelectable()){
666 #ifdef BUC60876
667         Handle(SelectMgr_SelectableObject) SO  = Ownr->Selectable();
668         Handle(AIS_InteractiveObject) IO = *((Handle(AIS_InteractiveObject)*)&SO);
669         anObjMap.Add (IO);
670
671         HM = GetHiMod(IO);
672 #endif
673         Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast(Ownr);
674         if(BROwnr.IsNull() || !BROwnr->ComesFromDecomposition()){
675 #ifndef BUC60876
676           Handle(SelectMgr_SelectableObject) SO  = Ownr->Selectable();
677           Handle(AIS_InteractiveObject) IO = *((Handle(AIS_InteractiveObject)*)&SO);
678           HM = GetHiMod(IO);
679 #endif
680           updMain = Standard_True;
681         }
682         else
683           updMain = Standard_True;
684       }
685       Ownr->Unhilight(PM,HM);
686     }
687   }
688   
689   for (NCollection_Map<Handle(SelectMgr_SelectableObject)>::Iterator anIter1 ( anObjMap ); 
690         anIter1.More(); anIter1.Next() )
691   {
692     if ( !anIter1.Key()->IsAutoHilight() )
693       anIter1.Key()->ClearSelected();
694   }
695
696   if(updateviewer){
697 #ifdef BUC60774
698     myCTX->CurrentViewer()->Update();
699 #else
700     if(updMain) myCTX->CurrentViewer()->Update();
701 #endif
702   }
703   
704 }
705
706 //=======================================================================
707 //function : IsSelected
708 //purpose  : 
709 //=======================================================================
710 Standard_Boolean AIS_LocalContext::IsSelected(const Handle(AIS_InteractiveObject)& anIObj) const 
711 {
712   return (!FindSelectedOwnerFromIO(anIObj).IsNull());
713 }
714
715 //=======================================================================
716 //function : IsSelected
717 //purpose  : 
718 //=======================================================================
719
720 Standard_Boolean AIS_LocalContext::IsSelected (const Handle(SelectMgr_EntityOwner)& theOwner) const 
721 {
722   return !theOwner.IsNull() && theOwner->IsSelected();
723 }
724
725 //==================================================
726 // Function: 
727 // Purpose :
728 //==================================================
729 void AIS_LocalContext::
730 InitSelected()
731 {
732   AIS_Selection::SetCurrentSelection(mySelName.ToCString());
733   AIS_Selection::CurrentSelection()->Init();
734 }
735
736 //==================================================
737 // Function: 
738 // Purpose :
739 //==================================================
740 Standard_Boolean AIS_LocalContext::
741 MoreSelected() const 
742 {
743   return AIS_Selection::CurrentSelection()->More();
744 }
745
746 //==================================================
747 // Function: 
748 // Purpose :
749 //==================================================
750 void AIS_LocalContext::
751 NextSelected()
752 {
753   AIS_Selection::CurrentSelection()->Next();
754 }
755
756 //==================================================
757 // Function: 
758 // Purpose :
759 //==================================================
760 Standard_Boolean AIS_LocalContext::
761 HasShape() const 
762 {
763   Handle(Standard_Transient) Tr = AIS_Selection::CurrentSelection()->Value();
764   if( Tr.IsNull() ) return Standard_False;
765   Handle(SelectMgr_EntityOwner) EO = *((Handle(SelectMgr_EntityOwner)*)&Tr);
766   Handle(StdSelect_BRepOwner) BRO = Handle(StdSelect_BRepOwner)::DownCast(EO);
767   if(BRO.IsNull()) return Standard_False;
768   Standard_Boolean hasshape = BRO->HasShape();
769   Standard_Boolean comes = BRO->ComesFromDecomposition();
770   return (hasshape&&comes);
771 }
772
773 //==================================================
774 // Function: 
775 // Purpose :
776 //==================================================
777 TopoDS_Shape AIS_LocalContext::SelectedShape() const 
778 {
779   static TopoDS_Shape aSh;
780   Handle(Standard_Transient) Tr = AIS_Selection::CurrentSelection()->Value();
781   Handle(SelectMgr_EntityOwner) EO = *((Handle(SelectMgr_EntityOwner)*)&Tr);
782   Handle(StdSelect_BRepOwner) BRO = Handle(StdSelect_BRepOwner)::DownCast(EO);
783   if( BRO.IsNull() ) 
784   {
785     return aSh;
786   }
787   return BRO->Shape().Located (BRO->Location());
788 }
789
790 //==================================================
791 // Function: 
792 // Purpose :
793 //==================================================
794 Handle(AIS_InteractiveObject) AIS_LocalContext::
795 SelectedInteractive() const 
796 {
797   Handle(AIS_InteractiveObject) IO;
798   Handle(Standard_Transient) Tr = AIS_Selection::CurrentSelection()->Value();
799   if( !Tr.IsNull() ) {
800     Handle(SelectMgr_EntityOwner) EO = *((Handle(SelectMgr_EntityOwner)*)&Tr);
801     Handle(SelectMgr_SelectableObject) SO;
802     if(EO->HasSelectable()){
803       SO = EO->Selectable();
804       IO = *((Handle(AIS_InteractiveObject)*)&SO);
805     }
806   }
807   return IO;
808 }
809 //==================================================
810 // Function: 
811 // Purpose :
812 //==================================================
813 Handle(SelectMgr_EntityOwner) AIS_LocalContext::
814 SelectedOwner() const 
815 {
816   Handle(SelectMgr_EntityOwner) EO;
817   Handle(Standard_Transient) Tr = AIS_Selection::CurrentSelection()->Value();
818   if( !Tr.IsNull() )
819         EO = *((Handle(SelectMgr_EntityOwner)*)&Tr);
820   return EO;
821 }
822
823 //==================================================
824 // Function: 
825 // Purpose :
826 //==================================================
827 Standard_Boolean AIS_LocalContext::
828 HasApplicative() const 
829 {
830   Handle(AIS_InteractiveObject) IO = SelectedInteractive();
831   if( IO.IsNull() ) return Standard_False;
832   return IO->HasOwner();
833 }
834
835 //==================================================
836 // Function: 
837 // Purpose :
838 //==================================================
839 const Handle(Standard_Transient)& AIS_LocalContext::
840 SelectedApplicative() const 
841 {
842   return SelectedInteractive()->GetOwner();
843 }
844
845
846
847 //=======================================================================
848 //function : UpdateSelection
849 //purpose  : should disappear...
850 //=======================================================================
851 void AIS_LocalContext::UpdateSelected(const Standard_Boolean updateviewer)
852 {
853   UnhilightPicked(Standard_False);
854   HilightPicked(updateviewer);
855 }
856
857 //================================================================
858 // Function : UpdateSelected
859 // Purpose  : Part of advanced selection mechanism.
860 //            Highlightes or clears selection presentation for the given IO
861 //================================================================
862 void AIS_LocalContext::UpdateSelected(const Handle(AIS_InteractiveObject)& anobj,
863                                       const Standard_Boolean updateviewer)
864 {
865   if (anobj.IsNull() || anobj->IsAutoHilight())
866     return;
867
868   AIS_Selection::SetCurrentSelection(mySelName.ToCString());
869   Handle(AIS_Selection) Sel = AIS_Selection::CurrentSelection();
870
871   SelectMgr_SequenceOfOwner aSeq;
872   for ( Sel->Init(); Sel->More(); Sel->Next() ){
873     Handle(SelectMgr_EntityOwner) aOwner = Handle(SelectMgr_EntityOwner)::DownCast(Sel->Value());
874
875     if ( !aOwner.IsNull() && aOwner->HasSelectable() && aOwner->Selectable() == anobj )
876       aSeq.Append( aOwner );
877   }
878
879   if ( aSeq.Length() )
880     anobj->HilightSelected( myMainPM, aSeq );
881   else
882     anobj->ClearSelected();
883
884   if(updateviewer){
885      myCTX->CurrentViewer()->Update();
886   }
887 }
888
889 //==================================================
890 // Function: ClearSelected
891 // Purpose :
892 //==================================================
893 void AIS_LocalContext::ClearSelected (const Standard_Boolean updateviewer)
894 {
895   UnhilightPicked(updateviewer);
896   AIS_Selection::SetCurrentSelection(mySelName.ToCString());
897
898   Handle(AIS_Selection) Sel = AIS_Selection::CurrentSelection();
899 #if !defined OCC189 && !defined USE_MAP   
900   const TColStd_Array1OfTransient& Obj = Sel->Objects()->Array1();
901   for(Standard_Integer i =Obj.Lower();i<=Sel->NbStored();i++){
902     const Handle(Standard_Transient)& Tr = Obj(i);
903 #else
904   const AIS_NListTransient& Obj = Sel->Objects();
905   AIS_NListTransient::Iterator anIter( Obj );
906   for(; anIter.More(); anIter.Next()){
907     const Handle(Standard_Transient)& Tr = anIter.Value();
908 #endif
909     if(!Tr.IsNull())
910     {
911       (*((const Handle(SelectMgr_EntityOwner)*)&Tr))->SetSelected (Standard_False);
912     }
913   }
914   AIS_Selection::Select();
915   mylastindex = 0;
916 }
917
918 //==================================================
919 // Function: ClearSelected
920 // Purpose :
921 //==================================================
922 void AIS_LocalContext::ClearSelected (const Handle(AIS_InteractiveObject)& theIO,
923                                       const Standard_Boolean toUpdateViewer)
924 {
925   // Keep last detected object for lastindex initialization.
926   Handle(SelectMgr_EntityOwner) aLastPicked = myMainVS->OnePicked();
927
928   // Remove the interactive object from detected sequence
929   for (Standard_Integer anIdx = 1; anIdx <= myAISDetectedSeq.Length(); ++anIdx)
930   {
931     Handle(AIS_InteractiveObject) aDetectedIO = myAISDetectedSeq.Value (anIdx);
932     if (!aDetectedIO.IsNull() && aDetectedIO == theIO)
933     {
934       myAISDetectedSeq.Remove (anIdx--);
935     }
936   }
937
938   Standard_Integer aHilightMode = theIO->HasHilightMode() ? theIO->HilightMode() : 0;
939
940   // Remove entity owners from AIS_Selection
941   Handle(AIS_Selection) aSelection = AIS_Selection::Selection (mySelName.ToCString());
942   AIS_NListTransient::Iterator anIter (aSelection->Objects());
943   AIS_NListTransient aRemoveEntites;
944   for (; anIter.More(); anIter.Next())
945   {
946     Handle(SelectMgr_EntityOwner) anOwner = Handle(SelectMgr_EntityOwner)::DownCast (anIter.Value());
947     if (anOwner.IsNull() || anOwner->Selectable() != theIO)
948     {
949       continue;
950     }
951
952     aRemoveEntites.Append (anOwner);
953
954     if (IsSelected (anOwner))
955     {
956       anOwner->Unhilight (myMainPM, aHilightMode);
957     }
958   }
959   AIS_NListTransient::Iterator anIterRemove (aRemoveEntites);
960   for (; anIterRemove.More(); anIterRemove.Next())
961   {
962     aSelection->Select (anIterRemove.Value());
963   }
964
965   // Remove entity owners from myMapOfOwner
966   SelectMgr_IndexedMapOfOwner anOwnersToKeep;
967   const Handle(V3d_Viewer)& aViewer = myCTX->CurrentViewer();
968   for (Standard_Integer anIdx = 1; anIdx <= myMapOfOwner.Extent(); anIdx++)
969   {
970     Handle(SelectMgr_EntityOwner) anOwner = myMapOfOwner (anIdx);
971     if (anOwner.IsNull())
972     {
973       continue;
974     }
975
976     if (anOwner->Selectable() != theIO)
977     {
978       anOwnersToKeep.Add (anOwner);
979     }
980     else
981     {
982       for (aViewer->InitActiveViews(); aViewer->MoreActiveViews(); aViewer->NextActiveViews())
983       {
984         Unhilight (anOwner, aViewer->ActiveView());
985       }
986     }
987   }
988   myMapOfOwner.Clear();
989   myMapOfOwner.Assign (anOwnersToKeep);
990   mylastindex = myMapOfOwner.FindIndex (aLastPicked);
991
992   if (toUpdateViewer)
993   {
994     aViewer->Update();
995   }
996 }
997
998 //=======================================================================
999 //function : SetSelected
1000 //purpose  : 
1001 //=======================================================================
1002 void AIS_LocalContext::SetSelected(const Handle(AIS_InteractiveObject)& anIObj,
1003                                    const Standard_Boolean updateviewer)
1004 {
1005   if(!IsValidForSelection(anIObj)) return;
1006   UnhilightPicked(Standard_False);
1007   
1008   //1st case, owner already <anIObj> as owner  
1009   // and not separated is found...
1010
1011   Handle(AIS_Selection) sel = AIS_Selection::Selection(mySelName.ToCString());
1012   //Standard_Boolean found(Standard_False);
1013   Handle(Standard_Transient) Tr;
1014   Handle(SelectMgr_EntityOwner) EO = FindSelectedOwnerFromIO(anIObj);
1015   if(EO.IsNull()){
1016     //check if in selection number 0 there is an owner that can be triturated...
1017     if(anIObj->HasSelection(0)){
1018       const Handle(SelectMgr_Selection)& SIOBJ = anIObj->Selection(0);
1019       SIOBJ->Init();
1020       if(SIOBJ->More()){
1021         Handle(SelectBasics_EntityOwner) BO = SIOBJ->Sensitive()->OwnerId();
1022         EO = *((Handle(SelectMgr_EntityOwner)*)&BO);
1023       }
1024     }
1025     if(EO.IsNull()) 
1026       EO = new SelectMgr_EntityOwner(anIObj);
1027   }
1028   
1029   ClearSelected(Standard_False);
1030
1031   AIS_Selection::Select(EO);
1032   EO->SetSelected (Standard_True);
1033
1034   HilightPicked(updateviewer);
1035 }
1036
1037 //=======================================================================
1038 //function : AddOrRemoveSelected
1039 //purpose  : 
1040 //=======================================================================
1041
1042 void AIS_LocalContext::AddOrRemoveSelected(const Handle(AIS_InteractiveObject)& anIObj,
1043                                            const Standard_Boolean updateviewer)
1044 {
1045   if(!IsValidForSelection(anIObj)) return;
1046   UnhilightPicked(Standard_False);
1047   // first check if it is selected...
1048   Handle(SelectMgr_EntityOwner) EO;
1049
1050   EO = FindSelectedOwnerFromIO(anIObj);
1051
1052   if (EO.IsNull())
1053   {
1054     if(anIObj->HasSelection(0))
1055     {
1056       const Handle(SelectMgr_Selection)& SIOBJ = anIObj->Selection(0);
1057       SIOBJ->Init();
1058       if(SIOBJ->More())
1059       {
1060         Handle(SelectBasics_EntityOwner) BO = SIOBJ->Sensitive()->OwnerId();
1061         EO = *((Handle(SelectMgr_EntityOwner)*)&BO);
1062       }
1063     }
1064     if(EO.IsNull())
1065     {
1066       EO = new SelectMgr_EntityOwner(anIObj);
1067     }
1068   }
1069   
1070 //  cout<<"AIS_LocalContext::AddOrRemoveSelected : Selection = "<<mySelName<<endl;
1071   const Handle(AIS_Selection)& S = AIS_Selection::Selection(mySelName.ToCString());
1072   
1073   if (!S.IsNull())
1074   {
1075     AIS_SelectStatus aStatus = S->Select(EO);
1076     EO->SetSelected (aStatus == AIS_SS_Added);
1077   }
1078
1079   HilightPicked(updateviewer);
1080 }
1081
1082 //=======================================================================
1083 //function : AddOrRemoveSelected
1084 //purpose  : To check...
1085 //=======================================================================
1086 void AIS_LocalContext::AddOrRemoveSelected(const TopoDS_Shape& Sh,
1087                                            const Standard_Boolean updateviewer)
1088 {     
1089   UnhilightPicked (Standard_False);
1090   Handle(SelectMgr_EntityOwner) EO = FindSelectedOwnerFromShape(Sh);
1091   if (!EO.IsNull())
1092   {
1093     AIS_Selection::Selection(mySelName.ToCString())->Select(EO);
1094     EO->SetSelected (Standard_True);
1095   }
1096   HilightPicked (updateviewer);
1097 }
1098
1099 void AIS_LocalContext::AddOrRemoveSelected (const Handle(SelectMgr_EntityOwner)& theOwner,
1100                                            const Standard_Boolean toUpdateViewer)
1101 {
1102   if(myAutoHilight)
1103   {
1104     UnhilightPicked (Standard_False);
1105   }
1106
1107   Standard_Boolean toSelect = theOwner->IsSelected() ? Standard_False : Standard_True;
1108
1109   AIS_Selection::Selection (mySelName.ToCString())->Select (theOwner);
1110   theOwner->SetSelected (toSelect);
1111
1112   if(myAutoHilight)
1113   {
1114     HilightPicked (toUpdateViewer);
1115   }
1116 }
1117
1118 //==================================================
1119 // Function: manageDetected
1120 // Purpose :
1121 //==================================================
1122 void AIS_LocalContext::manageDetected (const Handle(SelectMgr_EntityOwner)& thePickOwner,
1123                                        const Handle(V3d_View)&              theView,
1124                                        const Standard_Boolean               theToRedrawImmediate)
1125 {
1126   if (thePickOwner.IsNull())
1127   {
1128     if (theToRedrawImmediate)
1129     {
1130       theView->RedrawImmediate();
1131     }
1132     return;
1133   }
1134
1135   if (!myFilters->IsOk (thePickOwner))
1136   {
1137     if (mylastindex != 0)
1138     {
1139       mylastgood = mylastindex;
1140     }
1141     if (theToRedrawImmediate)
1142     {
1143       theView->RedrawImmediate();
1144     }
1145     return;
1146   }
1147
1148   //=======================================================================================================
1149   // 2 cases : a- object is in the map of picks:
1150   //             1. this is the same index as the last detected: -> Do nothing
1151   //             2. otherwise :
1152   //                  - if lastindex = 0 (no object was detected at the last step)
1153   //                    the object presentation is highlighted and lastindex = index(objet)
1154   //                  - othrwise :
1155   //                           the presentation of the object corresponding to lastindex is "unhighlighted"
1156   //                           it is removed if the object is not visualized but only active
1157   //                           then the presentation of the detected object is highlighted and lastindex = index(objet)
1158   //         b- the object is not in the map of picked objects
1159   //                  - if lastindex != 0 (object detected at the last step) it is unhighlighted ...
1160   //            if the object was decomposed, presentation is created for the detected shape and the couple
1161   //             (Proprietaire,Prs)is added in the map.
1162   //           otherwise the couple(proprietaire, NullPrs) is placed in the map and the interactive object
1163   //           itself is highlighted.
1164   //
1165   //=======================================================================================================
1166
1167   const Standard_Integer aNewIndex = myMapOfOwner.Contains  (thePickOwner)
1168                                    ? myMapOfOwner.FindIndex (thePickOwner)
1169                                    : myMapOfOwner.Add       (thePickOwner);
1170
1171   // For the advanced mesh selection mode the owner indices comparison
1172   // is not effective because in that case only one owner manage the
1173   // selection in current selection mode. It is necessary to check the current detected
1174   // entity and hilight it only if the detected entity is not the same as
1175   // previous detected (IsForcedHilight call)
1176   if (aNewIndex != mylastindex
1177    || thePickOwner->IsForcedHilight())
1178   {
1179     if (mylastindex != 0
1180      && mylastindex <= myMapOfOwner.Extent())
1181     {
1182       const Handle(SelectMgr_EntityOwner)& aLastOwner = myMapOfOwner (mylastindex);
1183       Unhilight (aLastOwner, theView);
1184     }
1185
1186     if (myAutoHilight)
1187     {
1188       if (!thePickOwner->IsSelected() || myCTX->ToHilightSelected())
1189       {
1190         Hilight (thePickOwner, theView);
1191       }
1192       if (theToRedrawImmediate)
1193       {
1194         theView->RedrawImmediate();
1195       }
1196     }
1197
1198     mylastindex = aNewIndex;
1199   }
1200
1201   if (mylastindex)
1202   {
1203     mylastgood = mylastindex;
1204   }
1205 }
1206
1207 //=======================================================================
1208 //function : HasDetectedShape
1209 //purpose  : 
1210 //=======================================================================
1211
1212 Standard_Boolean AIS_LocalContext::HasDetectedShape() const 
1213 {
1214   if(mylastindex==0) return Standard_False;
1215   return IsShape(mylastindex);
1216 }
1217
1218 //=======================================================================
1219 //function : DetectedShape
1220 //purpose  : 
1221 //=======================================================================
1222
1223 const TopoDS_Shape&
1224 AIS_LocalContext::DetectedShape() const
1225 {
1226   static TopoDS_Shape bidsh;
1227   if(mylastindex != 0)
1228   {
1229     Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast(myMapOfOwner(mylastindex));
1230     if(BROwnr.IsNull()) return bidsh;
1231     return BROwnr->Shape();
1232   }
1233   return bidsh;
1234 }                                           
1235
1236 //=======================================================================
1237 //function : DetectedInteractive
1238 //purpose  : 
1239 //=======================================================================
1240
1241 Handle(AIS_InteractiveObject) 
1242 AIS_LocalContext::DetectedInteractive() const 
1243 {
1244   Handle(AIS_InteractiveObject) Iobj;
1245   if(IsValidIndex(mylastindex)){
1246     Handle(SelectMgr_SelectableObject) SO = myMapOfOwner.FindKey(mylastindex)->Selectable();
1247     Iobj = *((Handle(AIS_InteractiveObject)*) &SO);
1248   }
1249   return Iobj;
1250 }
1251 //=======================================================================
1252 //function : DetectedInteractive
1253 //purpose  : 
1254 //=======================================================================
1255 Handle(SelectMgr_EntityOwner) AIS_LocalContext::DetectedOwner() const 
1256 {
1257   Handle(SelectMgr_EntityOwner) bid;
1258   if(!IsValidIndex(mylastindex)) return bid;
1259   return myMapOfOwner.FindKey(mylastindex);
1260 }
1261
1262
1263 //=======================================================================
1264 //function : ComesFromDecomposition
1265 //purpose  : 
1266 //=======================================================================
1267
1268 Standard_Boolean AIS_LocalContext::ComesFromDecomposition(const Standard_Integer PickedIndex) const 
1269 {
1270   const Handle(SelectMgr_EntityOwner)& OWN = myMapOfOwner.FindKey(PickedIndex);
1271   Handle(SelectMgr_SelectableObject) aSel  = OWN->Selectable();
1272   if (myActiveObjects.IsBound (aSel)) { // debug of jmi
1273     const Handle(AIS_LocalStatus)& Stat      = myActiveObjects(aSel);    
1274     return Stat->Decomposed();
1275   }
1276   return Standard_False;
1277 }
1278
1279
1280 //=======================================================================
1281 //function : DisplayAreas
1282 //purpose  : 
1283 //=======================================================================
1284
1285 void AIS_LocalContext::DisplayAreas(const Handle(V3d_View)& aviou)
1286 {
1287     myMainVS->DisplayAreas(aviou);
1288 }
1289
1290 //=======================================================================
1291 //function : ClearAreas
1292 //purpose  : 
1293 //=======================================================================
1294
1295 void AIS_LocalContext::ClearAreas(const Handle(V3d_View)& aviou)
1296 {
1297     myMainVS->ClearAreas(aviou);
1298 }
1299
1300 //=======================================================================
1301 //function : DisplaySensitive
1302 //purpose  : 
1303 //=======================================================================
1304
1305 void AIS_LocalContext::DisplaySensitive(const Handle(V3d_View)& aviou)
1306 {
1307     myMainVS->DisplaySensitive(aviou);
1308 }
1309
1310 //=======================================================================
1311 //function : ClearSensitive
1312 //purpose  : 
1313 //=======================================================================
1314
1315 void AIS_LocalContext::ClearSensitive(const Handle(V3d_View)& aviou)
1316 {
1317     myMainVS->ClearSensitive(aviou);
1318 }
1319
1320
1321 //=======================================================================
1322 //function : IsShape
1323 //purpose  : 
1324 //=======================================================================
1325 Standard_Boolean AIS_LocalContext::IsShape(const Standard_Integer Index) const
1326 {
1327   
1328   if(Handle(StdSelect_BRepOwner)::DownCast(myMapOfOwner.FindKey(Index)).IsNull())
1329     return Standard_False;
1330   return 
1331     ComesFromDecomposition(Index);
1332 }
1333
1334 Standard_Boolean AIS_LocalContext::IsValidForSelection(const Handle(AIS_InteractiveObject)& anIObj) const 
1335 {
1336
1337 #ifdef IMP120701
1338   // Shape was not transfered from AIS_Shape to EntityOwner
1339   Handle(AIS_Shape) shape = Handle(AIS_Shape)::DownCast(anIObj);
1340   if( !shape.IsNull() ) 
1341     return myFilters->IsOk(new StdSelect_BRepOwner(shape->Shape(),shape));
1342 #endif
1343   return myFilters->IsOk(new SelectMgr_EntityOwner(anIObj));
1344 }
1345
1346
1347 //=======================================================================
1348 //function : HilightNextDetected
1349 //purpose  :
1350 //=======================================================================
1351 Standard_Integer AIS_LocalContext::HilightNextDetected (const Handle(V3d_View)& theView,
1352                                                         const Standard_Boolean  theToRedrawImmediate)
1353 {
1354   // go to the next owner
1355   if (myDetectedSeq.IsEmpty())
1356   {
1357     return 0;
1358   }
1359
1360   const Standard_Integer aLen = myDetectedSeq.Length();
1361   if (++myCurDetected > aLen)
1362   {
1363     myCurDetected = 1;
1364   }
1365   Handle(SelectMgr_EntityOwner) anOwner = myMainVS->Picked (myCurDetected);
1366   if (anOwner.IsNull())
1367   {
1368     return 0;
1369   }
1370   manageDetected (anOwner, theView, theToRedrawImmediate);
1371   return myCurDetected;
1372 }
1373
1374 //=======================================================================
1375 //function : HilightPreviousDetected
1376 //purpose  :
1377 //=======================================================================
1378 Standard_Integer AIS_LocalContext::HilightPreviousDetected (const Handle(V3d_View)& theView,
1379                                                             const Standard_Boolean  theToRedrawImmediate)
1380 {
1381   if (myDetectedSeq.IsEmpty())
1382   {
1383     return 0;
1384   }
1385
1386   if (--myCurDetected < 1)
1387   {
1388     myCurDetected = 1;
1389   }
1390   Handle(SelectMgr_EntityOwner) anOwner = myMainVS->Picked (myCurDetected);
1391   if (anOwner.IsNull())
1392   {
1393     return 0;
1394   }
1395
1396   manageDetected (anOwner, theView, theToRedrawImmediate);
1397   return myCurDetected;
1398 }
1399
1400 //=======================================================================
1401 //function : UnhilightLastDetected
1402 //purpose  :
1403 //=======================================================================
1404 Standard_Boolean AIS_LocalContext::UnhilightLastDetected (const Handle(V3d_View)& theView)
1405 {
1406   if (!IsValidIndex (mylastindex))
1407   {
1408     return Standard_False;
1409   }
1410
1411   myMainPM->BeginImmediateDraw();
1412   const Handle(SelectMgr_EntityOwner)& anOwner = myMapOfOwner (mylastindex);
1413   const Standard_Integer aHilightMode = anOwner->HasSelectable()
1414                                       ? GetHiMod (Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable()))
1415                                       : 0;
1416
1417   myMapOfOwner (mylastindex)->Unhilight (myMainPM, aHilightMode);
1418   myMainPM->EndImmediateDraw (theView);
1419   mylastindex = 0;
1420   return Standard_True;
1421 }
1422
1423 //=======================================================================
1424 //function : FindSelectedOwnerFromIO
1425 //purpose  : it is checked if one of the selected owners really presents IObj
1426 //=======================================================================
1427 Handle(SelectMgr_EntityOwner) AIS_LocalContext::FindSelectedOwnerFromIO
1428                           (const Handle(AIS_InteractiveObject)& anIObj) const 
1429 {
1430   Handle(SelectMgr_EntityOwner) EO,bid;
1431   if (anIObj.IsNull()) return EO;
1432   
1433   Handle(AIS_Selection) Sel = AIS_Selection::Selection(mySelName.ToCString());
1434   if(Sel.IsNull()) {
1435 #ifdef DEB
1436     cout<<"\t\tAIS_LocalCOntext::FindSelectedOwnerFromShape : Selection "
1437         <<mySelName<<" Nulle "<<endl;
1438 #endif
1439     return EO;
1440   }
1441   Standard_Boolean found(Standard_False);
1442 #if !defined OCC189 && !defined USE_MAP     
1443   const TColStd_Array1OfTransient& Obj = Sel->Objects()->Array1();
1444   for(Standard_Integer i =Obj.Lower();i<=Sel->NbStored();i++){
1445     const Handle(Standard_Transient)& Tr = Obj(i);
1446 #else
1447   const AIS_NListTransient& Obj = Sel->Objects();
1448   AIS_NListTransient::Iterator anIter( Obj );
1449   for(; anIter.More(); anIter.Next()){
1450     const Handle(Standard_Transient)& Tr = anIter.Value();
1451 #endif
1452     if(!Tr.IsNull()){
1453       EO = *((Handle(SelectMgr_EntityOwner)*)&Tr);
1454       if(EO->HasSelectable()){
1455         Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast(EO);
1456         if(BROwnr.IsNull() || !BROwnr->ComesFromDecomposition()){
1457           if (anIObj == EO->Selectable()){
1458             found =Standard_True;
1459             break;
1460           }
1461         }
1462       }
1463     }
1464   }
1465   if(found)  return EO;
1466   return bid;
1467 }
1468
1469 //=======================================================================
1470 //function : FindSelectedOwnerFromShape
1471 //purpose  : it is checked if one of the selected owners really presents IObj
1472 //=======================================================================
1473 Handle(SelectMgr_EntityOwner) AIS_LocalContext::FindSelectedOwnerFromShape(const TopoDS_Shape& sh) const 
1474 {
1475 #ifdef OCC9026
1476   Handle(SelectMgr_EntityOwner) EO, bid;
1477 #else
1478   Handle(SelectMgr_EntityOwner) EO;
1479 #endif
1480   if (sh.IsNull()) return EO;
1481   
1482   Handle(AIS_Selection) Sel = AIS_Selection::Selection(mySelName.ToCString());
1483   if(Sel.IsNull()) {
1484 #ifdef DEB
1485     cout<<"\t\tAIS_LocalCOntext::FindSelectedOwnerFromShape : Selection "<<mySelName<<" Nulle "<<endl;
1486 #endif
1487     return EO;
1488   }
1489   
1490   Standard_Boolean found(Standard_False);
1491
1492 #ifdef OCC9026
1493   if (!found) {
1494     SelectMgr_DataMapIteratorOfDataMapOfIntegerSensitive aSensitiveIt (myMainVS->Primitives());
1495     for (; aSensitiveIt.More(); aSensitiveIt.Next()) {
1496       EO = Handle(SelectMgr_EntityOwner)::DownCast (aSensitiveIt.Value()->OwnerId());
1497       Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast(EO);
1498       if (!BROwnr.IsNull() && BROwnr->HasShape() && BROwnr->Shape() == sh) {
1499          found = Standard_True;
1500          break;
1501       }
1502     }
1503   }
1504 #else
1505 #if !defined OCC189 && !defined USE_MAP   
1506   const TColStd_Array1OfTransient& Obj = Sel->Objects()->Array1();
1507   for(Standard_Integer i =Obj.Lower();i<=Sel->NbStored();i++){
1508     const Handle(Standard_Transient)& Tr = Obj(i);
1509 #else
1510   const AIS_NListTransient& Obj = Sel->Objects();
1511   AIS_NListTransient::Iterator anIter( Obj );
1512   for(; anIter.More(); anIter.Next()){
1513     const Handle(Standard_Transient)& Tr = anIter.Value();
1514 #endif
1515     if(!Tr.IsNull()){
1516       
1517       EO = *((Handle(SelectMgr_EntityOwner)*)&Tr);
1518       if(EO->HasShape())
1519         if ( EO->Shape() == sh)
1520           found =Standard_True;
1521           break;
1522     }
1523   }
1524 #endif
1525
1526   if(found)  return EO;
1527   return bid;
1528 }
1529
1530 #ifdef IMP160701
1531 //=======================================================================
1532 //function : AIS_LocalContext::InitDetected
1533 //purpose  :
1534 //=======================================================================
1535 void AIS_LocalContext::InitDetected()
1536 {
1537   myAISCurDetected = myAISDetectedSeq.Length()? 1 : 0;
1538 }
1539
1540 //=======================================================================
1541 //function : AIS_LocalContext::MoreDetected
1542 //purpose  :
1543 //=======================================================================
1544 Standard_Boolean AIS_LocalContext::MoreDetected() const
1545 {
1546   return (myAISCurDetected > 0 && myAISCurDetected <= myAISDetectedSeq.Length());
1547 }
1548
1549 //=======================================================================
1550 //function : AIS_LocalContext::NextDetected
1551 //purpose  :
1552 //=======================================================================
1553 void AIS_LocalContext::NextDetected()
1554 {
1555   myAISCurDetected++;
1556 }
1557
1558 //=======================================================================
1559 //function : DetectedCurrentShape
1560 //purpose  :
1561 //=======================================================================
1562 const TopoDS_Shape& AIS_LocalContext::DetectedCurrentShape() const
1563 {
1564   static TopoDS_Shape aDummyShape;
1565
1566   Handle(AIS_Shape) aCurrentShape = Handle(AIS_Shape)::DownCast (DetectedCurrentObject());
1567
1568   if (aCurrentShape.IsNull())
1569   {
1570     return aDummyShape;
1571   }
1572
1573   return aCurrentShape->Shape();
1574 }
1575 //=======================================================================
1576 //function : DetectedCurrentObject
1577 //purpose  :
1578 //=======================================================================
1579 Handle(AIS_InteractiveObject) AIS_LocalContext::DetectedCurrentObject() const
1580 {
1581   return MoreDetected() ? myAISDetectedSeq(myAISCurDetected) : NULL;
1582 }
1583 #endif