Integration of OCCT 6.5.0 from SVN
[occt.git] / samples / mfc / occtdemo / Primitives / Primitives_Presentation.cpp
1 // Primitives_Presentation.cpp: implementation of the Primitives_Presentation class.
2 // Construction of primitives.
3 ////////////////////////////////////////////////////////////////////////////
4
5 #include "stdafx.h"
6 #include "Primitives_Presentation.h"
7
8 #include <Standard.hxx>
9
10 #include <TColgp_Array1OfPnt.hxx>
11
12 #include <gp_Pnt.hxx>
13 #include <gp_Vec.hxx>
14 #include <gp_Ax2.hxx>
15
16 #include <TopoDS_Wire.hxx>
17 #include <TopoDS_Face.hxx>
18
19 #include <BRepBuilderAPI_MakeFace.hxx>
20 #include <BRepPrimAPI_MakePrism.hxx>
21 #include <BRepPrimAPI_MakeCylinder.hxx>
22 #include <BRepPrimAPI_MakeCone.hxx>
23 #include <BRepPrimAPI_MakeTorus.hxx>
24 #include <BRepPrimAPI_MakeWedge.hxx>
25 #include <BRepBuilderAPI_MakePolygon.hxx>
26
27 #define SCALE 50
28
29 #ifdef WNT
30  #define EOL "\r\n"
31 #else
32  #define EOL "\n"
33 #endif
34
35 // Initialization of global variable with an instance of this class
36 OCCDemo_Presentation* OCCDemo_Presentation::Current = new Primitives_Presentation;
37
38 // Initialization of array of samples
39 const Primitives_Presentation::PSampleFuncType Primitives_Presentation::SampleFuncs[] =
40 {
41   &Primitives_Presentation::sample1,
42   &Primitives_Presentation::sample2,
43   &Primitives_Presentation::sample3,
44   &Primitives_Presentation::sample4,
45   &Primitives_Presentation::sample5
46 };
47
48 //////////////////////////////////////////////////////////////////////
49 // Construction/Destruction
50 //////////////////////////////////////////////////////////////////////
51
52 Primitives_Presentation::Primitives_Presentation()
53 {
54   FitMode=false;
55   myIndex = 0;
56   myNbSamples = sizeof(SampleFuncs)/sizeof(PSampleFuncType);
57   setName ("Primitives");
58 }
59
60 //////////////////////////////////////////////////////////////////////
61 // Sample execution
62 //////////////////////////////////////////////////////////////////////
63
64 void Primitives_Presentation::DoSample()
65 {
66   getAISContext()->EraseAll();
67   if (myIndex >=0 && myIndex < myNbSamples)
68     (this->*SampleFuncs[myIndex])();
69 }
70
71 //////////////////////////////////////////////////////////////////////
72 // Sample functions
73 //////////////////////////////////////////////////////////////////////
74 //================================================================
75
76 //================================================================
77 // Function : Primitives_Presentation::sample1
78 // Purpose  : Building prisms
79 //================================================================
80
81 void Primitives_Presentation::sample1()
82 {
83
84   setResultTitle("Building prisms");
85   TCollection_AsciiString aText (
86     "///////////////////////////////////////////////////////" EOL
87     "// Building linear swept topologies, called prisms" EOL
88     "///////////////////////////////////////////////////////" EOL EOL
89     
90     "//=====================================================" EOL
91     "// A prism is defined by a basis shape (wire or face)," EOL
92     "//which is swept. " EOL
93     "//=====================================================" EOL EOL
94
95     "//array coordinates of points:" EOL
96     "Standard_Real aCoords[][3] = {" EOL
97     "  //for base:" EOL
98     "  {1,1,0},{4,8,0},{10,10,0},{12,6,0},{8,0,0}," EOL
99     "  //for vectors:" EOL
100     "  {1,1,7.5},{4,4,6}" EOL
101     "};" EOL EOL
102
103     "//array of points uses for building base of prisms and" EOL
104     "//a sweeping direction" EOL
105     "Standard_Integer nPoint = sizeof(aCoords)/(sizeof(Standard_Real)*3);" EOL
106     "TColgp_Array1OfPnt aCurvePoint (1, nPoint);" EOL EOL
107
108     "//scale:" EOL
109     "for (Standard_Integer i=0; i < nPoint; i++)" EOL
110     "  aCurvePoint(i+1) = gp_Pnt (aCoords[i][0]*SCALE-300," EOL
111     "                             aCoords[i][1]*SCALE-300," EOL
112     "                             aCoords[i][2]*SCALE-200);" EOL
113    
114     "//creating wire:" EOL
115     "BRepBuilderAPI_MakePolygon aPol;" EOL
116     "for (i=0; i < nPoint-2; i++)" EOL
117     "  aPol.Add (aCurvePoint(i+1));" EOL
118     "TopoDS_Wire aWire = aPol.Wire();" EOL EOL
119
120     "//creating face:" EOL
121     "TopoDS_Face aFace = BRepBuilderAPI_MakeFace(aWire);" EOL EOL
122   
123     "//creating vectors:" EOL
124     "gp_Vec aVec1(aCurvePoint(1),aCurvePoint(nPoint-1));" EOL
125     "gp_Vec aVec2(aCurvePoint(1),aCurvePoint(nPoint));" EOL EOL
126   
127     "//creating prisms:" EOL EOL
128     
129     "  //the base is wire" EOL
130     "  TopoDS_Shape aPrism1 = BRepPrimAPI_MakePrism(aWire,aVec1);" EOL
131     "  TopoDS_Shape aPrism2 = BRepPrimAPI_MakePrism(aWire,aVec2);" EOL EOL
132
133     "  //the base is face" EOL
134     "  TopoDS_Shape aPrism3 = BRepPrimAPI_MakePrism(aFace,aVec1);" EOL
135     "  TopoDS_Shape aPrism4 = BRepPrimAPI_MakePrism(aFace,aVec2);" EOL EOL
136
137     );
138
139   setResultText(aText.ToCString());
140
141   //array coordinates of points:
142   Standard_Real aCoords[][3] = {
143     //for base:
144     {1,1,0},{4,8,0},{10,10,0},{12,6,0},{8,0,0},{1,1,0},
145     //for vectors:
146     {1,1,7.5},{-1,-1,6}
147   };
148
149   //array of points uses for building base of prisms and
150   //a sweeping direction.
151   Standard_Integer nPoint = sizeof(aCoords)/(sizeof(Standard_Real)*3);
152   TColgp_Array1OfPnt aCurvePoint (1, nPoint);
153
154   //scale:
155   for (Standard_Integer i=0; i < nPoint; i++)
156     aCurvePoint(i+1) = gp_Pnt (aCoords[i][0]*SCALE-300,
157                                aCoords[i][1]*SCALE-300,
158                                aCoords[i][2]*SCALE-200);
159    
160   //creating wire:
161   BRepBuilderAPI_MakePolygon aPol;
162   for (i=0; i < nPoint-2; i++)
163     aPol.Add (aCurvePoint(i+1));
164   TopoDS_Wire aWire = aPol.Wire();
165
166   //creating face:
167   TopoDS_Face aFace = BRepBuilderAPI_MakeFace(aWire);
168   
169   //creating vectors:
170   gp_Vec aVec1(aCurvePoint(1),aCurvePoint(nPoint-1));
171   gp_Vec aVec2(aCurvePoint(1),aCurvePoint(nPoint));
172   
173   //creating prisms:
174   TopoDS_Shape aPrism1 = BRepPrimAPI_MakePrism(aWire,aVec1);
175   TopoDS_Shape aPrism2 = BRepPrimAPI_MakePrism(aWire,aVec2);
176   TopoDS_Shape aPrism3 = BRepPrimAPI_MakePrism(aFace,aVec1);
177   TopoDS_Shape aPrism4 = BRepPrimAPI_MakePrism(aFace,aVec2);
178
179   //====================================================
180
181   drawShape(aWire,Quantity_NOC_RED);
182   if(WAIT_A_SECOND) return;
183   Handle(AIS_InteractiveObject) aShowVec = drawVector(aCurvePoint(1),aVec1,Quantity_NOC_CYAN1);
184   if(WAIT_A_LITTLE) return;
185   Handle(AIS_Shape) aShowPrism = drawShape(aPrism1);
186   if(WAIT_A_SECOND) return;
187
188   getAISContext()->Erase(aShowVec);
189   aShowVec = drawVector(aCurvePoint(1),aVec2,Quantity_NOC_CYAN1);
190   if(WAIT_A_LITTLE) return;
191   aShowPrism->Set(aPrism2);
192   getAISContext()->Redisplay(aShowPrism);
193   if(WAIT_A_SECOND) return;
194
195   getAISContext()->Erase(aShowVec);
196   getAISContext()->Erase(aShowPrism);
197   drawShape(aFace);
198   if(WAIT_A_SECOND) return;
199   aShowVec = drawVector(aCurvePoint(1),aVec1,Quantity_NOC_CYAN1);
200   if(WAIT_A_LITTLE) return;
201   aShowPrism = drawShape(aPrism3);
202   if(WAIT_A_SECOND) return;
203
204   getAISContext()->Erase(aShowVec);
205   aShowVec = drawVector(aCurvePoint(1),aVec2,Quantity_NOC_CYAN1);
206   if(WAIT_A_LITTLE) return;
207   aShowPrism->Set(aPrism4);
208   getAISContext()->Redisplay(aShowPrism);
209 }
210
211 //================================================================
212 // Function : Primitives_Presentation::sample2
213 // Purpose  : Building cylinders and portions of cylinders
214 //================================================================
215
216 void Primitives_Presentation::sample2()
217 {
218   setResultTitle("Building cylinders");
219   TCollection_AsciiString aText (
220     "///////////////////////////////////////////////////////" EOL
221     "// Building cylinders and portions of cylinders" EOL
222     "///////////////////////////////////////////////////////" EOL EOL
223
224     "  //the local coordinate system Axes:" EOL
225     "  gp_Ax2 Axes = gp::XOY();" EOL
226     "  Axes.SetLocation(gp_Pnt(0,0,-300));" EOL EOL
227
228     "  //the cylinder of radius aRadius and height aHeight" EOL
229     "  Standard_Real aRadius = 200 , aHeight = 600 ;" EOL
230     "  TopoDS_Shape aCylinder1 = " EOL
231     "    BRepPrimAPI_MakeCylinder(Axes,aRadius,aHeight);  " EOL EOL
232
233     "  //restrict cylinder by angle" EOL
234     "  Standard_Real Angle1 = 3*PI/2, Angle2 = PI, Angle3 = 2*PI/3;" EOL
235     "  TopoDS_Shape aCylinder2 = " EOL
236     "    BRepPrimAPI_MakeCylinder(Axes,aRadius,aHeight,Angle1);" EOL
237     "  TopoDS_Shape aCylinder3 = " EOL
238     "    BRepPrimAPI_MakeCylinder(Axes,aRadius,aHeight,Angle2);" EOL
239     "  TopoDS_Shape aCylinder4 = " EOL
240     "    BRepPrimAPI_MakeCylinder(Axes,aRadius,aHeight,Angle3);" EOL
241   );
242
243   setResultText(aText.ToCString());
244   
245   //the local coordinate system Axes:
246   gp_Ax2 Axes = gp::XOY();
247   Axes.SetLocation(gp_Pnt(0,0,-300));
248
249   //the cylinder of radius aRadius and height aHeight
250   Standard_Real aRadius = 200 , aHeight = 600 ;
251   TopoDS_Shape aCylinder1 = 
252     BRepPrimAPI_MakeCylinder(Axes,aRadius,aHeight);  
253
254   //restrict cylinder by angle
255   Standard_Real Angle1 = 3*PI/2, Angle2 = PI, Angle3 = 2*PI/3;
256   TopoDS_Shape aCylinder2 = 
257     BRepPrimAPI_MakeCylinder(Axes,aRadius,aHeight,Angle1);
258   TopoDS_Shape aCylinder3 = 
259     BRepPrimAPI_MakeCylinder(Axes,aRadius,aHeight,Angle2);
260   TopoDS_Shape aCylinder4 = 
261     BRepPrimAPI_MakeCylinder(Axes,aRadius,aHeight,Angle3);
262
263   //=====================================================
264
265   getAISContext()->EraseAll();
266   Handle(AIS_Shape) aShowShape = drawShape(aCylinder1);
267   if(WAIT_A_SECOND) return;
268
269   aShowShape->Set (aCylinder2);
270   getAISContext()->Redisplay(aShowShape);
271   if(WAIT_A_SECOND) return;
272
273   aShowShape->Set (aCylinder3);
274   getAISContext()->Redisplay(aShowShape);
275   if(WAIT_A_SECOND) return;
276
277   aShowShape->Set (aCylinder4);
278   getAISContext()->Redisplay(aShowShape);
279 }
280
281 //================================================================
282 // Function : Primitives_Presentation::sample3
283 // Purpose  : Building cones and portions of cones.
284 //================================================================
285
286 void Primitives_Presentation::sample3()
287 {
288   setResultTitle("Building cones");
289   TCollection_AsciiString aText (
290     "///////////////////////////////////////////////////////" EOL
291     "//Building cones and portions of cones" EOL
292     "///////////////////////////////////////////////////////" EOL EOL
293
294     "  //the local coordinate system Axes:" EOL
295     "  gp_Ax2 Axes = gp::XOY();" EOL
296     "  Axes.SetLocation(gp_Pnt(0,0,-300));" EOL EOL
297
298     "  //the cone of height aHeight, radius aRad1 in the plane z = 0" EOL
299     "  //and aRad2 in the plane z = aHeight" EOL
300     "  Standard_Real aRad1 = 150, aRad2 = 300, aHeight = 600;" EOL
301     "  TopoDS_Shape aCone1 = BRepPrimAPI_MakeCone(Axes,aRad1,aRad2,aHeight);" EOL
302     "  aRad1 = 400;" EOL
303     "  TopoDS_Shape aCone2 = BRepPrimAPI_MakeCone(Axes,aRad1,aRad2,aHeight);" EOL EOL
304
305     "  //restrict cone by angle" EOL
306     "  Standard_Real Angle1 = 3*PI/2, Angle2 = 5*PI/4;" EOL
307     "  TopoDS_Shape aCone3 = BRepPrimAPI_MakeCone(Axes,aRad1,aRad2,aHeight,Angle1);" EOL
308     "  TopoDS_Shape aCone4 = BRepPrimAPI_MakeCone(Axes,aRad1,aRad2,aHeight,Angle2);" EOL
309   );
310
311   setResultText(aText.ToCString());
312
313   //the local coordinate system Axes:
314   gp_Ax2 Axes = gp::XOY();
315   Axes.SetLocation(gp_Pnt(0,0,-300));
316
317   //the cone of height aHeight, radius aRad1 in the plane z = 0
318   //and aRad2 in the plane z = aHeight
319   Standard_Real aRad1 = 150, aRad2 = 300, aHeight = 600;
320   TopoDS_Shape aCone1 = BRepPrimAPI_MakeCone(Axes,aRad1,aRad2,aHeight);
321   aRad1 = 400;
322   TopoDS_Shape aCone2 = BRepPrimAPI_MakeCone(Axes,aRad1,aRad2,aHeight);
323
324   //restrict cone by angle
325   Standard_Real Angle1 = 3*PI/2, Angle2 = 5*PI/4;
326   TopoDS_Shape aCone3 = BRepPrimAPI_MakeCone(Axes,aRad1,aRad2,aHeight,Angle1);
327   TopoDS_Shape aCone4 = BRepPrimAPI_MakeCone(Axes,aRad1,aRad2,aHeight,Angle2);
328   
329   //=====================================================
330
331   getAISContext()->EraseAll();
332   Handle(AIS_Shape) aShowShape = drawShape(aCone1);
333   if(WAIT_A_SECOND) return;
334
335   aShowShape->Set (aCone2);
336   getAISContext()->Redisplay(aShowShape);
337   if(WAIT_A_SECOND) return;
338
339   aShowShape->Set (aCone3);
340   getAISContext()->Redisplay(aShowShape);
341   if(WAIT_A_SECOND) return;
342
343   aShowShape->Set (aCone4);
344   getAISContext()->Redisplay(aShowShape);
345 }
346
347 //================================================================
348 // Function : Primitives_Presentation::sample4
349 // Purpose  : Building tori or portions of tori.
350 //================================================================
351
352 void Primitives_Presentation::sample4()
353 {
354   setResultTitle("Building tori");
355   TCollection_AsciiString aText (
356     "///////////////////////////////////////////////////////" EOL
357     "//Building tori or portions of tori" EOL
358     "///////////////////////////////////////////////////////" EOL EOL
359
360     "  //the torus of major radius aRad1 and minor radius aRad2" EOL
361     "  Standard_Real aRad1 = 400, aRad2 = 100;" EOL
362     "  TopoDS_Shape aTorus1 = BRepPrimAPI_MakeTorus(aRad1,aRad2); " EOL EOL
363
364     "  // restrict major circle by angle MajorAngle" EOL
365     "  Standard_Real MajorAngle1 = PI, MajorAngle2 = 3*PI/2;" EOL
366     "  TopoDS_Shape aTorus2 = BRepPrimAPI_MakeTorus(aRad1,aRad2,MajorAngle1);" EOL
367     "  TopoDS_Shape aTorus3 = BRepPrimAPI_MakeTorus(aRad1,aRad2,MajorAngle2);" EOL EOL
368
369     "  // restrict minor circle by angles MinorAngleMin and MinorAngleMax" EOL
370     "  Standard_Real MinorAngleMin1 = -5/8.*PI, MinorAngleMax1 = 7/8.*PI;" EOL
371     "  Standard_Real MinorAngleMin2 = -PI/2, MinorAngleMax2 = PI/2;" EOL
372     "  TopoDS_Shape aTorus4 = " EOL
373     "    BRepPrimAPI_MakeTorus(aRad1,aRad2,MinorAngleMin1,MinorAngleMax1,MajorAngle2);" EOL
374     "  TopoDS_Shape aTorus5 = " EOL
375     "    BRepPrimAPI_MakeTorus(aRad1,aRad2,MinorAngleMin2,MinorAngleMax2,MajorAngle2);" EOL
376     );
377   setResultText(aText.ToCString());
378
379   //the torus of major radius aRad1 and minor radius aRad2
380   Standard_Real aRad1 = 400, aRad2 = 100;
381   TopoDS_Shape aTorus1 = BRepPrimAPI_MakeTorus(aRad1,aRad2); 
382
383   // restrict major circle by angle MajorAngle
384   Standard_Real MajorAngle1 = PI, MajorAngle2 = 3/2.*PI;
385   TopoDS_Shape aTorus2 = BRepPrimAPI_MakeTorus(aRad1,aRad2,MajorAngle1);
386   TopoDS_Shape aTorus3 = BRepPrimAPI_MakeTorus(aRad1,aRad2,MajorAngle2);
387
388   // restrict minor circle by angles MinorAngleMin and MinorAngleMax
389   Standard_Real MinorAngleMin1 = -5/8.*PI, MinorAngleMax1 = 7/8.*PI;
390   Standard_Real MinorAngleMin2 = -PI/2, MinorAngleMax2 = PI/2;
391   TopoDS_Shape aTorus4 = 
392     BRepPrimAPI_MakeTorus(aRad1,aRad2,MinorAngleMin1,MinorAngleMax1,MajorAngle2);
393   TopoDS_Shape aTorus5 = 
394     BRepPrimAPI_MakeTorus(aRad1,aRad2,MinorAngleMin2,MinorAngleMax2,MajorAngle2);
395
396   //=====================================================
397   
398   getAISContext()->EraseAll();
399   Handle(AIS_Shape) aShowShape = drawShape(aTorus1);
400   if(WAIT_A_SECOND) return;
401
402   aShowShape->Set (aTorus2);
403   getAISContext()->Redisplay(aShowShape);
404   if(WAIT_A_SECOND) return;
405
406   aShowShape->Set (aTorus3);
407   getAISContext()->Redisplay(aShowShape);
408   if(WAIT_A_SECOND) return;
409
410   aShowShape->Set (aTorus4);
411   getAISContext()->Redisplay(aShowShape);
412   if(WAIT_A_SECOND) return;
413
414   aShowShape->Set (aTorus5);
415   getAISContext()->Redisplay(aShowShape);
416 }
417
418 //================================================================
419 // Function : Primitives_Presentation::sample5
420 // Purpose  : Building wedges.
421 //================================================================
422
423 void Primitives_Presentation::sample5()
424 {
425   setResultTitle("Building wedges");
426   TCollection_AsciiString aText (
427     "///////////////////////////////////////////////////////" EOL
428     "// Building wedges, i.e. boxes with inclined faces" EOL
429     "///////////////////////////////////////////////////////" EOL EOL
430
431     "//the local coordinate system Axes:" EOL
432     "gp_Ax2 Axes = gp::XOY();" EOL
433     "Axes.SetLocation(gp_Pnt(-200,-100,-200));" EOL EOL
434
435     "//creating wedges:" EOL EOL
436
437     "  //wedges where the base, located in the plane z = 0," EOL
438     "  //is defined by dx, dy, ltx and where the top is parallel " EOL
439     "  //to the base and located in the plane defined by the equation: z = dz" EOL
440     "  Standard_Real dx = 500, dy = 300, dz = 400, ltx = 650;" EOL
441     "  TopoDS_Shape aWedge1 = BRepPrimAPI_MakeWedge(Axes,dx,dy,dz,ltx);  " EOL EOL
442
443     "  dx = 650; dy = 300; dz = 400; ltx = 300;" EOL
444     "  TopoDS_Shape aWedge2= BRepPrimAPI_MakeWedge(Axes,dx,dy,dz,ltx);" EOL EOL
445
446     "  //wedges where the base is defined by dx, dy, xmin, xmax, zmin, zmax" EOL
447     "  //and where the top is defined by dx, dy, dz, xmin, xmax, zmin, zmax" EOL
448     "  dx = 600, dy = 600, dz = 300;" EOL
449     "  Standard_Real xmin = 250, zmin = 0, xmax = 350, zmax = 300;" EOL
450     "  TopoDS_Shape aWedge3= BRepPrimAPI_MakeWedge(Axes,dx,dy,dz,xmin,zmin,xmax,zmax);" EOL EOL
451
452     "  dy = 300; dz = 500;" EOL
453     "  xmin = 200; zmin = 200; xmax = 400;" EOL
454     "  TopoDS_Shape aWedge4= BRepPrimAPI_MakeWedge(Axes,dx,dy,dz,xmin,zmin,xmax,zmax);" EOL EOL
455   );
456
457   setResultText(aText.ToCString());
458
459   //the local coordinate system Axes:
460   gp_Ax2 Axes = gp::XOY();
461   Axes.SetLocation(gp_Pnt(-200,-100,-200));
462
463   //creating wedges:
464
465   //wedges where the base, located in the plane z = 0,
466   //is defined by dx, dy, ltx and where the top is parallel
467   //to the base and located in the plane defined by the equation: z = dz
468   Standard_Real dx = 500, dy = 300, dz = 400, ltx = dx+100;
469   TopoDS_Shape aWedge1 = BRepPrimAPI_MakeWedge(Axes,dx,dy,dz,ltx);
470
471   ltx = dx-100;
472   TopoDS_Shape aWedge2= BRepPrimAPI_MakeWedge(Axes,dx,dy,dz,ltx);
473
474   //wedges where the base is defined by dx, dy, xmin, xmax, zmin, zmax
475   //and where the top is defined by dx, dy, dz, xmin, xmax, zmin, zmax
476   Standard_Real xmin = 0, zmin = 0, xmax = dx-200, zmax = dz+100;
477   TopoDS_Shape aWedge3= BRepPrimAPI_MakeWedge(Axes,dx,dy,dz,xmin,zmin,xmax,zmax);
478   
479   xmin = 200;
480   TopoDS_Shape aWedge4= BRepPrimAPI_MakeWedge(Axes,dx,dy,dz,xmin,zmin,xmax,zmax);
481   
482   zmin = -100;
483   TopoDS_Shape aWedge5= BRepPrimAPI_MakeWedge(Axes,dx,dy,dz,xmin,zmin,xmax,zmax);
484
485   //=====================================================
486
487   getAISContext()->EraseAll();
488   Handle(AIS_Shape) aShowShape = drawShape(aWedge1);
489   if(WAIT_A_SECOND) return;
490
491   aShowShape->Set (aWedge2);
492   getAISContext()->Redisplay(aShowShape);
493   if(WAIT_A_SECOND) return;
494
495   aShowShape->Set (aWedge3);
496   getAISContext()->Redisplay(aShowShape);
497   if(WAIT_A_SECOND) return;
498
499   aShowShape->Set (aWedge4);
500   getAISContext()->Redisplay(aShowShape);
501   if(WAIT_A_SECOND) return;
502
503   aShowShape->Set (aWedge5);
504   getAISContext()->Redisplay(aShowShape);
505 }