0024564: Select3D_SensitiveFace gives inaccurate picking depth for AIS_Plane (interio...
[occt.git] / src / AIS / AIS_Plane.cxx
1 // Created on: 1995-08-02
2 // Created by: Arnaud BOUZY/Odile Olivier
3 // Copyright (c) 1995-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
9 // under the terms of the GNU Lesser General Public 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 #define GER61351                //GG_171199     Enable to set an object RGB color
18 //                                                instead a restricted object NameOfColor.
19
20 #include <AIS_Plane.ixx>
21
22 #include <TColgp_Array1OfPnt.hxx>
23 #include <TColgp_HArray1OfPnt.hxx>
24
25 #include <Precision.hxx>
26 #include <gp_Pnt.hxx>
27 #include <ElSLib.hxx>
28
29 #include <Graphic3d_ArrayOfQuadrangles.hxx>
30 #include <Graphic3d_Group.hxx>
31 #include <Prs3d_Drawer.hxx>
32 #include <Prs3d_LineAspect.hxx>
33 #include <Prs3d_PlaneAspect.hxx>
34 #include <Prs3d_DatumAspect.hxx>
35 #include <Prs3d_ShadingAspect.hxx>
36 #include <StdPrs_Plane.hxx>
37 #include <StdPrs_ShadedSurface.hxx>
38
39 #include <Geom_Plane.hxx>
40 #include <GeomAdaptor_Surface.hxx>
41
42 #include <Aspect_TypeOfLine.hxx>
43 #include <Graphic3d_AspectLine3d.hxx>
44 #include <Graphic3d_Structure.hxx>
45 #include <Graphic3d_MaterialAspect.hxx>
46 #include <Graphic3d_AspectFillArea3d.hxx>
47
48 #include <DsgPrs_XYZPlanePresentation.hxx>
49 #include <DsgPrs_ShadedPlanePresentation.hxx>
50 #include <UnitsAPI.hxx>
51
52 #include <Select3D_SensitiveTriangulation.hxx>
53 #include <SelectBasics_EntityOwner.hxx>
54 #include <SelectMgr_EntityOwner.hxx>
55 #include <StdPrs_ShadedShape.hxx>
56
57 #include <Poly_Triangulation.hxx>
58
59 #include <AIS_Drawer.hxx>
60
61 #include <TCollection_AsciiString.hxx>
62
63 //=======================================================================
64 //function : AIS_Plane
65 //purpose  : 
66 //=======================================================================
67 AIS_Plane::AIS_Plane(const Handle(Geom_Plane)& aComponent,
68                      const Standard_Boolean aCurrentMode):
69 myComponent(aComponent),
70 myCenter(gp_Pnt(0.,0.,0.)),
71 myCurrentMode(aCurrentMode),
72 myAutomaticPosition(Standard_True),
73 myTypeOfPlane(AIS_TOPL_Unknown),
74 myIsXYZPlane(Standard_False),
75 myTypeOfSensitivity (Select3D_TOS_BOUNDARY)
76 {
77   InitDrawerAttributes();
78 }
79
80 //=======================================================================
81 //function : AIS_Plane 
82 //purpose  : avec une position
83 //=======================================================================
84 AIS_Plane::AIS_Plane(const Handle(Geom_Plane)& aComponent,
85                      const gp_Pnt& aCenter,
86                      const Standard_Boolean aCurrentMode):
87 myComponent(aComponent),
88 myCenter(aCenter),
89 myCurrentMode(aCurrentMode),
90 myAutomaticPosition(Standard_True),
91 myTypeOfPlane(AIS_TOPL_Unknown),
92 myIsXYZPlane(Standard_False),
93 myTypeOfSensitivity (Select3D_TOS_BOUNDARY)
94 {
95   InitDrawerAttributes();
96 }
97
98 //=======================================================================
99 //function : AIS_Plane
100 //purpose  : 
101 //=======================================================================
102 AIS_Plane::AIS_Plane(const Handle(Geom_Plane)& aComponent,
103                                const gp_Pnt& aCenter,
104                                const gp_Pnt& aPmin,
105                                const gp_Pnt& aPmax,
106                                const Standard_Boolean aCurrentMode):
107 myComponent(aComponent),
108 myCenter(aCenter),
109 myPmin(aPmin),
110 myPmax(aPmax),
111 myCurrentMode(aCurrentMode),
112 myAutomaticPosition(Standard_False),
113 myTypeOfPlane(AIS_TOPL_Unknown),
114 myIsXYZPlane(Standard_False),
115 myTypeOfSensitivity (Select3D_TOS_BOUNDARY)
116 {
117   InitDrawerAttributes();
118   SetHilightMode(0);
119 }
120
121 //=======================================================================
122 //function : AIS_Plane
123 //purpose  : XYPlane, XZPlane, YZPlane
124 //=======================================================================
125 AIS_Plane::AIS_Plane(const Handle(Geom_Axis2Placement)& aComponent,
126                      const AIS_TypeOfPlane aPlaneType,
127                      const Standard_Boolean aCurrentMode):
128 myAx2(aComponent),
129 myCurrentMode(aCurrentMode),
130 myAutomaticPosition(Standard_True),
131 myTypeOfPlane(aPlaneType),
132 myIsXYZPlane(Standard_True),
133 myTypeOfSensitivity (Select3D_TOS_BOUNDARY)
134 {
135   InitDrawerAttributes();
136   ComputeFields();
137   SetHilightMode(0);
138
139 }
140
141
142 //=======================================================================
143 //function : SetComponent
144 //purpose  : 
145 //=======================================================================
146
147 void AIS_Plane::SetComponent(const Handle(Geom_Plane)& aComponent)
148 {
149   myComponent = aComponent;
150   myTypeOfPlane = AIS_TOPL_Unknown;
151   myIsXYZPlane = Standard_False;
152   //myCenter = gp_Pnt(0.,0.,0.);
153   myAutomaticPosition = Standard_True;
154 }
155
156 //=======================================================================
157 //function : Type
158 //purpose  : 
159 //=======================================================================
160
161 AIS_KindOfInteractive AIS_Plane::Type() const 
162 {return AIS_KOI_Datum;}
163
164
165 //=======================================================================
166 //function : Signature
167 //purpose  : 
168 //=======================================================================
169
170 Standard_Integer AIS_Plane::Signature() const 
171 {return 7;}
172
173
174 //=======================================================================
175 //function : Axis2Placement
176 //purpose  : 
177 //=======================================================================
178
179 Handle(Geom_Axis2Placement) AIS_Plane::Axis2Placement()
180 {
181   Handle(Geom_Axis2Placement) Bid;
182   return IsXYZPlane() ? myAx2:Bid;
183 }
184 //=======================================================================
185 //function : SetAxis2Placement
186 //purpose  : 
187 //=======================================================================
188
189  void AIS_Plane::SetAxis2Placement(const Handle(Geom_Axis2Placement)& aComponent,
190                                    const AIS_TypeOfPlane aPlaneType)
191 {
192   myTypeOfPlane = aPlaneType;
193   myIsXYZPlane = Standard_True;
194   myAx2= aComponent;
195   myAutomaticPosition = Standard_True;
196   ComputeFields();
197 }
198
199 //=======================================================================
200 //function : PlaneAttributes
201 //purpose  : 
202 //=======================================================================
203 Standard_Boolean AIS_Plane::PlaneAttributes(Handle(Geom_Plane)& aComponent,
204                                             gp_Pnt& aCenter,
205                                             gp_Pnt& aPmin,
206                                             gp_Pnt& aPmax)
207 {
208   Standard_Boolean aStatus (Standard_False);
209   if (!myAutomaticPosition){
210     aComponent = myComponent;
211     aCenter = myCenter;
212     aPmin = myPmin;
213     aPmax = myPmax;
214     aStatus = Standard_True;
215   }
216   return aStatus;
217 }
218
219 //=======================================================================
220 //function : SetPlaneAttributes
221 //purpose  : 
222 //=======================================================================
223 void AIS_Plane::SetPlaneAttributes(const Handle(Geom_Plane)& aComponent,
224                               const gp_Pnt& aCenter,
225                               const gp_Pnt& aPmin,
226                               const gp_Pnt& aPmax)
227 {
228   myAutomaticPosition = Standard_False;
229   myComponent = aComponent;
230   myCenter = aCenter;
231   myPmin = aPmin;
232   myPmax = aPmax;
233   myTypeOfPlane = AIS_TOPL_Unknown;
234   myIsXYZPlane = Standard_False;
235 }
236
237 //=======================================================================
238 //function : Compute
239 //purpose  : 
240 //=======================================================================
241 void AIS_Plane::Compute(const Handle(PrsMgr_PresentationManager3d)& ,
242                         const Handle(Prs3d_Presentation)& aPresentation, 
243                         const Standard_Integer aMode)
244 {
245   aPresentation->Clear();
246
247   ComputeFields();
248   aPresentation->SetInfiniteState(myInfiniteState);
249   myDrawer->PlaneAspect()->EdgesAspect()->SetWidth(myCurrentMode == 0? 1 : 3);
250
251   switch (aMode)
252   {
253     case 0:
254     {
255       if (!myIsXYZPlane)
256       {
257         ComputeFrame();
258         const Handle(Geom_Plane)& pl = myComponent;
259         const Handle(Geom_Plane)& thegoodpl = Handle(Geom_Plane)::DownCast(pl->Translated(pl->Location(),myCenter));
260         GeomAdaptor_Surface surf(thegoodpl);
261         StdPrs_Plane::Add(aPresentation,surf,myDrawer);
262       }
263       else
264         DsgPrs_XYZPlanePresentation::Add(aPresentation,myDrawer,myCenter,myPmin,myPmax);
265       break;
266     }
267     case 1:
268     {
269       if (!myIsXYZPlane)
270       {
271         ComputeFrame();
272         Handle(Prs3d_PlaneAspect) theaspect = myDrawer->PlaneAspect();
273         Handle(Graphic3d_Group) TheGroup = Prs3d_Root::CurrentGroup(aPresentation);
274         TheGroup->SetPrimitivesAspect(myDrawer->ShadingAspect()->Aspect());
275         gp_Pnt p1;
276         const Standard_Real Xmax = 0.5*Standard_Real(theaspect->PlaneXLength());
277         const Standard_Real Ymax = 0.5*Standard_Real(theaspect->PlaneYLength());
278
279         Handle(Graphic3d_ArrayOfQuadrangles) aQuads = new Graphic3d_ArrayOfQuadrangles(4);
280
281         myComponent->D0(-Xmax,Ymax,p1);
282         aQuads->AddVertex(p1);
283         myComponent->D0(Xmax,Ymax,p1);
284         aQuads->AddVertex(p1);
285         myComponent->D0(Xmax,-Ymax,p1);
286         aQuads->AddVertex(p1);
287         myComponent->D0(-Xmax,-Ymax,p1);
288         aQuads->AddVertex(p1);
289
290         TheGroup->AddPrimitiveArray(aQuads);
291       }
292       else
293         DsgPrs_ShadedPlanePresentation::Add(aPresentation,myDrawer,myCenter,myPmin,myPmax);
294       break;
295     }
296   }
297 }
298
299 void AIS_Plane::Compute(const Handle_Prs3d_Projector& aProjector, const Handle_Geom_Transformation& aTransformation, const Handle_Prs3d_Presentation& aPresentation)
300 {
301   PrsMgr_PresentableObject::Compute(aProjector, aTransformation, aPresentation);
302 }
303
304 //=======================================================================
305 //function : ComputeSelection
306 //purpose  : 
307 //=======================================================================
308 void AIS_Plane::ComputeSelection (const Handle(SelectMgr_Selection)& theSelection, const Standard_Integer /*theMode*/)
309 {
310   theSelection->Clear();
311   Handle(SelectMgr_EntityOwner) aSensitiveOwner = new SelectMgr_EntityOwner (this, 10);
312   Handle(Poly_Triangulation) aSensitivePoly;
313
314   if (!myIsXYZPlane)
315   {
316     // plane representing rectangle
317     Standard_Real aLengthX = myDrawer->PlaneAspect()->PlaneXLength() / 2.0;
318     Standard_Real aLengthY = myDrawer->PlaneAspect()->PlaneYLength() / 2.0;
319     Handle(Geom_Plane) aPlane = 
320       Handle(Geom_Plane)::DownCast (myComponent->Translated (myComponent->Location(), myCenter));
321
322     TColgp_Array1OfPnt aRectanglePoints (1, 4);
323     aPlane->D0 ( aLengthX,  aLengthY, aRectanglePoints.ChangeValue (1));
324     aPlane->D0 ( aLengthX, -aLengthY, aRectanglePoints.ChangeValue (2));
325     aPlane->D0 (-aLengthX, -aLengthY, aRectanglePoints.ChangeValue (3));
326     aPlane->D0 (-aLengthX,  aLengthY, aRectanglePoints.ChangeValue (4));
327
328     Poly_Array1OfTriangle aTriangles (1, 2);
329     aTriangles.ChangeValue (1) = Poly_Triangle (1, 2, 3);
330     aTriangles.ChangeValue (2) = Poly_Triangle (1, 3, 4);
331
332     aSensitivePoly = new Poly_Triangulation (aRectanglePoints, aTriangles);
333   }
334   else
335   {
336     // plane representing triangle
337     TColgp_Array1OfPnt aTrianglePoints (1, 3);
338     aTrianglePoints.ChangeValue (1) = myCenter;
339     aTrianglePoints.ChangeValue (2) = myPmin;
340     aTrianglePoints.ChangeValue (3) = myPmax;
341
342     Poly_Array1OfTriangle aTriangles (1, 1);
343     aTriangles.ChangeValue (1) = Poly_Triangle(1, 2, 3);
344
345     aSensitivePoly = new Poly_Triangulation (aTrianglePoints, aTriangles);
346   }
347
348   Standard_Boolean isSensitiveInterior = myTypeOfSensitivity == Select3D_TOS_INTERIOR;
349
350   Handle(Select3D_SensitiveTriangulation) aSensitive =
351     new Select3D_SensitiveTriangulation (aSensitiveOwner,
352                                          aSensitivePoly,
353                                          TopLoc_Location(),
354                                          isSensitiveInterior);
355
356   theSelection->Add(aSensitive);
357 }
358
359 //=======================================================================
360 //function : SetSize
361 //purpose  : 
362 //=======================================================================
363 void AIS_Plane::SetSize(const Standard_Real aLength)
364 {
365   SetSize(aLength,aLength);
366 }
367
368 void AIS_Plane::SetSize(const Standard_Real aXLength,
369                         const Standard_Real aYLength)
370 {
371   //if the plane already has a proper color or size, 
372   //there is already a specific PlaneAspect and DatumAspect 
373     
374   Handle(Prs3d_PlaneAspect) PA; 
375   Handle(Prs3d_DatumAspect) DA;
376
377   PA = myDrawer->PlaneAspect();
378   DA = myDrawer->DatumAspect();
379
380   Standard_Boolean yenavaitPA(Standard_True),yenavaitDA(Standard_True);
381   if(myDrawer->Link()->PlaneAspect() == PA){
382     yenavaitPA = Standard_False;
383     PA = new Prs3d_PlaneAspect();}
384   if(myDrawer->Link()->DatumAspect() == DA){
385     yenavaitDA = Standard_False;
386     DA = new Prs3d_DatumAspect();
387   }
388   
389   PA->SetPlaneLength(aXLength,aYLength);
390   DA->SetAxisLength(aXLength,aYLength,aXLength);
391   
392   if(!yenavaitPA)
393     myDrawer->SetPlaneAspect(PA);
394   if(!yenavaitDA)
395     myDrawer->SetDatumAspect(DA);
396   
397   
398   myHasOwnSize = Standard_True;
399   Update();
400   UpdateSelection();
401 }
402
403
404 //=======================================================================
405 //function : UnsetSize
406 //purpose  : If there is a color, the size is restaured from the drawer of the context...
407 //=======================================================================
408 void AIS_Plane::UnsetSize()
409 {
410   
411   if(!myHasOwnSize) return;
412   if(!hasOwnColor){
413     myDrawer->PlaneAspect().Nullify();
414     myDrawer->DatumAspect().Nullify();
415   }
416   else{
417     const Handle(Prs3d_PlaneAspect)& PA = myDrawer->Link()->PlaneAspect();
418     const Handle(Prs3d_DatumAspect)& DA = myDrawer->Link()->DatumAspect();
419
420     myDrawer->PlaneAspect()->SetPlaneLength(PA->PlaneXLength(),PA->PlaneYLength());
421     myDrawer->DatumAspect()->SetAxisLength(DA->FirstAxisLength(),
422                                            DA->SecondAxisLength(),
423                                            DA->ThirdAxisLength());
424   }
425   
426   myHasOwnSize = Standard_False;
427   Update();
428   UpdateSelection();
429
430 }
431
432 //=======================================================================
433 //function : Size
434 //purpose  : 
435 //=======================================================================
436
437 Standard_Boolean AIS_Plane::Size(Standard_Real& X,Standard_Real& Y) const 
438 {
439   X = myDrawer->PlaneAspect()->PlaneXLength();
440   Y = myDrawer->PlaneAspect()->PlaneYLength();
441   return Abs(X-Y)<=Precision::Confusion();
442 }
443
444
445 //=======================================================================
446 //function : SetColor
447 //purpose  : 
448 //=======================================================================
449
450
451 void AIS_Plane::SetColor(const Quantity_NameOfColor aCol)
452 #ifdef GER61351
453 {
454   SetColor(Quantity_Color(aCol));
455 }
456
457 void AIS_Plane::SetColor(const Quantity_Color &aCol)
458 #endif
459 {
460   // if the plane already has its proper size, there is an already created planeaspect 
461 //  Standard_Boolean yenadeja = hasOwnColor || myHasOwnSize;
462   Handle(Prs3d_PlaneAspect) PA; 
463   Handle(Prs3d_DatumAspect) DA;
464
465   PA = myDrawer->PlaneAspect();
466   DA = myDrawer->DatumAspect();
467
468   Standard_Boolean yenavaitPA(Standard_True),yenavaitDA(Standard_True);
469   if(myDrawer->Link()->PlaneAspect() == PA){
470     yenavaitPA = Standard_False;
471     PA = new Prs3d_PlaneAspect();}
472   if(myDrawer->Link()->DatumAspect() == DA){
473     yenavaitDA = Standard_False;
474     DA = new Prs3d_DatumAspect();
475   }
476   
477   PA->EdgesAspect()->SetColor(aCol);
478   DA->FirstAxisAspect()->SetColor(aCol);
479   DA->SecondAxisAspect()->SetColor(aCol);
480   DA->ThirdAxisAspect()->SetColor(aCol);
481
482   if(!yenavaitPA)
483     myDrawer->SetPlaneAspect(PA);
484   if(!yenavaitDA)
485     myDrawer->SetDatumAspect(DA);
486
487   myDrawer->ShadingAspect()->SetColor(aCol);
488   
489   hasOwnColor=Standard_True;
490   myOwnColor = aCol;
491 }
492 //=======================================================================
493 //function : SetColor
494 //purpose  : 
495 //=======================================================================
496 void AIS_Plane::UnsetColor()
497 {
498   if(!hasOwnColor) return;
499   if(!myHasOwnSize){
500     myDrawer->PlaneAspect().Nullify();
501     myDrawer->DatumAspect().Nullify();
502   }
503   else{
504     const Handle(Prs3d_PlaneAspect)& PA = myDrawer->Link()->PlaneAspect();
505 //    const Handle(Prs3d_DatumAspect)& DA = myDrawer->Link()->DatumAspect();
506     Quantity_Color C;Aspect_TypeOfLine T;Standard_Real W;
507     PA->EdgesAspect()->Aspect()->Values(C,T,W);
508     Quantity_NameOfColor Col = C.Name();
509     myDrawer->PlaneAspect()->EdgesAspect()->SetColor(Col);
510     
511     myDrawer->DatumAspect()->FirstAxisAspect()->SetColor(Col);
512     myDrawer->DatumAspect()->SecondAxisAspect()->SetColor(Col);
513     myDrawer->DatumAspect()->ThirdAxisAspect()->SetColor(Col);
514   }
515  
516  
517   hasOwnColor=Standard_False;
518
519 }
520
521 //=======================================================================
522 //function : ComputeFrame
523 //purpose  : 
524 //=======================================================================
525 void AIS_Plane::ComputeFrame()
526 {
527
528   const Handle(Geom_Plane)& pl = myComponent;
529   Standard_Real U,V;
530
531   if (myAutomaticPosition) {
532     ElSLib::Parameters(pl->Pln(),myCenter,U,V);
533     pl->D0 (U, V, myCenter);     
534   }
535   else {
536     const Handle(Geom_Plane)& thegoodpl = 
537       Handle(Geom_Plane)::DownCast(pl->Translated(pl->Location(),myCenter));
538     ElSLib::Parameters(thegoodpl->Pln(),myPmin,U,V);
539     
540     U = 2.4*Abs(U);
541     V = 2.4*Abs(V);
542     if (U < 10*Precision::Confusion()) U=0.1;
543     if (V < 10*Precision::Confusion()) V=0.1;
544     SetSize(U,V);
545     myDrawer->PlaneAspect()->SetPlaneLength(U,V);
546   }
547 }
548
549 //=======================================================================
550 //function : Compute
551 //purpose  : to avoid warning
552 //=======================================================================
553 void AIS_Plane::Compute(const Handle(Prs3d_Projector)&, 
554                            const Handle(Prs3d_Presentation)&)
555 {
556 }
557
558 //=======================================================================
559 //function : ComputeFields
560 //purpose  : 
561 //=======================================================================
562 void AIS_Plane::ComputeFields()
563 {
564   if (myIsXYZPlane){
565     Handle (Prs3d_DatumAspect) DA = myDrawer->DatumAspect();
566
567     gp_Pnt Orig = myAx2->Ax2().Location();
568     gp_Dir oX = myAx2->Ax2().XDirection();
569     gp_Dir oY = myAx2->Ax2().YDirection();
570     gp_Dir oZ = myAx2->Ax2().Direction();
571     myCenter = Orig;
572     Standard_Real xo,yo,zo,x1,y1,z1,x2,y2,z2,x3,y3,z3,x4=0,y4=0,z4=0;
573     Standard_Real x5=0,y5=0,z5=0;
574     Orig.Coord(xo,yo,zo);
575     oX.Coord(x1,y1,z1);
576     oY.Coord(x2,y2,z2);
577     oZ.Coord(x3,y3,z3);
578     Standard_Real DS1 = DA->FirstAxisLength();
579     Standard_Real DS2 = DA->SecondAxisLength();
580     Standard_Real DS3 = DA->ThirdAxisLength();
581 //    gp_Pnt aPt2,aPt3;
582
583     switch (myTypeOfPlane) {
584     case AIS_TOPL_XYPlane:
585       {
586         gp_Pln XYP(0,0,1,0);
587         myComponent = new Geom_Plane(XYP);
588         x4=xo+x1*DS1; y4=yo+y1*DS1; z4=zo+z1*DS1;
589         x5=xo+x2*DS2; y5=yo+y2*DS2; z5=zo+z2*DS2;
590         break;
591       }
592     case AIS_TOPL_XZPlane:
593       {
594         gp_Pln XZP(0,1,0,0);
595         myComponent = new Geom_Plane(XZP);
596         x4=xo+x1*DS1; y4=yo+y1*DS1; z4=zo+z1*DS1;
597         x5=xo+x3*DS3; y5=yo+y3*DS3; z5=zo+z3*DS3;
598         break;
599       }
600     case AIS_TOPL_YZPlane:
601       {
602         gp_Pln XZP(1,0,0,0);
603         myComponent = new Geom_Plane(XZP);
604         x4=xo+x2*DS2; y4=yo+y2*DS2; z4=zo+z2*DS2;
605         x5=xo+x3*DS3; y5=yo+y3*DS3; z5=zo+z3*DS3;
606         break;
607       }
608     default:
609       break;
610     }
611     myPmin.SetCoord(x4,y4,z4);
612     myPmax.SetCoord(x5,y5,z5);
613   }
614
615 }
616 //=======================================================================
617 //function : InitDrawerAttributes
618 //purpose  : 
619 //=======================================================================
620
621 void AIS_Plane::InitDrawerAttributes()
622 {
623
624   Handle(Prs3d_ShadingAspect) shasp = new Prs3d_ShadingAspect();
625   shasp->SetMaterial(Graphic3d_NOM_PLASTIC);
626   shasp->SetColor(Quantity_NOC_GRAY40);
627   myDrawer->SetShadingAspect(shasp);
628   Handle(Graphic3d_AspectFillArea3d) asf = shasp->Aspect();
629   Graphic3d_MaterialAspect asp = asf->FrontMaterial();
630   asp.SetTransparency(0.8);
631   asf->SetFrontMaterial(asp);
632   asf->SetBackMaterial(asp);
633
634
635 }
636
637 //=======================================================================
638 //function : AcceptDisplayMode
639 //purpose  : 
640 //=======================================================================
641
642 Standard_Boolean  AIS_Plane::
643 AcceptDisplayMode(const Standard_Integer aMode) const
644 {return aMode == 0;}
645
646
647 //=======================================================================
648 //function : SetContext
649 //purpose  : 
650 //=======================================================================
651
652 void AIS_Plane::SetContext(const Handle(AIS_InteractiveContext)& Ctx)
653 {
654   AIS_InteractiveObject::SetContext(Ctx);
655   ComputeFields();
656
657 }