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