0026936: Drawbacks of inlining in new type system in OCCT 7.0 -- automatic
[occt.git] / src / AIS / AIS_Shape.cxx
1 // Created on: 1996-12-20
2 // Created by: Robert COUBLANC
3 // Copyright (c) 1996-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_GraphicTool.hxx>
19 #include <AIS_InteractiveContext.hxx>
20 #include <AIS_Shape.hxx>
21 #include <Aspect_TypeOfLine.hxx>
22 #include <Bnd_Box.hxx>
23 #include <BRep_Builder.hxx>
24 #include <BRepBndLib.hxx>
25 #include <BRepTools.hxx>
26 #include <BRepTools_ShapeSet.hxx>
27 #include <Geom_Transformation.hxx>
28 #include <gp_Pnt.hxx>
29 #include <Graphic3d_ArrayOfPolylines.hxx>
30 #include <Graphic3d_AspectFillArea3d.hxx>
31 #include <Graphic3d_AspectLine3d.hxx>
32 #include <Graphic3d_AspectMarker3d.hxx>
33 #include <Graphic3d_AspectText3d.hxx>
34 #include <Graphic3d_Group.hxx>
35 #include <Graphic3d_MaterialAspect.hxx>
36 #include <Graphic3d_SequenceOfGroup.hxx>
37 #include <Graphic3d_Structure.hxx>
38 #include <HLRBRep.hxx>
39 #include <OSD_Timer.hxx>
40 #include <Precision.hxx>
41 #include <Prs3d.hxx>
42 #include <Prs3d_Drawer.hxx>
43 #include <Prs3d_IsoAspect.hxx>
44 #include <Prs3d_Presentation.hxx>
45 #include <Prs3d_Projector.hxx>
46 #include <Prs3d_Root.hxx>
47 #include <Prs3d_ShadingAspect.hxx>
48 #include <StdPrs_BndBox.hxx>
49 #include <StdPrs_ToolTriangulatedShape.hxx>
50 #include <PrsMgr_ModedPresentation.hxx>
51 #include <Quantity_Color.hxx>
52 #include <Select3D_SensitiveBox.hxx>
53 #include <Select3D_SensitiveEntity.hxx>
54 #include <Standard_ErrorHandler.hxx>
55 #include <Standard_Failure.hxx>
56 #include <Standard_Type.hxx>
57 #include <StdPrs_HLRPolyShape.hxx>
58 #include <StdPrs_HLRShape.hxx>
59 #include <StdPrs_ShadedShape.hxx>
60 #include <StdPrs_WFShape.hxx>
61 #include <StdSelect.hxx>
62 #include <StdSelect_BRepOwner.hxx>
63 #include <StdSelect_BRepSelectionTool.hxx>
64 #include <StdSelect_DisplayMode.hxx>
65 #include <TColStd_ListIteratorOfListOfInteger.hxx>
66 #include <TopExp.hxx>
67 #include <TopExp_Explorer.hxx>
68 #include <TopoDS_Iterator.hxx>
69 #include <TopoDS_Shape.hxx>
70
71 IMPLEMENT_STANDARD_RTTIEXT(AIS_Shape,AIS_InteractiveObject)
72
73 static Standard_Boolean myFirstCompute;
74
75 static Standard_Boolean IsInList(const TColStd_ListOfInteger& LL, const Standard_Integer aMode)
76 {
77   TColStd_ListIteratorOfListOfInteger It(LL);
78   for(;It.More();It.Next()){
79     if(It.Value()==aMode) 
80       return Standard_True;}
81   return Standard_False;
82 }
83
84 //==================================================
85 // Function: 
86 // Purpose :
87 //==================================================
88
89 AIS_Shape::
90 AIS_Shape(const TopoDS_Shape& shap):
91 AIS_InteractiveObject(PrsMgr_TOP_ProjectorDependant),
92 myInitAng(0.)
93 {
94   Set (shap);
95   myFirstCompute = Standard_True;
96   SetHilightMode(0);
97   myDrawer->SetShadingAspectGlobal(Standard_False);
98 }
99
100 //=======================================================================
101 //function : Type
102 //purpose  : 
103 //=======================================================================
104 AIS_KindOfInteractive AIS_Shape::Type() const 
105 {return AIS_KOI_Shape;}
106
107
108 //=======================================================================
109 //function : Signature
110 //purpose  : 
111 //=======================================================================
112 Standard_Integer AIS_Shape::Signature() const 
113 {return 0;}
114
115 //=======================================================================
116 //function : AcceptShapeDecomposition
117 //purpose  : 
118 //=======================================================================
119 Standard_Boolean AIS_Shape::AcceptShapeDecomposition() const 
120 {return Standard_True;}
121
122 //=======================================================================
123 //function : Compute
124 //purpose  : 
125 //=======================================================================
126 void AIS_Shape::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aPresentationManager*/,
127                         const Handle(Prs3d_Presentation)& aPrs,
128                         const Standard_Integer aMode)
129 {  
130   aPrs->Clear();
131   if(myshape.IsNull()) return;
132
133   // wire,edge,vertex -> pas de HLR + priorite display superieure
134   Standard_Integer TheType = (Standard_Integer) myshape.ShapeType();
135   if(TheType>4 && TheType<8) {
136     aPrs->SetVisual(Graphic3d_TOS_ALL);
137     aPrs->SetDisplayPriority(TheType+2);
138   }
139   // Shape vide -> Assemblage vide.
140   if (myshape.ShapeType() == TopAbs_COMPOUND) {
141     TopoDS_Iterator anExplor (myshape);
142
143     if (!anExplor.More()) {
144       return;
145     }
146   }
147
148   if (IsInfinite())
149   {
150     aPrs->SetInfiniteState (Standard_True); //not taken in account duting FITALL
151   }
152
153   switch (aMode)
154   {
155     case AIS_WireFrame:
156     {
157       try
158       {
159         OCC_CATCH_SIGNALS
160         StdPrs_WFShape::Add (aPrs, myshape, myDrawer);
161       }
162       catch (Standard_Failure)
163       {
164       #ifdef OCCT_DEBUG
165         cout << "AIS_Shape::Compute() failed" << endl;
166         cout << "a Shape should be incorrect : No Compute can be maked on it " << endl;
167       #endif
168         // presentation of the bounding box is calculated
169         //      Compute(aPresentationManager,aPrs,2);
170       }
171       break;
172     }
173     case AIS_Shaded:
174     {
175       if (myDrawer->IsAutoTriangulation())
176       {
177         Standard_Real anAnglePrev, anAngleNew, aCoeffPrev, aCoeffNew;
178         Standard_Boolean isOwnDeviationAngle       = OwnDeviationAngle      (anAngleNew, anAnglePrev);
179         Standard_Boolean isOwnDeviationCoefficient = OwnDeviationCoefficient(aCoeffNew,  aCoeffPrev);
180         if ((isOwnDeviationAngle       && Abs (anAngleNew - anAnglePrev) > Precision::Angular())
181          || (isOwnDeviationCoefficient && Abs (aCoeffNew  - aCoeffPrev)  > Precision::Confusion()))
182         {
183           BRepTools::Clean (myshape);
184         }
185       }
186
187       if ((Standard_Integer) myshape.ShapeType() > 4)
188       {
189         StdPrs_WFShape::Add (aPrs, myshape, myDrawer);
190       }
191       else
192       {
193         myDrawer->SetShadingAspectGlobal (Standard_False);
194         if (IsInfinite())
195         {
196           StdPrs_WFShape::Add (aPrs, myshape, myDrawer);
197         }
198         else
199         {
200           try
201           {
202             OCC_CATCH_SIGNALS
203             StdPrs_ShadedShape::Add (aPrs, myshape, myDrawer);
204           }
205           catch (Standard_Failure)
206           {
207           #ifdef OCCT_DEBUG
208             cout << "AIS_Shape::Compute() in ShadingMode failed" << endl;
209           #endif
210             StdPrs_WFShape::Add (aPrs, myshape, myDrawer);
211           }
212         }
213       }
214       Standard_Real aTransparency = Transparency() ;
215       if (aTransparency > 0.0)
216       {
217         SetTransparency (aTransparency);
218       }
219       break;
220     }
221
222     // Bounding box.
223     case 2:
224     {
225       if (IsInfinite())
226       {
227         StdPrs_WFShape::Add (aPrs, myshape, myDrawer);
228       }
229       else
230       {
231         StdPrs_BndBox::Add (aPrs, BoundingBox(), myDrawer);
232       }
233     }
234   }
235
236   // Recompute hidden line presentation (if necessary).
237   aPrs->ReCompute();
238 }
239
240 //=======================================================================
241 //function : Compute
242 //purpose  : Hidden Line Removal
243 //=======================================================================
244 void AIS_Shape::Compute(const Handle(Prs3d_Projector)& aProjector,
245                         const Handle(Prs3d_Presentation)& aPresentation)
246 {
247   Compute(aProjector,aPresentation,myshape);
248 }
249
250 //=======================================================================
251 //function : Compute
252 //purpose  : 
253 //=======================================================================
254
255 void AIS_Shape::Compute(const Handle(Prs3d_Projector)&     aProjector,
256                         const Handle(Geom_Transformation)& TheTrsf,
257                         const Handle(Prs3d_Presentation)&  aPresentation)
258 {
259   const TopLoc_Location& loc = myshape.Location();
260   TopoDS_Shape shbis = myshape.Located(TopLoc_Location(TheTrsf->Trsf())*loc);
261   Compute(aProjector,aPresentation,shbis);
262 }
263
264 //=======================================================================
265 //function : Compute
266 //purpose  : 
267 //=======================================================================
268
269 void AIS_Shape::Compute(const Handle(Prs3d_Projector)& aProjector,
270                         const Handle(Prs3d_Presentation)& aPresentation,
271                         const TopoDS_Shape& SH)
272 {
273   if (SH.ShapeType() == TopAbs_COMPOUND) {
274     TopoDS_Iterator anExplor (SH);
275
276     if (!anExplor.More()) // Shape vide -> Assemblage vide.
277       return;
278   }
279
280   Handle (Prs3d_Drawer) defdrawer = GetContext()->DefaultDrawer();
281   if (defdrawer->DrawHiddenLine())
282     {myDrawer->EnableDrawHiddenLine();}
283   else {myDrawer->DisableDrawHiddenLine();}
284
285   Aspect_TypeOfDeflection prevdef = defdrawer->TypeOfDeflection();
286   defdrawer->SetTypeOfDeflection(Aspect_TOD_RELATIVE);
287
288   if (myDrawer->IsAutoTriangulation())
289   {
290     // coefficients for calculation
291     Standard_Real aPrevAngle, aNewAngle, aPrevCoeff, aNewCoeff;
292     Standard_Boolean isOwnHLRDeviationAngle = OwnHLRDeviationAngle (aNewAngle, aPrevAngle);
293     Standard_Boolean isOwnHLRDeviationCoefficient = OwnHLRDeviationCoefficient (aNewCoeff, aPrevCoeff);
294     if (((Abs (aNewAngle - aPrevAngle) > Precision::Angular()) && isOwnHLRDeviationAngle) ||
295         ((Abs (aNewCoeff - aPrevCoeff) > Precision::Confusion()) && isOwnHLRDeviationCoefficient))
296     {
297       BRepTools::Clean(SH);
298     }
299   }
300   
301   {
302     try {
303       OCC_CATCH_SIGNALS
304       switch (TypeOfHLR()) {
305         case Prs3d_TOH_Algo:
306           StdPrs_HLRShape::Add (aPresentation, SH, myDrawer, aProjector);
307           break;
308         case Prs3d_TOH_PolyAlgo:
309         default:
310           StdPrs_HLRPolyShape::Add (aPresentation, SH, myDrawer, aProjector);
311           break;
312       }
313     }
314     catch (Standard_Failure) {
315 #ifdef OCCT_DEBUG
316       cout <<"AIS_Shape::Compute(Proj) HLR Algorithm failed" << endl;
317 #endif
318       StdPrs_WFShape::Add(aPresentation,SH,myDrawer);
319     }
320   }
321
322   defdrawer->SetTypeOfDeflection (prevdef);
323 }
324
325 //=======================================================================
326 //function : SelectionType
327 //purpose  : gives the type according to the Index of Selection Mode
328 //=======================================================================
329
330 TopAbs_ShapeEnum AIS_Shape::SelectionType(const Standard_Integer aMode)
331 {
332   switch(aMode){
333   case 1:
334     return TopAbs_VERTEX;
335   case 2:
336     return TopAbs_EDGE;
337   case 3:
338     return TopAbs_WIRE;
339   case 4:
340     return TopAbs_FACE;
341   case 5:
342     return TopAbs_SHELL;
343   case 6:
344     return TopAbs_SOLID;
345   case 7:
346     return TopAbs_COMPSOLID;
347   case 8:
348     return TopAbs_COMPOUND;
349   case 0:
350   default:
351     return TopAbs_SHAPE;
352   }
353   
354 }
355 //=======================================================================
356 //function : SelectionType
357 //purpose  : gives the SelectionMode according to the Type od Decomposition...
358 //=======================================================================
359 Standard_Integer AIS_Shape::SelectionMode(const TopAbs_ShapeEnum aType)
360 {
361   switch(aType){
362   case TopAbs_VERTEX:
363     return 1;
364   case TopAbs_EDGE:
365     return 2;
366   case TopAbs_WIRE:
367     return 3;
368   case  TopAbs_FACE:
369     return 4;
370   case TopAbs_SHELL:
371     return 5;
372   case TopAbs_SOLID:
373     return 6;
374   case TopAbs_COMPSOLID:
375     return 7;
376   case TopAbs_COMPOUND:
377     return 8;
378   case TopAbs_SHAPE:
379   default:
380     return 0;
381   }
382 }
383
384
385 //=======================================================================
386 //function : ComputeSelection
387 //purpose  : 
388 //=======================================================================
389
390 void AIS_Shape::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection,
391                                               const Standard_Integer aMode)
392 {
393   if(myshape.IsNull()) return;
394   if (myshape.ShapeType() == TopAbs_COMPOUND) {
395     TopoDS_Iterator anExplor (myshape);
396
397     if (!anExplor.More()) // empty Shape -> empty Assembly.
398       return;
399   }
400
401   static TopAbs_ShapeEnum TypOfSel;
402   TypOfSel = AIS_Shape::SelectionType(aMode);
403   TopoDS_Shape shape = myshape;
404
405 // POP protection against crash in low layers
406
407   Standard_Real aDeflection = Prs3d::GetDeflection(shape, myDrawer);
408   try {  
409     OCC_CATCH_SIGNALS
410     StdSelect_BRepSelectionTool::Load(aSelection,
411                                       this,
412                                       shape,
413                                       TypOfSel,
414                                       aDeflection,
415                                       myDrawer->HLRAngle(),
416                                       myDrawer->IsAutoTriangulation());
417   } catch ( Standard_Failure ) {
418 //    cout << "a Shape should be incorrect : A Selection on the Bnd  is activated   "<<endl;
419     if ( aMode == 0 ) {
420       aSelection->Clear();
421       Bnd_Box B = BoundingBox();
422       Handle(StdSelect_BRepOwner) aOwner = new StdSelect_BRepOwner(shape,this);
423       Handle(Select3D_SensitiveBox) aSensitiveBox = new Select3D_SensitiveBox(aOwner,B);
424       aSelection->Add(aSensitiveBox);
425     }
426   }
427
428   // insert the drawer in the BrepOwners for hilight...
429   StdSelect::SetDrawerForBRepOwner(aSelection,myDrawer);
430 }
431
432 Quantity_NameOfColor AIS_Shape::Color() const {
433 Quantity_Color aColor;
434   Color(aColor);
435   return aColor.Name();
436 }
437
438 void AIS_Shape::Color( Quantity_Color& aColor ) const {
439   aColor = myDrawer->ShadingAspect()->Color(myCurrentFacingModel);
440 }
441
442 Graphic3d_NameOfMaterial AIS_Shape::Material() const {
443   return (myDrawer->ShadingAspect()->Material(myCurrentFacingModel)).Name();
444 }
445
446 Standard_Real AIS_Shape::Transparency() const {
447   return myDrawer->ShadingAspect()->Transparency(myCurrentFacingModel);
448 }
449
450 //=======================================================================
451 //function : SetColor
452 //purpose  : 
453 //=======================================================================
454
455 void AIS_Shape::SetColor(const Quantity_NameOfColor aCol)
456 {
457   SetColor(Quantity_Color(aCol));
458 }
459
460 //=======================================================================
461 //function : setColor
462 //purpose  :
463 //=======================================================================
464
465 void AIS_Shape::setColor (const Handle(Prs3d_Drawer)& theDrawer,
466                           const Quantity_Color&       theColor) const
467 {
468   if (!theDrawer->HasOwnShadingAspect())
469   {
470     theDrawer->SetShadingAspect (new Prs3d_ShadingAspect());
471     if (theDrawer->HasLink())
472     {
473       *theDrawer->ShadingAspect()->Aspect() = *theDrawer->Link()->ShadingAspect()->Aspect();
474     }
475   }
476   if (!theDrawer->HasOwnLineAspect())
477   {
478     theDrawer->SetLineAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
479     if (theDrawer->HasLink())
480     {
481       *theDrawer->LineAspect()->Aspect() = *theDrawer->Link()->LineAspect()->Aspect();
482     }
483   }
484   if (!theDrawer->HasOwnWireAspect())
485   {
486     theDrawer->SetWireAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
487     if (theDrawer->HasLink())
488     {
489       *theDrawer->WireAspect()->Aspect() = *theDrawer->Link()->WireAspect()->Aspect();
490     }
491   }
492   if (!theDrawer->HasOwnPointAspect())
493   {
494     theDrawer->SetPointAspect (new Prs3d_PointAspect (Aspect_TOM_POINT, Quantity_NOC_BLACK, 1.0));
495     if (theDrawer->HasLink())
496     {
497       *theDrawer->PointAspect()->Aspect() = *theDrawer->Link()->PointAspect()->Aspect();
498     }
499   }
500   if (!theDrawer->HasOwnFreeBoundaryAspect())
501   {
502     theDrawer->SetFreeBoundaryAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
503     if (theDrawer->HasLink())
504     {
505       *theDrawer->FreeBoundaryAspect()->Aspect() = *theDrawer->Link()->FreeBoundaryAspect()->Aspect();
506     }
507   }
508   if (!theDrawer->HasOwnUnFreeBoundaryAspect())
509   {
510     theDrawer->SetUnFreeBoundaryAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
511     if (theDrawer->HasLink())
512     {
513       *theDrawer->UnFreeBoundaryAspect()->Aspect() = *theDrawer->Link()->UnFreeBoundaryAspect()->Aspect();
514     }
515   }
516   if (!theDrawer->HasOwnSeenLineAspect())
517   {
518     theDrawer->SetSeenLineAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
519     if (theDrawer->HasLink())
520     {
521       *theDrawer->SeenLineAspect()->Aspect() = *theDrawer->Link()->SeenLineAspect()->Aspect();
522     }
523   }
524
525   // override color
526   theDrawer->ShadingAspect()->SetColor (theColor, myCurrentFacingModel);
527   theDrawer->SetShadingAspectGlobal (Standard_False);
528   theDrawer->LineAspect()->SetColor (theColor);
529   theDrawer->WireAspect()->SetColor (theColor);
530   theDrawer->PointAspect()->SetColor (theColor);
531   theDrawer->FreeBoundaryAspect()->SetColor (theColor);
532   theDrawer->UnFreeBoundaryAspect()->SetColor (theColor);
533   theDrawer->SeenLineAspect()->SetColor (theColor);
534 }
535
536 //=======================================================================
537 //function : SetColor
538 //purpose  :
539 //=======================================================================
540
541 void AIS_Shape::SetColor (const Quantity_Color& theColor)
542 {
543   setColor (myDrawer, theColor);
544   myOwnColor  = theColor;
545   hasOwnColor = Standard_True;
546
547   // modify shading presentation without re-computation
548   const PrsMgr_Presentations&        aPrsList     = Presentations();
549   Handle(Graphic3d_AspectFillArea3d) anAreaAspect = myDrawer->ShadingAspect()->Aspect();
550   Handle(Graphic3d_AspectLine3d)     aLineAspect  = myDrawer->LineAspect()->Aspect();
551   Handle(Graphic3d_AspectMarker3d)   aPointAspect = myDrawer->PointAspect()->Aspect();
552   for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
553   {
554     const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
555     if (aPrsModed.Mode() != AIS_Shaded)
556     {
557       continue;
558     }
559
560     const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
561
562     // Set aspects for presentation
563     aPrs->SetPrimitivesAspect (anAreaAspect);
564     aPrs->SetPrimitivesAspect (aLineAspect);
565     aPrs->SetPrimitivesAspect (aPointAspect);
566
567     // Go through all groups to change color for all primitives
568     for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
569     {
570       const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
571
572       // Check if aspect of given type is set for the group, 
573       // because setting aspect for group with no already set aspect
574       // can lead to loss of presentation data
575       if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
576       {
577         aGroup->SetGroupPrimitivesAspect (anAreaAspect);
578       }
579       if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_LINE))
580       {
581         aGroup->SetGroupPrimitivesAspect (aLineAspect);
582       }
583       if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_MARKER))
584       {
585         aGroup->SetGroupPrimitivesAspect (aPointAspect);
586       }
587     }
588   }
589
590   LoadRecomputable (AIS_WireFrame);
591   LoadRecomputable (2);
592 }
593
594 //=======================================================================
595 //function : UnsetColor
596 //purpose  :
597 //=======================================================================
598
599 void AIS_Shape::UnsetColor()
600 {
601   if (!HasColor())
602   {
603     myToRecomputeModes.Clear();
604     return;
605   }
606   hasOwnColor = Standard_False;
607
608   if (!HasWidth())
609   {
610     Handle(Prs3d_LineAspect) anEmptyAsp;
611     myDrawer->SetLineAspect          (anEmptyAsp);
612     myDrawer->SetWireAspect          (anEmptyAsp);
613     myDrawer->SetFreeBoundaryAspect  (anEmptyAsp);
614     myDrawer->SetUnFreeBoundaryAspect(anEmptyAsp);
615     myDrawer->SetSeenLineAspect      (anEmptyAsp);
616   }
617   else
618   {
619     Quantity_Color aColor = Quantity_NOC_YELLOW;
620     if (myDrawer->HasLink())
621     {
622       AIS_GraphicTool::GetLineColor (myDrawer->Link(), AIS_TOA_Line,   aColor);
623     }
624     myDrawer->LineAspect()->SetColor (aColor);
625     aColor = Quantity_NOC_RED;
626     if (myDrawer->HasLink())
627     {
628       AIS_GraphicTool::GetLineColor (myDrawer->Link(), AIS_TOA_Wire,   aColor);
629     }
630     myDrawer->WireAspect()->SetColor (aColor);
631     aColor = Quantity_NOC_GREEN;
632     if (myDrawer->HasLink())
633     {
634       AIS_GraphicTool::GetLineColor (myDrawer->Link(), AIS_TOA_Free,   aColor);
635     }
636     myDrawer->FreeBoundaryAspect()->SetColor (aColor);
637     aColor = Quantity_NOC_YELLOW;
638     if (myDrawer->HasLink())
639     {
640       AIS_GraphicTool::GetLineColor (myDrawer->Link(), AIS_TOA_UnFree, aColor);
641     }
642     myDrawer->UnFreeBoundaryAspect()->SetColor (aColor);
643     if (myDrawer->HasLink())
644     {
645       AIS_GraphicTool::GetLineColor (myDrawer->Link(), AIS_TOA_Seen,   aColor);
646     }
647     myDrawer->SeenLineAspect()->SetColor (aColor);
648   }
649
650   if (HasMaterial()
651    || IsTransparent())
652   {
653     Graphic3d_MaterialAspect aDefaultMat (Graphic3d_NOM_BRASS);
654     Graphic3d_MaterialAspect mat = aDefaultMat;
655     if (HasMaterial() || myDrawer->HasLink())
656     {
657       mat = AIS_GraphicTool::GetMaterial(HasMaterial()? myDrawer : myDrawer->Link());
658     }
659     if (HasMaterial())
660     {
661       Quantity_Color aColor = aDefaultMat.AmbientColor();
662       if (myDrawer->HasLink())
663       {
664         aColor = myDrawer->Link()->ShadingAspect()->Color (myCurrentFacingModel);
665       }
666       mat.SetColor (aColor);
667     }
668     if (IsTransparent())
669     {
670       Standard_Real aTransp = myDrawer->ShadingAspect()->Transparency (myCurrentFacingModel);
671       mat.SetTransparency (aTransp);
672     }
673     myDrawer->ShadingAspect()->SetMaterial (mat ,myCurrentFacingModel);
674   }
675   else
676   {
677     myDrawer->SetShadingAspect (Handle(Prs3d_ShadingAspect)());
678   }
679   myDrawer->SetPointAspect (Handle(Prs3d_PointAspect)());
680
681   // modify shading presentation without re-computation
682   const PrsMgr_Presentations&        aPrsList  = Presentations();
683   Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->Link()->ShadingAspect()->Aspect();
684   Handle(Graphic3d_AspectLine3d)     aLineAsp  = myDrawer->Link()->LineAspect()->Aspect();
685   for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
686   {
687     const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
688     if (aPrsModed.Mode() != AIS_Shaded)
689     {
690       continue;
691     }
692
693     const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
694
695     aPrs->SetPrimitivesAspect (anAreaAsp);
696     aPrs->SetPrimitivesAspect (aLineAsp);
697
698     for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
699     {
700       const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
701
702       // Check if aspect of given type is set for the group,
703       // because setting aspect for group with no already set aspect
704       // can lead to loss of presentation data
705       if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
706       {
707         aGroup->SetGroupPrimitivesAspect (anAreaAsp);
708       }
709       if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_LINE))
710       {
711         aGroup->SetGroupPrimitivesAspect (aLineAsp);
712       }
713     }
714   }
715
716   LoadRecomputable (AIS_WireFrame);
717   LoadRecomputable (2);
718 }
719
720 //=======================================================================
721 //function : setWidth
722 //purpose  :
723 //=======================================================================
724
725 void AIS_Shape::setWidth (const Handle(Prs3d_Drawer)& theDrawer,
726                           const Standard_Real         theLineWidth) const
727 {
728   if (!theDrawer->HasOwnLineAspect())
729   {
730     theDrawer->SetLineAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
731     if (theDrawer->HasLink())
732     {
733       *theDrawer->LineAspect()->Aspect() = *theDrawer->Link()->LineAspect()->Aspect();
734     }
735   }
736   if (!theDrawer->HasOwnWireAspect())
737   {
738     theDrawer->SetWireAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
739     if (theDrawer->HasLink())
740     {
741       *theDrawer->WireAspect()->Aspect() = *theDrawer->Link()->WireAspect()->Aspect();
742     }
743   }
744   if (!theDrawer->HasOwnFreeBoundaryAspect())
745   {
746     theDrawer->SetFreeBoundaryAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
747     if (theDrawer->HasLink())
748     {
749       *theDrawer->FreeBoundaryAspect()->Aspect() = *theDrawer->Link()->FreeBoundaryAspect()->Aspect();
750     }
751   }
752   if (!theDrawer->HasOwnUnFreeBoundaryAspect())
753   {
754     theDrawer->SetUnFreeBoundaryAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
755     if (theDrawer->HasLink())
756     {
757       *theDrawer->UnFreeBoundaryAspect()->Aspect() = *theDrawer->Link()->UnFreeBoundaryAspect()->Aspect();
758     }
759   }
760   if (!theDrawer->HasOwnSeenLineAspect())
761   {
762     theDrawer->SetSeenLineAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
763     if (theDrawer->HasLink())
764     {
765       *theDrawer->SeenLineAspect()->Aspect() = *theDrawer->Link()->SeenLineAspect()->Aspect();
766     }
767   }
768
769   // override width
770   theDrawer->LineAspect()->SetWidth (theLineWidth);
771   theDrawer->WireAspect()->SetWidth (theLineWidth);
772   theDrawer->FreeBoundaryAspect()->SetWidth (theLineWidth);
773   theDrawer->UnFreeBoundaryAspect()->SetWidth (theLineWidth);
774   theDrawer->SeenLineAspect()->SetWidth (theLineWidth);
775 }
776
777 //=======================================================================
778 //function : SetWidth
779 //purpose  : 
780 //=======================================================================
781
782 void AIS_Shape::SetWidth (const Standard_Real theLineWidth)
783 {
784   setWidth (myDrawer, theLineWidth);
785   myOwnWidth = theLineWidth;
786   LoadRecomputable (AIS_WireFrame); // means that it is necessary to recompute only the wireframe....
787   LoadRecomputable (2);             // and the bounding box...
788 }
789
790 //=======================================================================
791 //function : UnsetWidth
792 //purpose  :
793 //=======================================================================
794
795 void AIS_Shape::UnsetWidth()
796 {
797   if (myOwnWidth == 0.0)
798   {
799     myToRecomputeModes.Clear();
800     return;
801   }
802
803   myOwnWidth = 0.0;
804
805   Handle(Prs3d_LineAspect) anEmptyAsp;
806
807   if (!HasColor())
808   {
809     myDrawer->SetLineAspect          (anEmptyAsp);
810     myDrawer->SetWireAspect          (anEmptyAsp);
811     myDrawer->SetFreeBoundaryAspect  (anEmptyAsp);
812     myDrawer->SetUnFreeBoundaryAspect(anEmptyAsp);
813     myDrawer->SetSeenLineAspect      (anEmptyAsp);
814   }
815   else
816   {
817     myDrawer->LineAspect()          ->SetWidth (myDrawer->HasLink() ?
818       AIS_GraphicTool::GetLineWidth (myDrawer->Link(), AIS_TOA_Line) : 1.);
819     myDrawer->WireAspect()          ->SetWidth (myDrawer->HasLink() ?
820       AIS_GraphicTool::GetLineWidth (myDrawer->Link(), AIS_TOA_Wire) : 1.);
821     myDrawer->FreeBoundaryAspect()  ->SetWidth (myDrawer->HasLink() ?
822       AIS_GraphicTool::GetLineWidth (myDrawer->Link(), AIS_TOA_Free) : 1.);
823     myDrawer->UnFreeBoundaryAspect()->SetWidth (myDrawer->HasLink() ?
824       AIS_GraphicTool::GetLineWidth (myDrawer->Link(), AIS_TOA_UnFree) : 1.);
825     myDrawer->SeenLineAspect()      ->SetWidth (myDrawer->HasLink() ?
826       AIS_GraphicTool::GetLineWidth (myDrawer->Link(), AIS_TOA_Seen) : 1.);
827   }
828   LoadRecomputable (AIS_WireFrame);
829 }
830
831 //=======================================================================
832 //function : setMaterial
833 //purpose  :
834 //=======================================================================
835
836 void AIS_Shape::setMaterial (const Handle(Prs3d_Drawer)&     theDrawer,
837                              const Graphic3d_MaterialAspect& theMaterial,
838                              const Standard_Boolean          theToKeepColor,
839                              const Standard_Boolean          theToKeepTransp) const
840 {
841   const Quantity_Color aColor  = theDrawer->ShadingAspect()->Material     (myCurrentFacingModel).Color();
842   const Standard_Real  aTransp = theDrawer->ShadingAspect()->Transparency (myCurrentFacingModel);
843   if (!theDrawer->HasOwnShadingAspect())
844   {
845     theDrawer->SetShadingAspect (new Prs3d_ShadingAspect());
846     if (theDrawer->HasLink())
847     {
848       *theDrawer->ShadingAspect()->Aspect() = *theDrawer->Link()->ShadingAspect()->Aspect();
849     }
850   }
851   theDrawer->ShadingAspect()->SetMaterial (theMaterial, myCurrentFacingModel);
852
853   if (theToKeepColor)
854   {
855     theDrawer->ShadingAspect()->SetColor (aColor, myCurrentFacingModel);
856   }
857   if (theToKeepTransp)
858   {
859     theDrawer->ShadingAspect()->SetTransparency (aTransp, myCurrentFacingModel);
860   }
861 }
862
863 //=======================================================================
864 //function : SetMaterial
865 //purpose  : 
866 //=======================================================================
867
868 void AIS_Shape::SetMaterial(const Graphic3d_NameOfMaterial aMat)
869 {
870   SetMaterial(Graphic3d_MaterialAspect(aMat));
871 }
872
873 //=======================================================================
874 //function : SetMaterial
875 //purpose  :
876 //=======================================================================
877
878 void AIS_Shape::SetMaterial (const Graphic3d_MaterialAspect& theMat)
879 {
880   setMaterial (myDrawer, theMat, HasColor(), IsTransparent());
881   hasOwnMaterial = Standard_True;
882
883   // modify shading presentation without re-computation
884   const PrsMgr_Presentations&        aPrsList  = Presentations();
885   Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->ShadingAspect()->Aspect();
886   for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
887   {
888     const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
889     if (aPrsModed.Mode() != AIS_Shaded)
890     {
891       continue;
892     }
893
894     const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
895     aPrs->SetPrimitivesAspect (anAreaAsp);
896     for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
897     {
898       const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
899
900       // Check if aspect of given type is set for the group, 
901       // because setting aspect for group with no already set aspect
902       // can lead to loss of presentation data
903       if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
904       {
905         aGroup->SetGroupPrimitivesAspect (anAreaAsp);
906       }
907     }
908   }
909
910   myRecomputeEveryPrs = Standard_False; // no mode to recalculate  :only viewer update
911   myToRecomputeModes.Clear();
912 }
913
914 //=======================================================================
915 //function : UnsetMaterial
916 //purpose  :
917 //=======================================================================
918
919 void AIS_Shape::UnsetMaterial()
920 {
921   if (!HasMaterial())
922   {
923     return;
924   }
925
926   if (HasColor()
927    || IsTransparent())
928   {
929     if(myDrawer->HasLink())
930     {
931       myDrawer->ShadingAspect()->SetMaterial (myDrawer->Link()->ShadingAspect()->Material (myCurrentFacingModel),
932                                               myCurrentFacingModel);
933     }
934     if (HasColor())
935     {
936       myDrawer->ShadingAspect()->SetColor        (myOwnColor,     myCurrentFacingModel);
937       myDrawer->ShadingAspect()->SetTransparency (myTransparency, myCurrentFacingModel);
938     }
939   }
940   else
941   {
942     myDrawer->SetShadingAspect (Handle(Prs3d_ShadingAspect)());
943   }
944   hasOwnMaterial = Standard_False;
945
946   // modify shading presentation without re-computation
947   const PrsMgr_Presentations&        aPrsList  = Presentations();
948   Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->ShadingAspect()->Aspect();
949   for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
950   {
951     const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
952     if (aPrsModed.Mode() != AIS_Shaded)
953     {
954       continue;
955     }
956
957     const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
958     aPrs->SetPrimitivesAspect (anAreaAsp);
959     for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
960     {
961       const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
962       if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
963       {
964         aGroup->SetGroupPrimitivesAspect (anAreaAsp);
965       }
966     }
967   }
968
969   myRecomputeEveryPrs = Standard_False; // no mode to recalculate :only viewer update
970   myToRecomputeModes.Clear();  
971 }
972
973 //=======================================================================
974 //function : setTransparency
975 //purpose  :
976 //=======================================================================
977
978 void AIS_Shape::setTransparency (const Handle(Prs3d_Drawer)& theDrawer,
979                                  const Standard_Real         theValue) const
980 {
981   if (!theDrawer->HasOwnShadingAspect())
982   {
983     theDrawer->SetShadingAspect (new Prs3d_ShadingAspect());
984     if (theDrawer->HasLink())
985     {
986       *theDrawer->ShadingAspect()->Aspect() = *theDrawer->Link()->ShadingAspect()->Aspect();
987     }
988   }
989
990   // override transparency
991   theDrawer->ShadingAspect()->SetTransparency (theValue, myCurrentFacingModel);
992 }
993
994 //=======================================================================
995 //function : SetTransparency
996 //purpose  :
997 //=======================================================================
998
999 void AIS_Shape::SetTransparency (const Standard_Real theValue)
1000 {
1001   setTransparency (myDrawer, theValue);
1002   myTransparency = theValue;
1003
1004   // modify shading presentation without re-computation
1005   const PrsMgr_Presentations&        aPrsList  = Presentations();
1006   Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->ShadingAspect()->Aspect();
1007   for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
1008   {
1009     const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
1010     if (aPrsModed.Mode() != AIS_Shaded)
1011     {
1012       continue;
1013     }
1014
1015     const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
1016     aPrs->SetPrimitivesAspect (anAreaAsp);
1017     aPrs->SetDisplayPriority (10); // force highest priority for translucent objects
1018     for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
1019     {
1020       const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
1021       if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
1022       {
1023         aGroup->SetGroupPrimitivesAspect (anAreaAsp);
1024       }
1025     }
1026   }
1027
1028   myRecomputeEveryPrs = Standard_False; // no mode to recalculate - only viewer update
1029   myToRecomputeModes.Clear();
1030 }
1031
1032 //=======================================================================
1033 //function : UnsetTransparency
1034 //purpose  :
1035 //=======================================================================
1036
1037 void AIS_Shape::UnsetTransparency()
1038 {
1039   myTransparency = 0.0;
1040   if (!myDrawer->HasOwnShadingAspect())
1041   {
1042     return;
1043   }
1044   else if (HasColor() || HasMaterial())
1045   {
1046     myDrawer->ShadingAspect()->SetTransparency (0.0, myCurrentFacingModel);
1047   }
1048   else
1049   {
1050     myDrawer->SetShadingAspect (Handle(Prs3d_ShadingAspect)());
1051   }
1052
1053   // modify shading presentation without re-computation
1054   const PrsMgr_Presentations&        aPrsList  = Presentations();
1055   Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->ShadingAspect()->Aspect();
1056   for (Standard_Integer aPrsIt = 1; aPrsIt <= aPrsList.Length(); ++aPrsIt)
1057   {
1058     const PrsMgr_ModedPresentation& aPrsModed = aPrsList.Value (aPrsIt);
1059     if (aPrsModed.Mode() != AIS_Shaded)
1060     {
1061       continue;
1062     }
1063
1064     const Handle(Prs3d_Presentation)& aPrs = aPrsModed.Presentation()->Presentation();
1065     aPrs->SetPrimitivesAspect (anAreaAsp);
1066     for (Graphic3d_SequenceOfGroup::Iterator aGroupIt (aPrs->Groups()); aGroupIt.More(); aGroupIt.Next())
1067     {
1068       const Handle(Graphic3d_Group)& aGroup = aGroupIt.Value();
1069       if (aGroup->IsGroupPrimitivesAspectSet (Graphic3d_ASPECT_FILL_AREA))
1070       {
1071         aGroup->SetGroupPrimitivesAspect (anAreaAsp);
1072       }
1073     }
1074     aPrs->ResetDisplayPriority();
1075   }
1076
1077   myRecomputeEveryPrs = Standard_False; // no mode to recalculate :only viewer update
1078   myToRecomputeModes.Clear();
1079 }
1080
1081 //=======================================================================
1082 //function : LoadRecomputable
1083 //purpose  : 
1084 //=======================================================================
1085
1086 void AIS_Shape::LoadRecomputable(const Standard_Integer TheMode)
1087 {
1088   myRecomputeEveryPrs = Standard_False;
1089   if(!IsInList(myToRecomputeModes,TheMode))
1090     myToRecomputeModes.Append(TheMode);
1091 }
1092
1093 //=======================================================================
1094 //function : BoundingBox
1095 //purpose  : 
1096 //=======================================================================
1097
1098 const Bnd_Box& AIS_Shape::BoundingBox()  
1099 {
1100   if (myshape.ShapeType() == TopAbs_COMPOUND) {
1101     TopoDS_Iterator anExplor (myshape);
1102
1103     if (!anExplor.More()) { // empty Shape  -> empty Assembly.
1104       myBB.SetVoid();
1105       return myBB;
1106     }
1107   }
1108
1109   if(myCompBB) {
1110     BRepBndLib::AddClose(myshape, myBB);
1111     myCompBB = Standard_False;
1112   }
1113   return myBB;
1114 }
1115
1116 //*****
1117 //***** Reset
1118 //=======================================================================
1119 //function : SetOwnDeviationCoefficient
1120 //purpose  : resets myhasOwnDeviationCoefficient to Standard_False and
1121 //           returns Standard_True if it change
1122 //=======================================================================
1123
1124 Standard_Boolean AIS_Shape::SetOwnDeviationCoefficient ()
1125 {
1126   Standard_Boolean itSet = myDrawer->HasOwnDeviationCoefficient();
1127   if(itSet)  myDrawer->SetDeviationCoefficient();
1128   return itSet;
1129 }
1130
1131 //=======================================================================
1132 //function : SetHLROwnDeviationCoefficient
1133 //purpose  : resets myhasOwnHLRDeviationCoefficient to Standard_False and
1134 //           returns Standard_True if it change
1135 //=======================================================================
1136
1137 Standard_Boolean AIS_Shape::SetOwnHLRDeviationCoefficient ()
1138 {
1139   Standard_Boolean itSet = myDrawer->HasOwnHLRDeviationCoefficient();
1140   if(itSet)  myDrawer->SetHLRDeviationCoefficient();
1141   return itSet;
1142
1143 }
1144
1145 //=======================================================================
1146 //function : SetOwnDeviationAngle
1147 //purpose  : resets myhasOwnDeviationAngle to Standard_False and
1148 //           returns Standard_True if it change
1149 //=======================================================================
1150
1151 Standard_Boolean AIS_Shape::SetOwnDeviationAngle ()
1152 {
1153   Standard_Boolean itSet = myDrawer->HasOwnDeviationAngle();
1154   if(itSet)  myDrawer->SetDeviationAngle();
1155   return itSet;
1156
1157 }
1158
1159 //=======================================================================
1160 //function : SetOwnHLRDeviationAngle
1161 //purpose  : resets myhasOwnHLRDeviationAngle to Standard_False and
1162 //           returns Standard_True if it change
1163 //=======================================================================
1164
1165 Standard_Boolean AIS_Shape::SetOwnHLRDeviationAngle ()
1166 {
1167   Standard_Boolean itSet = myDrawer->HasOwnHLRDeviationAngle();
1168   if(itSet)  myDrawer->SetHLRAngle();
1169   return itSet;
1170
1171 }
1172 //***** SetOwn
1173 //=======================================================================
1174 //function : SetOwnDeviationCoefficient
1175 //purpose  : 
1176 //=======================================================================
1177
1178 void AIS_Shape::SetOwnDeviationCoefficient ( const Standard_Real  aCoefficient )
1179 {
1180   myDrawer->SetDeviationCoefficient( aCoefficient );
1181   SetToUpdate(0) ; // WireFrame
1182   SetToUpdate(1) ; // Shadding
1183 }
1184
1185 //=======================================================================
1186 //function : SetOwnHLRDeviationCoefficient
1187 //purpose  : 
1188 //=======================================================================
1189
1190 void AIS_Shape::SetOwnHLRDeviationCoefficient ( const Standard_Real  aCoefficient )
1191 {
1192   myDrawer->SetHLRDeviationCoefficient( aCoefficient );
1193   
1194 }
1195
1196 //=======================================================================
1197 //function : SetOwnDeviationAngle
1198 //purpose  : 
1199 //=======================================================================
1200
1201 void AIS_Shape::SetOwnDeviationAngle ( const Standard_Real  anAngle )
1202 {
1203
1204   myDrawer->SetDeviationAngle(anAngle );
1205   SetToUpdate(0) ;   // WireFrame
1206 }
1207 //=======================================================================
1208 //function : SetOwnDeviationAngle
1209 //purpose  : 
1210 //=======================================================================
1211
1212 void AIS_Shape::SetAngleAndDeviation ( const Standard_Real  anAngle )
1213 {
1214   Standard_Real OutAngl,OutDefl;
1215   HLRBRep::PolyHLRAngleAndDeflection(anAngle,OutAngl,OutDefl);
1216   SetOwnDeviationAngle(anAngle) ;
1217   SetOwnDeviationCoefficient(OutDefl) ;
1218   myInitAng = anAngle;
1219   SetToUpdate(0);
1220   SetToUpdate(1);
1221 }
1222
1223 //=======================================================================
1224 //function : UserAngle
1225 //purpose  : 
1226 //=======================================================================
1227
1228 Standard_Real AIS_Shape::UserAngle() const
1229 {
1230   return myInitAng ==0. ? GetContext()->DeviationAngle(): myInitAng;
1231 }
1232
1233
1234 //=======================================================================
1235 //function : SetHLRAngleAndDeviation
1236 //purpose  : 
1237 //=======================================================================
1238
1239 void AIS_Shape::SetHLRAngleAndDeviation ( const Standard_Real  anAngle )
1240 {
1241   Standard_Real OutAngl,OutDefl;
1242   HLRBRep::PolyHLRAngleAndDeflection(anAngle,OutAngl,OutDefl);
1243   SetOwnHLRDeviationAngle( OutAngl );
1244   SetOwnHLRDeviationCoefficient(OutDefl);
1245
1246 }
1247 //=======================================================================
1248 //function : SetOwnHLRDeviationAngle
1249 //purpose  : 
1250 //=======================================================================
1251
1252 void AIS_Shape::SetOwnHLRDeviationAngle ( const Standard_Real  anAngle )
1253 {
1254   myDrawer->SetHLRAngle( anAngle );
1255 }
1256
1257 //***** GetOwn
1258 //=======================================================================
1259 //function : OwnDeviationCoefficient
1260 //purpose  : 
1261 //=======================================================================
1262
1263 Standard_Boolean AIS_Shape::OwnDeviationCoefficient ( Standard_Real &  aCoefficient,
1264                                                       Standard_Real & aPreviousCoefficient ) const
1265 {
1266   aCoefficient = myDrawer->DeviationCoefficient();
1267   aPreviousCoefficient = myDrawer->PreviousDeviationCoefficient ();
1268   return myDrawer->HasOwnDeviationCoefficient() ;
1269 }
1270
1271 //=======================================================================
1272 //function : OwnHLRDeviationCoefficient
1273 //purpose  : 
1274 //=======================================================================
1275
1276 Standard_Boolean AIS_Shape::OwnHLRDeviationCoefficient ( Standard_Real & aCoefficient,
1277                                                          Standard_Real & aPreviousCoefficient ) const
1278 {
1279   aCoefficient = myDrawer->HLRDeviationCoefficient();
1280   aPreviousCoefficient = myDrawer->PreviousHLRDeviationCoefficient ();
1281   return myDrawer->HasOwnHLRDeviationCoefficient();
1282
1283 }
1284
1285 //=======================================================================
1286 //function : OwnDeviationAngle
1287 //purpose  : 
1288 //=======================================================================
1289
1290 Standard_Boolean AIS_Shape::OwnDeviationAngle ( Standard_Real &  anAngle,
1291                                                 Standard_Real & aPreviousAngle ) const
1292 {
1293   anAngle = myDrawer->DeviationAngle();
1294   aPreviousAngle = myDrawer->PreviousDeviationAngle (); 
1295   return myDrawer->HasOwnDeviationAngle();
1296 }
1297
1298 //=======================================================================
1299 //function : OwnHLRDeviationAngle
1300 //purpose  : 
1301 //=======================================================================
1302
1303 Standard_Boolean AIS_Shape::OwnHLRDeviationAngle ( Standard_Real &  anAngle,
1304                                                    Standard_Real & aPreviousAngle ) const
1305 {
1306   anAngle = myDrawer->HLRAngle();
1307   aPreviousAngle = myDrawer->PreviousHLRDeviationAngle (); 
1308   return myDrawer->HasOwnHLRDeviationAngle();
1309 }