0031153: Visualization - Non clear highlighting of selected trihedron elements
[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
d94bed0e 17#include <AIS_InteractiveContext.hxx>
2ec85268 18
42cf5bc1 19#include <AIS_DataMapIteratorOfDataMapOfIOStatus.hxx>
d94bed0e 20#include <AIS_ConnectedInteractive.hxx>
7fd59977 21#include <AIS_GlobalStatus.hxx>
42cf5bc1 22#include <AIS_InteractiveObject.hxx>
23#include <AIS_ListIteratorOfListOfInteractive.hxx>
7fd59977 24#include <AIS_MapIteratorOfMapOfInteractive.hxx>
42cf5bc1 25#include <AIS_MultipleConnectedInteractive.hxx>
7fd59977 26#include <AIS_Shape.hxx>
42cf5bc1 27#include <AIS_Trihedron.hxx>
28#include <Geom_Axis2Placement.hxx>
7fd59977 29#include <Graphic3d_AspectFillArea3d.hxx>
30#include <HLRBRep.hxx>
42cf5bc1 31#include <OSD_Environment.hxx>
32#include <Precision.hxx>
33#include <Prs3d_BasicAspect.hxx>
7fd59977 34#include <Prs3d_DatumAspect.hxx>
42cf5bc1 35#include <Prs3d_IsoAspect.hxx>
36#include <Prs3d_LineAspect.hxx>
7fd59977 37#include <Prs3d_PlaneAspect.hxx>
f838dac4 38#include <Prs3d_PointAspect.hxx>
42cf5bc1 39#include <Prs3d_ShadingAspect.hxx>
7fd59977 40#include <PrsMgr_PresentableObject.hxx>
42cf5bc1 41#include <Quantity_Color.hxx>
42#include <SelectMgr_EntityOwner.hxx>
43#include <SelectMgr_Filter.hxx>
44#include <SelectMgr_OrFilter.hxx>
45#include <SelectMgr_SelectionManager.hxx>
e33e7e78 46#include <Standard_Atomic.hxx>
42cf5bc1 47#include <Standard_Transient.hxx>
48#include <Standard_Type.hxx>
f751596e 49#include <StdSelect_ViewerSelector3d.hxx>
42cf5bc1 50#include <TCollection_AsciiString.hxx>
51#include <TCollection_ExtendedString.hxx>
52#include <TColStd_ListIteratorOfListOfInteger.hxx>
53#include <TColStd_MapIteratorOfMapOfTransient.hxx>
54#include <TopLoc_Location.hxx>
55#include <TopoDS_Shape.hxx>
7fd59977 56#include <UnitsAPI.hxx>
42cf5bc1 57#include <V3d_View.hxx>
58#include <V3d_Viewer.hxx>
7fd59977 59
2ec85268 60IMPLEMENT_STANDARD_RTTIEXT(AIS_InteractiveContext, Standard_Transient)
92efcf78 61
e33e7e78 62namespace
7fd59977 63{
b586500b 64 typedef NCollection_DataMap<Handle(SelectMgr_SelectableObject), Handle(SelectMgr_IndexedMapOfOwner)> AIS_MapOfObjectOwners;
65 typedef NCollection_DataMap<Handle(SelectMgr_SelectableObject), Handle(SelectMgr_IndexedMapOfOwner)>::Iterator AIS_MapIteratorOfMapOfObjectOwners;
f838dac4 66
67 //! Initialize default highlighting attributes.
df8c7e3e 68 static void initDefaultHilightAttributes (const Handle(Prs3d_Drawer)& theDrawer,
69 const Quantity_Color& theColor)
f838dac4 70 {
71 theDrawer->SetMethod (Aspect_TOHM_COLOR);
72 theDrawer->SetDisplayMode (0);
df8c7e3e 73 theDrawer->SetColor (theColor);
f838dac4 74
df8c7e3e 75 theDrawer->SetupOwnShadingAspect();
76 theDrawer->SetupOwnPointAspect();
f838dac4 77 theDrawer->SetLineAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
78 *theDrawer->LineAspect()->Aspect() = *theDrawer->Link()->LineAspect()->Aspect();
79 theDrawer->SetWireAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
80 *theDrawer->WireAspect()->Aspect() = *theDrawer->Link()->WireAspect()->Aspect();
81 theDrawer->SetPlaneAspect (new Prs3d_PlaneAspect());
82 *theDrawer->PlaneAspect()->EdgesAspect() = *theDrawer->Link()->PlaneAspect()->EdgesAspect();
83 theDrawer->SetFreeBoundaryAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
84 *theDrawer->FreeBoundaryAspect()->Aspect() = *theDrawer->Link()->FreeBoundaryAspect()->Aspect();
85 theDrawer->SetUnFreeBoundaryAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
86 *theDrawer->UnFreeBoundaryAspect()->Aspect() = *theDrawer->Link()->UnFreeBoundaryAspect()->Aspect();
df8c7e3e 87 theDrawer->SetDatumAspect (new Prs3d_DatumAspect());
88
89 theDrawer->ShadingAspect()->SetColor (theColor);
90 theDrawer->WireAspect()->SetColor (theColor);
91 theDrawer->LineAspect()->SetColor (theColor);
92 theDrawer->PlaneAspect()->ArrowAspect()->SetColor (theColor);
93 theDrawer->PlaneAspect()->IsoAspect()->SetColor (theColor);
94 theDrawer->PlaneAspect()->EdgesAspect()->SetColor (theColor);
95 theDrawer->FreeBoundaryAspect()->SetColor (theColor);
96 theDrawer->UnFreeBoundaryAspect()->SetColor (theColor);
97 theDrawer->PointAspect()->SetColor (theColor);
98 for (Standard_Integer aPartIter = 0; aPartIter < Prs3d_DP_None; ++aPartIter)
99 {
100 if (Handle(Prs3d_LineAspect) aLineAsp = theDrawer->DatumAspect()->LineAspect ((Prs3d_DatumParts )aPartIter))
101 {
102 aLineAsp->SetColor (theColor);
103 }
104 }
f838dac4 105
106 theDrawer->WireAspect()->SetWidth (2.0);
107 theDrawer->LineAspect()->SetWidth (2.0);
108 theDrawer->PlaneAspect()->EdgesAspect()->SetWidth (2.0);
109 theDrawer->FreeBoundaryAspect() ->SetWidth (2.0);
110 theDrawer->UnFreeBoundaryAspect()->SetWidth (2.0);
111 theDrawer->PointAspect()->SetTypeOfMarker (Aspect_TOM_O_POINT);
112 theDrawer->PointAspect()->SetScale (2.0);
113
114 // the triangulation should be computed using main presentation attributes,
115 // and should not be overridden by highlighting
116 theDrawer->SetAutoTriangulation (Standard_False);
117 }
2195ab96 118}
7fd59977 119
120//=======================================================================
121//function : AIS_InteractiveContext
122//purpose :
123//=======================================================================
124
125AIS_InteractiveContext::AIS_InteractiveContext(const Handle(V3d_Viewer)& MainViewer):
c357e426 126myMainPM(new PrsMgr_PresentationManager3d(MainViewer->StructureManager())),
7fd59977 127myMainVwr(MainViewer),
128myMainSel(new StdSelect_ViewerSelector3d()),
cbff1e55 129myToHilightSelected(Standard_True),
f838dac4 130mySelection(new AIS_Selection()),
7fd59977 131myFilters(new SelectMgr_OrFilter()),
132myDefaultDrawer(new Prs3d_Drawer()),
f0cddd16 133myCurDetected(0),
134myCurHighlighted(0),
14c4193d 135myPickingStrategy (SelectMgr_PickingStrategy_FirstAcceptable),
68dcee02 136myAutoHilight(Standard_True),
016e5959 137myIsAutoActivateSelMode(Standard_True)
f838dac4 138{
68dcee02 139 mgrSelector = new SelectMgr_SelectionManager (myMainSel);
140
f838dac4 141 myStyles[Prs3d_TypeOfHighlight_None] = myDefaultDrawer;
142 myStyles[Prs3d_TypeOfHighlight_Selected] = new Prs3d_Drawer();
143 myStyles[Prs3d_TypeOfHighlight_Dynamic] = new Prs3d_Drawer();
144 myStyles[Prs3d_TypeOfHighlight_LocalSelected] = new Prs3d_Drawer();
145 myStyles[Prs3d_TypeOfHighlight_LocalDynamic] = new Prs3d_Drawer();
146 myStyles[Prs3d_TypeOfHighlight_SubIntensity] = new Prs3d_Drawer();
147
148 myDefaultDrawer->SetZLayer(Graphic3d_ZLayerId_Default);
149 myDefaultDrawer->SetDisplayMode(0);
150 {
151 const Handle(Prs3d_Drawer)& aStyle = myStyles[Prs3d_TypeOfHighlight_Dynamic];
152 aStyle->Link (myDefaultDrawer);
df8c7e3e 153 initDefaultHilightAttributes (aStyle, Quantity_NOC_CYAN1);
f838dac4 154 aStyle->SetZLayer(Graphic3d_ZLayerId_Top);
f838dac4 155 }
156 {
157 const Handle(Prs3d_Drawer)& aStyle = myStyles[Prs3d_TypeOfHighlight_LocalDynamic];
158 aStyle->Link (myDefaultDrawer);
df8c7e3e 159 initDefaultHilightAttributes (aStyle, Quantity_NOC_CYAN1);
f838dac4 160 aStyle->SetZLayer(Graphic3d_ZLayerId_Topmost);
f838dac4 161 }
162 {
163 const Handle(Prs3d_Drawer)& aStyle = myStyles[Prs3d_TypeOfHighlight_Selected];
164 aStyle->Link (myDefaultDrawer);
df8c7e3e 165 initDefaultHilightAttributes (aStyle, Quantity_NOC_GRAY80);
f838dac4 166 aStyle->SetZLayer(Graphic3d_ZLayerId_UNKNOWN);
f838dac4 167 }
168 {
169 const Handle(Prs3d_Drawer)& aStyle = myStyles[Prs3d_TypeOfHighlight_LocalSelected];
170 aStyle->Link (myDefaultDrawer);
df8c7e3e 171 initDefaultHilightAttributes (aStyle, Quantity_NOC_GRAY80);
f838dac4 172 aStyle->SetZLayer(Graphic3d_ZLayerId_UNKNOWN);
f838dac4 173 }
174 {
175 const Handle(Prs3d_Drawer)& aStyle = myStyles[Prs3d_TypeOfHighlight_SubIntensity];
176 aStyle->SetZLayer(Graphic3d_ZLayerId_UNKNOWN);
177 aStyle->SetMethod(Aspect_TOHM_COLOR);
178 aStyle->SetColor (Quantity_NOC_GRAY40);
179 }
180
7fd59977 181 InitAttributes();
182}
183
2ec85268 184//=======================================================================
185//function : ~AIS_InteractiveContext
186//purpose :
187//=======================================================================
188AIS_InteractiveContext::~AIS_InteractiveContext()
7fd59977 189{
016e5959 190 // clear the current selection
02974a19 191 mySelection->Clear();
68dcee02 192 mgrSelector.Nullify();
2195ab96 193
da0e82aa 194 Handle(AIS_InteractiveContext) aNullContext;
2195ab96 195 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
da0e82aa 196 {
b5cce1ab 197 const Handle(AIS_InteractiveObject)& anObj = anObjIter.Key();
2195ab96 198 anObj->SetContext (aNullContext);
b5cce1ab 199 for (SelectMgr_SequenceOfSelection::Iterator aSelIter (anObj->Selections()); aSelIter.More(); aSelIter.Next())
c3282ec1 200 {
b5cce1ab 201 aSelIter.Value()->UpdateBVHStatus (SelectMgr_TBU_Renew);
c3282ec1 202 }
da0e82aa 203 }
7fd59977 204}
205
2108d9a2 206//=======================================================================
207//function : LastActiveView
208//purpose :
209//=======================================================================
210Handle(V3d_View) AIS_InteractiveContext::LastActiveView() const
211{
212 if (myLastActiveView == NULL
213 || myMainVwr.IsNull())
214 {
215 return Handle(V3d_View)();
216 }
217
218 // as a precaution - check that myLastActiveView pointer is a valid active View
219 for (V3d_ListOfViewIterator aViewIter = myMainVwr->ActiveViewIterator(); aViewIter.More(); aViewIter.Next())
220 {
221 if (aViewIter.Value() == myLastActiveView)
222 {
223 return aViewIter.Value();
224 }
225 }
226 return Handle(V3d_View)();
227}
228
7fd59977 229//=======================================================================
230//function : UpdateCurrentViewer
231//purpose :
232//=======================================================================
233
234void AIS_InteractiveContext::UpdateCurrentViewer()
235{
236 if (!myMainVwr.IsNull())
237 myMainVwr->Update();
238}
239
7fd59977 240//=======================================================================
241//function : DisplayedObjects
2195ab96 242//purpose :
7fd59977 243//=======================================================================
68dcee02 244void AIS_InteractiveContext::DisplayedObjects (AIS_ListOfInteractive& theListOfIO) const
7fd59977 245{
2195ab96 246 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
247 {
248 if (anObjIter.Value()->GraphicStatus() == AIS_DS_Displayed)
249 {
68dcee02 250 theListOfIO.Append (anObjIter.Key());
7fd59977 251 }
2195ab96 252 }
7fd59977 253}
2195ab96 254
7fd59977 255//=======================================================================
256//function : DisplayedObjects
2195ab96 257//purpose :
7fd59977 258//=======================================================================
2195ab96 259void AIS_InteractiveContext::DisplayedObjects (const AIS_KindOfInteractive theKind,
260 const Standard_Integer theSign,
68dcee02 261 AIS_ListOfInteractive& theListOfIO) const
7fd59977 262{
2195ab96 263 ObjectsByDisplayStatus (theKind, theSign, AIS_DS_Displayed, theListOfIO);
7fd59977 264}
265
7fd59977 266//=======================================================================
267//function : ErasedObjects
2195ab96 268//purpose :
7fd59977 269//=======================================================================
2195ab96 270void AIS_InteractiveContext::ErasedObjects (AIS_ListOfInteractive& theListOfIO) const
7fd59977 271{
2195ab96 272 ObjectsByDisplayStatus (AIS_DS_Erased, theListOfIO);
7fd59977 273}
274
275//=======================================================================
276//function : ErasedObjects
2195ab96 277//purpose :
7fd59977 278//=======================================================================
2195ab96 279void AIS_InteractiveContext::ErasedObjects (const AIS_KindOfInteractive theKind,
280 const Standard_Integer theSign,
281 AIS_ListOfInteractive& theListOfIO) const
7fd59977 282{
2195ab96 283 ObjectsByDisplayStatus (theKind, theSign, AIS_DS_Erased, theListOfIO);
7fd59977 284}
285
286//=======================================================================
287//function : ObjectsByDisplayStatus
2195ab96 288//purpose :
7fd59977 289//=======================================================================
2195ab96 290void AIS_InteractiveContext::ObjectsByDisplayStatus (const AIS_DisplayStatus theStatus,
291 AIS_ListOfInteractive& theListOfIO) const
7fd59977 292{
2195ab96 293 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
294 {
295 if (anObjIter.Value()->GraphicStatus() == theStatus)
296 {
297 theListOfIO.Append (anObjIter.Key());
298 }
7fd59977 299 }
300}
301
302//=======================================================================
303//function : ObjectsByDisplayStatus
2195ab96 304//purpose :
7fd59977 305//=======================================================================
2195ab96 306void AIS_InteractiveContext::ObjectsByDisplayStatus (const AIS_KindOfInteractive theKind,
307 const Standard_Integer theSign,
308 const AIS_DisplayStatus theStatus,
309 AIS_ListOfInteractive& theListOfIO) const
310{
311 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
312 {
a1954302 313 if (theStatus != AIS_DS_None
314 && anObjIter.Value()->GraphicStatus() != theStatus)
315 {
316 continue;
317 }
318 else if (anObjIter.Key()->Type() != theKind)
2195ab96 319 {
320 continue;
321 }
7fd59977 322
2195ab96 323 if (theSign == -1
324 || anObjIter.Key()->Signature() == theSign)
325 {
326 theListOfIO.Append (anObjIter.Key());
7fd59977 327 }
328 }
329}
330
331//=======================================================================
332//function : ObjectsInside
2195ab96 333//purpose :
7fd59977 334//=======================================================================
2195ab96 335void AIS_InteractiveContext::ObjectsInside (AIS_ListOfInteractive& theListOfIO,
336 const AIS_KindOfInteractive theKind,
337 const Standard_Integer theSign) const
7fd59977 338{
2195ab96 339 if (theKind == AIS_KOI_None
340 && theSign == -1)
341 {
342 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
343 {
344 theListOfIO.Append (anObjIter.Key());
7fd59977 345 }
2195ab96 346 return;
7fd59977 347 }
2195ab96 348
349 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
350 {
351 if (anObjIter.Key()->Type() != theKind)
352 {
353 continue;
354 }
355
356 if (theSign == -1
357 || anObjIter.Key()->Signature() == theSign)
358 {
359 theListOfIO.Append (anObjIter.Key());
7fd59977 360 }
361 }
362}
363
a272ed94 364//=======================================================================
365//function : ObjectsForView
366//purpose :
367//=======================================================================
368void AIS_InteractiveContext::ObjectsForView (AIS_ListOfInteractive& theListOfIO,
369 const Handle(V3d_View)& theView,
370 const Standard_Boolean theIsVisibleInView,
371 const AIS_DisplayStatus theStatus) const
372{
c357e426 373 Handle(Graphic3d_CView) aViewImpl = theView->View();
374 const Standard_Integer aViewId = aViewImpl->Identification();
a272ed94 375 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
376 {
377 if (theStatus != AIS_DS_None
378 && anObjIter.Value()->GraphicStatus() != theStatus)
379 {
380 theListOfIO.Append (anObjIter.Key());
381 continue;
382 }
383
c357e426 384 Handle(Graphic3d_ViewAffinity) anAffinity = myMainVwr->StructureManager()->ObjectAffinity (anObjIter.Key());
a272ed94 385 const Standard_Boolean isVisible = anAffinity->IsVisible (aViewId);
386 if (isVisible == theIsVisibleInView)
387 {
388 theListOfIO.Append (anObjIter.Key());
389 }
390 }
391}
392
7fd59977 393//=======================================================================
394//function : Display
2195ab96 395//purpose :
7fd59977 396//=======================================================================
2195ab96 397void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIObj,
398 const Standard_Boolean theToUpdateViewer)
399{
400 if (theIObj.IsNull())
401 {
402 return;
403 }
404
405 Standard_Integer aDispMode = 0, aHiMod = -1, aSelMode = -1;
406 GetDefModes (theIObj, aDispMode, aHiMod, aSelMode);
68dcee02 407 Display (theIObj, aDispMode, myIsAutoActivateSelMode ? aSelMode : -1, theToUpdateViewer);
2195ab96 408}
7fd59977 409
a272ed94 410//=======================================================================
411//function : SetViewAffinity
412//purpose :
413//=======================================================================
414void AIS_InteractiveContext::SetViewAffinity (const Handle(AIS_InteractiveObject)& theIObj,
415 const Handle(V3d_View)& theView,
416 const Standard_Boolean theIsVisible)
417{
418 if (theIObj.IsNull()
419 || !myObjects.IsBound (theIObj))
420 {
421 return;
422 }
423
c357e426 424 Handle(Graphic3d_ViewAffinity) anAffinity = myMainVwr->StructureManager()->ObjectAffinity (theIObj);
425 Handle(Graphic3d_CView) aViewImpl = theView->View();
426 anAffinity->SetVisible (aViewImpl->Identification(), theIsVisible == Standard_True);
a272ed94 427 if (theIsVisible)
428 {
c04c30b3 429 theView->View()->ChangeHiddenObjects()->Remove (theIObj.get());
a272ed94 430 }
431 else
432 {
c04c30b3 433 theView->View()->ChangeHiddenObjects()->Add (theIObj.get());
a272ed94 434 }
435}
436
2195ab96 437//=======================================================================
438//function : Display
439//purpose :
440//=======================================================================
441void AIS_InteractiveContext::Display (const Handle(AIS_InteractiveObject)& theIObj,
442 const Standard_Integer theDispMode,
443 const Standard_Integer theSelectionMode,
444 const Standard_Boolean theToUpdateViewer,
a1954302 445 const AIS_DisplayStatus theDispStatus)
7fd59977 446{
2195ab96 447 if (theIObj.IsNull())
448 {
449 return;
450 }
7fd59977 451
a1954302 452 if (theDispStatus == AIS_DS_Erased)
453 {
454 Erase (theIObj, theToUpdateViewer);
68dcee02 455 Load (theIObj, theSelectionMode);
6194ee76 456 if (Handle(AIS_GlobalStatus)* aStatusPtr = myObjects.ChangeSeek (theIObj))
457 {
458 (*aStatusPtr)->SetDisplayMode (theDispMode);
459 }
a1954302 460 return;
461 }
462
2ec85268 463 setContextToObject (theIObj);
2195ab96 464 if (!myObjects.IsBound (theIObj))
465 {
13c556d9 466 setObjectStatus (theIObj, AIS_DS_Displayed, theDispMode, theSelectionMode);
6194ee76 467 myMainVwr->StructureManager()->RegisterObject (theIObj);
2195ab96 468 myMainPM->Display(theIObj, theDispMode);
469 if (theSelectionMode != -1)
470 {
543a9964 471 const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
472 if (!mgrSelector->Contains (anObj))
2195ab96 473 {
474 mgrSelector->Load (theIObj);
7fd59977 475 }
68dcee02 476 mgrSelector->Activate (theIObj, theSelectionMode);
2195ab96 477 }
7fd59977 478 }
7fd59977 479 else
480 {
2195ab96 481 Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
a6964ce6 482
f2b63181 483 // Mark the presentation modes hidden of interactive object different from aDispMode.
2195ab96 484 // Then make sure aDispMode is displayed and maybe highlighted.
485 // Finally, activate selection mode <SelMode> if not yet activated.
3db69e41 486 const Standard_Integer anOldMode = aStatus->DisplayMode();
487 if (anOldMode != theDispMode)
2195ab96 488 {
3db69e41 489 if(myMainPM->IsHighlighted (theIObj, anOldMode))
2195ab96 490 {
f838dac4 491 unhighlightGlobal (theIObj);
2195ab96 492 }
3db69e41 493 myMainPM->SetVisibility (theIObj, anOldMode, Standard_False);
2195ab96 494 }
7fd59977 495
3db69e41 496 aStatus->SetDisplayMode (theDispMode);
7fd59977 497
2195ab96 498 myMainPM->Display (theIObj, theDispMode);
a1954302 499 aStatus->SetGraphicStatus (AIS_DS_Displayed);
2195ab96 500 if (aStatus->IsHilighted())
501 {
f838dac4 502 highlightGlobal (theIObj, aStatus->HilightStyle(), theDispMode);
2195ab96 503 }
504 if (theSelectionMode != -1)
505 {
543a9964 506 const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
507 if (!mgrSelector->Contains (anObj))
2195ab96 508 {
509 mgrSelector->Load (theIObj);
7fd59977 510 }
2195ab96 511 if (!mgrSelector->IsActivated (theIObj, theSelectionMode))
512 {
0824e32e 513 if (!aStatus->IsSModeIn (theSelectionMode))
514 aStatus->AddSelectionMode (theSelectionMode);
68dcee02 515 mgrSelector->Activate (theIObj, theSelectionMode);
7fd59977 516 }
7fd59977 517 }
518 }
7fd59977 519
2195ab96 520 if (theToUpdateViewer)
521 {
522 myMainVwr->Update();
523 }
524}
7fd59977 525
526//=======================================================================
527//function : Load
2195ab96 528//purpose :
7fd59977 529//=======================================================================
2195ab96 530void AIS_InteractiveContext::Load (const Handle(AIS_InteractiveObject)& theIObj,
68dcee02 531 const Standard_Integer theSelMode)
7fd59977 532{
2195ab96 533 if (theIObj.IsNull())
534 {
535 return;
536 }
7fd59977 537
2ec85268 538 setContextToObject (theIObj);
6194ee76 539 if (!myObjects.IsBound (theIObj))
2195ab96 540 {
6194ee76 541 Standard_Integer aDispMode, aHiMod, aSelModeDef;
542 GetDefModes (theIObj, aDispMode, aHiMod, aSelModeDef);
13c556d9 543 setObjectStatus (theIObj, AIS_DS_Erased, aDispMode, theSelMode != -1 ? theSelMode : aSelModeDef);
6194ee76 544 myMainVwr->StructureManager()->RegisterObject (theIObj);
545 }
89cc29b0 546
6194ee76 547 // Register theIObj in the selection manager to prepare further activation of selection
548 const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
549 if (!mgrSelector->Contains (anObj))
550 {
551 mgrSelector->Load (theIObj);
2195ab96 552 }
553}
7fd59977 554
555//=======================================================================
556//function : Erase
2195ab96 557//purpose :
7fd59977 558//=======================================================================
2195ab96 559void AIS_InteractiveContext::Erase (const Handle(AIS_InteractiveObject)& theIObj,
560 const Standard_Boolean theToUpdateViewer)
7fd59977 561{
2195ab96 562 if (theIObj.IsNull())
563 {
564 return;
565 }
7fd59977 566
2195ab96 567 if (!theIObj->IsAutoHilight())
568 {
569 theIObj->ClearSelected();
7fd59977 570 }
2195ab96 571
68dcee02 572 EraseGlobal (theIObj, Standard_False);
2195ab96 573 if (theToUpdateViewer)
574 {
575 myMainVwr->Update();
576 }
7fd59977 577}
7fd59977 578
579//=======================================================================
580//function : EraseAll
2195ab96 581//purpose :
7fd59977 582//=======================================================================
2195ab96 583void AIS_InteractiveContext::EraseAll (const Standard_Boolean theToUpdateViewer)
7fd59977 584{
2195ab96 585 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
586 {
587 if (anObjIter.Value()->GraphicStatus() == AIS_DS_Displayed)
eb4320f2 588 {
2195ab96 589 Erase (anObjIter.Key(), Standard_False);
7fd59977 590 }
591 }
2195ab96 592
593 if (theToUpdateViewer)
594 {
595 myMainVwr->Update();
596 }
7fd59977 597}
598
599//=======================================================================
600//function : DisplayAll
2195ab96 601//purpose :
7fd59977 602//=======================================================================
2195ab96 603void AIS_InteractiveContext::DisplayAll (const Standard_Boolean theToUpdateViewer)
7fd59977 604{
2195ab96 605 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
606 {
607 const AIS_DisplayStatus aStatus = anObjIter.Value()->GraphicStatus();
608 if (aStatus == AIS_DS_Erased)
eb4320f2 609 {
2195ab96 610 Display (anObjIter.Key(), Standard_False);
7fd59977 611 }
612 }
2195ab96 613
614 if (theToUpdateViewer)
615 {
616 myMainVwr->Update();
617 }
7fd59977 618}
619
620//=======================================================================
621//function : DisplaySelected
2195ab96 622//purpose :
7fd59977 623//=======================================================================
2195ab96 624void AIS_InteractiveContext::DisplaySelected (const Standard_Boolean theToUpdateViewer)
7fd59977 625{
b5cce1ab 626 for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
2195ab96 627 {
b5cce1ab 628 Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (aSelIter.Value()->Selectable());
2195ab96 629 Display (anObj, Standard_False);
2195ab96 630 }
7fd59977 631
b5cce1ab 632 if (theToUpdateViewer && !mySelection->Objects().IsEmpty())
2195ab96 633 {
634 myMainVwr->Update();
635 }
636}
7fd59977 637
2195ab96 638//=======================================================================
639//function : EraseSelected
640//purpose :
641//=======================================================================
642void AIS_InteractiveContext::EraseSelected (const Standard_Boolean theToUpdateViewer)
7fd59977 643{
b5cce1ab 644 Standard_Boolean isFound = Standard_False;
645 for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Init (mySelection->Objects()))
2195ab96 646 {
b5cce1ab 647 Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (aSelIter.Value()->Selectable());
2195ab96 648 Erase (anObj, Standard_False);
649 isFound = Standard_True;
650 }
651
652 if (isFound && theToUpdateViewer)
653 {
654 myMainVwr->Update();
7fd59977 655 }
656}
2195ab96 657
7fd59977 658//=======================================================================
2195ab96 659//function : DisplayStatus
660//purpose :
7fd59977 661//=======================================================================
2195ab96 662AIS_DisplayStatus AIS_InteractiveContext::DisplayStatus (const Handle(AIS_InteractiveObject)& theIObj) const
7fd59977 663{
2195ab96 664 if (theIObj.IsNull())
665 {
666 return AIS_DS_None;
667 }
68dcee02 668 const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
669 return aStatus != NULL ? (*aStatus)->GraphicStatus() : AIS_DS_None;
7fd59977 670}
671
7fd59977 672//=======================================================================
673//function : Remove
2195ab96 674//purpose :
7fd59977 675//=======================================================================
2195ab96 676void AIS_InteractiveContext::Remove (const Handle(AIS_InteractiveObject)& theIObj,
677 const Standard_Boolean theToUpdateViewer)
7fd59977 678{
2195ab96 679 if (theIObj.IsNull())
680 {
681 return;
7fd59977 682 }
2195ab96 683
2ec85268 684 if (theIObj->HasInteractiveContext())
685 {
686 if (theIObj->myCTXPtr != this)
687 {
9775fa61 688 throw Standard_ProgramError("AIS_InteractiveContext - object has been displayed in another context!");
2ec85268 689 }
690 theIObj->SetContext (Handle(AIS_InteractiveContext)());
691 }
2195ab96 692 ClearGlobal (theIObj, theToUpdateViewer);
7fd59977 693}
694
695//=======================================================================
696//function : RemoveAll
2195ab96 697//purpose :
7fd59977 698//=======================================================================
2195ab96 699void AIS_InteractiveContext::RemoveAll (const Standard_Boolean theToUpdateViewer)
7fd59977 700{
701 AIS_ListOfInteractive aList;
2195ab96 702 ObjectsInside (aList);
703 for (AIS_ListIteratorOfListOfInteractive aListIterator (aList); aListIterator.More(); aListIterator.Next())
704 {
705 Remove (aListIterator.Value(), Standard_False);
7fd59977 706 }
7fd59977 707
2195ab96 708 if (theToUpdateViewer)
709 {
710 myMainVwr->Update();
7fd59977 711 }
7fd59977 712}
713
7fd59977 714//=======================================================================
8e5fb5ea 715//function : HilightWithColor
716//purpose :
7fd59977 717//=======================================================================
8e5fb5ea 718void AIS_InteractiveContext::HilightWithColor(const Handle(AIS_InteractiveObject)& theObj,
f838dac4 719 const Handle(Prs3d_Drawer)& theStyle,
8e5fb5ea 720 const Standard_Boolean theIsToUpdate)
7fd59977 721{
8e5fb5ea 722 if (theObj.IsNull())
2195ab96 723 return;
7fd59977 724
2ec85268 725 setContextToObject (theObj);
68dcee02 726 if (!myObjects.IsBound (theObj))
727 return;
eb4320f2 728
68dcee02 729 const Handle(AIS_GlobalStatus)& aStatus = myObjects (theObj);
730 aStatus->SetHilightStatus (Standard_True);
8e5fb5ea 731
68dcee02 732 if (aStatus->GraphicStatus() == AIS_DS_Displayed)
eb4320f2 733 {
68dcee02 734 highlightGlobal (theObj, theStyle, aStatus->DisplayMode());
735 aStatus->SetHilightStyle (theStyle);
eb4320f2 736 }
737
8e5fb5ea 738 if (theIsToUpdate)
2195ab96 739 myMainVwr->Update();
7fd59977 740}
741
742//=======================================================================
743//function : Unhilight
744//purpose :
745//=======================================================================
7fd59977 746void AIS_InteractiveContext::Unhilight(const Handle(AIS_InteractiveObject)& anIObj, const Standard_Boolean updateviewer)
747{
748 if(anIObj.IsNull()) return;
68dcee02 749 if(!myObjects.IsBound(anIObj)) return;
7fd59977 750
68dcee02 751 const Handle(AIS_GlobalStatus)& aStatus = myObjects(anIObj);
752 aStatus->SetHilightStatus (Standard_False);
753 aStatus->SetHilightStyle (Handle(Prs3d_Drawer)());
eb4320f2 754
68dcee02 755 if (aStatus->GraphicStatus() == AIS_DS_Displayed)
eb4320f2 756 {
68dcee02 757 unhighlightGlobal (anIObj);
eb4320f2 758 }
68dcee02 759
7fd59977 760 if(updateviewer) myMainVwr->Update();
761}
762
763//=======================================================================
764//function : IsHilighted
8e5fb5ea 765//purpose : Returns true if the objects global status is set to highlighted.
7fd59977 766//=======================================================================
8e5fb5ea 767Standard_Boolean AIS_InteractiveContext::IsHilighted (const Handle(AIS_InteractiveObject)& theObj) const
7fd59977 768{
68dcee02 769 const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theObj);
770 return aStatus != NULL
771 && (*aStatus)->IsHilighted();
7fd59977 772}
773
c3282ec1 774//=======================================================================
775//function : IsHilighted
8e5fb5ea 776//purpose : Returns true if the owner is highlighted with selection style.
c3282ec1 777//=======================================================================
8e5fb5ea 778Standard_Boolean AIS_InteractiveContext::IsHilighted (const Handle(SelectMgr_EntityOwner)& theOwner) const
c3282ec1 779{
780 if (theOwner.IsNull() || !theOwner->HasSelectable())
781 return Standard_False;
782
783 const Handle(AIS_InteractiveObject) anObj =
784 Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
785
8e5fb5ea 786 if (anObj->GlobalSelOwner() == theOwner)
787 {
788 if (!myObjects.IsBound (anObj))
789 return Standard_False;
790
791 return myObjects (anObj)->IsHilighted();
792 }
793
8d2c79f4 794 const Handle(Prs3d_Drawer)& aStyle = getSelStyle (anObj, theOwner);
795 const Standard_Integer aHiMode = getHilightMode (anObj, aStyle, -1);
796 return theOwner->IsHilighted (myMainPM, aHiMode);
8e5fb5ea 797}
798
799//=======================================================================
800//function : HighlightStyle
801//purpose :
802//=======================================================================
803Standard_Boolean AIS_InteractiveContext::HighlightStyle (const Handle(AIS_InteractiveObject)& theObj,
f838dac4 804 Handle(Prs3d_Drawer)& theStyle) const
8e5fb5ea 805{
68dcee02 806 const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theObj);
807 if (aStatus != NULL
808 && (*aStatus)->IsHilighted())
8e5fb5ea 809 {
68dcee02 810 theStyle = (*aStatus)->HilightStyle();
8e5fb5ea 811 return Standard_True;
812 }
68dcee02 813
814 theStyle.Nullify();
815 return Standard_False;
8e5fb5ea 816}
c3282ec1 817
8e5fb5ea 818//=======================================================================
819//function : HighlightStyle
820//purpose :
821//=======================================================================
822Standard_Boolean AIS_InteractiveContext::HighlightStyle (const Handle(SelectMgr_EntityOwner)& theOwner,
f838dac4 823 Handle(Prs3d_Drawer)& theStyle) const
8e5fb5ea 824{
825 if (theOwner.IsNull() || !theOwner->HasSelectable())
826 return Standard_False;
827
828 if (IsHilighted (theOwner))
c3282ec1 829 {
8e5fb5ea 830 const Handle(AIS_InteractiveObject) anObj =
831 Handle(AIS_InteractiveObject)::DownCast (theOwner->Selectable());
832 if (anObj->GlobalSelOwner() == theOwner)
c3282ec1 833 {
8e5fb5ea 834 theStyle = myObjects (anObj)->HilightStyle();
c3282ec1 835 }
836 else
837 {
8e5fb5ea 838 // since part selection style is not stored in global status,
839 // check if the object has own selection style. If not, it can
840 // only be highlighted with default selection style (because
841 // sub-intensity does not modify any selection states)
f838dac4 842 theStyle = getSelStyle (anObj, theOwner);
c3282ec1 843 }
c3282ec1 844 return Standard_True;
845 }
8e5fb5ea 846 else
847 {
848 theStyle.Nullify();
849 return Standard_False;
850 }
c3282ec1 851}
7fd59977 852
853//=======================================================================
854//function : IsDisplayed
855//purpose :
856//=======================================================================
857
68dcee02 858Standard_Boolean AIS_InteractiveContext::IsDisplayed(const Handle(AIS_InteractiveObject)& theObj) const
7fd59977 859{
68dcee02 860 if(theObj.IsNull()) return Standard_False;
7fd59977 861
68dcee02 862 const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theObj);
863 return aStatus != NULL
864 && (*aStatus)->GraphicStatus() == AIS_DS_Displayed;
7fd59977 865}
7fd59977 866
867//=======================================================================
868//function : IsDisplayed
2195ab96 869//purpose :
7fd59977 870//=======================================================================
2195ab96 871Standard_Boolean AIS_InteractiveContext::IsDisplayed (const Handle(AIS_InteractiveObject)& theIObj,
872 const Standard_Integer theMode) const
7fd59977 873{
2195ab96 874 if (theIObj.IsNull())
875 {
876 return Standard_False;
877 }
878
68dcee02 879 const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
880 return aStatus != NULL
881 && (*aStatus)->GraphicStatus() == AIS_DS_Displayed
882 && (*aStatus)->DisplayMode() == theMode;
7fd59977 883}
884
7fd59977 885//=======================================================================
886//function : DisplayPriority
2195ab96 887//purpose :
7fd59977 888//=======================================================================
2195ab96 889Standard_Integer AIS_InteractiveContext::DisplayPriority (const Handle(AIS_InteractiveObject)& theIObj) const
7fd59977 890{
2195ab96 891 if (theIObj.IsNull())
892 {
893 return -1;
894 }
eb4320f2 895
68dcee02 896 const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
897 if (aStatus != NULL
898 && ((*aStatus)->GraphicStatus() == AIS_DS_Displayed
899 || (*aStatus)->GraphicStatus() == AIS_DS_Erased))
eb4320f2 900 {
2195ab96 901 Standard_Integer aDispMode = theIObj->HasDisplayMode()
902 ? theIObj->DisplayMode()
f838dac4 903 : (theIObj->AcceptDisplayMode (myDefaultDrawer->DisplayMode())
904 ? myDefaultDrawer->DisplayMode()
2195ab96 905 : 0);
906 return myMainPM->DisplayPriority (theIObj, aDispMode);
7fd59977 907 }
908 return 0;
909}
2195ab96 910
7fd59977 911//=======================================================================
912//function : SetDisplayPriority
2195ab96 913//purpose :
7fd59977 914//=======================================================================
2195ab96 915void AIS_InteractiveContext::SetDisplayPriority (const Handle(AIS_InteractiveObject)& theIObj,
916 const Standard_Integer thePriority)
7fd59977 917{
2195ab96 918 if (theIObj.IsNull())
919 {
7fd59977 920 return;
2195ab96 921 }
922
2ec85268 923 setContextToObject (theIObj);
68dcee02 924 const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
925 if (aStatus != NULL
926 && ((*aStatus)->GraphicStatus() == AIS_DS_Displayed
927 || (*aStatus)->GraphicStatus() == AIS_DS_Erased))
2195ab96 928 {
68dcee02 929 Standard_Integer aDisplayMode = theIObj->HasDisplayMode()
930 ? theIObj->DisplayMode()
931 : (theIObj->AcceptDisplayMode (myDefaultDrawer->DisplayMode())
932 ? myDefaultDrawer->DisplayMode()
933 : 0);
934 myMainPM->SetDisplayPriority (theIObj, aDisplayMode, thePriority);
eb4320f2 935 }
7fd59977 936}
937
938//=======================================================================
939//function : Redisplay
2195ab96 940//purpose :
7fd59977 941//=======================================================================
2195ab96 942void AIS_InteractiveContext::Redisplay (const Handle(AIS_InteractiveObject)& theIObj,
943 const Standard_Boolean theToUpdateViewer,
944 const Standard_Boolean theAllModes)
7fd59977 945{
2195ab96 946 RecomputePrsOnly (theIObj, theToUpdateViewer, theAllModes);
947 RecomputeSelectionOnly (theIObj);
7fd59977 948}
949
950//=======================================================================
951//function : Redisplay
2195ab96 952//purpose :
7fd59977 953//=======================================================================
2195ab96 954void AIS_InteractiveContext::Redisplay (const AIS_KindOfInteractive theKOI,
955 const Standard_Integer /*theSign*/,
956 const Standard_Boolean theToUpdateViewer)
957{
958 Standard_Boolean isRedisplayed = Standard_False;
959 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
960 {
961 Handle(AIS_InteractiveObject) anObj = anObjIter.Key();
962 if (anObj->Type() != theKOI)
963 {
964 continue;
7fd59977 965 }
2195ab96 966
967 Redisplay (anObj, Standard_False);
968 isRedisplayed = anObjIter.Value()->GraphicStatus() == AIS_DS_Displayed
969 || isRedisplayed;
7fd59977 970 }
2195ab96 971
972 if (theToUpdateViewer
973 && isRedisplayed)
eb4320f2 974 {
975 myMainVwr->Update();
7fd59977 976 }
977}
978
7fd59977 979//=======================================================================
980//function : RecomputePrsOnly
2195ab96 981//purpose :
7fd59977 982//=======================================================================
2195ab96 983void AIS_InteractiveContext::RecomputePrsOnly (const Handle(AIS_InteractiveObject)& theIObj,
984 const Standard_Boolean theToUpdateViewer,
985 const Standard_Boolean theAllModes)
7fd59977 986{
2195ab96 987 if (theIObj.IsNull())
988 {
989 return;
990 }
eb4320f2 991
226fce20 992 theIObj->SetToUpdate();
993 theIObj->UpdatePresentations (theAllModes);
2195ab96 994 if (!theToUpdateViewer)
eb4320f2 995 {
996 return;
997 }
998
68dcee02 999 const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
1000 if (aStatus != NULL
1001 && (*aStatus)->GraphicStatus() == AIS_DS_Displayed)
eb4320f2 1002 {
1003 myMainVwr->Update();
7fd59977 1004 }
1005}
1006//=======================================================================
1007//function : RecomputeSelectionOnly
1008//purpose :
1009//=======================================================================
bc677575 1010void AIS_InteractiveContext::RecomputeSelectionOnly (const Handle(AIS_InteractiveObject)& theIO)
7fd59977 1011{
bc677575 1012 if (theIO.IsNull())
1013 {
1014 return;
1015 }
7fd59977 1016
bc677575 1017 mgrSelector->RecomputeSelection (theIO);
0d969553 1018
68dcee02 1019 const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIO);
1020 if (aStatus == NULL
1021 || (*aStatus)->GraphicStatus() != AIS_DS_Displayed)
bc677575 1022 {
1023 return;
1024 }
1025
1026 TColStd_ListOfInteger aModes;
1027 ActivatedModes (theIO, aModes);
1028 TColStd_ListIteratorOfListOfInteger aModesIter (aModes);
1029 for (; aModesIter.More(); aModesIter.Next())
1030 {
68dcee02 1031 mgrSelector->Activate (theIO, aModesIter.Value());
7fd59977 1032 }
1033}
1034
1035//=======================================================================
1036//function : Update
2195ab96 1037//purpose :
7fd59977 1038//=======================================================================
f3889691 1039void AIS_InteractiveContext::Update (const Handle(AIS_InteractiveObject)& theIObj,
2195ab96 1040 const Standard_Boolean theUpdateViewer)
7fd59977 1041{
f3889691 1042 if (theIObj.IsNull())
1043 {
1044 return;
1045 }
7fd59977 1046
226fce20 1047 theIObj->UpdatePresentations();
f3889691 1048 mgrSelector->Update(theIObj);
1049
1050 if (theUpdateViewer)
1051 {
68dcee02 1052 const Handle(AIS_GlobalStatus)* aStatus = myObjects.Seek (theIObj);
1053 if (aStatus != NULL
1054 && (*aStatus)->GraphicStatus() == AIS_DS_Displayed)
f3889691 1055 {
68dcee02 1056 myMainVwr->Update();
7fd59977 1057 }
1058 }
1059}
1060
7fd59977 1061//=======================================================================
1062//function : SetLocation
2195ab96 1063//purpose :
7fd59977 1064//=======================================================================
2195ab96 1065void AIS_InteractiveContext::SetLocation (const Handle(AIS_InteractiveObject)& theIObj,
1066 const TopLoc_Location& theLoc)
7fd59977 1067{
2195ab96 1068 if (theIObj.IsNull())
1069 {
1070 return;
1071 }
7fd59977 1072
2195ab96 1073 if (theIObj->HasTransformation()
1074 && theLoc.IsIdentity())
1075 {
1076 theIObj->ResetTransformation();
1077 mgrSelector->Update (theIObj, Standard_False);
1078 return;
1079 }
1080 else if (theLoc.IsIdentity())
1081 {
7fd59977 1082 return;
1083 }
7fd59977 1084
0d969553 1085 // first reset the previous location to properly clean everything...
2195ab96 1086 if (theIObj->HasTransformation())
1087 {
1088 theIObj->ResetTransformation();
1089 }
7fd59977 1090
2195ab96 1091 theIObj->SetLocalTransformation (theLoc.Transformation());
7fd59977 1092
68dcee02 1093 mgrSelector->Update (theIObj, Standard_False);
5396886c 1094
1095 // if the object or its part is highlighted dynamically, it is necessary to apply location transformation
1096 // to its highlight structure immediately
8e5fb5ea 1097 if (!myLastPicked.IsNull() && myLastPicked->IsSameSelectable (theIObj))
5396886c 1098 {
7bbccb5f 1099 const Standard_Integer aHiMod = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
5396886c 1100 myLastPicked->UpdateHighlightTrsf (myMainVwr,
1101 myMainPM,
7bbccb5f 1102 aHiMod);
5396886c 1103 }
7fd59977 1104}
2195ab96 1105
7fd59977 1106//=======================================================================
1107//function : ResetLocation
2195ab96 1108//purpose :
7fd59977 1109//=======================================================================
2195ab96 1110void AIS_InteractiveContext::ResetLocation (const Handle(AIS_InteractiveObject)& theIObj)
7fd59977 1111{
2195ab96 1112 if (theIObj.IsNull())
1113 {
1114 return;
1115 }
7fd59977 1116
2195ab96 1117 theIObj->ResetTransformation();
1118 mgrSelector->Update (theIObj, Standard_False);
7fd59977 1119}
1120
1121//=======================================================================
1122//function : HasLocation
2195ab96 1123//purpose :
7fd59977 1124//=======================================================================
2195ab96 1125Standard_Boolean AIS_InteractiveContext::HasLocation (const Handle(AIS_InteractiveObject)& theIObj) const
7fd59977 1126{
2195ab96 1127 return !theIObj.IsNull()
1128 && theIObj->HasTransformation();
7fd59977 1129}
1130
2195ab96 1131//=======================================================================
1132//function : Location
1133//purpose :
1134//=======================================================================
1135TopLoc_Location AIS_InteractiveContext::Location (const Handle(AIS_InteractiveObject)& theIObj) const
7fd59977 1136{
2195ab96 1137 return theIObj->Transformation();
7fd59977 1138}
1139
1140//=======================================================================
1141//function : SetDeviationCoefficient
2195ab96 1142//purpose :
7fd59977 1143//=======================================================================
2195ab96 1144void AIS_InteractiveContext::SetDeviationCoefficient (const Standard_Real theCoefficient)
7fd59977 1145{
2195ab96 1146 myDefaultDrawer->SetDeviationCoefficient (theCoefficient);
7fd59977 1147}
2195ab96 1148
7fd59977 1149//=======================================================================
1150//function : SetDeviationAngle
2195ab96 1151//purpose :
7fd59977 1152//=======================================================================
2195ab96 1153void AIS_InteractiveContext::SetDeviationAngle (const Standard_Real theAngle)
7fd59977 1154{
e19792fa 1155 myDefaultDrawer->SetDeviationAngle (theAngle);
7fd59977 1156}
1157
1158//=======================================================================
1159//function : DeviationAngle
1160//purpose : Gets deviationAngle
1161//=======================================================================
7fd59977 1162Standard_Real AIS_InteractiveContext::DeviationAngle() const
1163{
2195ab96 1164 return myDefaultDrawer->DeviationAngle();
7fd59977 1165}
1166
1167//=======================================================================
1168//function : DeviationCoefficient
2195ab96 1169//purpose :
7fd59977 1170//=======================================================================
2195ab96 1171Standard_Real AIS_InteractiveContext::DeviationCoefficient() const
7fd59977 1172{
1173 return myDefaultDrawer->DeviationCoefficient();
1174}
2195ab96 1175
7fd59977 1176//=======================================================================
1177//function : SetHLRDeviationCoefficient
2195ab96 1178//purpose :
7fd59977 1179//=======================================================================
2195ab96 1180void AIS_InteractiveContext::SetHLRDeviationCoefficient (const Standard_Real theCoefficient)
7fd59977 1181{
2195ab96 1182 myDefaultDrawer->SetHLRDeviationCoefficient (theCoefficient);
7fd59977 1183}
1184
1185//=======================================================================
1186//function : HLRDeviationCoefficient
2195ab96 1187//purpose :
7fd59977 1188//=======================================================================
2195ab96 1189Standard_Real AIS_InteractiveContext::HLRDeviationCoefficient() const
7fd59977 1190{
1191 return myDefaultDrawer->HLRDeviationCoefficient();
1192}
1193
1194//=======================================================================
1195//function : SetHLRAngle
2195ab96 1196//purpose :
7fd59977 1197//=======================================================================
2195ab96 1198void AIS_InteractiveContext::SetHLRAngle (const Standard_Real theAngle)
7fd59977 1199{
2195ab96 1200 myDefaultDrawer->SetHLRAngle (theAngle);
7fd59977 1201}
1202
1203//=======================================================================
1204//function : SetHLRAngleAndDeviation
1205//purpose : compute with anangle a HLRAngle and a HLRDeviationCoefficient
1206// and set them in myHLRAngle and in myHLRDeviationCoefficient
1207// of myDefaultDrawer
1208//=======================================================================
2195ab96 1209void AIS_InteractiveContext::SetHLRAngleAndDeviation (const Standard_Real theAngle)
7fd59977 1210{
2195ab96 1211 Standard_Real anOutAngl, anOutDefl;
1212 HLRBRep::PolyHLRAngleAndDeflection (theAngle, anOutAngl, anOutDefl);
7fd59977 1213
2195ab96 1214 myDefaultDrawer->SetHLRAngle (anOutAngl);
1215 myDefaultDrawer->SetHLRDeviationCoefficient (anOutDefl);
7fd59977 1216}
1217
1218//=======================================================================
1219//function : HLRAngle
2195ab96 1220//purpose :
7fd59977 1221//=======================================================================
7fd59977 1222Standard_Real AIS_InteractiveContext::HLRAngle() const
1223{
1224 return myDefaultDrawer->HLRAngle();
1225}
1226
1227//=======================================================================
1228//function : SetDisplayMode
2195ab96 1229//purpose :
7fd59977 1230//=======================================================================
e5d7e249 1231void AIS_InteractiveContext::SetDisplayMode(const Standard_Integer theMode,
1232 const Standard_Boolean theToUpdateViewer)
7fd59977 1233{
f838dac4 1234 if (theMode == myDefaultDrawer->DisplayMode())
2195ab96 1235 {
1236 return;
1237 }
7fd59977 1238
2195ab96 1239 for (AIS_DataMapIteratorOfDataMapOfIOStatus anObjIter (myObjects); anObjIter.More(); anObjIter.Next())
1240 {
1241 Handle(AIS_InteractiveObject) anObj = anObjIter.Key();
1242 Standard_Boolean toProcess = anObj->IsKind (STANDARD_TYPE(AIS_Shape))
1243 || anObj->IsKind (STANDARD_TYPE(AIS_ConnectedInteractive))
1244 || anObj->IsKind (STANDARD_TYPE(AIS_MultipleConnectedInteractive));
7fd59977 1245
2195ab96 1246 if (!toProcess
1247 || anObj->HasDisplayMode()
1248 || !anObj->AcceptDisplayMode (theMode))
1249 {
1250 continue;
1251 }
1252
1253 Handle(AIS_GlobalStatus) aStatus = anObjIter.Value();
3db69e41 1254 aStatus->SetDisplayMode (theMode);
2195ab96 1255
2195ab96 1256 if (aStatus->GraphicStatus() == AIS_DS_Displayed)
1257 {
2195ab96 1258 myMainPM->Display (anObj, theMode);
8e5fb5ea 1259 if (!myLastPicked.IsNull() && myLastPicked->IsSameSelectable (anObj))
c3282ec1 1260 {
1261 myMainPM->BeginImmediateDraw();
f838dac4 1262 unhighlightGlobal (anObj);
c3282ec1 1263 myMainPM->EndImmediateDraw (myMainVwr);
1264 }
2195ab96 1265 if (aStatus->IsSubIntensityOn())
7fd59977 1266 {
8e5fb5ea 1267 highlightWithSubintensity (anObj, theMode);
7fd59977 1268 }
f838dac4 1269 myMainPM->SetVisibility (anObj, myDefaultDrawer->DisplayMode(), Standard_False);
2195ab96 1270 }
1271 }
1272
f838dac4 1273 myDefaultDrawer->SetDisplayMode (theMode);
2195ab96 1274 if (theToUpdateViewer)
1275 {
1276 myMainVwr->Update();
1277 }
7fd59977 1278}
1279
1280//=======================================================================
1281//function : SetDisplayMode
2195ab96 1282//purpose :
7fd59977 1283//=======================================================================
2195ab96 1284void AIS_InteractiveContext::SetDisplayMode (const Handle(AIS_InteractiveObject)& theIObj,
1285 const Standard_Integer theMode,
1286 const Standard_Boolean theToUpdateViewer)
7fd59977 1287{
2ec85268 1288 setContextToObject (theIObj);
2195ab96 1289 if (!myObjects.IsBound (theIObj))
1290 {
1291 theIObj->SetDisplayMode (theMode);
1292 return;
1293 }
1294 else if (!theIObj->AcceptDisplayMode (theMode))
1295 {
1296 return;
1297 }
eb4320f2 1298
2195ab96 1299 Handle(AIS_GlobalStatus) aStatus = myObjects (theIObj);
1300 if (aStatus->GraphicStatus() != AIS_DS_Displayed)
1301 {
b2bafb33 1302 aStatus->SetDisplayMode (theMode);
2195ab96 1303 theIObj->SetDisplayMode (theMode);
1304 return;
1305 }
a6964ce6 1306
2195ab96 1307 // erase presentations for all display modes different from <aMode>
3db69e41 1308 const Standard_Integer anOldMode = aStatus->DisplayMode();
1309 if (anOldMode != theMode)
2195ab96 1310 {
3db69e41 1311 if (myMainPM->IsHighlighted (theIObj, anOldMode))
2195ab96 1312 {
f838dac4 1313 unhighlightGlobal (theIObj);
7fd59977 1314 }
3db69e41 1315 myMainPM->SetVisibility (theIObj, anOldMode, Standard_False);
7fd59977 1316 }
2195ab96 1317
3db69e41 1318 aStatus->SetDisplayMode (theMode);
2195ab96 1319
1320 myMainPM->Display (theIObj, theMode);
2195ab96 1321 if (aStatus->IsHilighted())
1322 {
f838dac4 1323 highlightGlobal (theIObj, getSelStyle (theIObj, theIObj->GlobalSelOwner()), theMode);
2195ab96 1324 }
1325 if (aStatus->IsSubIntensityOn())
1326 {
8e5fb5ea 1327 highlightWithSubintensity (theIObj, theMode);
2195ab96 1328 }
1329
1330 if (theToUpdateViewer)
1331 {
1332 myMainVwr->Update();
1333 }
1334 theIObj->SetDisplayMode (theMode);
7fd59977 1335}
1336
1337//=======================================================================
1338//function : UnsetDisplayMode
2195ab96 1339//purpose :
7fd59977 1340//=======================================================================
2195ab96 1341void AIS_InteractiveContext::UnsetDisplayMode (const Handle(AIS_InteractiveObject)& theIObj,
1342 const Standard_Boolean theToUpdateViewer)
7fd59977 1343{
2195ab96 1344 if (theIObj.IsNull()
1345 || !theIObj->HasDisplayMode())
1346 {
1347 return;
1348 }
1349
1350 if (!myObjects.IsBound (theIObj))
1351 {
1352 theIObj->UnsetDisplayMode();
1353 return;
1354 }
1355
1356 const Standard_Integer anOldMode = theIObj->DisplayMode();
f838dac4 1357 if (myDefaultDrawer->DisplayMode() == anOldMode)
2195ab96 1358 {
1359 return;
1360 }
1361
1362 const Handle(AIS_GlobalStatus)& aStatus = myObjects (theIObj);
f838dac4 1363 aStatus->SetDisplayMode (myDefaultDrawer->DisplayMode());
2195ab96 1364
1365 if (aStatus->GraphicStatus() == AIS_DS_Displayed)
1366 {
1367 if (myMainPM->IsHighlighted (theIObj, anOldMode))
7fd59977 1368 {
f838dac4 1369 unhighlightGlobal (theIObj);
2195ab96 1370 }
1371 myMainPM->SetVisibility (theIObj, anOldMode, Standard_False);
f838dac4 1372 myMainPM->Display (theIObj, myDefaultDrawer->DisplayMode());
2195ab96 1373 if (aStatus->IsHilighted())
1374 {
8e5fb5ea 1375 highlightSelected (theIObj->GlobalSelOwner());
2195ab96 1376 }
1377 if (aStatus->IsSubIntensityOn())
1378 {
f838dac4 1379 highlightWithSubintensity (theIObj, myDefaultDrawer->DisplayMode());
7fd59977 1380 }
2195ab96 1381
1382 if (theToUpdateViewer)
1383 {
1384 myMainVwr->Update();
1385 }
1386 }
1387
1388 theIObj->UnsetDisplayMode();
7fd59977 1389}
1390
1391//=======================================================================
1392//function : SetCurrentFacingModel
2195ab96 1393//purpose :
7fd59977 1394//=======================================================================
2195ab96 1395void AIS_InteractiveContext::SetCurrentFacingModel (const Handle(AIS_InteractiveObject)& theIObj,
1396 const Aspect_TypeOfFacingModel theModel)
b8ddfc2f 1397{
2195ab96 1398 if (!theIObj.IsNull())
1399 {
1400 theIObj->SetCurrentFacingModel (theModel);
1401 }
7fd59977 1402}
7fd59977 1403
2195ab96 1404//=======================================================================
1405//function : SetColor
1406//purpose :
1407//=======================================================================
1408void AIS_InteractiveContext::SetColor (const Handle(AIS_InteractiveObject)& theIObj,
1409 const Quantity_Color& theColor,
1410 const Standard_Boolean theToUpdateViewer)
7fd59977 1411{
2195ab96 1412 if (theIObj.IsNull())
1413 {
1414 return;
1415 }
7fd59977 1416
2ec85268 1417 setContextToObject (theIObj);
2195ab96 1418 theIObj->SetColor (theColor);
226fce20 1419 theIObj->UpdatePresentations();
1420 if (theToUpdateViewer)
1421 {
1422 UpdateCurrentViewer();
1423 }
2195ab96 1424}
7fd59977 1425
5ad8c033 1426//=======================================================================
1427//function : SetIsoOnTriangulation
1428//purpose :
1429//=======================================================================
1430void AIS_InteractiveContext::IsoOnTriangulation (const Standard_Boolean theIsEnabled,
1431 const Handle(AIS_InteractiveObject)& theObject)
1432{
1433 if (theObject.IsNull())
1434 {
1435 return;
1436 }
1437
1438 theObject->SetIsoOnTriangulation (theIsEnabled);
1439}
1440
2195ab96 1441//=======================================================================
1442//function : SetDeviationCoefficient
1443//purpose :
1444//=======================================================================
1445void AIS_InteractiveContext::SetDeviationCoefficient (const Handle(AIS_InteractiveObject)& theIObj,
1446 const Standard_Real theCoefficient,
1447 const Standard_Boolean theToUpdateViewer)
1448{
1449 if (theIObj.IsNull())
1450 {
1451 return;
1452 }
7fd59977 1453
2195ab96 1454 // to be modified after the related methods of AIS_Shape are passed to InteractiveObject
2ec85268 1455 setContextToObject (theIObj);
2195ab96 1456 if (theIObj->Type() != AIS_KOI_Object
1457 && theIObj->Type() != AIS_KOI_Shape)
1458 {
1459 return;
1460 }
1461 else if (theIObj->Signature() != 0)
1462 {
1463 return;
1464 }
1465
1466 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1467 aShape->SetOwnDeviationCoefficient (theCoefficient);
226fce20 1468 aShape->UpdatePresentations();
1469 if (theToUpdateViewer)
1470 {
1471 UpdateCurrentViewer();
1472 }
7fd59977 1473}
1474
1475//=======================================================================
1476//function : SetHLRDeviationCoefficient
2195ab96 1477//purpose :
7fd59977 1478//=======================================================================
2195ab96 1479void AIS_InteractiveContext::SetHLRDeviationCoefficient (const Handle(AIS_InteractiveObject)& theIObj,
1480 const Standard_Real theCoefficient,
1481 const Standard_Boolean theToUpdateViewer)
7fd59977 1482{
2195ab96 1483 if (theIObj.IsNull())
1484 {
1485 return;
1486 }
1487
81bba717 1488 // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
2ec85268 1489 setContextToObject (theIObj);
2195ab96 1490 if (theIObj->Type() != AIS_KOI_Object
1491 && theIObj->Type() != AIS_KOI_Shape)
1492 {
1493 return;
1494 }
1495 else if (theIObj->Signature() != 0)
1496 {
1497 return;
1498 }
7fd59977 1499
2195ab96 1500 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1501 aShape->SetOwnHLRDeviationCoefficient (theCoefficient);
226fce20 1502 aShape->UpdatePresentations();
1503 if (theToUpdateViewer)
1504 {
1505 UpdateCurrentViewer();
1506 }
7fd59977 1507}
1508
7fd59977 1509//=======================================================================
1510//function : SetDeviationAngle
2195ab96 1511//purpose :
7fd59977 1512//=======================================================================
2195ab96 1513void AIS_InteractiveContext::SetDeviationAngle (const Handle(AIS_InteractiveObject)& theIObj,
1514 const Standard_Real theAngle,
1515 const Standard_Boolean theToUpdateViewer)
7fd59977 1516{
2195ab96 1517 if (theIObj.IsNull())
1518 {
1519 return;
1520 }
1521
e33e7e78 1522 // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
2ec85268 1523 setContextToObject (theIObj);
2195ab96 1524 if (theIObj->Type() != AIS_KOI_Shape)
1525 {
1526 return;
1527 }
1528 else if (theIObj->Signature() != 0)
1529 {
1530 return;
1531 }
7fd59977 1532
2195ab96 1533 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1534 aShape->SetOwnDeviationAngle (theAngle);
226fce20 1535 aShape->UpdatePresentations();
1536 if (theToUpdateViewer)
1537 {
1538 UpdateCurrentViewer();
1539 }
7fd59977 1540}
2195ab96 1541
7fd59977 1542//=======================================================================
2195ab96 1543//function : SetAngleAndDeviation
1544//purpose :
7fd59977 1545//=======================================================================
2195ab96 1546void AIS_InteractiveContext::SetAngleAndDeviation (const Handle(AIS_InteractiveObject)& theIObj,
1547 const Standard_Real theAngle,
1548 const Standard_Boolean theToUpdateViewer)
7fd59977 1549{
2195ab96 1550 if (theIObj.IsNull())
1551 {
1552 return;
1553 }
1554
e33e7e78 1555 // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
2ec85268 1556 setContextToObject (theIObj);
2195ab96 1557 if (theIObj->Type() != AIS_KOI_Shape)
1558 {
1559 return;
1560 }
1561 if (theIObj->Signature() != 0)
1562 {
1563 return;
1564 }
7fd59977 1565
2195ab96 1566 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1567 aShape->SetAngleAndDeviation (theAngle);
226fce20 1568 aShape->UpdatePresentations();
1569 if (theToUpdateViewer)
2195ab96 1570 {
226fce20 1571 UpdateCurrentViewer();
2195ab96 1572 }
7fd59977 1573}
1574
1575//=======================================================================
2195ab96 1576//function : SetHLRAngleAndDeviation
1577//purpose :
7fd59977 1578//=======================================================================
2195ab96 1579void AIS_InteractiveContext::SetHLRAngleAndDeviation (const Handle(AIS_InteractiveObject)& theIObj,
1580 const Standard_Real theAngle,
1581 const Standard_Boolean theToUpdateViewer)
7fd59977 1582{
2195ab96 1583 if (theIObj.IsNull())
1584 {
1585 return;
1586 }
7fd59977 1587
e33e7e78 1588 // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
2ec85268 1589 setContextToObject (theIObj);
2195ab96 1590 if (theIObj->Type() != AIS_KOI_Shape)
1591 {
1592 return;
1593 }
1594 if (theIObj->Signature() != 0)
1595 {
1596 return;
1597 }
1598 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1599 aShape->SetHLRAngleAndDeviation (theAngle);
226fce20 1600 aShape->UpdatePresentations();
1601 if (theToUpdateViewer)
1602 {
1603 UpdateCurrentViewer();
1604 }
7fd59977 1605}
1606
1607//=======================================================================
1608//function : SetHLRDeviationAngle
2195ab96 1609//purpose :
7fd59977 1610//=======================================================================
2195ab96 1611void AIS_InteractiveContext::SetHLRDeviationAngle (const Handle(AIS_InteractiveObject)& theIObj,
1612 const Standard_Real theAngle,
1613 const Standard_Boolean theToUpdateViewer)
7fd59977 1614{
2195ab96 1615 if (theIObj.IsNull())
1616 {
1617 return;
1618 }
7fd59977 1619
2195ab96 1620 // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
2ec85268 1621 setContextToObject (theIObj);
2195ab96 1622 if (theIObj->Type() != AIS_KOI_Shape)
1623 {
1624 return;
1625 }
1626 if (theIObj->Signature() != 0)
1627 {
1628 return;
1629 }
1630 Handle(AIS_Shape) aShape = Handle(AIS_Shape)::DownCast (theIObj);
1631 aShape->SetOwnHLRDeviationAngle (theAngle);
226fce20 1632 aShape->UpdatePresentations();
1633 if (theToUpdateViewer)
1634 {
1635 UpdateCurrentViewer();
1636 }
7fd59977 1637}
1638
1639//=======================================================================
1640//function : UnsetColor
2195ab96 1641//purpose :
7fd59977 1642//=======================================================================
2195ab96 1643void AIS_InteractiveContext::UnsetColor (const Handle(AIS_InteractiveObject)& theIObj,
1644 const Standard_Boolean theToUpdateViewer)
7fd59977 1645{
2195ab96 1646 if (theIObj.IsNull())
1647 {
1648 return;
1649 }
1650
1651 theIObj->UnsetColor();
226fce20 1652 theIObj->UpdatePresentations();
1653 if (theToUpdateViewer)
1654 {
1655 UpdateCurrentViewer();
1656 }
7fd59977 1657}
1658
1659//=======================================================================
1660//function : HasColor
2195ab96 1661//purpose :
7fd59977 1662//=======================================================================
2195ab96 1663Standard_Boolean AIS_InteractiveContext::HasColor (const Handle(AIS_InteractiveObject)& theIObj) const
7fd59977 1664{
2195ab96 1665 return theIObj->HasColor();
7fd59977 1666}
1667
2195ab96 1668//=======================================================================
1669//function : Color
1670//purpose :
1671//=======================================================================
1672void AIS_InteractiveContext::Color (const Handle(AIS_InteractiveObject)& theIObj,
1673 Quantity_Color& theColor) const
7fd59977 1674{
2195ab96 1675 theIObj->Color (theColor);
7fd59977 1676}
7fd59977 1677
1678//=======================================================================
1679//function : Width
2195ab96 1680//purpose :
7fd59977 1681//=======================================================================
2195ab96 1682Standard_Real AIS_InteractiveContext::Width (const Handle(AIS_InteractiveObject)& theIObj) const
7fd59977 1683{
2195ab96 1684 return theIObj->Width();
7fd59977 1685}
1686
1687//=======================================================================
1688//function : SetWidth
2195ab96 1689//purpose :
7fd59977 1690//=======================================================================
2195ab96 1691void AIS_InteractiveContext::SetWidth (const Handle(AIS_InteractiveObject)& theIObj,
1692 const Standard_Real theWidth,
1693 const Standard_Boolean theToUpdateViewer)
7fd59977 1694{
2195ab96 1695 if (theIObj.IsNull())
1696 {
1697 return;
1698 }
1699
2ec85268 1700 setContextToObject (theIObj);
2195ab96 1701 theIObj->SetWidth (theWidth);
226fce20 1702 theIObj->UpdatePresentations();
a9080ef9 1703 if (!myLastPicked.IsNull() && myLastPicked->IsSameSelectable (theIObj))
c3282ec1 1704 {
a9080ef9 1705 if (myLastPicked->IsAutoHilight())
c3282ec1 1706 {
f838dac4 1707 const Standard_Integer aHiMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
a9080ef9 1708 myLastPicked->HilightWithColor (myMainPM,
1709 myLastPicked->IsSelected() ? getSelStyle (theIObj, myLastPicked) : getHiStyle (theIObj, myLastPicked),
8e5fb5ea 1710 aHiMode);
c3282ec1 1711 }
1712 else
1713 {
8e5fb5ea 1714 theIObj->HilightOwnerWithColor (myMainPM,
a9080ef9 1715 myLastPicked->IsSelected() ? getSelStyle (theIObj, myLastPicked) : getHiStyle (theIObj, myLastPicked),
1716 myLastPicked);
c3282ec1 1717 }
1718 }
226fce20 1719 if (theToUpdateViewer)
1720 {
1721 UpdateCurrentViewer();
1722 }
7fd59977 1723}
1724
1725//=======================================================================
1726//function : UnsetWidth
2195ab96 1727//purpose :
7fd59977 1728//=======================================================================
2195ab96 1729void AIS_InteractiveContext::UnsetWidth (const Handle(AIS_InteractiveObject)& theIObj,
1730 const Standard_Boolean theToUpdateViewer)
7fd59977 1731{
2195ab96 1732 if (theIObj.IsNull())
1733 {
1734 return;
1735 }
1736
1737 theIObj->UnsetWidth();
226fce20 1738 theIObj->UpdatePresentations();
1739 if (theToUpdateViewer)
1740 {
1741 UpdateCurrentViewer();
1742 }
7fd59977 1743}
1744
1745//=======================================================================
1746//function : SetMaterial
2195ab96 1747//purpose :
7fd59977 1748//=======================================================================
2195ab96 1749void AIS_InteractiveContext::SetMaterial (const Handle(AIS_InteractiveObject)& theIObj,
87432b82 1750 const Graphic3d_MaterialAspect& theMaterial,
2195ab96 1751 const Standard_Boolean theToUpdateViewer)
7fd59977 1752{
2195ab96 1753 if (theIObj.IsNull())
1754 {
1755 return;
1756 }
1757
2ec85268 1758 setContextToObject (theIObj);
87432b82 1759 theIObj->SetMaterial (theMaterial);
226fce20 1760 theIObj->UpdatePresentations();
1761 if (theToUpdateViewer)
1762 {
1763 UpdateCurrentViewer();
1764 }
7fd59977 1765}
1766
1767//=======================================================================
1768//function : UnsetMaterial
2195ab96 1769//purpose :
7fd59977 1770//=======================================================================
2195ab96 1771void AIS_InteractiveContext::UnsetMaterial (const Handle(AIS_InteractiveObject)& theIObj,
1772 const Standard_Boolean theToUpdateViewer)
7fd59977 1773{
2195ab96 1774 if (theIObj.IsNull())
1775 {
1776 return;
1777 }
1778 theIObj->UnsetMaterial();
226fce20 1779 theIObj->UpdatePresentations();
1780 if (theToUpdateViewer)
1781 {
1782 UpdateCurrentViewer();
1783 }
7fd59977 1784}
1785
1786//=======================================================================
1787//function : SetTransparency
2195ab96 1788//purpose :
7fd59977 1789//=======================================================================
2195ab96 1790void AIS_InteractiveContext::SetTransparency (const Handle(AIS_InteractiveObject)& theIObj,
1791 const Standard_Real theValue,
1792 const Standard_Boolean theToUpdateViewer)
7fd59977 1793{
2195ab96 1794 if (theIObj.IsNull())
1795 {
1796 return;
1797 }
1798
2ec85268 1799 setContextToObject (theIObj);
2195ab96 1800 if (!theIObj->IsTransparent()
f838dac4 1801 && theValue <= 0.005)
a6964ce6 1802 {
1803 return;
1804 }
1805
f838dac4 1806 if (theValue <= 0.005)
2195ab96 1807 {
1808 UnsetTransparency (theIObj, theToUpdateViewer);
7fd59977 1809 return;
1810 }
a6964ce6 1811
2195ab96 1812 theIObj->SetTransparency (theValue);
226fce20 1813 theIObj->UpdatePresentations();
1814 if (theToUpdateViewer)
1815 {
1816 UpdateCurrentViewer();
1817 }
7fd59977 1818}
1819
1820//=======================================================================
1821//function : UnsetTransparency
2195ab96 1822//purpose :
7fd59977 1823//=======================================================================
2195ab96 1824void AIS_InteractiveContext::UnsetTransparency (const Handle(AIS_InteractiveObject)& theIObj,
1825 const Standard_Boolean theToUpdateViewer)
7fd59977 1826{
2195ab96 1827 if (theIObj.IsNull())
1828 {
1829 return;
1830 }
7fd59977 1831
2195ab96 1832 theIObj->UnsetTransparency();
226fce20 1833 theIObj->UpdatePresentations();
1834 if (theToUpdateViewer)
1835 {
1836 UpdateCurrentViewer();
1837 }
7fd59977 1838}
1839
2195ab96 1840//=======================================================================
1841//function : SetSelectedAspect
1842//purpose :
1843//=======================================================================
1844void AIS_InteractiveContext::SetSelectedAspect (const Handle(Prs3d_BasicAspect)& theAspect,
2195ab96 1845 const Standard_Boolean theToUpdateViewer)
1846{
2b886265 1847 Standard_DISABLE_DEPRECATION_WARNINGS
2195ab96 1848 Standard_Boolean isFound = Standard_False;
02974a19 1849 for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
2195ab96 1850 {
1851 isFound = Standard_True;
02974a19 1852 Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast (aSelIter.Value()->Selectable());
2831708b 1853 anObj->SetAspect (theAspect);
2195ab96 1854 }
2b886265 1855 Standard_ENABLE_DEPRECATION_WARNINGS
2195ab96 1856
016e5959 1857 if (isFound && theToUpdateViewer)
2195ab96 1858 {
1859 myMainVwr->Update();
7fd59977 1860 }
1861}
7fd59977 1862
1863//=======================================================================
1864//function : SetLocalAttributes
2195ab96 1865//purpose :
7fd59977 1866//=======================================================================
2195ab96 1867void AIS_InteractiveContext::SetLocalAttributes (const Handle(AIS_InteractiveObject)& theIObj,
6262338c 1868 const Handle(Prs3d_Drawer)& theDrawer,
2195ab96 1869 const Standard_Boolean theToUpdateViewer)
7fd59977 1870{
2195ab96 1871 if (theIObj.IsNull())
1872 {
1873 return;
1874 }
1875
2ec85268 1876 setContextToObject (theIObj);
2195ab96 1877 theIObj->SetAttributes (theDrawer);
1878 Update (theIObj, theToUpdateViewer);
7fd59977 1879}
1880
1881//=======================================================================
1882//function : UnsetLocalAttributes
2195ab96 1883//purpose :
7fd59977 1884//=======================================================================
2195ab96 1885void AIS_InteractiveContext::UnsetLocalAttributes (const Handle(AIS_InteractiveObject)& theIObj,
1886 const Standard_Boolean theToUpdateViewer)
7fd59977 1887{
2195ab96 1888 if (theIObj.IsNull())
1889 {
1890 return;
1891 }
7fd59977 1892
2ec85268 1893 setContextToObject (theIObj);
2195ab96 1894 theIObj->UnsetAttributes();
1895 Update (theIObj, theToUpdateViewer);
1896}
7fd59977 1897
1898//=======================================================================
1899//function : Status
2195ab96 1900//purpose :
7fd59977 1901//=======================================================================
2195ab96 1902void AIS_InteractiveContext::Status (const Handle(AIS_InteractiveObject)& theIObj,
1903 TCollection_ExtendedString& theStatus) const
7fd59977 1904{
2195ab96 1905 theStatus = "";
1906 if (theIObj.IsNull()
1907 || !myObjects.IsBound (theIObj))
1908 {
1909 return;
1910 }
7fd59977 1911
2195ab96 1912 theStatus += "\t ____________________________________________";
1913 theStatus += "\t| Known at Neutral Point:\n\tDisplayStatus:";
1914 const Handle(AIS_GlobalStatus)& aStatus = myObjects (theIObj);
1915 switch (aStatus->GraphicStatus())
1916 {
7fd59977 1917 case AIS_DS_Displayed:
2195ab96 1918 {
1919 theStatus += "\t| -->Displayed\n";
7fd59977 1920 break;
1921 }
2195ab96 1922 case AIS_DS_Erased:
1923 {
1924 theStatus += "\t| -->Erased\n";
1925 break;
7fd59977 1926 }
2195ab96 1927 default:
1928 break;
1929 }
1930
1931 theStatus += "\t| Active Display Modes in the MainViewer :\n";
3db69e41 1932 theStatus += "\t|\t Mode ";
1933 theStatus += TCollection_AsciiString (aStatus->DisplayMode());
1934 theStatus += "\n";
1935
2195ab96 1936 if (IsSelected(theIObj)) theStatus +="\t| Selected\n";
7fd59977 1937
2195ab96 1938 theStatus += "\t| Active Selection Modes in the MainViewer :\n";
1939 for (TColStd_ListIteratorOfListOfInteger aSelModeIter (aStatus->SelectionModes()); aSelModeIter.More(); aSelModeIter.Next())
1940 {
1941 theStatus += "\t\t Mode ";
1942 theStatus += TCollection_AsciiString (aSelModeIter.Value());
1943 theStatus += "\n";
1944 }
1945 theStatus += "\t ____________________________________________";
1946}
7fd59977 1947
1948//=======================================================================
1949//function : GetDefModes
2195ab96 1950//purpose :
7fd59977 1951//=======================================================================
2195ab96 1952void AIS_InteractiveContext::GetDefModes (const Handle(AIS_InteractiveObject)& theIObj,
1953 Standard_Integer& theDispMode,
1954 Standard_Integer& theHiMode,
1955 Standard_Integer& theSelMode) const
7fd59977 1956{
2195ab96 1957 if (theIObj.IsNull())
1958 {
1959 return;
1960 }
7fd59977 1961
2195ab96 1962 theDispMode = theIObj->HasDisplayMode()
1963 ? theIObj->DisplayMode()
f838dac4 1964 : (theIObj->AcceptDisplayMode (myDefaultDrawer->DisplayMode())
1965 ? myDefaultDrawer->DisplayMode()
2195ab96 1966 : 0);
1967 theHiMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : theDispMode;
c3282ec1 1968 theSelMode = theIObj->GlobalSelectionMode();
2195ab96 1969}
7fd59977 1970
1971//=======================================================================
1972//function : EraseGlobal
2195ab96 1973//purpose :
7fd59977 1974//=======================================================================
2195ab96 1975void AIS_InteractiveContext::EraseGlobal (const Handle(AIS_InteractiveObject)& theIObj,
1976 const Standard_Boolean theToUpdateviewer)
7fd59977 1977{
a9080ef9 1978 Handle(AIS_GlobalStatus) aStatus;
2195ab96 1979 if (theIObj.IsNull()
a9080ef9 1980 || !myObjects.Find (theIObj, aStatus)
1981 || aStatus->GraphicStatus() == AIS_DS_Erased)
2195ab96 1982 {
1983 return;
1984 }
7fd59977 1985
a1954302 1986 const Standard_Integer aDispMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
741c4f3e 1987 unselectOwners (theIObj);
3db69e41 1988 myMainPM->SetVisibility (theIObj, aStatus->DisplayMode(), Standard_False);
1989
4f51d9d7 1990 if (!myLastPicked.IsNull()
8e5fb5ea 1991 && myLastPicked->IsSameSelectable (theIObj))
4f51d9d7 1992 {
731c9b5b 1993 clearDynamicHighlight();
4f51d9d7 1994 }
1995
905b0e31 1996 // make sure highlighting presentations are properly erased
1997 theIObj->ErasePresentations (false);
1998
c3282ec1 1999 if (IsSelected (theIObj)
3db69e41 2000 && aStatus->DisplayMode() != aDispMode)
a1954302 2001 {
2002 myMainPM->SetVisibility (theIObj, aDispMode, Standard_False);
2003 }
2004
2005 for (TColStd_ListIteratorOfListOfInteger aSelModeIter (aStatus->SelectionModes()); aSelModeIter.More(); aSelModeIter.Next())
2006 {
68dcee02 2007 mgrSelector->Deactivate (theIObj, aSelModeIter.Value());
7fd59977 2008 }
c3282ec1 2009 aStatus->ClearSelectionModes();
2195ab96 2010 aStatus->SetGraphicStatus (AIS_DS_Erased);
a1954302 2011
2012 if (theToUpdateviewer)
2013 {
2014 myMainVwr->Update();
2015 }
7fd59977 2016}
2017
c3282ec1 2018//=======================================================================
741c4f3e 2019//function : unselectOwners
c3282ec1 2020//purpose :
2021//=======================================================================
741c4f3e 2022void AIS_InteractiveContext::unselectOwners (const Handle(AIS_InteractiveObject)& theObject)
c3282ec1 2023{
02974a19 2024 SelectMgr_SequenceOfOwner aSeq;
2025 for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
c3282ec1 2026 {
a3d4053c 2027 if (aSelIter.Value()->IsSameSelectable (theObject))
c3282ec1 2028 {
02974a19 2029 aSeq.Append (aSelIter.Value());
c3282ec1 2030 }
02974a19 2031 }
2032 for (SelectMgr_SequenceOfOwner::Iterator aDelIter (aSeq); aDelIter.More(); aDelIter.Next())
2033 {
2034 AddOrRemoveSelected (aDelIter.Value(), Standard_False);
c3282ec1 2035 }
2036}
2037
7fd59977 2038//=======================================================================
2039//function : ClearGlobal
2195ab96 2040//purpose :
7fd59977 2041//=======================================================================
2195ab96 2042void AIS_InteractiveContext::ClearGlobal (const Handle(AIS_InteractiveObject)& theIObj,
2043 const Standard_Boolean theToUpdateviewer)
7fd59977 2044{
a9080ef9 2045 Handle(AIS_GlobalStatus) aStatus;
2195ab96 2046 if (theIObj.IsNull()
a9080ef9 2047 || !myObjects.Find (theIObj, aStatus))
2195ab96 2048 {
f751596e 2049 // for cases when reference shape of connected interactives was not displayed
2050 // but its selection primitives were calculated
543a9964 2051 const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
2052 mgrSelector->Remove (anObj);
2195ab96 2053 return;
2054 }
2055
741c4f3e 2056 unselectOwners (theIObj);
7fd59977 2057
e2d7642f 2058 myMainPM->Erase (theIObj, -1);
905b0e31 2059 theIObj->ErasePresentations (true); // make sure highlighting presentations are properly erased
4f51d9d7 2060
2195ab96 2061 // Object removes from Detected sequence
404c8936 2062 Standard_DISABLE_DEPRECATION_WARNINGS
f2a88e54 2063 for (Standard_Integer aDetIter = myDetectedSeq.Lower(); aDetIter <= myDetectedSeq.Upper();)
7fd59977 2064 {
f2a88e54 2065 Handle(SelectMgr_EntityOwner) aPicked = myMainSel->Picked (myDetectedSeq (aDetIter));
2066 Handle(AIS_InteractiveObject) anObj;
2067 if (!aPicked.IsNull())
2068 {
2069 anObj = Handle(AIS_InteractiveObject)::DownCast (aPicked->Selectable());
2070 }
2071
2195ab96 2072 if (!anObj.IsNull()
f2a88e54 2073 && anObj == theIObj)
2195ab96 2074 {
f0cddd16 2075 myDetectedSeq.Remove (aDetIter);
f2a88e54 2076 if (myCurDetected == aDetIter)
2077 {
2078 myCurDetected = Min (myDetectedSeq.Upper(), aDetIter);
2079 }
2080 if (myCurHighlighted == aDetIter)
2081 {
2082 myCurHighlighted = 0;
2083 }
2084 }
2085 else
2086 {
2087 aDetIter++;
2195ab96 2088 }
7fd59977 2089 }
404c8936 2090 Standard_ENABLE_DEPRECATION_WARNINGS
7fd59977 2091
2195ab96 2092 // remove IO from the selection manager to avoid memory leaks
543a9964 2093 const Handle(SelectMgr_SelectableObject)& anObj = theIObj; // to avoid ambiguity
2094 mgrSelector->Remove (anObj);
7fd59977 2095
13c556d9 2096 setObjectStatus (theIObj, AIS_DS_None, -1, -1);
c357e426 2097 myMainVwr->StructureManager()->UnregisterObject (theIObj);
6a24c6de 2098
2099 for (V3d_ListOfViewIterator aDefViewIter (myMainVwr->DefinedViewIterator()); aDefViewIter.More(); aDefViewIter.Next())
a272ed94 2100 {
6a24c6de 2101 aDefViewIter.Value()->View()->ChangeHiddenObjects()->Remove (theIObj.get());
a272ed94 2102 }
7fd59977 2103
a9080ef9 2104 if (!myLastPicked.IsNull())
1beb58d7 2105 {
a9080ef9 2106 if (myLastPicked->IsSameSelectable (theIObj))
1beb58d7 2107 {
731c9b5b 2108 clearDynamicHighlight();
f2a88e54 2109 myLastPicked.Nullify();
1beb58d7 2110 }
2111 }
c3282ec1 2112
2113 if (theToUpdateviewer && aStatus->GraphicStatus() == AIS_DS_Displayed)
eb4320f2 2114 {
2115 myMainVwr->Update();
2116 }
7fd59977 2117}
2118
2119//=======================================================================
2120//function : ClearGlobalPrs
2195ab96 2121//purpose :
7fd59977 2122//=======================================================================
2195ab96 2123void AIS_InteractiveContext::ClearGlobalPrs (const Handle(AIS_InteractiveObject)& theIObj,
2124 const Standard_Integer theMode,
2125 const Standard_Boolean theToUpdateViewer)
7fd59977 2126{
2195ab96 2127 if (theIObj.IsNull()
2128 || !myObjects.IsBound (theIObj))
2129 {
2130 return;
2131 }
2132
2133 const Handle(AIS_GlobalStatus)& aStatus = myObjects (theIObj);
3db69e41 2134 if (aStatus->DisplayMode() == theMode)
2195ab96 2135 {
2136 const Standard_Integer aDispMode = theIObj->HasHilightMode() ? theIObj->HilightMode() : 0;
2137 if (aDispMode == theMode
2138 && myMainPM->IsHighlighted (theIObj, theMode))
2139 {
f838dac4 2140 unhighlightGlobal (theIObj);
2195ab96 2141 }
2142
2143 myMainPM->Erase (theIObj, theMode);
7fd59977 2144 }
eb4320f2 2145
2195ab96 2146 if (aStatus->GraphicStatus() == AIS_DS_Displayed
2147 && theToUpdateViewer)
2148 {
7fd59977 2149 myMainVwr->Update();
2195ab96 2150 }
7fd59977 2151}
2152
8a590580 2153//=======================================================================
2154//function : ClearDetected
2155//purpose :
2156//=======================================================================
2157Standard_Boolean AIS_InteractiveContext::ClearDetected (Standard_Boolean theToRedrawImmediate)
2158{
2159 myCurDetected = 0;
2160 myCurHighlighted = 0;
2161 myDetectedSeq.Clear();
8a590580 2162 Standard_Boolean toUpdate = Standard_False;
2163 if (!myLastPicked.IsNull() && myLastPicked->HasSelectable())
2164 {
2165 toUpdate = Standard_True;
2166 clearDynamicHighlight();
2167 }
8a590580 2168 myLastPicked.Nullify();
2169 myMainSel->ClearPicked();
2170 if (toUpdate && theToRedrawImmediate)
2171 {
2172 myMainVwr->RedrawImmediate();
2173 }
2174 return toUpdate;
2175}
2176
7fd59977 2177//=======================================================================
2178//function : DrawHiddenLine
2195ab96 2179//purpose :
7fd59977 2180//=======================================================================
2195ab96 2181Standard_Boolean AIS_InteractiveContext::DrawHiddenLine() const
2182{
7fd59977 2183 return myDefaultDrawer->DrawHiddenLine();
2184}
2185
2186//=======================================================================
2187//function : EnableDrawHiddenLine
2195ab96 2188//purpose :
7fd59977 2189//=======================================================================
2195ab96 2190void AIS_InteractiveContext::EnableDrawHiddenLine() const
2191{
7fd59977 2192 myDefaultDrawer->EnableDrawHiddenLine();
2193}
2194
2195//=======================================================================
2196//function : DisableDrawHiddenLine
2195ab96 2197//purpose :
7fd59977 2198//=======================================================================
2195ab96 2199void AIS_InteractiveContext::DisableDrawHiddenLine() const
2200{
7fd59977 2201 myDefaultDrawer->DisableDrawHiddenLine();
2202}
2203
2204//=======================================================================
2205//function : HiddenLineAspect
2195ab96 2206//purpose :
7fd59977 2207//=======================================================================
2195ab96 2208Handle (Prs3d_LineAspect) AIS_InteractiveContext::HiddenLineAspect() const
2209{
7fd59977 2210 return myDefaultDrawer->HiddenLineAspect();
2211}
2212
2213//=======================================================================
2214//function : SetHiddenLineAspect
2195ab96 2215//purpose :
7fd59977 2216//=======================================================================
2195ab96 2217void AIS_InteractiveContext::SetHiddenLineAspect (const Handle(Prs3d_LineAspect)& theAspect) const
2218{
2219 myDefaultDrawer->SetHiddenLineAspect (theAspect);
7fd59977 2220}
2221
2222//=======================================================================
2223//function : SetIsoNumber
2195ab96 2224//purpose :
7fd59977 2225//=======================================================================
2195ab96 2226void AIS_InteractiveContext::SetIsoNumber (const Standard_Integer theNb,
2227 const AIS_TypeOfIso theType)
7fd59977 2228{
2195ab96 2229 switch (theType)
2230 {
2231 case AIS_TOI_IsoU:
2232 myDefaultDrawer->UIsoAspect()->SetNumber (theNb);
2233 break;
2234 case AIS_TOI_IsoV:
2235 myDefaultDrawer->VIsoAspect()->SetNumber (theNb);
2236 break;
2237 case AIS_TOI_Both:
2238 myDefaultDrawer->UIsoAspect()->SetNumber (theNb);
2239 myDefaultDrawer->VIsoAspect()->SetNumber (theNb);
2240 break;
7fd59977 2241 }
2242}
2195ab96 2243
7fd59977 2244//=======================================================================
2245//function : IsoNumber
2195ab96 2246//purpose :
7fd59977 2247//=======================================================================
2195ab96 2248Standard_Integer AIS_InteractiveContext::IsoNumber (const AIS_TypeOfIso theType)
7fd59977 2249{
2195ab96 2250 switch (theType)
2251 {
2252 case AIS_TOI_IsoU: return myDefaultDrawer->UIsoAspect()->Number();
2253 case AIS_TOI_IsoV: return myDefaultDrawer->VIsoAspect()->Number();
2254 case AIS_TOI_Both: return myDefaultDrawer->UIsoAspect()->Number() == myDefaultDrawer->VIsoAspect()->Number()
2255 ? myDefaultDrawer->UIsoAspect()->Number()
2256 : -1;
7fd59977 2257 }
2258 return 0;
2259}
2260
2261//=======================================================================
2262//function : IsoOnPlane
2195ab96 2263//purpose :
7fd59977 2264//=======================================================================
2195ab96 2265void AIS_InteractiveContext::IsoOnPlane (const Standard_Boolean theToSwitchOn)
7fd59977 2266{
2195ab96 2267 myDefaultDrawer->SetIsoOnPlane (theToSwitchOn);
7fd59977 2268}
2269
2270//=======================================================================
2271//function : IsoOnPlane
2195ab96 2272//purpose :
7fd59977 2273//=======================================================================
2195ab96 2274Standard_Boolean AIS_InteractiveContext::IsoOnPlane() const
7fd59977 2275{
2276 return myDefaultDrawer->IsoOnPlane();
2277}
2278
3c982548 2279//=======================================================================
5ad8c033 2280//function : IsoOnTriangulation
2281//purpose :
2282//=======================================================================
2283void AIS_InteractiveContext::IsoOnTriangulation (const Standard_Boolean theToSwitchOn)
2284{
2285 myDefaultDrawer->SetIsoOnTriangulation (theToSwitchOn);
2286}
2287
2288//=======================================================================
2289//function : IsoOnTriangulation
2290//purpose :
2291//=======================================================================
2292Standard_Boolean AIS_InteractiveContext::IsoOnTriangulation() const
2293{
2294 return myDefaultDrawer->IsoOnTriangulation();
2295}
2296
51004f1c 2297//=======================================================================
3c982548 2298//function : SetPixelTolerance
51004f1c 2299//purpose :
3c982548 2300//=======================================================================
3bf9a45f 2301void AIS_InteractiveContext::SetPixelTolerance (const Standard_Integer thePrecision)
2195ab96 2302{
68dcee02 2303 myMainSel->SetPixelTolerance (thePrecision);
7fd59977 2304}
3c982548 2305
2306//=======================================================================
2307//function : PixelTolerance
2195ab96 2308//purpose :
3c982548 2309//=======================================================================
3bf9a45f 2310Standard_Integer AIS_InteractiveContext::PixelTolerance() const
2195ab96 2311{
68dcee02 2312 return myMainSel->PixelTolerance();
3c982548 2313}
7fd59977 2314
8a1170ad 2315//=======================================================================
2316//function : SetSelectionSensitivity
2317//purpose : Allows to manage sensitivity of a particular selection of interactive object theObject
2318//=======================================================================
2319void AIS_InteractiveContext::SetSelectionSensitivity (const Handle(AIS_InteractiveObject)& theObject,
2320 const Standard_Integer theMode,
2321 const Standard_Integer theNewSensitivity)
2322{
8a1170ad 2323 mgrSelector->SetSelectionSensitivity (theObject, theMode, theNewSensitivity);
2324}
2325
7fd59977 2326//=======================================================================
2327//function : InitAttributes
2195ab96 2328//purpose :
7fd59977 2329//=======================================================================
7fd59977 2330void AIS_InteractiveContext::InitAttributes()
2331{
2195ab96 2332 Graphic3d_MaterialAspect aMat (Graphic3d_NOM_BRASS);
2333 myDefaultDrawer->ShadingAspect()->SetMaterial (aMat);
7fd59977 2334
2335// myDefaultDrawer->ShadingAspect()->SetColor(Quantity_NOC_GRAY70);
2195ab96 2336 Handle(Prs3d_LineAspect) aLineAspect = myDefaultDrawer->HiddenLineAspect();
2337 aLineAspect->SetColor (Quantity_NOC_GRAY20);
2338 aLineAspect->SetWidth (1.0);
2339 aLineAspect->SetTypeOfLine (Aspect_TOL_DASH);
7fd59977 2340
28ee613b 2341 // tolerance to 2 pixels...
3bf9a45f 2342 SetPixelTolerance (2);
7fd59977 2343
2344 // Customizing the drawer for trihedrons and planes...
2195ab96 2345 Handle(Prs3d_DatumAspect) aTrihAspect = myDefaultDrawer->DatumAspect();
2346 const Standard_Real aLength = 100.0;
2347 aTrihAspect->SetAxisLength (aLength, aLength, aLength);
87432b82 2348 const Quantity_Color aColor = Quantity_NOC_LIGHTSTEELBLUE4;
bc001a40 2349 aTrihAspect->LineAspect(Prs3d_DP_XAxis)->SetColor (aColor);
2350 aTrihAspect->LineAspect(Prs3d_DP_YAxis)->SetColor (aColor);
2351 aTrihAspect->LineAspect(Prs3d_DP_ZAxis)->SetColor (aColor);
7fd59977 2352
2195ab96 2353 Handle(Prs3d_PlaneAspect) aPlaneAspect = myDefaultDrawer->PlaneAspect();
2354 const Standard_Real aPlaneLength = 200.0;
2355 aPlaneAspect->SetPlaneLength (aPlaneLength, aPlaneLength);
2356 aPlaneAspect->EdgesAspect()->SetColor (Quantity_NOC_SKYBLUE);
7fd59977 2357}
2358
7fd59977 2359//=======================================================================
2360//function : TrihedronSize
2195ab96 2361//purpose :
7fd59977 2362//=======================================================================
2363Standard_Real AIS_InteractiveContext::TrihedronSize() const
2364{
bc001a40 2365 return myDefaultDrawer->DatumAspect()->AxisLength(Prs3d_DP_XAxis);
7fd59977 2366}
2195ab96 2367
7fd59977 2368//=======================================================================
2369//function : SetTrihedronSize
2195ab96 2370//purpose :
7fd59977 2371//=======================================================================
2195ab96 2372void AIS_InteractiveContext::SetTrihedronSize (const Standard_Real theVal,
2373 const Standard_Boolean /*updateviewer*/)
7fd59977 2374{
2195ab96 2375 myDefaultDrawer->DatumAspect()->SetAxisLength (theVal, theVal, theVal);
2376 Redisplay (AIS_KOI_Datum, 3, Standard_False);
2377 Redisplay (AIS_KOI_Datum, 4, Standard_True);
7fd59977 2378}
2379
7fd59977 2380//=======================================================================
2381//function : SetPlaneSize
2195ab96 2382//purpose :
7fd59977 2383//=======================================================================
2195ab96 2384void AIS_InteractiveContext::SetPlaneSize(const Standard_Real theValX,
2385 const Standard_Real theValY,
0577ae8c 2386 const Standard_Boolean theToUpdateViewer)
7fd59977 2387{
2195ab96 2388 myDefaultDrawer->PlaneAspect()->SetPlaneLength (theValX, theValY);
0577ae8c 2389 Redisplay (AIS_KOI_Datum, 7, theToUpdateViewer);
7fd59977 2390}
2391
2392//=======================================================================
2393//function : SetPlaneSize
2195ab96 2394//purpose :
7fd59977 2395//=======================================================================
2195ab96 2396void AIS_InteractiveContext::SetPlaneSize (const Standard_Real theVal,
2397 const Standard_Boolean theToUpdateViewer)
7fd59977 2398{
2195ab96 2399 SetPlaneSize (theVal, theVal, theToUpdateViewer);
7fd59977 2400}
2401
2402//=======================================================================
2403//function : PlaneSize
2195ab96 2404//purpose :
7fd59977 2405//=======================================================================
2195ab96 2406Standard_Boolean AIS_InteractiveContext::PlaneSize (Standard_Real& theX,
2407 Standard_Real& theY) const
7fd59977 2408{
2195ab96 2409 theX = myDefaultDrawer->PlaneAspect()->PlaneXLength();
2410 theY = myDefaultDrawer->PlaneAspect()->PlaneYLength();
2411 return (Abs (theX - theY) <= Precision::Confusion());
7fd59977 2412}
2413
59f45b7c 2414//=======================================================================
2415//function : SetZLayer
2195ab96 2416//purpose :
59f45b7c 2417//=======================================================================
59f45b7c 2418void AIS_InteractiveContext::SetZLayer (const Handle(AIS_InteractiveObject)& theIObj,
8f138407 2419 const Graphic3d_ZLayerId theLayerId)
59f45b7c 2420{
2195ab96 2421 if (theIObj.IsNull())
59f45b7c 2422 return;
2423
a1954302 2424 theIObj->SetZLayer (theLayerId);
59f45b7c 2425}
2426
2427//=======================================================================
2428//function : GetZLayer
2195ab96 2429//purpose :
59f45b7c 2430//=======================================================================
8f138407 2431Graphic3d_ZLayerId AIS_InteractiveContext::GetZLayer (const Handle(AIS_InteractiveObject)& theIObj) const
59f45b7c 2432{
a1954302 2433 return !theIObj.IsNull()
2434 ? theIObj->ZLayer()
2435 : Graphic3d_ZLayerId_UNKNOWN;
59f45b7c 2436}
f751596e 2437
2438//=======================================================================
2439//function : RebuildSelectionStructs
2440//purpose : Rebuilds 1st level of BVH selection forcibly
2441//=======================================================================
2442void AIS_InteractiveContext::RebuildSelectionStructs()
2443{
2444 myMainSel->RebuildObjectsTree (Standard_True);
2445}
2446
2447//=======================================================================
2448//function : Disconnect
2449//purpose : Disconnects selectable object from an assembly and updates selection structures
2450//=======================================================================
2451void AIS_InteractiveContext::Disconnect (const Handle(AIS_InteractiveObject)& theAssembly,
2452 const Handle(AIS_InteractiveObject)& theObjToDisconnect)
2453{
2454 if (theAssembly->IsInstance ("AIS_MultipleConnectedInteractive"))
2455 {
c5f3a425 2456 Handle(AIS_MultipleConnectedInteractive) theObj (Handle(AIS_MultipleConnectedInteractive)::DownCast (theAssembly));
f751596e 2457 theObj->Disconnect (theObjToDisconnect);
7dd7c146 2458 if (!myObjects.IsBound (theObjToDisconnect))
2459 {
2460 // connected presentation might contain displayed presentations
2461 myMainPM->Erase (theObjToDisconnect, -1);
2462 theObjToDisconnect->ErasePresentations (true);
2463 }
2464
543a9964 2465 const Handle(SelectMgr_SelectableObject)& anObj = theObjToDisconnect; // to avoid ambiguity
2466 mgrSelector->Remove (anObj);
f751596e 2467 }
c04c30b3 2468 else if (theAssembly->IsInstance ("AIS_ConnectedInteractive") && theObjToDisconnect.IsNull())
f751596e 2469 {
c5f3a425 2470 Handle(AIS_ConnectedInteractive) theObj (Handle(AIS_ConnectedInteractive)::DownCast (theAssembly));
f751596e 2471 theObj->Disconnect();
543a9964 2472 const Handle(SelectMgr_SelectableObject)& anObj = theObj; // to avoid ambiguity
2473 mgrSelector->Remove (anObj);
f751596e 2474 }
2475 else
2476 return;
2477}
b586500b 2478
0577ae8c 2479//=======================================================================
2480//function : FitSelected
2481//purpose : Fits the view corresponding to the bounds of selected objects
2482//=======================================================================
2483void AIS_InteractiveContext::FitSelected (const Handle(V3d_View)& theView)
2484{
2485 FitSelected (theView, 0.01, Standard_True);
2486}
2487
b586500b 2488//=======================================================================
2108d9a2 2489//function : BoundingBoxOfSelection
2490//purpose :
b586500b 2491//=======================================================================
2108d9a2 2492Bnd_Box AIS_InteractiveContext::BoundingBoxOfSelection() const
b586500b 2493{
b586500b 2494 Bnd_Box aBndSelected;
b586500b 2495 AIS_MapOfObjectOwners anObjectOwnerMap;
68dcee02 2496 for (AIS_NListOfEntityOwner::Iterator aSelIter (mySelection->Objects()); aSelIter.More(); aSelIter.Next())
b586500b 2497 {
b5cce1ab 2498 const Handle(SelectMgr_EntityOwner)& anOwner = aSelIter.Value();
02974a19 2499 Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast(anOwner->Selectable());
2500 if (anObj->IsInfinite())
b586500b 2501 {
02974a19 2502 continue;
2503 }
b586500b 2504
02974a19 2505 if (anOwner == anObj->GlobalSelOwner())
2506 {
b586500b 2507 Bnd_Box aTmpBnd;
2508 anObj->BoundingBox (aTmpBnd);
2509 aBndSelected.Add (aTmpBnd);
2510 }
2511 else
2512 {
b586500b 2513 Handle(SelectMgr_IndexedMapOfOwner) anOwnerMap;
2514 if (!anObjectOwnerMap.Find (anOwner->Selectable(), anOwnerMap))
2515 {
2516 anOwnerMap = new SelectMgr_IndexedMapOfOwner();
2517 anObjectOwnerMap.Bind (anOwner->Selectable(), anOwnerMap);
2518 }
2519
2520 anOwnerMap->Add (anOwner);
2521 }
2522 }
2523
2524 for (AIS_MapIteratorOfMapOfObjectOwners anIter (anObjectOwnerMap); anIter.More(); anIter.Next())
2525 {
2526 const Handle(SelectMgr_SelectableObject) anObject = anIter.Key();
2527 Bnd_Box aTmpBox = anObject->BndBoxOfSelected (anIter.ChangeValue());
2528 aBndSelected.Add (aTmpBox);
2529 }
2530
2108d9a2 2531 return aBndSelected;
2532}
b586500b 2533
2108d9a2 2534//=======================================================================
2535//function : FitSelected
2536//purpose : Fits the view corresponding to the bounds of selected objects
2537//=======================================================================
2538void AIS_InteractiveContext::FitSelected (const Handle(V3d_View)& theView,
2539 const Standard_Real theMargin,
2540 const Standard_Boolean theToUpdate)
2541{
2542 Bnd_Box aBndSelected = BoundingBoxOfSelection();
2543 if (!aBndSelected.IsVoid())
2544 {
2545 theView->FitAll (aBndSelected, theMargin, theToUpdate);
2546 }
b586500b 2547}
1d92133e 2548
2549//=======================================================================
2550//function : SetTransformPersistence
2551//purpose :
2552//=======================================================================
2553void AIS_InteractiveContext::SetTransformPersistence (const Handle(AIS_InteractiveObject)& theObject,
778cd667 2554 const Handle(Graphic3d_TransformPers)& theTrsfPers)
1d92133e 2555{
778cd667 2556 theObject->SetTransformPersistence (theTrsfPers);
1d92133e 2557 if (!myObjects.IsBound (theObject))
2558 {
2559 return;
2560 }
2561
2562 mgrSelector->UpdateSelection (theObject);
2563
2564 const Standard_Integer aLayerId = myObjects.Find (theObject)->GetLayerIndex();
2565 const Handle(V3d_Viewer)& aCurViewer = CurrentViewer();
6a24c6de 2566 for (V3d_ListOfViewIterator anActiveViewIter (aCurViewer->ActiveViewIterator()); anActiveViewIter.More(); anActiveViewIter.Next())
1d92133e 2567 {
6a24c6de 2568 anActiveViewIter.Value()->View()->InvalidateBVHData (aLayerId);
2569 anActiveViewIter.Value()->View()->InvalidateZLayerBoundingBox (aLayerId);
1d92133e 2570 }
2571}
49582f9d 2572
2573//=======================================================================
2574//function : GravityPoint
2575//purpose :
2576//=======================================================================
2577gp_Pnt AIS_InteractiveContext::GravityPoint (const Handle(V3d_View)& theView) const
2578{
2579 return theView->GravityPoint();
2580}
13c556d9 2581//=======================================================================
2582//function : setObjectStatus
2583//purpose :
2584//=======================================================================
2585void AIS_InteractiveContext::setObjectStatus (const Handle(AIS_InteractiveObject)& theIObj,
2586 const AIS_DisplayStatus theStatus,
2587 const Standard_Integer theDispMode,
2588 const Standard_Integer theSelectionMode)
2589{
2590 if (theStatus != AIS_DS_None)
2591 {
2592 Handle(AIS_GlobalStatus) aStatus = new AIS_GlobalStatus (AIS_DS_Displayed, theDispMode, theSelectionMode);
2593 myObjects.Bind (theIObj, aStatus);
2594 }
2595 else
2596 myObjects.UnBind (theIObj);
2597
2598 for (PrsMgr_ListOfPresentableObjectsIter aPrsIter (theIObj->Children()); aPrsIter.More(); aPrsIter.Next())
2599 {
2600 Handle(AIS_InteractiveObject) aChild (Handle(AIS_InteractiveObject)::DownCast (aPrsIter.Value()));
2601 if (aChild.IsNull())
2602 continue;
2603
2604 setObjectStatus (aChild, theStatus, theDispMode, theSelectionMode);
2605 }
2606}