0026628: Button Erase (Delete where erase algorythm is used) works incorrect
[occt.git] / src / AIS / AIS_InteractiveContext.cxx
CommitLineData
b311480e 1// Created on: 1997-01-17
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.
b311480e 16
7fd59977 17// Modified by XAB & Serguei Dec 97 (angle &deviation coeffts)
7fd59977 18
0717ddc1 19#include <AIS_ConnectedInteractive.hxx>
7fd59977 20#include <AIS_DataMapIteratorOfDataMapOfILC.hxx>
42cf5bc1 21#include <AIS_DataMapIteratorOfDataMapOfIOStatus.hxx>
7fd59977 22#include <AIS_GlobalStatus.hxx>
42cf5bc1 23#include <AIS_InteractiveContext.hxx>
24#include <AIS_InteractiveObject.hxx>
25#include <AIS_ListIteratorOfListOfInteractive.hxx>
26#include <AIS_LocalContext.hxx>
27#include <AIS_LocalStatus.hxx>
7fd59977 28#include <AIS_MapIteratorOfMapOfInteractive.hxx>
42cf5bc1 29#include <AIS_MultipleConnectedInteractive.hxx>
30#include <AIS_Selection.hxx>
7fd59977 31#include <AIS_Shape.hxx>
42cf5bc1 32#include <AIS_Trihedron.hxx>
33#include <Geom_Axis2Placement.hxx>
7fd59977 34#include <Graphic3d_AspectFillArea3d.hxx>
35#include <HLRBRep.hxx>
42cf5bc1 36#include <OSD_Environment.hxx>
37#include <Precision.hxx>
38#include <Prs3d_BasicAspect.hxx>
7fd59977 39#include <Prs3d_DatumAspect.hxx>
42cf5bc1 40#include <Prs3d_IsoAspect.hxx>
41#include <Prs3d_LineAspect.hxx>
7fd59977 42#include <Prs3d_PlaneAspect.hxx>
42cf5bc1 43#include <Prs3d_ShadingAspect.hxx>
44#include <PrsMgr_ModedPresentation.hxx>
7fd59977 45#include <PrsMgr_PresentableObject.hxx>
42cf5bc1 46#include <Quantity_Color.hxx>
47#include <SelectMgr_EntityOwner.hxx>
48#include <SelectMgr_Filter.hxx>
49#include <SelectMgr_OrFilter.hxx>
50#include <SelectMgr_SelectionManager.hxx>
e33e7e78 51#include <Standard_Atomic.hxx>
42cf5bc1 52#include <Standard_Transient.hxx>
53#include <Standard_Type.hxx>
f751596e 54#include <StdSelect_ViewerSelector3d.hxx>
42cf5bc1 55#include <TCollection_AsciiString.hxx>
56#include <TCollection_ExtendedString.hxx>
57#include <TColStd_ListIteratorOfListOfInteger.hxx>
58#include <TColStd_MapIteratorOfMapOfTransient.hxx>
59#include <TopLoc_Location.hxx>
60#include <TopoDS_Shape.hxx>
7fd59977 61#include <UnitsAPI.hxx>
42cf5bc1 62#include <V3d_View.hxx>
63#include <V3d_Viewer.hxx>
64#include <Visual3d_View.hxx>
65#include <Visual3d_ViewManager.hxx>
7fd59977 66
42cf5bc1 67//#include <AIS_DataMapIteratorOfDataMapOfInteractiveInteger.hxx>
e33e7e78 68namespace
7fd59977 69{
e33e7e78
RK
70 static volatile Standard_Integer THE_AIS_INDEX_SEL = 0;
71 static volatile Standard_Integer THE_AIS_INDEX_CUR = 0;
7fd59977 72
e33e7e78
RK
73 static TCollection_AsciiString AIS_Context_NewSelName()
74 {
75 return TCollection_AsciiString ("AIS_SelContext_")
76 + TCollection_AsciiString (Standard_Atomic_Increment (&THE_AIS_INDEX_SEL));
77 }
7fd59977 78
e33e7e78
RK
79 static TCollection_AsciiString AIS_Context_NewCurName()
80 {
81 return TCollection_AsciiString ("AIS_CurContext_")
82 + TCollection_AsciiString (Standard_Atomic_Increment (&THE_AIS_INDEX_CUR));
83 }
b586500b 84
85 typedef NCollection_DataMap<Handle(SelectMgr_SelectableObject), Handle(SelectMgr_IndexedMapOfOwner)> AIS_MapOfObjectOwners;
86 typedef NCollection_DataMap<Handle(SelectMgr_SelectableObject), Handle(SelectMgr_IndexedMapOfOwner)>::Iterator AIS_MapIteratorOfMapOfObjectOwners;
2195ab96 87}
7fd59977 88
89//=======================================================================
90//function : AIS_InteractiveContext
91//purpose :
92//=======================================================================
93
94AIS_InteractiveContext::AIS_InteractiveContext(const Handle(V3d_Viewer)& MainViewer):
95mgrSelector(new SelectMgr_SelectionManager()),
96myMainPM(new PrsMgr_PresentationManager3d(MainViewer->Viewer())),
97myMainVwr(MainViewer),
98myMainSel(new StdSelect_ViewerSelector3d()),
cbff1e55 99myWasLastMain(Standard_False),
100myCurrentTouched(Standard_False),
101mySelectedTouched(Standard_False),
102myToHilightSelected(Standard_True),
7fd59977 103myFilters(new SelectMgr_OrFilter()),
104myDefaultDrawer(new Prs3d_Drawer()),
105myDefaultColor(Quantity_NOC_GOLDENROD),
106myHilightColor(Quantity_NOC_CYAN1),
107mySelectionColor(Quantity_NOC_GRAY80),
108myPreselectionColor(Quantity_NOC_GREEN),
109mySubIntensity(Quantity_NOC_GRAY40),
110myDisplayMode(0),
111myCurLocalIndex(0),
cbff1e55 112myAISCurDetected(0),
7fd59977 113myZDetectionFlag(0),
7fd59977 114myIsAutoActivateSelMode( Standard_True )
115{
116 InitAttributes();
117}
118
7fd59977 119void AIS_InteractiveContext::Delete() const
120{
2195ab96 121 // clear the static current selection
30bf45dc 122 AIS_Selection::ClearCurrentSelection();
2195ab96 123
7fd59977 124 // to avoid an exception
2195ab96 125 if (AIS_Selection::Find (mySelectionName.ToCString()))
126 {
127 AIS_Selection::Remove (mySelectionName.ToCString());
128 }
7fd59977 129
130 // to avoid an exception
2195ab96 131 if (AIS_Selection::Find (myCurrentName.ToCString()))
132 {
133 AIS_Selection::Remove (myCurrentName.ToCString());
134 }
7fd59977 135
136 // let's remove one reference explicitly. this operation's supposed to
137 // be performed when mgrSelector will be destroyed but anyway...
543a9964 138 const Handle(SelectMgr_ViewerSelector)& aSelector = myMainSel; // to avoid ambiguity
139 mgrSelector->Remove (aSelector);
2195ab96 140
da0e82aa 141 Handle(AIS_InteractiveContext) aNullContext;
2195ab96 142 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
da0e82aa 143 {
2195ab96 144 Handle(AIS_InteractiveObject) anObj = anObjIter.Key();
145 anObj->SetContext (aNullContext);
c3282ec1 146 for (anObj->Init(); anObj->More(); anObj->Next())
147 {
148 anObj->CurrentSelection()->UpdateBVHStatus (SelectMgr_TBU_Renew);
149 }
da0e82aa 150 }
7fd59977 151 MMgt_TShared::Delete();
152}
153
154//=======================================================================
155//function : AIS_SelectionName
156//purpose :
157//=======================================================================
158const TCollection_AsciiString& AIS_InteractiveContext::SelectionName() const
159{
160 if(!HasOpenedContext())
161 return mySelectionName;
162 return myLocalContexts(myCurLocalIndex)->SelectionName();
163
164}
165
166
167
168//=======================================================================
169//function : UpdateCurrentViewer
170//purpose :
171//=======================================================================
172
173void AIS_InteractiveContext::UpdateCurrentViewer()
174{
175 if (!myMainVwr.IsNull())
176 myMainVwr->Update();
177}
178
7fd59977 179
180//=======================================================================
181//function : DomainOfMainViewer
182//purpose :
183//=======================================================================
184
185Standard_CString AIS_InteractiveContext::DomainOfMainViewer() const
186{
187 return myMainVwr->Domain();
188
189}
190
191//=======================================================================
192//function : DisplayedObjects
2195ab96 193//purpose :
7fd59977 194//=======================================================================
2195ab96 195void AIS_InteractiveContext::DisplayedObjects (AIS_ListOfInteractive& theListOfIO,
196 const Standard_Boolean theOnlyFromNeutral) const
7fd59977 197{
2195ab96 198 if (!HasOpenedContext()
199 || theOnlyFromNeutral)
200 {
201 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
202 {
203 if (anObjIter.Value()->GraphicStatus() == AIS_DS_Displayed)
204 {
205 theListOfIO.Append (anObjIter.Key());
206 }
7fd59977 207 }
2195ab96 208 return;
7fd59977 209 }
7fd59977 210
2195ab96 211 // neutral point
212 TColStd_MapOfTransient aDispMap;
213 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
214 {
215 if (anObjIter.Value()->GraphicStatus() == AIS_DS_Displayed)
216 {
217 aDispMap.Add (anObjIter.Key());
7fd59977 218 }
2195ab96 219 }
220
221 // parse all local contexts...
222 for (AIS_DataMapIteratorOfDataMapOfILC aCtxIter (myLocalContexts); aCtxIter.More(); aCtxIter.Next())
223 {
224 const Handle(AIS_LocalContext)& aLocCtx = aCtxIter.Value();
225 aLocCtx->DisplayedObjects (aDispMap);
226 }
227
228 Handle(AIS_InteractiveObject) anObj;
229 for (TColStd_MapIteratorOfMapOfTransient aDispMapIter (aDispMap); aDispMapIter.More(); aDispMapIter.Next())
230 {
231 const Handle(Standard_Transient)& aTransient = aDispMapIter.Key();
c5f3a425 232 anObj = Handle(AIS_InteractiveObject)::DownCast (aTransient);
2195ab96 233 theListOfIO.Append (anObj);
234 }
7fd59977 235}
2195ab96 236
7fd59977 237//=======================================================================
238//function : DisplayedObjects
2195ab96 239//purpose :
7fd59977 240//=======================================================================
2195ab96 241void AIS_InteractiveContext::DisplayedObjects (const AIS_KindOfInteractive theKind,
242 const Standard_Integer theSign,
243 AIS_ListOfInteractive& theListOfIO,
244 const Standard_Boolean /*OnlyFromNeutral*/) const
7fd59977 245{
2195ab96 246 ObjectsByDisplayStatus (theKind, theSign, AIS_DS_Displayed, theListOfIO);
7fd59977 247}
248
249//=======================================================================
7fd59977 250//function : ErasedObjects
2195ab96 251//purpose :
7fd59977 252//=======================================================================
2195ab96 253void AIS_InteractiveContext::ErasedObjects (AIS_ListOfInteractive& theListOfIO) const
7fd59977 254{
2195ab96 255 ObjectsByDisplayStatus (AIS_DS_Erased, theListOfIO);
7fd59977 256}
257
258//=======================================================================
259//function : ErasedObjects
2195ab96 260//purpose :
7fd59977 261//=======================================================================
2195ab96 262void AIS_InteractiveContext::ErasedObjects (const AIS_KindOfInteractive theKind,
263 const Standard_Integer theSign,
264 AIS_ListOfInteractive& theListOfIO) const
7fd59977 265{
2195ab96 266 ObjectsByDisplayStatus (theKind, theSign, AIS_DS_Erased, theListOfIO);
7fd59977 267}
268
269//=======================================================================
270//function : ObjectsByDisplayStatus
2195ab96 271//purpose :
7fd59977 272//=======================================================================
2195ab96 273void AIS_InteractiveContext::ObjectsByDisplayStatus (const AIS_DisplayStatus theStatus,
274 AIS_ListOfInteractive& theListOfIO) const
7fd59977 275{
2195ab96 276 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
277 {
278 if (anObjIter.Value()->GraphicStatus() == theStatus)
279 {
280 theListOfIO.Append (anObjIter.Key());
281 }
7fd59977 282 }
283}
284
285//=======================================================================
286//function : ObjectsByDisplayStatus
2195ab96 287//purpose :
7fd59977 288//=======================================================================
2195ab96 289void AIS_InteractiveContext::ObjectsByDisplayStatus (const AIS_KindOfInteractive theKind,
290 const Standard_Integer theSign,
291 const AIS_DisplayStatus theStatus,
292 AIS_ListOfInteractive& theListOfIO) const
293{
294 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
295 {
a1954302 296 if (theStatus != AIS_DS_None
297 && anObjIter.Value()->GraphicStatus() != theStatus)
298 {
299 continue;
300 }
301 else if (anObjIter.Key()->Type() != theKind)
2195ab96 302 {
303 continue;
304 }
7fd59977 305
2195ab96 306 if (theSign == -1
307 || anObjIter.Key()->Signature() == theSign)
308 {
309 theListOfIO.Append (anObjIter.Key());
7fd59977 310 }
311 }
312}
313
314//=======================================================================
315//function : ObjectsInside
2195ab96 316//purpose :
7fd59977 317//=======================================================================
2195ab96 318void AIS_InteractiveContext::ObjectsInside (AIS_ListOfInteractive& theListOfIO,
319 const AIS_KindOfInteractive theKind,
320 const Standard_Integer theSign) const
7fd59977 321{
2195ab96 322 if (theKind == AIS_KOI_None
323 && theSign == -1)
324 {
325 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
326 {
327 theListOfIO.Append (anObjIter.Key());
7fd59977 328 }
2195ab96 329 return;
7fd59977 330 }
2195ab96 331
332 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
333 {
334 if (anObjIter.Key()->Type() != theKind)
335 {
336 continue;
337 }
338
339 if (theSign == -1
340 || anObjIter.Key()->Signature() == theSign)
341 {
342 theListOfIO.Append (anObjIter.Key());
7fd59977 343 }
344 }
345}
346
347//=======================================================================
a272ed94 348//function : ObjectsForView
349//purpose :
350//=======================================================================
351void AIS_InteractiveContext::ObjectsForView (AIS_ListOfInteractive& theListOfIO,
352 const Handle(V3d_View)& theView,
353 const Standard_Boolean theIsVisibleInView,
354 const AIS_DisplayStatus theStatus) const
355{
356 const Graphic3d_CView* aCView = reinterpret_cast<const Graphic3d_CView* >(theView->View()->CView());
357 const Standard_Integer aViewId = aCView->ViewId;
358 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
359 {
360 if (theStatus != AIS_DS_None
361 && anObjIter.Value()->GraphicStatus() != theStatus)
362 {
363 theListOfIO.Append (anObjIter.Key());
364 continue;
365 }
366
367 Handle(Graphic3d_ViewAffinity) anAffinity = myMainVwr->Viewer()->ObjectAffinity (anObjIter.Key());
368 const Standard_Boolean isVisible = anAffinity->IsVisible (aViewId);
369 if (isVisible == theIsVisibleInView)
370 {
371 theListOfIO.Append (anObjIter.Key());
372 }
373 }
374}
375
376//=======================================================================
7fd59977 377//function : Display
2195ab96 378//purpose :
7fd59977 379//=======================================================================
2195ab96 380void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIObj,
381 const Standard_Boolean theToUpdateViewer)
382{
383 if (theIObj.IsNull())
384 {
385 return;
386 }
387
388 Standard_Integer aDispMode = 0, aHiMod = -1, aSelMode = -1;
389 GetDefModes (theIObj, aDispMode, aHiMod, aSelMode);
390
391 Display (theIObj, aDispMode, myIsAutoActivateSelMode ? aSelMode : -1,
392 theToUpdateViewer, theIObj->AcceptShapeDecomposition());
393}
7fd59977 394
2195ab96 395//=======================================================================
a272ed94 396//function : SetViewAffinity
397//purpose :
398//=======================================================================
399void AIS_InteractiveContext::SetViewAffinity (const Handle(AIS_InteractiveObject)& theIObj,
400 const Handle(V3d_View)& theView,
401 const Standard_Boolean theIsVisible)
402{
403 if (theIObj.IsNull()
404 || !myObjects.IsBound (theIObj))
405 {
406 return;
407 }
408
409 Handle(Graphic3d_ViewAffinity) anAffinity = myMainVwr->Viewer()->ObjectAffinity (theIObj);
410 const Graphic3d_CView* aCView = reinterpret_cast<const Graphic3d_CView* >(theView->View()->CView());
411 anAffinity->SetVisible (aCView->ViewId, theIsVisible == Standard_True);
412 if (theIsVisible)
413 {
c04c30b3 414 theView->View()->ChangeHiddenObjects()->Remove (theIObj.get());
a272ed94 415 }
416 else
417 {
c04c30b3 418 theView->View()->ChangeHiddenObjects()->Add (theIObj.get());
a272ed94 419 }
420}
421
422//=======================================================================
2195ab96 423//function : Display
424//purpose :
425//=======================================================================
426void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIObj,
427 const Standard_Integer theDispMode,
428 const Standard_Integer theSelectionMode,
429 const Standard_Boolean theToUpdateViewer,
a1954302 430 const Standard_Boolean theToAllowDecomposition,
431 const AIS_DisplayStatus theDispStatus)
7fd59977 432{
2195ab96 433 if (theIObj.IsNull())
434 {
435 return;
436 }
7fd59977 437
a1954302 438 if (theDispStatus == AIS_DS_Erased)
439 {
440 Erase (theIObj, theToUpdateViewer);
441 Load (theIObj, theSelectionMode, theToAllowDecomposition);
442 return;
443 }
444
2195ab96 445 if (!theIObj->HasInteractiveContext())
446 {
447 theIObj->SetContext (this);
448 }
7fd59977 449
a1954302 450 if (theDispStatus == AIS_DS_Temporary
451 && !HasOpenedContext())
2195ab96 452 {
a1954302 453 return;
454 }
455 else if (HasOpenedContext())
456 {
457 if (theDispStatus == AIS_DS_None
458 || theDispStatus == AIS_DS_Temporary)
2195ab96 459 {
a1954302 460 myLocalContexts (myCurLocalIndex)->Display (theIObj, theDispMode, theToAllowDecomposition, theSelectionMode);
461 if (theToUpdateViewer)
462 {
463 myMainVwr->Update();
464 }
465 return;
2195ab96 466 }
2195ab96 467 }
7fd59977 468
2195ab96 469 if (!myObjects.IsBound (theIObj))
470 {
471 Handle(AIS_GlobalStatus) aStatus = new AIS_GlobalStatus (AIS_DS_Displayed, theDispMode, theSelectionMode);
472 myObjects.Bind (theIObj, aStatus);
a272ed94 473 Handle(Graphic3d_ViewAffinity) anAffinity = myMainVwr->Viewer()->RegisterObject (theIObj);
2195ab96 474 myMainPM->Display(theIObj, theDispMode);
475 if (theSelectionMode != -1)
476 {
543a9964 477 const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
478 if (!mgrSelector->Contains (anObj))
2195ab96 479 {
480 mgrSelector->Load (theIObj);
7fd59977 481 }
2195ab96 482 mgrSelector->Activate (theIObj, theSelectionMode, myMainSel);
483 }
7fd59977 484 }
7fd59977 485 else
486 {
2195ab96 487 Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
a1954302 488 if (aStatus->GraphicStatus() == AIS_DS_Temporary)
2195ab96 489 {
490 return;
491 }
a6964ce6 492
2195ab96 493 // Erase presentations for all display modes different from aDispMode.
494 // Then make sure aDispMode is displayed and maybe highlighted.
495 // Finally, activate selection mode <SelMode> if not yet activated.
496 TColStd_ListOfInteger aModesToRemove;
497 for (TColStd_ListIteratorOfListOfInteger aDispModeIter (aStatus->DisplayedModes()); aDispModeIter.More(); aDispModeIter.Next())
498 {
499 const Standard_Integer anOldMode = aDispModeIter.Value();
500 if (anOldMode != theDispMode)
501 {
502 aModesToRemove.Append (anOldMode);
503 if(myMainPM->IsHighlighted (theIObj, anOldMode))
504 {
505 myMainPM->Unhighlight (theIObj, anOldMode);
506 }
507 myMainPM->Erase (theIObj, anOldMode);
508 }
509 }
7fd59977 510
2195ab96 511 for (TColStd_ListIteratorOfListOfInteger aRemModeIter (aModesToRemove); aRemModeIter.More(); aRemModeIter.Next())
512 {
513 aStatus->RemoveDisplayMode (aRemModeIter.Value());
514 }
7fd59977 515
2195ab96 516 if (!aStatus->IsDModeIn (theDispMode))
517 {
518 aStatus->AddDisplayMode (theDispMode);
519 }
7fd59977 520
2195ab96 521 myMainPM->Display (theIObj, theDispMode);
a1954302 522 aStatus->SetGraphicStatus (AIS_DS_Displayed);
2195ab96 523 if (aStatus->IsHilighted())
524 {
525 const Standard_Integer aHiMod = theIObj->HasHilightMode() ? theIObj->HilightMode() : theDispMode;
e1b01c73 526 myMainPM->Color (theIObj, aStatus->HilightColor(), aHiMod);
2195ab96 527 }
528 if (theSelectionMode != -1)
529 {
543a9964 530 const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
531 if (!mgrSelector->Contains (anObj))
2195ab96 532 {
533 mgrSelector->Load (theIObj);
7fd59977 534 }
2195ab96 535 if (!mgrSelector->IsActivated (theIObj, theSelectionMode))
536 {
0824e32e 537 if (!aStatus->IsSModeIn (theSelectionMode))
538 aStatus->AddSelectionMode (theSelectionMode);
2195ab96 539 mgrSelector->Activate (theIObj, theSelectionMode, myMainSel);
7fd59977 540 }
7fd59977 541 }
542 }
7fd59977 543
2195ab96 544 if (theToUpdateViewer)
545 {
546 myMainVwr->Update();
547 }
548}
7fd59977 549
550//=======================================================================
551//function : Load
2195ab96 552//purpose :
7fd59977 553//=======================================================================
2195ab96 554void AIS_InteractiveContext::Load (const Handle(AIS_InteractiveObject)& theIObj,
555 const Standard_Integer theSelMode,
556 const Standard_Boolean theToAllowDecomposition)
7fd59977 557{
2195ab96 558 if (theIObj.IsNull())
559 {
560 return;
561 }
7fd59977 562
2195ab96 563 if (!theIObj->HasInteractiveContext())
564 {
565 theIObj->SetContext (this);
566 }
567
568 if (HasOpenedContext())
569 {
570 myLocalContexts (myCurLocalIndex)->Load (theIObj, theToAllowDecomposition, theSelMode);
571 return;
7fd59977 572 }
7fd59977 573
2195ab96 574 if (theSelMode == -1
89cc29b0 575 && !theToAllowDecomposition)
2195ab96 576 {
89cc29b0 577 if (!myObjects.IsBound (theIObj))
578 {
579 Standard_Integer aDispMode, aHiMod, aSelModeDef;
580 GetDefModes (theIObj, aDispMode, aHiMod, aSelModeDef);
581 Handle(AIS_GlobalStatus) aStatus = new AIS_GlobalStatus (AIS_DS_Erased, aDispMode, aSelModeDef);
582 myObjects.Bind (theIObj, aStatus);
583 }
584
585 // Register theIObj in the selection manager to prepare further activation of selection
543a9964 586 const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
587 if (!mgrSelector->Contains (anObj))
89cc29b0 588 {
589 mgrSelector->Load (theIObj);
590 }
2195ab96 591 }
592}
7fd59977 593
594//=======================================================================
595//function : Erase
2195ab96 596//purpose :
7fd59977 597//=======================================================================
2195ab96 598void AIS_InteractiveContext::Erase (const Handle(AIS_InteractiveObject)& theIObj,
599 const Standard_Boolean theToUpdateViewer)
7fd59977 600{
2195ab96 601 if (theIObj.IsNull())
602 {
603 return;
604 }
7fd59977 605
2195ab96 606 if (!theIObj->IsAutoHilight())
607 {
608 theIObj->ClearSelected();
7fd59977 609 }
2195ab96 610
611 Standard_Boolean wasInCtx = Standard_False;
612 if (HasOpenedContext())
613 {
614 // First it is checked if it is possible to remove in the current local context
615 // then one tries to remove in other local contexts, if they allow it...
616 wasInCtx = myLocalContexts (myCurLocalIndex)->Erase (theIObj);
617 for (AIS_DataMapIteratorOfDataMapOfILC aCtxIter (myLocalContexts); aCtxIter.More(); aCtxIter.Next())
7fd59977 618 {
2195ab96 619 if (aCtxIter.Value()->AcceptErase())
620 {
621 wasInCtx = aCtxIter.Value()->Erase (theIObj) || wasInCtx;
7fd59977 622 }
7fd59977 623 }
2195ab96 624 }
625
626 if (!wasInCtx)
627 {
628 EraseGlobal (theIObj, Standard_False);
629 }
630
631 if (theToUpdateViewer)
632 {
633 myMainVwr->Update();
634 }
7fd59977 635}
7fd59977 636
637//=======================================================================
638//function : EraseAll
2195ab96 639//purpose :
7fd59977 640//=======================================================================
2195ab96 641void AIS_InteractiveContext::EraseAll (const Standard_Boolean theToUpdateViewer)
7fd59977 642{
2195ab96 643 if (HasOpenedContext())
eb4320f2 644 {
2195ab96 645 return;
646 }
647
648 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
649 {
650 if (anObjIter.Value()->GraphicStatus() == AIS_DS_Displayed)
eb4320f2 651 {
2195ab96 652 Erase (anObjIter.Key(), Standard_False);
7fd59977 653 }
654 }
2195ab96 655
656 if (theToUpdateViewer)
657 {
658 myMainVwr->Update();
659 }
7fd59977 660}
661
662//=======================================================================
663//function : DisplayAll
2195ab96 664//purpose :
7fd59977 665//=======================================================================
2195ab96 666void AIS_InteractiveContext::DisplayAll (const Standard_Boolean theToUpdateViewer)
7fd59977 667{
2195ab96 668 if (HasOpenedContext())
669 {
670 return;
671 }
eb4320f2 672
2195ab96 673 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
674 {
675 const AIS_DisplayStatus aStatus = anObjIter.Value()->GraphicStatus();
676 if (aStatus == AIS_DS_Erased)
eb4320f2 677 {
2195ab96 678 Display (anObjIter.Key(), Standard_False);
7fd59977 679 }
680 }
2195ab96 681
682 if (theToUpdateViewer)
683 {
684 myMainVwr->Update();
685 }
7fd59977 686}
687
688//=======================================================================
689//function : DisplaySelected
2195ab96 690//purpose :
7fd59977 691//=======================================================================
2195ab96 692void AIS_InteractiveContext::DisplaySelected (const Standard_Boolean theToUpdateViewer)
7fd59977 693{
2195ab96 694 if (HasOpenedContext())
eb4320f2 695 {
2195ab96 696 return;
7fd59977 697 }
7fd59977 698
2195ab96 699 Standard_Boolean isFound = Standard_False;
700 Handle(AIS_Selection) aSelIter = AIS_Selection::Selection (myCurrentName.ToCString());
701 for (aSelIter->Init(); aSelIter->More(); aSelIter->Next())
702 {
703 Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (aSelIter->Value());
704 Display (anObj, Standard_False);
705 isFound = Standard_True;
706 }
7fd59977 707
2195ab96 708 if (isFound && theToUpdateViewer)
709 {
710 myMainVwr->Update();
711 }
712}
7fd59977 713
2195ab96 714//=======================================================================
715//function : EraseSelected
716//purpose :
717//=======================================================================
718void AIS_InteractiveContext::EraseSelected (const Standard_Boolean theToUpdateViewer)
7fd59977 719{
2195ab96 720 if (HasOpenedContext())
eb4320f2 721 {
2195ab96 722 return;
723 }
724
725 Standard_Boolean isFound = Standard_False;
726 Handle(AIS_Selection) aSelIter = AIS_Selection::Selection(myCurrentName.ToCString());
7140edaf 727
728 aSelIter->Init();
729 while (aSelIter->More())
2195ab96 730 {
7140edaf 731 Handle(SelectMgr_EntityOwner) anOwner = Handle(SelectMgr_EntityOwner)::DownCast (aSelIter->Value());
732 Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (anOwner->Selectable());
733
2195ab96 734 Erase (anObj, Standard_False);
735 isFound = Standard_True;
7140edaf 736
737 aSelIter->Init();
2195ab96 738 }
739
740 if (isFound && theToUpdateViewer)
741 {
742 myMainVwr->Update();
7fd59977 743 }
744}
2195ab96 745
7fd59977 746//=======================================================================
747//function :
748//purpose :
749//=======================================================================
750
751Standard_Boolean AIS_InteractiveContext::KeepTemporary(const Handle(AIS_InteractiveObject)& anIObj,
752 const Standard_Integer WhichContext)
753{
754 if(anIObj.IsNull()) return Standard_False;
755
756 if(!HasOpenedContext()) return Standard_False;
757 if(myObjects.IsBound(anIObj)) return Standard_False;
758 if(WhichContext!=-1 && !myLocalContexts.IsBound(WhichContext)) return Standard_False;
759
81bba717 760 // Protection : if one tries to preserve a temporary object
761 // which is not in the local active context... rob 11-06-97
7fd59977 762
763 Standard_Integer IsItInLocal = myCurLocalIndex;
764 Standard_Boolean Found(Standard_False);
765
766 while(IsItInLocal>0 && !Found){
767 if(!myLocalContexts.IsBound(IsItInLocal))
768 IsItInLocal--;
769 else if(myLocalContexts(IsItInLocal)->IsIn(anIObj))
770 Found = Standard_True;
771 else
772 IsItInLocal--;
773 }
774
775 if(!Found) return Standard_False;
776
777
778// const Handle(AIS_LocalStatus)& LS = (WhichContext== -1) ?
779// myLocalContexts(IsItInLocal)->Status(anIObj):myLocalContexts(WhichContext)->Status(anIObj);
780 // CLE
781 // const Handle(AIS_LocalStatus)& LS = myLocalContexts(IsItInLocal)->Status(anIObj);
782 Handle(AIS_LocalStatus) LS = myLocalContexts(IsItInLocal)->Status(anIObj);
783 // ENDCLE
784
785
786 if(LS->IsTemporary()){
787 Standard_Integer DM,HM,SM;
788 GetDefModes(anIObj,DM,HM,SM);
789
790 SM = LS->SelectionModes().IsEmpty() ? SM : LS->SelectionModes().First();
791 if(LS->DisplayMode()!= DM ){
792 Standard_Integer LSM = LS->SelectionModes().IsEmpty() ? -1 : LS->SelectionModes().First();
793 myLocalContexts(IsItInLocal)->Display(anIObj,DM,LS->Decomposed(),LSM);
794 }
795
796 Handle (AIS_GlobalStatus) GS = new AIS_GlobalStatus(AIS_DS_Displayed,
797 DM,
798 SM,
799 Standard_False);
800// GS->SubIntensityOn();
801 myObjects.Bind(anIObj,GS);
802 mgrSelector->Load(anIObj);
803 mgrSelector->Activate(anIObj,SM,myMainSel);
804
805 LS->SetTemporary(Standard_False);
806 }
807 return Standard_True;
808}
809
7fd59977 810//=======================================================================
2195ab96 811//function : DisplayStatus
812//purpose :
7fd59977 813//=======================================================================
2195ab96 814AIS_DisplayStatus AIS_InteractiveContext::DisplayStatus (const Handle(AIS_InteractiveObject)& theIObj) const
7fd59977 815{
2195ab96 816 if (theIObj.IsNull())
817 {
818 return AIS_DS_None;
819 }
820 else if (myObjects.IsBound (theIObj))
821 {
822 return myObjects (theIObj)->GraphicStatus();
823 }
7fd59977 824
2195ab96 825 for (AIS_DataMapIteratorOfDataMapOfILC aCtxIter (myLocalContexts); aCtxIter.More(); aCtxIter.Next())
826 {
827 if (aCtxIter.Value()->IsIn (theIObj))
828 {
7fd59977 829 return AIS_DS_Temporary;
2195ab96 830 }
7fd59977 831 }
7fd59977 832 return AIS_DS_None;
7fd59977 833}
834
7fd59977 835//=======================================================================
836//function : DisplayedModes
2195ab96 837//purpose :
7fd59977 838//=======================================================================
2195ab96 839const TColStd_ListOfInteger& AIS_InteractiveContext::DisplayedModes (const Handle(AIS_InteractiveObject)& theIObj) const
7fd59977 840{
2195ab96 841 return myObjects (theIObj)->DisplayedModes();
7fd59977 842}
843
7fd59977 844//=======================================================================
845//function : Remove
2195ab96 846//purpose :
7fd59977 847//=======================================================================
2195ab96 848void AIS_InteractiveContext::Remove (const Handle(AIS_InteractiveObject)& theIObj,
849 const Standard_Boolean theToUpdateViewer)
7fd59977 850{
2195ab96 851 if (theIObj.IsNull())
852 {
853 return;
7fd59977 854 }
2195ab96 855
856 if (HasOpenedContext())
857 {
858 myLocalContexts (myCurLocalIndex)->Remove (theIObj);
859 for (AIS_DataMapIteratorOfDataMapOfILC aCtxIter (myLocalContexts); aCtxIter.More(); aCtxIter.Next())
7fd59977 860 {
2195ab96 861 if (aCtxIter.Value()->AcceptErase())
862 {
863 aCtxIter.Value()->Remove (theIObj);
7fd59977 864 }
7fd59977 865 }
2195ab96 866 }
867
868 ClearGlobal (theIObj, theToUpdateViewer);
7fd59977 869}
870
871//=======================================================================
872//function : RemoveAll
2195ab96 873//purpose :
7fd59977 874//=======================================================================
2195ab96 875void AIS_InteractiveContext::RemoveAll (const Standard_Boolean theToUpdateViewer)
7fd59977 876{
877 AIS_ListOfInteractive aList;
2195ab96 878 ObjectsInside (aList);
879 for (AIS_ListIteratorOfListOfInteractive aListIterator (aList); aListIterator.More(); aListIterator.Next())
880 {
881 Remove (aListIterator.Value(), Standard_False);
7fd59977 882 }
7fd59977 883
2195ab96 884 if (theToUpdateViewer)
885 {
886 myMainVwr->Update();
7fd59977 887 }
7fd59977 888}
889
7fd59977 890//=======================================================================
891//function : ClearPrs
2195ab96 892//purpose :
7fd59977 893//=======================================================================
2195ab96 894void AIS_InteractiveContext::ClearPrs (const Handle(AIS_InteractiveObject)& theIObj,
895 const Standard_Integer theMode,
896 const Standard_Boolean theToUpdateViewer)
7fd59977 897{
2195ab96 898 if (theIObj.IsNull())
899 {
900 return;
901 }
7fd59977 902
2195ab96 903 if (!HasOpenedContext())
904 {
905 ClearGlobalPrs (theIObj, theMode, theToUpdateViewer);
906 return;
7fd59977 907 }
2195ab96 908
909 Standard_Boolean wasInCtx = myLocalContexts (myCurLocalIndex)->ClearPrs (theIObj, theMode);
910 for (AIS_DataMapIteratorOfDataMapOfILC aCtxIter (myLocalContexts); aCtxIter.More(); aCtxIter.Next())
911 {
912 if (aCtxIter.Value()->AcceptErase())
7fd59977 913 {
2195ab96 914 wasInCtx = aCtxIter.Value()->ClearPrs (theIObj, theMode) || wasInCtx;
7fd59977 915 }
2195ab96 916 }
917 if (!wasInCtx)
918 {
919 ClearGlobalPrs (theIObj, theMode, theToUpdateViewer);
920 }
921 else if (theToUpdateViewer)
922 {
923 myMainVwr->Update();
924 }
7fd59977 925}
926
927//=======================================================================
928//function : Hilight
2195ab96 929//purpose :
7fd59977 930//=======================================================================
2195ab96 931void AIS_InteractiveContext::Hilight (const Handle(AIS_InteractiveObject)& theIObj,
932 const Standard_Boolean theToUpdateViewer)
7fd59977 933{
2195ab96 934 if (theIObj.IsNull())
935 {
936 return;
937 }
7fd59977 938
2195ab96 939 if (!theIObj->HasInteractiveContext())
940 {
941 theIObj->SetContext (this);
942 }
7fd59977 943 if (!HasOpenedContext())
eb4320f2 944 {
2195ab96 945 if (!myObjects.IsBound (theIObj))
946 {
947 return;
948 }
eb4320f2 949
2195ab96 950 Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
951 aStatus->SetHilightStatus (Standard_True);
952 if (aStatus->GraphicStatus() == AIS_DS_Displayed)
eb4320f2 953 {
2195ab96 954 Standard_Integer aHilightMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
955 myMainPM->Highlight (theIObj, aHilightMode);
7fd59977 956 }
eb4320f2 957 }
7fd59977 958 else
eb4320f2 959 {
2195ab96 960 myLocalContexts (myCurLocalIndex)->Hilight (theIObj);
eb4320f2 961 }
962
2195ab96 963 if (theToUpdateViewer)
964 {
965 myMainVwr->Update();
966 }
7fd59977 967}
968//=======================================================================
969//function : Hilight
970//purpose :
971//=======================================================================
972
973void AIS_InteractiveContext::HilightWithColor(const Handle(AIS_InteractiveObject)& anIObj,
974 const Quantity_NameOfColor aCol,
975 const Standard_Boolean updateviewer)
976{
977 if(anIObj.IsNull()) return;
978
979 if(!anIObj->HasInteractiveContext()) anIObj->SetContext(this);
980
981 if (!HasOpenedContext())
eb4320f2 982 {
983 if(!myObjects.IsBound(anIObj)) return;
7fd59977 984
a1954302 985 const Handle(AIS_GlobalStatus)& aStatus = myObjects(anIObj);
986 aStatus->SetHilightStatus (Standard_True);
eb4320f2 987
a1954302 988 if (aStatus->GraphicStatus() == AIS_DS_Displayed)
eb4320f2 989 {
a1954302 990 const Standard_Integer aHilightMode = anIObj->HasHilightMode() ? anIObj->HilightMode() : 0;
eb4320f2 991 myMainPM->Color (anIObj, aCol, aHilightMode);
a1954302 992 aStatus->SetHilightColor (aCol);
7fd59977 993 }
eb4320f2 994 }
7fd59977 995 else
eb4320f2 996 {
7fd59977 997 myLocalContexts(myCurLocalIndex)->Hilight(anIObj,aCol);
eb4320f2 998 }
7fd59977 999 if(updateviewer) myMainVwr->Update();
1000}
1001
1002//=======================================================================
1003//function : Unhilight
1004//purpose :
1005//=======================================================================
1006
1007void AIS_InteractiveContext::Unhilight(const Handle(AIS_InteractiveObject)& anIObj, const Standard_Boolean updateviewer)
1008{
1009 if(anIObj.IsNull()) return;
1010
1011 if (!HasOpenedContext())
eb4320f2 1012 {
1013 if(!myObjects.IsBound(anIObj)) return;
7fd59977 1014
a1954302 1015 const Handle(AIS_GlobalStatus)& aStatus = myObjects(anIObj);
1016 aStatus->SetHilightStatus (Standard_False);
1017 aStatus->SetHilightColor(Quantity_NOC_WHITE);
eb4320f2 1018
a1954302 1019 if (aStatus->GraphicStatus() == AIS_DS_Displayed)
eb4320f2 1020 {
1021 Standard_Integer aHilightMode = anIObj->HasHilightMode() ? anIObj->HilightMode() : 0;
1022 myMainPM->Unhighlight (anIObj, aHilightMode);
7fd59977 1023 }
eb4320f2 1024 }
7fd59977 1025 else
eb4320f2 1026 {
7fd59977 1027 myLocalContexts(myCurLocalIndex)->Unhilight(anIObj);
eb4320f2 1028 }
7fd59977 1029 if(updateviewer) myMainVwr->Update();
1030}
1031
1032//=======================================================================
1033//function : IsHilighted
1034//purpose :
1035//=======================================================================
1036
1037Standard_Boolean AIS_InteractiveContext::IsHilighted(const Handle(AIS_InteractiveObject)& anIObj) const
1038{
1039 if(anIObj.IsNull()) return Standard_False;
1040
1041 if (!HasOpenedContext()){
1042 if(!myObjects.IsBound(anIObj))
1043 return Standard_False;
1044 return myObjects(anIObj)->IsHilighted();
1045 }
1046 AIS_DataMapIteratorOfDataMapOfILC ItM(myLocalContexts);
1047 for(;ItM.More();ItM.Next()){
1048 if(ItM.Value()->IsHilighted(anIObj))
1049 return Standard_True;
1050 }
1051 return Standard_False;
1052}
1053
1054Standard_Boolean AIS_InteractiveContext::IsHilighted(const Handle(AIS_InteractiveObject)& anIObj,
1055 Standard_Boolean& WithColor,
1056 Quantity_NameOfColor& TheHiCol) const
1057{
1058 if(!HasOpenedContext()){
1059 if(myObjects.IsBound(anIObj)){
1060 const Handle(AIS_GlobalStatus)& STAT = myObjects(anIObj);
1061 if(STAT->IsHilighted()){
1062 if(STAT->HilightColor()!=Quantity_NOC_WHITE){
1063 WithColor=Standard_True;
1064 TheHiCol = STAT->HilightColor();
1065 }
1066 else
1067 WithColor = Standard_False;
1068 return Standard_True;
1069 }
1070 }
1071 return Standard_False;
1072 }
1073 Standard_Integer MaxIndex = HighestIndex();
1074 for(Standard_Integer i=MaxIndex;i>=1 ; i--){
1075 if(myLocalContexts.IsBound(i)){
1076 if(myLocalContexts(i)->IsHilighted(anIObj,WithColor,TheHiCol))
1077 return Standard_True;
1078 }
1079
1080 }
1081 return Standard_False;
1082}
1083
c3282ec1 1084//=======================================================================
1085//function : IsHilighted
1086//purpose : Returns true if the objects global status is set to highlighted.
1087// theIsCustomColor flag defines if highlight color is not equal to OCCT's
1088// default Quantity_NOC_WHITE color. If theIsCustomColor is true,
1089// custom highlight color name will be stored to theCustomColorName
1090//=======================================================================
1091Standard_Boolean AIS_InteractiveContext::IsHilighted (const Handle(SelectMgr_EntityOwner)& theOwner,
1092 Standard_Boolean& theIsCustomColor,
1093 Quantity_NameOfColor& theCustomColorName) const
1094{
1095 if (theOwner.IsNull() || !theOwner->HasSelectable())
1096 return Standard_False;
1097
1098 const Handle(AIS_InteractiveObject) anObj =
1099 Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
1100
1101 if (!myObjects.IsBound (anObj))
1102 return Standard_False;
1103
1104 const Handle(AIS_GlobalStatus)& anObjStatus = myObjects (anObj);
1105 if (anObjStatus->IsHilighted())
1106 {
1107 if (anObjStatus->HilightColor() != Quantity_NOC_WHITE)
1108 {
1109 theIsCustomColor = Standard_True;
1110 theCustomColorName = anObjStatus->HilightColor();
1111 }
1112 else
1113 {
1114 theIsCustomColor = Standard_False;
1115 }
1116
1117 return Standard_True;
1118 }
7fd59977 1119
c3282ec1 1120 return Standard_False;
1121}
7fd59977 1122
1123//=======================================================================
1124//function : IsDisplayed
1125//purpose :
1126//=======================================================================
1127
1128Standard_Boolean AIS_InteractiveContext::IsDisplayed(const Handle(AIS_InteractiveObject)& anIObj) const
1129{
1130 if(anIObj.IsNull()) return Standard_False;
1131
1132
1133 if(myObjects.IsBound(anIObj))
1134 if(myObjects(anIObj)->GraphicStatus()==AIS_DS_Displayed)
1135 return Standard_True;
1136
1137 AIS_DataMapIteratorOfDataMapOfILC ItM(myLocalContexts);
1138 for(;ItM.More();ItM.Next()){
1139 if(ItM.Value()->IsDisplayed(anIObj))
1140 return Standard_True;
1141 }
1142 return Standard_False;
1143
1144}
7fd59977 1145
1146//=======================================================================
1147//function : IsDisplayed
2195ab96 1148//purpose :
7fd59977 1149//=======================================================================
2195ab96 1150Standard_Boolean AIS_InteractiveContext::IsDisplayed (const Handle(AIS_InteractiveObject)& theIObj,
1151 const Standard_Integer theMode) const
7fd59977 1152{
2195ab96 1153 if (theIObj.IsNull())
1154 {
1155 return Standard_False;
1156 }
1157
1158 if (myObjects.IsBound (theIObj))
1159 {
1160 Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
1161 if (aStatus->GraphicStatus() == AIS_DS_Displayed
1162 && aStatus->IsDModeIn (theMode))
1163 {
7fd59977 1164 return Standard_True;
2195ab96 1165 }
7fd59977 1166 }
2195ab96 1167
1168 for (AIS_DataMapIteratorOfDataMapOfILC aCtxIter (myLocalContexts); aCtxIter.More(); aCtxIter.Next())
1169 {
1170 if (aCtxIter.Value()->IsDisplayed (theIObj, theMode))
1171 {
7fd59977 1172 return Standard_True;
2195ab96 1173 }
7fd59977 1174 }
1175 return Standard_False;
1176}
1177
7fd59977 1178//=======================================================================
1179//function : DisplayPriority
2195ab96 1180//purpose :
7fd59977 1181//=======================================================================
2195ab96 1182Standard_Integer AIS_InteractiveContext::DisplayPriority (const Handle(AIS_InteractiveObject)& theIObj) const
7fd59977 1183{
2195ab96 1184 if (theIObj.IsNull())
1185 {
1186 return -1;
1187 }
1188 else if (!myObjects.IsBound (theIObj))
1189 {
1190 return 0;
1191 }
eb4320f2 1192
2195ab96 1193 Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
1194 if (aStatus->GraphicStatus() == AIS_DS_Displayed
1195 || aStatus->GraphicStatus() == AIS_DS_Erased)
eb4320f2 1196 {
2195ab96 1197 Standard_Integer aDispMode = theIObj->HasDisplayMode()
1198 ? theIObj->DisplayMode()
1199 : (theIObj->AcceptDisplayMode (myDisplayMode)
1200 ? myDisplayMode
1201 : 0);
1202 return myMainPM->DisplayPriority (theIObj, aDispMode);
7fd59977 1203 }
1204 return 0;
1205}
2195ab96 1206
7fd59977 1207//=======================================================================
1208//function : SetDisplayPriority
2195ab96 1209//purpose :
7fd59977 1210//=======================================================================
2195ab96 1211void AIS_InteractiveContext::SetDisplayPriority (const Handle(AIS_InteractiveObject)& theIObj,
1212 const Standard_Integer thePriority)
7fd59977 1213{
2195ab96 1214 if (theIObj.IsNull())
1215 {
7fd59977 1216 return;
2195ab96 1217 }
1218
1219 if (!theIObj->HasInteractiveContext())
eb4320f2 1220 {
2195ab96 1221 theIObj->SetContext (this);
1222 }
eb4320f2 1223
2195ab96 1224 if (myObjects.IsBound (theIObj))
1225 {
1226 Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
1227 if (aStatus->GraphicStatus() == AIS_DS_Displayed
1228 || aStatus->GraphicStatus() == AIS_DS_Erased)
eb4320f2 1229 {
2195ab96 1230 Standard_Integer aDisplayMode = theIObj->HasDisplayMode()
1231 ? theIObj->DisplayMode()
1232 : (theIObj->AcceptDisplayMode (myDisplayMode)
1233 ? myDisplayMode
1234 : 0);
1235 myMainPM->SetDisplayPriority (theIObj, aDisplayMode, thePriority);
7fd59977 1236 }
1237 }
1238 else if (HasOpenedContext())
eb4320f2 1239 {
2195ab96 1240 myLocalContexts (myCurLocalIndex)->SetDisplayPriority (theIObj, thePriority);
eb4320f2 1241 }
7fd59977 1242}
1243
1244//=======================================================================
1245//function : Redisplay
2195ab96 1246//purpose :
7fd59977 1247//=======================================================================
2195ab96 1248void AIS_InteractiveContext::Redisplay (const Handle(AIS_InteractiveObject)& theIObj,
1249 const Standard_Boolean theToUpdateViewer,
1250 const Standard_Boolean theAllModes)
7fd59977 1251{
2195ab96 1252 RecomputePrsOnly (theIObj, theToUpdateViewer, theAllModes);
1253 RecomputeSelectionOnly (theIObj);
7fd59977 1254}
1255
1256//=======================================================================
1257//function : Redisplay
2195ab96 1258//purpose :
7fd59977 1259//=======================================================================
2195ab96 1260void AIS_InteractiveContext::Redisplay (const AIS_KindOfInteractive theKOI,
1261 const Standard_Integer /*theSign*/,
1262 const Standard_Boolean theToUpdateViewer)
1263{
1264 Standard_Boolean isRedisplayed = Standard_False;
1265 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
1266 {
1267 Handle(AIS_InteractiveObject) anObj = anObjIter.Key();
1268 if (anObj->Type() != theKOI)
1269 {
1270 continue;
7fd59977 1271 }
2195ab96 1272
1273 Redisplay (anObj, Standard_False);
1274 isRedisplayed = anObjIter.Value()->GraphicStatus() == AIS_DS_Displayed
1275 || isRedisplayed;
7fd59977 1276 }
2195ab96 1277
1278 if (theToUpdateViewer
1279 && isRedisplayed)
eb4320f2 1280 {
1281 myMainVwr->Update();
7fd59977 1282 }
1283}
1284
7fd59977 1285//=======================================================================
1286//function : RecomputePrsOnly
2195ab96 1287//purpose :
7fd59977 1288//=======================================================================
2195ab96 1289void AIS_InteractiveContext::RecomputePrsOnly (const Handle(AIS_InteractiveObject)& theIObj,
1290 const Standard_Boolean theToUpdateViewer,
1291 const Standard_Boolean theAllModes)
7fd59977 1292{
2195ab96 1293 if (theIObj.IsNull())
1294 {
1295 return;
1296 }
eb4320f2 1297
2195ab96 1298 theIObj->Update (theAllModes);
1299 if (!theToUpdateViewer)
eb4320f2 1300 {
1301 return;
1302 }
1303
2195ab96 1304 if (HasOpenedContext()
1305 || (myObjects.IsBound (theIObj)
1306 && myObjects (theIObj)->GraphicStatus() == AIS_DS_Displayed))
eb4320f2 1307 {
1308 myMainVwr->Update();
7fd59977 1309 }
1310}
1311//=======================================================================
1312//function : RecomputeSelectionOnly
1313//purpose :
1314//=======================================================================
bc677575 1315void AIS_InteractiveContext::RecomputeSelectionOnly (const Handle(AIS_InteractiveObject)& theIO)
7fd59977 1316{
bc677575 1317 if (theIO.IsNull())
1318 {
1319 return;
1320 }
7fd59977 1321
bc677575 1322 mgrSelector->RecomputeSelection (theIO);
0d969553 1323
bc677575 1324 if (HasOpenedContext())
1325 {
1326 for (Standard_Integer aContextIdx = 1; aContextIdx <= myLocalContexts.Extent(); aContextIdx++)
eb4320f2 1327 {
bc677575 1328 myLocalContexts (aContextIdx)->ClearOutdatedSelection (theIO, Standard_False);
eb4320f2 1329 }
bc677575 1330 return;
1331 }
1332
1333 if (!myObjects.IsBound (theIO) ||
1334 myObjects (theIO)->GraphicStatus() != AIS_DS_Displayed)
1335 {
1336 return;
1337 }
1338
1339 TColStd_ListOfInteger aModes;
1340 ActivatedModes (theIO, aModes);
1341 TColStd_ListIteratorOfListOfInteger aModesIter (aModes);
1342 for (; aModesIter.More(); aModesIter.Next())
1343 {
1344 mgrSelector->Activate (theIO, aModesIter.Value(), myMainSel);
7fd59977 1345 }
1346}
1347
1348//=======================================================================
1349//function : Update
2195ab96 1350//purpose :
7fd59977 1351//=======================================================================
f3889691 1352void AIS_InteractiveContext::Update (const Handle(AIS_InteractiveObject)& theIObj,
2195ab96 1353 const Standard_Boolean theUpdateViewer)
7fd59977 1354{
f3889691 1355 if (theIObj.IsNull())
1356 {
1357 return;
1358 }
7fd59977 1359
2195ab96 1360 TColStd_ListOfInteger aPrsModes;
1361 theIObj->ToBeUpdated (aPrsModes);
1362 for (TColStd_ListIteratorOfListOfInteger aPrsModesIt (aPrsModes); aPrsModesIt.More(); aPrsModesIt.Next())
f3889691 1363 {
1364 theIObj->Update (aPrsModesIt.Value(), Standard_False);
7fd59977 1365 }
f3889691 1366
1367 mgrSelector->Update(theIObj);
1368
bc677575 1369 for (Standard_Integer aContextIdx = 1; aContextIdx <= myLocalContexts.Extent(); aContextIdx++)
1370 {
1371 myLocalContexts (aContextIdx)->ClearOutdatedSelection (theIObj, Standard_False);
1372 }
1373
f3889691 1374 if (theUpdateViewer)
1375 {
1376 if (!myObjects.IsBound (theIObj))
1377 {
1378 return;
1379 }
1380
1381 switch (myObjects (theIObj)->GraphicStatus())
1382 {
1383 case AIS_DS_Displayed:
1384 case AIS_DS_Temporary:
1385 myMainVwr->Update();
1386 break;
1387 default:
1388 break;
7fd59977 1389 }
1390 }
1391}
1392
7fd59977 1393//=======================================================================
1394//function : SetLocation
2195ab96 1395//purpose :
7fd59977 1396//=======================================================================
2195ab96 1397void AIS_InteractiveContext::SetLocation (const Handle(AIS_InteractiveObject)& theIObj,
1398 const TopLoc_Location& theLoc)
7fd59977 1399{
2195ab96 1400 if (theIObj.IsNull())
1401 {
1402 return;
1403 }
7fd59977 1404
2195ab96 1405 if (theIObj->HasTransformation()
1406 && theLoc.IsIdentity())
1407 {
1408 theIObj->ResetTransformation();
1409 mgrSelector->Update (theIObj, Standard_False);
1410 return;
1411 }
1412 else if (theLoc.IsIdentity())
1413 {
7fd59977 1414 return;
1415 }
7fd59977 1416
0d969553 1417 // first reset the previous location to properly clean everything...
2195ab96 1418 if (theIObj->HasTransformation())
1419 {
1420 theIObj->ResetTransformation();
1421 }
7fd59977 1422
2195ab96 1423 theIObj->SetLocalTransformation (theLoc.Transformation());
7fd59977 1424
2195ab96 1425 if (!HasOpenedContext())
1426 {
1427 mgrSelector->Update (theIObj, Standard_False);
1428 }
7fd59977 1429 else
2195ab96 1430 {
1431 Handle(StdSelect_ViewerSelector3d) aTempSel = myLocalContexts (myCurLocalIndex)->MainSelector();
1432 mgrSelector->Update (theIObj, aTempSel, Standard_False);
1433 }
7fd59977 1434}
2195ab96 1435
7fd59977 1436//=======================================================================
1437//function : ResetLocation
2195ab96 1438//purpose :
7fd59977 1439//=======================================================================
2195ab96 1440void AIS_InteractiveContext::ResetLocation (const Handle(AIS_InteractiveObject)& theIObj)
7fd59977 1441{
2195ab96 1442 if (theIObj.IsNull())
1443 {
1444 return;
1445 }
7fd59977 1446
2195ab96 1447 theIObj->ResetTransformation();
1448 mgrSelector->Update (theIObj, Standard_False);
7fd59977 1449}
1450
1451//=======================================================================
1452//function : HasLocation
2195ab96 1453//purpose :
7fd59977 1454//=======================================================================
2195ab96 1455Standard_Boolean AIS_InteractiveContext::HasLocation (const Handle(AIS_InteractiveObject)& theIObj) const
7fd59977 1456{
2195ab96 1457 return !theIObj.IsNull()
1458 && theIObj->HasTransformation();
7fd59977 1459}
1460
2195ab96 1461//=======================================================================
1462//function : Location
1463//purpose :
1464//=======================================================================
1465TopLoc_Location AIS_InteractiveContext::Location (const Handle(AIS_InteractiveObject)& theIObj) const
7fd59977 1466{
2195ab96 1467 return theIObj->Transformation();
7fd59977 1468}
1469
1470//=======================================================================
1471//function : SetDeviationCoefficient
2195ab96 1472//purpose :
7fd59977 1473//=======================================================================
2195ab96 1474void AIS_InteractiveContext::SetDeviationCoefficient (const Standard_Real theCoefficient)
7fd59977 1475{
2195ab96 1476 myDefaultDrawer->SetDeviationCoefficient (theCoefficient);
7fd59977 1477}
2195ab96 1478
7fd59977 1479//=======================================================================
1480//function : SetDeviationAngle
2195ab96 1481//purpose :
7fd59977 1482//=======================================================================
2195ab96 1483void AIS_InteractiveContext::SetDeviationAngle (const Standard_Real theAngle)
7fd59977 1484{
2195ab96 1485 myDefaultDrawer->SetDeviationCoefficient (theAngle);
7fd59977 1486}
1487
1488//=======================================================================
1489//function : DeviationAngle
1490//purpose : Gets deviationAngle
1491//=======================================================================
7fd59977 1492Standard_Real AIS_InteractiveContext::DeviationAngle() const
1493{
2195ab96 1494 return myDefaultDrawer->DeviationAngle();
7fd59977 1495}
1496
1497//=======================================================================
1498//function : DeviationCoefficient
2195ab96 1499//purpose :
7fd59977 1500//=======================================================================
2195ab96 1501Standard_Real AIS_InteractiveContext::DeviationCoefficient() const
7fd59977 1502{
1503 return myDefaultDrawer->DeviationCoefficient();
1504}
2195ab96 1505
7fd59977 1506//=======================================================================
1507//function : SetHLRDeviationCoefficient
2195ab96 1508//purpose :
7fd59977 1509//=======================================================================
2195ab96 1510void AIS_InteractiveContext::SetHLRDeviationCoefficient (const Standard_Real theCoefficient)
7fd59977 1511{
2195ab96 1512 myDefaultDrawer->SetHLRDeviationCoefficient (theCoefficient);
7fd59977 1513}
1514
1515//=======================================================================
1516//function : HLRDeviationCoefficient
2195ab96 1517//purpose :
7fd59977 1518//=======================================================================
2195ab96 1519Standard_Real AIS_InteractiveContext::HLRDeviationCoefficient() const
7fd59977 1520{
1521 return myDefaultDrawer->HLRDeviationCoefficient();
1522}
1523
1524//=======================================================================
1525//function : SetHLRAngle
2195ab96 1526//purpose :
7fd59977 1527//=======================================================================
2195ab96 1528void AIS_InteractiveContext::SetHLRAngle (const Standard_Real theAngle)
7fd59977 1529{
2195ab96 1530 myDefaultDrawer->SetHLRAngle (theAngle);
7fd59977 1531}
1532
1533//=======================================================================
1534//function : SetHLRAngleAndDeviation
1535//purpose : compute with anangle a HLRAngle and a HLRDeviationCoefficient
1536// and set them in myHLRAngle and in myHLRDeviationCoefficient
1537// of myDefaultDrawer
1538//=======================================================================
2195ab96 1539void AIS_InteractiveContext::SetHLRAngleAndDeviation (const Standard_Real theAngle)
7fd59977 1540{
2195ab96 1541 Standard_Real anOutAngl, anOutDefl;
1542 HLRBRep::PolyHLRAngleAndDeflection (theAngle, anOutAngl, anOutDefl);
7fd59977 1543
2195ab96 1544 myDefaultDrawer->SetHLRAngle (anOutAngl);
1545 myDefaultDrawer->SetHLRDeviationCoefficient (anOutDefl);
7fd59977 1546}
1547
1548//=======================================================================
1549//function : HLRAngle
2195ab96 1550//purpose :
7fd59977 1551//=======================================================================
7fd59977 1552Standard_Real AIS_InteractiveContext::HLRAngle() const
1553{
1554 return myDefaultDrawer->HLRAngle();
1555}
1556
1557//=======================================================================
1558//function : SetDisplayMode
2195ab96 1559//purpose :
7fd59977 1560//=======================================================================
2195ab96 1561void AIS_InteractiveContext::SetDisplayMode (const AIS_DisplayMode theMode,
1562 const Standard_Boolean theToUpdateViewer)
7fd59977 1563{
2195ab96 1564 if (theMode == myDisplayMode)
1565 {
1566 return;
1567 }
7fd59977 1568
2195ab96 1569 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
1570 {
1571 Handle(AIS_InteractiveObject) anObj = anObjIter.Key();
1572 Standard_Boolean toProcess = anObj->IsKind (STANDARD_TYPE(AIS_Shape))
1573 || anObj->IsKind (STANDARD_TYPE(AIS_ConnectedInteractive))
1574 || anObj->IsKind (STANDARD_TYPE(AIS_MultipleConnectedInteractive));
7fd59977 1575
2195ab96 1576 if (!toProcess
1577 || anObj->HasDisplayMode()
1578 || !anObj->AcceptDisplayMode (theMode))
1579 {
1580 continue;
1581 }
1582
1583 Handle(AIS_GlobalStatus) aStatus = anObjIter.Value();
1584 if (aStatus->IsDModeIn (myDisplayMode))
1585 {
1586 aStatus->RemoveDisplayMode (myDisplayMode);
1587 }
1588
1589 aStatus->AddDisplayMode (theMode);
1590 if (aStatus->GraphicStatus() == AIS_DS_Displayed)
1591 {
2195ab96 1592 myMainPM->Display (anObj, theMode);
c3282ec1 1593 if (!myLastPicked.IsNull() && myLastPicked->Selectable() == anObj)
1594 {
1595 myMainPM->BeginImmediateDraw();
1596 myMainPM->Unhighlight (anObj, myDisplayMode);
1597 myMainPM->EndImmediateDraw (myMainVwr);
1598 }
2195ab96 1599 if (aStatus->IsSubIntensityOn())
7fd59977 1600 {
2195ab96 1601 myMainPM->Color (anObj, mySubIntensity, theMode);
7fd59977 1602 }
a1954302 1603 myMainPM->SetVisibility (anObj, myDisplayMode, Standard_False);
2195ab96 1604 }
1605 }
1606
1607 myDisplayMode = theMode;
1608 if (theToUpdateViewer)
1609 {
1610 myMainVwr->Update();
1611 }
7fd59977 1612}
1613
1614//=======================================================================
1615//function : SetDisplayMode
2195ab96 1616//purpose :
7fd59977 1617//=======================================================================
2195ab96 1618void AIS_InteractiveContext::SetDisplayMode (const Handle(AIS_InteractiveObject)& theIObj,
1619 const Standard_Integer theMode,
1620 const Standard_Boolean theToUpdateViewer)
7fd59977 1621{
2195ab96 1622 if (!theIObj->HasInteractiveContext())
1623 {
1624 theIObj->SetContext(this);
1625 }
7fd59977 1626
2195ab96 1627 if (!myObjects.IsBound (theIObj))
1628 {
1629 theIObj->SetDisplayMode (theMode);
1630 return;
1631 }
1632 else if (!theIObj->AcceptDisplayMode (theMode))
1633 {
1634 return;
1635 }
eb4320f2 1636
2195ab96 1637 Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
1638 if (aStatus->GraphicStatus() != AIS_DS_Displayed)
1639 {
1640 theIObj->SetDisplayMode (theMode);
1641 return;
1642 }
a6964ce6 1643
2195ab96 1644 // erase presentations for all display modes different from <aMode>
1645 TColStd_ListOfInteger aModesToRemove;
1646 for (TColStd_ListIteratorOfListOfInteger aDispModeIter (aStatus->DisplayedModes()); aDispModeIter.More(); aDispModeIter.Next())
1647 {
1648 const Standard_Integer anOldMode = aDispModeIter.Value();
1649 if (anOldMode != theMode)
1650 {
1651 aModesToRemove.Append (anOldMode);
1652 if (myMainPM->IsHighlighted (theIObj, anOldMode))
1653 {
1654 myMainPM->Unhighlight (theIObj, anOldMode);
7fd59977 1655 }
2195ab96 1656 myMainPM->SetVisibility (theIObj, anOldMode, Standard_False);
7fd59977 1657 }
1658 }
2195ab96 1659
1660 for (TColStd_ListIteratorOfListOfInteger aRemModeIter (aModesToRemove); aRemModeIter.More(); aRemModeIter.Next())
1661 {
1662 aStatus->RemoveDisplayMode (aRemModeIter.Value());
1663 }
1664
1665 if (!aStatus->IsDModeIn (theMode))
1666 {
1667 aStatus->AddDisplayMode (theMode);
1668 }
1669
1670 myMainPM->Display (theIObj, theMode);
1671 Standard_Integer aDispMode, aHiMode, aSelMode;
1672 GetDefModes (theIObj, aDispMode, aHiMode, aSelMode);
1673 if (aStatus->IsHilighted())
1674 {
1675 myMainPM->Highlight (theIObj, aHiMode);
1676 }
1677 if (aStatus->IsSubIntensityOn())
1678 {
1679 myMainPM->Color (theIObj, mySubIntensity, theMode);
1680 }
1681
1682 if (theToUpdateViewer)
1683 {
1684 myMainVwr->Update();
1685 }
1686 theIObj->SetDisplayMode (theMode);
7fd59977 1687}
1688
1689//=======================================================================
1690//function : UnsetDisplayMode
2195ab96 1691//purpose :
7fd59977 1692//=======================================================================
2195ab96 1693void AIS_InteractiveContext::UnsetDisplayMode (const Handle(AIS_InteractiveObject)& theIObj,
1694 const Standard_Boolean theToUpdateViewer)
7fd59977 1695{
2195ab96 1696 if (theIObj.IsNull()
1697 || !theIObj->HasDisplayMode())
1698 {
1699 return;
1700 }
1701
1702 if (!myObjects.IsBound (theIObj))
1703 {
1704 theIObj->UnsetDisplayMode();
1705 return;
1706 }
1707
1708 const Standard_Integer anOldMode = theIObj->DisplayMode();
1709 if (myDisplayMode == anOldMode)
1710 {
1711 return;
1712 }
1713
1714 const Handle(AIS_GlobalStatus)& aStatus = myObjects (theIObj);
1715 aStatus->RemoveDisplayMode (anOldMode);
1716 if (!aStatus->IsDModeIn(myDisplayMode))
1717 {
1718 aStatus->AddDisplayMode (myDisplayMode);
1719 }
1720
1721 if (aStatus->GraphicStatus() == AIS_DS_Displayed)
1722 {
1723 if (myMainPM->IsHighlighted (theIObj, anOldMode))
7fd59977 1724 {
2195ab96 1725 myMainPM->Unhighlight (theIObj, anOldMode);
1726 }
1727 myMainPM->SetVisibility (theIObj, anOldMode, Standard_False);
1728 myMainPM->Display (theIObj, myDisplayMode);
1729
1730 Standard_Integer aDispMode, aHiMode, aSelMode;
1731 GetDefModes (theIObj, aDispMode, aHiMode, aSelMode);
1732 if (aStatus->IsHilighted())
1733 {
1734 myMainPM->Highlight (theIObj, aHiMode);
1735 }
1736 if (aStatus->IsSubIntensityOn())
1737 {
1738 myMainPM->Color (theIObj, mySubIntensity, myDisplayMode);
7fd59977 1739 }
2195ab96 1740
1741 if (theToUpdateViewer)
1742 {
1743 myMainVwr->Update();
1744 }
1745 }
1746
1747 theIObj->UnsetDisplayMode();
7fd59977 1748}
1749
1750//=======================================================================
1751//function : SetCurrentFacingModel
2195ab96 1752//purpose :
7fd59977 1753//=======================================================================
2195ab96 1754void AIS_InteractiveContext::SetCurrentFacingModel (const Handle(AIS_InteractiveObject)& theIObj,
1755 const Aspect_TypeOfFacingModel theModel)
b8ddfc2f 1756{
2195ab96 1757 if (!theIObj.IsNull())
1758 {
1759 theIObj->SetCurrentFacingModel (theModel);
1760 }
7fd59977 1761}
7fd59977 1762
1763//=======================================================================
2195ab96 1764//function : redisplayPrsRecModes
1765//purpose :
7fd59977 1766//=======================================================================
2195ab96 1767void AIS_InteractiveContext::redisplayPrsRecModes (const Handle(AIS_InteractiveObject)& theIObj,
1768 const Standard_Boolean theToUpdateViewer)
7fd59977 1769{
2195ab96 1770 if (theIObj->RecomputeEveryPrs())
1771 {
36132a2e 1772 theIObj->Update (Standard_True);
1773 theIObj->UpdateSelection();
2195ab96 1774 }
1775 else
1776 {
1777 for (TColStd_ListIteratorOfListOfInteger aModes (theIObj->ListOfRecomputeModes()); aModes.More(); aModes.Next())
1778 {
1779 theIObj->Update (aModes.Value(), Standard_False);
1780 }
28ee613b 1781 theIObj->UpdateSelection();
2195ab96 1782 theIObj->SetRecomputeOk();
1783 }
1784
1785 if (theToUpdateViewer)
1786 {
1787 UpdateCurrentViewer();
1788 }
7fd59977 1789}
1790
2195ab96 1791//=======================================================================
1792//function : redisplayPrsModes
1793//purpose :
1794//=======================================================================
1795void AIS_InteractiveContext::redisplayPrsModes (const Handle(AIS_InteractiveObject)& theIObj,
1796 const Standard_Boolean theToUpdateViewer)
7fd59977 1797{
2195ab96 1798 if (theIObj->RecomputeEveryPrs())
1799 {
36132a2e 1800 theIObj->Update (Standard_True);
1801 theIObj->UpdateSelection();
2195ab96 1802 }
7fd59977 1803 else
2195ab96 1804 {
1805 TColStd_ListOfInteger aModes;
1806 theIObj->ToBeUpdated (aModes);
1807 for (TColStd_ListIteratorOfListOfInteger aModeIter (aModes); aModeIter.More(); aModeIter.Next())
7fd59977 1808 {
2195ab96 1809 theIObj->Update (aModeIter.Value(), Standard_False);
7fd59977 1810 }
2195ab96 1811 theIObj->SetRecomputeOk();
1812 }
7fd59977 1813
2195ab96 1814 if (theToUpdateViewer)
1815 {
1816 UpdateCurrentViewer();
1817 }
7fd59977 1818}
1819
1820//=======================================================================
2195ab96 1821//function : SetColor
1822//purpose :
7fd59977 1823//=======================================================================
2195ab96 1824void AIS_InteractiveContext::SetColor (const Handle(AIS_InteractiveObject)& theIObj,
1825 const Quantity_NameOfColor theColor,
1826 const Standard_Boolean theToUpdateViewer)
1827{
1828 SetColor (theIObj, Quantity_Color(theColor), theToUpdateViewer);
1829}
7fd59977 1830
2195ab96 1831//=======================================================================
1832//function : SetColor
1833//purpose :
1834//=======================================================================
1835void AIS_InteractiveContext::SetColor (const Handle(AIS_InteractiveObject)& theIObj,
1836 const Quantity_Color& theColor,
1837 const Standard_Boolean theToUpdateViewer)
7fd59977 1838{
2195ab96 1839 if (theIObj.IsNull())
1840 {
1841 return;
1842 }
7fd59977 1843
2195ab96 1844 if (!theIObj->HasInteractiveContext())
1845 {
1846 theIObj->SetContext (this);
1847 }
1848 theIObj->SetColor (theColor);
1849 redisplayPrsRecModes (theIObj, theToUpdateViewer);
1850}
7fd59977 1851
2195ab96 1852//=======================================================================
5ad8c033 1853//function : SetIsoOnTriangulation
1854//purpose :
1855//=======================================================================
1856void AIS_InteractiveContext::IsoOnTriangulation (const Standard_Boolean theIsEnabled,
1857 const Handle(AIS_InteractiveObject)& theObject)
1858{
1859 if (theObject.IsNull())
1860 {
1861 return;
1862 }
1863
1864 theObject->SetIsoOnTriangulation (theIsEnabled);
1865}
1866
1867//=======================================================================
2195ab96 1868//function : SetDeviationCoefficient
1869//purpose :
1870//=======================================================================
1871void AIS_InteractiveContext::SetDeviationCoefficient (const Handle(AIS_InteractiveObject)& theIObj,
1872 const Standard_Real theCoefficient,
1873 const Standard_Boolean theToUpdateViewer)
1874{
1875 if (theIObj.IsNull())
1876 {
1877 return;
1878 }
7fd59977 1879
2195ab96 1880 if (!theIObj->HasInteractiveContext())
1881 {
1882 theIObj->SetContext (this);
1883 }
7fd59977 1884
2195ab96 1885 // to be modified after the related methods of AIS_Shape are passed to InteractiveObject
1886 if (theIObj->Type() != AIS_KOI_Object
1887 && theIObj->Type() != AIS_KOI_Shape)
1888 {
1889 return;
1890 }
1891 else if (theIObj->Signature() != 0)
1892 {
1893 return;
1894 }
1895
1896 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1897 aShape->SetOwnDeviationCoefficient (theCoefficient);
1898 redisplayPrsModes (theIObj, theToUpdateViewer);
7fd59977 1899}
1900
1901//=======================================================================
1902//function : SetHLRDeviationCoefficient
2195ab96 1903//purpose :
7fd59977 1904//=======================================================================
2195ab96 1905void AIS_InteractiveContext::SetHLRDeviationCoefficient (const Handle(AIS_InteractiveObject)& theIObj,
1906 const Standard_Real theCoefficient,
1907 const Standard_Boolean theToUpdateViewer)
7fd59977 1908{
2195ab96 1909 if (theIObj.IsNull())
1910 {
1911 return;
1912 }
1913
1914 if (!theIObj->HasInteractiveContext())
1915 {
1916 theIObj->SetContext (this);
1917 }
7fd59977 1918
81bba717 1919 // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
2195ab96 1920 if (theIObj->Type() != AIS_KOI_Object
1921 && theIObj->Type() != AIS_KOI_Shape)
1922 {
1923 return;
1924 }
1925 else if (theIObj->Signature() != 0)
1926 {
1927 return;
1928 }
7fd59977 1929
2195ab96 1930 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1931 aShape->SetOwnHLRDeviationCoefficient (theCoefficient);
1932 redisplayPrsModes (theIObj, theToUpdateViewer);
7fd59977 1933}
1934
7fd59977 1935//=======================================================================
1936//function : SetDeviationAngle
2195ab96 1937//purpose :
7fd59977 1938//=======================================================================
2195ab96 1939void AIS_InteractiveContext::SetDeviationAngle (const Handle(AIS_InteractiveObject)& theIObj,
1940 const Standard_Real theAngle,
1941 const Standard_Boolean theToUpdateViewer)
7fd59977 1942{
2195ab96 1943 if (theIObj.IsNull())
1944 {
1945 return;
1946 }
1947
1948 if (!theIObj->HasInteractiveContext())
1949 {
1950 theIObj->SetContext (this);
1951 }
7fd59977 1952
e33e7e78 1953 // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
2195ab96 1954 if (theIObj->Type() != AIS_KOI_Shape)
1955 {
1956 return;
1957 }
1958 else if (theIObj->Signature() != 0)
1959 {
1960 return;
1961 }
7fd59977 1962
2195ab96 1963 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1964 aShape->SetOwnDeviationAngle (theAngle);
1965 redisplayPrsModes (theIObj, theToUpdateViewer);
7fd59977 1966}
2195ab96 1967
7fd59977 1968//=======================================================================
2195ab96 1969//function : SetAngleAndDeviation
1970//purpose :
7fd59977 1971//=======================================================================
2195ab96 1972void AIS_InteractiveContext::SetAngleAndDeviation (const Handle(AIS_InteractiveObject)& theIObj,
1973 const Standard_Real theAngle,
1974 const Standard_Boolean theToUpdateViewer)
7fd59977 1975{
2195ab96 1976 if (theIObj.IsNull())
1977 {
1978 return;
1979 }
1980
1981 if (!theIObj->HasInteractiveContext())
1982 {
1983 theIObj->SetContext (this);
1984 }
7fd59977 1985
e33e7e78 1986 // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
2195ab96 1987 if (theIObj->Type() != AIS_KOI_Shape)
1988 {
1989 return;
1990 }
1991 if (theIObj->Signature() != 0)
1992 {
1993 return;
1994 }
7fd59977 1995
2195ab96 1996 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1997 aShape->SetAngleAndDeviation (theAngle);
7fd59977 1998
2195ab96 1999 if (theIObj->RecomputeEveryPrs())
2000 {
36132a2e 2001 theIObj->Update (Standard_True);
2002 theIObj->UpdateSelection();
2195ab96 2003 }
7fd59977 2004 else
2195ab96 2005 {
2006 Update (theIObj, theToUpdateViewer);
2007 }
7fd59977 2008}
2009
2010//=======================================================================
2195ab96 2011//function : SetHLRAngleAndDeviation
2012//purpose :
7fd59977 2013//=======================================================================
2195ab96 2014void AIS_InteractiveContext::SetHLRAngleAndDeviation (const Handle(AIS_InteractiveObject)& theIObj,
2015 const Standard_Real theAngle,
2016 const Standard_Boolean theToUpdateViewer)
7fd59977 2017{
2195ab96 2018 if (theIObj.IsNull())
2019 {
2020 return;
2021 }
7fd59977 2022
2195ab96 2023 if (!theIObj->HasInteractiveContext())
2024 {
2025 theIObj->SetContext (this);
2026 }
7fd59977 2027
e33e7e78 2028 // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
2195ab96 2029 if (theIObj->Type() != AIS_KOI_Shape)
2030 {
2031 return;
2032 }
2033 if (theIObj->Signature() != 0)
2034 {
2035 return;
2036 }
2037 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
2038 aShape->SetHLRAngleAndDeviation (theAngle);
2039 redisplayPrsModes (theIObj, theToUpdateViewer);
7fd59977 2040}
2041
2042//=======================================================================
2043//function : SetHLRDeviationAngle
2195ab96 2044//purpose :
7fd59977 2045//=======================================================================
2195ab96 2046void AIS_InteractiveContext::SetHLRDeviationAngle (const Handle(AIS_InteractiveObject)& theIObj,
2047 const Standard_Real theAngle,
2048 const Standard_Boolean theToUpdateViewer)
7fd59977 2049{
2195ab96 2050 if (theIObj.IsNull())
2051 {
2052 return;
2053 }
7fd59977 2054
2195ab96 2055 if (!theIObj->HasInteractiveContext())
2056 {
2057 theIObj->SetContext (this);
2058 }
7fd59977 2059
2195ab96 2060 // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
2061 if (theIObj->Type() != AIS_KOI_Shape)
2062 {
2063 return;
2064 }
2065 if (theIObj->Signature() != 0)
2066 {
2067 return;
2068 }
2069 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
2070 aShape->SetOwnHLRDeviationAngle (theAngle);
2071 redisplayPrsModes (theIObj, theToUpdateViewer);
7fd59977 2072}
2073
2074//=======================================================================
2075//function : UnsetColor
2195ab96 2076//purpose :
7fd59977 2077//=======================================================================
2195ab96 2078void AIS_InteractiveContext::UnsetColor (const Handle(AIS_InteractiveObject)& theIObj,
2079 const Standard_Boolean theToUpdateViewer)
7fd59977 2080{
2195ab96 2081 if (theIObj.IsNull())
2082 {
2083 return;
2084 }
2085
2086 theIObj->UnsetColor();
2087 redisplayPrsRecModes (theIObj, theToUpdateViewer);
7fd59977 2088}
2089
2090//=======================================================================
2091//function : HasColor
2195ab96 2092//purpose :
7fd59977 2093//=======================================================================
2195ab96 2094Standard_Boolean AIS_InteractiveContext::HasColor (const Handle(AIS_InteractiveObject)& theIObj) const
7fd59977 2095{
2195ab96 2096 return theIObj->HasColor();
7fd59977 2097}
2098
2099//=======================================================================
2100//function : Color
2195ab96 2101//purpose :
7fd59977 2102//=======================================================================
2195ab96 2103Quantity_NameOfColor AIS_InteractiveContext::Color (const Handle(AIS_InteractiveObject)& theIObj) const
7fd59977 2104{
2195ab96 2105 return theIObj->Color();
7fd59977 2106}
2107
2195ab96 2108//=======================================================================
2109//function : Color
2110//purpose :
2111//=======================================================================
2112void AIS_InteractiveContext::Color (const Handle(AIS_InteractiveObject)& theIObj,
2113 Quantity_Color& theColor) const
7fd59977 2114{
2195ab96 2115 theIObj->Color (theColor);
7fd59977 2116}
7fd59977 2117
2118//=======================================================================
2119//function : Width
2195ab96 2120//purpose :
7fd59977 2121//=======================================================================
2195ab96 2122Standard_Real AIS_InteractiveContext::Width (const Handle(AIS_InteractiveObject)& theIObj) const
7fd59977 2123{
2195ab96 2124 return theIObj->Width();
7fd59977 2125}
2126
2127//=======================================================================
2128//function : SetWidth
2195ab96 2129//purpose :
7fd59977 2130//=======================================================================
2195ab96 2131void AIS_InteractiveContext::SetWidth (const Handle(AIS_InteractiveObject)& theIObj,
2132 const Standard_Real theWidth,
2133 const Standard_Boolean theToUpdateViewer)
7fd59977 2134{
2195ab96 2135 if (theIObj.IsNull())
2136 {
2137 return;
2138 }
2139
2140 if (!theIObj->HasInteractiveContext())
2141 {
2142 theIObj->SetContext (this);
2143 }
2144
2145 theIObj->SetWidth (theWidth);
2146 redisplayPrsRecModes (theIObj, theToUpdateViewer);
c3282ec1 2147 if (!myLastinMain.IsNull() && myLastinMain->Selectable() == theIObj)
2148 {
2149 if (myLastinMain->IsAutoHilight())
2150 {
2151 const Standard_Integer aHiMode =
2152 theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
2153 myLastinMain->HilightWithColor (myMainPM, myLastinMain->IsSelected() ? mySelectionColor : myHilightColor, aHiMode);
2154 }
2155 else
2156 {
2157 theIObj->HilightOwnerWithColor (myMainPM, myLastinMain->IsSelected() ? mySelectionColor : myHilightColor, myLastinMain);
2158 }
2159 }
7fd59977 2160}
2161
2162//=======================================================================
2163//function : UnsetWidth
2195ab96 2164//purpose :
7fd59977 2165//=======================================================================
2195ab96 2166void AIS_InteractiveContext::UnsetWidth (const Handle(AIS_InteractiveObject)& theIObj,
2167 const Standard_Boolean theToUpdateViewer)
7fd59977 2168{
2195ab96 2169 if (theIObj.IsNull())
2170 {
2171 return;
2172 }
2173
2174 theIObj->UnsetWidth();
2175 redisplayPrsRecModes (theIObj, theToUpdateViewer);
7fd59977 2176}
2177
2178//=======================================================================
2179//function : SetMaterial
2195ab96 2180//purpose :
7fd59977 2181//=======================================================================
2195ab96 2182void AIS_InteractiveContext::SetMaterial (const Handle(AIS_InteractiveObject)& theIObj,
2183 const Graphic3d_NameOfMaterial theName,
2184 const Standard_Boolean theToUpdateViewer)
7fd59977 2185{
2195ab96 2186 if (theIObj.IsNull())
2187 {
2188 return;
2189 }
2190
2191 if (!theIObj->HasInteractiveContext())
2192 {
2193 theIObj->SetContext (this);
2194 }
7fd59977 2195
2195ab96 2196 theIObj->SetMaterial (theName);
2197 redisplayPrsRecModes (theIObj, theToUpdateViewer);
7fd59977 2198}
2199
2200//=======================================================================
2201//function : UnsetMaterial
2195ab96 2202//purpose :
7fd59977 2203//=======================================================================
2195ab96 2204void AIS_InteractiveContext::UnsetMaterial (const Handle(AIS_InteractiveObject)& theIObj,
2205 const Standard_Boolean theToUpdateViewer)
7fd59977 2206{
2195ab96 2207 if (theIObj.IsNull())
2208 {
2209 return;
2210 }
2211 theIObj->UnsetMaterial();
2212 redisplayPrsRecModes (theIObj, theToUpdateViewer);
7fd59977 2213}
2214
2215//=======================================================================
2216//function : SetTransparency
2195ab96 2217//purpose :
7fd59977 2218//=======================================================================
2195ab96 2219void AIS_InteractiveContext::SetTransparency (const Handle(AIS_InteractiveObject)& theIObj,
2220 const Standard_Real theValue,
2221 const Standard_Boolean theToUpdateViewer)
7fd59977 2222{
2195ab96 2223 if (theIObj.IsNull())
2224 {
2225 return;
2226 }
2227
2228 if (!theIObj->HasInteractiveContext())
2229 {
2230 theIObj->SetContext (this);
2231 }
7fd59977 2232
2195ab96 2233 if (!theIObj->IsTransparent()
2234 && theValue <= 0.05)
a6964ce6 2235 {
2236 return;
2237 }
2238
2195ab96 2239 if (theValue <= 0.05)
2240 {
2241 UnsetTransparency (theIObj, theToUpdateViewer);
7fd59977 2242 return;
2243 }
a6964ce6 2244
2195ab96 2245 theIObj->SetTransparency (theValue);
2246 redisplayPrsRecModes (theIObj, theToUpdateViewer);
7fd59977 2247}
2248
2249//=======================================================================
2250//function : UnsetTransparency
2195ab96 2251//purpose :
7fd59977 2252//=======================================================================
2195ab96 2253void AIS_InteractiveContext::UnsetTransparency (const Handle(AIS_InteractiveObject)& theIObj,
2254 const Standard_Boolean theToUpdateViewer)
7fd59977 2255{
2195ab96 2256 if (theIObj.IsNull())
2257 {
2258 return;
2259 }
7fd59977 2260
2195ab96 2261 theIObj->UnsetTransparency();
2262 redisplayPrsRecModes (theIObj, theToUpdateViewer);
7fd59977 2263}
2264
2195ab96 2265//=======================================================================
2266//function : SetSelectedAspect
2267//purpose :
2268//=======================================================================
2269void AIS_InteractiveContext::SetSelectedAspect (const Handle(Prs3d_BasicAspect)& theAspect,
2270 const Standard_Boolean theIsGlobalChange,
2271 const Standard_Boolean theToUpdateViewer)
2272{
2273 if (HasOpenedContext())
2274 {
2275 return;
2276 }
2277
2278 Standard_Boolean isFound = Standard_False;
2279 Handle(AIS_Selection) aSelIter = AIS_Selection::Selection (myCurrentName.ToCString());
2280 for (aSelIter->Init(); aSelIter->More(); aSelIter->Next())
2281 {
2282 isFound = Standard_True;
2283 Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (aSelIter->Value());
2284 anObj->SetAspect (theAspect, theIsGlobalChange);
2285 }
2286
2287 if (isFound
2288 && theToUpdateViewer)
2289 {
2290 myMainVwr->Update();
7fd59977 2291 }
2292}
7fd59977 2293
2294//=======================================================================
2295//function : SetLocalAttributes
2195ab96 2296//purpose :
7fd59977 2297//=======================================================================
2195ab96 2298void AIS_InteractiveContext::SetLocalAttributes (const Handle(AIS_InteractiveObject)& theIObj,
6262338c 2299 const Handle(Prs3d_Drawer)& theDrawer,
2195ab96 2300 const Standard_Boolean theToUpdateViewer)
7fd59977 2301{
2195ab96 2302 if (theIObj.IsNull())
2303 {
2304 return;
2305 }
2306
2307 if (!theIObj->HasInteractiveContext())
2308 {
2309 theIObj->SetContext (this);
2310 }
2311
2312 theIObj->SetAttributes (theDrawer);
2313 Update (theIObj, theToUpdateViewer);
7fd59977 2314}
2315
2316//=======================================================================
2317//function : UnsetLocalAttributes
2195ab96 2318//purpose :
7fd59977 2319//=======================================================================
2195ab96 2320void AIS_InteractiveContext::UnsetLocalAttributes (const Handle(AIS_InteractiveObject)& theIObj,
2321 const Standard_Boolean theToUpdateViewer)
7fd59977 2322{
2195ab96 2323 if (theIObj.IsNull())
2324 {
2325 return;
2326 }
7fd59977 2327
2195ab96 2328 if (!theIObj->HasInteractiveContext())
2329 {
2330 theIObj->SetContext (this);
2331 }
2332 theIObj->UnsetAttributes();
2333 Update (theIObj, theToUpdateViewer);
2334}
7fd59977 2335
2336//=======================================================================
2337//function : Status
2195ab96 2338//purpose :
7fd59977 2339//=======================================================================
2195ab96 2340void AIS_InteractiveContext::Status (const Handle(AIS_InteractiveObject)& theIObj,
2341 TCollection_ExtendedString& theStatus) const
7fd59977 2342{
2195ab96 2343 theStatus = "";
2344 if (theIObj.IsNull()
2345 || !myObjects.IsBound (theIObj))
2346 {
2347 return;
2348 }
7fd59977 2349
2195ab96 2350 theStatus += "\t ____________________________________________";
2351 theStatus += "\t| Known at Neutral Point:\n\tDisplayStatus:";
2352 const Handle(AIS_GlobalStatus)& aStatus = myObjects (theIObj);
2353 switch (aStatus->GraphicStatus())
2354 {
7fd59977 2355 case AIS_DS_Displayed:
2195ab96 2356 {
2357 theStatus += "\t| -->Displayed\n";
7fd59977 2358 break;
2359 }
2195ab96 2360 case AIS_DS_Erased:
2361 {
2362 theStatus += "\t| -->Erased\n";
2363 break;
7fd59977 2364 }
2195ab96 2365 default:
2366 break;
2367 }
2368
2369 theStatus += "\t| Active Display Modes in the MainViewer :\n";
2370 for (TColStd_ListIteratorOfListOfInteger aDispModeIter (aStatus->DisplayedModes()); aDispModeIter.More(); aDispModeIter.Next())
2371 {
2372 theStatus += "\t|\t Mode ";
2373 theStatus += TCollection_AsciiString (aDispModeIter.Value());
2374 theStatus += "\n";
2375 }
2195ab96 2376 if (IsSelected(theIObj)) theStatus +="\t| Selected\n";
7fd59977 2377
2195ab96 2378 theStatus += "\t| Active Selection Modes in the MainViewer :\n";
2379 for (TColStd_ListIteratorOfListOfInteger aSelModeIter (aStatus->SelectionModes()); aSelModeIter.More(); aSelModeIter.Next())
2380 {
2381 theStatus += "\t\t Mode ";
2382 theStatus += TCollection_AsciiString (aSelModeIter.Value());
2383 theStatus += "\n";
2384 }
2385 theStatus += "\t ____________________________________________";
2386}
7fd59977 2387
2388//=======================================================================
2389//function : GetDefModes
2195ab96 2390//purpose :
7fd59977 2391//=======================================================================
2195ab96 2392void AIS_InteractiveContext::GetDefModes (const Handle(AIS_InteractiveObject)& theIObj,
2393 Standard_Integer& theDispMode,
2394 Standard_Integer& theHiMode,
2395 Standard_Integer& theSelMode) const
7fd59977 2396{
2195ab96 2397 if (theIObj.IsNull())
2398 {
2399 return;
2400 }
7fd59977 2401
2195ab96 2402 theDispMode = theIObj->HasDisplayMode()
2403 ? theIObj->DisplayMode()
2404 : (theIObj->AcceptDisplayMode (myDisplayMode)
2405 ? myDisplayMode
2406 : 0);
2407 theHiMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : theDispMode;
c3282ec1 2408 theSelMode = theIObj->GlobalSelectionMode();
2195ab96 2409}
7fd59977 2410
2411//=======================================================================
2412//function : EraseGlobal
2195ab96 2413//purpose :
7fd59977 2414//=======================================================================
2195ab96 2415void AIS_InteractiveContext::EraseGlobal (const Handle(AIS_InteractiveObject)& theIObj,
2416 const Standard_Boolean theToUpdateviewer)
7fd59977 2417{
2195ab96 2418 if (theIObj.IsNull()
2419 || !myObjects.IsBound (theIObj))
2420 {
2421 return;
2422 }
7fd59977 2423
2195ab96 2424 Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
2425
a1954302 2426 const Standard_Integer aDispMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
2427 if (aStatus->GraphicStatus() == AIS_DS_Temporary
2428 || aStatus->GraphicStatus() == AIS_DS_Erased)
2195ab96 2429 {
a1954302 2430 return;
2431 }
2195ab96 2432
a1954302 2433 for (TColStd_ListIteratorOfListOfInteger aDispModeIter (aStatus->DisplayedModes()); aDispModeIter.More(); aDispModeIter.Next())
2434 {
c3ec36b6 2435 if (aStatus->IsHilighted())
2195ab96 2436 {
c3ec36b6 2437 if (IsCurrent (theIObj))
2438 {
2439 AddOrRemoveCurrentObject (theIObj, Standard_False);
2440 }
2441 else if (myMainPM->IsHighlighted (theIObj, aDispModeIter.Value()))
2442 {
2443 myMainPM->Unhighlight (theIObj, aDispModeIter.Value());
2444 }
2195ab96 2445 }
2446
a1954302 2447 myMainPM->SetVisibility (theIObj, aDispModeIter.Value(), Standard_False);
2448 }
2195ab96 2449
c3282ec1 2450 if (IsSelected (theIObj)
a1954302 2451 && !aStatus->IsDModeIn (aDispMode))
2452 {
2453 myMainPM->SetVisibility (theIObj, aDispMode, Standard_False);
2454 }
2455
2456 for (TColStd_ListIteratorOfListOfInteger aSelModeIter (aStatus->SelectionModes()); aSelModeIter.More(); aSelModeIter.Next())
2457 {
2458 mgrSelector->Deactivate (theIObj, aSelModeIter.Value(), myMainSel);
7fd59977 2459 }
c3282ec1 2460 aStatus->ClearSelectionModes();
2195ab96 2461 aStatus->SetGraphicStatus (AIS_DS_Erased);
a1954302 2462
2463 if (theToUpdateviewer)
2464 {
2465 myMainVwr->Update();
2466 }
7fd59977 2467}
2468
2469//=======================================================================
c3282ec1 2470//function : unhighlightOwners
2471//purpose :
2472//=======================================================================
2473void AIS_InteractiveContext::unhighlightOwners (const Handle(AIS_InteractiveObject)& theObject)
2474{
2475 Handle(AIS_Selection) aSel = AIS_Selection::Selection (myCurrentName.ToCString());
2476 aSel->Init();
2477 while (aSel->More())
2478 {
2479 const Handle(SelectMgr_EntityOwner) anOwner =
2480 Handle(SelectMgr_EntityOwner)::DownCast (aSel->Value());
2481 if (anOwner->Selectable() == theObject)
2482 {
2483 if (anOwner->IsSelected())
2484 {
2485 AddOrRemoveSelected (anOwner, Standard_False);
2486 aSel->Init();
2487 continue;
2488 }
2489 }
2490 aSel->Next();
2491 }
2492}
2493
2494//=======================================================================
7fd59977 2495//function : ClearGlobal
2195ab96 2496//purpose :
7fd59977 2497//=======================================================================
2195ab96 2498void AIS_InteractiveContext::ClearGlobal (const Handle(AIS_InteractiveObject)& theIObj,
2499 const Standard_Boolean theToUpdateviewer)
7fd59977 2500{
2195ab96 2501 if (theIObj.IsNull()
2502 || !myObjects.IsBound (theIObj))
2503 {
f751596e 2504 // for cases when reference shape of connected interactives was not displayed
2505 // but its selection primitives were calculated
543a9964 2506 const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
2507 mgrSelector->Remove (anObj);
2195ab96 2508 return;
2509 }
2510
2511 Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
c3282ec1 2512 unhighlightOwners (theIObj);
2195ab96 2513 for (TColStd_ListIteratorOfListOfInteger aDispModeIter (aStatus->DisplayedModes()); aDispModeIter.More(); aDispModeIter.Next())
2514 {
2195ab96 2515 myMainPM->Erase (theIObj, aDispModeIter.Value());
2516 myMainPM->Clear (theIObj, aDispModeIter.Value());
2195ab96 2517 }
7fd59977 2518
2195ab96 2519 // Object removes from Detected sequence
2520 for(Standard_Integer aDetIter = 1; aDetIter < myAISDetectedSeq.Length(); ++aDetIter)
7fd59977 2521 {
2522 Handle(AIS_InteractiveObject) anObj = DetectedCurrentObject();
2195ab96 2523 if (!anObj.IsNull()
2524 && anObj != theIObj)
2525 {
2526 myAISDetectedSeq.Remove (aDetIter);
2527 }
7fd59977 2528 }
2529
2195ab96 2530 // remove IO from the selection manager to avoid memory leaks
543a9964 2531 const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
2532 mgrSelector->Remove (anObj);
7fd59977 2533
2195ab96 2534 myObjects.UnBind (theIObj);
a272ed94 2535 myMainVwr->Viewer()->UnregisterObject (theIObj);
2536 for (myMainVwr->InitDefinedViews(); myMainVwr->MoreDefinedViews(); myMainVwr->NextDefinedViews())
2537 {
c04c30b3 2538 myMainVwr->DefinedView()->View()->ChangeHiddenObjects()->Remove (theIObj.get());
a272ed94 2539 }
7fd59977 2540
c3282ec1 2541 if (!myLastinMain.IsNull() && myLastinMain->Selectable() == theIObj)
2542 myLastinMain.Nullify();
2543 if (!myLastPicked.IsNull() && myLastPicked->Selectable() == theIObj)
2544 myLastPicked.Nullify();
2545 myMainPM->ClearImmediateDraw();
2546
2547 if (theToUpdateviewer && aStatus->GraphicStatus() == AIS_DS_Displayed)
eb4320f2 2548 {
2549 myMainVwr->Update();
2550 }
7fd59977 2551}
2552
2553//=======================================================================
2554//function : ClearGlobalPrs
2195ab96 2555//purpose :
7fd59977 2556//=======================================================================
2195ab96 2557void AIS_InteractiveContext::ClearGlobalPrs (const Handle(AIS_InteractiveObject)& theIObj,
2558 const Standard_Integer theMode,
2559 const Standard_Boolean theToUpdateViewer)
7fd59977 2560{
2195ab96 2561 if (theIObj.IsNull()
2562 || !myObjects.IsBound (theIObj))
2563 {
2564 return;
2565 }
2566
2567 const Handle(AIS_GlobalStatus)& aStatus = myObjects (theIObj);
2568 if (aStatus->IsDModeIn (theMode))
2569 {
2570 const Standard_Integer aDispMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
2571 if (aDispMode == theMode
2572 && myMainPM->IsHighlighted (theIObj, theMode))
2573 {
2574 myMainPM->Unhighlight (theIObj, theMode);
2575 }
2576
2577 myMainPM->Erase (theIObj, theMode);
2578 myMainPM->Clear (theIObj, theMode);
7fd59977 2579 }
eb4320f2 2580
2195ab96 2581 if (aStatus->GraphicStatus() == AIS_DS_Displayed
2582 && theToUpdateViewer)
2583 {
7fd59977 2584 myMainVwr->Update();
2195ab96 2585 }
7fd59977 2586}
2587
2588//=======================================================================
2589//function : DrawHiddenLine
2195ab96 2590//purpose :
7fd59977 2591//=======================================================================
2195ab96 2592Standard_Boolean AIS_InteractiveContext::DrawHiddenLine() const
2593{
7fd59977 2594 return myDefaultDrawer->DrawHiddenLine();
2595}
2596
2597//=======================================================================
2598//function : EnableDrawHiddenLine
2195ab96 2599//purpose :
7fd59977 2600//=======================================================================
2195ab96 2601void AIS_InteractiveContext::EnableDrawHiddenLine() const
2602{
7fd59977 2603 myDefaultDrawer->EnableDrawHiddenLine();
2604}
2605
2606//=======================================================================
2607//function : DisableDrawHiddenLine
2195ab96 2608//purpose :
7fd59977 2609//=======================================================================
2195ab96 2610void AIS_InteractiveContext::DisableDrawHiddenLine() const
2611{
7fd59977 2612 myDefaultDrawer->DisableDrawHiddenLine();
2613}
2614
2615//=======================================================================
2616//function : HiddenLineAspect
2195ab96 2617//purpose :
7fd59977 2618//=======================================================================
2195ab96 2619Handle (Prs3d_LineAspect) AIS_InteractiveContext::HiddenLineAspect() const
2620{
7fd59977 2621 return myDefaultDrawer->HiddenLineAspect();
2622}
2623
2624//=======================================================================
2625//function : SetHiddenLineAspect
2195ab96 2626//purpose :
7fd59977 2627//=======================================================================
2195ab96 2628void AIS_InteractiveContext::SetHiddenLineAspect (const Handle(Prs3d_LineAspect)& theAspect) const
2629{
2630 myDefaultDrawer->SetHiddenLineAspect (theAspect);
7fd59977 2631}
2632
2633//=======================================================================
2634//function : SetIsoNumber
2195ab96 2635//purpose :
7fd59977 2636//=======================================================================
2195ab96 2637void AIS_InteractiveContext::SetIsoNumber (const Standard_Integer theNb,
2638 const AIS_TypeOfIso theType)
7fd59977 2639{
2195ab96 2640 switch (theType)
2641 {
2642 case AIS_TOI_IsoU:
2643 myDefaultDrawer->UIsoAspect()->SetNumber (theNb);
2644 break;
2645 case AIS_TOI_IsoV:
2646 myDefaultDrawer->VIsoAspect()->SetNumber (theNb);
2647 break;
2648 case AIS_TOI_Both:
2649 myDefaultDrawer->UIsoAspect()->SetNumber (theNb);
2650 myDefaultDrawer->VIsoAspect()->SetNumber (theNb);
2651 break;
7fd59977 2652 }
2653}
2195ab96 2654
7fd59977 2655//=======================================================================
2656//function : IsoNumber
2195ab96 2657//purpose :
7fd59977 2658//=======================================================================
2195ab96 2659Standard_Integer AIS_InteractiveContext::IsoNumber (const AIS_TypeOfIso theType)
7fd59977 2660{
2195ab96 2661 switch (theType)
2662 {
2663 case AIS_TOI_IsoU: return myDefaultDrawer->UIsoAspect()->Number();
2664 case AIS_TOI_IsoV: return myDefaultDrawer->VIsoAspect()->Number();
2665 case AIS_TOI_Both: return myDefaultDrawer->UIsoAspect()->Number() == myDefaultDrawer->VIsoAspect()->Number()
2666 ? myDefaultDrawer->UIsoAspect()->Number()
2667 : -1;
7fd59977 2668 }
2669 return 0;
2670}
2671
2672//=======================================================================
2673//function : IsoOnPlane
2195ab96 2674//purpose :
7fd59977 2675//=======================================================================
2195ab96 2676void AIS_InteractiveContext::IsoOnPlane (const Standard_Boolean theToSwitchOn)
7fd59977 2677{
2195ab96 2678 myDefaultDrawer->SetIsoOnPlane (theToSwitchOn);
7fd59977 2679}
2680
2681//=======================================================================
2682//function : IsoOnPlane
2195ab96 2683//purpose :
7fd59977 2684//=======================================================================
2195ab96 2685Standard_Boolean AIS_InteractiveContext::IsoOnPlane() const
7fd59977 2686{
2687 return myDefaultDrawer->IsoOnPlane();
2688}
2689
2690//=======================================================================
5ad8c033 2691//function : IsoOnTriangulation
2692//purpose :
2693//=======================================================================
2694void AIS_InteractiveContext::IsoOnTriangulation (const Standard_Boolean theToSwitchOn)
2695{
2696 myDefaultDrawer->SetIsoOnTriangulation (theToSwitchOn);
2697}
2698
2699//=======================================================================
2700//function : IsoOnTriangulation
2701//purpose :
2702//=======================================================================
2703Standard_Boolean AIS_InteractiveContext::IsoOnTriangulation() const
2704{
2705 return myDefaultDrawer->IsoOnTriangulation();
2706}
2707
3c982548 2708//function : SetPixelTolerance
28ee613b 2709//purpose : Disables the mechanism of adaptive tolerance calculation in
2710// SelectMgr_ViewerSelector and sets the given tolerance for ALL
2711// sensitive entities activated. For more information, see
2712// SelectMgr_ViewerSelector.hxx
3c982548 2713//=======================================================================
3bf9a45f 2714void AIS_InteractiveContext::SetPixelTolerance (const Standard_Integer thePrecision)
2195ab96 2715{
2716 if (HasOpenedContext())
2717 {
2718 myLocalContexts (myCurLocalIndex)->SetPixelTolerance (thePrecision);
2719 }
2720 else
2721 {
2722 myMainSel->SetPixelTolerance (thePrecision);
7fd59977 2723 }
2724}
3c982548 2725
2726//=======================================================================
2727//function : PixelTolerance
2195ab96 2728//purpose :
3c982548 2729//=======================================================================
3bf9a45f 2730Standard_Integer AIS_InteractiveContext::PixelTolerance() const
2195ab96 2731{
2732 return HasOpenedContext()
2733 ? myLocalContexts (myCurLocalIndex)->PixelTolerance()
2734 : myMainSel->PixelTolerance();
3c982548 2735}
7fd59977 2736
2737//=======================================================================
8a1170ad 2738//function : SetSelectionSensitivity
2739//purpose : Allows to manage sensitivity of a particular selection of interactive object theObject
2740//=======================================================================
2741void AIS_InteractiveContext::SetSelectionSensitivity (const Handle(AIS_InteractiveObject)& theObject,
2742 const Standard_Integer theMode,
2743 const Standard_Integer theNewSensitivity)
2744{
2745 if (HasOpenedContext())
2746 {
2747 myLocalContexts (myCurLocalIndex)->SetSelectionSensitivity (theObject, theMode, theNewSensitivity);
2748 return;
2749 }
2750
2751 mgrSelector->SetSelectionSensitivity (theObject, theMode, theNewSensitivity);
2752}
2753
2754//=======================================================================
7fd59977 2755//function : IsInLocal
2195ab96 2756//purpose :
7fd59977 2757//=======================================================================
2195ab96 2758Standard_Boolean AIS_InteractiveContext::IsInLocal (const Handle(AIS_InteractiveObject)& theIObj,
2759 Standard_Integer& theIndex) const
7fd59977 2760{
2195ab96 2761 if (theIObj.IsNull())
2762 {
2763 return Standard_False;
2764 }
2765
81bba717 2766 // if it exists at neutral point 0 index is returned
2195ab96 2767 if (myObjects.IsBound (theIObj))
2768 {
2769 theIndex = 0;
7fd59977 2770 return Standard_False;
2771 }
2195ab96 2772
2773 for (Standard_Integer aCtxIter = 1; aCtxIter <= myLocalContexts.Extent(); ++aCtxIter)
2774 {
2775 if (myLocalContexts.IsBound (aCtxIter))
2776 {
2777 if(myLocalContexts (aCtxIter)->IsIn (theIObj))
2778 {
2779 theIndex = aCtxIter;
7fd59977 2780 return Standard_True;
7fd59977 2781 }
2782 }
2783 }
2195ab96 2784 theIndex = -1;
7fd59977 2785 return Standard_False;
2195ab96 2786}
2787
7fd59977 2788//=======================================================================
2789//function : InitAttributes
2195ab96 2790//purpose :
7fd59977 2791//=======================================================================
7fd59977 2792void AIS_InteractiveContext::InitAttributes()
2793{
2195ab96 2794 mgrSelector->Add (myMainSel);
7fd59977 2795 myCurrentName = AIS_Context_NewCurName();
2796 mySelectionName = AIS_Context_NewSelName();
2797
2195ab96 2798 AIS_Selection::CreateSelection (mySelectionName.ToCString());
2799 AIS_Selection::CreateSelection (myCurrentName.ToCString());
7fd59977 2800
2195ab96 2801 myDefaultDrawer->SetShadingAspectGlobal (Standard_False);
2802 Graphic3d_MaterialAspect aMat (Graphic3d_NOM_BRASS);
2803 myDefaultDrawer->ShadingAspect()->SetMaterial (aMat);
7fd59977 2804
2805// myDefaultDrawer->ShadingAspect()->SetColor(Quantity_NOC_GRAY70);
2195ab96 2806 Handle(Prs3d_LineAspect) aLineAspect = myDefaultDrawer->HiddenLineAspect();
2807 aLineAspect->SetColor (Quantity_NOC_GRAY20);
2808 aLineAspect->SetWidth (1.0);
2809 aLineAspect->SetTypeOfLine (Aspect_TOL_DASH);
7fd59977 2810
28ee613b 2811 // tolerance to 2 pixels...
3bf9a45f 2812 SetPixelTolerance (2);
7fd59977 2813
2814 // Customizing the drawer for trihedrons and planes...
2195ab96 2815 Handle(Prs3d_DatumAspect) aTrihAspect = myDefaultDrawer->DatumAspect();
2816 const Standard_Real aLength = 100.0;
2817 aTrihAspect->SetAxisLength (aLength, aLength, aLength);
2818 const Quantity_NameOfColor aColor = Quantity_NOC_LIGHTSTEELBLUE4;
2819 aTrihAspect->FirstAxisAspect() ->SetColor (aColor);
2820 aTrihAspect->SecondAxisAspect()->SetColor (aColor);
2821 aTrihAspect->ThirdAxisAspect() ->SetColor (aColor);
7fd59977 2822
2195ab96 2823 Handle(Prs3d_PlaneAspect) aPlaneAspect = myDefaultDrawer->PlaneAspect();
2824 const Standard_Real aPlaneLength = 200.0;
2825 aPlaneAspect->SetPlaneLength (aPlaneLength, aPlaneLength);
2826 aPlaneAspect->EdgesAspect()->SetColor (Quantity_NOC_SKYBLUE);
7fd59977 2827}
2828
7fd59977 2829//=======================================================================
2830//function : TrihedronSize
2195ab96 2831//purpose :
7fd59977 2832//=======================================================================
2833Standard_Real AIS_InteractiveContext::TrihedronSize() const
2834{
2835 return myDefaultDrawer->DatumAspect()->FirstAxisLength();
2836}
2195ab96 2837
7fd59977 2838//=======================================================================
2839//function : SetTrihedronSize
2195ab96 2840//purpose :
7fd59977 2841//=======================================================================
2195ab96 2842void AIS_InteractiveContext::SetTrihedronSize (const Standard_Real theVal,
2843 const Standard_Boolean /*updateviewer*/)
7fd59977 2844{
2195ab96 2845 myDefaultDrawer->DatumAspect()->SetAxisLength (theVal, theVal, theVal);
2846 Redisplay (AIS_KOI_Datum, 3, Standard_False);
2847 Redisplay (AIS_KOI_Datum, 4, Standard_True);
7fd59977 2848}
2849
7fd59977 2850//=======================================================================
2851//function : SetPlaneSize
2195ab96 2852//purpose :
7fd59977 2853//=======================================================================
2195ab96 2854void AIS_InteractiveContext::SetPlaneSize(const Standard_Real theValX,
2855 const Standard_Real theValY,
7fd59977 2856 const Standard_Boolean /*updateviewer*/)
2857{
2195ab96 2858 myDefaultDrawer->PlaneAspect()->SetPlaneLength (theValX, theValY);
2859 Redisplay (AIS_KOI_Datum, 7);
7fd59977 2860}
2861
2862//=======================================================================
2863//function : SetPlaneSize
2195ab96 2864//purpose :
7fd59977 2865//=======================================================================
2195ab96 2866void AIS_InteractiveContext::SetPlaneSize (const Standard_Real theVal,
2867 const Standard_Boolean theToUpdateViewer)
7fd59977 2868{
2195ab96 2869 SetPlaneSize (theVal, theVal, theToUpdateViewer);
7fd59977 2870}
2871
2872//=======================================================================
2873//function : PlaneSize
2195ab96 2874//purpose :
7fd59977 2875//=======================================================================
2195ab96 2876Standard_Boolean AIS_InteractiveContext::PlaneSize (Standard_Real& theX,
2877 Standard_Real& theY) const
7fd59977 2878{
2195ab96 2879 theX = myDefaultDrawer->PlaneAspect()->PlaneXLength();
2880 theY = myDefaultDrawer->PlaneAspect()->PlaneYLength();
2881 return (Abs (theX - theY) <= Precision::Confusion());
7fd59977 2882}
2883
7fd59977 2884//=======================================================================
2195ab96 2885//function : SetAutoActivateSelection
2886//purpose :
7fd59977 2887//=======================================================================
2195ab96 2888void AIS_InteractiveContext::SetAutoActivateSelection (const Standard_Boolean theIsAuto)
7fd59977 2889{
2195ab96 2890 myIsAutoActivateSelMode = theIsAuto;
7fd59977 2891}
2892
2893//=======================================================================
2195ab96 2894//function : GetAutoActivateSelection
2895//purpose :
7fd59977 2896//=======================================================================
2897Standard_Boolean AIS_InteractiveContext::GetAutoActivateSelection() const
2898{
2899 return myIsAutoActivateSelMode;
2900}
59f45b7c 2901
2902//=======================================================================
2903//function : SetZLayer
2195ab96 2904//purpose :
59f45b7c 2905//=======================================================================
59f45b7c 2906void AIS_InteractiveContext::SetZLayer (const Handle(AIS_InteractiveObject)& theIObj,
2907 const Standard_Integer theLayerId)
2908{
2195ab96 2909 if (theIObj.IsNull())
59f45b7c 2910 return;
2911
a1954302 2912 theIObj->SetZLayer (theLayerId);
59f45b7c 2913}
2914
2915//=======================================================================
2916//function : GetZLayer
2195ab96 2917//purpose :
59f45b7c 2918//=======================================================================
59f45b7c 2919Standard_Integer AIS_InteractiveContext::GetZLayer (const Handle(AIS_InteractiveObject)& theIObj) const
2920{
a1954302 2921 return !theIObj.IsNull()
2922 ? theIObj->ZLayer()
2923 : Graphic3d_ZLayerId_UNKNOWN;
59f45b7c 2924}
f751596e 2925
2926//=======================================================================
2927//function : RebuildSelectionStructs
2928//purpose : Rebuilds 1st level of BVH selection forcibly
2929//=======================================================================
2930void AIS_InteractiveContext::RebuildSelectionStructs()
2931{
2932 myMainSel->RebuildObjectsTree (Standard_True);
2933}
2934
2935//=======================================================================
2936//function : Disconnect
2937//purpose : Disconnects selectable object from an assembly and updates selection structures
2938//=======================================================================
2939void AIS_InteractiveContext::Disconnect (const Handle(AIS_InteractiveObject)& theAssembly,
2940 const Handle(AIS_InteractiveObject)& theObjToDisconnect)
2941{
2942 if (theAssembly->IsInstance ("AIS_MultipleConnectedInteractive"))
2943 {
c5f3a425 2944 Handle(AIS_MultipleConnectedInteractive) theObj (Handle(AIS_MultipleConnectedInteractive)::DownCast (theAssembly));
f751596e 2945 theObj->Disconnect (theObjToDisconnect);
543a9964 2946 const Handle(SelectMgr_SelectableObject)& anObj = theObjToDisconnect; // to avoid ambiguity
2947 mgrSelector->Remove (anObj);
f751596e 2948 }
c04c30b3 2949 else if (theAssembly->IsInstance ("AIS_ConnectedInteractive") && theObjToDisconnect.IsNull())
f751596e 2950 {
c5f3a425 2951 Handle(AIS_ConnectedInteractive) theObj (Handle(AIS_ConnectedInteractive)::DownCast (theAssembly));
f751596e 2952 theObj->Disconnect();
543a9964 2953 const Handle(SelectMgr_SelectableObject)& anObj = theObj; // to avoid ambiguity
2954 mgrSelector->Remove (anObj);
f751596e 2955 }
2956 else
2957 return;
2958}
b586500b 2959
2960//=======================================================================
2961//function : FitSelected
2962//purpose : Fits the view corresponding to the bounds of selected objects
2963//=======================================================================
2964void AIS_InteractiveContext::FitSelected (const Handle(V3d_View)& theView,
2965 const Standard_Real theMargin,
2966 const Standard_Boolean theToUpdate)
2967{
2968 Standard_CString aSelName = HasOpenedContext() ?
2969 myLocalContexts (myCurLocalIndex)->SelectionName().ToCString()
2970 : myCurrentName.ToCString();
2971
2972 Bnd_Box aBndSelected;
2973
2974 const Handle(AIS_Selection)& aSelection = AIS_Selection::Selection (aSelName);
2975 AIS_MapOfObjectOwners anObjectOwnerMap;
2976 for (aSelection->Init(); aSelection->More(); aSelection->Next())
2977 {
c5f3a425 2978 Handle(AIS_InteractiveObject) anObj (Handle(AIS_InteractiveObject)::DownCast (aSelection->Value()));
b586500b 2979 if (!anObj.IsNull())
2980 {
2981 if (anObj->IsInfinite())
2982 continue;
2983
2984 Bnd_Box aTmpBnd;
2985 anObj->BoundingBox (aTmpBnd);
2986 aBndSelected.Add (aTmpBnd);
2987 }
2988 else
2989 {
c5f3a425 2990 Handle(SelectMgr_EntityOwner) anOwner (Handle(SelectMgr_EntityOwner)::DownCast (aSelection->Value()));
b586500b 2991 if (anOwner.IsNull())
2992 continue;
2993
2994 Handle(SelectMgr_IndexedMapOfOwner) anOwnerMap;
2995 if (!anObjectOwnerMap.Find (anOwner->Selectable(), anOwnerMap))
2996 {
2997 anOwnerMap = new SelectMgr_IndexedMapOfOwner();
2998 anObjectOwnerMap.Bind (anOwner->Selectable(), anOwnerMap);
2999 }
3000
3001 anOwnerMap->Add (anOwner);
3002 }
3003 }
3004
3005 for (AIS_MapIteratorOfMapOfObjectOwners anIter (anObjectOwnerMap); anIter.More(); anIter.Next())
3006 {
3007 const Handle(SelectMgr_SelectableObject) anObject = anIter.Key();
3008 Bnd_Box aTmpBox = anObject->BndBoxOfSelected (anIter.ChangeValue());
3009 aBndSelected.Add (aTmpBox);
3010 }
3011
3012 anObjectOwnerMap.Clear();
3013
3014 if (aBndSelected.IsVoid())
3015 return;
3016
3017 theView->FitAll (aBndSelected, theMargin, theToUpdate);
3018}