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