0024837: Visualization - revise design and implementation of connected Interactive...
[occt.git] / src / AIS / AIS_LocalContext_1.cxx
... / ...
CommitLineData
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
104static 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//==================================================
113AIS_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//=======================================================================
188AIS_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//=======================================================================
242AIS_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//==================================================
301AIS_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//=======================================================================
361AIS_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//=======================================================================
410AIS_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//==================================================
468AIS_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//==================================================
520void 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//==================================================
538void 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//=======================================================================
565void 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//==================================================
638void 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//=======================================================================
710Standard_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
720Standard_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//==================================================
729void AIS_LocalContext::
730InitSelected()
731{
732 AIS_Selection::SetCurrentSelection(mySelName.ToCString());
733 AIS_Selection::CurrentSelection()->Init();
734}
735
736//==================================================
737// Function:
738// Purpose :
739//==================================================
740Standard_Boolean AIS_LocalContext::
741MoreSelected() const
742{
743 return AIS_Selection::CurrentSelection()->More();
744}
745
746//==================================================
747// Function:
748// Purpose :
749//==================================================
750void AIS_LocalContext::
751NextSelected()
752{
753 AIS_Selection::CurrentSelection()->Next();
754}
755
756//==================================================
757// Function:
758// Purpose :
759//==================================================
760Standard_Boolean AIS_LocalContext::
761HasShape() 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//==================================================
777TopoDS_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//==================================================
794Handle(AIS_InteractiveObject) AIS_LocalContext::
795SelectedInteractive() 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//==================================================
813Handle(SelectMgr_EntityOwner) AIS_LocalContext::
814SelectedOwner() 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//==================================================
827Standard_Boolean AIS_LocalContext::
828HasApplicative() 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//==================================================
839const Handle(Standard_Transient)& AIS_LocalContext::
840SelectedApplicative() const
841{
842 return SelectedInteractive()->GetOwner();
843}
844
845
846
847//=======================================================================
848//function : UpdateSelection
849//purpose : should disappear...
850//=======================================================================
851void 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//================================================================
862void 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//==================================================
893void 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//=======================================================================
920//function : SetSelected
921//purpose :
922//=======================================================================
923void AIS_LocalContext::SetSelected(const Handle(AIS_InteractiveObject)& anIObj,
924 const Standard_Boolean updateviewer)
925{
926 if(!IsValidForSelection(anIObj)) return;
927 UnhilightPicked(Standard_False);
928
929 //1st case, owner already <anIObj> as owner
930 // and not separated is found...
931
932 Handle(AIS_Selection) sel = AIS_Selection::Selection(mySelName.ToCString());
933 //Standard_Boolean found(Standard_False);
934 Handle(Standard_Transient) Tr;
935 Handle(SelectMgr_EntityOwner) EO = FindSelectedOwnerFromIO(anIObj);
936 if(EO.IsNull()){
937 //check if in selection number 0 there is an owner that can be triturated...
938 if(anIObj->HasSelection(0)){
939 const Handle(SelectMgr_Selection)& SIOBJ = anIObj->Selection(0);
940 SIOBJ->Init();
941 if(SIOBJ->More()){
942 Handle(SelectBasics_EntityOwner) BO = SIOBJ->Sensitive()->OwnerId();
943 EO = *((Handle(SelectMgr_EntityOwner)*)&BO);
944 }
945 }
946 if(EO.IsNull())
947 EO = new SelectMgr_EntityOwner(anIObj);
948 }
949
950 ClearSelected(Standard_False);
951
952 AIS_Selection::Select(EO);
953 EO->SetSelected (Standard_True);
954
955 HilightPicked(updateviewer);
956}
957
958//=======================================================================
959//function : AddOrRemoveSelected
960//purpose :
961//=======================================================================
962
963void AIS_LocalContext::AddOrRemoveSelected(const Handle(AIS_InteractiveObject)& anIObj,
964 const Standard_Boolean updateviewer)
965{
966 if(!IsValidForSelection(anIObj)) return;
967 UnhilightPicked(Standard_False);
968 // first check if it is selected...
969 Handle(SelectMgr_EntityOwner) EO;
970
971 EO = FindSelectedOwnerFromIO(anIObj);
972
973 if (EO.IsNull())
974 {
975 if(anIObj->HasSelection(0))
976 {
977 const Handle(SelectMgr_Selection)& SIOBJ = anIObj->Selection(0);
978 SIOBJ->Init();
979 if(SIOBJ->More())
980 {
981 Handle(SelectBasics_EntityOwner) BO = SIOBJ->Sensitive()->OwnerId();
982 EO = *((Handle(SelectMgr_EntityOwner)*)&BO);
983 }
984 }
985 if(EO.IsNull())
986 {
987 EO = new SelectMgr_EntityOwner(anIObj);
988 }
989 }
990
991// cout<<"AIS_LocalContext::AddOrRemoveSelected : Selection = "<<mySelName<<endl;
992 const Handle(AIS_Selection)& S = AIS_Selection::Selection(mySelName.ToCString());
993
994 if (!S.IsNull())
995 {
996 AIS_SelectStatus aStatus = S->Select(EO);
997 EO->SetSelected (aStatus == AIS_SS_Added);
998 }
999
1000 HilightPicked(updateviewer);
1001}
1002
1003//=======================================================================
1004//function : AddOrRemoveSelected
1005//purpose : To check...
1006//=======================================================================
1007void AIS_LocalContext::AddOrRemoveSelected(const TopoDS_Shape& Sh,
1008 const Standard_Boolean updateviewer)
1009{
1010 UnhilightPicked (Standard_False);
1011 Handle(SelectMgr_EntityOwner) EO = FindSelectedOwnerFromShape(Sh);
1012 if (!EO.IsNull())
1013 {
1014 AIS_Selection::Selection(mySelName.ToCString())->Select(EO);
1015 EO->SetSelected (Standard_True);
1016 }
1017 HilightPicked (updateviewer);
1018}
1019
1020void AIS_LocalContext::AddOrRemoveSelected (const Handle(SelectMgr_EntityOwner)& theOwner,
1021 const Standard_Boolean toUpdateViewer)
1022{
1023 if(myAutoHilight)
1024 {
1025 UnhilightPicked (Standard_False);
1026 }
1027
1028 Standard_Boolean toSelect = theOwner->IsSelected() ? Standard_False : Standard_True;
1029
1030 AIS_Selection::Selection (mySelName.ToCString())->Select (theOwner);
1031 theOwner->SetSelected (toSelect);
1032
1033 if(myAutoHilight)
1034 {
1035 HilightPicked (toUpdateViewer);
1036 }
1037}
1038
1039//==================================================
1040// Function: manageDetected
1041// Purpose :
1042//==================================================
1043void AIS_LocalContext::manageDetected (const Handle(SelectMgr_EntityOwner)& thePickOwner,
1044 const Handle(V3d_View)& theView,
1045 const Standard_Boolean theToRedrawImmediate)
1046{
1047 if (thePickOwner.IsNull())
1048 {
1049 if (theToRedrawImmediate)
1050 {
1051 theView->RedrawImmediate();
1052 }
1053 return;
1054 }
1055
1056 if (!myFilters->IsOk (thePickOwner))
1057 {
1058 if (mylastindex != 0)
1059 {
1060 mylastgood = mylastindex;
1061 }
1062 if (theToRedrawImmediate)
1063 {
1064 theView->RedrawImmediate();
1065 }
1066 return;
1067 }
1068
1069 //=======================================================================================================
1070 // 2 cases : a- object is in the map of picks:
1071 // 1. this is the same index as the last detected: -> Do nothing
1072 // 2. otherwise :
1073 // - if lastindex = 0 (no object was detected at the last step)
1074 // the object presentation is highlighted and lastindex = index(objet)
1075 // - othrwise :
1076 // the presentation of the object corresponding to lastindex is "unhighlighted"
1077 // it is removed if the object is not visualized but only active
1078 // then the presentation of the detected object is highlighted and lastindex = index(objet)
1079 // b- the object is not in the map of picked objects
1080 // - if lastindex != 0 (object detected at the last step) it is unhighlighted ...
1081 // if the object was decomposed, presentation is created for the detected shape and the couple
1082 // (Proprietaire,Prs)is added in the map.
1083 // otherwise the couple(proprietaire, NullPrs) is placed in the map and the interactive object
1084 // itself is highlighted.
1085 //
1086 //=======================================================================================================
1087
1088 const Standard_Integer aNewIndex = myMapOfOwner.Contains (thePickOwner)
1089 ? myMapOfOwner.FindIndex (thePickOwner)
1090 : myMapOfOwner.Add (thePickOwner);
1091
1092 // For the advanced mesh selection mode the owner indices comparison
1093 // is not effective because in that case only one owner manage the
1094 // selection in current selection mode. It is necessary to check the current detected
1095 // entity and hilight it only if the detected entity is not the same as
1096 // previous detected (IsForcedHilight call)
1097 if (aNewIndex != mylastindex
1098 || thePickOwner->IsForcedHilight())
1099 {
1100 if (mylastindex != 0
1101 && mylastindex <= myMapOfOwner.Extent())
1102 {
1103 const Handle(SelectMgr_EntityOwner)& aLastOwner = myMapOfOwner (mylastindex);
1104 Unhilight (aLastOwner, theView);
1105 }
1106
1107 if (myAutoHilight)
1108 {
1109 if (!thePickOwner->IsSelected() || myCTX->ToHilightSelected())
1110 {
1111 Hilight (thePickOwner, theView);
1112 }
1113 if (theToRedrawImmediate)
1114 {
1115 theView->RedrawImmediate();
1116 }
1117 }
1118
1119 mylastindex = aNewIndex;
1120 }
1121
1122 if (mylastindex)
1123 {
1124 mylastgood = mylastindex;
1125 }
1126}
1127
1128//=======================================================================
1129//function : HasDetectedShape
1130//purpose :
1131//=======================================================================
1132
1133Standard_Boolean AIS_LocalContext::HasDetectedShape() const
1134{
1135 if(mylastindex==0) return Standard_False;
1136 return IsShape(mylastindex);
1137}
1138
1139//=======================================================================
1140//function : DetectedShape
1141//purpose :
1142//=======================================================================
1143
1144const TopoDS_Shape&
1145AIS_LocalContext::DetectedShape() const
1146{
1147 static TopoDS_Shape bidsh;
1148 if(mylastindex != 0)
1149 {
1150 Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast(myMapOfOwner(mylastindex));
1151 if(BROwnr.IsNull()) return bidsh;
1152 return BROwnr->Shape();
1153 }
1154 return bidsh;
1155}
1156
1157//=======================================================================
1158//function : DetectedInteractive
1159//purpose :
1160//=======================================================================
1161
1162Handle(AIS_InteractiveObject)
1163AIS_LocalContext::DetectedInteractive() const
1164{
1165 Handle(AIS_InteractiveObject) Iobj;
1166 if(IsValidIndex(mylastindex)){
1167 Handle(SelectMgr_SelectableObject) SO = myMapOfOwner.FindKey(mylastindex)->Selectable();
1168 Iobj = *((Handle(AIS_InteractiveObject)*) &SO);
1169 }
1170 return Iobj;
1171}
1172//=======================================================================
1173//function : DetectedInteractive
1174//purpose :
1175//=======================================================================
1176Handle(SelectMgr_EntityOwner) AIS_LocalContext::DetectedOwner() const
1177{
1178 Handle(SelectMgr_EntityOwner) bid;
1179 if(!IsValidIndex(mylastindex)) return bid;
1180 return myMapOfOwner.FindKey(mylastindex);
1181}
1182
1183
1184//=======================================================================
1185//function : ComesFromDecomposition
1186//purpose :
1187//=======================================================================
1188
1189Standard_Boolean AIS_LocalContext::ComesFromDecomposition(const Standard_Integer PickedIndex) const
1190{
1191 const Handle(SelectMgr_EntityOwner)& OWN = myMapOfOwner.FindKey(PickedIndex);
1192 Handle(SelectMgr_SelectableObject) aSel = OWN->Selectable();
1193 if (myActiveObjects.IsBound (aSel)) { // debug of jmi
1194 const Handle(AIS_LocalStatus)& Stat = myActiveObjects(aSel);
1195 return Stat->Decomposed();
1196 }
1197 return Standard_False;
1198}
1199
1200
1201//=======================================================================
1202//function : DisplayAreas
1203//purpose :
1204//=======================================================================
1205
1206void AIS_LocalContext::DisplayAreas(const Handle(V3d_View)& aviou)
1207{
1208 myMainVS->DisplayAreas(aviou);
1209}
1210
1211//=======================================================================
1212//function : ClearAreas
1213//purpose :
1214//=======================================================================
1215
1216void AIS_LocalContext::ClearAreas(const Handle(V3d_View)& aviou)
1217{
1218 myMainVS->ClearAreas(aviou);
1219}
1220
1221//=======================================================================
1222//function : DisplaySensitive
1223//purpose :
1224//=======================================================================
1225
1226void AIS_LocalContext::DisplaySensitive(const Handle(V3d_View)& aviou)
1227{
1228 myMainVS->DisplaySensitive(aviou);
1229}
1230
1231//=======================================================================
1232//function : ClearSensitive
1233//purpose :
1234//=======================================================================
1235
1236void AIS_LocalContext::ClearSensitive(const Handle(V3d_View)& aviou)
1237{
1238 myMainVS->ClearSensitive(aviou);
1239}
1240
1241
1242//=======================================================================
1243//function : IsShape
1244//purpose :
1245//=======================================================================
1246Standard_Boolean AIS_LocalContext::IsShape(const Standard_Integer Index) const
1247{
1248
1249 if(Handle(StdSelect_BRepOwner)::DownCast(myMapOfOwner.FindKey(Index)).IsNull())
1250 return Standard_False;
1251 return
1252 ComesFromDecomposition(Index);
1253}
1254
1255Standard_Boolean AIS_LocalContext::IsValidForSelection(const Handle(AIS_InteractiveObject)& anIObj) const
1256{
1257
1258#ifdef IMP120701
1259 // Shape was not transfered from AIS_Shape to EntityOwner
1260 Handle(AIS_Shape) shape = Handle(AIS_Shape)::DownCast(anIObj);
1261 if( !shape.IsNull() )
1262 return myFilters->IsOk(new StdSelect_BRepOwner(shape->Shape(),shape));
1263#endif
1264 return myFilters->IsOk(new SelectMgr_EntityOwner(anIObj));
1265}
1266
1267
1268//=======================================================================
1269//function : HilightNextDetected
1270//purpose :
1271//=======================================================================
1272Standard_Integer AIS_LocalContext::HilightNextDetected (const Handle(V3d_View)& theView,
1273 const Standard_Boolean theToRedrawImmediate)
1274{
1275 // go to the next owner
1276 if (myDetectedSeq.IsEmpty())
1277 {
1278 return 0;
1279 }
1280
1281 const Standard_Integer aLen = myDetectedSeq.Length();
1282 if (++myCurDetected > aLen)
1283 {
1284 myCurDetected = 1;
1285 }
1286 Handle(SelectMgr_EntityOwner) anOwner = myMainVS->Picked (myCurDetected);
1287 if (anOwner.IsNull())
1288 {
1289 return 0;
1290 }
1291 manageDetected (anOwner, theView, theToRedrawImmediate);
1292 return myCurDetected;
1293}
1294
1295//=======================================================================
1296//function : HilightPreviousDetected
1297//purpose :
1298//=======================================================================
1299Standard_Integer AIS_LocalContext::HilightPreviousDetected (const Handle(V3d_View)& theView,
1300 const Standard_Boolean theToRedrawImmediate)
1301{
1302 if (myDetectedSeq.IsEmpty())
1303 {
1304 return 0;
1305 }
1306
1307 if (--myCurDetected < 1)
1308 {
1309 myCurDetected = 1;
1310 }
1311 Handle(SelectMgr_EntityOwner) anOwner = myMainVS->Picked (myCurDetected);
1312 if (anOwner.IsNull())
1313 {
1314 return 0;
1315 }
1316
1317 manageDetected (anOwner, theView, theToRedrawImmediate);
1318 return myCurDetected;
1319}
1320
1321//=======================================================================
1322//function : UnhilightLastDetected
1323//purpose :
1324//=======================================================================
1325Standard_Boolean AIS_LocalContext::UnhilightLastDetected (const Handle(V3d_View)& theView)
1326{
1327 if (!IsValidIndex (mylastindex))
1328 {
1329 return Standard_False;
1330 }
1331
1332 myMainPM->BeginImmediateDraw();
1333 const Handle(SelectMgr_EntityOwner)& anOwner = myMapOfOwner (mylastindex);
1334 const Standard_Integer aHilightMode = anOwner->HasSelectable()
1335 ? GetHiMod (Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable()))
1336 : 0;
1337
1338 myMapOfOwner (mylastindex)->Unhilight (myMainPM, aHilightMode);
1339 myMainPM->EndImmediateDraw (theView);
1340 mylastindex = 0;
1341 return Standard_True;
1342}
1343
1344//=======================================================================
1345//function : FindSelectedOwnerFromIO
1346//purpose : it is checked if one of the selected owners really presents IObj
1347//=======================================================================
1348Handle(SelectMgr_EntityOwner) AIS_LocalContext::FindSelectedOwnerFromIO
1349 (const Handle(AIS_InteractiveObject)& anIObj) const
1350{
1351 Handle(SelectMgr_EntityOwner) EO,bid;
1352 if (anIObj.IsNull()) return EO;
1353
1354 Handle(AIS_Selection) Sel = AIS_Selection::Selection(mySelName.ToCString());
1355 if(Sel.IsNull()) {
1356#ifdef DEB
1357 cout<<"\t\tAIS_LocalCOntext::FindSelectedOwnerFromShape : Selection "
1358 <<mySelName<<" Nulle "<<endl;
1359#endif
1360 return EO;
1361 }
1362 Standard_Boolean found(Standard_False);
1363#if !defined OCC189 && !defined USE_MAP
1364 const TColStd_Array1OfTransient& Obj = Sel->Objects()->Array1();
1365 for(Standard_Integer i =Obj.Lower();i<=Sel->NbStored();i++){
1366 const Handle(Standard_Transient)& Tr = Obj(i);
1367#else
1368 const AIS_NListTransient& Obj = Sel->Objects();
1369 AIS_NListTransient::Iterator anIter( Obj );
1370 for(; anIter.More(); anIter.Next()){
1371 const Handle(Standard_Transient)& Tr = anIter.Value();
1372#endif
1373 if(!Tr.IsNull()){
1374 EO = *((Handle(SelectMgr_EntityOwner)*)&Tr);
1375 if(EO->HasSelectable()){
1376 Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast(EO);
1377 if(BROwnr.IsNull() || !BROwnr->ComesFromDecomposition()){
1378 if (anIObj == EO->Selectable()){
1379 found =Standard_True;
1380 break;
1381 }
1382 }
1383 }
1384 }
1385 }
1386 if(found) return EO;
1387 return bid;
1388}
1389
1390//=======================================================================
1391//function : FindSelectedOwnerFromShape
1392//purpose : it is checked if one of the selected owners really presents IObj
1393//=======================================================================
1394Handle(SelectMgr_EntityOwner) AIS_LocalContext::FindSelectedOwnerFromShape(const TopoDS_Shape& sh) const
1395{
1396#ifdef OCC9026
1397 Handle(SelectMgr_EntityOwner) EO, bid;
1398#else
1399 Handle(SelectMgr_EntityOwner) EO;
1400#endif
1401 if (sh.IsNull()) return EO;
1402
1403 Handle(AIS_Selection) Sel = AIS_Selection::Selection(mySelName.ToCString());
1404 if(Sel.IsNull()) {
1405#ifdef DEB
1406 cout<<"\t\tAIS_LocalCOntext::FindSelectedOwnerFromShape : Selection "<<mySelName<<" Nulle "<<endl;
1407#endif
1408 return EO;
1409 }
1410
1411 Standard_Boolean found(Standard_False);
1412
1413#ifdef OCC9026
1414 if (!found) {
1415 SelectMgr_DataMapIteratorOfDataMapOfIntegerSensitive aSensitiveIt (myMainVS->Primitives());
1416 for (; aSensitiveIt.More(); aSensitiveIt.Next()) {
1417 EO = Handle(SelectMgr_EntityOwner)::DownCast (aSensitiveIt.Value()->OwnerId());
1418 Handle(StdSelect_BRepOwner) BROwnr = Handle(StdSelect_BRepOwner)::DownCast(EO);
1419 if (!BROwnr.IsNull() && BROwnr->HasShape() && BROwnr->Shape() == sh) {
1420 found = Standard_True;
1421 break;
1422 }
1423 }
1424 }
1425#else
1426#if !defined OCC189 && !defined USE_MAP
1427 const TColStd_Array1OfTransient& Obj = Sel->Objects()->Array1();
1428 for(Standard_Integer i =Obj.Lower();i<=Sel->NbStored();i++){
1429 const Handle(Standard_Transient)& Tr = Obj(i);
1430#else
1431 const AIS_NListTransient& Obj = Sel->Objects();
1432 AIS_NListTransient::Iterator anIter( Obj );
1433 for(; anIter.More(); anIter.Next()){
1434 const Handle(Standard_Transient)& Tr = anIter.Value();
1435#endif
1436 if(!Tr.IsNull()){
1437
1438 EO = *((Handle(SelectMgr_EntityOwner)*)&Tr);
1439 if(EO->HasShape())
1440 if ( EO->Shape() == sh)
1441 found =Standard_True;
1442 break;
1443 }
1444 }
1445#endif
1446
1447 if(found) return EO;
1448 return bid;
1449}
1450
1451#ifdef IMP160701
1452//=======================================================================
1453//function : AIS_LocalContext::InitDetected
1454//purpose :
1455//=======================================================================
1456void AIS_LocalContext::InitDetected()
1457{
1458 myAISCurDetected = myAISDetectedSeq.Length()? 1 : 0;
1459}
1460
1461//=======================================================================
1462//function : AIS_LocalContext::MoreDetected
1463//purpose :
1464//=======================================================================
1465Standard_Boolean AIS_LocalContext::MoreDetected() const
1466{
1467 return (myAISCurDetected > 0 && myAISCurDetected <= myAISDetectedSeq.Length());
1468}
1469
1470//=======================================================================
1471//function : AIS_LocalContext::NextDetected
1472//purpose :
1473//=======================================================================
1474void AIS_LocalContext::NextDetected()
1475{
1476 myAISCurDetected++;
1477}
1478
1479//=======================================================================
1480//function : DetectedCurrentShape
1481//purpose :
1482//=======================================================================
1483const TopoDS_Shape& AIS_LocalContext::DetectedCurrentShape() const
1484{
1485 static TopoDS_Shape aDummyShape;
1486
1487 Handle(AIS_Shape) aCurrentShape = Handle(AIS_Shape)::DownCast (DetectedCurrentObject());
1488
1489 if (aCurrentShape.IsNull())
1490 {
1491 return aDummyShape;
1492 }
1493
1494 return aCurrentShape->Shape();
1495}
1496//=======================================================================
1497//function : DetectedCurrentObject
1498//purpose :
1499//=======================================================================
1500Handle(AIS_InteractiveObject) AIS_LocalContext::DetectedCurrentObject() const
1501{
1502 return MoreDetected() ? myAISDetectedSeq(myAISCurDetected) : NULL;
1503}
1504#endif