0029112: Visualization - compilation fails on Ubuntu with libavutil 54.x (FFmpeg...
[occt.git] / src / AIS / AIS_InteractiveContext_1.cxx
CommitLineData
b311480e 1// Created on: 1997-01-29
2// Created by: Robert COUBLANC
3// Copyright (c) 1997-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.
7fd59977 16
7fd59977 17
18#include <AIS_DataMapIteratorOfDataMapOfIOStatus.hxx>
7fd59977 19#include <AIS_GlobalStatus.hxx>
42cf5bc1 20#include <AIS_InteractiveContext.hxx>
21#include <AIS_InteractiveObject.hxx>
22#include <AIS_LocalContext.hxx>
23#include <AIS_MapIteratorOfMapOfInteractive.hxx>
24#include <AIS_MapOfInteractive.hxx>
25#include <AIS_Selection.hxx>
7fd59977 26#include <AIS_Shape.hxx>
42cf5bc1 27#include <AIS_StatusOfDetection.hxx>
28#include <AIS_StatusOfPick.hxx>
679ecdee 29#include <Aspect_Grid.hxx>
42cf5bc1 30#include <Prs3d_BasicAspect.hxx>
31#include <Prs3d_LineAspect.hxx>
32#include <Prs3d_Presentation.hxx>
33#include <Quantity_Color.hxx>
34#include <SelectBasics_SensitiveEntity.hxx>
35#include <SelectMgr_EntityOwner.hxx>
36#include <SelectMgr_Filter.hxx>
37#include <SelectMgr_OrFilter.hxx>
38#include <SelectMgr_Selection.hxx>
39#include <SelectMgr_SelectionManager.hxx>
40#include <Standard_Transient.hxx>
c3282ec1 41#include <StdSelect_BRepOwner.hxx>
42cf5bc1 42#include <StdSelect_ViewerSelector3d.hxx>
43#include <TCollection_AsciiString.hxx>
44#include <TCollection_ExtendedString.hxx>
45#include <TColStd_ListIteratorOfListOfInteger.hxx>
46#include <TopLoc_Location.hxx>
42cf5bc1 47#include <V3d_AmbientLight.hxx>
48#include <V3d_DirectionalLight.hxx>
7fd59977 49#include <V3d_Light.hxx>
50#include <V3d_PositionalLight.hxx>
51#include <V3d_SpotLight.hxx>
42cf5bc1 52#include <V3d_View.hxx>
53#include <V3d_Viewer.hxx>
7fd59977 54
c3282ec1 55typedef NCollection_DataMap<Handle(AIS_InteractiveObject), NCollection_Handle<SelectMgr_SequenceOfOwner> > AIS_MapOfObjSelectedOwners;
56
016e5959 57namespace
58{
896faa72 59 TopoDS_Shape AIS_InteractiveContext_myDummyShape;
016e5959 60}
61
c3282ec1 62//=======================================================================
63//function : highlightWithColor
64//purpose :
65//=======================================================================
66void AIS_InteractiveContext::highlightWithColor (const Handle(SelectMgr_EntityOwner)& theOwner,
c3282ec1 67 const Handle(V3d_Viewer)& theViewer)
68{
f838dac4 69 const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
c3282ec1 70 if (anObj.IsNull())
f838dac4 71 {
c3282ec1 72 return;
f838dac4 73 }
74
75 const Handle(Prs3d_Drawer)& aStyle = getHiStyle (anObj, theOwner);
76 const Standard_Integer aHiMode = getHilightMode (anObj, aStyle, -1);
c3282ec1 77
78 myMainPM->BeginImmediateDraw();
f838dac4 79 theOwner->HilightWithColor (myMainPM, aStyle, aHiMode);
c3282ec1 80 myMainPM->EndImmediateDraw (theViewer.IsNull() ? myMainVwr : theViewer);
81}
82
83//=======================================================================
84//function : highlightSelected
85//purpose :
86//=======================================================================
8e5fb5ea 87void AIS_InteractiveContext::highlightSelected (const Handle(SelectMgr_EntityOwner)& theOwner)
c3282ec1 88{
f838dac4 89 const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
c3282ec1 90 if (anObj.IsNull())
f838dac4 91 {
c3282ec1 92 return;
f838dac4 93 }
c3282ec1 94
95 if (!theOwner->IsAutoHilight())
96 {
c3282ec1 97 SelectMgr_SequenceOfOwner aSeq;
02974a19 98 for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
c3282ec1 99 {
8e5fb5ea 100 if (aSelIter.Value()->IsSameSelectable (anObj))
02974a19 101 {
102 aSeq.Append (aSelIter.Value());
103 }
c3282ec1 104 }
105 anObj->HilightSelected (myMainPM, aSeq);
106 }
107 else
108 {
f838dac4 109 const Handle(Prs3d_Drawer)& aStyle = getSelStyle (anObj, theOwner);
110 const Standard_Integer aHiMode = getHilightMode (anObj, aStyle, -1);
111 theOwner->HilightWithColor (myMainPM, aStyle, aHiMode);
8e5fb5ea 112 }
113}
114
115//=======================================================================
116//function : highlightGlobal
117//purpose :
118//=======================================================================
119void AIS_InteractiveContext::highlightGlobal (const Handle(AIS_InteractiveObject)& theObj,
f838dac4 120 const Handle(Prs3d_Drawer)& theStyle,
121 const Standard_Integer theDispMode) const
8e5fb5ea 122{
123 if (theObj.IsNull())
f838dac4 124 {
8e5fb5ea 125 return;
f838dac4 126 }
127
128 const Standard_Integer aHiMode = getHilightMode (theObj, theStyle, theDispMode);
8e5fb5ea 129 const Handle(SelectMgr_EntityOwner)& aGlobOwner = theObj->GlobalSelOwner();
130
131 if (aGlobOwner.IsNull())
132 {
f838dac4 133 myMainPM->Color (theObj, theStyle, aHiMode);
8e5fb5ea 134 return;
135 }
136
137 if (!aGlobOwner->IsAutoHilight())
138 {
139 SelectMgr_SequenceOfOwner aSeq;
140 for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
141 {
142 if (aSelIter.Value()->IsSameSelectable (theObj))
143 {
144 aSeq.Append (aSelIter.Value());
145 }
146 }
147 theObj->HilightSelected (myMainPM, aSeq);
148 }
149 else
150 {
f838dac4 151 aGlobOwner->HilightWithColor (myMainPM, theStyle, aHiMode);
c3282ec1 152 }
153}
154
7fd59977 155//=======================================================================
b4006117 156//function : unhighlightSelected
157//purpose :
158//=======================================================================
159void AIS_InteractiveContext::unhighlightSelected (const Standard_Boolean theIsToHilightSubIntensity)
160{
b4006117 161 NCollection_IndexedMap<Handle(AIS_InteractiveObject)> anObjToClear;
02974a19 162 for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
b4006117 163 {
02974a19 164 const Handle(SelectMgr_EntityOwner) anOwner = aSelIter.Value();
165 const Handle(AIS_InteractiveObject) anInteractive = Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
f838dac4 166 Handle(AIS_GlobalStatus) aStatus;
167 if (!myObjects.Find (anInteractive, aStatus))
168 {
169 continue;
170 }
171
b4006117 172 if (anOwner->IsAutoHilight())
173 {
f838dac4 174 anOwner->Unhilight (myMainPM);
b4006117 175 if (theIsToHilightSubIntensity)
176 {
f838dac4 177 if (aStatus->IsSubIntensityOn())
b4006117 178 {
f838dac4 179 const Standard_Integer aHiMode = getHilightMode (anInteractive, aStatus->HilightStyle(), aStatus->DisplayMode());
8e5fb5ea 180 highlightWithSubintensity (anOwner, aHiMode);
b4006117 181 }
182 }
183 }
184 else
185 {
f838dac4 186 anObjToClear.Add (anInteractive);
b4006117 187 }
f838dac4 188 anOwner->SetSelected (Standard_False);
b4006117 189 if (anOwner == anInteractive->GlobalSelOwner())
190 {
191 myObjects.ChangeFind (anInteractive)->SetHilightStatus (Standard_False);
192 }
193 }
194 for (NCollection_IndexedMap<Handle(AIS_InteractiveObject)>::Iterator anIter (anObjToClear); anIter.More(); anIter.Next())
195 {
196 const Handle(AIS_InteractiveObject)& anObj = anIter.Value();
f838dac4 197 myMainPM->Unhighlight (anObj);
b4006117 198 anObj->ClearSelected();
199 }
200}
201
202//=======================================================================
8e5fb5ea 203//function : unhighlightGlobal
204//purpose :
205//=======================================================================
f838dac4 206void AIS_InteractiveContext::unhighlightGlobal (const Handle(AIS_InteractiveObject)& theObj) const
8e5fb5ea 207{
208 if (theObj.IsNull())
f838dac4 209 {
8e5fb5ea 210 return;
f838dac4 211 }
8e5fb5ea 212
f838dac4 213 const Handle(SelectMgr_EntityOwner)& aGlobOwner = theObj->GlobalSelOwner();
8e5fb5ea 214 if (aGlobOwner.IsNull())
215 {
f838dac4 216 myMainPM->Unhighlight (theObj);
8e5fb5ea 217 return;
218 }
219
220 if (aGlobOwner->IsAutoHilight())
221 {
f838dac4 222 aGlobOwner->Unhilight (myMainPM);
8e5fb5ea 223 }
224 else
225 {
f838dac4 226 myMainPM->Unhighlight (theObj);
8e5fb5ea 227 theObj->ClearSelected();
228 }
229}
230
231//=======================================================================
232//function : turnOnSubintensity
233//purpose :
234//=======================================================================
235void AIS_InteractiveContext::turnOnSubintensity (const Handle(AIS_InteractiveObject)& theObject,
236 const Standard_Integer theDispMode,
237 const Standard_Boolean theIsDisplayedOnly) const
238{
f838dac4 239 // the only differ with selection highlight is color, so sync transparency values
240 const Handle(Prs3d_Drawer)& aSubStyle = myStyles[Prs3d_TypeOfHighlight_SubIntensity];
241 aSubStyle->SetTransparency (myStyles[Prs3d_TypeOfHighlight_Selected]->Transparency());
8e5fb5ea 242
243 if (theObject.IsNull())
244 {
245 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjsIter (myObjects); anObjsIter.More(); anObjsIter.Next())
246 {
247 const Handle(AIS_GlobalStatus)& aStatus = anObjsIter.Value();
248 if (aStatus->GraphicStatus() != AIS_DS_Displayed && theIsDisplayedOnly)
249 continue;
250
251 aStatus->SubIntensityOn();
f838dac4 252 myMainPM->Color (anObjsIter.Key(), aSubStyle, theDispMode != -1 ? theDispMode : aStatus->DisplayMode());
8e5fb5ea 253 }
254 }
255 else
256 {
257 Handle(AIS_GlobalStatus) aStatus;
258 if (!myObjects.Find (theObject, aStatus))
259 return;
260
261 if (aStatus->GraphicStatus() != AIS_DS_Displayed && theIsDisplayedOnly)
f838dac4 262 return;
8e5fb5ea 263
264 aStatus->SubIntensityOn();
f838dac4 265 myMainPM->Color (theObject, aSubStyle, theDispMode != -1 ? theDispMode : aStatus->DisplayMode());
8e5fb5ea 266 }
267}
268
269//=======================================================================
270//function : highlightWithSubintensity
271//purpose :
272//=======================================================================
273void AIS_InteractiveContext::highlightWithSubintensity (const Handle(AIS_InteractiveObject)& theObject,
274 const Standard_Integer theMode) const
275{
276 // the only differ with selection highlight is color, so
277 // sync transparency values
f838dac4 278 myStyles[Prs3d_TypeOfHighlight_SubIntensity]->SetTransparency (myStyles[Prs3d_TypeOfHighlight_Selected]->Transparency());
8e5fb5ea 279
f838dac4 280 myMainPM->Color (theObject, myStyles[Prs3d_TypeOfHighlight_SubIntensity], theMode);
8e5fb5ea 281}
282
283//=======================================================================
284//function : highlightWithSubintensity
285//purpose :
286//=======================================================================
287void AIS_InteractiveContext::highlightWithSubintensity (const Handle(SelectMgr_EntityOwner)& theOwner,
288 const Standard_Integer theMode) const
289{
290 // the only differ with selection highlight is color, so
291 // sync transparency values
f838dac4 292 myStyles[Prs3d_TypeOfHighlight_SubIntensity]->SetTransparency (myStyles[Prs3d_TypeOfHighlight_Selected]->Transparency());
8e5fb5ea 293
f838dac4 294 theOwner->HilightWithColor (myMainPM, myStyles[Prs3d_TypeOfHighlight_SubIntensity], theMode);
8e5fb5ea 295}
296
297//=======================================================================
7fd59977 298//function : MoveTo
679ecdee 299//purpose :
7fd59977 300//=======================================================================
679ecdee 301AIS_StatusOfDetection AIS_InteractiveContext::MoveTo (const Standard_Integer theXPix,
302 const Standard_Integer theYPix,
303 const Handle(V3d_View)& theView,
304 const Standard_Boolean theToRedrawOnUpdate)
7fd59977 305{
679ecdee 306 if (HasOpenedContext())
307 {
7fd59977 308 myWasLastMain = Standard_True;
679ecdee 309 return myLocalContexts (myCurLocalIndex)->MoveTo (theXPix, theYPix, theView, theToRedrawOnUpdate);
7fd59977 310 }
311
f0cddd16 312 myCurDetected = 0;
313 myCurHighlighted = 0;
314 myDetectedSeq.Clear();
7fd59977 315
679ecdee 316 if (theView->Viewer() != myMainVwr)
317 {
7fd59977 318 return AIS_SOD_Error;
679ecdee 319 }
320
321 // preliminaires
322 myLastPicked = myLastinMain;
323 myWasLastMain = Standard_True;
324 AIS_StatusOfDetection aStatus = AIS_SOD_Nothing;
325 Standard_Boolean toUpdateViewer = Standard_False;
326
a272ed94 327 myFilters->SetDisabledObjects (theView->View()->HiddenObjects());
679ecdee 328 myMainSel->Pick (theXPix, theYPix, theView);
329
330 // filling of myAISDetectedSeq sequence storing information about detected AIS objects
331 // (the objects must be AIS_Shapes)
332 const Standard_Integer aDetectedNb = myMainSel->NbPicked();
54a16ee4 333 Standard_Integer aNewDetected = 0;
14c4193d 334 Standard_Boolean toIgnoreDetTop = Standard_False;
679ecdee 335 for (Standard_Integer aDetIter = 1; aDetIter <= aDetectedNb; ++aDetIter)
7fd59977 336 {
679ecdee 337 Handle(SelectMgr_EntityOwner) anOwner = myMainSel->Picked (aDetIter);
338 if (anOwner.IsNull()
339 || !myFilters->IsOk (anOwner))
340 {
14c4193d 341 if (myPickingStrategy == SelectMgr_PickingStrategy_OnlyTopmost)
342 {
343 toIgnoreDetTop = Standard_True;
344 }
679ecdee 345 continue;
346 }
347
14c4193d 348 if (aNewDetected < 1
349 && !toIgnoreDetTop)
54a16ee4 350 {
351 aNewDetected = aDetIter;
352 }
f0cddd16 353
354 myDetectedSeq.Append (aDetIter);
7fd59977 355 }
7fd59977 356
54a16ee4 357 if (aNewDetected >= 1)
7fd59977 358 {
f0cddd16 359 myCurHighlighted = myDetectedSeq.Lower();
360
29627b4c 361 // Does nothing if previously detected object is equal to the current one.
362 // However in advanced selection modes the owners comparison
363 // is not effective because in that case only one owner manage the
364 // selection in current selection mode. It is necessary to check the current detected
365 // entity and hilight it only if the detected entity is not the same as
366 // previous detected (IsForcedHilight call)
54a16ee4 367 Handle(SelectMgr_EntityOwner) aNewPickedOwner = myMainSel->Picked (aNewDetected);
29627b4c 368 if (aNewPickedOwner == myLastPicked && !aNewPickedOwner->IsForcedHilight())
eafb234b 369 {
c3282ec1 370 return myLastPicked->IsSelected()
8abada55 371 ? AIS_SOD_Selected
372 : AIS_SOD_OnlyOneDetected;
679ecdee 373 }
81bba717 374
7fd59977 375 // Previously detected object is unhilighted if it is not selected or hilighted
376 // with selection color if it is selected. Such highlighting with selection color
377 // is needed only if myToHilightSelected flag is true. In this case previously detected
378 // object has been already highlighted with myHilightColor during previous MoveTo()
379 // method call. As result it is necessary to rehighligt it with mySelectionColor.
c3282ec1 380 if (!myLastPicked.IsNull() && myLastPicked->HasSelectable())
7fd59977 381 {
731c9b5b 382 clearDynamicHighlight();
383 toUpdateViewer = Standard_True;
7fd59977 384 }
be6e564e 385
679ecdee 386 // initialize myLastPicked field with currently detected object
c3282ec1 387 myLastPicked = aNewPickedOwner;
679ecdee 388 myLastinMain = myLastPicked;
be6e564e 389
679ecdee 390 // highlight detected object if it is not selected or myToHilightSelected flag is true
c3282ec1 391 if (myLastPicked->HasSelectable())
7fd59977 392 {
c3282ec1 393 if (!myLastPicked->IsSelected() || myToHilightSelected)
679ecdee 394 {
8e5fb5ea 395 highlightWithColor (myLastPicked, theView->Viewer());
679ecdee 396 toUpdateViewer = Standard_True;
397 }
be6e564e 398
c3282ec1 399 aStatus = myLastPicked->IsSelected()
8abada55 400 ? AIS_SOD_Selected
401 : AIS_SOD_OnlyOneDetected;
be6e564e 402 }
7fd59977 403 }
c3282ec1 404 else
7fd59977 405 {
679ecdee 406 // previously detected object is unhilighted if it is not selected or hilighted
407 // with selection color if it is selected
408 aStatus = AIS_SOD_Nothing;
c3282ec1 409 if (!myLastPicked.IsNull() && myLastPicked->HasSelectable())
7fd59977 410 {
731c9b5b 411 clearDynamicHighlight();
412 toUpdateViewer = Standard_True;
7fd59977 413 }
be6e564e 414
679ecdee 415 myLastinMain.Nullify();
8abada55 416 myLastPicked.Nullify();
7fd59977 417 }
679ecdee 418
2eea6525 419 if (toUpdateViewer
420 && theToRedrawOnUpdate)
679ecdee 421 {
2eea6525 422 theView->Viewer()->Update();
679ecdee 423 }
424
679ecdee 425 return aStatus;
7fd59977 426}
427
428//=======================================================================
016e5959 429//function : AddSelect
430//purpose :
431//=======================================================================
02974a19 432AIS_StatusOfPick AIS_InteractiveContext::AddSelect (const Handle(SelectMgr_EntityOwner)& theObject)
016e5959 433{
434 if (HasOpenedContext())
435 {
436 return myLocalContexts(myCurLocalIndex)->AddSelect (theObject);
437 }
438 mySelection->AddSelect (theObject);
439
440 Standard_Integer aSelNum = NbSelected();
441 return (aSelNum == 0) ? AIS_SOP_NothingSelected
442 : (aSelNum == 1) ? AIS_SOP_OneSelected
443 : AIS_SOP_SeveralSelected;
444}
445
446//=======================================================================
7fd59977 447//function : Select
448//purpose :
449//=======================================================================
c398b00e 450AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Integer theXPMin,
451 const Standard_Integer theYPMin,
452 const Standard_Integer theXPMax,
453 const Standard_Integer theYPMax,
454 const Handle(V3d_View)& theView,
455 const Standard_Boolean toUpdateViewer)
7fd59977 456{
81bba717 457 // all objects detected by the selector are taken, previous current objects are emptied,
458 // new objects are put...
7fd59977 459
c398b00e 460 if (HasOpenedContext())
461 {
462 return myLocalContexts(myCurLocalIndex)->Select (theXPMin, theYPMin,
463 theXPMax, theYPMax,
464 theView, toUpdateViewer);
465 }
7fd59977 466
c3282ec1 467 ClearSelected (Standard_False);
eb4320f2 468
c398b00e 469 Handle(StdSelect_ViewerSelector3d) aSelector;
7fd59977 470
c398b00e 471 if (theView->Viewer() == myMainVwr)
7fd59977 472 {
c398b00e 473 aSelector = myMainSel;
474 myWasLastMain = Standard_True;
7fd59977 475 }
c398b00e 476
477 aSelector->Pick (theXPMin, theYPMin, theXPMax, theYPMax, theView);
aa75c0cf 478 for (Standard_Integer aPickIter = 1; aPickIter <= aSelector->NbPicked(); ++aPickIter)
7fd59977 479 {
aa75c0cf 480 const Handle(SelectMgr_EntityOwner)& aCurOwner = aSelector->Picked (aPickIter);
c3282ec1 481 if (aCurOwner.IsNull() || !aCurOwner->HasSelectable() || !myFilters->IsOk (aCurOwner))
482 continue;
7fd59977 483
016e5959 484 mySelection->Select (aCurOwner);
f838dac4 485 aCurOwner->SetSelected (Standard_True);
c398b00e 486 }
487
c3282ec1 488 HilightSelected (toUpdateViewer);
c398b00e 489
c3282ec1 490 Standard_Integer aSelNum = NbSelected();
c398b00e 491
492 return (aSelNum == 0) ? AIS_SOP_NothingSelected
493 : (aSelNum == 1) ? AIS_SOP_OneSelected
494 : AIS_SOP_SeveralSelected;
7fd59977 495
496}
497
498//=======================================================================
499//function : Select
500//purpose : Selection by polyline
501//=======================================================================
c398b00e 502AIS_StatusOfPick AIS_InteractiveContext::Select (const TColgp_Array1OfPnt2d& thePolyline,
503 const Handle(V3d_View)& theView,
504 const Standard_Boolean toUpdateViewer)
7fd59977 505{
81bba717 506 // all objects detected by the selector are taken, previous current objects are emptied,
507 // new objects are put...
7fd59977 508
c398b00e 509 if (HasOpenedContext())
510 {
511 return myLocalContexts(myCurLocalIndex)->Select (thePolyline, theView, toUpdateViewer);
512 }
eb4320f2 513
c3282ec1 514 ClearSelected (Standard_False);
7fd59977 515
c398b00e 516 Handle(StdSelect_ViewerSelector3d) aSelector;
7fd59977 517
c398b00e 518 if (theView->Viewer() == myMainVwr)
7fd59977 519 {
c398b00e 520 aSelector = myMainSel;
521 myWasLastMain = Standard_True;
7fd59977 522 }
c398b00e 523
524 aSelector->Pick (thePolyline, theView);
aa75c0cf 525 for (Standard_Integer aPickIter = 1; aPickIter <= aSelector->NbPicked(); ++aPickIter)
7fd59977 526 {
aa75c0cf 527 const Handle(SelectMgr_EntityOwner) anOwner = aSelector->Picked (aPickIter);
c3282ec1 528 if (anOwner.IsNull() || !anOwner->HasSelectable() || !myFilters->IsOk (anOwner))
529 continue;
c398b00e 530
016e5959 531 mySelection->Select (anOwner);
f838dac4 532 anOwner->SetSelected (Standard_True);
c398b00e 533 }
534
c3282ec1 535 HilightSelected (toUpdateViewer);
c398b00e 536
c3282ec1 537 Standard_Integer aSelNum = NbSelected();
c398b00e 538
539 return (aSelNum == 0) ? AIS_SOP_NothingSelected
540 : (aSelNum == 1) ? AIS_SOP_OneSelected
541 : AIS_SOP_SeveralSelected;
7fd59977 542
543}
544
545//=======================================================================
546//function : Select
547//purpose :
548//=======================================================================
c398b00e 549AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Boolean toUpdateViewer)
7fd59977 550{
c398b00e 551 if (HasOpenedContext())
552 {
7fd59977 553 if(myWasLastMain)
c398b00e 554 {
555 return myLocalContexts(myCurLocalIndex)->Select (toUpdateViewer);
556 }
7fd59977 557 else
c398b00e 558 {
c3282ec1 559 myLocalContexts(myCurLocalIndex)->SetSelected (Handle(AIS_InteractiveObject)::DownCast (myLastPicked->Selectable()), toUpdateViewer);
c398b00e 560 return AIS_SOP_OneSelected;
561 }
562 }
563
731c9b5b 564 clearDynamicHighlight();
c398b00e 565 if (myWasLastMain && !myLastinMain.IsNull())
566 {
780ee4e2 567 if (!myLastinMain->IsSelected()
568 || myLastinMain->IsForcedHilight()
569 || NbSelected() > 1)
c398b00e 570 {
c3282ec1 571 SetSelected (myLastinMain, Standard_False);
c398b00e 572 if(toUpdateViewer)
7fd59977 573 {
c398b00e 574 UpdateCurrentViewer();
7fd59977 575 }
c398b00e 576 }
7fd59977 577 }
c398b00e 578 else
579 {
b4006117 580 unhighlightSelected (Standard_True);
c398b00e 581
02974a19 582 mySelection->Clear();
c398b00e 583 if (toUpdateViewer && myWasLastMain)
584 {
eb4320f2 585 UpdateCurrentViewer();
7fd59977 586 }
587 }
c398b00e 588
c3282ec1 589 Standard_Integer aSelNum = NbSelected();
c398b00e 590
591 return (aSelNum == 0) ? AIS_SOP_NothingSelected
592 : (aSelNum == 1) ? AIS_SOP_OneSelected
593 : AIS_SOP_SeveralSelected;
7fd59977 594}
595
596//=======================================================================
597//function : ShiftSelect
598//purpose :
599//=======================================================================
c398b00e 600AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const Standard_Boolean toUpdateViewer)
7fd59977 601{
c398b00e 602 if (HasOpenedContext())
603 {
7fd59977 604 if(myWasLastMain)
c398b00e 605 {
606 return myLocalContexts (myCurLocalIndex)->ShiftSelect (toUpdateViewer);
607 }
608 else
609 {
610 myLocalContexts (myCurLocalIndex)->AddOrRemoveSelected (myLastPicked, toUpdateViewer);
611
612 Standard_Integer aSelNum = NbSelected();
613 return (aSelNum == 0) ? AIS_SOP_NothingSelected
614 : (aSelNum == 1) ? AIS_SOP_OneSelected
615 : AIS_SOP_SeveralSelected;
7fd59977 616 }
617 }
eb4320f2 618
731c9b5b 619 clearDynamicHighlight();
c398b00e 620 if (myWasLastMain && !myLastinMain.IsNull())
621 {
c3282ec1 622 AddOrRemoveSelected (myLastinMain, toUpdateViewer);
c398b00e 623 }
7fd59977 624
c3282ec1 625 Standard_Integer aSelNum = NbSelected();
c398b00e 626
c3282ec1 627 return (aSelNum == 0) ? AIS_SOP_NothingSelected
628 : (aSelNum == 1) ? AIS_SOP_OneSelected
629 : AIS_SOP_SeveralSelected;
c398b00e 630}
7fd59977 631
632//=======================================================================
633//function : ShiftSelect
634//purpose :
635//=======================================================================
c398b00e 636AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const Standard_Integer theXPMin,
637 const Standard_Integer theYPMin,
638 const Standard_Integer theXPMax,
639 const Standard_Integer theYPMax,
640 const Handle(V3d_View)& theView,
641 const Standard_Boolean toUpdateViewer)
7fd59977 642{
c398b00e 643 if (HasOpenedContext())
644 {
645 return myLocalContexts(myCurLocalIndex)->ShiftSelect (theXPMin, theYPMin, theXPMax, theYPMax,
646 theView, toUpdateViewer);
647 }
648
c3282ec1 649 UnhilightSelected (Standard_False);
c398b00e 650
651 Handle(StdSelect_ViewerSelector3d) aSelector;
652 if (theView->Viewer() == myMainVwr)
653 {
654 aSelector = myMainSel;
655 myWasLastMain = Standard_True;
656 }
7fd59977 657 else
c398b00e 658 {
7fd59977 659 return AIS_SOP_NothingSelected;
c398b00e 660 }
661
662 aSelector->Pick (theXPMin, theYPMin, theXPMax, theYPMax, theView);
aa75c0cf 663 for (Standard_Integer aPickIter = 1; aPickIter <= aSelector->NbPicked(); ++aPickIter)
c398b00e 664 {
aa75c0cf 665 const Handle(SelectMgr_EntityOwner) anOwner = aSelector->Picked (aPickIter);
c3282ec1 666 if (anOwner.IsNull() || !anOwner->HasSelectable() || !myFilters->IsOk (anOwner))
667 continue;
668
016e5959 669 AIS_SelectStatus aSelStatus = mySelection->Select (anOwner);
f838dac4 670 anOwner->SetSelected (aSelStatus == AIS_SS_Added);
7fd59977 671 }
c398b00e 672
c3282ec1 673 HilightSelected (toUpdateViewer);
c398b00e 674
c3282ec1 675 Standard_Integer aSelNum = NbSelected();
c398b00e 676
677 return (aSelNum == 0) ? AIS_SOP_NothingSelected
678 : (aSelNum == 1) ? AIS_SOP_OneSelected
679 : AIS_SOP_SeveralSelected;
680
7fd59977 681}
682
683//=======================================================================
684//function : ShiftSelect
685//purpose :
686//=======================================================================
c398b00e 687AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const TColgp_Array1OfPnt2d& thePolyline,
688 const Handle(V3d_View)& theView,
689 const Standard_Boolean toUpdateViewer)
7fd59977 690{
c398b00e 691 if (HasOpenedContext())
692 {
693 return myLocalContexts(myCurLocalIndex)->ShiftSelect (thePolyline, theView, toUpdateViewer);
694 }
7fd59977 695
c3282ec1 696 UnhilightSelected (Standard_False);
c398b00e 697
698 Handle(StdSelect_ViewerSelector3d) aSelector;
699
700 if (theView->Viewer() == myMainVwr)
701 {
702 aSelector= myMainSel;
703 myWasLastMain = Standard_True;
704 }
705 else
706 {
707 return AIS_SOP_NothingSelected;
708 }
709
710 aSelector->Pick (thePolyline, theView);
aa75c0cf 711 for (Standard_Integer aPickIter = 1; aPickIter <= aSelector->NbPicked(); ++aPickIter)
c398b00e 712 {
aa75c0cf 713 const Handle(SelectMgr_EntityOwner) anOwner = aSelector->Picked (aPickIter);
c3282ec1 714 if (anOwner.IsNull() || !anOwner->HasSelectable() || !myFilters->IsOk (anOwner))
715 continue;
716
016e5959 717 AIS_SelectStatus aSelStatus = mySelection->Select (anOwner);
f838dac4 718 anOwner->SetSelected (aSelStatus == AIS_SS_Added);
c398b00e 719 }
720
c3282ec1 721 HilightSelected (toUpdateViewer);
c398b00e 722
c3282ec1 723 Standard_Integer aSelNum = NbSelected();
c398b00e 724
725 return (aSelNum == 0) ? AIS_SOP_NothingSelected
726 : (aSelNum == 1) ? AIS_SOP_OneSelected
727 : AIS_SOP_SeveralSelected;
7fd59977 728}
729
730//=======================================================================
731//function : SetCurrentObject
c3282ec1 732//purpose : OBSOLETE, please use SetSelected() instead
733//TODO : Remove in process of local context deletion
7fd59977 734//=======================================================================
c3282ec1 735void AIS_InteractiveContext::SetCurrentObject (const Handle(AIS_InteractiveObject)& theObject,
736 const Standard_Boolean theToUpdateViewer)
7fd59977 737{
c3282ec1 738 if (HasOpenedContext())
7fd59977 739 return;
7fd59977 740
c3282ec1 741 SetSelected (theObject, theToUpdateViewer);
7fd59977 742}
743
744//=======================================================================
745//function : AddOrRemoveCurrentObject
c3282ec1 746//purpose : OBSOLETE, please use AddOrRemoveSelected() instead
747//TODO : Remove in process of local context deletion
7fd59977 748//=======================================================================
c3282ec1 749void AIS_InteractiveContext::AddOrRemoveCurrentObject (const Handle(AIS_InteractiveObject)& theObj,
750 const Standard_Boolean theIsToUpdateViewer)
7fd59977 751{
c3282ec1 752 if (HasOpenedContext())
753 return;
7fd59977 754
c3282ec1 755 AddOrRemoveSelected (theObj, theIsToUpdateViewer);
7fd59977 756}
757//=======================================================================
758//function : UpdateCurrent
c3282ec1 759//purpose : OBSOLETE, please use UpdateSelected() instead
760//TODO : Remove in process of local context deletion
7fd59977 761//=======================================================================
7fd59977 762void AIS_InteractiveContext::UpdateCurrent()
763{
0577ae8c 764 UpdateSelected (Standard_True);
7fd59977 765}
766
767//=======================================================================
768//function : IsCurrent
c3282ec1 769//purpose : OBSOLETE, please use IsSelected() instead
770//TODO : Remove in process of local context deletion
7fd59977 771//=======================================================================
c3282ec1 772Standard_Boolean AIS_InteractiveContext::IsCurrent (const Handle(AIS_InteractiveObject)& theObject) const
7fd59977 773{
c3282ec1 774 return IsSelected (theObject);
7fd59977 775}
776
777//=======================================================================
778//function : InitCurrent
c3282ec1 779//purpose : OBSOLETE, please use InitSelected() instead
780//TODO : Remove in process of local context deletion
7fd59977 781//=======================================================================
7fd59977 782void AIS_InteractiveContext::InitCurrent()
783{
c3282ec1 784 if (HasOpenedContext())
785 return;
786
787 InitSelected();
7fd59977 788}
789
790//=======================================================================
791//function : MoreCurrent
c3282ec1 792//purpose : OBSOLETE, please use MoreSelected() instead
793//TODO : Remove in process of local context deletion
7fd59977 794//=======================================================================
7fd59977 795Standard_Boolean AIS_InteractiveContext::MoreCurrent() const
796{
c3282ec1 797 return !HasOpenedContext() && MoreSelected();
7fd59977 798}
799
800//=======================================================================
801//function : NextCurrent
c3282ec1 802//purpose : OBSOLETE, please use NextSelected() instead
803//TODO : Remove in process of local context deletion
7fd59977 804//=======================================================================
7fd59977 805void AIS_InteractiveContext::NextCurrent()
806{
c3282ec1 807 if (HasOpenedContext())
808 return;
809
810 NextSelected();
7fd59977 811}
812
813//=======================================================================
814//function : Current
c3282ec1 815//purpose : OBSOLETE, please use SelectedInteractive() instead
816//TODO : Remove in process of local context deletion
7fd59977 817//=======================================================================
7fd59977 818Handle(AIS_InteractiveObject) AIS_InteractiveContext::Current() const
819{
c3282ec1 820 return HasOpenedContext() ? NULL : SelectedInteractive();
7fd59977 821}
822
823//=======================================================================
824//function : NbCurrents
c3282ec1 825//purpose : OBSOLETE, please use NbSelected() instead
826//TODO : Remove in process of local context deletion
7fd59977 827//=======================================================================
828Standard_Integer AIS_InteractiveContext::NbCurrents()
829{
c3282ec1 830 return HasOpenedContext() ? -1 : NbSelected();
7fd59977 831}
832
833//=======================================================================
834//function : HilightCurrents
c3282ec1 835//purpose : OBSOLETE, please use HilightSelected() instead
836//TODO : Remove in process of local context deletion
7fd59977 837//=======================================================================
c3282ec1 838void AIS_InteractiveContext::HilightCurrents (const Standard_Boolean theToUpdateViewer)
7fd59977 839{
c3282ec1 840 if (HasOpenedContext())
841 return;
842
843 HilightSelected (theToUpdateViewer);
7fd59977 844}
845
846//=======================================================================
847//function : UnhilightCurrents
c3282ec1 848//purpose : OBSOLETE, please use UnhilightSelected() instead
849//TODO : Remove in process of local context deletion
7fd59977 850//=======================================================================
c3282ec1 851void AIS_InteractiveContext::UnhilightCurrents (const Standard_Boolean theToUpdateViewer)
7fd59977 852{
c3282ec1 853 if (HasOpenedContext())
854 return;
855
856 UnhilightSelected (theToUpdateViewer);
7fd59977 857}
858
859//=======================================================================
860//function : ClearCurrents
c3282ec1 861//purpose : OBSOLETE, please use ClearCurrents() instead
862//TODO : Remove in process of local context deletion
7fd59977 863//=======================================================================
c3282ec1 864void AIS_InteractiveContext::ClearCurrents(const Standard_Boolean theToUpdateViewer)
7fd59977 865{
c3282ec1 866 if (HasOpenedContext())
867 return;
868
869 ClearSelected (theToUpdateViewer);
7fd59977 870}
871
872
873//=======================================================================
874//function : HilightSelected
c3282ec1 875//purpose :
7fd59977 876//=======================================================================
c3282ec1 877void AIS_InteractiveContext::HilightSelected (const Standard_Boolean theToUpdateViewer)
7fd59977 878{
c3282ec1 879 if (HasOpenedContext())
880 {
881 return myLocalContexts (myCurLocalIndex)->HilightPicked (theToUpdateViewer);
882 }
883
884 // In case of selection without using local context
731c9b5b 885 clearDynamicHighlight();
c3282ec1 886 AIS_MapOfObjSelectedOwners anObjOwnerMap;
02974a19 887 for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
c3282ec1 888 {
02974a19 889 const Handle(SelectMgr_EntityOwner) anOwner = aSelIter.Value();
890 const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
f838dac4 891 const Handle(Prs3d_Drawer)& anObjSelStyle = getSelStyle (anObj, anOwner);
892 Handle(AIS_GlobalStatus)& aState = myObjects.ChangeFind(anObj);
02974a19 893 if (anOwner == anObj->GlobalSelOwner())
c3282ec1 894 {
02974a19 895 aState->SetHilightStatus (Standard_True);
8e5fb5ea 896 aState->SetHilightStyle (anObjSelStyle);
02974a19 897 }
f838dac4 898 anOwner->SetSelected (Standard_True);
02974a19 899 if (!anOwner->IsAutoHilight())
900 {
901 NCollection_Handle<SelectMgr_SequenceOfOwner> aSeq;
902 if (anObjOwnerMap.Find (anObj, aSeq))
c3282ec1 903 {
02974a19 904 aSeq->Append (anOwner);
c3282ec1 905 }
906 else
907 {
02974a19 908 aSeq = new SelectMgr_SequenceOfOwner();
909 aSeq->Append (anOwner);
910 anObjOwnerMap.Bind (anObj, aSeq);
c3282ec1 911 }
7fd59977 912 }
02974a19 913 else
914 {
f838dac4 915 const Standard_Integer aHiMode = getHilightMode (anObj, anObjSelStyle, aState->DisplayMode());
8e5fb5ea 916 anOwner->HilightWithColor (myMainPM, anObjSelStyle, aHiMode);
02974a19 917 }
7fd59977 918 }
c3282ec1 919
920 if (!anObjOwnerMap.IsEmpty())
921 {
922 for (AIS_MapOfObjSelectedOwners::Iterator anIter (anObjOwnerMap); anIter.More(); anIter.Next())
7fd59977 923 {
c3282ec1 924 anIter.Key()->HilightSelected (myMainPM, *anIter.Value());
7fd59977 925 }
c3282ec1 926 anObjOwnerMap.Clear();
927 }
928
929 if (theToUpdateViewer)
7fd59977 930 UpdateCurrentViewer();
931}
932
933//=======================================================================
934//function : UnhilightSelected
c3282ec1 935//purpose :
7fd59977 936//=======================================================================
c3282ec1 937void AIS_InteractiveContext::UnhilightSelected (const Standard_Boolean theToUpdateViewer)
7fd59977 938{
c3282ec1 939 if (HasOpenedContext())
940 {
941 return myLocalContexts (myCurLocalIndex)->UnhilightPicked (theToUpdateViewer);
7fd59977 942 }
c3282ec1 943
02974a19 944 for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
c3282ec1 945 {
02974a19 946 const Handle(SelectMgr_EntityOwner) anOwner = aSelIter.Value();
947 const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
948 if (anOwner == anObj->GlobalSelOwner())
7fd59977 949 {
02974a19 950 myObjects.ChangeFind (anObj)->SetHilightStatus (Standard_False);
7fd59977 951 }
02974a19 952
f838dac4 953 anOwner->SetSelected (Standard_False);
954 anOwner->Unhilight (myMainPM);
c3282ec1 955 }
956
957 if (theToUpdateViewer)
958 UpdateCurrentViewer();
7fd59977 959}
960
961
962//=======================================================================
963//function : ClearSelected
c3282ec1 964//purpose :
7fd59977 965//=======================================================================
c3282ec1 966void AIS_InteractiveContext::ClearSelected (const Standard_Boolean theToUpdateViewer)
7fd59977 967{
c3282ec1 968 if (HasOpenedContext())
969 return myLocalContexts (myCurLocalIndex)->ClearSelected (theToUpdateViewer);
7fd59977 970
c3282ec1 971 if (NbSelected() == 0)
972 return;
7fd59977 973
b4006117 974 unhighlightSelected();
7fd59977 975
02974a19 976 mySelection->Clear();
731c9b5b 977 clearDynamicHighlight();
7fd59977 978
c3282ec1 979 if (theToUpdateViewer)
980 UpdateCurrentViewer();
7fd59977 981}
982
983//=======================================================================
c3282ec1 984//function : UpdateSelected
985//purpose :
7fd59977 986//=======================================================================
c3282ec1 987void AIS_InteractiveContext::UpdateSelected (const Standard_Boolean theToUpdateViewer)
988{
989 if (HasOpenedContext())
990 {
991 return myLocalContexts(myCurLocalIndex)->UpdateSelected (theToUpdateViewer);
992 }
7fd59977 993
c3282ec1 994 HilightSelected (theToUpdateViewer);
995}
996
997//=======================================================================
998//function : SetSelected
999//purpose : Sets the whole object as selected and highlights it with selection color
1000//=======================================================================
1001void AIS_InteractiveContext::SetSelected (const Handle(AIS_InteractiveObject)& theObject,
1002 const Standard_Boolean theToUpdateViewer)
7fd59977 1003{
f838dac4 1004 if (HasOpenedContext())
c3282ec1 1005 {
1006 return myLocalContexts (myCurLocalIndex)->SetSelected (theObject, theToUpdateViewer);
1007 }
1008
1009 if (theObject.IsNull())
f838dac4 1010 {
7fd59977 1011 return;
f838dac4 1012 }
1013
1014 if (!myObjects.IsBound (theObject))
1015 {
c3282ec1 1016 Display (theObject, Standard_False);
f838dac4 1017 }
0d5880e1 1018 if (!theObject->HasSelection (theObject->GlobalSelectionMode()))
f838dac4 1019 {
c3282ec1 1020 return;
f838dac4 1021 }
1022 Handle(SelectMgr_EntityOwner) anOwner = theObject->GlobalSelOwner();
1023 if (anOwner.IsNull())
1024 {
1025 return;
1026 }
c3282ec1 1027
f838dac4 1028 const Handle(Prs3d_Drawer)& anObjSelStyle = getSelStyle (theObject, anOwner);
e1b01c73 1029 if (NbSelected() == 1 && myObjects (theObject)->IsHilighted())
c3282ec1 1030 {
f838dac4 1031 Handle(Prs3d_Drawer) aCustomStyle;
8e5fb5ea 1032 if (HighlightStyle (theObject, aCustomStyle))
c3282ec1 1033 {
8e5fb5ea 1034 if (!aCustomStyle.IsNull() && anObjSelStyle != aCustomStyle)
c3282ec1 1035 {
8e5fb5ea 1036 HilightWithColor (theObject, anObjSelStyle, theToUpdateViewer);
c3282ec1 1037 }
1038 }
1039 return;
1040 }
1041
016e5959 1042 for (mySelection->Init(); mySelection->More(); mySelection->Next())
c3282ec1 1043 {
f838dac4 1044 const Handle(SelectMgr_EntityOwner) aSelOwner = mySelection->Value();
1045 if (!myFilters->IsOk (aSelOwner))
02974a19 1046 {
c3282ec1 1047 continue;
02974a19 1048 }
c3282ec1 1049
f838dac4 1050 Handle(AIS_InteractiveObject) aSelectable = Handle(AIS_InteractiveObject)::DownCast (aSelOwner->Selectable());
c3282ec1 1051 Unhilight (aSelectable, Standard_False);
f838dac4 1052 aSelOwner->SetSelected (Standard_False);
1053 if (aSelOwner == aSelectable->GlobalSelOwner())
e1b01c73 1054 {
1055 myObjects.ChangeFind (aSelectable)->SetHilightStatus (Standard_False);
1056 }
c3282ec1 1057 }
1058
1059 // added to avoid untimely viewer update...
016e5959 1060 mySelection->ClearAndSelect (anOwner);
0d5880e1 1061
f838dac4 1062 Handle(Prs3d_Drawer) aCustomStyle;
8e5fb5ea 1063 if (HighlightStyle (theObject, aCustomStyle))
c3282ec1 1064 {
8e5fb5ea 1065 if (!aCustomStyle.IsNull() && anObjSelStyle != aCustomStyle)
c3282ec1 1066 {
8e5fb5ea 1067 HilightWithColor (theObject, anObjSelStyle, Standard_False);
c3282ec1 1068 }
7fd59977 1069 }
c3282ec1 1070 else
1071 {
8e5fb5ea 1072 HilightWithColor (theObject, anObjSelStyle, Standard_False);
c3282ec1 1073 }
f838dac4 1074 anOwner->SetSelected (Standard_True);
c3282ec1 1075
1076 if (theToUpdateViewer)
1077 UpdateCurrentViewer();
7fd59977 1078}
1079
1080//=======================================================================
c3282ec1 1081//function : SetSelected
1082//purpose : Sets the whole object as selected and highlights it with selection color
7fd59977 1083//=======================================================================
c3282ec1 1084void AIS_InteractiveContext::SetSelected (const Handle(SelectMgr_EntityOwner)& theOwner,
1085 const Standard_Boolean theToUpdateViewer)
7fd59977 1086{
b4006117 1087 if (theOwner.IsNull() || !theOwner->HasSelectable() || !myFilters->IsOk (theOwner))
c3282ec1 1088 return;
1089
f838dac4 1090 const Handle(AIS_InteractiveObject) anObject = Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
1091 const Handle(Prs3d_Drawer)& anObjSelStyle = getSelStyle (anObject, theOwner);
731c9b5b 1092 if (NbSelected() == 1 && theOwner->IsSelected() && !theOwner->IsForcedHilight())
c3282ec1 1093 {
f838dac4 1094 Handle(Prs3d_Drawer) aCustomStyle;
8e5fb5ea 1095 if (HighlightStyle (theOwner, aCustomStyle))
c3282ec1 1096 {
8e5fb5ea 1097 if (!aCustomStyle.IsNull() && anObjSelStyle != aCustomStyle)
c3282ec1 1098 {
1099 const Standard_Integer aHiMode = anObject->HasHilightMode() ? anObject->HilightMode() : 0;
8e5fb5ea 1100 theOwner->HilightWithColor (myMainPM, anObjSelStyle, aHiMode);
c3282ec1 1101 }
1102 }
1103 return;
1104 }
1105
1106 if (!myObjects.IsBound (anObject))
1107 Display (anObject, Standard_False);
1108
b4006117 1109 unhighlightSelected();
c3282ec1 1110
016e5959 1111 mySelection->ClearAndSelect (theOwner);
f838dac4 1112 Handle(Prs3d_Drawer) aCustomStyle;
8e5fb5ea 1113 if (!HighlightStyle (theOwner, aCustomStyle) ||
1114 (!aCustomStyle.IsNull() && aCustomStyle != anObjSelStyle))
c3282ec1 1115 {
f838dac4 1116 theOwner->SetSelected (Standard_True);
8e5fb5ea 1117 highlightSelected (theOwner);
c3282ec1 1118 }
1119
f838dac4 1120 theOwner->SetSelected (Standard_True);
e1b01c73 1121 if (theOwner == anObject->GlobalSelOwner())
1122 {
1123 Handle(AIS_GlobalStatus)& aState = myObjects.ChangeFind (anObject);
1124 aState->SetHilightStatus (Standard_True);
8e5fb5ea 1125 aState->SetHilightStyle (anObjSelStyle);
e1b01c73 1126 }
1127
c3282ec1 1128 if (theToUpdateViewer)
1129 UpdateCurrentViewer();
7fd59977 1130}
1131
1132//=======================================================================
1133//function : AddOrRemoveSelected
c3282ec1 1134//purpose : Adds or removes current object from AIS selection and highlights/unhighlights it.
1135// Since this method makes sence only for neutral point selection of a whole object,
1136// if 0 selection of the object is empty this method simply does nothing.
7fd59977 1137//=======================================================================
c3282ec1 1138void AIS_InteractiveContext::AddOrRemoveSelected (const Handle(AIS_InteractiveObject)& theObject,
1139 const Standard_Boolean theToUpdateViewer)
7fd59977 1140{
95081657 1141 if (theObject.IsNull())
1142 return;
c3282ec1 1143
1144 if (HasOpenedContext())
1145 return myLocalContexts (myCurLocalIndex)->AddOrRemoveSelected (theObject, theToUpdateViewer);
1146
95081657 1147 const Standard_Integer aGlobalSelMode = theObject->GlobalSelectionMode();
1148 if (!myObjects.IsBound (theObject) || !theObject->HasSelection (aGlobalSelMode))
c3282ec1 1149 return;
1150
2ec85268 1151 setContextToObject (theObject);
7411850a 1152 const Handle(SelectMgr_EntityOwner) anOwner = theObject->GlobalSelOwner();
c3282ec1 1153
1154 if (anOwner.IsNull() || !anOwner->HasSelectable())
1155 return;
1156
1157 AddOrRemoveSelected (anOwner, theToUpdateViewer);
7fd59977 1158}
1159//=======================================================================
1160//function : AddOrRemoveSelected
1161//purpose :
1162//=======================================================================
1163
c3282ec1 1164void AIS_InteractiveContext::AddOrRemoveSelected (const TopoDS_Shape& aShap,
7fd59977 1165 const Standard_Boolean updateviewer)
1166{
1167 if(!HasOpenedContext()) {
0797d9d3 1168#ifdef OCCT_DEBUG
7fd59977 1169 cout<<" Attempt to remove a selected shape with no opened local context"<<endl;
1170#endif
1171 return;
1172 }
1173
1174 myLocalContexts(myCurLocalIndex)->AddOrRemoveSelected(aShap,updateviewer);
1175 if(updateviewer) UpdateCurrentViewer();
1176
1177}
c3282ec1 1178
7fd59977 1179//=======================================================================
1180//function : AddOrRemoveSelected
c3282ec1 1181//purpose : Allows to highlight or unhighlight the owner given depending on
1182// its selection status
7fd59977 1183//=======================================================================
c3282ec1 1184void AIS_InteractiveContext::AddOrRemoveSelected (const Handle(SelectMgr_EntityOwner)& theOwner,
1185 const Standard_Boolean theToUpdateViewer)
1186{
1187 if (HasOpenedContext())
1188 return myLocalContexts(myCurLocalIndex)->AddOrRemoveSelected (theOwner, theToUpdateViewer);
7fd59977 1189
c3282ec1 1190 if (theOwner.IsNull() || !theOwner->HasSelectable())
7fd59977 1191 return;
c3282ec1 1192
4d901cde 1193 if (!myFilters->IsOk(theOwner) && !theOwner->IsSelected())
1194 return;
1195
016e5959 1196 AIS_SelectStatus aSelStat = mySelection->Select (theOwner);
f838dac4 1197 theOwner->SetSelected (aSelStat == AIS_SS_Added);
c3282ec1 1198 const Handle(AIS_InteractiveObject) anObj =
1199 Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
1200 const Standard_Boolean isGlobal = anObj->GlobalSelOwner() == theOwner;
e1b01c73 1201 Handle(AIS_GlobalStatus)& aStatus = myObjects.ChangeFind (anObj);
f838dac4 1202 if (theOwner->IsSelected())
c3282ec1 1203 {
8e5fb5ea 1204 highlightSelected (theOwner);
c3282ec1 1205 if (isGlobal)
1206 {
1207 aStatus->SetHilightStatus (Standard_True);
f838dac4 1208 aStatus->SetHilightStyle (getSelStyle (anObj, theOwner));
c3282ec1 1209 }
1210 }
1211 else
1212 {
1213 if (theOwner->IsAutoHilight())
f838dac4 1214 {
1215 theOwner->Unhilight (myMainPM);
1216 }
c3282ec1 1217 else
f838dac4 1218 {
c3282ec1 1219 anObj->ClearSelected();
f838dac4 1220 }
c3282ec1 1221 aStatus->SetHilightStatus (Standard_False);
f838dac4 1222 aStatus->SetHilightStyle (Handle(Prs3d_Drawer)());
7fd59977 1223 }
7fd59977 1224
c3282ec1 1225 if (theToUpdateViewer)
1226 UpdateCurrentViewer();
1227}
7fd59977 1228
1229
1230//=======================================================================
1231//function : IsSelected
c3282ec1 1232//purpose :
7fd59977 1233//=======================================================================
c3282ec1 1234Standard_Boolean AIS_InteractiveContext::IsSelected (const Handle(AIS_InteractiveObject)& theObj) const
7fd59977 1235{
c3282ec1 1236 if(HasOpenedContext())
1237 return myLocalContexts(myCurLocalIndex)->IsSelected (theObj);
1238
1239 if (theObj.IsNull() || !myObjects.IsBound (theObj))
1240 return Standard_False;
1241
1242 const Standard_Integer aGlobalSelMode = theObj->GlobalSelectionMode();
1243 const TColStd_ListOfInteger& anActivatedModes = myObjects (theObj)->SelectionModes();
1244 Standard_Boolean isGlobalModeActivated = Standard_False;
1245 for (TColStd_ListIteratorOfListOfInteger aModeIter (anActivatedModes); aModeIter.More(); aModeIter.Next())
1246 {
1247 if (aModeIter.Value() == aGlobalSelMode)
1248 {
1249 isGlobalModeActivated = Standard_True;
1250 break;
1251 }
1252 }
95081657 1253 if (!theObj->HasSelection (aGlobalSelMode) || !isGlobalModeActivated || theObj->GlobalSelOwner().IsNull())
c3282ec1 1254 return Standard_False;
1255
f838dac4 1256 return theObj->GlobalSelOwner()->IsSelected();
7fd59977 1257}
1258
c3282ec1 1259//=======================================================================
1260//function : IsSelected
1261//purpose : Returns true is the owner given is selected
1262//=======================================================================
1263Standard_Boolean AIS_InteractiveContext::IsSelected (const Handle(SelectMgr_EntityOwner)& theOwner) const
1264{
1265 if (HasOpenedContext())
1266 return myLocalContexts(myCurLocalIndex)->IsSelected (theOwner);
1267
1268 if (theOwner.IsNull())
1269 return Standard_False;
1270
1271 return theOwner->IsSelected();
1272}
7fd59977 1273
1274//=======================================================================
1275//function : InitSelected
c3282ec1 1276//purpose :
7fd59977 1277//=======================================================================
7fd59977 1278void AIS_InteractiveContext::InitSelected()
1279{
c3282ec1 1280 if (HasOpenedContext())
1281 {
1282 myLocalContexts (myCurLocalIndex)->InitSelected();
1283 return;
1284 }
1285
016e5959 1286 mySelection->Init();
7fd59977 1287}
1288
1289//=======================================================================
1290//function : MoreSelected
c3282ec1 1291//purpose :
7fd59977 1292//=======================================================================
c3282ec1 1293Standard_Boolean AIS_InteractiveContext::MoreSelected() const
7fd59977 1294{
c3282ec1 1295 if (HasOpenedContext())
1296 return myLocalContexts (myCurLocalIndex)->MoreSelected();
1297
016e5959 1298 return mySelection->More();
7fd59977 1299}
1300
1301//=======================================================================
1302//function : NextSelected
c3282ec1 1303//purpose :
7fd59977 1304//=======================================================================
7fd59977 1305void AIS_InteractiveContext::NextSelected()
1306{
c3282ec1 1307 if(HasOpenedContext())
1308 {
1309 return myLocalContexts (myCurLocalIndex)->NextSelected();
c3282ec1 1310 }
1311
016e5959 1312 mySelection->Next();
7fd59977 1313}
1314
1315//=======================================================================
1316//function : HasSelectedShape
c3282ec1 1317//purpose :
7fd59977 1318//=======================================================================
c3282ec1 1319Standard_Boolean AIS_InteractiveContext::HasSelectedShape() const
7fd59977 1320{
c3282ec1 1321 if(HasOpenedContext())
1322 {
1323 return myLocalContexts(myCurLocalIndex)->HasSelectedShape();
7fd59977 1324 }
4aaadad7
SS
1325 if (!mySelection->More())
1326 return Standard_False;
1327
1328 const Handle(StdSelect_BRepOwner) anOwner =
1329 Handle(StdSelect_BRepOwner)::DownCast (mySelection->Value());
c3282ec1 1330
4aaadad7 1331 return !anOwner.IsNull() && anOwner->HasShape();
7fd59977 1332}
1333
1334//=======================================================================
1335//function : SelectedShape
c3282ec1 1336//purpose :
7fd59977 1337//=======================================================================
c3282ec1 1338TopoDS_Shape AIS_InteractiveContext::SelectedShape() const
7fd59977 1339{
c3282ec1 1340 if (HasOpenedContext())
0717ddc1 1341 {
1342 return myLocalContexts (myCurLocalIndex)->SelectedShape();
1343 }
7fd59977 1344
02974a19 1345 if (!mySelection->More())
c3282ec1 1346 return TopoDS_Shape();
7fd59977 1347
c3282ec1 1348 const Handle(StdSelect_BRepOwner) anOwner =
016e5959 1349 Handle(StdSelect_BRepOwner)::DownCast (mySelection->Value());
3475df12 1350 if (anOwner.IsNull() || !anOwner->HasSelectable())
c3282ec1 1351 return TopoDS_Shape();
1352
1353 return anOwner->Shape().Located (anOwner->Location() * anOwner->Shape().Location());
7fd59977 1354}
1355
c3282ec1 1356//=======================================================================
1357//function : SelectedInteractive
1358//purpose :
1359//=======================================================================
7fd59977 1360Handle(AIS_InteractiveObject) AIS_InteractiveContext::SelectedInteractive() const
1361{
c3282ec1 1362 if (HasOpenedContext())
1363 {
1364 return myLocalContexts(myCurLocalIndex)->SelectedInteractive();
1365 }
1366
02974a19 1367 return !mySelection->More()
1368 ? Handle(AIS_InteractiveObject)()
1369 : Handle(AIS_InteractiveObject)::DownCast (mySelection->Value()->Selectable());
7fd59977 1370}
1371//=======================================================================
c3282ec1 1372//function : SelectedOwner
1373//purpose :
7fd59977 1374//=======================================================================
c3282ec1 1375Handle(SelectMgr_EntityOwner) AIS_InteractiveContext::SelectedOwner() const
7fd59977 1376{
c3282ec1 1377 if(HasOpenedContext())
1378 {
1379 return myLocalContexts(myCurLocalIndex)->SelectedOwner();
7fd59977 1380 }
c3282ec1 1381
02974a19 1382 return !mySelection->More()
1383 ? Handle(SelectMgr_EntityOwner)()
1384 : mySelection->Value();
7fd59977 1385}
1386
1387//=======================================================================
1388//function : EntityOwners
1389//purpose :
1390//=======================================================================
b586500b 1391void AIS_InteractiveContext::EntityOwners(Handle(SelectMgr_IndexedMapOfOwner)& theOwners,
7fd59977 1392 const Handle(AIS_InteractiveObject)& theIObj,
1393 const Standard_Integer theMode) const
1394{
1395 if ( theIObj.IsNull() )
1396 return;
1397
1398 TColStd_ListOfInteger aModes;
1399 if ( theMode == -1 )
1400 ActivatedModes( theIObj, aModes );
1401 else
1402 aModes.Append( theMode );
1403
b586500b 1404 if (theOwners.IsNull())
1405 theOwners = new SelectMgr_IndexedMapOfOwner();
1406
7fd59977 1407 TColStd_ListIteratorOfListOfInteger anItr( aModes );
1408 for (; anItr.More(); anItr.Next() )
1409 {
1410 int aMode = anItr.Value();
1411 if ( !theIObj->HasSelection( aMode ) )
1412 continue;
1413
f751596e 1414 Handle(SelectMgr_Selection) aSel = theIObj->Selection(aMode);
7fd59977 1415
1416 for ( aSel->Init(); aSel->More(); aSel->Next() )
1417 {
f751596e 1418 Handle(SelectBasics_SensitiveEntity) aEntity = aSel->Sensitive()->BaseSensitive();
7fd59977 1419 if ( aEntity.IsNull() )
1420 continue;
1421
1422 Handle(SelectMgr_EntityOwner) aOwner =
1423 Handle(SelectMgr_EntityOwner)::DownCast(aEntity->OwnerId());
1424 if ( !aOwner.IsNull() )
b586500b 1425 theOwners->Add( aOwner );
7fd59977 1426 }
1427 }
1428}
1429
c3282ec1 1430//=======================================================================
1431//function : NbSelected
1432//purpose :
1433//=======================================================================
1434Standard_Integer AIS_InteractiveContext::NbSelected()
7fd59977 1435{
780ee4e2 1436 if (HasOpenedContext())
c3282ec1 1437 {
780ee4e2 1438 return myLocalContexts (myCurLocalIndex)->Selection()->Extent();
c3282ec1 1439 }
780ee4e2 1440 return mySelection->Extent();
7fd59977 1441}
1442
1443//=======================================================================
1444//function : HasApplicative
c3282ec1 1445//purpose :
7fd59977 1446//=======================================================================
7fd59977 1447 Standard_Boolean AIS_InteractiveContext::HasApplicative() const
1448{
c3282ec1 1449 return SelectedInteractive()->HasOwner();
7fd59977 1450}
1451
1452//=======================================================================
1453//function : Applicative
c3282ec1 1454//purpose :
7fd59977 1455//=======================================================================
7fd59977 1456Handle(Standard_Transient) AIS_InteractiveContext::Applicative() const
1457{
c3282ec1 1458 return SelectedInteractive()->GetOwner();
7fd59977 1459}
1460
7fd59977 1461//==================================================
c3282ec1 1462// Function: HasDetected
7fd59977 1463// Purpose :
1464//==================================================
c3282ec1 1465Standard_Boolean AIS_InteractiveContext::HasDetected() const
7fd59977 1466{
1467 if(HasOpenedContext())
1468 return myLocalContexts(myCurLocalIndex)->HasDetected();
c3282ec1 1469
1470 return !myLastPicked.IsNull();
7fd59977 1471}
1472
1473//=======================================================================
1474//function : HasDetectedShape
1475//purpose :
1476//=======================================================================
1477
1478Standard_Boolean AIS_InteractiveContext::HasDetectedShape() const
1479{
1480 if(HasOpenedContext())
1481 return myLocalContexts(myCurLocalIndex)->HasDetectedShape();
1482 return Standard_False;
1483}
1484
1485//=======================================================================
1486//function : DetectedShape
1487//purpose :
1488//=======================================================================
1489
1490const TopoDS_Shape&
1491AIS_InteractiveContext::DetectedShape() const
1492{
1493 return myLocalContexts(myCurLocalIndex)->DetectedShape();
1494}
1495
1496//=======================================================================
1497//function : DetectedInteractive
c3282ec1 1498//purpose :
7fd59977 1499//=======================================================================
c3282ec1 1500Handle(AIS_InteractiveObject) AIS_InteractiveContext::DetectedInteractive() const
7fd59977 1501{
c3282ec1 1502 if (HasOpenedContext())
7fd59977 1503 return myLocalContexts(myCurLocalIndex)->DetectedInteractive();
c3282ec1 1504
1505 return Handle(AIS_InteractiveObject)::DownCast (myLastPicked->Selectable());
7fd59977 1506}
1507
f0cddd16 1508//=======================================================================
1509//function : HasNextDetected
1510//purpose :
1511//=======================================================================
7fd59977 1512Standard_Boolean AIS_InteractiveContext::HasNextDetected() const
1513{
f0cddd16 1514 if (HasOpenedContext())
1515 {
7fd59977 1516 return myLocalContexts(myCurLocalIndex)->HasNextDetected();
f0cddd16 1517 }
1518
1519 return !myDetectedSeq.IsEmpty() && myCurHighlighted <= myDetectedSeq.Upper();
7fd59977 1520}
1521
1522
1523//=======================================================================
1524//function : DetectedOwner
1525//purpose :
1526//=======================================================================
1527Handle(SelectMgr_EntityOwner) AIS_InteractiveContext::DetectedOwner() const
1528{
c3282ec1 1529 if (HasOpenedContext())
7fd59977 1530 return myLocalContexts(myCurLocalIndex)->DetectedOwner();
7fd59977 1531
c3282ec1 1532 return myLastPicked;
1533}
7fd59977 1534
1535//=======================================================================
1536//function : HilightNextDetected
679ecdee 1537//purpose :
7fd59977 1538//=======================================================================
679ecdee 1539Standard_Integer AIS_InteractiveContext::HilightNextDetected (const Handle(V3d_View)& theView,
1540 const Standard_Boolean theToRedrawImmediate)
7fd59977 1541{
f0cddd16 1542 if (HasOpenedContext())
1543 {
1544 return myLocalContexts (myCurLocalIndex)->HilightNextDetected (theView, theToRedrawImmediate);
1545 }
1546
1547 myMainPM->ClearImmediateDraw();
1548 if (myDetectedSeq.IsEmpty())
1549 {
1550 return 0;
1551 }
1552
1553 if (++myCurHighlighted > myDetectedSeq.Upper())
1554 {
1555 myCurHighlighted = myDetectedSeq.Lower();
1556 }
1557 const Handle(SelectMgr_EntityOwner)& anOwner = myMainSel->Picked (myDetectedSeq (myCurHighlighted));
1558 if (anOwner.IsNull())
1559 {
1560 return 0;
1561 }
1562
1563 highlightWithColor (anOwner, theView->Viewer());
1564 myLastPicked = anOwner;
1565 myLastinMain = myLastPicked;
1566
1567 if (theToRedrawImmediate)
1568 {
1569 myMainPM->RedrawImmediate (theView->Viewer());
1570 myMainVwr->RedrawImmediate();
1571 }
1572
1573 return myCurHighlighted;
7fd59977 1574}
1575
1576//=======================================================================
f0cddd16 1577//function : HilightPreviousDetected
679ecdee 1578//purpose :
7fd59977 1579//=======================================================================
679ecdee 1580Standard_Integer AIS_InteractiveContext::HilightPreviousDetected (const Handle(V3d_View)& theView,
1581 const Standard_Boolean theToRedrawImmediate)
7fd59977 1582{
f0cddd16 1583 if (HasOpenedContext())
1584 {
1585 return myLocalContexts (myCurLocalIndex)->HilightPreviousDetected (theView, theToRedrawImmediate);
1586 }
1587
1588 myMainPM->ClearImmediateDraw();
1589 if (myDetectedSeq.IsEmpty())
1590 {
1591 return 0;
1592 }
1593
1594 if (--myCurHighlighted < myDetectedSeq.Lower())
1595 {
1596 myCurHighlighted = myDetectedSeq.Upper();
1597 }
1598 const Handle(SelectMgr_EntityOwner)& anOwner = myMainSel->Picked (myDetectedSeq (myCurHighlighted));
1599 if (anOwner.IsNull())
1600 {
1601 return 0;
1602 }
1603
1604 highlightWithColor (anOwner, theView->Viewer());
1605 myLastPicked = anOwner;
1606 myLastinMain = myLastPicked;
1607
1608 if (theToRedrawImmediate)
1609 {
1610 myMainPM->RedrawImmediate (theView->Viewer());
1611 myMainVwr->RedrawImmediate();
1612 }
1613
1614 return myCurHighlighted;
7fd59977 1615}
1616
7fd59977 1617//=======================================================================
1618//function : InitDetected
1619//purpose :
1620//=======================================================================
1621void AIS_InteractiveContext::InitDetected()
1622{
57ad5cbd 1623 if (HasOpenedContext())
7fd59977 1624 {
f0cddd16 1625 myLocalContexts (myCurLocalIndex)->InitDetected();
7fd59977 1626 return;
1627 }
1628
f0cddd16 1629 if (!myDetectedSeq.IsEmpty())
57ad5cbd 1630 {
f0cddd16 1631 myCurDetected = myDetectedSeq.Lower();
57ad5cbd 1632 }
7fd59977 1633}
1634
1635//=======================================================================
1636//function : MoreDetected
1637//purpose :
1638//=======================================================================
1639Standard_Boolean AIS_InteractiveContext::MoreDetected() const
1640{
57ad5cbd 1641 if (HasOpenedContext())
1642 {
f0cddd16 1643 return myLocalContexts (myCurLocalIndex)->MoreDetected();
57ad5cbd 1644 }
7fd59977 1645
f0cddd16 1646 return myCurDetected >= myDetectedSeq.Lower() && myCurDetected <= myDetectedSeq.Upper();
7fd59977 1647}
1648
1649//=======================================================================
1650//function : NextDetected
1651//purpose :
1652//=======================================================================
1653void AIS_InteractiveContext::NextDetected()
1654{
f0cddd16 1655 if (HasOpenedContext())
7fd59977 1656 {
f0cddd16 1657 myLocalContexts (myCurLocalIndex)->NextDetected();
7fd59977 1658 return;
1659 }
1660
f0cddd16 1661 myCurDetected++;
7fd59977 1662}
1663
1664//=======================================================================
d21ddc4f 1665//function : DetectedCurrentOwner
1666//purpose :
1667//=======================================================================
1668Handle(SelectMgr_EntityOwner) AIS_InteractiveContext::DetectedCurrentOwner() const
1669{
1670 if (HasOpenedContext())
1671 {
1672 return myLocalContexts (myCurLocalIndex)->DetectedCurrentOwner();
1673 }
1674
1675 return MoreDetected()
1676 ? myMainSel->Picked (myDetectedSeq (myCurDetected))
1677 : Handle(SelectMgr_EntityOwner)();
1678}
1679
1680//=======================================================================
7fd59977 1681//function : DetectedCurrentShape
1682//purpose :
1683//=======================================================================
7fd59977 1684const TopoDS_Shape& AIS_InteractiveContext::DetectedCurrentShape() const
1685{
57ad5cbd 1686 if (HasOpenedContext())
1687 {
7fd59977 1688 return myLocalContexts(myCurLocalIndex)->DetectedCurrentShape();
57ad5cbd 1689 }
7fd59977 1690
404c8936 1691 Standard_DISABLE_DEPRECATION_WARNINGS
57ad5cbd 1692 Handle(AIS_Shape) aCurrentShape = Handle(AIS_Shape)::DownCast (DetectedCurrentObject());
404c8936 1693 Standard_ENABLE_DEPRECATION_WARNINGS
57ad5cbd 1694
1695 if (aCurrentShape.IsNull())
1696 {
896faa72 1697 return AIS_InteractiveContext_myDummyShape;
57ad5cbd 1698 }
1699
1700 return aCurrentShape->Shape();
7fd59977 1701}
1702
1703//=======================================================================
1704//function : DetectedCurrentObject
1705//purpose :
1706//=======================================================================
57ad5cbd 1707Handle(AIS_InteractiveObject) AIS_InteractiveContext::DetectedCurrentObject() const
1708{
1709 if (HasOpenedContext())
1710 {
7fd59977 1711 return myLocalContexts(myCurLocalIndex)->DetectedCurrentObject();
57ad5cbd 1712 }
7fd59977 1713
f0cddd16 1714 return MoreDetected()
1715 ? Handle(AIS_InteractiveObject)::DownCast (myMainSel->Picked (myDetectedSeq (myCurDetected))->Selectable())
1716 : NULL;
7fd59977 1717}
c3282ec1 1718
1719//=======================================================================
1720//function : FirstSelectedObject
1721//purpose :
1722//=======================================================================
1723Handle(AIS_InteractiveObject) AIS_InteractiveContext::FirstSelectedObject()
1724{
1725 Handle(AIS_InteractiveObject) anObject;
1726
1727 if (HasOpenedContext())
1728 return anObject;
1729
1730 InitSelected();
1731 if (MoreSelected())
1732 {
1733 return SelectedInteractive();
1734 }
1735 return anObject;
1736}
1737
1738//=======================================================================
1739//function : RedrawImmediate
1740//purpose : Redisplays immediate strucures of the viewer given according to their visibility
1741//=======================================================================
1742void AIS_InteractiveContext::RedrawImmediate (const Handle(V3d_Viewer)& theViewer)
1743{
1744 myMainPM->RedrawImmediate (theViewer);
1745}