0028888: Visualization - AIS_InteractiveContext should not hold V3d_View handle which...
[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
b4006117 155//=======================================================================
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
8e5fb5ea 202//=======================================================================
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
7fd59977 297//=======================================================================
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
016e5959 428//=======================================================================
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
7fd59977 446//=======================================================================
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 {
731c9b5b 567 if (!myLastinMain->IsSelected() || myLastinMain->IsForcedHilight())
c398b00e 568 {
c3282ec1 569 SetSelected (myLastinMain, Standard_False);
c398b00e 570 if(toUpdateViewer)
7fd59977 571 {
c398b00e 572 UpdateCurrentViewer();
7fd59977 573 }
c398b00e 574 }
7fd59977 575 }
c398b00e 576 else
577 {
b4006117 578 unhighlightSelected (Standard_True);
c398b00e 579
02974a19 580 mySelection->Clear();
c398b00e 581 if (toUpdateViewer && myWasLastMain)
582 {
eb4320f2 583 UpdateCurrentViewer();
7fd59977 584 }
585 }
c398b00e 586
c3282ec1 587 Standard_Integer aSelNum = NbSelected();
c398b00e 588
589 return (aSelNum == 0) ? AIS_SOP_NothingSelected
590 : (aSelNum == 1) ? AIS_SOP_OneSelected
591 : AIS_SOP_SeveralSelected;
7fd59977 592}
593
594//=======================================================================
595//function : ShiftSelect
596//purpose :
597//=======================================================================
c398b00e 598AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const Standard_Boolean toUpdateViewer)
7fd59977 599{
c398b00e 600 if (HasOpenedContext())
601 {
7fd59977 602 if(myWasLastMain)
c398b00e 603 {
604 return myLocalContexts (myCurLocalIndex)->ShiftSelect (toUpdateViewer);
605 }
606 else
607 {
608 myLocalContexts (myCurLocalIndex)->AddOrRemoveSelected (myLastPicked, toUpdateViewer);
609
610 Standard_Integer aSelNum = NbSelected();
611 return (aSelNum == 0) ? AIS_SOP_NothingSelected
612 : (aSelNum == 1) ? AIS_SOP_OneSelected
613 : AIS_SOP_SeveralSelected;
7fd59977 614 }
615 }
eb4320f2 616
731c9b5b 617 clearDynamicHighlight();
c398b00e 618 if (myWasLastMain && !myLastinMain.IsNull())
619 {
c3282ec1 620 AddOrRemoveSelected (myLastinMain, toUpdateViewer);
c398b00e 621 }
7fd59977 622
c3282ec1 623 Standard_Integer aSelNum = NbSelected();
c398b00e 624
c3282ec1 625 return (aSelNum == 0) ? AIS_SOP_NothingSelected
626 : (aSelNum == 1) ? AIS_SOP_OneSelected
627 : AIS_SOP_SeveralSelected;
c398b00e 628}
7fd59977 629
630//=======================================================================
631//function : ShiftSelect
632//purpose :
633//=======================================================================
c398b00e 634AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const Standard_Integer theXPMin,
635 const Standard_Integer theYPMin,
636 const Standard_Integer theXPMax,
637 const Standard_Integer theYPMax,
638 const Handle(V3d_View)& theView,
639 const Standard_Boolean toUpdateViewer)
7fd59977 640{
c398b00e 641 if (HasOpenedContext())
642 {
643 return myLocalContexts(myCurLocalIndex)->ShiftSelect (theXPMin, theYPMin, theXPMax, theYPMax,
644 theView, toUpdateViewer);
645 }
646
c3282ec1 647 UnhilightSelected (Standard_False);
c398b00e 648
649 Handle(StdSelect_ViewerSelector3d) aSelector;
650 if (theView->Viewer() == myMainVwr)
651 {
652 aSelector = myMainSel;
653 myWasLastMain = Standard_True;
654 }
7fd59977 655 else
c398b00e 656 {
7fd59977 657 return AIS_SOP_NothingSelected;
c398b00e 658 }
659
660 aSelector->Pick (theXPMin, theYPMin, theXPMax, theYPMax, theView);
aa75c0cf 661 for (Standard_Integer aPickIter = 1; aPickIter <= aSelector->NbPicked(); ++aPickIter)
c398b00e 662 {
aa75c0cf 663 const Handle(SelectMgr_EntityOwner) anOwner = aSelector->Picked (aPickIter);
c3282ec1 664 if (anOwner.IsNull() || !anOwner->HasSelectable() || !myFilters->IsOk (anOwner))
665 continue;
666
016e5959 667 AIS_SelectStatus aSelStatus = mySelection->Select (anOwner);
f838dac4 668 anOwner->SetSelected (aSelStatus == AIS_SS_Added);
7fd59977 669 }
c398b00e 670
c3282ec1 671 HilightSelected (toUpdateViewer);
c398b00e 672
c3282ec1 673 Standard_Integer aSelNum = NbSelected();
c398b00e 674
675 return (aSelNum == 0) ? AIS_SOP_NothingSelected
676 : (aSelNum == 1) ? AIS_SOP_OneSelected
677 : AIS_SOP_SeveralSelected;
678
7fd59977 679}
680
681//=======================================================================
682//function : ShiftSelect
683//purpose :
684//=======================================================================
c398b00e 685AIS_StatusOfPick AIS_InteractiveContext::ShiftSelect (const TColgp_Array1OfPnt2d& thePolyline,
686 const Handle(V3d_View)& theView,
687 const Standard_Boolean toUpdateViewer)
7fd59977 688{
c398b00e 689 if (HasOpenedContext())
690 {
691 return myLocalContexts(myCurLocalIndex)->ShiftSelect (thePolyline, theView, toUpdateViewer);
692 }
7fd59977 693
c3282ec1 694 UnhilightSelected (Standard_False);
c398b00e 695
696 Handle(StdSelect_ViewerSelector3d) aSelector;
697
698 if (theView->Viewer() == myMainVwr)
699 {
700 aSelector= myMainSel;
701 myWasLastMain = Standard_True;
702 }
703 else
704 {
705 return AIS_SOP_NothingSelected;
706 }
707
708 aSelector->Pick (thePolyline, theView);
aa75c0cf 709 for (Standard_Integer aPickIter = 1; aPickIter <= aSelector->NbPicked(); ++aPickIter)
c398b00e 710 {
aa75c0cf 711 const Handle(SelectMgr_EntityOwner) anOwner = aSelector->Picked (aPickIter);
c3282ec1 712 if (anOwner.IsNull() || !anOwner->HasSelectable() || !myFilters->IsOk (anOwner))
713 continue;
714
016e5959 715 AIS_SelectStatus aSelStatus = mySelection->Select (anOwner);
f838dac4 716 anOwner->SetSelected (aSelStatus == AIS_SS_Added);
c398b00e 717 }
718
c3282ec1 719 HilightSelected (toUpdateViewer);
c398b00e 720
c3282ec1 721 Standard_Integer aSelNum = NbSelected();
c398b00e 722
723 return (aSelNum == 0) ? AIS_SOP_NothingSelected
724 : (aSelNum == 1) ? AIS_SOP_OneSelected
725 : AIS_SOP_SeveralSelected;
7fd59977 726}
727
728//=======================================================================
729//function : SetCurrentObject
c3282ec1 730//purpose : OBSOLETE, please use SetSelected() instead
731//TODO : Remove in process of local context deletion
7fd59977 732//=======================================================================
c3282ec1 733void AIS_InteractiveContext::SetCurrentObject (const Handle(AIS_InteractiveObject)& theObject,
734 const Standard_Boolean theToUpdateViewer)
7fd59977 735{
c3282ec1 736 if (HasOpenedContext())
7fd59977 737 return;
7fd59977 738
c3282ec1 739 SetSelected (theObject, theToUpdateViewer);
7fd59977 740}
741
742//=======================================================================
743//function : AddOrRemoveCurrentObject
c3282ec1 744//purpose : OBSOLETE, please use AddOrRemoveSelected() instead
745//TODO : Remove in process of local context deletion
7fd59977 746//=======================================================================
c3282ec1 747void AIS_InteractiveContext::AddOrRemoveCurrentObject (const Handle(AIS_InteractiveObject)& theObj,
748 const Standard_Boolean theIsToUpdateViewer)
7fd59977 749{
c3282ec1 750 if (HasOpenedContext())
751 return;
7fd59977 752
c3282ec1 753 AddOrRemoveSelected (theObj, theIsToUpdateViewer);
7fd59977 754}
755//=======================================================================
756//function : UpdateCurrent
c3282ec1 757//purpose : OBSOLETE, please use UpdateSelected() instead
758//TODO : Remove in process of local context deletion
7fd59977 759//=======================================================================
7fd59977 760void AIS_InteractiveContext::UpdateCurrent()
761{
0577ae8c 762 UpdateSelected (Standard_True);
7fd59977 763}
764
765//=======================================================================
766//function : IsCurrent
c3282ec1 767//purpose : OBSOLETE, please use IsSelected() instead
768//TODO : Remove in process of local context deletion
7fd59977 769//=======================================================================
c3282ec1 770Standard_Boolean AIS_InteractiveContext::IsCurrent (const Handle(AIS_InteractiveObject)& theObject) const
7fd59977 771{
c3282ec1 772 return IsSelected (theObject);
7fd59977 773}
774
775//=======================================================================
776//function : InitCurrent
c3282ec1 777//purpose : OBSOLETE, please use InitSelected() instead
778//TODO : Remove in process of local context deletion
7fd59977 779//=======================================================================
7fd59977 780void AIS_InteractiveContext::InitCurrent()
781{
c3282ec1 782 if (HasOpenedContext())
783 return;
784
785 InitSelected();
7fd59977 786}
787
788//=======================================================================
789//function : MoreCurrent
c3282ec1 790//purpose : OBSOLETE, please use MoreSelected() instead
791//TODO : Remove in process of local context deletion
7fd59977 792//=======================================================================
7fd59977 793Standard_Boolean AIS_InteractiveContext::MoreCurrent() const
794{
c3282ec1 795 return !HasOpenedContext() && MoreSelected();
7fd59977 796}
797
798//=======================================================================
799//function : NextCurrent
c3282ec1 800//purpose : OBSOLETE, please use NextSelected() instead
801//TODO : Remove in process of local context deletion
7fd59977 802//=======================================================================
7fd59977 803void AIS_InteractiveContext::NextCurrent()
804{
c3282ec1 805 if (HasOpenedContext())
806 return;
807
808 NextSelected();
7fd59977 809}
810
811//=======================================================================
812//function : Current
c3282ec1 813//purpose : OBSOLETE, please use SelectedInteractive() instead
814//TODO : Remove in process of local context deletion
7fd59977 815//=======================================================================
7fd59977 816Handle(AIS_InteractiveObject) AIS_InteractiveContext::Current() const
817{
c3282ec1 818 return HasOpenedContext() ? NULL : SelectedInteractive();
7fd59977 819}
820
821//=======================================================================
822//function : NbCurrents
c3282ec1 823//purpose : OBSOLETE, please use NbSelected() instead
824//TODO : Remove in process of local context deletion
7fd59977 825//=======================================================================
826Standard_Integer AIS_InteractiveContext::NbCurrents()
827{
c3282ec1 828 return HasOpenedContext() ? -1 : NbSelected();
7fd59977 829}
830
831//=======================================================================
832//function : HilightCurrents
c3282ec1 833//purpose : OBSOLETE, please use HilightSelected() instead
834//TODO : Remove in process of local context deletion
7fd59977 835//=======================================================================
c3282ec1 836void AIS_InteractiveContext::HilightCurrents (const Standard_Boolean theToUpdateViewer)
7fd59977 837{
c3282ec1 838 if (HasOpenedContext())
839 return;
840
841 HilightSelected (theToUpdateViewer);
7fd59977 842}
843
844//=======================================================================
845//function : UnhilightCurrents
c3282ec1 846//purpose : OBSOLETE, please use UnhilightSelected() instead
847//TODO : Remove in process of local context deletion
7fd59977 848//=======================================================================
c3282ec1 849void AIS_InteractiveContext::UnhilightCurrents (const Standard_Boolean theToUpdateViewer)
7fd59977 850{
c3282ec1 851 if (HasOpenedContext())
852 return;
853
854 UnhilightSelected (theToUpdateViewer);
7fd59977 855}
856
857//=======================================================================
858//function : ClearCurrents
c3282ec1 859//purpose : OBSOLETE, please use ClearCurrents() instead
860//TODO : Remove in process of local context deletion
7fd59977 861//=======================================================================
c3282ec1 862void AIS_InteractiveContext::ClearCurrents(const Standard_Boolean theToUpdateViewer)
7fd59977 863{
c3282ec1 864 if (HasOpenedContext())
865 return;
866
867 ClearSelected (theToUpdateViewer);
7fd59977 868}
869
870
871//=======================================================================
872//function : HilightSelected
c3282ec1 873//purpose :
7fd59977 874//=======================================================================
c3282ec1 875void AIS_InteractiveContext::HilightSelected (const Standard_Boolean theToUpdateViewer)
7fd59977 876{
c3282ec1 877 if (HasOpenedContext())
878 {
879 return myLocalContexts (myCurLocalIndex)->HilightPicked (theToUpdateViewer);
880 }
881
882 // In case of selection without using local context
731c9b5b 883 clearDynamicHighlight();
c3282ec1 884 AIS_MapOfObjSelectedOwners anObjOwnerMap;
02974a19 885 for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
c3282ec1 886 {
02974a19 887 const Handle(SelectMgr_EntityOwner) anOwner = aSelIter.Value();
888 const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
f838dac4 889 const Handle(Prs3d_Drawer)& anObjSelStyle = getSelStyle (anObj, anOwner);
890 Handle(AIS_GlobalStatus)& aState = myObjects.ChangeFind(anObj);
02974a19 891 if (anOwner == anObj->GlobalSelOwner())
c3282ec1 892 {
02974a19 893 aState->SetHilightStatus (Standard_True);
8e5fb5ea 894 aState->SetHilightStyle (anObjSelStyle);
02974a19 895 }
f838dac4 896 anOwner->SetSelected (Standard_True);
02974a19 897 if (!anOwner->IsAutoHilight())
898 {
899 NCollection_Handle<SelectMgr_SequenceOfOwner> aSeq;
900 if (anObjOwnerMap.Find (anObj, aSeq))
c3282ec1 901 {
02974a19 902 aSeq->Append (anOwner);
c3282ec1 903 }
904 else
905 {
02974a19 906 aSeq = new SelectMgr_SequenceOfOwner();
907 aSeq->Append (anOwner);
908 anObjOwnerMap.Bind (anObj, aSeq);
c3282ec1 909 }
7fd59977 910 }
02974a19 911 else
912 {
f838dac4 913 const Standard_Integer aHiMode = getHilightMode (anObj, anObjSelStyle, aState->DisplayMode());
8e5fb5ea 914 anOwner->HilightWithColor (myMainPM, anObjSelStyle, aHiMode);
02974a19 915 }
7fd59977 916 }
c3282ec1 917
918 if (!anObjOwnerMap.IsEmpty())
919 {
920 for (AIS_MapOfObjSelectedOwners::Iterator anIter (anObjOwnerMap); anIter.More(); anIter.Next())
7fd59977 921 {
c3282ec1 922 anIter.Key()->HilightSelected (myMainPM, *anIter.Value());
7fd59977 923 }
c3282ec1 924 anObjOwnerMap.Clear();
925 }
926
927 if (theToUpdateViewer)
7fd59977 928 UpdateCurrentViewer();
929}
930
931//=======================================================================
932//function : UnhilightSelected
c3282ec1 933//purpose :
7fd59977 934//=======================================================================
c3282ec1 935void AIS_InteractiveContext::UnhilightSelected (const Standard_Boolean theToUpdateViewer)
7fd59977 936{
c3282ec1 937 if (HasOpenedContext())
938 {
939 return myLocalContexts (myCurLocalIndex)->UnhilightPicked (theToUpdateViewer);
7fd59977 940 }
c3282ec1 941
02974a19 942 for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
c3282ec1 943 {
02974a19 944 const Handle(SelectMgr_EntityOwner) anOwner = aSelIter.Value();
945 const Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
946 if (anOwner == anObj->GlobalSelOwner())
7fd59977 947 {
02974a19 948 myObjects.ChangeFind (anObj)->SetHilightStatus (Standard_False);
7fd59977 949 }
02974a19 950
f838dac4 951 anOwner->SetSelected (Standard_False);
952 anOwner->Unhilight (myMainPM);
c3282ec1 953 }
954
955 if (theToUpdateViewer)
956 UpdateCurrentViewer();
7fd59977 957}
958
959
960//=======================================================================
961//function : ClearSelected
c3282ec1 962//purpose :
7fd59977 963//=======================================================================
c3282ec1 964void AIS_InteractiveContext::ClearSelected (const Standard_Boolean theToUpdateViewer)
7fd59977 965{
c3282ec1 966 if (HasOpenedContext())
967 return myLocalContexts (myCurLocalIndex)->ClearSelected (theToUpdateViewer);
7fd59977 968
c3282ec1 969 if (NbSelected() == 0)
970 return;
7fd59977 971
b4006117 972 unhighlightSelected();
7fd59977 973
02974a19 974 mySelection->Clear();
731c9b5b 975 clearDynamicHighlight();
7fd59977 976
c3282ec1 977 if (theToUpdateViewer)
978 UpdateCurrentViewer();
7fd59977 979}
980
981//=======================================================================
c3282ec1 982//function : UpdateSelected
983//purpose :
7fd59977 984//=======================================================================
c3282ec1 985void AIS_InteractiveContext::UpdateSelected (const Standard_Boolean theToUpdateViewer)
986{
987 if (HasOpenedContext())
988 {
989 return myLocalContexts(myCurLocalIndex)->UpdateSelected (theToUpdateViewer);
990 }
7fd59977 991
c3282ec1 992 HilightSelected (theToUpdateViewer);
993}
994
995//=======================================================================
996//function : SetSelected
997//purpose : Sets the whole object as selected and highlights it with selection color
998//=======================================================================
999void AIS_InteractiveContext::SetSelected (const Handle(AIS_InteractiveObject)& theObject,
1000 const Standard_Boolean theToUpdateViewer)
7fd59977 1001{
f838dac4 1002 if (HasOpenedContext())
c3282ec1 1003 {
1004 return myLocalContexts (myCurLocalIndex)->SetSelected (theObject, theToUpdateViewer);
1005 }
1006
1007 if (theObject.IsNull())
f838dac4 1008 {
7fd59977 1009 return;
f838dac4 1010 }
1011
1012 if (!myObjects.IsBound (theObject))
1013 {
c3282ec1 1014 Display (theObject, Standard_False);
f838dac4 1015 }
0d5880e1 1016 if (!theObject->HasSelection (theObject->GlobalSelectionMode()))
f838dac4 1017 {
c3282ec1 1018 return;
f838dac4 1019 }
1020 Handle(SelectMgr_EntityOwner) anOwner = theObject->GlobalSelOwner();
1021 if (anOwner.IsNull())
1022 {
1023 return;
1024 }
c3282ec1 1025
f838dac4 1026 const Handle(Prs3d_Drawer)& anObjSelStyle = getSelStyle (theObject, anOwner);
e1b01c73 1027 if (NbSelected() == 1 && myObjects (theObject)->IsHilighted())
c3282ec1 1028 {
f838dac4 1029 Handle(Prs3d_Drawer) aCustomStyle;
8e5fb5ea 1030 if (HighlightStyle (theObject, aCustomStyle))
c3282ec1 1031 {
8e5fb5ea 1032 if (!aCustomStyle.IsNull() && anObjSelStyle != aCustomStyle)
c3282ec1 1033 {
8e5fb5ea 1034 HilightWithColor (theObject, anObjSelStyle, theToUpdateViewer);
c3282ec1 1035 }
1036 }
1037 return;
1038 }
1039
016e5959 1040 for (mySelection->Init(); mySelection->More(); mySelection->Next())
c3282ec1 1041 {
f838dac4 1042 const Handle(SelectMgr_EntityOwner) aSelOwner = mySelection->Value();
1043 if (!myFilters->IsOk (aSelOwner))
02974a19 1044 {
c3282ec1 1045 continue;
02974a19 1046 }
c3282ec1 1047
f838dac4 1048 Handle(AIS_InteractiveObject) aSelectable = Handle(AIS_InteractiveObject)::DownCast (aSelOwner->Selectable());
c3282ec1 1049 Unhilight (aSelectable, Standard_False);
f838dac4 1050 aSelOwner->SetSelected (Standard_False);
1051 if (aSelOwner == aSelectable->GlobalSelOwner())
e1b01c73 1052 {
1053 myObjects.ChangeFind (aSelectable)->SetHilightStatus (Standard_False);
1054 }
c3282ec1 1055 }
1056
1057 // added to avoid untimely viewer update...
016e5959 1058 mySelection->ClearAndSelect (anOwner);
0d5880e1 1059
f838dac4 1060 Handle(Prs3d_Drawer) aCustomStyle;
8e5fb5ea 1061 if (HighlightStyle (theObject, aCustomStyle))
c3282ec1 1062 {
8e5fb5ea 1063 if (!aCustomStyle.IsNull() && anObjSelStyle != aCustomStyle)
c3282ec1 1064 {
8e5fb5ea 1065 HilightWithColor (theObject, anObjSelStyle, Standard_False);
c3282ec1 1066 }
7fd59977 1067 }
c3282ec1 1068 else
1069 {
8e5fb5ea 1070 HilightWithColor (theObject, anObjSelStyle, Standard_False);
c3282ec1 1071 }
f838dac4 1072 anOwner->SetSelected (Standard_True);
c3282ec1 1073
1074 if (theToUpdateViewer)
1075 UpdateCurrentViewer();
7fd59977 1076}
1077
1078//=======================================================================
c3282ec1 1079//function : SetSelected
1080//purpose : Sets the whole object as selected and highlights it with selection color
7fd59977 1081//=======================================================================
c3282ec1 1082void AIS_InteractiveContext::SetSelected (const Handle(SelectMgr_EntityOwner)& theOwner,
1083 const Standard_Boolean theToUpdateViewer)
7fd59977 1084{
b4006117 1085 if (theOwner.IsNull() || !theOwner->HasSelectable() || !myFilters->IsOk (theOwner))
c3282ec1 1086 return;
1087
f838dac4 1088 const Handle(AIS_InteractiveObject) anObject = Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
1089 const Handle(Prs3d_Drawer)& anObjSelStyle = getSelStyle (anObject, theOwner);
731c9b5b 1090 if (NbSelected() == 1 && theOwner->IsSelected() && !theOwner->IsForcedHilight())
c3282ec1 1091 {
f838dac4 1092 Handle(Prs3d_Drawer) aCustomStyle;
8e5fb5ea 1093 if (HighlightStyle (theOwner, aCustomStyle))
c3282ec1 1094 {
8e5fb5ea 1095 if (!aCustomStyle.IsNull() && anObjSelStyle != aCustomStyle)
c3282ec1 1096 {
1097 const Standard_Integer aHiMode = anObject->HasHilightMode() ? anObject->HilightMode() : 0;
8e5fb5ea 1098 theOwner->HilightWithColor (myMainPM, anObjSelStyle, aHiMode);
c3282ec1 1099 }
1100 }
1101 return;
1102 }
1103
1104 if (!myObjects.IsBound (anObject))
1105 Display (anObject, Standard_False);
1106
b4006117 1107 unhighlightSelected();
c3282ec1 1108
016e5959 1109 mySelection->ClearAndSelect (theOwner);
f838dac4 1110 Handle(Prs3d_Drawer) aCustomStyle;
8e5fb5ea 1111 if (!HighlightStyle (theOwner, aCustomStyle) ||
1112 (!aCustomStyle.IsNull() && aCustomStyle != anObjSelStyle))
c3282ec1 1113 {
f838dac4 1114 theOwner->SetSelected (Standard_True);
8e5fb5ea 1115 highlightSelected (theOwner);
c3282ec1 1116 }
1117
f838dac4 1118 theOwner->SetSelected (Standard_True);
e1b01c73 1119 if (theOwner == anObject->GlobalSelOwner())
1120 {
1121 Handle(AIS_GlobalStatus)& aState = myObjects.ChangeFind (anObject);
1122 aState->SetHilightStatus (Standard_True);
8e5fb5ea 1123 aState->SetHilightStyle (anObjSelStyle);
e1b01c73 1124 }
1125
c3282ec1 1126 if (theToUpdateViewer)
1127 UpdateCurrentViewer();
7fd59977 1128}
1129
1130//=======================================================================
1131//function : AddOrRemoveSelected
c3282ec1 1132//purpose : Adds or removes current object from AIS selection and highlights/unhighlights it.
1133// Since this method makes sence only for neutral point selection of a whole object,
1134// if 0 selection of the object is empty this method simply does nothing.
7fd59977 1135//=======================================================================
c3282ec1 1136void AIS_InteractiveContext::AddOrRemoveSelected (const Handle(AIS_InteractiveObject)& theObject,
1137 const Standard_Boolean theToUpdateViewer)
7fd59977 1138{
95081657 1139 if (theObject.IsNull())
1140 return;
c3282ec1 1141
1142 if (HasOpenedContext())
1143 return myLocalContexts (myCurLocalIndex)->AddOrRemoveSelected (theObject, theToUpdateViewer);
1144
95081657 1145 const Standard_Integer aGlobalSelMode = theObject->GlobalSelectionMode();
1146 if (!myObjects.IsBound (theObject) || !theObject->HasSelection (aGlobalSelMode))
c3282ec1 1147 return;
1148
2ec85268 1149 setContextToObject (theObject);
7411850a 1150 const Handle(SelectMgr_EntityOwner) anOwner = theObject->GlobalSelOwner();
c3282ec1 1151
1152 if (anOwner.IsNull() || !anOwner->HasSelectable())
1153 return;
1154
1155 AddOrRemoveSelected (anOwner, theToUpdateViewer);
7fd59977 1156}
1157//=======================================================================
1158//function : AddOrRemoveSelected
1159//purpose :
1160//=======================================================================
1161
c3282ec1 1162void AIS_InteractiveContext::AddOrRemoveSelected (const TopoDS_Shape& aShap,
7fd59977 1163 const Standard_Boolean updateviewer)
1164{
1165 if(!HasOpenedContext()) {
0797d9d3 1166#ifdef OCCT_DEBUG
7fd59977 1167 cout<<" Attempt to remove a selected shape with no opened local context"<<endl;
1168#endif
1169 return;
1170 }
1171
1172 myLocalContexts(myCurLocalIndex)->AddOrRemoveSelected(aShap,updateviewer);
1173 if(updateviewer) UpdateCurrentViewer();
1174
1175}
c3282ec1 1176
7fd59977 1177//=======================================================================
1178//function : AddOrRemoveSelected
c3282ec1 1179//purpose : Allows to highlight or unhighlight the owner given depending on
1180// its selection status
7fd59977 1181//=======================================================================
c3282ec1 1182void AIS_InteractiveContext::AddOrRemoveSelected (const Handle(SelectMgr_EntityOwner)& theOwner,
1183 const Standard_Boolean theToUpdateViewer)
1184{
1185 if (HasOpenedContext())
1186 return myLocalContexts(myCurLocalIndex)->AddOrRemoveSelected (theOwner, theToUpdateViewer);
7fd59977 1187
c3282ec1 1188 if (theOwner.IsNull() || !theOwner->HasSelectable())
7fd59977 1189 return;
c3282ec1 1190
4d901cde 1191 if (!myFilters->IsOk(theOwner) && !theOwner->IsSelected())
1192 return;
1193
016e5959 1194 AIS_SelectStatus aSelStat = mySelection->Select (theOwner);
f838dac4 1195 theOwner->SetSelected (aSelStat == AIS_SS_Added);
c3282ec1 1196 const Handle(AIS_InteractiveObject) anObj =
1197 Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
1198 const Standard_Boolean isGlobal = anObj->GlobalSelOwner() == theOwner;
e1b01c73 1199 Handle(AIS_GlobalStatus)& aStatus = myObjects.ChangeFind (anObj);
f838dac4 1200 if (theOwner->IsSelected())
c3282ec1 1201 {
8e5fb5ea 1202 highlightSelected (theOwner);
c3282ec1 1203 if (isGlobal)
1204 {
1205 aStatus->SetHilightStatus (Standard_True);
f838dac4 1206 aStatus->SetHilightStyle (getSelStyle (anObj, theOwner));
c3282ec1 1207 }
1208 }
1209 else
1210 {
1211 if (theOwner->IsAutoHilight())
f838dac4 1212 {
1213 theOwner->Unhilight (myMainPM);
1214 }
c3282ec1 1215 else
f838dac4 1216 {
c3282ec1 1217 anObj->ClearSelected();
f838dac4 1218 }
c3282ec1 1219 aStatus->SetHilightStatus (Standard_False);
f838dac4 1220 aStatus->SetHilightStyle (Handle(Prs3d_Drawer)());
7fd59977 1221 }
7fd59977 1222
c3282ec1 1223 if (theToUpdateViewer)
1224 UpdateCurrentViewer();
1225}
7fd59977 1226
1227
1228//=======================================================================
1229//function : IsSelected
c3282ec1 1230//purpose :
7fd59977 1231//=======================================================================
c3282ec1 1232Standard_Boolean AIS_InteractiveContext::IsSelected (const Handle(AIS_InteractiveObject)& theObj) const
7fd59977 1233{
c3282ec1 1234 if(HasOpenedContext())
1235 return myLocalContexts(myCurLocalIndex)->IsSelected (theObj);
1236
1237 if (theObj.IsNull() || !myObjects.IsBound (theObj))
1238 return Standard_False;
1239
1240 const Standard_Integer aGlobalSelMode = theObj->GlobalSelectionMode();
1241 const TColStd_ListOfInteger& anActivatedModes = myObjects (theObj)->SelectionModes();
1242 Standard_Boolean isGlobalModeActivated = Standard_False;
1243 for (TColStd_ListIteratorOfListOfInteger aModeIter (anActivatedModes); aModeIter.More(); aModeIter.Next())
1244 {
1245 if (aModeIter.Value() == aGlobalSelMode)
1246 {
1247 isGlobalModeActivated = Standard_True;
1248 break;
1249 }
1250 }
95081657 1251 if (!theObj->HasSelection (aGlobalSelMode) || !isGlobalModeActivated || theObj->GlobalSelOwner().IsNull())
c3282ec1 1252 return Standard_False;
1253
f838dac4 1254 return theObj->GlobalSelOwner()->IsSelected();
7fd59977 1255}
1256
c3282ec1 1257//=======================================================================
1258//function : IsSelected
1259//purpose : Returns true is the owner given is selected
1260//=======================================================================
1261Standard_Boolean AIS_InteractiveContext::IsSelected (const Handle(SelectMgr_EntityOwner)& theOwner) const
1262{
1263 if (HasOpenedContext())
1264 return myLocalContexts(myCurLocalIndex)->IsSelected (theOwner);
1265
1266 if (theOwner.IsNull())
1267 return Standard_False;
1268
1269 return theOwner->IsSelected();
1270}
7fd59977 1271
1272//=======================================================================
1273//function : InitSelected
c3282ec1 1274//purpose :
7fd59977 1275//=======================================================================
7fd59977 1276void AIS_InteractiveContext::InitSelected()
1277{
c3282ec1 1278 if (HasOpenedContext())
1279 {
1280 myLocalContexts (myCurLocalIndex)->InitSelected();
1281 return;
1282 }
1283
016e5959 1284 mySelection->Init();
7fd59977 1285}
1286
1287//=======================================================================
1288//function : MoreSelected
c3282ec1 1289//purpose :
7fd59977 1290//=======================================================================
c3282ec1 1291Standard_Boolean AIS_InteractiveContext::MoreSelected() const
7fd59977 1292{
c3282ec1 1293 if (HasOpenedContext())
1294 return myLocalContexts (myCurLocalIndex)->MoreSelected();
1295
016e5959 1296 return mySelection->More();
7fd59977 1297}
1298
1299//=======================================================================
1300//function : NextSelected
c3282ec1 1301//purpose :
7fd59977 1302//=======================================================================
7fd59977 1303void AIS_InteractiveContext::NextSelected()
1304{
c3282ec1 1305 if(HasOpenedContext())
1306 {
1307 return myLocalContexts (myCurLocalIndex)->NextSelected();
c3282ec1 1308 }
1309
016e5959 1310 mySelection->Next();
7fd59977 1311}
1312
1313//=======================================================================
1314//function : HasSelectedShape
c3282ec1 1315//purpose :
7fd59977 1316//=======================================================================
c3282ec1 1317Standard_Boolean AIS_InteractiveContext::HasSelectedShape() const
7fd59977 1318{
c3282ec1 1319 if(HasOpenedContext())
1320 {
1321 return myLocalContexts(myCurLocalIndex)->HasSelectedShape();
7fd59977 1322 }
4aaadad7
SS
1323 if (!mySelection->More())
1324 return Standard_False;
1325
1326 const Handle(StdSelect_BRepOwner) anOwner =
1327 Handle(StdSelect_BRepOwner)::DownCast (mySelection->Value());
c3282ec1 1328
4aaadad7 1329 return !anOwner.IsNull() && anOwner->HasShape();
7fd59977 1330}
1331
1332//=======================================================================
1333//function : SelectedShape
c3282ec1 1334//purpose :
7fd59977 1335//=======================================================================
c3282ec1 1336TopoDS_Shape AIS_InteractiveContext::SelectedShape() const
7fd59977 1337{
c3282ec1 1338 if (HasOpenedContext())
0717ddc1 1339 {
1340 return myLocalContexts (myCurLocalIndex)->SelectedShape();
1341 }
7fd59977 1342
02974a19 1343 if (!mySelection->More())
c3282ec1 1344 return TopoDS_Shape();
7fd59977 1345
c3282ec1 1346 const Handle(StdSelect_BRepOwner) anOwner =
016e5959 1347 Handle(StdSelect_BRepOwner)::DownCast (mySelection->Value());
3475df12 1348 if (anOwner.IsNull() || !anOwner->HasSelectable())
c3282ec1 1349 return TopoDS_Shape();
1350
1351 return anOwner->Shape().Located (anOwner->Location() * anOwner->Shape().Location());
7fd59977 1352}
1353
c3282ec1 1354//=======================================================================
1355//function : SelectedInteractive
1356//purpose :
1357//=======================================================================
7fd59977 1358Handle(AIS_InteractiveObject) AIS_InteractiveContext::SelectedInteractive() const
1359{
c3282ec1 1360 if (HasOpenedContext())
1361 {
1362 return myLocalContexts(myCurLocalIndex)->SelectedInteractive();
1363 }
1364
02974a19 1365 return !mySelection->More()
1366 ? Handle(AIS_InteractiveObject)()
1367 : Handle(AIS_InteractiveObject)::DownCast (mySelection->Value()->Selectable());
7fd59977 1368}
1369//=======================================================================
c3282ec1 1370//function : SelectedOwner
1371//purpose :
7fd59977 1372//=======================================================================
c3282ec1 1373Handle(SelectMgr_EntityOwner) AIS_InteractiveContext::SelectedOwner() const
7fd59977 1374{
c3282ec1 1375 if(HasOpenedContext())
1376 {
1377 return myLocalContexts(myCurLocalIndex)->SelectedOwner();
7fd59977 1378 }
c3282ec1 1379
02974a19 1380 return !mySelection->More()
1381 ? Handle(SelectMgr_EntityOwner)()
1382 : mySelection->Value();
7fd59977 1383}
1384
1385//=======================================================================
1386//function : EntityOwners
1387//purpose :
1388//=======================================================================
b586500b 1389void AIS_InteractiveContext::EntityOwners(Handle(SelectMgr_IndexedMapOfOwner)& theOwners,
7fd59977 1390 const Handle(AIS_InteractiveObject)& theIObj,
1391 const Standard_Integer theMode) const
1392{
1393 if ( theIObj.IsNull() )
1394 return;
1395
1396 TColStd_ListOfInteger aModes;
1397 if ( theMode == -1 )
1398 ActivatedModes( theIObj, aModes );
1399 else
1400 aModes.Append( theMode );
1401
b586500b 1402 if (theOwners.IsNull())
1403 theOwners = new SelectMgr_IndexedMapOfOwner();
1404
7fd59977 1405 TColStd_ListIteratorOfListOfInteger anItr( aModes );
1406 for (; anItr.More(); anItr.Next() )
1407 {
1408 int aMode = anItr.Value();
1409 if ( !theIObj->HasSelection( aMode ) )
1410 continue;
1411
f751596e 1412 Handle(SelectMgr_Selection) aSel = theIObj->Selection(aMode);
7fd59977 1413
1414 for ( aSel->Init(); aSel->More(); aSel->Next() )
1415 {
f751596e 1416 Handle(SelectBasics_SensitiveEntity) aEntity = aSel->Sensitive()->BaseSensitive();
7fd59977 1417 if ( aEntity.IsNull() )
1418 continue;
1419
1420 Handle(SelectMgr_EntityOwner) aOwner =
1421 Handle(SelectMgr_EntityOwner)::DownCast(aEntity->OwnerId());
1422 if ( !aOwner.IsNull() )
b586500b 1423 theOwners->Add( aOwner );
7fd59977 1424 }
1425 }
1426}
1427
c3282ec1 1428//=======================================================================
1429//function : NbSelected
1430//purpose :
1431//=======================================================================
1432Standard_Integer AIS_InteractiveContext::NbSelected()
7fd59977 1433{
c3282ec1 1434 Standard_Integer aNbSelected = 0;
1435 for (InitSelected(); MoreSelected(); NextSelected())
1436 {
1437 aNbSelected++;
1438 }
1439
1440 return aNbSelected;
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//=======================================================================
1665//function : DetectedCurrentShape
1666//purpose :
1667//=======================================================================
7fd59977 1668const TopoDS_Shape& AIS_InteractiveContext::DetectedCurrentShape() const
1669{
57ad5cbd 1670 if (HasOpenedContext())
1671 {
7fd59977 1672 return myLocalContexts(myCurLocalIndex)->DetectedCurrentShape();
57ad5cbd 1673 }
7fd59977 1674
404c8936 1675 Standard_DISABLE_DEPRECATION_WARNINGS
57ad5cbd 1676 Handle(AIS_Shape) aCurrentShape = Handle(AIS_Shape)::DownCast (DetectedCurrentObject());
404c8936 1677 Standard_ENABLE_DEPRECATION_WARNINGS
57ad5cbd 1678
1679 if (aCurrentShape.IsNull())
1680 {
896faa72 1681 return AIS_InteractiveContext_myDummyShape;
57ad5cbd 1682 }
1683
1684 return aCurrentShape->Shape();
7fd59977 1685}
1686
1687//=======================================================================
1688//function : DetectedCurrentObject
1689//purpose :
1690//=======================================================================
57ad5cbd 1691Handle(AIS_InteractiveObject) AIS_InteractiveContext::DetectedCurrentObject() const
1692{
1693 if (HasOpenedContext())
1694 {
7fd59977 1695 return myLocalContexts(myCurLocalIndex)->DetectedCurrentObject();
57ad5cbd 1696 }
7fd59977 1697
f0cddd16 1698 return MoreDetected()
1699 ? Handle(AIS_InteractiveObject)::DownCast (myMainSel->Picked (myDetectedSeq (myCurDetected))->Selectable())
1700 : NULL;
7fd59977 1701}
c3282ec1 1702
1703//=======================================================================
1704//function : FirstSelectedObject
1705//purpose :
1706//=======================================================================
1707Handle(AIS_InteractiveObject) AIS_InteractiveContext::FirstSelectedObject()
1708{
1709 Handle(AIS_InteractiveObject) anObject;
1710
1711 if (HasOpenedContext())
1712 return anObject;
1713
1714 InitSelected();
1715 if (MoreSelected())
1716 {
1717 return SelectedInteractive();
1718 }
1719 return anObject;
1720}
1721
1722//=======================================================================
1723//function : RedrawImmediate
1724//purpose : Redisplays immediate strucures of the viewer given according to their visibility
1725//=======================================================================
1726void AIS_InteractiveContext::RedrawImmediate (const Handle(V3d_Viewer)& theViewer)
1727{
1728 myMainPM->RedrawImmediate (theViewer);
1729}