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