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