0028463: OCAF loses an interactive object after copying
[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();
f47afe53 68 theLabel.AddAttribute(aPresentation);
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 )
f47afe53 389 if ( !myAIS.IsNull() && myAIS->HasColor() && myAIS->Color() == theColor )
7fd59977 390 return;
f47afe53 391
c4a2f61e 392 getData()->SetColor(theColor);
f47afe53 393
394 if ( myAIS.IsNull() )
395 AISUpdate();
396
397 if ( !myAIS.IsNull() )
398 {
399 if ( myAIS->HasColor() && myAIS->Color() == theColor )
400 return; // AIS has already had that color
401
402 Handle(AIS_InteractiveContext) aContext = getAISContext();
403
404 if( !aContext.IsNull() )
405 aContext->SetColor(myAIS, theColor, Standard_False);
7fd59977 406 else
f47afe53 407 myAIS->SetColor(theColor);
7fd59977 408 }
409}
410
7fd59977 411//=======================================================================
412//function :Width
413//purpose :
414//=======================================================================
415Standard_Real TPrsStd_AISPresentation::Width() const
416{
c4a2f61e 417 return getData()->Width();
7fd59977 418}
419
420//=======================================================================
f47afe53 421//function : HasWidth
7fd59977 422//purpose :
423//=======================================================================
424Standard_Boolean TPrsStd_AISPresentation::HasOwnWidth() const
425{
c4a2f61e 426 return getData()->HasOwnWidth();
7fd59977 427}
428
429//=======================================================================
f47afe53 430//function : SetWidth
7fd59977 431//purpose :
432//=======================================================================
f47afe53 433void TPrsStd_AISPresentation::SetWidth(const Standard_Real theWidth)
7fd59977 434{
c4a2f61e 435 Backup();
436 if ( getData()->HasOwnWidth() && getData()->Width() == theWidth )
f47afe53 437 if ( !myAIS.IsNull() && myAIS->HasWidth() && myAIS->Width() == theWidth )
7fd59977 438 return;
439
c4a2f61e 440 getData()->SetWidth(theWidth);
f47afe53 441
442 if( !myAIS.IsNull() )
443 {
444 if ( myAIS->HasWidth() && myAIS->Width() == theWidth )
445 return; // AIS has already had that width
446
447 Handle(AIS_InteractiveContext) aContext = getAISContext();
448
449 if( !aContext.IsNull() )
450 aContext->SetWidth(myAIS, theWidth, Standard_False);
7fd59977 451 else
f47afe53 452 myAIS->SetWidth(theWidth);
7fd59977 453 }
454}
455
456//=======================================================================
f47afe53 457//function : UnsetWidth
7fd59977 458//purpose :
459//=======================================================================
460void TPrsStd_AISPresentation::UnsetWidth()
461{
c4a2f61e 462 if ( !getData()->HasOwnWidth() )
f47afe53 463 if ( !myAIS.IsNull() && !myAIS->HasWidth() )
7fd59977 464 return;
465
c4a2f61e 466 getData()->UnsetWidth();
f47afe53 467
468 if( myAIS.IsNull() )
469 AISUpdate();
470
471 if ( !myAIS.IsNull() && myAIS->HasWidth() )
472 {
473 Handle(AIS_InteractiveContext) aContext = getAISContext();
474
475 if ( !aContext.IsNull() )
476 aContext->UnsetWidth(myAIS, Standard_False);
477 else
7fd59977 478 myAIS->UnsetWidth();
479 }
480}
481
7fd59977 482//=======================================================================
483//function : Mode
484//purpose :
485//=======================================================================
7fd59977 486Standard_Integer TPrsStd_AISPresentation::Mode() const
487{
c4a2f61e 488 return getData()->Mode();
7fd59977 489}
490
491//=======================================================================
f47afe53 492//function : HasOwnMode
7fd59977 493//purpose :
494//=======================================================================
495Standard_Boolean TPrsStd_AISPresentation::HasOwnMode() const
496{
c4a2f61e 497 return getData()->HasOwnMode();
7fd59977 498}
499
500//=======================================================================
f47afe53 501//function : SetMode
7fd59977 502//purpose :
503//=======================================================================
f47afe53 504void TPrsStd_AISPresentation::SetMode(const Standard_Integer theMode)
7fd59977 505{
c4a2f61e 506 Backup();
507 if ( getData()->HasOwnMode() && getData()->Mode() == theMode )
f47afe53 508 if ( !myAIS.IsNull() && myAIS->DisplayMode() == theMode )
7fd59977 509 return;
510
c4a2f61e 511 getData()->SetMode(theMode);
f47afe53 512
513 if ( myAIS.IsNull() )
514 AISUpdate();
515
516 if ( !myAIS.IsNull() )
517 {
518 if ( myAIS->DisplayMode() == theMode )
519 return; // AIS has already had that mode
520
521 Handle(AIS_InteractiveContext) aContext = getAISContext();
522
523 if( !aContext.IsNull() )
524 aContext->SetDisplayMode(myAIS, theMode, Standard_False);
7fd59977 525 else
526 myAIS->SetDisplayMode(theMode);
527 }
528}
529
530//=======================================================================
f47afe53 531//function : UnsetMode
7fd59977 532//purpose :
533//=======================================================================
534void TPrsStd_AISPresentation::UnsetMode()
535{
c4a2f61e 536 if ( !getData()->HasOwnMode() )
f47afe53 537 if ( !myAIS.IsNull() && !myAIS->HasDisplayMode() )
7fd59977 538 return;
539
c4a2f61e 540 getData()->UnsetMode();
f47afe53 541
542 if ( myAIS.IsNull() )
543 AISUpdate();
544
545 if( !myAIS.IsNull() && myAIS->HasDisplayMode() )
546 {
547 Handle(AIS_InteractiveContext) aContext = getAISContext();
548
549 if ( !aContext.IsNull() )
550 aContext->UnsetDisplayMode(myAIS, Standard_False);
551 else
552 myAIS->UnsetDisplayMode();
7fd59977 553 }
554}
555
7fd59977 556//=======================================================================
557//function : SelectionMode
558//purpose :
559//=======================================================================
7fd59977 560Standard_Integer TPrsStd_AISPresentation::SelectionMode() const
561{
c4a2f61e 562 return getData()->SelectionMode();
7fd59977 563}
564
565//=======================================================================
f47afe53 566//function : HasOwnSelectionMode
7fd59977 567//purpose :
568//=======================================================================
569Standard_Boolean TPrsStd_AISPresentation::HasOwnSelectionMode() const
570{
c4a2f61e 571 return getData()->HasOwnSelectionMode();
7fd59977 572}
573
574//=======================================================================
f47afe53 575//function : SetSelectionMode
7fd59977 576//purpose :
577//=======================================================================
f47afe53 578void TPrsStd_AISPresentation::SetSelectionMode(const Standard_Integer theSelectionMode)
7fd59977 579{
c4a2f61e 580 Backup();
581 getData()->SetSelectionMode (theSelectionMode);
f47afe53 582 AISUpdate();
7fd59977 583}
584
585//=======================================================================
f47afe53 586//function : UnsetSelectionMode
7fd59977 587//purpose :
588//=======================================================================
589void TPrsStd_AISPresentation::UnsetSelectionMode()
590{
c4a2f61e 591 getData()->UnsetSelectionMode ();
f47afe53 592 AISUpdate();
7fd59977 593}
7fd59977 594
595//=======================================================================
596//function : ID
597//purpose :
598//=======================================================================
f47afe53 599const Standard_GUID& TPrsStd_AISPresentation::ID() const
600{
601 return GetID();
602}
7fd59977 603
604//=======================================================================
605//function : BackupCopy
606//purpose :
607//=======================================================================
608Handle(TDF_Attribute) TPrsStd_AISPresentation::BackupCopy() const
609{
f47afe53 610 return new TPrsStd_AISPresentation;
7fd59977 611}
612
613
614//=======================================================================
615//function : NewEmpty
616//purpose :
617//=======================================================================
618Handle(TDF_Attribute) TPrsStd_AISPresentation::NewEmpty() const
619{
f47afe53 620 return new TPrsStd_AISPresentation();
7fd59977 621}
622
623//=======================================================================
f47afe53 624//function : Paste
7fd59977 625//purpose :
626//=======================================================================
f47afe53 627void TPrsStd_AISPresentation::Restore(const Handle(TDF_Attribute)& /*theWith*/)
628{
7fd59977 629 myAIS.Nullify();
7fd59977 630}
631
632//=======================================================================
633//function : Paste
634//purpose :
635//=======================================================================
f47afe53 636void TPrsStd_AISPresentation::Paste (const Handle(TDF_Attribute)& theInto,
637 const Handle(TDF_RelocationTable)& ) const
638{
639 Handle(TPrsStd_AISPresentation) anInto =
640 Handle(TPrsStd_AISPresentation)::DownCast(theInto);
7fd59977 641
f47afe53 642 anInto->Backup();
b66f3758 643 if (!anInto->myAIS.IsNull())
644 {
645 // Save displayed flag.
646 Standard_Boolean displayed = anInto->IsDisplayed();
647 // Erase the interactive object.
648 anInto->AISErase(Standard_True);
649 // Restore the displayed flag.
650 if (displayed)
651 anInto->SetDisplayed(displayed);
652 }
653 // Nullify the interactive object.
654 // It will be restored on the next call to AISUpdate().
f47afe53 655 anInto->myAIS.Nullify();
7fd59977 656}
657
658//=======================================================================
659//function : AfterAddition
660//purpose : erase if displayed
661//=======================================================================
662void TPrsStd_AISPresentation::AfterAddition()
f47afe53 663{
7fd59977 664 AfterResume();
665}
666
667//=======================================================================
668//function : BeforeRemoval
669//purpose : erase if displayed
670//=======================================================================
671void TPrsStd_AISPresentation::BeforeRemoval()
f47afe53 672{
673 BeforeForget();
7fd59977 674}
675
676//=======================================================================
677//function : BeforeForget
678//purpose : erase if displayed
679//=======================================================================
680void TPrsStd_AISPresentation::BeforeForget()
681{
f47afe53 682 if ( !myAIS.IsNull() )
683 { // Remove AISObject from context.
684 AISErase(Standard_True);
7fd59977 685 myAIS.Nullify();
686 }
687}
688
7fd59977 689//=======================================================================
690//function : AfterResume
691//purpose : display if displayed
692//=======================================================================
f47afe53 693void TPrsStd_AISPresentation::AfterResume()
7fd59977 694{
695 AISUpdate();
f47afe53 696 if ( IsDisplayed() )
697 AISDisplay();
698 else
699 AISErase();
7fd59977 700}
701
702//=======================================================================
703//function : BeforeUndo
704//purpose : le NamedShape associe doit etre present
705//=======================================================================
7fd59977 706Standard_Boolean TPrsStd_AISPresentation::BeforeUndo (const Handle(TDF_AttributeDelta)& AD,
c4a2f61e 707 const Standard_Boolean )
7fd59977 708{
709 Handle(TPrsStd_AISPresentation) P;
f47afe53 710 AD->Label().FindAttribute(TPrsStd_AISPresentation::GetID(), P);
7fd59977 711
f47afe53 712 if (AD->IsKind(STANDARD_TYPE(TDF_DeltaOnAddition)))
713 {
714 if ( !P.IsNull() )
715 P->BeforeForget();
7fd59977 716 }
717 else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnRemoval))) {
f47afe53 718 }
719 else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnModification)))
720 {
721 if ( !P.IsNull() )
722 P->BeforeForget();
723 }
7fd59977 724
725 return Standard_True;
726}
727
7fd59977 728//=======================================================================
729//function : AfterUndo
730//purpose : le NamedShape associe doit etre present
731//=======================================================================
7fd59977 732Standard_Boolean TPrsStd_AISPresentation::AfterUndo (const Handle(TDF_AttributeDelta)& AD,
f47afe53 733 const Standard_Boolean )
7fd59977 734{
735 Handle(TPrsStd_AISPresentation) P;
736 AD->Label().FindAttribute(TPrsStd_AISPresentation::GetID(), P);
737
f47afe53 738 if (AD->IsKind(STANDARD_TYPE(TDF_DeltaOnAddition)))
739 {}
740 else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnRemoval)))
741 {
742 if ( !P.IsNull() )
743 P->AfterAddition();
7fd59977 744 }
f47afe53 745 else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnModification)))
746 {
747 if ( !P.IsNull() )
748 P->AfterResume();
7fd59977 749 }
750
751 return Standard_True;
752}
753
7fd59977 754//=======================================================================
755//function : AISUpdate
756//purpose :
757//=======================================================================
f47afe53 758void TPrsStd_AISPresentation::AISUpdate()
759{
7fd59977 760 Backup();
c4a2f61e 761 getData()->Backup();
f47afe53 762 Handle(AIS_InteractiveContext) aContext;
763 if ( !Label().IsNull() )
764 {
765 aContext = getAISContext();
766
767 Handle(TPrsStd_Driver) aDriver;
768 if ( TPrsStd_DriverTable::Get()->FindDriver(GetDriverGUID(), aDriver) )
769 {
770 // Build a new AIS.
771 if ( myAIS.IsNull() )
772 {
773 Handle(AIS_InteractiveObject) aNewObj;
774 if ( aDriver->Update(Label(), aNewObj) )
775 {
776 myAIS = aNewObj;
f47afe53 777 aNewObj->SetOwner(this);
778 }
7fd59977 779 }
f47afe53 780 else
781 {
782 Handle(AIS_InteractiveObject) anObj = myAIS;
783 if ( aDriver->Update(Label(), anObj) )
784 if ( !(anObj == myAIS) )
785 {
786 if ( !aContext.IsNull() )
0577ae8c 787 aContext->Remove (myAIS, Standard_True);
f47afe53 788
789 // Driver has built new AIS.
790 myAIS = anObj;
f47afe53 791 anObj->SetOwner(this);
792 }
7fd59977 793 }
794 }
795 }
796 else return;
797
f47afe53 798 // Apply the visualization settings.
799 if ( !myAIS.IsNull() )
800 {
801 if ( HasOwnColor() )
802 {
803 Quantity_NameOfColor aColor = Color();
804 if ( !(myAIS->HasColor()) || (myAIS->HasColor() && myAIS->Color() != aColor) )
805 {
806 if ( !aContext.IsNull() )
807 aContext->SetColor(myAIS, aColor, Standard_False);
808 else
809 myAIS->SetColor(aColor);
7fd59977 810 }
f47afe53 811 }
7fd59977 812
f47afe53 813 if ( HasOwnMaterial() )
814 {
815 Graphic3d_NameOfMaterial aMaterial = Material();
816 if ( !(myAIS->HasMaterial()) || (myAIS->HasMaterial() && myAIS->Material() != aMaterial) )
817 {
818 if ( !aContext.IsNull() )
819 aContext->SetMaterial(myAIS, aMaterial, Standard_False );
820 else
821 myAIS->SetMaterial(aMaterial);
7fd59977 822 }
f47afe53 823 }
824
825 if ( HasOwnTransparency() )
826 {
827 const Standard_Real aTransparency = Transparency();
828 if ( myAIS->Transparency() != aTransparency )
829 {
830 if( !aContext.IsNull() )
831 aContext->SetTransparency(myAIS, aTransparency, Standard_False);
832 else
833 myAIS->SetTransparency(aTransparency);
7fd59977 834 }
835 }
836
f47afe53 837 if ( HasOwnWidth() )
838 {
839 const Standard_Real aWidth = Width();
840 if ( !(myAIS->HasWidth()) || (myAIS->HasWidth() && myAIS->Width() != aWidth) )
841 {
842 if ( !aContext.IsNull() )
843 aContext->SetWidth(myAIS, aWidth, Standard_False);
844 else
845 myAIS->SetWidth(aWidth);
7fd59977 846 }
847 }
848
f47afe53 849 if ( HasOwnMode() )
850 {
851 const Standard_Integer aMode = Mode();
852 if ( myAIS->DisplayMode() != aMode )
853 myAIS->SetDisplayMode(aMode);
7fd59977 854 }
855
f47afe53 856 if ( !aContext.IsNull() && IsDisplayed() )
857 aContext->Redisplay(myAIS, Standard_False);
858
859 if (HasOwnSelectionMode()) {
c3282ec1 860 if (!aContext.IsNull())
861 {
862 TColStd_ListOfInteger anActivatedModes;
863 aContext->ActivatedModes (myAIS, anActivatedModes);
864 Standard_Boolean isActivated = Standard_False;
f47afe53 865 Standard_Integer aSelectionMode = SelectionMode();
c4a2f61e 866 if (aSelectionMode == -1)
c3282ec1 867 {
c4a2f61e 868 aContext->Deactivate(myAIS);
869 }
870 else
871 {
872 for (TColStd_ListIteratorOfListOfInteger aModeIter (anActivatedModes); aModeIter.More(); aModeIter.Next())
c3282ec1 873 {
c4a2f61e 874 if (aModeIter.Value() == aSelectionMode)
875 {
876 isActivated = Standard_True;
877 break;
878 }
c3282ec1 879 }
c4a2f61e 880 if (!isActivated)
881 aContext->Activate (myAIS, aSelectionMode, Standard_False);
c3282ec1 882 }
7fd59977 883 }
884 }
7fd59977 885
886 }
887
f47afe53 888 if (IsDisplayed() && !aContext.IsNull())
889 aContext->Redisplay(myAIS, Standard_False);
7fd59977 890}
891
892//=======================================================================
893//function : AISDisplay
894//purpose :
895//=======================================================================
f47afe53 896void TPrsStd_AISPresentation::AISDisplay()
897{
898 if ( !Label().IsNull() )
899 {
900 Handle(AIS_InteractiveContext) aContext = getAISContext();
7fd59977 901
f47afe53 902 if ( aContext.IsNull() )
903 return;
904
905 if ( !myAIS.IsNull() )
906 {
907 if ( !(myAIS->GetContext()).IsNull() && (myAIS->GetContext()) != aContext )
0577ae8c 908 myAIS->GetContext()->Remove (myAIS, Standard_False);
7fd59977 909
f47afe53 910 if ( IsDisplayed() && aContext->IsDisplayed(myAIS) )
911 return;
7fd59977 912
f47afe53 913 aContext->Display(myAIS, Standard_False);
7fd59977 914
f47afe53 915 if ( aContext->IsDisplayed(myAIS) )
916 SetDisplayed(Standard_True);
7fd59977 917 }
918 }
919}
920
7fd59977 921//=======================================================================
922//function : AISErase
923//purpose :
924//=======================================================================
f47afe53 925void TPrsStd_AISPresentation::AISErase(const Standard_Boolean theIsRemove)
926{
927 Handle(AIS_InteractiveContext) aContext, anOwnContext;
928
929 if ( !myAIS.IsNull() )
930 {
931 Backup();
f47afe53 932 if ( !Label().IsNull() )
933 {
c4a2f61e 934 if (IsAttribute(TDataXtd_Presentation::GetID()))
935 SetDisplayed(Standard_False);
936
f47afe53 937 Handle(TPrsStd_AISViewer) viewer;
938 if( !TPrsStd_AISViewer::Find(Label(), viewer) )
939 return;
940 anOwnContext = myAIS->GetContext();
941 aContext = viewer->GetInteractiveContext();
7fd59977 942
f47afe53 943 if ( theIsRemove )
944 {
945 if ( !aContext.IsNull() )
946 aContext->Remove(myAIS, Standard_False);
947 if ( !anOwnContext.IsNull() && anOwnContext != aContext )
948 anOwnContext->Remove(myAIS, Standard_False);
7fd59977 949
7fd59977 950 myAIS->SetToUpdate();
951 }
f47afe53 952 else
953 {
954 if ( !aContext.IsNull() )
955 aContext->Erase(myAIS, Standard_False);
956 if ( !anOwnContext.IsNull() && anOwnContext != aContext )
957 anOwnContext->Erase(myAIS, Standard_False);
7fd59977 958 }
959 }
f47afe53 960 else
961 {
962 if ( theIsRemove )
963 {
964 if ( !anOwnContext.IsNull() )
965 {
966 anOwnContext->Remove(myAIS, Standard_False);
967 myAIS->SetToUpdate();
968 }
7fd59977 969 }
f47afe53 970 else
971 if( !anOwnContext.IsNull() )
972 anOwnContext->Erase(myAIS, Standard_False);
7fd59977 973 }
974 }
975}
976
7fd59977 977//=======================================================================
978//function :GetAIS
979//purpose :
980//=======================================================================
981Handle(AIS_InteractiveObject) TPrsStd_AISPresentation::GetAIS() const
982{
983 return myAIS;
984}
985
7fd59977 986//=======================================================================
f47afe53 987//function : getAISContext
7fd59977 988//purpose :
989//=======================================================================
f47afe53 990Handle(AIS_InteractiveContext) TPrsStd_AISPresentation::getAISContext() const
7fd59977 991{
f47afe53 992 Handle(TPrsStd_AISViewer) aViewer;
993 if ( TPrsStd_AISViewer::Find(Label(), aViewer) )
994 return aViewer->GetInteractiveContext();
7fd59977 995
f47afe53 996 return Handle_AIS_InteractiveContext();
997}