0030214: Application Framework, TPrsStd_AISPresentation - Hidden Presentations Cannot...
[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{
253cfde7 137 if ( IsDisplayed() || theIsRemove)
f47afe53 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//=======================================================================
31e8d3c1 594void TPrsStd_AISPresentation::SetSelectionMode(const Standard_Integer theSelectionMode, const Standard_Boolean theTransaction)
7fd59977 595{
31e8d3c1 596 if (theTransaction)
597 Backup();
598 getData()->SetSelectionMode (theSelectionMode, theTransaction);
ab3ff92c 599
600 if ( myAIS.IsNull() )
601 AISUpdate();
602 else
603 ActivateSelectionMode();
7fd59977 604}
605
606//=======================================================================
f47afe53 607//function : UnsetSelectionMode
7fd59977 608//purpose :
609//=======================================================================
610void TPrsStd_AISPresentation::UnsetSelectionMode()
611{
c4a2f61e 612 getData()->UnsetSelectionMode ();
f47afe53 613 AISUpdate();
7fd59977 614}
7fd59977 615
616//=======================================================================
617//function : ID
618//purpose :
619//=======================================================================
f47afe53 620const Standard_GUID& TPrsStd_AISPresentation::ID() const
621{
622 return GetID();
623}
7fd59977 624
625//=======================================================================
626//function : BackupCopy
627//purpose :
628//=======================================================================
629Handle(TDF_Attribute) TPrsStd_AISPresentation::BackupCopy() const
630{
f47afe53 631 return new TPrsStd_AISPresentation;
7fd59977 632}
633
634
635//=======================================================================
636//function : NewEmpty
637//purpose :
638//=======================================================================
639Handle(TDF_Attribute) TPrsStd_AISPresentation::NewEmpty() const
640{
f47afe53 641 return new TPrsStd_AISPresentation();
7fd59977 642}
643
644//=======================================================================
f47afe53 645//function : Paste
7fd59977 646//purpose :
647//=======================================================================
f47afe53 648void TPrsStd_AISPresentation::Restore(const Handle(TDF_Attribute)& /*theWith*/)
649{
7fd59977 650 myAIS.Nullify();
7fd59977 651}
652
653//=======================================================================
654//function : Paste
655//purpose :
656//=======================================================================
f47afe53 657void TPrsStd_AISPresentation::Paste (const Handle(TDF_Attribute)& theInto,
658 const Handle(TDF_RelocationTable)& ) const
659{
660 Handle(TPrsStd_AISPresentation) anInto =
661 Handle(TPrsStd_AISPresentation)::DownCast(theInto);
7fd59977 662
f47afe53 663 anInto->Backup();
b66f3758 664 if (!anInto->myAIS.IsNull())
665 {
666 // Save displayed flag.
667 Standard_Boolean displayed = anInto->IsDisplayed();
668 // Erase the interactive object.
669 anInto->AISErase(Standard_True);
670 // Restore the displayed flag.
671 if (displayed)
672 anInto->SetDisplayed(displayed);
673 }
674 // Nullify the interactive object.
675 // It will be restored on the next call to AISUpdate().
f47afe53 676 anInto->myAIS.Nullify();
7fd59977 677}
678
679//=======================================================================
680//function : AfterAddition
681//purpose : erase if displayed
682//=======================================================================
683void TPrsStd_AISPresentation::AfterAddition()
f47afe53 684{
7fd59977 685 AfterResume();
686}
687
688//=======================================================================
689//function : BeforeRemoval
690//purpose : erase if displayed
691//=======================================================================
692void TPrsStd_AISPresentation::BeforeRemoval()
f47afe53 693{
694 BeforeForget();
7fd59977 695}
696
697//=======================================================================
698//function : BeforeForget
699//purpose : erase if displayed
700//=======================================================================
701void TPrsStd_AISPresentation::BeforeForget()
702{
f47afe53 703 if ( !myAIS.IsNull() )
704 { // Remove AISObject from context.
705 AISErase(Standard_True);
7fd59977 706 myAIS.Nullify();
707 }
708}
709
7fd59977 710//=======================================================================
711//function : AfterResume
712//purpose : display if displayed
713//=======================================================================
f47afe53 714void TPrsStd_AISPresentation::AfterResume()
7fd59977 715{
f47afe53 716 if ( IsDisplayed() )
39effd08 717 {
718 AISUpdate();
f47afe53 719 AISDisplay();
39effd08 720 }
f47afe53 721 else
722 AISErase();
7fd59977 723}
724
725//=======================================================================
726//function : BeforeUndo
727//purpose : le NamedShape associe doit etre present
728//=======================================================================
7fd59977 729Standard_Boolean TPrsStd_AISPresentation::BeforeUndo (const Handle(TDF_AttributeDelta)& AD,
c4a2f61e 730 const Standard_Boolean )
7fd59977 731{
732 Handle(TPrsStd_AISPresentation) P;
f47afe53 733 AD->Label().FindAttribute(TPrsStd_AISPresentation::GetID(), P);
7fd59977 734
f47afe53 735 if (AD->IsKind(STANDARD_TYPE(TDF_DeltaOnAddition)))
736 {
737 if ( !P.IsNull() )
738 P->BeforeForget();
7fd59977 739 }
740 else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnRemoval))) {
f47afe53 741 }
742 else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnModification)))
743 {
744 if ( !P.IsNull() )
745 P->BeforeForget();
746 }
7fd59977 747
748 return Standard_True;
749}
750
7fd59977 751//=======================================================================
752//function : AfterUndo
753//purpose : le NamedShape associe doit etre present
754//=======================================================================
7fd59977 755Standard_Boolean TPrsStd_AISPresentation::AfterUndo (const Handle(TDF_AttributeDelta)& AD,
f47afe53 756 const Standard_Boolean )
7fd59977 757{
758 Handle(TPrsStd_AISPresentation) P;
759 AD->Label().FindAttribute(TPrsStd_AISPresentation::GetID(), P);
760
f47afe53 761 if (AD->IsKind(STANDARD_TYPE(TDF_DeltaOnAddition)))
762 {}
763 else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnRemoval)))
764 {
765 if ( !P.IsNull() )
766 P->AfterAddition();
7fd59977 767 }
f47afe53 768 else if (AD->IsKind(STANDARD_TYPE(TDF_DefaultDeltaOnModification)))
769 {
770 if ( !P.IsNull() )
771 P->AfterResume();
7fd59977 772 }
773
774 return Standard_True;
775}
776
7fd59977 777//=======================================================================
778//function : AISUpdate
779//purpose :
780//=======================================================================
f47afe53 781void TPrsStd_AISPresentation::AISUpdate()
782{
7fd59977 783 Backup();
c4a2f61e 784 getData()->Backup();
f47afe53 785 Handle(AIS_InteractiveContext) aContext;
786 if ( !Label().IsNull() )
787 {
788 aContext = getAISContext();
789
790 Handle(TPrsStd_Driver) aDriver;
791 if ( TPrsStd_DriverTable::Get()->FindDriver(GetDriverGUID(), aDriver) )
792 {
793 // Build a new AIS.
794 if ( myAIS.IsNull() )
795 {
796 Handle(AIS_InteractiveObject) aNewObj;
797 if ( aDriver->Update(Label(), aNewObj) )
798 {
799 myAIS = aNewObj;
f47afe53 800 aNewObj->SetOwner(this);
801 }
7fd59977 802 }
f47afe53 803 else
804 {
805 Handle(AIS_InteractiveObject) anObj = myAIS;
806 if ( aDriver->Update(Label(), anObj) )
807 if ( !(anObj == myAIS) )
808 {
809 if ( !aContext.IsNull() )
f6c2b39a 810 aContext->Remove (myAIS, Standard_False);
f47afe53 811
812 // Driver has built new AIS.
813 myAIS = anObj;
f47afe53 814 anObj->SetOwner(this);
815 }
7fd59977 816 }
817 }
818 }
819 else return;
820
f47afe53 821 // Apply the visualization settings.
822 if ( !myAIS.IsNull() )
823 {
824 if ( HasOwnColor() )
825 {
826 Quantity_NameOfColor aColor = Color();
87432b82 827 Quantity_Color aPrsColor;
828 myAIS->Color (aPrsColor);
829 if ( !(myAIS->HasColor()) || (myAIS->HasColor() && aPrsColor.Name() != aColor) )
f47afe53 830 {
831 if ( !aContext.IsNull() )
832 aContext->SetColor(myAIS, aColor, Standard_False);
833 else
834 myAIS->SetColor(aColor);
7fd59977 835 }
f47afe53 836 }
7fd59977 837
f47afe53 838 if ( HasOwnMaterial() )
839 {
840 Graphic3d_NameOfMaterial aMaterial = Material();
841 if ( !(myAIS->HasMaterial()) || (myAIS->HasMaterial() && myAIS->Material() != aMaterial) )
842 {
843 if ( !aContext.IsNull() )
844 aContext->SetMaterial(myAIS, aMaterial, Standard_False );
845 else
846 myAIS->SetMaterial(aMaterial);
7fd59977 847 }
f47afe53 848 }
849
850 if ( HasOwnTransparency() )
851 {
852 const Standard_Real aTransparency = Transparency();
853 if ( myAIS->Transparency() != aTransparency )
854 {
855 if( !aContext.IsNull() )
856 aContext->SetTransparency(myAIS, aTransparency, Standard_False);
857 else
858 myAIS->SetTransparency(aTransparency);
7fd59977 859 }
860 }
861
f47afe53 862 if ( HasOwnWidth() )
863 {
864 const Standard_Real aWidth = Width();
865 if ( !(myAIS->HasWidth()) || (myAIS->HasWidth() && myAIS->Width() != aWidth) )
866 {
867 if ( !aContext.IsNull() )
868 aContext->SetWidth(myAIS, aWidth, Standard_False);
869 else
870 myAIS->SetWidth(aWidth);
7fd59977 871 }
872 }
873
f47afe53 874 if ( HasOwnMode() )
875 {
876 const Standard_Integer aMode = Mode();
877 if ( myAIS->DisplayMode() != aMode )
878 myAIS->SetDisplayMode(aMode);
7fd59977 879 }
880
ab3ff92c 881 ActivateSelectionMode();
7fd59977 882 }
883
f47afe53 884 if (IsDisplayed() && !aContext.IsNull())
885 aContext->Redisplay(myAIS, Standard_False);
7fd59977 886}
887
888//=======================================================================
889//function : AISDisplay
890//purpose :
891//=======================================================================
f47afe53 892void TPrsStd_AISPresentation::AISDisplay()
893{
894 if ( !Label().IsNull() )
895 {
896 Handle(AIS_InteractiveContext) aContext = getAISContext();
7fd59977 897
f47afe53 898 if ( aContext.IsNull() )
899 return;
900
901 if ( !myAIS.IsNull() )
902 {
903 if ( !(myAIS->GetContext()).IsNull() && (myAIS->GetContext()) != aContext )
0577ae8c 904 myAIS->GetContext()->Remove (myAIS, Standard_False);
7fd59977 905
f47afe53 906 if ( IsDisplayed() && aContext->IsDisplayed(myAIS) )
907 return;
7fd59977 908
f47afe53 909 aContext->Display(myAIS, Standard_False);
7fd59977 910
f47afe53 911 if ( aContext->IsDisplayed(myAIS) )
912 SetDisplayed(Standard_True);
7fd59977 913 }
914 }
915}
916
7fd59977 917//=======================================================================
918//function : AISErase
919//purpose :
920//=======================================================================
f47afe53 921void TPrsStd_AISPresentation::AISErase(const Standard_Boolean theIsRemove)
922{
923 Handle(AIS_InteractiveContext) aContext, anOwnContext;
924
925 if ( !myAIS.IsNull() )
926 {
927 Backup();
f47afe53 928 if ( !Label().IsNull() )
929 {
c4a2f61e 930 if (IsAttribute(TDataXtd_Presentation::GetID()))
931 SetDisplayed(Standard_False);
932
f47afe53 933 Handle(TPrsStd_AISViewer) viewer;
934 if( !TPrsStd_AISViewer::Find(Label(), viewer) )
935 return;
936 anOwnContext = myAIS->GetContext();
937 aContext = viewer->GetInteractiveContext();
7fd59977 938
f47afe53 939 if ( theIsRemove )
940 {
941 if ( !aContext.IsNull() )
942 aContext->Remove(myAIS, Standard_False);
943 if ( !anOwnContext.IsNull() && anOwnContext != aContext )
944 anOwnContext->Remove(myAIS, Standard_False);
7fd59977 945
78a8dfb9 946 myAIS.Nullify();
7fd59977 947 }
f47afe53 948 else
949 {
950 if ( !aContext.IsNull() )
951 aContext->Erase(myAIS, Standard_False);
952 if ( !anOwnContext.IsNull() && anOwnContext != aContext )
953 anOwnContext->Erase(myAIS, Standard_False);
7fd59977 954 }
955 }
f47afe53 956 else
957 {
958 if ( theIsRemove )
959 {
960 if ( !anOwnContext.IsNull() )
961 {
962 anOwnContext->Remove(myAIS, Standard_False);
78a8dfb9 963 myAIS.Nullify();
f47afe53 964 }
7fd59977 965 }
f47afe53 966 else
967 if( !anOwnContext.IsNull() )
968 anOwnContext->Erase(myAIS, Standard_False);
7fd59977 969 }
970 }
971}
972
7fd59977 973//=======================================================================
974//function :GetAIS
975//purpose :
976//=======================================================================
977Handle(AIS_InteractiveObject) TPrsStd_AISPresentation::GetAIS() const
978{
979 return myAIS;
980}
981
7fd59977 982//=======================================================================
f47afe53 983//function : getAISContext
7fd59977 984//purpose :
985//=======================================================================
f47afe53 986Handle(AIS_InteractiveContext) TPrsStd_AISPresentation::getAISContext() const
7fd59977 987{
f47afe53 988 Handle(TPrsStd_AISViewer) aViewer;
989 if ( TPrsStd_AISViewer::Find(Label(), aViewer) )
990 return aViewer->GetInteractiveContext();
7fd59977 991
f47afe53 992 return Handle_AIS_InteractiveContext();
993}
ab3ff92c 994
995//=======================================================================
996//function : ActivateSelectionMode
997//purpose : Activates selection mode of the interactive object.
998// It is called internally on change of selection mode and AISUpdate().
999//=======================================================================
1000void TPrsStd_AISPresentation::ActivateSelectionMode()
1001{
1002 if (!myAIS.IsNull() && HasOwnSelectionMode())
1003 {
1004 Handle(AIS_InteractiveContext) aContext = getAISContext();
1005 if (!aContext.IsNull())
1006 {
1007 TColStd_ListOfInteger anActivatedModes;
1008 aContext->ActivatedModes (myAIS, anActivatedModes);
1009 Standard_Boolean isActivated = Standard_False;
1010 Standard_Integer aSelectionMode = SelectionMode();
1011 if (aSelectionMode == -1)
1012 {
1013 aContext->Deactivate(myAIS);
1014 }
1015 else
1016 {
1017 for (TColStd_ListIteratorOfListOfInteger aModeIter (anActivatedModes); aModeIter.More(); aModeIter.Next())
1018 {
1019 if (aModeIter.Value() == aSelectionMode)
1020 {
1021 isActivated = Standard_True;
1022 break;
1023 }
1024 }
1025 if (!isActivated)
1026 aContext->Activate (myAIS, aSelectionMode, Standard_False);
1027 }
1028 }
1029 }
1030}