0024002: Overall code and build procedure refactoring - samples
[occt.git] / samples / mfc / standard / 10_Convert / src / Convert_Presentation.cpp
1 // Convert_Presentation.cpp: implementation of the Convert_Presentation class.
2 // Conversion of elementary geometry to BSpline curves and surfaces
3 //////////////////////////////////////////////////////////////////////
4
5 #include "stdafx.h"
6 #include "Convert_Presentation.h"
7
8 #include <Quantity_Color.hxx>
9
10 #include <gp_Dir.hxx>
11 #include <gp_Ax2.hxx>
12
13 #include <TColgp_Array1OfPnt.hxx>
14 #include <TColStd_Array1OfReal.hxx>
15 #include <TColgp_Array2OfPnt.hxx>
16 #include <TColStd_Array2OfReal.hxx>
17
18 #include <GeomConvert.hxx>
19
20 #include <Geom_BezierSurface.hxx>
21 #include <Geom_Circle.hxx>
22 #include <Geom_Ellipse.hxx>
23 #include <Geom_BezierCurve.hxx>
24 #include <Geom_BSplineCurve.hxx>
25 #include <Geom_SphericalSurface.hxx>
26 #include <Geom_CylindricalSurface.hxx>
27 #include <Geom_RectangularTrimmedSurface.hxx>
28 #include <Geom_SurfaceOfRevolution.hxx>
29 #include <Geom_ToroidalSurface.hxx>
30 #include <Geom_ConicalSurface.hxx>
31 #include <Geom_BSplineSurface.hxx>
32
33
34 // Initialization of global variable with an instance of this class
35 OCCDemo_Presentation* OCCDemo_Presentation::Current = new Convert_Presentation;
36
37 // Initialization of array of samples
38 const Convert_Presentation::PSampleFuncType Convert_Presentation::SampleFuncs[] =
39 {
40   &Convert_Presentation::sampleCircle,
41   &Convert_Presentation::sampleEllipse,
42   &Convert_Presentation::sampleBezier,
43   &Convert_Presentation::sampleBezierSurface,
44   &Convert_Presentation::sampleCylindricalSurface,
45   &Convert_Presentation::sampleRevolSurface,
46   &Convert_Presentation::sampleToroidalSurface,
47   &Convert_Presentation::sampleConicalSurface,
48   &Convert_Presentation::sampleSphericalSurface
49 };
50
51 // Colors of objects
52 static const Quantity_Color CurveColor       (1,1,0, Quantity_TOC_RGB);      // yellow
53 static const Quantity_Color SurfaceColor     (1,1,0, Quantity_TOC_RGB);      // yellow
54 static const Quantity_Color BSplineColor     (1,0.647,0, Quantity_TOC_RGB);  // orange
55 static const Quantity_Color BSplineSurfaceColor (0,0,1, Quantity_TOC_RGB);   // blue
56
57 #ifdef WNT
58  #define EOL "\r\n"
59 #else
60  #define EOL "\n"
61 #endif
62
63 //////////////////////////////////////////////////////////////////////
64 // Construction/Destruction
65 //////////////////////////////////////////////////////////////////////
66
67 Convert_Presentation::Convert_Presentation()
68 {
69   setName ("Conversion to BSpline curves and surfaces");
70   myIndex = 0;
71   myNbFuncs = sizeof(SampleFuncs)/sizeof(PSampleFuncType);
72   myNbSamples = myNbFuncs;
73   FitMode = true;
74 }
75
76 //////////////////////////////////////////////////////////////////////
77 // Sample execution
78 //////////////////////////////////////////////////////////////////////
79
80 void Convert_Presentation::DoSample()
81 {
82         ((COCCDemoApp*) AfxGetApp())->SetSampleName (L"Convert");
83   ((COCCDemoApp*) AfxGetApp())->SetSamplePath (L"..\\..\\10_Convert");
84         getAISContext()->EraseAll();
85         if (myIndex >=0 && myIndex < myNbFuncs)
86     (this->*SampleFuncs[myIndex])();
87 }
88
89 //================================================================
90 // Function : Convert_Presentation::drawSurfaceAndItsBSpline
91 // Purpose  : 
92 //================================================================
93 void Convert_Presentation::drawSurfaceAndItsBSpline(const Handle_Geom_Surface & theSurface, 
94                                                     const Standard_CString theName, 
95                                                     TCollection_AsciiString& theText)
96 {
97   TCollection_AsciiString aTitle ("Converting ");
98   aTitle += theName;
99   aTitle += " to BSpline surface";
100
101   theText += EOL
102     "  Handle_Geom_BSplineSurface aBSplineSurface = " EOL
103     "    GeomConvert::SurfaceToBSplineSurface(aSurface);" EOL;
104
105   setResultTitle (aTitle.ToCString());
106   setResultText (theText.ToCString());
107
108   drawSurface (theSurface, SurfaceColor);
109
110   if (WAIT_A_LITTLE) return;
111
112   Handle_Geom_BSplineSurface aBSplineSurface = GeomConvert::SurfaceToBSplineSurface(theSurface);
113
114   _ASSERTE(!aBSplineSurface.IsNull());
115
116   drawSurface (aBSplineSurface, BSplineSurfaceColor);
117 }
118
119 //================================================================
120 // Function : Convert_Presentation::drawCurveAndItsBSpline
121 // Purpose  : 
122 //================================================================
123 void Convert_Presentation::drawCurveAndItsBSpline(Handle_Geom_Curve theCurve, 
124                                                   const Standard_CString theName, 
125                                                   TCollection_AsciiString& theText)
126 {
127   TCollection_AsciiString aTitle ("Converting ");
128   aTitle += theName;
129   aTitle += " to BSpline curve";
130
131   theText += EOL
132     "  Handle_Geom_BSplineCurve aBSpline = " EOL
133     "    GeomConvert::CurveToBSplineCurve(aCurve);" EOL;
134
135   setResultTitle (aTitle.ToCString());
136   setResultText (theText.ToCString());
137   
138   drawCurve (theCurve, CurveColor);
139   
140   if (WAIT_A_LITTLE) return;
141
142   Handle_Geom_BSplineCurve aBSpline = GeomConvert::CurveToBSplineCurve(theCurve);
143
144   drawCurve (Handle(Geom_Curve)::DownCast(aBSpline), BSplineColor);
145 }
146
147
148 //////////////////////////////////////////////////////////////////////
149 // Sample functions
150 //////////////////////////////////////////////////////////////////////
151
152 //================================================================
153 // Function : Convert_Presentation::sampleCircle
154 // Purpose  : 
155 //================================================================
156 void Convert_Presentation::sampleCircle()
157 {
158   gp_Pnt aOrigin (0,0,0);
159   gp_Dir aDir (1,0,0);
160   gp_Ax2 aAxis (aOrigin, aDir);
161   Standard_Real aRadius = 300;
162   Handle_Geom_Circle aCurve = new Geom_Circle (aAxis, aRadius);
163
164   TCollection_AsciiString aText (
165     "  gp_Pnt aOrigin (0,0,0);" EOL
166     "  gp_Dir aDir (1,0,0);" EOL
167     "  gp_Ax2 aAxis (aOrigin, aDir);" EOL
168     "  Standard_Real aRadius = 300;" EOL
169     "  Handle(Geom_Circle) aCurve = new Geom_Circle (aAxis, aRadius);" EOL
170     );
171   drawCurveAndItsBSpline (aCurve, "Circle", aText);
172 }
173
174 //================================================================
175 // Function : Convert_Presentation::sampleEllipse
176 // Purpose  : 
177 //================================================================
178 void Convert_Presentation::sampleEllipse()
179 {
180   gp_Pnt aOrigin (0,0,0);
181   gp_Dir aDir (1,0,0);
182   gp_Ax2 aMajorAxis (aOrigin, aDir);
183   Standard_Real aMajorRadius = 300;
184   Standard_Real aMinorRadius = 150;
185   Handle(Geom_Ellipse) aCurve = 
186     new Geom_Ellipse (aMajorAxis, aMajorRadius, aMinorRadius);
187
188   TCollection_AsciiString aText (
189     "  gp_Pnt aOrigin (0,0,0);" EOL
190     "  gp_Dir aDir (1,0,0);" EOL
191     "  gp_Ax2 aAxis (aOrigin, aDir);" EOL
192     "  Standard_Real aMajorRadius = 300;" EOL
193     "  Standard_Real aMinorRadius = 150;" EOL
194     "  Handle(Geom_Ellipse) aCurve = " EOL
195     "    new Geom_Ellipse (aAxis, aMajorRadius, aMinorRadius);" EOL
196     );
197   drawCurveAndItsBSpline (aCurve, "Ellipse", aText);
198 }
199
200 //================================================================
201 // Function : Convert_Presentation::sampleBezier
202 // Purpose  : 
203 //================================================================
204 void Convert_Presentation::sampleBezier()
205 {
206   TCollection_AsciiString aText (
207     "  Standard_Real aPolesCoords[][3] = {" EOL
208     "    {0,0,0},{0,1,0},{1,1,0},{1,2,0},{2,2,0},{2,1,0},{3,1,0},{3,0,0},{2,0,0},{2,-1,0}," EOL
209     "    {3,-1,0},{3,-2,0},{4,-2,0},{4,-1,0},{5,-1,0},{5,0,0},{6,0,0},{6,-1,0},{7,-1,0}," EOL
210     "    {7,0,0},{8,0,0},{8,1,0}" EOL
211     "  };" EOL
212     "  TColgp_Array1OfPnt aPoles (1, sizeof(aPolesCoords)/(sizeof(Standard_Real)*2));" EOL
213     " " EOL
214     "  for (Standard_Integer i=1; i <= aPoles.Upper(); i++)" EOL
215     "    aPoles(i) = gp_Pnt (aPolesCoords[i-1][0]*100, " EOL
216     "                        aPolesCoords[i-1][1]*100, " EOL
217     "                        aPolesCoords[i-1][2]*100);" EOL
218     "  " EOL
219     "  Handle(Geom_BezierCurve) aCurve = new Geom_BezierCurve (aPoles);" EOL
220     );
221
222   Standard_Real aPolesCoords[][3] = {
223     {0,0,0},{0,1,0},{1,1,0},{1,2,0},{2,2,0},{2,1,0},{3,1,0},{3,0,0},{2,0,0},{2,-1,0},
224     {3,-1,0},{3,-2,0},{4,-2,0},{4,-1,0},{5,-1,0},{5,0,0},{6,0,0},{6,-1,0},{7,-1,0},
225     {7,0,0},{8,0,0},{8,1,0}
226   };
227   TColgp_Array1OfPnt aPoles (1, sizeof(aPolesCoords)/(sizeof(Standard_Real)*3));
228  
229   for (Standard_Integer i=1; i <= aPoles.Upper(); i++)
230     aPoles(i) = gp_Pnt (aPolesCoords[i-1][0]*150-500, 
231                         aPolesCoords[i-1][1]*150, 
232                         aPolesCoords[i-1][2]*150);
233   
234   Handle(Geom_BezierCurve) aCurve = new Geom_BezierCurve (aPoles);
235
236   drawCurveAndItsBSpline (aCurve, "BezierCurve", aText);
237 }
238
239 //================================================================
240 // Function : Convert_Presentation::sampleBezierSurface
241 // Purpose  : 
242 //================================================================
243 void Convert_Presentation::sampleBezierSurface()
244 {
245   getAISContext()->EraseAll();
246
247   Standard_CString aName = "BezierSurface";
248   // Create a BezierSurface
249   TColgp_Array2OfPnt aPoles(1,2,1,4); // 8 points
250   TColStd_Array2OfReal aWeights(1,2,1,4);
251   // initializing array of points
252   aPoles.SetValue(1,1,gp_Pnt(0,10,0));     aPoles.SetValue(1,2,gp_Pnt(3.3,6.6,3));
253   aPoles.SetValue(1,3,gp_Pnt(6.6,6.6,-3)); aPoles.SetValue(1,4,gp_Pnt(10,10,0));
254   aPoles.SetValue(2,1,gp_Pnt(0,0,0));      aPoles.SetValue(2,2,gp_Pnt(3.3,3.3,-3));
255   aPoles.SetValue(2,3,gp_Pnt(6.6,3.3,3));  aPoles.SetValue(2,4,gp_Pnt(10,0,0));  
256   // scaling poles
257   for (Standard_Integer i=1; i <= aPoles.ColLength(); i++)
258     for (Standard_Integer j=1; j <= aPoles.RowLength(); j++)
259       aPoles(i,j).ChangeCoord() = aPoles(i,j).Coord() * 100 + gp_XYZ(-500,-500,0);
260   //initializing array of weights
261   aWeights.SetValue(1,1,1); aWeights.SetValue(1,2,3);
262   aWeights.SetValue(1,3,9); aWeights.SetValue(1,4,1);
263   aWeights.SetValue(2,1,1); aWeights.SetValue(2,2,2);
264   aWeights.SetValue(2,3,5); aWeights.SetValue(2,4,1);
265   Handle(Geom_BezierSurface) aSurface =
266     new Geom_BezierSurface(aPoles, aWeights);
267
268   TCollection_AsciiString aText (
269     "  // Create a BezierSurface" EOL
270     "  TColgp_Array2OfPnt aPoles(1,2,1,4); // 8 points" EOL
271     "  TColStd_Array2OfReal aWeights(1,2,1,4);" EOL
272     "  // initializing array of points" EOL
273     "  aPoles.SetValue(1,1,gp_Pnt(0,10,0));     aPoles.SetValue(1,2,gp_Pnt(3.3,6.6,3));" EOL
274     "  aPoles.SetValue(1,3,gp_Pnt(6.6,6.6,-3)); aPoles.SetValue(1,4,gp_Pnt(10,10,0));" EOL
275     "  aPoles.SetValue(2,1,gp_Pnt(0,0,0));      aPoles.SetValue(2,2,gp_Pnt(3.3,3.3,-3));" EOL
276     "  aPoles.SetValue(2,3,gp_Pnt(6.6,3.3,3));  aPoles.SetValue(2,4,gp_Pnt(10,0,0));  " EOL
277     "  // scaling poles" EOL
278     "  for (Standard_Integer i=1; i <= aPoles.ColLength(); i++)" EOL
279     "    for (Standard_Integer j=1; j <= aPoles.RowLength(); j++)" EOL
280     "      aPoles(i,j).ChangeCoord() = aPoles(i,j).Coord() * 100 + gp_XYZ(-500,-500,0);" EOL
281     "  //initializing array of weights" EOL
282     "  aWeights.SetValue(1,1,1); aWeights.SetValue(1,2,3);" EOL
283     "  aWeights.SetValue(1,3,9); aWeights.SetValue(1,4,1);" EOL
284     "  aWeights.SetValue(2,1,1); aWeights.SetValue(2,2,2);" EOL
285     "  aWeights.SetValue(2,3,5); aWeights.SetValue(2,4,1);" EOL
286     "  Handle(Geom_BezierSurface) aSurface =" EOL
287     "    new Geom_BezierSurface(aPoles, aWeights);" EOL
288     );
289
290   drawSurfaceAndItsBSpline (aSurface, aName, aText);
291 }
292
293 //================================================================
294 // Function : OCCDemo_Presentation::sampleCylindricalSurface
295 // Purpose  : 
296 //================================================================
297 void Convert_Presentation::sampleCylindricalSurface()
298 {
299   getAISContext()->EraseAll();
300
301   Standard_CString aName = "Cylindrical Surface";
302   TCollection_AsciiString aText (
303     "  // creating an axis parallel to Y axis" EOL
304     "  gp_Ax3 anAx(gp_Pnt(0,0,0), gp_Dir(0,1,0));" EOL EOL
305
306     "  // creating a cylindrical surface along anAx with radius = 100" EOL
307     "  Handle(Geom_CylindricalSurface) aCylSurface = new Geom_CylindricalSurface(anAx, 100);" EOL EOL
308
309     "  // only finit surfaces can be converted to BSpline surfaces, " EOL
310     "  // cylindrical surface is infinite, it must be trimmed" EOL
311     "  Handle(Geom_RectangularTrimmedSurface) aSurface = " EOL
312     "    new Geom_RectangularTrimmedSurface(aCylSurface, 0, 2*PI, -1000, 1000, Standard_True, Standard_True);" EOL);
313
314   // creating an axis parallel to Y axis
315   gp_Ax3 anAx(gp_Pnt(0,0,0), gp_Dir(0,1,0));
316
317   // creating a cylindrical surface along anAx with radius = 4
318   Handle(Geom_CylindricalSurface) aCylSurface = new Geom_CylindricalSurface(anAx, 100);
319
320   // only finit surfaces can be converted to BSpline surfaces, 
321   // cylindrical surface is infinite, it must be trimmed
322   Handle(Geom_RectangularTrimmedSurface) aSurface = 
323     new Geom_RectangularTrimmedSurface(aCylSurface, 0, 2*M_PI, -1000, 1000, Standard_True, Standard_True);
324   
325   drawSurfaceAndItsBSpline(aSurface, aName, aText);
326 }
327
328 //================================================================
329 // Function : OCCDemo_Presentation::sampleRevolSurface
330 // Purpose  : 
331 //================================================================
332 void Convert_Presentation::sampleRevolSurface()
333 {
334   FitMode=false;
335   ResetView();
336   TranslateView(-176.84682, -102.12892);
337   SetViewScale(0.69326);
338
339   getAISContext()->EraseAll();
340
341   Standard_CString aName = "Surface of revolution";
342   TCollection_AsciiString aText (
343     "  // creating a curve for revolution.  Let it be a Bezier curve." EOL
344     "  Handle(Geom_BezierCurve) aBezierCurve;" EOL EOL
345
346     "  // array of the bezier curve poles" EOL
347     "  TColgp_Array1OfPnt aPoles(1,4);" EOL
348     "  // array of the poles' weights" EOL
349     "  TColStd_Array1OfReal aWeights(1,4);" EOL EOL
350
351     "  aPoles(1) = gp_Pnt(0, 0, 0);      aWeights(1) = 1;" EOL
352     "  aPoles(2) = gp_Pnt(150, 250, 0);  aWeights(2) =75;" EOL
353     "  aPoles(3) = gp_Pnt(350, 150, 0);  aWeights(3) =120;" EOL
354     "  aPoles(4) = gp_Pnt(500, 500, 0);  aWeights(4) = 1;" EOL EOL
355
356     "  // creating a bezier curve" EOL
357     "  aBezierCurve = new Geom_BezierCurve(aPoles, aWeights);" EOL EOL
358
359     "  // creating a surface of revolution of the bezier curve around Y axis" EOL
360     "  gp_Ax1 anAx(gp_Pnt(0, 0, 0), gp_Dir(0,1,0));" EOL
361     "  Handle(Geom_SurfaceOfRevolution) aSurface = new Geom_SurfaceOfRevolution(aBezierCurve, anAx);" EOL
362     );
363   
364   // array of the bezier curve poles
365   TColgp_Array1OfPnt aPoles(1,4);
366   // array of the poles' weights
367   TColStd_Array1OfReal aWeights(1,4);
368
369   aPoles(1) = gp_Pnt(0, 0, 0);      aWeights(1) = 1;
370   aPoles(2) = gp_Pnt(150, 250, 0);  aWeights(2) =75;
371   aPoles(3) = gp_Pnt(350, 150, 0);  aWeights(3) =120;
372   aPoles(4) = gp_Pnt(500, 500, 0);  aWeights(4) = 1;
373
374   Handle(Geom_BezierCurve) aBezierCurve = new Geom_BezierCurve(aPoles, aWeights);
375   drawCurve(Handle(Geom_Curve)::DownCast(aBezierCurve));
376
377   // creating a surface of revolution of the bezier curve around Y axis
378   gp_Ax1 anAx(gp_Pnt(0,0,0), gp_Dir(0,1,0));
379   Handle(Geom_SurfaceOfRevolution) aSurface = new Geom_SurfaceOfRevolution(aBezierCurve, anAx);
380
381   drawSurfaceAndItsBSpline (aSurface, aName, aText);
382   FitMode=true;
383 }
384
385 //================================================================
386 // Function : Convert_Presentation::sampleToroidalSurface
387 // Purpose  : 
388 //================================================================
389 void Convert_Presentation::sampleToroidalSurface()
390 {
391   getAISContext()->EraseAll();
392
393   Standard_CString aName = "Toroidal surface";
394   TCollection_AsciiString aText (
395     "  // creating an axis parallel to Y axis" EOL
396     "  gp_Ax3 anAx(gp_Pnt(0,0,0), gp_Dir(0,1,0));" EOL
397     "  // creating a toroidal surface with major radius = 240 and minor radius = 120" EOL
398     "  Handle(Geom_ToroidalSurface) aSurface = new Geom_ToroidalSurface(anAx, 240, 120);" EOL);
399
400   // creating an axis parallel to Y axis 
401   gp_Ax3 anAx(gp_Pnt(0,0,0), gp_Dir(0,1,0)); 
402   // creating a toroidal surface with major radius = 240 and minor radius = 120
403   Handle(Geom_ToroidalSurface) aSurface = new Geom_ToroidalSurface(anAx, 240, 120);
404
405   drawSurfaceAndItsBSpline(aSurface, aName, aText);
406 }
407
408 //================================================================
409 // Function : Convert_Presentation::sampleConicalSurface
410 // Purpose  : 
411 //================================================================
412 void Convert_Presentation::sampleConicalSurface()
413 {
414   getAISContext()->EraseAll();
415
416   Standard_CString aName = "Conical surface";
417   TCollection_AsciiString aText (
418     "  // creating an axis parallel to Z axis" EOL
419     "  gp_Ax3 anAx(gp_Pnt(0,0,0), gp_Dir(0,0,1)); " EOL
420     "  // creating a conical surface with base radius = 10 and angle = 20 deg" EOL
421     "  Handle(Geom_ConicalSurface) aConicalSurface = new Geom_ConicalSurface(anAx,PI/9., 10);" EOL EOL
422
423     "  // only finit surfaces can be converted to BSpline surfaces, " EOL
424     "  // conical surface is infinite, it must be trimmed" EOL
425     "  Handle(Geom_RectangularTrimmedSurface) aSurface = " EOL
426     "    new Geom_RectangularTrimmedSurface(aConicalSurface, 0, 2*PI, -1000, 1000, Standard_True, Standard_True);" EOL);
427
428   // creating an axis parallel to Z axis 
429   gp_Ax3 anAx(gp_Pnt(0,0,0), gp_Dir(0,0,1)); 
430   // creating a conical surface with base radius = 10 and angle = 20 deg
431   Handle(Geom_ConicalSurface) aConicalSurface = new Geom_ConicalSurface(anAx,M_PI/9., 10);
432
433   // only finit surfaces can be converted to BSpline surfaces, 
434   // conical surface is infinite, it must be trimmed
435   Handle(Geom_RectangularTrimmedSurface) aSurface = 
436     new Geom_RectangularTrimmedSurface(aConicalSurface, 0, 2*M_PI, -1000, 1000, Standard_True, Standard_True);
437
438   drawSurfaceAndItsBSpline(aSurface, aName, aText);
439 }
440
441 //================================================================
442 // Function : Convert_Presentation::sampleSphericalSurface
443 // Purpose  : 
444 //================================================================
445 void Convert_Presentation::sampleSphericalSurface()
446 {
447   getAISContext()->EraseAll();
448
449   Standard_CString aName = "Spherical surface";
450   TCollection_AsciiString aText (
451     "// creating an axis parallel to Z axis" EOL
452     "gp_Ax3 anAx(gp_Pnt(0,0,0), gp_Dir(0,0,1));" EOL
453     "// creating a spherical surface with radius = 300" EOL
454     "Handle(Geom_SphericalSurface) aSurface = new Geom_SphericalSurface(anAx,300);" EOL);
455
456   // creating an axis parallel to Z axis 
457   gp_Ax3 anAx(gp_Pnt(0,0,0), gp_Dir(0,0,1)); 
458   // creating a spherical surface with radius = 300
459   Handle(Geom_SphericalSurface) aSurface = new Geom_SphericalSurface(anAx,300);
460
461   drawSurfaceAndItsBSpline(aSurface, aName, aText);
462 }
463