Integration of OCCT 6.5.0 from SVN
[occt.git] / samples / java / src / SampleViewer3DPackage / SampleViewer3DPackage.cxx
1 #include <SampleViewer3DPackage.hxx>
2 #include <AIS_InteractiveContext.hxx>
3 #include <AIS_Shape.hxx>
4 #include <TCollection_AsciiString.hxx>
5 #include <V3d_Viewer.hxx>
6 #include <V3d_View.hxx>
7 #include <V3d_Coordinate.hxx>
8 #include <V3d_AmbientLight.hxx>
9 #include <V3d_SpotLight.hxx>
10 #include <V3d_PositionalLight.hxx>
11 #include <V3d_DirectionalLight.hxx>
12 #include <V3d_Plane.hxx>
13 #include <gp_Pnt.hxx>
14 #include <gp_Pln.hxx>
15 #include <gp_Pnt2d.hxx>
16 #include <ProjLib.hxx>
17 #include <ElSLib.hxx>
18 #include <Precision.hxx>
19 #include <BRepPrimAPI_MakeBox.hxx>
20 #include <BRepPrimAPI_MakeCylinder.hxx>
21 #include <BRepPrimAPI_MakeSphere.hxx>
22 #include <BRepPrimAPI_MakeCone.hxx>
23 #include <BRepBuilderAPI_MakeEdge.hxx>
24 #include <BRepBuilderAPI_MakeFace.hxx>
25 #include <TopoDS_Shape.hxx>
26 #include <TopoDS_Solid.hxx>
27 #include <TopoDS_Edge.hxx>
28
29
30 #ifdef WNT
31 #include <WNT_Window.hxx>
32 #include <Graphic3d_WNTGraphicDevice.hxx>
33 #else
34 #include <Xw_Window.hxx>
35 #include <Graphic3d_GraphicDevice.hxx>
36 #endif  // WNT
37
38
39
40 /*----------------------------------------------------------------------*/
41 #ifdef WNT
42 static Handle(Graphic3d_WNTGraphicDevice) defaultdevice;
43 #else
44 static Handle(Graphic3d_GraphicDevice) defaultdevice;
45 #endif  // WNT
46
47
48 Handle(V3d_AmbientLight) myCurrent_AmbientLight;
49 Handle(V3d_SpotLight) myCurrent_SpotLight;
50 Handle(V3d_PositionalLight) myCurrent_PositionalLight;
51 Handle(V3d_DirectionalLight) myCurrent_DirectionalLight;
52 Handle(V3d_Plane) myPlane;
53 Handle(AIS_Shape) myShape;
54
55
56 gp_Pnt p1, p2, p3;
57 Handle(AIS_Shape) spotConeShape=new AIS_Shape(TopoDS_Solid());
58 Handle(AIS_Shape) directionalEdgeShape=new AIS_Shape(TopoDS_Edge());
59
60 Standard_Boolean isConeDisplayed = Standard_False;
61 Standard_Boolean isEdgeDisplayed = Standard_False;
62
63 /*----------------------------------------------------------------------*/
64
65
66 gp_Pnt ConvertClickToPoint(Standard_Real x, Standard_Real y, Handle(V3d_View) aView)
67 {
68   V3d_Coordinate XEye,YEye,ZEye,XAt,YAt,ZAt;
69   aView->Eye(XEye,YEye,ZEye);
70   aView->At(XAt,YAt,ZAt);
71   gp_Pnt EyePoint(XEye,YEye,ZEye);
72   gp_Pnt AtPoint(XAt,YAt,ZAt);
73
74   gp_Vec EyeVector(EyePoint,AtPoint);
75   gp_Dir EyeDir(EyeVector);
76
77   gp_Pln PlaneOfTheView = gp_Pln(AtPoint,EyeDir);
78   V3d_Coordinate X,Y,Z;
79   aView->Convert(Standard_Integer(x),Standard_Integer(y),X,Y,Z);
80   gp_Pnt ConvertedPoint(X,Y,Z);
81   gp_Pnt2d ConvertedPointOnPlane = ProjLib::Project(PlaneOfTheView,ConvertedPoint);
82   
83   gp_Pnt ResultPoint = ElSLib::Value(ConvertedPointOnPlane.X(),
84                                      ConvertedPointOnPlane.Y(),
85                                      PlaneOfTheView);
86   return ResultPoint;
87 }
88
89
90 //===============================================================
91 // Function name: CreateViewer
92 //===============================================================
93  Handle(V3d_Viewer) SampleViewer3DPackage::CreateViewer(const Standard_ExtString aName) 
94 {
95 #ifndef WNT
96   if (defaultdevice.IsNull()) defaultdevice = new Graphic3d_GraphicDevice("");
97   return new V3d_Viewer(defaultdevice, aName);
98 #else
99   if (defaultdevice.IsNull()) defaultdevice = new Graphic3d_WNTGraphicDevice();
100   return new V3d_Viewer(defaultdevice, aName);
101 #endif //WNT
102 }
103
104 //===============================================================
105 // Function name: SetWindow
106 //===============================================================
107 void SampleViewer3DPackage::SetWindow (const Handle(V3d_View)& aView,
108                                        const Standard_Integer hiwin,
109                                        const Standard_Integer lowin)
110 {
111 #ifdef WNT
112   Handle(Graphic3d_WNTGraphicDevice) d = 
113     Handle(Graphic3d_WNTGraphicDevice)::DownCast(aView->Viewer()->Device());
114   Handle(WNT_Window) w = new WNT_Window(d,hiwin,lowin);
115 #else
116   Handle(Graphic3d_GraphicDevice) d = 
117     Handle(Graphic3d_GraphicDevice)::DownCast(aView->Viewer()->Device());
118   Handle(Xw_Window) w = new Xw_Window(d,hiwin,lowin,Xw_WQ_3DQUALITY);
119 #endif
120   aView->SetWindow(w);
121 }
122
123 //===============================================================
124 // Function name: CreateGraphicDriver
125 //===============================================================
126  Handle(Graphic3d_GraphicDriver) SampleViewer3DPackage::CreateGraphicDriver() 
127 {
128 #ifndef WNT
129   if (defaultdevice.IsNull()) 
130     defaultdevice = new Graphic3d_GraphicDevice("");
131   return Handle(Graphic3d_GraphicDriver)::DownCast(defaultdevice->GraphicDriver());
132 #else
133   if (defaultdevice.IsNull()) 
134     defaultdevice = new Graphic3d_WNTGraphicDevice();
135   return  Handle(Graphic3d_GraphicDriver)::DownCast(defaultdevice->GraphicDriver());
136 #endif //WNT
137 }
138
139
140
141 //======================================================================
142 //=                                                                    =
143 //=                          Display figures                           =
144 //=                                                                    =
145 //======================================================================
146
147 //===============================================================
148 // Function name: DisplayBox
149 //===============================================================
150  void SampleViewer3DPackage::DisplayBox(const Handle(AIS_InteractiveContext)& aContext) 
151 {
152   BRepPrimAPI_MakeBox B(gp_Pnt(0,-400,-100), 200.,150.,100.);
153   Handle(AIS_Shape) aBox = new AIS_Shape(B.Shape());
154   aContext->Display(aBox);      
155 }
156
157 //===============================================================
158 // Function name: DisplayCylinder
159 //===============================================================
160  void SampleViewer3DPackage::DisplayCylinder(const Handle(AIS_InteractiveContext)& aContext) 
161 {
162   gp_Ax2 CylAx2(gp_Pnt(0,0,-100), gp_Dir(gp_Vec(gp_Pnt(0,0,-100),gp_Pnt(0,0,100))));
163   BRepPrimAPI_MakeCylinder C(CylAx2, 80.,200.);
164   Handle(AIS_Shape) aCyl = new AIS_Shape(C.Shape());
165   aContext->SetColor(aCyl,Quantity_NOC_WHITE); 
166   aContext->SetMaterial(aCyl,Graphic3d_NOM_SHINY_PLASTIC);    
167   aContext->SetDisplayMode(aCyl,1);
168   aContext->Display(aCyl);
169 }
170
171 //===============================================================
172 // Function name: DisplaySphere
173 //===============================================================
174  void SampleViewer3DPackage::DisplaySphere(const Handle(AIS_InteractiveContext)& aContext) 
175 {
176   BRepPrimAPI_MakeSphere S(gp_Pnt(0,300,0), 100.);
177   Handle(AIS_Shape) aSphere = new AIS_Shape(S.Shape());
178   aContext->SetMaterial(aSphere,Graphic3d_NOM_SILVER);    
179   aContext->SetDisplayMode(aSphere,1);
180   aContext->Display(aSphere);
181 }
182
183 //===============================================================
184 // Function name: EraseAll
185 //===============================================================
186  void SampleViewer3DPackage::EraseAll(const Handle(AIS_InteractiveContext)& aContext) 
187 {
188   aContext->EraseAll(Standard_False);
189 }
190
191
192 //======================================================================
193 //=                                                                    =
194 //=                               Spot Light                           =
195 //=                                                                    =
196 //======================================================================
197
198 //===============================================================
199 // Function name: CreateSpotLight
200 //===============================================================
201  void SampleViewer3DPackage::CreateSpotLight(const Handle(AIS_InteractiveContext)& aContext,
202                                              TCollection_AsciiString& Message) 
203 {
204   // Spot light source creation
205   aContext->OpenLocalContext();
206
207   Message = "\
208 myCurrent_SpotLight = new V3d_SpotLight(myView->Viewer(), Xt, Yt, Zt, Xp, Yp, Zp,Quantity_NOC_RED);\n\
209 \n\
210 myView->SetLightOn(myCurrent_SpotLight);\n\
211 \n\
212   ";
213 }
214
215 //===============================================================
216 // Function name: SetSpotLight
217 //===============================================================
218  void SampleViewer3DPackage::SetSpotLight(const Handle(AIS_InteractiveContext)& aContext,
219                                           const Handle(V3d_View)& aView,
220                                           const Standard_Integer X,const Standard_Integer Y,
221                                           TCollection_AsciiString& Message) 
222 {
223   p1 = ConvertClickToPoint(X,Y,aView);
224   myCurrent_SpotLight = new V3d_SpotLight(aView->Viewer(),0.,0.,1., p1.X(),p1.Y(),p1.Z(),
225                                           Quantity_NOC_RED);
226   aView->SetLightOn(myCurrent_SpotLight);
227
228   p2 = gp_Pnt(p1.X(),p1.Y(),p1.Z()+1.);
229   Standard_Real coneHeigth=p1.Distance(p2);
230   BRepPrimAPI_MakeCone MakeCone(gp_Ax2(p1, gp_Dir(gp_Vec(p1, p2))), 
231                                 0, (p1.Distance(p2))/tan(1.04), coneHeigth);
232   spotConeShape->Set(MakeCone.Solid());
233
234   if (isConeDisplayed)
235     aContext->Redisplay(spotConeShape,0,-1);
236   else
237     isConeDisplayed = Standard_True;
238
239   aContext->Display(spotConeShape,0,-1);
240
241   Message = "\
242 myCurrent_SpotLight->SetDirection(Xv, Yv, Zv);\n\
243   ";
244 }
245
246 //===============================================================
247 // Function name: DirectingSpotLight
248 //===============================================================
249  void SampleViewer3DPackage::DirectingSpotLight(const Handle(AIS_InteractiveContext)& aContext,
250                                                 const Handle(V3d_View)& aView,
251                                                 const Standard_Integer X,const Standard_Integer Y) 
252 {
253   p2 = ConvertClickToPoint(X,Y,aView);
254   //Update the light dynamically
255   Standard_Real coneHeigth=p1.Distance(p2);
256   if( coneHeigth>Precision::Confusion())
257     {
258       BRepPrimAPI_MakeCone MakeCone(gp_Ax2(p1, gp_Dir(gp_Vec(p1, p2))), 
259                                     0, (p1.Distance(p2))/tan(1.04), coneHeigth);
260       spotConeShape->Set(MakeCone.Solid());
261       aContext->Redisplay(spotConeShape,0,-1);
262       myCurrent_SpotLight->SetDirection(p2.X()-p1.X(),p2.Y()-p1.Y(),p2.Z()-p1.Z());
263       aView->UpdateLights();
264     }
265 }
266
267 //===============================================================
268 // Function name: DirectSpotLight
269 //===============================================================
270  void SampleViewer3DPackage::DirectSpotLight(const Handle(V3d_View)& aView,
271                                              const Standard_Integer X,const Standard_Integer Y,
272                                              TCollection_AsciiString& Message) 
273 {
274   p2 = ConvertClickToPoint(X,Y,aView);
275
276   Message = "\
277 myCurrent_SpotLight->SetAngle(Angle) ;\n\
278   ";
279 }
280
281 //===============================================================
282 // Function name: ExpandingSpotLight
283 //===============================================================
284  void SampleViewer3DPackage::ExpandingSpotLight(const Handle(AIS_InteractiveContext)& aContext,
285                                                 const Handle(V3d_View)& aView,
286                                                 const Standard_Integer X,const Standard_Integer Y) 
287 {
288   p3 = ConvertClickToPoint(X,Y,aView);
289   //Update the light dynamically
290   Standard_Real coneHeigth=p1.Distance(p2);
291   if( (p2.Distance(p3))>Precision::Confusion())
292     {
293       BRepPrimAPI_MakeCone MakeCone(gp_Ax2(p1, gp_Dir(gp_Vec(p1, p2))), 
294                                     0, p2.Distance(p3), coneHeigth);
295       spotConeShape->Set(MakeCone.Solid());
296       aContext->Redisplay(spotConeShape,0,-1);
297       myCurrent_SpotLight->SetAngle(atan(p2.Distance(p3)/p1.Distance(p2))) ;
298       aView->UpdateLights();
299     }
300 }
301
302 //===============================================================
303 // Function name: ExpandSpotLight
304 //===============================================================
305  void SampleViewer3DPackage::ExpandSpotLight(const Handle(AIS_InteractiveContext)& aContext) 
306 {
307   aContext->Erase(spotConeShape);
308   aContext->CloseLocalContext();
309 }
310
311
312 //======================================================================
313 //=                                                                    =
314 //=                         Positional Light                           =
315 //=                                                                    =
316 //======================================================================
317
318 //===============================================================
319 // Function name: CreatePositionalLight
320 //===============================================================
321  void SampleViewer3DPackage::CreatePositionalLight(const Handle(AIS_InteractiveContext)& aContext,
322                                                    const Handle(V3d_View)& aView,
323                                                    TCollection_AsciiString& Message) 
324 {
325   // Positional light source creation
326   aContext->OpenLocalContext();
327   myCurrent_PositionalLight=new V3d_PositionalLight(aView->Viewer(),0,0,0,Quantity_NOC_GREEN,1,0);
328   aView->SetLightOn(myCurrent_PositionalLight);
329
330   Message = "\
331 myCurrent_PositionalLight=new V3d_PositionalLight(myView->Viewer(),Xp, Yp, Zp,Quantity_NOC_GREEN,1,0);\n\
332 \n\
333 myView->SetLightOn(myCurrent_PositionalLight) ;\n\
334   ";
335 }
336
337 //===============================================================
338 // Function name: DirectingPositionalLight
339 //===============================================================
340  void SampleViewer3DPackage::DirectingPositionalLight(const Handle(V3d_View)& aView,
341                                                       const Standard_Integer X,const Standard_Integer Y) 
342 {
343   p2 = ConvertClickToPoint(X,Y,aView);
344   //Update the light dynamically
345   myCurrent_PositionalLight->SetPosition(p2.X(),p2.Y(),p2.Z());
346   aView->UpdateLights();
347 }
348
349 //===============================================================
350 // Function name: DirectPositionalLight
351 //===============================================================
352  void SampleViewer3DPackage::DirectPositionalLight(const Handle(AIS_InteractiveContext)& aContext,
353                                                    const Handle(V3d_View)& aView,
354                                                    const Standard_Integer X,const Standard_Integer Y,
355                                                    TCollection_AsciiString& Message) 
356 {
357   p1 = ConvertClickToPoint(X,Y,aView);
358   myCurrent_PositionalLight->SetPosition(p1.X(),p1.Y(),p1.Z()) ;
359   aContext->CloseLocalContext();
360
361   Message = "\
362 myCurrent_PositionalLight->SetPosition(Xp, Yp, Zp) ;\n\
363   ";
364 }
365
366
367 //======================================================================
368 //=                                                                    =
369 //=                        Directional Light                           =
370 //=                                                                    =
371 //======================================================================
372
373 //===============================================================
374 // Function name: CreateDirectionalLight
375 //===============================================================
376  void SampleViewer3DPackage::CreateDirectionalLight(const Handle(AIS_InteractiveContext)& aContext,
377                                                     TCollection_AsciiString& Message) 
378 {
379   // Directional light source creation
380   aContext->OpenLocalContext();
381
382   Message = "\
383 myCurrent_DirectionalLight = new V3d_DirectionalLight(myView->Viewer(), Xt, Yt, Zt, Xp, Yp, Zp);\n\
384 \n\
385 myView->SetLightOn(myCurrent_DirectionalLight);\n\
386 \n\
387   ";
388 }
389
390 //===============================================================
391 // Function name: SetDirectionalLight
392 //===============================================================
393  void SampleViewer3DPackage::SetDirectionalLight(const Handle(AIS_InteractiveContext)& aContext,
394                                                  const Handle(V3d_View)& aView,
395                                                  const Standard_Integer X,const Standard_Integer Y,
396                                                  TCollection_AsciiString& Message) 
397 {
398   p1 = ConvertClickToPoint(X,Y,aView);
399   p2 = gp_Pnt(p1.X(),p1.Y(),p1.Z()+1.);
400   BRepBuilderAPI_MakeEdge MakeEdge(p1, p2);
401   directionalEdgeShape->Set(MakeEdge.Edge());
402
403   if (isEdgeDisplayed)
404     aContext->Redisplay(directionalEdgeShape,0,-1);
405   else
406     isEdgeDisplayed = Standard_True;
407
408   aContext->Display(directionalEdgeShape,0,-1);
409
410   // Create a directional light
411   myCurrent_DirectionalLight = new V3d_DirectionalLight(aView->Viewer(), p1.X(),p1.Y(),p1.Z(),0.,0.,1.);
412   aView->SetLightOn(myCurrent_DirectionalLight);
413   
414   Message = "\
415 myCurrent_DirectionalLight->SetDirection(Xv, Yv, Zv);\n\
416   ";
417 }
418
419 //===============================================================
420 // Function name: DirectingDirectionalLight
421 //===============================================================
422  void SampleViewer3DPackage::DirectingDirectionalLight(const Handle(AIS_InteractiveContext)& aContext,
423                                                        const Handle(V3d_View)& aView,
424                                                        const Standard_Integer X,const Standard_Integer Y) 
425 {
426   p2 = ConvertClickToPoint(X,Y,aView);
427   //Update the light dynamically
428   if( p1.Distance(p2)>Precision::Confusion())
429     {
430       BRepBuilderAPI_MakeEdge MakeEdge(p1, p2);
431       directionalEdgeShape->Set(MakeEdge.Edge());
432       aContext->Redisplay(directionalEdgeShape,0,-1);
433       myCurrent_DirectionalLight->SetDirection(p2.X()-p1.X(),p2.Y()-p1.Y(),p2.Z()-p1.Z());
434       aView->UpdateLights();
435     }
436 }
437
438 //===============================================================
439 // Function name: DirectDirectionalLight
440 //===============================================================
441  void SampleViewer3DPackage::DirectDirectionalLight(const Handle(AIS_InteractiveContext)& aContext) 
442 {
443   aContext->Erase(directionalEdgeShape);
444   aContext->CloseLocalContext();
445 }
446
447
448 //======================================================================
449 //=                                                                    =
450 //=                          Ambient Light                             =
451 //=                                                                    =
452 //======================================================================
453
454 //===============================================================
455 // Function name: CreateAmbientLight
456 //===============================================================
457  void SampleViewer3DPackage::CreateAmbientLight(const Handle(AIS_InteractiveContext)& aContext,
458                                                 const Handle(V3d_View)& aView,
459                                                 TCollection_AsciiString& Message) 
460 {
461   // Ambient light source creation
462   aContext->OpenLocalContext();
463   myCurrent_AmbientLight=new V3d_AmbientLight(aView->Viewer(), Quantity_NOC_GRAY);
464   aView->SetLightOn(myCurrent_AmbientLight) ;   
465   aContext->CloseLocalContext();
466
467   aView->UpdateLights();
468
469   Message = "\
470 myCurrent_AmbientLight=new V3d_AmbientLight(myView->Viewer(), Quantity_NOC_GRAY);\n\
471 \n\
472 myView->SetLightOn(myCurrent_AmbientLight) ;\n\
473   ";
474 }
475
476 //===============================================================
477 // Function name: ClearLights
478 //===============================================================
479  void SampleViewer3DPackage::ClearLights(const Handle(V3d_View)& aView,
480                                          TCollection_AsciiString& Message) 
481 {
482   // Setting Off all non global active lights
483   for(aView->InitActiveLights(); aView->MoreActiveLights(); aView->NextActiveLights())
484     {
485       if (!aView->Viewer()->IsGlobalLight(aView->ActiveLight())) 
486         aView->SetLightOff(aView->ActiveLight());
487     }
488
489   aView->Update();
490
491   Message = "\
492 for(myView->InitActiveLights(); myView->MoreActiveLights(); myView->NextActiveLights())\n\
493    {\n\
494       if (!aView->Viewer()->IsGlobalLight(aView->ActiveLight()))\n\
495         myView->SetLightOff(myView->ActiveLight()); //Setting Off all non global active lights\n\
496    }\n\
497   ";
498 }
499
500
501 //======================================================================
502 //=                                                                    =
503 //=                             ZClipping                              =
504 //=                                                                    =
505 //======================================================================
506
507 //===============================================================
508 // Function name: ChangeZClippingDepth
509 //===============================================================
510  void SampleViewer3DPackage::ChangeZClippingDepth(const Handle(V3d_View)& aView,
511                                                   const Quantity_Length Depth,
512                                                   TCollection_AsciiString& Message) 
513 {
514   // Setting the ZClipping depth at Depth value
515   aView->SetZClippingDepth(Depth);
516
517   aView->Update();
518
519   Message = "\
520 myView->SetZClippingDepth(Depth);\n\
521 \n\
522 myView->Update();\n\
523   ";
524 }
525
526 //===============================================================
527 // Function name: ChangeZClippingWidth
528 //===============================================================
529  void SampleViewer3DPackage::ChangeZClippingWidth(const Handle(V3d_View)& aView,
530                                                   const Quantity_Length Width,
531                                                   TCollection_AsciiString& Message) 
532 {
533   // Setting the ZClipping width at Width value
534   aView->SetZClippingWidth(Width);
535
536   aView->Update();
537
538   Message = "\
539 myView->SetZClippingWidth(Width);\n\
540 \n\
541 myView->Update();\n\
542   ";
543 }
544
545 //===============================================================
546 // Function name: ChangeZClippingType
547 //===============================================================
548  void SampleViewer3DPackage::ChangeZClippingType(const Handle(V3d_View)& aView,
549                                                  const V3d_TypeOfZclipping Type,
550                                                  TCollection_AsciiString& Message) 
551 {
552   // Setting the ZClipping type at Type value
553   aView->SetZClippingType(Type);
554   aView->Update();
555
556   Message = "\
557 aView->SetZClippingType(Type);\n\
558 \n\
559 aView->Update();\n\
560   ";
561 }
562
563
564 //======================================================================
565 //=                                                                    =
566 //=                               ZCueing                              =
567 //=                                                                    =
568 //======================================================================
569
570 //===============================================================
571 // Function name: ChangeZCueingDepth
572 //===============================================================
573  void SampleViewer3DPackage::ChangeZCueingDepth(const Handle(V3d_View)& aView,
574                                                 const Quantity_Length Depth,
575                                                 TCollection_AsciiString& Message) 
576 {
577   // Setting the ZCueing depth at Depth value
578   aView->SetZCueingDepth(Depth);
579
580   aView->Update();
581
582   Message = "\
583 myView->SetZCueingDepth(Depth);\n\
584 \n\
585 myView->Update();\n\
586   ";
587 }
588
589 //===============================================================
590 // Function name: ChangeZCueingWidth
591 //===============================================================
592  void SampleViewer3DPackage::ChangeZCueingWidth(const Handle(V3d_View)& aView,
593                                                 const Quantity_Length Width,
594                                                 TCollection_AsciiString& Message) 
595 {
596   // Setting the ZCueing width at Width value
597   aView->SetZCueingWidth(Width);
598
599   aView->Update();
600
601   Message = "\
602 myView->SetZCueingWidth(Width);\n\
603 \n\
604 myView->Update();\n\
605   ";
606 }
607
608 //===============================================================
609 // Function name: ChangeZCueingOnOff
610 //===============================================================
611  void SampleViewer3DPackage::ChangeZCueingOnOff(const Handle(V3d_View)& aView,
612                                                 const Standard_Boolean IsOn,
613                                                 TCollection_AsciiString& Message) 
614 {
615   Quantity_Length Depth, Width;
616
617   if(IsOn)
618     {
619       if(!aView->ZCueing(Depth, Width))
620         // Setting the ZCueing on if it's not yet
621         aView->SetZCueingOn();
622     }
623   else
624     {
625       if(aView->ZCueing(Depth, Width))
626         // Setting the ZCueing off if it's not yet
627         aView->SetZCueingOff();
628     }
629
630   aView->Update();
631
632
633   Message = "\
634 if(!myView->ZCueing(Depth, Width));\n\
635         myView->SetZCueingOn();\n\
636 else\n\
637         myView->SetZCueingOff();\n\
638 \n\
639 myView->Update();\n\
640   ";
641 }
642
643
644 //======================================================================
645 //=                                                                    =
646 //=                            Other modes                             =
647 //=                                                                    =
648 //======================================================================
649
650 //===============================================================
651 // Function name: ChangeShadingModel
652 //===============================================================
653  void SampleViewer3DPackage::ChangeShadingModel(const Handle(V3d_View)& aView,
654                                                 const V3d_TypeOfShadingModel Model) 
655 {
656   aView->SetShadingModel(Model);
657   aView->Update();      
658 }
659
660 //===============================================================
661 // Function name: ChangeAntialiasing
662 //===============================================================
663  void SampleViewer3DPackage::ChangeAntialiasing(const Handle(V3d_View)& aView,
664                                                 TCollection_AsciiString& Message) 
665 {
666   if(!aView->Antialiasing())
667     aView->SetAntialiasingOn();
668   else
669     aView->SetAntialiasingOff();
670   
671   aView->Update();
672
673   Message = "\
674 if(!myView->Antialiasing())\n\
675         myView->SetAntialiasingOn();\n\
676 else\n\
677         myView->SetAntialiasingOff();\n\
678   ";
679 }
680
681
682 //======================================================================
683 //=                                                                    =
684 //=                          Model Clipping                            =
685 //=                                                                    =
686 //======================================================================
687
688 //===============================================================
689 // Function name: CreateClippingPlane
690 //===============================================================
691  void SampleViewer3DPackage::CreateClippingPlane(const Handle(V3d_Viewer)& aViewer) 
692 {
693   if( myPlane.IsNull() ) 
694     {
695       //creates a plane defined : center of the box ( 50,50,50) and 1 direction
696       gp_Pln tmpPln(gp_Pnt(0,0,0),gp_Dir(1,0,0));
697       //getting the coefficients of the gp_Pln ( ax+by+cz+d = 0 )
698       Standard_Real A,B,C,D;
699       tmpPln.Coefficients(A,B,C,D);
700       //with these coefficients, creating a V3d_Plane
701       myPlane = new V3d_Plane(aViewer,A,B,C,D);
702       //creates the Face
703       //NOTE : the face must be behind the clipping plane !!      
704       tmpPln = gp_Pln(gp_Pnt(0.1,0,0),gp_Dir(1,0,0));
705       BRepBuilderAPI_MakeFace MakeFace(tmpPln, 200, -200, 410, -410);
706       TopoDS_Face S = MakeFace.Face();
707       //display the face
708       myShape = new AIS_Shape(S);
709     }
710 }
711
712 //===============================================================
713 // Function name: DisplayClippingPlane
714 //===============================================================
715  void SampleViewer3DPackage::DisplayClippingPlane(const Handle(AIS_InteractiveContext)& aContext,
716                                                   const Handle(V3d_View)& aView,
717                                                   Standard_Real& Z,Standard_Boolean& IsOn) 
718 {
719   Standard_Real A,B,C,D;
720   myPlane->Plane(A,B,C,D);
721   Z = D;
722
723   Handle(V3d_Plane) thePlane;
724   for (aView->InitActivePlanes(); 
725        aView->MoreActivePlanes(); 
726        aView->NextActivePlanes()) {
727     thePlane = aView->ActivePlane() ;
728     if (thePlane == myPlane) IsOn = Standard_True;
729   }
730
731   if (IsOn)
732     if (!myShape.IsNull())
733       aContext->Display(myShape);
734 }
735
736 //===============================================================
737 // Function name: ChangeModelClippingZ
738 //===============================================================
739  void SampleViewer3DPackage::ChangeModelClippingZ(const Handle(AIS_InteractiveContext)& aContext,
740                                                   const Handle(V3d_View)& aView,const Standard_Real Z,
741                                                   const Standard_Boolean IsOn,
742                                                   TCollection_AsciiString& Message) 
743 {
744   // Setting the ModelClippingZ at Z value
745   gp_Pln  clipPln(gp_Pnt(-Z,0,0),gp_Dir(1,0,0));
746
747   Standard_Real A,B,C,D;
748   clipPln.Coefficients(A,B,C,D);
749   myPlane->SetPlane(A,B,C,D);
750
751   if(IsOn)
752     aView->SetPlaneOn(myPlane); 
753
754   gp_Trsf myTrsf;
755   myTrsf.SetTranslation(gp_Pnt(Z,0,0), gp_Pnt(0,0,0));
756   aContext->SetLocation(myShape,TopLoc_Location(myTrsf)) ;
757   aContext->Redisplay(myShape);
758   aView->Update();
759
760   Message = "\
761 gp_Pln  clipPln(gp_Pnt(-Z,0,0),gp_Dir(1,0,0));\n\
762 Standard_Real A,B,C,D;\n\
763 clipPln.Coefficients(A,B,C,D);\n\
764 myPlane->SetPlane(A,B,C,D);\n\
765 myView->SetPlaneOn(myPlane); \n\
766   ";
767 }
768
769 //===============================================================
770 // Function name: ChangeModelClippingOnOff
771 //===============================================================
772  void SampleViewer3DPackage::ChangeModelClippingOnOff(const Handle(AIS_InteractiveContext)& aContext,
773                                                       const Handle(V3d_View)& aView,
774                                                       const Standard_Boolean IsOn,
775                                                       TCollection_AsciiString& Message) 
776 {
777   if (IsOn)
778     {
779       //activate the plane
780       aView->SetPlaneOn(myPlane);
781       aContext->Display(myShape);
782     }
783   else
784     //deactivate the plane
785     {
786       aView->SetPlaneOff(myPlane);
787       aContext->Erase(myShape);
788     }
789
790   aView->Update();
791
792   Message = "\
793 if(IsOn) \n\
794         myView->SetPlaneOn(myPlane); \n\
795 else \n\
796         myView->SetPlaneOff(myPlane); \n\
797   ";
798 }
799
800 //===============================================================
801 // Function name: ClearClippingPlane
802 //===============================================================
803  void SampleViewer3DPackage::ClearClippingPlane(const Handle(AIS_InteractiveContext)& aContext,
804                                                 const Handle(V3d_View)& aView,
805                                                 const Standard_Boolean IsOn) 
806 {
807   if (IsOn)
808     //deactivate the plane
809     aView->SetPlaneOff(myPlane);
810
811   if(!myShape.IsNull())
812     aContext->Erase(myShape);
813   
814   if (IsOn)
815     aView->Update();
816 }
817