0029987: Request for translation of French comments in the code
[occt.git] / samples / mfc / occtdemo / Offset2d / Offset2d_Presentation.cpp
1 // Offset2d_Presentation.cpp: implementation of the Offset2d_Presentation class.
2 // Presentation class: Offset of curves and wires
3 //////////////////////////////////////////////////////////////////////
4
5 #include "stdafx.h"
6 #include "Offset2d_Presentation.h"
7 #include <ISession_Curve.h>
8
9 #include <Geom2d_OffsetCurve.hxx>
10 #include <gp.hxx>
11 #include <gp_Dir2d.hxx>
12 #include <gp_Ax2d.hxx>
13 #include <Quantity_Color.hxx>
14 #include <Geom2d_Circle.hxx>
15 #include <Geom2d_Ellipse.hxx>
16 #include <Geom2d_Parabola.hxx>
17 #include <Geom2d_Hyperbola.hxx>
18 #include <Geom2d_BezierCurve.hxx>
19 #include <Geom2d_BSplineCurve.hxx>
20 #include <TColgp_Array1OfPnt2d.hxx>
21 #include <TColStd_Array1OfReal.hxx>
22 #include <TColStd_Array1OfInteger.hxx>
23 #include <BRepBuilderAPI_MakePolygon.hxx>
24 #include <BRepOffsetAPI_MakeOffset.hxx>
25 #include <TopoDS_Wire.hxx>
26
27
28 // Initialization of global variable with an instance of this class
29 OCCDemo_Presentation* OCCDemo_Presentation::Current = new Offset2d_Presentation;
30
31 // Initialization of array of samples
32 const Offset2d_Presentation::SampleDescrType Offset2d_Presentation::SampleDescrs[] =
33 {
34   {&Offset2d_Presentation::sampleCircle, 4, -20, 4, 20},
35   {&Offset2d_Presentation::sampleEllipse, 4, -20, 4, 20},
36   {&Offset2d_Presentation::sampleParabola, 4, -20., 4, 20},
37   {&Offset2d_Presentation::sampleHyperbola, 4, -20., 4, 20},
38   //{&Offset2d_Presentation::sampleBezier, 4, -10, 4, 10},
39   {&Offset2d_Presentation::samplePBSpline, 4, -10, 8, 10},
40   {&Offset2d_Presentation::sampleWire1, 0, 0, 4, 10},
41   {&Offset2d_Presentation::sampleWire2, 4, -10, 3, 10}
42 };
43
44 // Colors of objects
45 static const Quantity_Color CurveColor       (1,1,0, Quantity_TOC_RGB);      // yellow
46 static const Quantity_Color OffsetCurveColor (1,0.647,0, Quantity_TOC_RGB);  // orange
47
48 #ifdef WNT
49  #define EOL "\r\n"
50 #else
51  #define EOL "\n"
52 #endif
53
54 //////////////////////////////////////////////////////////////////////
55 // Construction/Destruction
56 //////////////////////////////////////////////////////////////////////
57
58 Offset2d_Presentation::Offset2d_Presentation()
59 {
60   myNbSamples = sizeof(SampleDescrs)/sizeof(SampleDescrType);
61   setName ("Offset Curves");
62 }
63
64 //////////////////////////////////////////////////////////////////////
65 // Sample execution
66 //////////////////////////////////////////////////////////////////////
67
68 void Offset2d_Presentation::DoSample()
69 {
70   getAISContext()->EraseAll();
71   if (myIndex >=0 && myIndex < myNbSamples)
72     (this->*SampleDescrs[myIndex].pFunc)();
73 }
74
75 //////////////////////////////////////////////////////////////////////
76 // Sample functions
77 //////////////////////////////////////////////////////////////////////
78
79 void Offset2d_Presentation::sampleCircle()
80 {
81   Standard_CString aName = "2d Circle";
82   // Create a Circle in 2d
83   gp_Pnt2d aOrigin (0,0);
84   gp_Dir2d aDir (1,0);
85   gp_Ax2d aAxis (aOrigin, aDir);
86   Standard_Real aRadius = 300;
87   Handle(Geom2d_Circle) aCurve = new Geom2d_Circle (aAxis, aRadius);
88
89   TCollection_AsciiString aText (
90     "  // Create a Circle in 2d" EOL
91     "  gp_Pnt2d aOrigin (0,0);" EOL
92     "  gp_Dir2d aDir (1,0);" EOL
93     "  gp_Ax2d aAxis (aOrigin, aDir);" EOL
94     "  Standard_Real aRadius = 300;" EOL
95     "  Handle(Geom2d_Circle) aCurve = new Geom2d_Circle (aAxis, aRadius);" EOL
96     );
97   drawAndOffsetCurve2d (aCurve, aName, aText);
98 }
99
100 void Offset2d_Presentation::sampleEllipse()
101 {
102   Standard_CString aName = "2d Ellipse";
103   // Create an Ellipse in 2d
104   gp_Pnt2d aOrigin (0,0);
105   gp_Dir2d aDir (1,0);
106   gp_Ax2d aMajorAxis (aOrigin, aDir);
107   Standard_Real aMajorRadius = 300;
108   Standard_Real aMinorRadius = 150;
109   Handle(Geom2d_Ellipse) aCurve = 
110     new Geom2d_Ellipse (aMajorAxis, aMajorRadius, aMinorRadius);
111
112   TCollection_AsciiString aText (
113     "  // Create an Ellipse in 2d" EOL
114     "  gp_Pnt2d aOrigin (0,0);" EOL
115     "  gp_Dir2d aDir (1,0);" EOL
116     "  gp_Ax2d aMajorAxis (aOrigin, aDir);" EOL
117     "  Standard_Real aMajorRadius = 300;" EOL
118     "  Standard_Real aMinorRadius = 150;" EOL
119     "  Handle(Geom2d_Ellipse) aCurve = " EOL
120     "    new Geom2d_Ellipse (aMajorAxis, aMajorRadius, aMinorRadius);" EOL
121     );
122   drawAndOffsetCurve2d (aCurve, aName, aText);
123 }
124
125 void Offset2d_Presentation::sampleParabola()
126 {
127   Standard_CString aName = "2d Parabola";
128   // Create a Parabola in 2d
129   gp_Pnt2d aOrigin (0,0);
130   gp_Dir2d aDir (0,1);
131   gp_Ax2d aMirrorAxis (aOrigin, aDir);
132   Standard_Real aFocal = 100;
133   Handle(Geom2d_Parabola) aCurve = 
134     new Geom2d_Parabola (aMirrorAxis, aFocal);
135
136   TCollection_AsciiString aText (
137     "  // Create a Parabola in 2d" EOL
138     "  gp_Pnt2d aOrigin (0,0);" EOL
139     "  gp_Dir2d aDir (0,1);" EOL
140     "  gp_Ax2d aMirrorAxis (aOrigin, aDir);" EOL
141     "  Standard_Real aFocal = 100;" EOL
142     "  Handle(Geom2d_Parabola) aCurve = " EOL
143     "    new Geom2d_Parabola (aMirrorAxis, aFocal);" EOL
144     );
145   drawAndOffsetCurve2d (aCurve, aName, aText);
146 }
147
148 void Offset2d_Presentation::sampleHyperbola()
149 {
150   Standard_CString aName = "2d Hyperbola";
151   // Create a Hyperbola in 2d
152   gp_Pnt2d aOrigin (0,0);
153   gp_Dir2d aDir (1,1);
154   gp_Ax2d aMajorAxis (aOrigin, aDir);
155   Standard_Real aMajorRadius = 100;
156   Standard_Real aMinorRadius = 100;
157   Handle(Geom2d_Hyperbola) aCurve = 
158     new Geom2d_Hyperbola (aMajorAxis, aMajorRadius, aMinorRadius);
159
160   TCollection_AsciiString aText (
161     "  // Create a Hyperbola in 2d" EOL
162     "  gp_Pnt2d aOrigin (0,0);" EOL
163     "  gp_Dir2d aDir (1,1);" EOL
164     "  gp_Ax2d aMajorAxis (aOrigin, aDir);" EOL
165     "  Standard_Real aMajorRadius = 100;" EOL
166     "  Standard_Real aMinorRadius = 100;" EOL
167     "  Handle(Geom2d_Hyperbola) aCurve = " EOL
168     "    new Geom2d_Hyperbola (aMajorAxis, aMajorRadius, aMinorRadius);" EOL
169     );
170   drawAndOffsetCurve2d (aCurve, aName, aText);
171 }
172
173 void Offset2d_Presentation::sampleBezier()
174 {
175   Standard_CString aName = "2d BezierCurve";
176   // Create a BezierCurve in 2d
177   Standard_Real aPolesCoords[][2] = {
178     {0,0},{0,1},{1,1},{1,2},{2,2},{2,1},{3,1},{3,0},{2,0},{2,-1},
179     {3,-1},{3,-2},{4,-2},{4,-1},{5,-1},{5,0},{6,0},{6,-1},{7,-1},
180     {7,0},{8,0},{8,1},{7,1},{7,2},{6,2},{6,1},{5,1}
181   };
182   TColgp_Array1OfPnt2d aPoles (1, sizeof(aPolesCoords)/(sizeof(Standard_Real)*2));
183  
184   for (Standard_Integer i=1; i <= aPoles.Upper(); i++)
185     aPoles(i) = gp_Pnt2d (aPolesCoords[i-1][0]*100, aPolesCoords[i-1][1]*100);
186   
187   Handle(Geom2d_BezierCurve) aCurve = 
188     new Geom2d_BezierCurve (aPoles);
189
190   TCollection_AsciiString aText (
191     "  // Create a BezierCurve in 2d" EOL
192     "  Standard_Real aPolesCoords[][2] = {" EOL
193     "    {0,0},{0,1},{1,1},{1,2},{2,2},{2,1},{3,1},{3,0},{2,0},{2,-1}," EOL
194     "    {3,-1},{3,-2},{4,-2},{4,-1},{5,-1},{5,0},{6,0},{6,-1},{7,-1}," EOL
195     "    {7,0},{8,0},{8,1},{7,1},{7,2},{6,2},{6,1},{5,1}" EOL
196     "  };" EOL
197     "  TColgp_Array1OfPnt2d aPoles (1, sizeof(aPolesCoords)/(sizeof(Standard_Real)*2));" EOL
198     " " EOL
199     "  for (Standard_Integer i=1; i <= aPoles.Upper(); i++)" EOL
200     "    aPoles(i) = gp_Pnt2d (aPolesCoords[i-1][0]*100, aPolesCoords[i-1][1]*100);" EOL
201     "  " EOL
202     "  Handle(Geom2d_BezierCurve) aCurve = " EOL
203     "    new Geom2d_BezierCurve (aPoles);" EOL
204     );
205   drawAndOffsetCurve2d (aCurve, aName, aText);
206 }
207
208 void Offset2d_Presentation::samplePBSpline()
209 {
210   Standard_CString aName = "2d BSplineCurve";
211   // Create a Periodic BSplineCurve in 2d
212   Standard_Real aPolesCoords[][2] = {
213     {0,0},{0,1},{1,1},{1,0},{2,0},{2,-1},{1,-1},
214     {1,-2},{0,-2},{0,-1},{-1,-1},{-1,0}
215   };
216   Standard_Integer nPoles = sizeof(aPolesCoords)/(sizeof(Standard_Real)*2);
217   TColgp_Array1OfPnt2d aPoles (1, nPoles);
218   TColStd_Array1OfReal aKnots (1, nPoles+1);
219   TColStd_Array1OfInteger aMultiplicities(1, nPoles+1);
220   const Standard_Integer aDegree = 3;
221   const Standard_Boolean isPeriodic = Standard_True;
222
223   for (Standard_Integer i=1; i <= aPoles.Upper(); i++)
224     aPoles(i) = gp_Pnt2d (aPolesCoords[i-1][0]*100, aPolesCoords[i-1][1]*100);
225   for (i=1; i <= aKnots.Upper(); i++)
226     aKnots(i) = i-1;
227   aMultiplicities.Init(1);
228
229   Handle(Geom2d_BSplineCurve) aCurve = 
230     new Geom2d_BSplineCurve (aPoles, aKnots, aMultiplicities, aDegree, isPeriodic);
231
232   TCollection_AsciiString aText (
233     "  // Create a Periodic BSplineCurve in 2d" EOL
234     "  Standard_Real aPolesCoords[][2] = {" EOL
235     "    {0,0},{0,1},{1,1},{1,0},{2,0},{2,-1},{1,-1}," EOL
236     "    {1,-2},{0,-2},{0,-1},{-1,-1},{-1,0}" EOL
237     "  };" EOL
238     "  Standard_Integer nPoles = sizeof(aPolesCoords)/(sizeof(Standard_Real)*2);" EOL
239     "  TColgp_Array1OfPnt2d aPoles (1, nPoles);" EOL
240     "  TColStd_Array1OfReal aKnots (1, nPoles+1);" EOL
241     "  TColStd_Array1OfInteger aMultiplicities(1, nPoles+1);" EOL
242     "  const Standard_Integer aDegree = 3;" EOL
243     "  const Standard_Boolean isPeriodic = Standard_True;" EOL
244     "" EOL
245     "  for (Standard_Integer i=1; i <= aPoles.Upper(); i++)" EOL
246     "    aPoles(i) = gp_Pnt2d (aPolesCoords[i-1][0]*100, aPolesCoords[i-1][1]*100);" EOL
247     "  for (i=1; i <= aKnots.Upper(); i++)" EOL
248     "    aKnots(i) = i-1;" EOL
249     "  aMultiplicities.Init(1);" EOL
250     "" EOL
251     "  Handle(Geom2d_BSplineCurve) aCurve = " EOL
252     "    new Geom2d_BSplineCurve (aPoles, aKnots, aMultiplicities, aDegree, isPeriodic);" EOL
253     );
254   drawAndOffsetCurve2d (aCurve, aName, aText);
255 }
256
257 void Offset2d_Presentation::sampleWire1()
258 {
259   Standard_CString aName = "Wire 1";
260   // Create an open polyline wire
261   Standard_Real aCoords[][3] = {
262     {0,0,0},{0,1,0},{1,1,0},{1,2,0},{2,2,0},{2,1,0},{3,1,0},{3,0,0},
263     {2,0,0},{2,-1,0},{3,-1,0},{3,-2,0},{4,-2,0},{4,-1,0},{5,-1,0},
264     {5,0,0},{6,0,0},{6,-1,0},{7,-1,0},{7,0,0},{8,0,0},{8,1,0},
265     {7,1,0},{7,2,0},{6,2,0},{6,1,0},{5,1,0}
266   };
267   Standard_Integer nPoints = sizeof(aCoords)/(sizeof(Standard_Real)*3);
268   BRepBuilderAPI_MakePolygon aPol;
269   for (Standard_Integer i=0; i < nPoints; i++)
270     aPol.Add (gp_Pnt (aCoords[i][0]*100, aCoords[i][1]*100, aCoords[i][2]*100));
271   TopoDS_Wire aWire = aPol.Wire();
272
273   TCollection_AsciiString aText (
274     "  // Create an open polyline wire" EOL
275     "  Standard_Real aCoords[][3] = {" EOL
276     "    {0,0,0},{0,1,0},{1,1,0},{1,2,0},{2,2,0},{2,1,0},{3,1,0},{3,0,0}," EOL
277     "    {2,0,0},{2,-1,0},{3,-1,0},{3,-2,0},{4,-2,0},{4,-1,0},{5,-1,0}," EOL
278     "    {5,0,0},{6,0,0},{6,-1,0},{7,-1,0},{7,0,0},{8,0,0},{8,1,0}," EOL
279     "    {7,1,0},{7,2,0},{6,2,0},{6,1,0},{5,1,0}" EOL
280     "  };" EOL
281     "  Standard_Integer nPoints = sizeof(aCoords)/(sizeof(Standard_Real)*3);" EOL
282     "  BRepBuilderAPI_MakePolygon aPol;" EOL
283     "  for (Standard_Integer i=0; i < nPoints; i++)" EOL
284     "    aPol.Add (gp_Pnt (aCoords[i][0]*100, aCoords[i][1]*100, aCoords[i][2]*100));" EOL
285     "  TopoDS_Wire aWire = aPol.Wire();" EOL
286     );
287   drawAndOffsetWire (aWire, aName, aText);
288 }
289
290 void Offset2d_Presentation::sampleWire2()
291 {
292   Standard_CString aName = "Wire 2";
293   // Create a closed polyline wire
294   Standard_Real aCoords[][3] = {
295     {0,0,0},{0,1,0},{1,1,0},{1,0,0},{2,0,0},{2,-1,0},{1,-1,0},
296     {1,-2,0},{0,-2,0},{0,-1,0},{-1,-1,0},{-1,0,0},{0,0,0}
297   };
298   Standard_Integer nPoints = sizeof(aCoords)/(sizeof(Standard_Real)*3);
299   BRepBuilderAPI_MakePolygon aPol;
300   for (Standard_Integer i=0; i < nPoints; i++)
301     aPol.Add (gp_Pnt (aCoords[i][0]*100, aCoords[i][1]*100, aCoords[i][2]*100));
302   TopoDS_Wire aWire = aPol.Wire();
303
304   TCollection_AsciiString aText (
305     "  // Create a closed polyline wire" EOL
306     "  Standard_Real aCoords[][3] = {" EOL
307     "    {0,0,0},{0,1,0},{1,1,0},{1,0,0},{2,0,0},{2,-1,0},{1,-1,0}," EOL
308     "    {1,-2,0},{0,-2,0},{0,-1,0},{-1,-1,0},{-1,0,0},{0,0,0}" EOL
309     "  };" EOL
310     "  Standard_Integer nPoints = sizeof(aCoords)/(sizeof(Standard_Real)*3);" EOL
311     "  BRepBuilderAPI_MakePolygon aPol;" EOL
312     "  for (Standard_Integer i=0; i < nPoints; i++)" EOL
313     "    aPol.Add (gp_Pnt (aCoords[i][0]*100, aCoords[i][1]*100, aCoords[i][2]*100));" EOL
314     "  TopoDS_Wire aWire = aPol.Wire();" EOL
315     );
316   drawAndOffsetWire (aWire, aName, aText);
317 }
318
319 void Offset2d_Presentation::drawAndOffsetCurve2d (Handle(Geom2d_Curve) theCurve,
320                                                 const Standard_CString theName,
321                                                 TCollection_AsciiString& theText)
322 {
323   TCollection_AsciiString aTitle ("Offset to ");
324   aTitle += theName;
325   theText += EOL;
326   theText += "  // Make an offset curve" EOL;
327   theText += "  Standard_Real aDist = ";
328   theText += TCollection_AsciiString (SampleDescrs[myIndex].dPos);
329   theText += ";" EOL;
330   theText += "  Handle(Geom2d_OffsetCurve) aOffCurve =" EOL;
331   theText += "    new Geom2d_OffsetCurve (aCurve, aDist);" EOL;
332   setResultTitle (aTitle.ToCString());
333   setResultText (theText.ToCString());
334
335   // Display theCurve
336   drawCurve (theCurve, CurveColor);
337   getViewer()->InitActiveViews();
338   getViewer()->ActiveView()->FitAll();
339   getViewer()->ActiveView()->Update();
340
341   // Make offset curves
342   Handle(AIS_InteractiveObject) aObj;
343   for (int i=1; i <= SampleDescrs[myIndex].nNeg; i++)
344   {
345     if (WAIT_A_LITTLE)
346       return;
347     if (!aObj.IsNull())
348       getAISContext()->Erase(aObj);
349     Standard_Real aDist = SampleDescrs[myIndex].dNeg * i;
350     Handle(Geom2d_OffsetCurve) aOffCurve = new Geom2d_OffsetCurve (theCurve, aDist);
351     aObj = drawCurve (aOffCurve, OffsetCurveColor);
352   }
353   for (i=1; i <= SampleDescrs[myIndex].nPos; i++)
354   {
355     if (WAIT_A_LITTLE)
356       return;
357     if (!aObj.IsNull())
358       getAISContext()->Erase(aObj);
359     Standard_Real aDist = SampleDescrs[myIndex].dPos * i;
360     Handle(Geom2d_OffsetCurve) aOffCurve = new Geom2d_OffsetCurve (theCurve, aDist);
361     aObj = drawCurve (aOffCurve, OffsetCurveColor);
362   }
363 }
364
365 void Offset2d_Presentation::drawAndOffsetWire(const TopoDS_Wire& theWire,
366                                             const Standard_CString theName,
367                                             TCollection_AsciiString& theText)
368 {
369   TCollection_AsciiString aTitle ("Offset to ");
370   aTitle += theName;
371   theText += EOL;
372   theText += "  // Make an offset shape" EOL;
373   theText += "  Standard_Real aDist = ";
374   theText += TCollection_AsciiString (SampleDescrs[myIndex].dPos);
375   theText += ";" EOL;
376   theText += "  BRepOffsetAPI_MakeOffset aOffAlgo (aWire, GeomAbs_Arc);" EOL;
377   theText += "  aOffAlgo.Perform (aDist);" EOL;
378   theText += "  if (aOffAlgo.IsDone())" EOL;
379   theText += "    TopoDS_Shape aOffShape = aOffAlgo.Shape();" EOL;
380   setResultTitle (aTitle.ToCString());
381   setResultText (theText.ToCString());
382
383   // Display theWire
384   Handle(AIS_InteractiveObject) aObj = new AIS_Shape (theWire);
385   getAISContext()->SetColor (aObj, CurveColor);
386   getAISContext()->Display (aObj);
387   getViewer()->InitActiveViews();
388   getViewer()->ActiveView()->FitAll();
389   getViewer()->ActiveView()->Update();
390
391   // Make offset shapes
392   aObj.Nullify();
393   for (int i=1; i <= SampleDescrs[myIndex].nNeg; i++)
394   {
395     if (WAIT_A_LITTLE)
396       return;
397     if (!aObj.IsNull())
398       getAISContext()->Erase(aObj);
399     Standard_Real aDist = SampleDescrs[myIndex].dNeg * i;
400     BRepOffsetAPI_MakeOffset aOffAlgo (theWire, GeomAbs_Arc);
401     aOffAlgo.Perform (aDist);
402     if (aOffAlgo.IsDone())
403     {
404       TopoDS_Shape aOffShape = aOffAlgo.Shape();
405       aObj = new AIS_Shape (aOffShape);
406       getAISContext()->SetColor (aObj, OffsetCurveColor);
407       getAISContext()->Display (aObj);
408     }
409   }
410   for (i=1; i <= SampleDescrs[myIndex].nPos; i++)
411   {
412     if (WAIT_A_LITTLE)
413       return;
414     if (!aObj.IsNull())
415       getAISContext()->Erase(aObj);
416     Standard_Real aDist = SampleDescrs[myIndex].dPos * i;
417     BRepOffsetAPI_MakeOffset aOffAlgo (theWire, GeomAbs_Arc);
418     aOffAlgo.Perform (aDist);
419     if (aOffAlgo.IsDone())
420     {
421       TopoDS_Shape aOffShape = aOffAlgo.Shape();
422       aObj = new AIS_Shape (aOffShape);
423       getAISContext()->SetColor (aObj, OffsetCurveColor);
424       getAISContext()->Display (aObj);
425     }
426   }
427 }