0022048: Visualization, AIS_InteractiveContext - single object selection should alway...
[occt.git] / src / TPrsStd / TPrsStd_AISPresentation.cxx
CommitLineData
b311480e 1// Created on: 1998-09-30
2// Created by: Sergey RUIN
3// Copyright (c) 1998-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 8// This library is free software; you can redistribute it and/or modify it under
9// the terms of the GNU Lesser General Public License version 2.1 as published
973c2be1 10// by the Free Software Foundation, with special exception defined in the file
11// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12// distribution for complete text of the license and disclaimer of any warranty.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
7fd59977 16
7fd59977 17
42cf5bc1 18#include <AIS_InteractiveContext.hxx>
19#include <AIS_InteractiveObject.hxx>
20#include <Standard_GUID.hxx>
f47afe53 21#include <Standard_NullObject.hxx>
22#include <Standard_NoMoreObject.hxx>
42cf5bc1 23#include <TCollection_ExtendedString.hxx>
24#include <TDF_Attribute.hxx>
25#include <TDF_AttributeDelta.hxx>
7fd59977 26#include <TDF_DefaultDeltaOnModification.hxx>
42cf5bc1 27#include <TDF_DefaultDeltaOnRemoval.hxx>
7fd59977 28#include <TDF_DeltaOnAddition.hxx>
42cf5bc1 29#include <TDF_Label.hxx>
30#include <TDF_RelocationTable.hxx>
7fd59977 31#include <TDF_Tool.hxx>
42cf5bc1 32#include <TPrsStd_AISPresentation.hxx>
c3282ec1 33#include <TColStd_ListOfInteger.hxx>
34#include <TColStd_ListIteratorOfListOfInteger.hxx>
f47afe53 35#include <TDataXtd_Presentation.hxx>
7fd59977 36#include <TPrsStd_AISViewer.hxx>
7fd59977 37#include <TPrsStd_Driver.hxx>
38#include <TPrsStd_DriverTable.hxx>
39
92efcf78 40IMPLEMENT_STANDARD_RTTIEXT(TPrsStd_AISPresentation,TDF_Attribute)
41
f47afe53 42#define NO_MORE_OBJECT "TPrsStd_AISPresentation has no associated TDataXtd_PresentationData"
43
7fd59977 44//=======================================================================
f47afe53 45//function : TPrsStd_AISPresentation
46//purpose : Constructor
7fd59977 47//=======================================================================
f47afe53 48TPrsStd_AISPresentation::TPrsStd_AISPresentation ()
49{
7fd59977 50}
51
52
53//=======================================================================
f47afe53 54//function : Set
7fd59977 55//purpose :
56//=======================================================================
f47afe53 57Handle(TPrsStd_AISPresentation) TPrsStd_AISPresentation::Set
58 ( const TDF_Label& theLabel, const Standard_GUID& theDriver )
59{
60 Handle(TPrsStd_AISPresentation) aPresentation;
61 // create associated data (unless already there)
62 Handle(TDataXtd_Presentation) aData = TDataXtd_Presentation::Set (theLabel, theDriver);
63 if(aData.IsNull())
9775fa61 64 throw Standard_NoMoreObject(NO_MORE_OBJECT);
f47afe53 65 if ( !theLabel.FindAttribute(TPrsStd_AISPresentation::GetID(), aPresentation) )
66 {
67 aPresentation = new TPrsStd_AISPresentation();
0f3d1d7c 68 theLabel.AddAttribute(aPresentation, Standard_True);
7fd59977 69 }
7fd59977 70
f47afe53 71 return aPresentation;
72}
7fd59977 73
74//=======================================================================
75//function : Set
76//purpose :
77//=======================================================================
f47afe53 78Handle(TPrsStd_AISPresentation) TPrsStd_AISPresentation::Set(const Handle(TDF_Attribute)& theMaster)
79{
c4a2f61e 80 return TPrsStd_AISPresentation::Set(theMaster->Label(), theMaster->ID());
7fd59977 81}
82
f47afe53 83//=======================================================================
84//function : Unset
85//purpose :
86//=======================================================================
87void TPrsStd_AISPresentation::Unset (const TDF_Label& theLabel)
88{
89 Handle(TPrsStd_AISPresentation) aPresentation;
90 if ( theLabel.FindAttribute(TPrsStd_AISPresentation::GetID(), aPresentation) )
91 theLabel.ForgetAttribute(aPresentation);
7fd59977 92
f47afe53 93 // remove associated data
94 TDataXtd_Presentation::Unset (theLabel);
95}
7fd59977 96
97//=======================================================================
f47afe53 98//function : getData
7fd59977 99//purpose :
100//=======================================================================
f47afe53 101Handle(TDataXtd_Presentation) TPrsStd_AISPresentation::getData () const
7fd59977 102{
f47afe53 103 Handle(TDataXtd_Presentation) aData;
c4a2f61e 104 if (!Label().FindAttribute(TDataXtd_Presentation::GetID(), aData))
9775fa61 105 throw Standard_NoMoreObject(NO_MORE_OBJECT);
f47afe53 106 return aData;
7fd59977 107}
108
7fd59977 109//=======================================================================
f47afe53 110//function : GetID
7fd59977 111//purpose :
112//=======================================================================
f47afe53 113const Standard_GUID& TPrsStd_AISPresentation::GetID()
114{
115 static Standard_GUID TPrsStd_AISPresentationID("3680ac6c-47ae-4366-bb94-26abb6e07341");
116 return TPrsStd_AISPresentationID;
117}
7fd59977 118
7fd59977 119//=======================================================================
120//function : Display
121//purpose :
122//=======================================================================
f47afe53 123void TPrsStd_AISPresentation::Display(const Standard_Boolean theIsUpdate)
7fd59977 124{
f47afe53 125 if ( theIsUpdate || myAIS.IsNull() )
7fd59977 126 AISUpdate();
f47afe53 127
128 AISDisplay();
7fd59977 129}
130
7fd59977 131//=======================================================================
132//function : Erase
133//purpose :
134//=======================================================================
f47afe53 135void TPrsStd_AISPresentation::Erase(const Standard_Boolean theIsRemove)
136{
137 if ( IsDisplayed() )
138 {
139 AISErase(theIsRemove);
f47afe53 140 }
7fd59977 141}
142
143//=======================================================================
144//function : Update
145//purpose :
146//=======================================================================
f47afe53 147void TPrsStd_AISPresentation::Update()
148{
7fd59977 149 AISUpdate();
150}
151
7fd59977 152//=======================================================================
153//function : IsDisplayed
154//purpose :
155//=======================================================================
f47afe53 156Standard_Boolean TPrsStd_AISPresentation::IsDisplayed() const
7fd59977 157{
c4a2f61e 158 return getData()->IsDisplayed();
7fd59977 159}
160
7fd59977 161//=======================================================================
f47afe53 162//function : SetDisplayed
7fd59977 163//purpose :
164//=======================================================================
f47afe53 165void TPrsStd_AISPresentation::SetDisplayed(const Standard_Boolean theIsDisplayed)
7fd59977 166{
f47afe53 167 // this method can be called by AISUpdate() in the process of removal,
168 // while data attribute may be already removed
c4a2f61e 169 Backup();
170 getData()->SetDisplayed(theIsDisplayed);
f47afe53 171}
7fd59977 172
f47afe53 173//=======================================================================
174//function :SetDriverGUID
175//purpose :
176//=======================================================================
177void TPrsStd_AISPresentation::SetDriverGUID(const Standard_GUID& theGUID)
178{
c4a2f61e 179 Backup();
180 getData()->SetDriverGUID (theGUID);
7fd59977 181}
182
7fd59977 183//=======================================================================
184//function :GetDriverGUID
185//purpose :
186//=======================================================================
187Standard_GUID TPrsStd_AISPresentation::GetDriverGUID() const
188{
c4a2f61e 189 return getData()->GetDriverGUID();
7fd59977 190}
191
7fd59977 192//=======================================================================
193//function :Material
194//purpose :
195//=======================================================================
196Graphic3d_NameOfMaterial TPrsStd_AISPresentation::Material() const
197{
c4a2f61e 198 return (Graphic3d_NameOfMaterial)getData()->MaterialIndex();
7fd59977 199}
200
201//=======================================================================
202//function :HasMaterial
203//purpose :
204//=======================================================================
205Standard_Boolean TPrsStd_AISPresentation::HasOwnMaterial() const
206{
c4a2f61e 207 return getData()->HasOwnMaterial();
7fd59977 208}
209
210//=======================================================================
f47afe53 211//function : UnsetMaterial
7fd59977 212//purpose :
213//=======================================================================
214void TPrsStd_AISPresentation::UnsetMaterial()
215{
c4a2f61e 216 if ( !getData()->HasOwnMaterial() && !myAIS.IsNull() && !myAIS->HasMaterial() )
f47afe53 217 return;
218
c4a2f61e 219 getData()->UnsetMaterial();
f47afe53 220
221 if ( myAIS.IsNull() )
222 AISUpdate();
223
224 if ( !myAIS.IsNull() && myAIS->HasMaterial() )
225 {
226 Handle(AIS_InteractiveContext) aContext = getAISContext();
227
228 if ( !aContext.IsNull() )
229 aContext->UnsetMaterial(myAIS, Standard_False);
230 else
7fd59977 231 myAIS->UnsetMaterial();
232 }
233}
234
f47afe53 235
7fd59977 236//=======================================================================
f47afe53 237//function : SetMaterial
7fd59977 238//purpose :
239//=======================================================================
f47afe53 240void TPrsStd_AISPresentation::SetMaterial(const Graphic3d_NameOfMaterial theName)
c4a2f61e 241{
242 Backup();
243 if ( getData()->HasOwnMode() && getData()->MaterialIndex() == theName )
f47afe53 244 if ( !myAIS.IsNull() && myAIS->HasMaterial() && myAIS->Material() == theName )
245 return;
246
c4a2f61e 247 getData()->SetMaterialIndex(theName);
f47afe53 248
249 if ( myAIS.IsNull() )
250 AISUpdate();
251
252 if ( !myAIS.IsNull() )
253 {
254 if ( myAIS->HasMaterial() && myAIS->Material() == theName )
255 return; // AIS has already had that material
256
257 Handle(AIS_InteractiveContext) aContext = getAISContext();
258
259 if ( !aContext.IsNull() )
260 aContext->SetMaterial(myAIS, theName, Standard_False);
261 else
262 myAIS->SetMaterial(theName);
7fd59977 263 }
264}
265
7fd59977 266//=======================================================================
f47afe53 267//function :Transparency
7fd59977 268//purpose :
269//=======================================================================
f47afe53 270Standard_Real TPrsStd_AISPresentation::Transparency() const
7fd59977 271{
c4a2f61e 272 return getData()->Transparency();
7fd59977 273}
274
7fd59977 275//=======================================================================
f47afe53 276//function :SetTransparency
7fd59977 277//purpose :
278//=======================================================================
f47afe53 279void TPrsStd_AISPresentation::SetTransparency(const Standard_Real theValue)
7fd59977 280{
c4a2f61e 281 Backup();
282 if (getData()->HasOwnTransparency() && getData()->Transparency() == theValue)
f47afe53 283 if ( !myAIS.IsNull() && myAIS->Transparency() == theValue )
284 return;
285
c4a2f61e 286 getData()->SetTransparency(theValue);
f47afe53 287
288 if ( myAIS.IsNull() )
289 AISUpdate();
290
291 if ( !myAIS.IsNull() )
292 {
293 if ( myAIS->Transparency() == theValue )
294 return; // AIS has already had that transparency
295
296 Handle(AIS_InteractiveContext) aContext = getAISContext();
297
298 if ( !aContext.IsNull() )
299 aContext->SetTransparency(myAIS, theValue, Standard_False);
300 else
301 myAIS->SetTransparency(theValue);
302 }
7fd59977 303}
304
305//=======================================================================
306//function :UnsetTransparency
307//purpose :
308//=======================================================================
309void TPrsStd_AISPresentation::UnsetTransparency()
310{
c4a2f61e 311 if (!getData()->HasOwnTransparency())
7fd59977 312 return;
313
c4a2f61e 314 getData()->UnsetTransparency();
f47afe53 315
316 if ( myAIS.IsNull() )
317 AISUpdate();
318
319 if ( !myAIS.IsNull() )
320 {
321 Handle(AIS_InteractiveContext) aContext = getAISContext();
322
323 if( !aContext.IsNull() )
324 aContext->UnsetTransparency(myAIS, Standard_False);
325 else
7fd59977 326 myAIS->UnsetTransparency();
327 }
328}
329
330//=======================================================================
f47afe53 331//function : HasTransparency
7fd59977 332//purpose :
333//=======================================================================
334Standard_Boolean TPrsStd_AISPresentation::HasOwnTransparency() const
335{
c4a2f61e 336 return getData()->HasOwnTransparency();
7fd59977 337}
338
339//=======================================================================
f47afe53 340//function : Color
7fd59977 341//purpose :
342//=======================================================================
343Quantity_NameOfColor TPrsStd_AISPresentation::Color() const
344{
c4a2f61e 345 return getData()->Color();
7fd59977 346}
347
348//=======================================================================
f47afe53 349//function : HasOwnColor
7fd59977 350//purpose :
351//=======================================================================
352Standard_Boolean TPrsStd_AISPresentation::HasOwnColor() const
353{
c4a2f61e 354 return getData()->HasOwnColor();
7fd59977 355}
356
357//=======================================================================
f47afe53 358//function : UnsetColor
7fd59977 359//purpose :
360//=======================================================================
361void TPrsStd_AISPresentation::UnsetColor()
362{
c4a2f61e 363 if (!getData()->HasOwnColor() && ! myAIS.IsNull() && !myAIS->HasColor())
f47afe53 364 return;
c4a2f61e 365 getData()->UnsetColor();
f47afe53 366
367 if ( myAIS.IsNull() )
368 AISUpdate();
369
370 if ( !myAIS.IsNull() && myAIS->HasColor() )
371 {
372 Handle(AIS_InteractiveContext) aContext = getAISContext();
373
374 if ( !aContext.IsNull() )
375 aContext->UnsetColor(myAIS, Standard_False);
376 else
7fd59977 377 myAIS->UnsetColor();
378 }
379}
380
381//=======================================================================
f47afe53 382//function : SetColor
7fd59977 383//purpose :
384//=======================================================================
f47afe53 385void TPrsStd_AISPresentation::SetColor(const Quantity_NameOfColor theColor)
7fd59977 386{
c4a2f61e 387 Backup();
388 if ( getData()->HasOwnColor() && getData()->Color() == theColor )
87432b82 389 {
390 if (!myAIS.IsNull() && myAIS->HasColor())
391 {
392 Quantity_Color aColor;
393 myAIS->Color (aColor);
394 if (aColor.Name() == theColor)
395 {
396 return;
397 }
398 }
399 }
f47afe53 400
c4a2f61e 401 getData()->SetColor(theColor);
f47afe53 402
403 if ( myAIS.IsNull() )
404 AISUpdate();
405
406 if ( !myAIS.IsNull() )
407 {
87432b82 408 if (myAIS->HasColor())
409 {
410 Quantity_Color aColor;
411 myAIS->Color (aColor);
412 if (aColor.Name() == theColor)
413 {
414 return; // AIS has already had that color
415 }
416 }
f47afe53 417
418 Handle(AIS_InteractiveContext) aContext = getAISContext();
419
420 if( !aContext.IsNull() )
421 aContext->SetColor(myAIS, theColor, Standard_False);
7fd59977 422 else
f47afe53 423 myAIS->SetColor(theColor);
7fd59977 424 }
425}
426
7fd59977 427//=======================================================================
428//function :Width
429//purpose :
430//=======================================================================
431Standard_Real TPrsStd_AISPresentation::Width() const
432{
c4a2f61e 433 return getData()->Width();
7fd59977 434}
435
436//=======================================================================
f47afe53 437//function : HasWidth
7fd59977 438//purpose :
439//=======================================================================
440Standard_Boolean TPrsStd_AISPresentation::HasOwnWidth() const
441{
c4a2f61e 442 return getData()->HasOwnWidth();
7fd59977 443}
444
445//=======================================================================
f47afe53 446//function : SetWidth
7fd59977 447//purpose :
448//=======================================================================
f47afe53 449void TPrsStd_AISPresentation::SetWidth(const Standard_Real theWidth)
7fd59977 450{
c4a2f61e 451 Backup();
452 if ( getData()->HasOwnWidth() && getData()->Width() == theWidth )
f47afe53 453 if ( !myAIS.IsNull() && myAIS->HasWidth() && myAIS->Width() == theWidth )
7fd59977 454 return;
455
c4a2f61e 456 getData()->SetWidth(theWidth);
f47afe53 457
458 if( !myAIS.IsNull() )
459 {
460 if ( myAIS->HasWidth() && myAIS->Width() == theWidth )
461 return; // AIS has already had that width
462
463 Handle(AIS_InteractiveContext) aContext = getAISContext();
464
465 if( !aContext.IsNull() )
466 aContext->SetWidth(myAIS, theWidth, Standard_False);
7fd59977 467 else
f47afe53 468 myAIS->SetWidth(theWidth);
7fd59977 469 }
470}
471
472//=======================================================================
f47afe53 473//function : UnsetWidth
7fd59977 474//purpose :
475//=======================================================================
476void TPrsStd_AISPresentation::UnsetWidth()
477{
c4a2f61e 478 if ( !getData()->HasOwnWidth() )
f47afe53 479 if ( !myAIS.IsNull() && !myAIS->HasWidth() )
7fd59977 480 return;
481
c4a2f61e 482 getData()->UnsetWidth();
f47afe53 483
484 if( myAIS.IsNull() )
485 AISUpdate();
486
487 if ( !myAIS.IsNull() && myAIS->HasWidth() )
488 {
489 Handle(AIS_InteractiveContext) aContext = getAISContext();
490
491 if ( !aContext.IsNull() )
492 aContext->UnsetWidth(myAIS, Standard_False);
493 else
7fd59977 494 myAIS->UnsetWidth();
495 }
496}
497
7fd59977 498//=======================================================================
499//function : Mode
500//purpose :
501//=======================================================================
7fd59977 502Standard_Integer TPrsStd_AISPresentation::Mode() const
503{
c4a2f61e 504 return getData()->Mode();
7fd59977 505}
506
507//=======================================================================
f47afe53 508//function : HasOwnMode
7fd59977 509//purpose :
510//=======================================================================
511Standard_Boolean TPrsStd_AISPresentation::HasOwnMode() const
512{
c4a2f61e 513 return getData()->HasOwnMode();
7fd59977 514}
515
516//=======================================================================
f47afe53 517//function : SetMode
7fd59977 518//purpose :
519//=======================================================================
f47afe53 520void TPrsStd_AISPresentation::SetMode(const Standard_Integer theMode)
7fd59977 521{
c4a2f61e 522 Backup();
523 if ( getData()->HasOwnMode() && getData()->Mode() == theMode )
f47afe53 524 if ( !myAIS.IsNull() && myAIS->DisplayMode() == theMode )
7fd59977 525 return;
526
c4a2f61e 527 getData()->SetMode(theMode);
f47afe53 528
529 if ( myAIS.IsNull() )
530 AISUpdate();
531
532 if ( !myAIS.IsNull() )
533 {
534 if ( myAIS->DisplayMode() == theMode )
535 return; // AIS has already had that mode
536
537 Handle(AIS_InteractiveContext) aContext = getAISContext();
538
539 if( !aContext.IsNull() )
540 aContext->SetDisplayMode(myAIS, theMode, Standard_False);
7fd59977 541 else
542 myAIS->SetDisplayMode(theMode);
543 }
544}
545
546//=======================================================================
f47afe53 547//function : UnsetMode
7fd59977 548//purpose :
549//=======================================================================
550void TPrsStd_AISPresentation::UnsetMode()
551{
c4a2f61e 552 if ( !getData()->HasOwnMode() )
f47afe53 553 if ( !myAIS.IsNull() && !myAIS->HasDisplayMode() )
7fd59977 554 return;
555
c4a2f61e 556 getData()->UnsetMode();
f47afe53 557
558 if ( myAIS.IsNull() )
559 AISUpdate();
560
561 if( !myAIS.IsNull() && myAIS->HasDisplayMode() )
562 {
563 Handle(AIS_InteractiveContext) aContext = getAISContext();
564
565 if ( !aContext.IsNull() )
566 aContext->UnsetDisplayMode(myAIS, Standard_False);
567 else
568 myAIS->UnsetDisplayMode();
7fd59977 569 }
570}
571
7fd59977 572//=======================================================================
573//function : SelectionMode
574//purpose :
575//=======================================================================
7fd59977 576Standard_Integer TPrsStd_AISPresentation::SelectionMode() const
577{
c4a2f61e 578 return getData()->SelectionMode();
7fd59977 579}
580
581//=======================================================================
f47afe53 582//function : HasOwnSelectionMode
7fd59977 583//purpose :
584//=======================================================================
585Standard_Boolean TPrsStd_AISPresentation::HasOwnSelectionMode() const
586{
c4a2f61e 587 return getData()->HasOwnSelectionMode();
7fd59977 588}
589
590//=======================================================================
f47afe53 591//function : SetSelectionMode
7fd59977 592//purpose :
593//=======================================================================
f47afe53 594void TPrsStd_AISPresentation::SetSelectionMode(const Standard_Integer theSelectionMode)
7fd59977 595{
c4a2f61e 596 Backup();
597 getData()->SetSelectionMode (theSelectionMode);
f47afe53 598 AISUpdate();
7fd59977 599}
600
601//=======================================================================
f47afe53 602//function : UnsetSelectionMode
7fd59977 603//purpose :
604//=======================================================================
605void TPrsStd_AISPresentation::UnsetSelectionMode()
606{
c4a2f61e 607 getData()->UnsetSelectionMode ();
f47afe53 608 AISUpdate();
7fd59977 609}
7fd59977 610
611//=======================================================================
612//function : ID
613//purpose :
614//=======================================================================
f47afe53 615const Standard_GUID& TPrsStd_AISPresentation::ID() const
616{
617 return GetID();
618}
7fd59977 619
620//=======================================================================
621//function : BackupCopy
622//purpose :
623//=======================================================================
624Handle(TDF_Attribute) TPrsStd_AISPresentation::BackupCopy() const
625{
f47afe53 626 return new TPrsStd_AISPresentation;
7fd59977 627}
628
629
630//=======================================================================
631//function : NewEmpty
632//purpose :
633//=======================================================================
634Handle(TDF_Attribute) TPrsStd_AISPresentation::NewEmpty() const
635{
f47afe53 636 return new TPrsStd_AISPresentation();
7fd59977 637}
638
639//=======================================================================
f47afe53 640//function : Paste
7fd59977 641//purpose :
642//=======================================================================
f47afe53 643void TPrsStd_AISPresentation::Restore(const Handle(TDF_Attribute)& /*theWith*/)
644{
7fd59977 645 myAIS.Nullify();
7fd59977 646}
647
648//=======================================================================
649//function : Paste
650//purpose :
651//=======================================================================
f47afe53 652void TPrsStd_AISPresentation::Paste (const Handle(TDF_Attribute)& theInto,
653 const Handle(TDF_RelocationTable)& ) const
654{
655 Handle(TPrsStd_AISPresentation) anInto =
656 Handle(TPrsStd_AISPresentation)::DownCast(theInto);
7fd59977 657
f47afe53 658 anInto->Backup();
b66f3758 659 if (!anInto->myAIS.IsNull())
660 {
661 // Save displayed flag.
662 Standard_Boolean displayed = anInto->IsDisplayed();
663 // Erase the interactive object.
664 anInto->AISErase(Standard_True);
665 // Restore the displayed flag.
666 if (displayed)
667 anInto->SetDisplayed(displayed);
668 }
669 // Nullify the interactive object.
670 // It will be restored on the next call to AISUpdate().
f47afe53 671 anInto->myAIS.Nullify();
7fd59977 672}
673
674//=======================================================================
675//function : AfterAddition
676//purpose : erase if displayed
677//=======================================================================
678void TPrsStd_AISPresentation::AfterAddition()
f47afe53 679{
7fd59977 680 AfterResume();
681}
682
683//=======================================================================
684//function : BeforeRemoval
685//purpose : erase if displayed
686//=======================================================================
687void TPrsStd_AISPresentation::BeforeRemoval()
f47afe53 688{
689 BeforeForget();
7fd59977 690}
691
692//=======================================================================
693//function : BeforeForget
694//purpose : erase if displayed
695//=======================================================================
696void TPrsStd_AISPresentation::BeforeForget()
697{
f47afe53 698 if ( !myAIS.IsNull() )
699 { // Remove AISObject from context.
700 AISErase(Standard_True);
7fd59977 701 myAIS.Nullify();
702 }
703}
704
7fd59977 705//=======================================================================
706//function : AfterResume
707//purpose : display if displayed
708//=======================================================================
f47afe53 709void TPrsStd_AISPresentation::AfterResume()
7fd59977 710{
711 AISUpdate();
f47afe53 712 if ( IsDisplayed() )
713 AISDisplay();
714 else
715 AISErase();
7fd59977 716}
717
718//=======================================================================
719//function : BeforeUndo
720//purpose : le NamedShape associe doit etre present
721//=======================================================================
7fd59977 722Standard_Boolean TPrsStd_AISPresentation::BeforeUndo (const Handle(TDF_AttributeDelta)& AD,
c4a2f61e 723 const Standard_Boolean )
7fd59977 724{
725 Handle(TPrsStd_AISPresentation) P;
f47afe53 726 AD->Label().FindAttribute(TPrsStd_AISPresentation::GetID(), P);
7fd59977 727
f47afe53 728 if (AD->IsKind(STANDARD_TYPE(TDF_DeltaOnAddition)))
729 {
730 if ( !P.IsNull() )
731 P->BeforeForget();
7fd59977 732 }
733 else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnRemoval))) {
f47afe53 734 }
735 else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnModification)))
736 {
737 if ( !P.IsNull() )
738 P->BeforeForget();
739 }
7fd59977 740
741 return Standard_True;
742}
743
7fd59977 744//=======================================================================
745//function : AfterUndo
746//purpose : le NamedShape associe doit etre present
747//=======================================================================
7fd59977 748Standard_Boolean TPrsStd_AISPresentation::AfterUndo (const Handle(TDF_AttributeDelta)& AD,
f47afe53 749 const Standard_Boolean )
7fd59977 750{
751 Handle(TPrsStd_AISPresentation) P;
752 AD->Label().FindAttribute(TPrsStd_AISPresentation::GetID(), P);
753
f47afe53 754 if (AD->IsKind(STANDARD_TYPE(TDF_DeltaOnAddition)))
755 {}
756 else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnRemoval)))
757 {
758 if ( !P.IsNull() )
759 P->AfterAddition();
7fd59977 760 }
f47afe53 761 else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnModification)))
762 {
763 if ( !P.IsNull() )
764 P->AfterResume();
7fd59977 765 }
766
767 return Standard_True;
768}
769
7fd59977 770//=======================================================================
771//function : AISUpdate
772//purpose :
773//=======================================================================
f47afe53 774void TPrsStd_AISPresentation::AISUpdate()
775{
7fd59977 776 Backup();
c4a2f61e 777 getData()->Backup();
f47afe53 778 Handle(AIS_InteractiveContext) aContext;
779 if ( !Label().IsNull() )
780 {
781 aContext = getAISContext();
782
783 Handle(TPrsStd_Driver) aDriver;
784 if ( TPrsStd_DriverTable::Get()->FindDriver(GetDriverGUID(), aDriver) )
785 {
786 // Build a new AIS.
787 if ( myAIS.IsNull() )
788 {
789 Handle(AIS_InteractiveObject) aNewObj;
790 if ( aDriver->Update(Label(), aNewObj) )
791 {
792 myAIS = aNewObj;
f47afe53 793 aNewObj->SetOwner(this);
794 }
7fd59977 795 }
f47afe53 796 else
797 {
798 Handle(AIS_InteractiveObject) anObj = myAIS;
799 if ( aDriver->Update(Label(), anObj) )
800 if ( !(anObj == myAIS) )
801 {
802 if ( !aContext.IsNull() )
0577ae8c 803 aContext->Remove (myAIS, Standard_True);
f47afe53 804
805 // Driver has built new AIS.
806 myAIS = anObj;
f47afe53 807 anObj->SetOwner(this);
808 }
7fd59977 809 }
810 }
811 }
812 else return;
813
f47afe53 814 // Apply the visualization settings.
815 if ( !myAIS.IsNull() )
816 {
817 if ( HasOwnColor() )
818 {
819 Quantity_NameOfColor aColor = Color();
87432b82 820 Quantity_Color aPrsColor;
821 myAIS->Color (aPrsColor);
822 if ( !(myAIS->HasColor()) || (myAIS->HasColor() && aPrsColor.Name() != aColor) )
f47afe53 823 {
824 if ( !aContext.IsNull() )
825 aContext->SetColor(myAIS, aColor, Standard_False);
826 else
827 myAIS->SetColor(aColor);
7fd59977 828 }
f47afe53 829 }
7fd59977 830
f47afe53 831 if ( HasOwnMaterial() )
832 {
833 Graphic3d_NameOfMaterial aMaterial = Material();
834 if ( !(myAIS->HasMaterial()) || (myAIS->HasMaterial() && myAIS->Material() != aMaterial) )
835 {
836 if ( !aContext.IsNull() )
837 aContext->SetMaterial(myAIS, aMaterial, Standard_False );
838 else
839 myAIS->SetMaterial(aMaterial);
7fd59977 840 }
f47afe53 841 }
842
843 if ( HasOwnTransparency() )
844 {
845 const Standard_Real aTransparency = Transparency();
846 if ( myAIS->Transparency() != aTransparency )
847 {
848 if( !aContext.IsNull() )
849 aContext->SetTransparency(myAIS, aTransparency, Standard_False);
850 else
851 myAIS->SetTransparency(aTransparency);
7fd59977 852 }
853 }
854
f47afe53 855 if ( HasOwnWidth() )
856 {
857 const Standard_Real aWidth = Width();
858 if ( !(myAIS->HasWidth()) || (myAIS->HasWidth() && myAIS->Width() != aWidth) )
859 {
860 if ( !aContext.IsNull() )
861 aContext->SetWidth(myAIS, aWidth, Standard_False);
862 else
863 myAIS->SetWidth(aWidth);
7fd59977 864 }
865 }
866
f47afe53 867 if ( HasOwnMode() )
868 {
869 const Standard_Integer aMode = Mode();
870 if ( myAIS->DisplayMode() != aMode )
871 myAIS->SetDisplayMode(aMode);
7fd59977 872 }
873
f47afe53 874 if ( !aContext.IsNull() && IsDisplayed() )
875 aContext->Redisplay(myAIS, Standard_False);
876
877 if (HasOwnSelectionMode()) {
c3282ec1 878 if (!aContext.IsNull())
879 {
880 TColStd_ListOfInteger anActivatedModes;
881 aContext->ActivatedModes (myAIS, anActivatedModes);
882 Standard_Boolean isActivated = Standard_False;
f47afe53 883 Standard_Integer aSelectionMode = SelectionMode();
c4a2f61e 884 if (aSelectionMode == -1)
c3282ec1 885 {
c4a2f61e 886 aContext->Deactivate(myAIS);
887 }
888 else
889 {
890 for (TColStd_ListIteratorOfListOfInteger aModeIter (anActivatedModes); aModeIter.More(); aModeIter.Next())
c3282ec1 891 {
c4a2f61e 892 if (aModeIter.Value() == aSelectionMode)
893 {
894 isActivated = Standard_True;
895 break;
896 }
c3282ec1 897 }
c4a2f61e 898 if (!isActivated)
899 aContext->Activate (myAIS, aSelectionMode, Standard_False);
c3282ec1 900 }
7fd59977 901 }
902 }
7fd59977 903
904 }
905
f47afe53 906 if (IsDisplayed() && !aContext.IsNull())
907 aContext->Redisplay(myAIS, Standard_False);
7fd59977 908}
909
910//=======================================================================
911//function : AISDisplay
912//purpose :
913//=======================================================================
f47afe53 914void TPrsStd_AISPresentation::AISDisplay()
915{
916 if ( !Label().IsNull() )
917 {
918 Handle(AIS_InteractiveContext) aContext = getAISContext();
7fd59977 919
f47afe53 920 if ( aContext.IsNull() )
921 return;
922
923 if ( !myAIS.IsNull() )
924 {
925 if ( !(myAIS->GetContext()).IsNull() && (myAIS->GetContext()) != aContext )
0577ae8c 926 myAIS->GetContext()->Remove (myAIS, Standard_False);
7fd59977 927
f47afe53 928 if ( IsDisplayed() && aContext->IsDisplayed(myAIS) )
929 return;
7fd59977 930
f47afe53 931 aContext->Display(myAIS, Standard_False);
7fd59977 932
f47afe53 933 if ( aContext->IsDisplayed(myAIS) )
934 SetDisplayed(Standard_True);
7fd59977 935 }
936 }
937}
938
7fd59977 939//=======================================================================
940//function : AISErase
941//purpose :
942//=======================================================================
f47afe53 943void TPrsStd_AISPresentation::AISErase(const Standard_Boolean theIsRemove)
944{
945 Handle(AIS_InteractiveContext) aContext, anOwnContext;
946
947 if ( !myAIS.IsNull() )
948 {
949 Backup();
f47afe53 950 if ( !Label().IsNull() )
951 {
c4a2f61e 952 if (IsAttribute(TDataXtd_Presentation::GetID()))
953 SetDisplayed(Standard_False);
954
f47afe53 955 Handle(TPrsStd_AISViewer) viewer;
956 if( !TPrsStd_AISViewer::Find(Label(), viewer) )
957 return;
958 anOwnContext = myAIS->GetContext();
959 aContext = viewer->GetInteractiveContext();
7fd59977 960
f47afe53 961 if ( theIsRemove )
962 {
963 if ( !aContext.IsNull() )
964 aContext->Remove(myAIS, Standard_False);
965 if ( !anOwnContext.IsNull() && anOwnContext != aContext )
966 anOwnContext->Remove(myAIS, Standard_False);
7fd59977 967
7fd59977 968 myAIS->SetToUpdate();
969 }
f47afe53 970 else
971 {
972 if ( !aContext.IsNull() )
973 aContext->Erase(myAIS, Standard_False);
974 if ( !anOwnContext.IsNull() && anOwnContext != aContext )
975 anOwnContext->Erase(myAIS, Standard_False);
7fd59977 976 }
977 }
f47afe53 978 else
979 {
980 if ( theIsRemove )
981 {
982 if ( !anOwnContext.IsNull() )
983 {
984 anOwnContext->Remove(myAIS, Standard_False);
985 myAIS->SetToUpdate();
986 }
7fd59977 987 }
f47afe53 988 else
989 if( !anOwnContext.IsNull() )
990 anOwnContext->Erase(myAIS, Standard_False);
7fd59977 991 }
992 }
993}
994
7fd59977 995//=======================================================================
996//function :GetAIS
997//purpose :
998//=======================================================================
999Handle(AIS_InteractiveObject) TPrsStd_AISPresentation::GetAIS() const
1000{
1001 return myAIS;
1002}
1003
7fd59977 1004//=======================================================================
f47afe53 1005//function : getAISContext
7fd59977 1006//purpose :
1007//=======================================================================
f47afe53 1008Handle(AIS_InteractiveContext) TPrsStd_AISPresentation::getAISContext() const
7fd59977 1009{
f47afe53 1010 Handle(TPrsStd_AISViewer) aViewer;
1011 if ( TPrsStd_AISViewer::Find(Label(), aViewer) )
1012 return aViewer->GetInteractiveContext();
7fd59977 1013
f47afe53 1014 return Handle_AIS_InteractiveContext();
1015}