7c3f35f3f8289eaa47aa014510c350e942dedb3a
[occt.git] / src / AIS / AIS_Shape.cxx
1 // File:        AIS_Shape.cxx
2 // Created:     Fri Dec 20 17:18:37 1996
3 // Author:      Robert COUBLANC
4 //              <rob@robox.paris1.matra-dtv.fr>
5
6 #define BUC60577        //GG_191099 Draw correct bounding box and Menage ...
7
8 #define BUC60547        //GG_091299 Enable to show a Shape of type COMPOUND
9
10 #define GER61351        //GG_171199     Enable to set an object RGB color
11 //              instead a restricted object NameOfColor. 
12 //              Redefines the Color(),Material(),Transparency() methods .
13 //              enable to get separately the shape attributes.
14
15 #define IMP040200       //GG Enable to compute selection after transformation
16
17 #define BUC60918        //GG 31/05/01 To avoid transparency bug between 
18 //                      transparent and non transparent objects, 
19 //                      increase display priority for transparent objects
20
21 #include <AIS_Shape.ixx>
22
23
24 #include <Standard_ErrorHandler.hxx>
25 #include <OSD_Timer.hxx>
26 #include <TColStd_ListIteratorOfListOfInteger.hxx>
27
28 #include <Quantity_Color.hxx>
29
30 #include <gp_Pnt.hxx>
31 #include <Bnd_Box.hxx>
32 #include <BRep_Builder.hxx>
33 #include <BRepTools_ShapeSet.hxx>
34 #include <BRepTools.hxx>
35 #include <BRepBndLib.hxx>
36 #include <TopExp.hxx>
37 #include <TopExp_Explorer.hxx>
38
39 #include <Aspect_TypeOfLine.hxx>
40 #include <Graphic3d_Structure.hxx>
41 #include <Graphic3d_Group.hxx>
42 #include <Graphic3d_AspectLine3d.hxx>
43 #include <Graphic3d_AspectText3d.hxx>
44 #include <Graphic3d_AspectMarker3d.hxx>
45 #include <Graphic3d_AspectFillArea3d.hxx>
46 #include <Graphic3d_Array1OfVertex.hxx>
47 #include <Graphic3d_ArrayOfPrimitives.hxx>
48 #include <Graphic3d_MaterialAspect.hxx>
49
50 #include <Prs3d_Presentation.hxx>
51 #include <Prs3d_Root.hxx>
52 #include <Prs3d_ShadingAspect.hxx>
53 #include <Prs3d_Drawer.hxx>
54 #include <Prs3d_IsoAspect.hxx>
55
56 //#include <StdPrs_WFSectionShape.hxx>
57 #include <StdPrs_WFShape.hxx>
58 #include <StdPrs_WFDeflectionShape.hxx>
59 #include <StdPrs_ShadedShape.hxx>
60 #include <StdPrs_HLRShape.hxx>
61 #include <StdPrs_HLRPolyShape.hxx>
62
63 #include <PrsMgr_ModedPresentation.hxx>
64
65 #include <Select3D_SensitiveEntity.hxx>
66 #include <StdSelect.hxx>
67 #include <StdSelect_BRepSelectionTool.hxx>
68 #include <StdSelect_BRepOwner.hxx>
69 #include <StdSelect_DisplayMode.hxx>
70
71 #include <AIS_GraphicTool.hxx>
72 #include <AIS_InteractiveContext.hxx>
73 #include <AIS_Drawer.hxx>
74 #include <HLRBRep.hxx>
75 #include <Precision.hxx>
76
77 #include <Standard_Failure.hxx>
78 #include <Standard_ErrorHandler.hxx>
79 #include <Select3D_SensitiveBox.hxx>
80 #ifdef BUC60547
81 #include <TopoDS_Iterator.hxx>
82 #endif
83
84 static Standard_Boolean myFirstCompute;
85
86 Standard_Real AIS_Shape::GetDeflection(const TopoDS_Shape& aShape,
87                                    const Handle(Prs3d_Drawer)& aDrawer)
88 {
89   // WARNING: this same piece of code appears several times in Prs3d classes
90   Standard_Real aDeflection;
91   if (aDrawer->TypeOfDeflection() == Aspect_TOD_RELATIVE) {
92     Bnd_Box B;
93     BRepBndLib::Add(aShape, B);
94     if ( ! B.IsVoid() )
95     {
96       Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
97       B.Get(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
98       aDeflection = Max( aXmax-aXmin, Max(aYmax-aYmin, aZmax-aZmin)) *
99                     aDrawer->DeviationCoefficient() * 4;
100     }
101     else
102       aDeflection = aDrawer->MaximalChordialDeviation();
103   }
104   else
105     aDeflection = aDrawer->MaximalChordialDeviation();
106   return aDeflection;
107 }
108
109 void AIS_Shape::DisplayBox(const Handle(Prs3d_Presentation)& aPrs,
110                        const Bnd_Box& B,
111                        const Handle(Prs3d_Drawer)& aDrawer)
112 {
113   Standard_Real X[2],Y[2],Z[2];
114   Standard_Integer Indx [16] ;
115   if ( B.IsVoid() )
116     return; // nothing to show
117
118 #ifdef BUC60577
119   Indx [0]=1;Indx [1]=2;Indx [2]=4;Indx [3]=3;
120   Indx [4]=5;Indx [5]=6;Indx [6]=8;Indx [7]=7;
121   Indx [8]=1;Indx [9]=3;Indx [10]=7;Indx [11]=5;
122   Indx [12]=2;Indx [13]=4;Indx [14]=8;Indx [15]=6;
123   B.Get(X[0], Y[0], Z[0], X[1], Y[1], Z[1]);
124 #else
125   Indx [0]=1;Indx [1]=2;Indx [2]=3;Indx [3]=4;Indx [4]=5;Indx [5]=6;Indx [6]=7;
126   Indx [7]=8;Indx [8]=1;Indx [9]=2;Indx [10]=6;Indx [10]=5;Indx [10]=3;
127   Indx [10]=4;Indx [10]=8;Indx [10]=7;
128   B.Get(X[1], Y[1], Z[1], X[2], Y[2], Z[2]);
129 #endif
130
131   Graphic3d_Array1OfVertex V(1,8);
132   Standard_Integer Rank(0);
133   for(Standard_Integer k=0;k<=1;k++)
134     for(Standard_Integer j=0;j<=1;j++)
135       for(Standard_Integer i=0;i<=1;i++)
136         V(++Rank) = Graphic3d_Vertex(X[i],Y[j],Z[k]);
137   
138   
139   Handle(Graphic3d_Group) G = Prs3d_Root::CurrentGroup(aPrs);
140   Quantity_Color Q;
141   Aspect_TypeOfLine A;
142   Standard_Real W;
143   aDrawer->LineAspect()->Aspect()->Values(Q,A,W);
144   
145
146   G->SetGroupPrimitivesAspect(new Graphic3d_AspectLine3d(Q,Aspect_TOL_DOTDASH,W));
147   
148   G->BeginPrimitives();Standard_Integer I,J;
149   Graphic3d_Array1OfVertex VVV (1,5);
150   for(I=1;I<=4;I++){
151     for(J=1;J<=4;J++){
152       VVV.SetValue(J,V(Indx[J+4*I-5]));
153     }
154     VVV.SetValue(5,VVV(1));
155     G->Polyline(VVV);
156   }
157   G->EndPrimitives();
158 }
159                      
160 static Standard_Boolean IsInList(const TColStd_ListOfInteger& LL, const Standard_Integer aMode)
161 {
162   TColStd_ListIteratorOfListOfInteger It(LL);
163   for(;It.More();It.Next()){
164     if(It.Value()==aMode) 
165       return Standard_True;}
166   return Standard_False;
167 }
168
169 //==================================================
170 // Function: 
171 // Purpose :
172 //==================================================
173
174 AIS_Shape::
175 AIS_Shape(const TopoDS_Shape& shap):
176 AIS_InteractiveObject(PrsMgr_TOP_ProjectorDependant),
177 myshape(shap),
178 myCompBB(Standard_True),
179 myInitAng(0.)
180 {
181   myFirstCompute = Standard_True;
182   SetHilightMode(0);
183   myDrawer->SetShadingAspectGlobal(Standard_False);
184 }
185
186 //=======================================================================
187 //function : Type
188 //purpose  : 
189 //=======================================================================
190 AIS_KindOfInteractive AIS_Shape::Type() const 
191 {return AIS_KOI_Shape;}
192
193
194 //=======================================================================
195 //function : Signature
196 //purpose  : 
197 //=======================================================================
198 Standard_Integer AIS_Shape::Signature() const 
199 {return 0;}
200
201 //=======================================================================
202 //function : AcceptShapeDecomposition
203 //purpose  : 
204 //=======================================================================
205 Standard_Boolean AIS_Shape::AcceptShapeDecomposition() const 
206 {return Standard_True;}
207
208 //=======================================================================
209 //function : Compute
210 //purpose  : 
211 //=======================================================================
212 void AIS_Shape::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aPresentationManager*/,
213                         const Handle(Prs3d_Presentation)& aPrs,
214                         const Standard_Integer aMode)
215 {  
216   aPrs->Clear();
217   if(myshape.IsNull()) return;
218
219   // wire,edge,vertex -> pas de HLR + priorite display superieure
220   Standard_Integer TheType = (Standard_Integer) myshape.ShapeType();
221   if(TheType>4 && TheType<8) {
222     aPrs->SetVisual(Graphic3d_TOS_ALL);
223     aPrs->SetDisplayPriority(TheType+2);
224   }
225   // Shape vide -> Assemblage vide.
226   if (myshape.ShapeType() == TopAbs_COMPOUND) {
227 #ifdef BUC60547
228     TopoDS_Iterator anExplor (myshape);
229 #else
230     TopExp_Explorer anExplor (myshape, TopAbs_VERTEX);
231 #endif
232     if (!anExplor.More()) {
233       return;
234     }
235   }
236   
237   
238   if (IsInfinite()) aPrs->SetInfiniteState(Standard_True); //not taken in account duting FITALL
239   switch (aMode) {
240   case 0:{
241     try { OCC_CATCH_SIGNALS  StdPrs_WFDeflectionShape::Add(aPrs,myshape,myDrawer); }
242     catch (Standard_Failure) { 
243 #ifdef DEB
244       cout << "AIS_Shape::Compute()  failed"<< endl;
245 #endif
246       cout << "a Shape should be incorrect : No Compute can be maked on it  "<< endl;     
247 // presentation of the bounding box is calculated
248 //      Compute(aPresentationManager,aPrs,2);
249     }
250     break;
251   }
252   case 1:
253     {
254       Standard_Real prevangle ;
255       Standard_Real newangle  ; 
256       Standard_Real prevcoeff ;
257       Standard_Real newcoeff  ; 
258       
259       
260       if (OwnDeviationAngle(newangle,prevangle) ||
261           OwnDeviationCoefficient(newcoeff,prevcoeff))
262         if (Abs (newangle - prevangle) > Precision::Angular() ||
263             Abs (newcoeff - prevcoeff) > Precision::Confusion()  ) { 
264 #ifdef DEB
265           cout << "AIS_Shape : compute"<<endl;
266           cout << "newangl   : " << newangle << " # de " << "prevangl  : " << prevangle << " OU "<<endl;
267           cout << "newcoeff  : " << newcoeff << " # de " << "prevcoeff : " << prevcoeff << endl;
268 #endif
269           BRepTools::Clean(myshape);
270         }
271       
272       //shading only on face...
273       if ((Standard_Integer) myshape.ShapeType()>4)
274         StdPrs_WFDeflectionShape::Add(aPrs,myshape,myDrawer);
275       else {
276         myDrawer->SetShadingAspectGlobal(Standard_False);
277         if (IsInfinite()) StdPrs_WFDeflectionShape::Add(aPrs,myshape,myDrawer);
278         else    {
279           {
280             try {
281               OCC_CATCH_SIGNALS
282               StdPrs_ShadedShape::Add(aPrs,myshape,myDrawer);
283             }
284             catch (Standard_Failure) {
285 #ifdef DEB
286               cout << "AIS_Shape::Compute() in ShadingMode failed"<< endl;
287 #endif
288               StdPrs_WFShape::Add(aPrs,myshape,myDrawer);
289             }
290           }
291         }
292       }
293 #ifdef BUC60918
294       Standard_Real value = Transparency() ;
295       if( value > 0. ) {
296         SetTransparency( value );
297       }
298 #endif
299       break;
300     }
301   case 2:
302     {
303       // bounding box
304       if (IsInfinite()) StdPrs_WFDeflectionShape::Add(aPrs,myshape,myDrawer);
305       else DisplayBox(aPrs,BoundingBox(),myDrawer);
306     }
307
308
309   } // end switch
310   aPrs->ReCompute(); // for hidden line recomputation if necessary...
311   
312 }
313
314 //=======================================================================
315 //function : Compute
316 //purpose  : 
317 //=======================================================================
318
319 void AIS_Shape::Compute(const Handle(PrsMgr_PresentationManager2d)& /*aPresentationManager*/,
320                         const Handle(Graphic2d_GraphicObject)& /*aGRO*/,
321                         const Standard_Integer /*aMode*/)
322 {
323 }
324
325 //=======================================================================
326 //function : Compute
327 //purpose  : Hidden Line Removal
328 //=======================================================================
329 void AIS_Shape::Compute(const Handle(Prs3d_Projector)& aProjector,
330                         const Handle(Prs3d_Presentation)& aPresentation)
331 {
332   Compute(aProjector,aPresentation,myshape);
333 }
334
335 //=======================================================================
336 //function : Compute
337 //purpose  : 
338 //=======================================================================
339
340 void AIS_Shape::Compute(const Handle(Prs3d_Projector)&     aProjector,
341                         const Handle(Geom_Transformation)& TheTrsf,
342                         const Handle(Prs3d_Presentation)&  aPresentation)
343 {
344   const TopLoc_Location& loc = myshape.Location();
345   TopoDS_Shape shbis = myshape.Located(TopLoc_Location(TheTrsf->Trsf())*loc);
346   Compute(aProjector,aPresentation,shbis);
347 }
348
349 //=======================================================================
350 //function : Compute
351 //purpose  : 
352 //=======================================================================
353
354 void AIS_Shape::Compute(const Handle(Prs3d_Projector)& aProjector,
355                         const Handle(Prs3d_Presentation)& aPresentation,
356                         const TopoDS_Shape& SH)
357 {
358   if (SH.ShapeType() == TopAbs_COMPOUND) {
359 #ifdef BUC60547
360     TopoDS_Iterator anExplor (SH);
361 #else
362     TopExp_Explorer anExplor (SH, TopAbs_VERTEX);
363 #endif
364     if (!anExplor.More()) // Shape vide -> Assemblage vide.
365       return;
366   }
367   
368   Handle (Prs3d_Drawer) defdrawer = GetContext()->DefaultDrawer();
369   if (defdrawer->DrawHiddenLine()) 
370     {myDrawer->EnableDrawHiddenLine();}
371   else {myDrawer->DisableDrawHiddenLine();}
372   
373   Aspect_TypeOfDeflection prevdef = defdrawer->TypeOfDeflection();
374   defdrawer->SetTypeOfDeflection(Aspect_TOD_RELATIVE);
375
376 // coefficients for calculation
377
378   Standard_Real prevangle, newangle ,prevcoeff,newcoeff ; 
379   if (OwnHLRDeviationAngle(newangle,prevangle) || OwnHLRDeviationCoefficient(newcoeff, prevcoeff))
380       
381     if (Abs (newangle - prevangle) > Precision::Angular() ||
382         Abs (newcoeff - prevcoeff) > Precision::Confusion()  ) { 
383 #ifdef DEB
384       cout << "AIS_Shape : compute"<<endl;
385       cout << "newangle  : " << newangle << " # de " << "prevangl  : " << prevangle << " OU "<<endl;
386       cout << "newcoeff  : " << newcoeff << " # de " << "prevcoeff : " << prevcoeff << endl;
387 #endif
388       BRepTools::Clean(SH);
389     }
390   
391   {
392     try {
393       OCC_CATCH_SIGNALS
394       StdPrs_HLRPolyShape::Add(aPresentation,SH,myDrawer,aProjector);
395     }
396     catch (Standard_Failure) {
397 #ifdef DEB
398       cout <<"AIS_Shape::Compute(Proj) HLR Algorithm failed" << endl;
399 #endif
400       StdPrs_WFShape::Add(aPresentation,SH,myDrawer);
401     }
402   }
403
404   
405   defdrawer->SetTypeOfDeflection (prevdef);
406 }
407
408 //=======================================================================
409 //function : SelectionType
410 //purpose  : gives the type according to the Index of Selection Mode
411 //=======================================================================
412
413 TopAbs_ShapeEnum AIS_Shape::SelectionType(const Standard_Integer aMode)
414 {
415   switch(aMode){
416   case 1:
417     return TopAbs_VERTEX;
418   case 2:
419     return TopAbs_EDGE;
420   case 3:
421     return TopAbs_WIRE;
422   case 4:
423     return TopAbs_FACE;
424   case 5:
425     return TopAbs_SHELL;
426   case 6:
427     return TopAbs_SOLID;
428   case 7:
429     return TopAbs_COMPSOLID;
430   case 8:
431     return TopAbs_COMPOUND;
432   case 0:
433   default:
434     return TopAbs_SHAPE;
435   }
436   
437 }
438 //=======================================================================
439 //function : SelectionType
440 //purpose  : gives the SelectionMode according to the Type od Decomposition...
441 //=======================================================================
442 Standard_Integer AIS_Shape::SelectionMode(const TopAbs_ShapeEnum aType)
443 {
444   switch(aType){
445   case TopAbs_VERTEX:
446     return 1;
447   case TopAbs_EDGE:
448     return 2;
449   case TopAbs_WIRE:
450     return 3;
451   case  TopAbs_FACE:
452     return 4;
453   case TopAbs_SHELL:
454     return 5;
455   case TopAbs_SOLID:
456     return 6;
457   case TopAbs_COMPSOLID:
458     return 7;
459   case TopAbs_COMPOUND:
460     return 8;
461   case TopAbs_SHAPE:
462   default:
463     return 0;
464   }
465 }
466
467
468 //=======================================================================
469 //function : ComputeSelection
470 //purpose  : 
471 //=======================================================================
472
473 void AIS_Shape::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection,
474                  const Standard_Integer aMode)
475 {
476   if(myshape.IsNull()) return;
477   if (myshape.ShapeType() == TopAbs_COMPOUND) {
478 #ifdef BUC60547
479     TopoDS_Iterator anExplor (myshape);
480 #else
481     TopExp_Explorer anExplor (myshape, TopAbs_VERTEX);
482 #endif
483     if (!anExplor.More()) // empty Shape -> empty Assembly.
484       return;
485   }
486
487   static TopAbs_ShapeEnum TypOfSel;
488   TypOfSel = AIS_Shape::SelectionType(aMode);
489   TopoDS_Shape shape = myshape;
490 #ifdef IMP040200
491   if( HasTransformation() ) {
492     Handle(Geom_Transformation) trsf = Transformation();
493     shape = shape.Located(TopLoc_Location(trsf->Trsf())*shape.Location());
494   }
495 #endif
496
497 // POP protection against crash in low layers
498
499   Standard_Real aDeflection = myDrawer->MaximalChordialDeviation();
500   if (myDrawer->TypeOfDeflection() == Aspect_TOD_RELATIVE)
501   {
502     // Vector is calculated depending on global min max of the part:
503     Bnd_Box aBndBox; //= BoundingBox(); ?
504     BRepBndLib::Add (shape, aBndBox);
505     if (!aBndBox.IsVoid())
506     {
507       Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
508       aBndBox.Get (aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
509       aDeflection = Max (aXmax - aXmin, Max (aYmax - aYmin, aZmax - aZmin)) * myDrawer->DeviationCoefficient();
510     }
511   }
512
513   Standard_Boolean autoTriangulation = Standard_True;
514   try {  
515     OCC_CATCH_SIGNALS
516     StdSelect_BRepSelectionTool::Load(aSelection,
517                                       this,
518                                       shape,
519                                       TypOfSel,
520                                       aDeflection,
521                                       myDrawer->DeviationAngle(),
522                                       autoTriangulation); 
523   } catch ( Standard_Failure ) {
524 //    cout << "a Shape should be incorrect : A Selection on the Bnd  is activated   "<<endl;
525     if ( aMode == 0 ) {
526       Bnd_Box B = BoundingBox();
527       Handle(StdSelect_BRepOwner) aOwner = new StdSelect_BRepOwner(shape,this);
528       Handle(Select3D_SensitiveBox) aSensitiveBox = new Select3D_SensitiveBox(aOwner,B);
529       aSelection->Add(aSensitiveBox);
530     }
531   }
532
533   // insert the drawer in the BrepOwners for hilight...
534   StdSelect::SetDrawerForBRepOwner(aSelection,myDrawer);
535 }
536
537 #ifdef GER61351
538 Quantity_NameOfColor AIS_Shape::Color() const {
539 Quantity_Color aColor;
540   Color(aColor);
541   return aColor.Name();
542 }
543
544 void AIS_Shape::Color( Quantity_Color& aColor ) const {
545   aColor = myDrawer->ShadingAspect()->Color(myCurrentFacingModel);
546 }
547
548 Graphic3d_NameOfMaterial AIS_Shape::Material() const {
549   return (myDrawer->ShadingAspect()->Material(myCurrentFacingModel)).Name();
550 }
551
552 Standard_Real AIS_Shape::Transparency() const {
553   return myDrawer->ShadingAspect()->Transparency(myCurrentFacingModel);
554 }
555 #endif
556
557 //=======================================================================
558 //function : SetColor
559 //purpose  : 
560 //=======================================================================
561
562 void AIS_Shape::SetColor(const Quantity_NameOfColor aCol)
563 #ifdef GER61351
564 {
565   SetColor(Quantity_Color(aCol));
566 }
567
568 void AIS_Shape::SetColor(const Quantity_Color &aCol)
569 #endif
570 {
571   hasOwnColor = Standard_True;
572 #ifdef GER61351
573   if( !HasColor() && !IsTransparent() && !HasMaterial() ) {
574         myDrawer->SetShadingAspect(new Prs3d_ShadingAspect());
575   }
576 #else
577   myOwnColor  = aCol; 
578   if(!myDrawer->HasShadingAspect()){
579     Handle(Prs3d_ShadingAspect) asp = new Prs3d_ShadingAspect();
580 // retrieve the reference materials...
581     if(myDrawer->HasLink()){
582       const Handle(Prs3d_Drawer)& refdr = myDrawer->Link();
583       Graphic3d_MaterialAspect theRefMat = 
584         refdr->ShadingAspect()->Aspect()->FrontMaterial();
585       theRefMat.SetTransparency(myTransparency);
586       asp->SetMaterial(theRefMat);
587     }   
588     
589     myDrawer->SetShadingAspect(asp);
590   } 
591 #endif
592
593 #ifdef GER61351
594   myDrawer->ShadingAspect()->SetColor(aCol,myCurrentFacingModel);
595 #else
596   myDrawer->ShadingAspect()->SetColor(aCol);
597 #endif
598   myDrawer->SetShadingAspectGlobal(Standard_False);
599     
600   Standard_Real WW = HasWidth()? Width():AIS_GraphicTool::GetLineWidth(myDrawer->Link(),AIS_TOA_Line);
601
602   myDrawer->SetLineAspect(new Prs3d_LineAspect(aCol,Aspect_TOL_SOLID,WW));
603   myDrawer->SetWireAspect(new Prs3d_LineAspect(aCol,Aspect_TOL_SOLID,WW));
604   myDrawer->SetFreeBoundaryAspect(new Prs3d_LineAspect(aCol,Aspect_TOL_SOLID,WW));
605   myDrawer->SetUnFreeBoundaryAspect(new Prs3d_LineAspect(aCol,Aspect_TOL_SOLID,WW));
606   myDrawer->SetSeenLineAspect(new Prs3d_LineAspect(aCol,Aspect_TOL_SOLID,WW));
607
608   // fast shading modification...
609   if(!GetContext().IsNull()){
610     if( GetContext()->MainPrsMgr()->HasPresentation(this,1)){
611       Handle(Prs3d_Presentation) P = GetContext()->MainPrsMgr()->CastPresentation(this,1)->Presentation();
612       Handle(Graphic3d_Group) G = Prs3d_Root::CurrentGroup(P);
613       Handle(Graphic3d_AspectFillArea3d) a4bis = myDrawer->ShadingAspect()->Aspect();
614 #ifdef BUC60577
615       P->SetPrimitivesAspect(a4bis);
616       G->SetGroupPrimitivesAspect(a4bis);
617 #else
618       a4bis->SetInteriorColor(Quantity_Color(aCol)); // Already done above in SetColor(...)     
619
620       P->SetPrimitivesAspect(myDrawer->ShadingAspect()->Aspect());
621       G->SetGroupPrimitivesAspect(myDrawer->ShadingAspect()->Aspect());
622 #endif
623     }  
624   }
625
626   LoadRecomputable(0);
627   LoadRecomputable(2); 
628 }
629 //=======================================================================
630 //function : UnsetColor
631 //purpose  : 
632 //=======================================================================
633
634 void AIS_Shape::UnsetColor()
635 {
636   if(!HasColor() ){  myToRecomputeModes.Clear();
637                      return;}
638   
639   hasOwnColor = Standard_False;
640
641   Handle(Prs3d_LineAspect) NullAsp;
642   Handle(Prs3d_ShadingAspect) NullShA;
643   
644   if(!HasWidth()){
645     myDrawer->SetLineAspect(NullAsp);
646     myDrawer->SetWireAspect(NullAsp);
647     myDrawer->SetFreeBoundaryAspect(NullAsp);
648     myDrawer->SetUnFreeBoundaryAspect(NullAsp);
649     myDrawer->SetSeenLineAspect(NullAsp);
650   }
651   else{
652 #ifdef GER61351
653     Quantity_Color CC;
654     AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Line,CC);
655     myDrawer->LineAspect()->SetColor(CC);
656     AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Wire,CC);
657     myDrawer->WireAspect()->SetColor(CC);
658     AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Free,CC);
659     myDrawer->FreeBoundaryAspect()->SetColor(CC);
660     AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_UnFree,CC);
661     myDrawer->UnFreeBoundaryAspect()->SetColor(CC);
662     AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Seen,CC);
663     myDrawer->SeenLineAspect()->SetColor(CC);
664 #else
665     myDrawer->LineAspect()->SetColor(AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Line));
666     myDrawer->WireAspect()->SetColor(AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Wire));
667     myDrawer->FreeBoundaryAspect()->SetColor(AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Free));
668     myDrawer->UnFreeBoundaryAspect()->SetColor(AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_UnFree));
669     myDrawer->SeenLineAspect()->SetColor(AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Seen));
670 #endif
671   }
672   
673   if(myDrawer->HasShadingAspect()){
674     myDrawer->SetShadingAspect(NullShA);
675   }    
676   
677   if(!GetContext().IsNull()){
678     if(GetContext()->MainPrsMgr()->HasPresentation(this,1)){
679       Handle(Prs3d_Presentation) P = GetContext()->MainPrsMgr()->CastPresentation(this,1)->Presentation();
680       Handle(Graphic3d_Group) G = Prs3d_Root::CurrentGroup(P);
681       
682       Handle(Graphic3d_AspectFillArea3d) a4bis = myDrawer->Link()->ShadingAspect()->Aspect();
683 #ifdef GER61351
684       Quantity_Color CC;
685       AIS_GraphicTool::GetInteriorColor(myDrawer->Link(),CC);
686       a4bis->SetInteriorColor(CC);
687 #else
688       Quantity_NameOfColor KOL = AIS_GraphicTool::GetInteriorColor(myDrawer->Link());
689       a4bis->SetInteriorColor(Quantity_Color(KOL));
690 #endif
691       P->SetPrimitivesAspect(a4bis);
692       G->SetGroupPrimitivesAspect(a4bis);
693     }
694 }
695   LoadRecomputable(0);
696   LoadRecomputable(2);
697   
698 }
699
700
701 //=======================================================================
702 //function : SetWidth
703 //purpose  : 
704 //=======================================================================
705
706 void AIS_Shape::SetWidth(const Standard_Real W)
707 {
708   if(HasColor() || HasWidth()){ 
709     myDrawer->LineAspect()->SetWidth(W);
710     myDrawer->WireAspect()->SetWidth(W);
711     myDrawer->FreeBoundaryAspect()->SetWidth(W);
712     myDrawer->UnFreeBoundaryAspect()->SetWidth(W);
713     myDrawer->SeenLineAspect()->SetWidth(W);
714   }
715   else{
716 #ifdef GER61351
717     Quantity_Color CC;
718     AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Line,CC);
719     myDrawer->SetLineAspect(new Prs3d_LineAspect(CC,Aspect_TOL_SOLID,W));
720     AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Wire,CC);
721     myDrawer->SetWireAspect(new Prs3d_LineAspect(CC,Aspect_TOL_SOLID,W));
722     AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Free,CC);
723     myDrawer->SetFreeBoundaryAspect(new Prs3d_LineAspect(CC,Aspect_TOL_SOLID,W));
724     AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_UnFree,CC);
725     myDrawer->SetUnFreeBoundaryAspect(new Prs3d_LineAspect(CC,Aspect_TOL_SOLID,W));
726     AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Seen,CC);
727     myDrawer->SetSeenLineAspect(new Prs3d_LineAspect(CC,Aspect_TOL_SOLID,W));
728 #else
729     Quantity_NameOfColor KOL = AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Line);
730     myDrawer->SetLineAspect(new Prs3d_LineAspect(KOL,Aspect_TOL_SOLID,W));
731
732     KOL = AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Wire);
733     myDrawer->SetWireAspect(new Prs3d_LineAspect(KOL,Aspect_TOL_SOLID,W));
734
735     KOL = AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Free);
736     myDrawer->SetFreeBoundaryAspect(new Prs3d_LineAspect(KOL,Aspect_TOL_SOLID,W));
737
738     KOL = AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_UnFree);
739     myDrawer->SetUnFreeBoundaryAspect(new Prs3d_LineAspect(KOL,Aspect_TOL_SOLID,W));
740
741     KOL = AIS_GraphicTool::GetLineColor(myDrawer->Link(),AIS_TOA_Seen);
742     myDrawer->SetSeenLineAspect(new Prs3d_LineAspect(KOL,Aspect_TOL_SOLID,W));
743 #endif    
744   }
745   myOwnWidth = W;
746   LoadRecomputable(0); // means that it is necessary to recompute only the wireframe....
747   LoadRecomputable(2); // and the bounding box...
748   
749 }
750
751 //=======================================================================
752 //function : UnsetWidth
753 //purpose  : 
754 //=======================================================================
755
756 void AIS_Shape::UnsetWidth()
757 {
758   if(myOwnWidth== 0.0){  myToRecomputeModes.Clear();
759                       return;}
760   myOwnWidth=0.0;
761   Handle(Prs3d_LineAspect) NullAsp;
762   
763   if(!HasColor()){
764     myDrawer->SetLineAspect(NullAsp);
765     myDrawer->SetWireAspect(NullAsp);
766     myDrawer->SetFreeBoundaryAspect(NullAsp);
767     myDrawer->SetUnFreeBoundaryAspect(NullAsp);
768     myDrawer->SetSeenLineAspect(NullAsp);
769   }
770   else{
771     myDrawer->LineAspect()->SetWidth(AIS_GraphicTool::GetLineWidth(myDrawer->Link(),AIS_TOA_Line));
772     myDrawer->WireAspect()->SetWidth(AIS_GraphicTool::GetLineWidth(myDrawer->Link(),AIS_TOA_Wire));
773     myDrawer->FreeBoundaryAspect()->SetWidth(AIS_GraphicTool::GetLineWidth(myDrawer->Link(),AIS_TOA_Free));
774     myDrawer->UnFreeBoundaryAspect()->SetWidth(AIS_GraphicTool::GetLineWidth(myDrawer->Link(),AIS_TOA_UnFree));
775     myDrawer->SeenLineAspect()->SetWidth(AIS_GraphicTool::GetLineWidth(myDrawer->Link(),AIS_TOA_Seen));
776   }
777   LoadRecomputable(0);
778 }
779
780
781 //=======================================================================
782 //function : SetMaterial
783 //purpose  : 
784 //=======================================================================
785 void AIS_Shape::SetMaterial(const Graphic3d_NameOfMaterial aMat)
786 {
787 #ifdef GER61351
788   if( !HasColor() && !IsTransparent() && !HasMaterial() ) {
789         myDrawer->SetShadingAspect(new Prs3d_ShadingAspect());
790   }
791   myDrawer->ShadingAspect()->SetMaterial(aMat,myCurrentFacingModel);
792   hasOwnMaterial = Standard_True;
793 #else
794   AIS_InteractiveObject::SetMaterial(aMat);
795 #endif
796   if(!GetContext().IsNull()){
797     if(GetContext()->MainPrsMgr()->HasPresentation(this,1)){
798       Handle(Prs3d_Presentation) P = GetContext()->MainPrsMgr()->CastPresentation(this,1)->Presentation();
799       Handle(Graphic3d_Group) G = Prs3d_Root::CurrentGroup(P);
800       
801       Handle(Graphic3d_AspectFillArea3d) a4bis = myDrawer->ShadingAspect()->Aspect();
802       P->SetPrimitivesAspect(a4bis);
803       G->SetGroupPrimitivesAspect(a4bis);
804     }
805   }
806   myRecomputeEveryPrs =Standard_False; // no mode to recalculate :only viewer update
807   myToRecomputeModes.Clear();  
808 }
809 //=======================================================================
810 //function : SetMaterial
811 //purpose  : 
812 //=======================================================================
813 void AIS_Shape::SetMaterial(const Graphic3d_MaterialAspect& aMat)
814 {
815 #ifdef GER61351
816   if( !HasColor() && !IsTransparent() && !HasMaterial() ) {
817         myDrawer->SetShadingAspect(new Prs3d_ShadingAspect());
818   }
819   myDrawer->ShadingAspect()->SetMaterial(aMat,myCurrentFacingModel);
820   hasOwnMaterial = Standard_True;
821 #else
822   AIS_InteractiveObject::SetMaterial(aMat);
823 #endif  
824   if(!GetContext().IsNull()){
825   if(GetContext()->MainPrsMgr()->HasPresentation(this,1)){
826     Handle(Prs3d_Presentation) P = GetContext()->MainPrsMgr()->CastPresentation(this,1)->Presentation();
827     Handle(Graphic3d_Group) G = Prs3d_Root::CurrentGroup(P);
828     
829     Handle(Graphic3d_AspectFillArea3d) a4bis = myDrawer->ShadingAspect()->Aspect();
830     P->SetPrimitivesAspect(a4bis);
831     G->SetGroupPrimitivesAspect(a4bis);
832   }
833 }
834   myRecomputeEveryPrs =Standard_False; // no mode to recalculate  :only viewer update
835   myToRecomputeModes.Clear();  
836 }
837
838 //=======================================================================
839 //function : UnsetMaterial
840 //purpose  : 
841 //=======================================================================
842 void AIS_Shape::UnsetMaterial()
843 {
844 #ifdef GER61351
845   if( !HasMaterial() ) return;
846   if( HasColor() || IsTransparent()) {
847     Graphic3d_MaterialAspect mat = AIS_GraphicTool::GetMaterial(myDrawer->Link()); 
848     if( HasColor() ) {
849         Quantity_Color color = myDrawer->ShadingAspect()->Color(myCurrentFacingModel);
850       mat.SetColor(color);
851     }
852     if( IsTransparent() ) {
853         Standard_Real trans = myDrawer->ShadingAspect()->Transparency(myCurrentFacingModel);
854       mat.SetTransparency(trans);
855     }
856     myDrawer->ShadingAspect()->SetMaterial(mat,myCurrentFacingModel);
857   } else {
858     Handle(Prs3d_ShadingAspect) SA;
859     myDrawer->SetShadingAspect(SA);
860   }
861   hasOwnMaterial = Standard_False;
862 #else
863   AIS_InteractiveObject::UnsetMaterial();
864 #endif
865   if(!GetContext().IsNull()){
866
867     if(GetContext()->MainPrsMgr()->HasPresentation(this,1)){
868       Handle(Prs3d_Presentation) P = GetContext()->MainPrsMgr()->CastPresentation(this,1)->Presentation();
869       Handle(Graphic3d_Group) G = Prs3d_Root::CurrentGroup(P);
870       
871       Handle(Graphic3d_AspectFillArea3d) a4bis = myDrawer->ShadingAspect()->Aspect();
872       P->SetPrimitivesAspect(a4bis);
873       G->SetGroupPrimitivesAspect(a4bis);
874     }
875   }
876   myRecomputeEveryPrs =Standard_False; // no mode to recalculate :only viewer update
877   myToRecomputeModes.Clear();  
878   
879 }
880 //=======================================================================
881 //function : SetTransparency
882 //purpose  : 
883 //=======================================================================
884
885 void AIS_Shape::SetTransparency(const Standard_Real AValue)
886 {
887 #ifdef GER61351
888   if(!HasColor() && !HasMaterial() ) {
889         myDrawer->SetShadingAspect(new Prs3d_ShadingAspect());
890   }
891   myDrawer->ShadingAspect()->SetTransparency(AValue,myCurrentFacingModel);
892   myTransparency = AValue;
893 #else
894   AIS_InteractiveObject::SetTransparency(AValue);
895 #endif  
896   if(!GetContext().IsNull()){
897     if(GetContext()->MainPrsMgr()->HasPresentation(this,1)){
898       Handle(Prs3d_Presentation) P = GetContext()->MainPrsMgr()->CastPresentation(this,1)->Presentation();
899       Handle(Graphic3d_Group) G = Prs3d_Root::CurrentGroup(P);
900       
901       Handle(Graphic3d_AspectFillArea3d) a4bis = myDrawer->ShadingAspect()->Aspect();
902       P->SetPrimitivesAspect(a4bis);
903 #ifdef BUC60918         //force highest priority for transparent objects
904       P->SetDisplayPriority(10);        
905 #endif
906       G->SetGroupPrimitivesAspect(a4bis);
907     }
908   }
909   myRecomputeEveryPrs =Standard_False; // no mode to recalculate :only viewer update
910   myToRecomputeModes.Clear();  
911   
912 }
913
914 //=======================================================================
915 //function : UnsetTransparency
916 //purpose  : 
917 //=======================================================================
918 void AIS_Shape::UnsetTransparency()
919 {
920 #ifdef GER61351
921   if(HasColor() || HasMaterial() ) {
922     myDrawer->ShadingAspect()->SetTransparency(0.0,myCurrentFacingModel);
923   } else {
924     Handle(Prs3d_ShadingAspect) SA;
925     myDrawer->SetShadingAspect(SA);
926   }
927   myTransparency = 0.0;
928 #else
929   AIS_InteractiveObject::UnsetTransparency();
930 #endif
931   if(!GetContext().IsNull()){
932     
933     if(GetContext()->MainPrsMgr()->HasPresentation(this,1)){
934       Handle(Prs3d_Presentation) P = GetContext()->MainPrsMgr()->CastPresentation(this,1)->Presentation();
935       Handle(Graphic3d_Group) G = Prs3d_Root::CurrentGroup(P);
936       
937       Handle(Graphic3d_AspectFillArea3d) a4bis = myDrawer->ShadingAspect()->Aspect();
938       P->SetPrimitivesAspect(a4bis);
939       G->SetGroupPrimitivesAspect(a4bis);
940 #ifdef BUC60918 
941       P->ResetDisplayPriority();
942 #endif
943     }
944   }
945   myRecomputeEveryPrs =Standard_False; // no mode to recalculate :only viewer update
946   myToRecomputeModes.Clear();  
947 }
948
949
950 void AIS_Shape::LoadRecomputable(const Standard_Integer TheMode)
951 {
952   myRecomputeEveryPrs =Standard_False;
953   if(!IsInList(myToRecomputeModes,TheMode))
954     myToRecomputeModes.Append(TheMode);
955 }
956
957
958
959 //=======================================================================
960 //function : BoundingBox
961 //purpose  : 
962 //=======================================================================
963
964 const Bnd_Box& AIS_Shape::BoundingBox()  
965 {
966   if (myshape.ShapeType() == TopAbs_COMPOUND) {
967 #ifdef BUC60547
968     TopoDS_Iterator anExplor (myshape);
969 #else
970     TopExp_Explorer anExplor (myshape, TopAbs_VERTEX);
971 #endif
972     if (!anExplor.More()) { // empty Shape  -> empty Assembly.
973       myBB.SetVoid();      
974       return myBB;
975     }
976   }
977
978   if(myCompBB) {
979     BRepBndLib::AddClose(myshape, myBB);
980     myCompBB = Standard_False;    
981   }
982   return myBB;
983 }
984
985 //*****
986 //***** Reset
987 //=======================================================================
988 //function : SetOwnDeviationCoefficient
989 //purpose  : resets myhasOwnDeviationCoefficient to Standard_False and
990 //           returns Standard_True if it change
991 //=======================================================================
992
993 Standard_Boolean AIS_Shape::SetOwnDeviationCoefficient ()
994 {
995   Standard_Boolean itSet = myDrawer->IsOwnDeviationCoefficient();
996   if(itSet)  myDrawer->SetDeviationCoefficient();
997   return itSet;
998
999 }
1000
1001
1002 //=======================================================================
1003 //function : SetHLROwnDeviationCoefficient
1004 //purpose  : resets myhasOwnHLRDeviationCoefficient to Standard_False and
1005 //           returns Standard_True if it change
1006 //=======================================================================
1007
1008 Standard_Boolean AIS_Shape::SetOwnHLRDeviationCoefficient ()
1009 {
1010   Standard_Boolean itSet = myDrawer->IsOwnHLRDeviationCoefficient();
1011   if(itSet)  myDrawer->SetHLRDeviationCoefficient();
1012   return itSet;
1013
1014 }
1015
1016 //=======================================================================
1017 //function : SetOwnDeviationAngle
1018 //purpose  : resets myhasOwnDeviationAngle to Standard_False and
1019 //           returns Standard_True if it change
1020 //=======================================================================
1021
1022 Standard_Boolean AIS_Shape::SetOwnDeviationAngle ()
1023 {
1024   Standard_Boolean itSet = myDrawer->IsOwnDeviationAngle();
1025   if(itSet)  myDrawer->SetDeviationAngle();
1026   return itSet;
1027
1028 }
1029
1030 //=======================================================================
1031 //function : SetOwnHLRDeviationAngle
1032 //purpose  : resets myhasOwnHLRDeviationAngle to Standard_False and
1033 //           returns Standard_True if it change
1034 //=======================================================================
1035
1036 Standard_Boolean AIS_Shape::SetOwnHLRDeviationAngle ()
1037 {
1038   Standard_Boolean itSet = myDrawer->IsOwnHLRDeviationAngle();
1039   if(itSet)  myDrawer->SetHLRAngle();
1040   return itSet;
1041
1042 }
1043 //***** SetOwn
1044 //=======================================================================
1045 //function : SetOwnDeviationCoefficient
1046 //purpose  : 
1047 //=======================================================================
1048
1049 void AIS_Shape::SetOwnDeviationCoefficient ( const Standard_Real  aCoefficient )
1050 {
1051   myDrawer->SetDeviationCoefficient( aCoefficient );
1052   SetToUpdate(0) ; // WireFrame
1053   SetToUpdate(1) ; // Shadding
1054 }
1055
1056 //=======================================================================
1057 //function : SetOwnHLRDeviationCoefficient
1058 //purpose  : 
1059 //=======================================================================
1060
1061 void AIS_Shape::SetOwnHLRDeviationCoefficient ( const Standard_Real  aCoefficient )
1062 {
1063   myDrawer->SetHLRDeviationCoefficient( aCoefficient );
1064   
1065 }
1066
1067 //=======================================================================
1068 //function : SetOwnDeviationAngle
1069 //purpose  : 
1070 //=======================================================================
1071
1072 void AIS_Shape::SetOwnDeviationAngle ( const Standard_Real  anAngle )
1073 {
1074
1075   myDrawer->SetDeviationAngle(anAngle );
1076   SetToUpdate(0) ;   // WireFrame
1077 }
1078 //=======================================================================
1079 //function : SetOwnDeviationAngle
1080 //purpose  : 
1081 //=======================================================================
1082
1083 void AIS_Shape::SetAngleAndDeviation ( const Standard_Real  anAngle )
1084 {
1085   Standard_Real OutAngl,OutDefl;
1086   HLRBRep::PolyHLRAngleAndDeflection(anAngle,OutAngl,OutDefl);
1087   SetOwnDeviationAngle(anAngle) ;
1088 //  SetOwnDeviationAngle(OutAngl) ;
1089   SetOwnDeviationCoefficient(OutDefl) ;
1090   myInitAng = anAngle;
1091   SetToUpdate(0);
1092   SetToUpdate(1);
1093 }
1094
1095 //=======================================================================
1096 //function : UserAngle
1097 //purpose  : 
1098 //=======================================================================
1099
1100 Standard_Real AIS_Shape::UserAngle() const
1101 {
1102   return myInitAng ==0. ? GetContext()->DeviationAngle(): myInitAng;
1103 }
1104
1105
1106 //=======================================================================
1107 //function : SetHLRAngleAndDeviation
1108 //purpose  : 
1109 //=======================================================================
1110
1111 void AIS_Shape::SetHLRAngleAndDeviation ( const Standard_Real  anAngle )
1112 {
1113   Standard_Real OutAngl,OutDefl;
1114   HLRBRep::PolyHLRAngleAndDeflection(anAngle,OutAngl,OutDefl);
1115   SetOwnHLRDeviationAngle( OutAngl );
1116   SetOwnHLRDeviationCoefficient(OutDefl);
1117
1118 }
1119 //=======================================================================
1120 //function : SetOwnHLRDeviationAngle
1121 //purpose  : 
1122 //=======================================================================
1123
1124 void AIS_Shape::SetOwnHLRDeviationAngle ( const Standard_Real  anAngle )
1125 {
1126   myDrawer->SetHLRAngle( anAngle );
1127 }
1128
1129 //***** GetOwn
1130 //=======================================================================
1131 //function : OwnDeviationCoefficient
1132 //purpose  : 
1133 //=======================================================================
1134
1135 Standard_Boolean AIS_Shape::OwnDeviationCoefficient ( Standard_Real &  aCoefficient,
1136                                                       Standard_Real & aPreviousCoefficient ) const
1137 {
1138   aCoefficient = myDrawer->DeviationCoefficient();
1139   aPreviousCoefficient = myDrawer->PreviousDeviationCoefficient ();
1140   return myDrawer->IsOwnDeviationCoefficient() ;
1141 }
1142
1143 //=======================================================================
1144 //function : OwnHLRDeviationCoefficient
1145 //purpose  : 
1146 //=======================================================================
1147
1148 Standard_Boolean AIS_Shape::OwnHLRDeviationCoefficient ( Standard_Real & aCoefficient,
1149                                                          Standard_Real & aPreviousCoefficient ) const
1150 {
1151   aCoefficient = myDrawer->HLRDeviationCoefficient();
1152   aPreviousCoefficient = myDrawer->PreviousHLRDeviationCoefficient ();
1153   return myDrawer->IsOwnHLRDeviationCoefficient();
1154
1155 }
1156
1157 //=======================================================================
1158 //function : OwnDeviationAngle
1159 //purpose  : 
1160 //=======================================================================
1161
1162 Standard_Boolean AIS_Shape::OwnDeviationAngle ( Standard_Real &  anAngle,
1163                                                 Standard_Real & aPreviousAngle ) const
1164 {
1165   anAngle = myDrawer->DeviationAngle();
1166   aPreviousAngle = myDrawer->PreviousDeviationAngle (); 
1167   return myDrawer->IsOwnDeviationAngle();
1168 }
1169
1170 //=======================================================================
1171 //function : OwnHLRDeviationAngle
1172 //purpose  : 
1173 //=======================================================================
1174
1175 Standard_Boolean AIS_Shape::OwnHLRDeviationAngle ( Standard_Real &  anAngle,
1176                                                    Standard_Real & aPreviousAngle ) const
1177 {
1178   anAngle = myDrawer->HLRAngle();
1179   aPreviousAngle = myDrawer->PreviousHLRDeviationAngle (); 
1180   return myDrawer->IsOwnHLRDeviationAngle();
1181
1182 }