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