Integration of OCCT 6.5.0 from SVN
[occt.git] / samples / mfc / occtdemo / GeomConstraints / GeomConstraints_Presentation.cpp
1 // GeomConstraints_Presentation.cpp: implementation of the GeomConstraints_Presentation class.
2 // Construct curves and surfaces from constraints
3 //////////////////////////////////////////////////////////////////////
4
5 #include "stdafx.h"
6 #include "GeomConstraints_Presentation.h"
7 #include <OCCDemo_Presentation.h>
8
9 #include <Standard_Stream.hxx>
10 #include <gp_Pnt.hxx>
11 #include <gp_Pnt2d.hxx>
12 #include <gp_Dir.hxx>
13 #include <gp_Dir2d.hxx>
14 #include <gp_Ax2.hxx>
15 #include <gp_Ax2d.hxx>
16 #include <gp_Lin.hxx>
17 #include <gp_Lin2d.hxx>
18
19 #include <GeomAdaptor_HCurve.hxx>
20 #include <Geom_Surface.hxx>
21 #include <Geom_BSplineCurve.hxx>
22 #include <Geom_BezierCurve.hxx>
23 #include <Geom_BSplineSurface.hxx>
24 #include <Geom_Curve.hxx>
25 #include <Geom_TrimmedCurve.hxx>
26 #include <Geom_RectangularTrimmedSurface.hxx>
27 #include <Geom_Line.hxx>
28 #include <Geom_Plane.hxx>
29 #include <Geom2d_Line.hxx>
30 #include <Geom2d_Circle.hxx>
31 #include <Geom2d_TrimmedCurve.hxx>
32
33 #include <GeomPlate_Surface.hxx>
34 #include <GeomPlate_MakeApprox.hxx>
35 #include <GeomPlate_PointConstraint.hxx>
36 #include <GeomPlate_BuildPlateSurface.hxx>
37 #include <BRepFill_CurveConstraint.hxx>
38 #include <GeomFill_SimpleBound.hxx>
39 #include <GeomFill_ConstrainedFilling.hxx>
40 #include <GeomFill_BSplineCurves.hxx>
41 #include <Geom2d_BSplineCurve.hxx>
42 #include <GeomFill_BezierCurves.hxx>
43 #include <FairCurve_AnalysisCode.hxx>
44 #include <FairCurve_Batten.hxx>
45 #include <TColgp_Array1OfPnt.hxx>
46 #include <Precision.hxx>
47 #include <GeomAPI_PointsToBSpline.hxx>
48
49 #ifdef WNT
50  #define EOL "\r\n"
51 #else
52  #define EOL "\n"
53 #endif
54
55 // Initialization of global variable with an instance of this class
56 OCCDemo_Presentation* OCCDemo_Presentation::Current = new GeomConstraints_Presentation;
57
58 // Initialization of array of samples
59 const GeomConstraints_Presentation::PSampleFuncType GeomConstraints_Presentation::SampleFuncs[] =
60
61   &GeomConstraints_Presentation::sample1,
62   &GeomConstraints_Presentation::sample2,
63   &GeomConstraints_Presentation::sample3,
64   &GeomConstraints_Presentation::sample4,
65   &GeomConstraints_Presentation::sample5,
66   &GeomConstraints_Presentation::sample6
67 };
68
69
70
71 //////////////////////////////////////////////////////////////////////
72 // Construction/Destruction
73 //////////////////////////////////////////////////////////////////////
74
75 GeomConstraints_Presentation::GeomConstraints_Presentation()
76 {
77   myIndex = 0;
78   myNbSamples = sizeof(SampleFuncs)/sizeof(PSampleFuncType);
79   setName ("GeomConstraints");
80 }
81
82 //=========================================================================================
83 // Sample execution
84 //=========================================================================================
85
86 void GeomConstraints_Presentation::DoSample()
87 {
88   getAISContext()->EraseAll();
89   if (myIndex >=0 && myIndex < myNbSamples)
90     (this->*SampleFuncs[myIndex])();
91 }
92
93
94 //=========================================================================================
95 // Function creating Surface,BSPline,Bezier and 2dBSpline Curves
96 //=========================================================================================
97
98 static Handle_Geom_BSplineCurve createBSplineCurve(const Standard_Integer nPoles,
99                                  const Standard_Real theCoords[][3])
100 {
101   TColgp_Array1OfPnt aCurvePoint (1, nPoles);
102
103   for (Standard_Integer i=0; i < nPoles; i++)
104     aCurvePoint(i+1) = gp_Pnt (theCoords[i][0]*100, theCoords[i][1]*100, theCoords[i][2]*100);
105
106   Standard_Integer MinDegree = 3;
107   Standard_Integer MaxDegree = 8;
108
109   return GeomAPI_PointsToBSpline (
110     aCurvePoint, MinDegree, MaxDegree, GeomAbs_C2, Precision::Confusion());
111 }
112
113
114 static Handle_Geom_BezierCurve createBezierCurve(const Standard_Integer nPoles,
115                                  const Standard_Real theCoords[][3])
116 {
117   TColgp_Array1OfPnt aCurvePoint (1, nPoles);
118
119   for (Standard_Integer i=0; i < nPoles; i++)
120     aCurvePoint(i+1) = gp_Pnt (theCoords[i][0]*100, theCoords[i][1]*100, theCoords[i][2]*100);
121  
122   Handle(Geom_BezierCurve) aBCurve = new Geom_BezierCurve(aCurvePoint);
123   return aBCurve;
124 }
125
126 static Handle_Geom2d_BSplineCurve battenCurve(const Standard_Real& theAngle1,
127                                                 const Standard_Real& theAngle2)
128 {
129    //define points
130   gp_Pnt2d aPoint1(-500,0);
131   gp_Pnt2d aPoint2(400,0);
132   
133   //define height
134   Standard_Real Height = 5;
135
136   // method batten
137   FairCurve_Batten aBatten(aPoint1,aPoint2,Height);
138
139   //change parameters
140   aBatten.SetAngle1(theAngle1);
141   aBatten.SetAngle2(theAngle2);
142   FairCurve_AnalysisCode aCode;
143   Standard_Boolean aCompute = aBatten.Compute(aCode);
144     
145   Handle(Geom2d_BSplineCurve) theCurve;
146   if(aCompute)
147     theCurve = aBatten.Curve();
148   return theCurve;
149 }
150
151
152 static Handle_Geom_Surface createSurface(
153                                  const Standard_Integer endBound,
154                                  TColgp_Array1OfPnt& thePoint,
155                                  const Handle_Geom_Plane& thePlane)
156 {
157   Standard_Integer Degree = 3;
158   Standard_Integer NbPtsOnCur = 10;
159   Standard_Integer NbIter = 3;
160   Standard_Integer Order = 0;
161   Standard_Integer MaxSeg=9;
162   Standard_Integer MaxDegree=5;
163   Standard_Real dmax,anApproxTol = 0.001, aConstrTol = Precision::Confusion();
164   
165   // define object BuildPlateSurface
166   GeomPlate_BuildPlateSurface BPSurf(Degree,NbPtsOnCur,NbIter);
167   BPSurf.LoadInitSurface(thePlane);
168   
169   for (Standard_Integer i = 1; i <= endBound ; i++)
170   {
171   // points constraint
172     Handle(GeomPlate_PointConstraint) PCont = 
173       new GeomPlate_PointConstraint(thePoint.Value(i),Order, aConstrTol);
174     BPSurf.Add(PCont);
175   }
176   BPSurf.Perform();
177
178   // make PlateSurface
179   Handle(GeomPlate_Surface) PSurf;
180   Handle(Geom_Surface) aSurf;
181   
182   if (BPSurf.IsDone())
183   {
184     PSurf = BPSurf.Surface();
185
186     // define parameter approximation
187     dmax = Max(0.01,10*BPSurf.G0Error());
188
189     // make approximation
190     GeomPlate_MakeApprox Mapp(PSurf,anApproxTol, MaxSeg,MaxDegree,dmax);
191     aSurf = Mapp.Surface();
192   }
193
194   return aSurf;
195 }
196
197 //////////////////////////////////////////////////////////////////////
198 // Sample functions
199 //////////////////////////////////////////////////////////////////////
200
201
202 //==========================================================================================
203 // Function : GeomConstraints_Presentation::sample1
204 // Purpose  : 
205 //==========================================================================================
206
207 void GeomConstraints_Presentation::sample1()
208 {
209   setResultTitle("Method Batten (Create 2dBSpline Curve)");
210   TCollection_AsciiString aText(
211     " // define points" EOL
212     " gp_Pnt2d aPoint1(-500,0);" EOL
213     " gp_Pnt2d aPoint2(400,0);" EOL EOL
214
215     " // define height" EOL
216     " Standard_Real Height = 5;" EOL EOL
217     
218     " // construct algo" EOL
219     " FairCurve_Batten aBatten(aPoint1,aPoint2,Height);" EOL EOL
220     
221     " // set constraint angles " EOL
222     " Standard_Real Angle1 = PI/4; " EOL
223     " Standard_Real Angle2 = PI/3; " EOL
224     " aBatten.SetAngle1(Angle1);" EOL
225     " aBatten.SetAngle2(Angle2);" EOL EOL
226
227     " FairCurve_AnalysisCode aCode;" EOL 
228     " Standard_Boolean aCompute = aBatten.Compute(aCode);" EOL EOL
229
230     " // create BSpline Curve " EOL
231     " Handle(Geom2d_BSplineCurve) aCurve; " EOL
232     " if(aCompute) " EOL
233     "   aCurve = aBatten.Curve();" EOL EOL
234   );
235   setResultText(aText.ToCString());
236   
237   // define points
238   gp_Pnt2d aPoint1(-500,0);
239   gp_Pnt2d aPoint2(400,0);
240
241   Standard_Real Angle1=0,Angle2=0;
242   Standard_Real Angle3=PI/9,Angle4=PI/4,Angle5=PI/3;
243  
244   Handle(Geom2d_BSplineCurve) aCurve = battenCurve(Angle1,Angle2);
245   Handle(Geom2d_BSplineCurve) aCurve1 = battenCurve(Angle3,Angle3);
246   Handle(Geom2d_BSplineCurve) aCurve2 = battenCurve(Angle4,Angle5);
247   
248   // output 
249   gp_Pnt aPoint(0,0,0);
250   gp_Pnt aPnt1(-500,0,0);
251   gp_Pnt aPnt2(400,0,0);
252   gp_Dir aDir(0,0,1);
253   gp_Ax2 anAx2(aPoint,aDir);
254   
255   Handle(Geom2d_Line) aLine = new Geom2d_Line(aPoint1,gp_Dir2d(1,0));
256   Handle(Geom2d_TrimmedCurve) aTrimmedLine =
257     new Geom2d_TrimmedCurve(aLine,-250,aPoint1.Distance(aPoint2) + 250);
258   
259   gp_Lin2d aLin(aPoint1,gp_Dir2d(1,0)) ;
260   Handle(Geom2d_Line) aLine10 = new Geom2d_Line(aLin.Rotated(aPoint1,PI/9));
261   Handle(Geom2d_Line) aLine11 = new Geom2d_Line(aLin.Rotated(aPoint1,PI/4));
262   Handle(Geom2d_TrimmedCurve) aTrimmedLine10 = 
263     new Geom2d_TrimmedCurve(aLine10,0,300);
264   Handle(Geom2d_TrimmedCurve) aTrimmedLine11 = 
265     new Geom2d_TrimmedCurve(aLine11,0,300);
266   
267   gp_Lin2d aLin1(aPoint2,gp_Dir2d(-1,0)) ;
268   Handle(Geom2d_Line) aLine20 = new Geom2d_Line(aLin1.Rotated(aPoint2,-PI/9));
269   Handle(Geom2d_Line) aLine21 = new Geom2d_Line(aLin1.Rotated(aPoint2,-PI/3));
270   Handle(Geom2d_TrimmedCurve) aTrimmedLine20 = 
271     new Geom2d_TrimmedCurve(aLine20,0,300);
272   Handle(Geom2d_TrimmedCurve) aTrimmedLine21 = 
273     new Geom2d_TrimmedCurve(aLine21,0,300);
274   
275   gp_Ax2d anAx2d_1(aPoint1,gp_Dir2d(1,0));
276   gp_Ax2d anAx2d_2(aPoint2,gp_Dir2d(-1,0));
277   Standard_Real Radius = 200;
278   Handle(Geom2d_Circle) aCircle1_1 = new 
279     Geom2d_Circle(anAx2d_1,Radius);
280   Handle(Geom2d_Circle) aCircle2_1 = new 
281     Geom2d_Circle(anAx2d_2,Radius);
282
283   Handle(Geom2d_TrimmedCurve) aTrimmedCircle1_1 = 
284     new Geom2d_TrimmedCurve(aCircle1_1,0,PI/9);
285   Handle(Geom2d_TrimmedCurve) aTrimmedCircle1_2 =
286     new Geom2d_TrimmedCurve(aCircle2_1,-PI/9,0);
287   Handle(Geom2d_TrimmedCurve) aTrimmedCircle2_1 = 
288     new Geom2d_TrimmedCurve(aCircle1_1,0,PI/4);
289   Handle(Geom2d_TrimmedCurve) aTrimmedCircle2_2 = 
290     new Geom2d_TrimmedCurve(aCircle2_1,-PI/3,0);
291   
292   Handle(AIS_InteractiveObject) aObjs1[10];
293   
294   // output point
295   drawPoint(aPnt1);
296   drawPoint(aPnt2);
297   
298   drawCurve(aTrimmedLine,Quantity_Color(Quantity_NOC_GRAY),Standard_True,anAx2);
299   // output first curve
300   aObjs1[0]=drawCurve(aCurve,Quantity_Color(Quantity_NOC_RED),Standard_True,anAx2);
301   if(WAIT_A_SECOND) return;
302   getAISContext()->Erase(aObjs1[0]);
303   
304   // output second curve
305   aObjs1[1]=drawCurve(aTrimmedLine20,Quantity_Color(Quantity_NOC_GRAY),Standard_True,anAx2);
306   aObjs1[2]=drawCurve(aTrimmedLine10,Quantity_Color(Quantity_NOC_GRAY),Standard_True,anAx2);
307   aObjs1[3]=drawCurve(aTrimmedCircle1_1,Quantity_Color(Quantity_NOC_GRAY),Standard_True,anAx2);
308   aObjs1[4]=drawCurve(aTrimmedCircle1_2,Quantity_Color(Quantity_NOC_GRAY),Standard_True,anAx2);
309   aObjs1[5]=drawCurve(aCurve1,Quantity_Color(Quantity_NOC_RED),Standard_True,anAx2);
310   if(WAIT_A_SECOND) return;
311   
312   getAISContext()->Erase(aObjs1[1],Standard_False);
313   getAISContext()->Erase(aObjs1[2],Standard_False);
314   getAISContext()->Erase(aObjs1[3],Standard_False);
315   getAISContext()->Erase(aObjs1[4],Standard_False);
316   getAISContext()->Erase(aObjs1[5],Standard_False);
317   // output third curve
318   drawCurve(aTrimmedLine21,Quantity_Color(Quantity_NOC_GRAY),Standard_True,anAx2);
319   drawCurve(aTrimmedLine11,Quantity_Color(Quantity_NOC_GRAY),Standard_True,anAx2);
320  
321   aObjs1[6]=drawCurve(aTrimmedCircle2_1,Quantity_Color(Quantity_NOC_GRAY),Standard_True,anAx2);
322   aObjs1[7]=drawCurve(aTrimmedCircle2_2,Quantity_Color(Quantity_NOC_GRAY),Standard_True,anAx2);
323   aObjs1[8]=drawCurve(aCurve2,Quantity_Color(Quantity_NOC_RED),Standard_True,anAx2);
324   
325
326
327
328 //==========================================================================================
329 // Function : GeomConstraints_Presentation::sample2
330 // Purpose  : 
331 //==========================================================================================
332
333
334 void GeomConstraints_Presentation::sample2()
335 {
336   setResultTitle("Create PlateSurface");
337   TCollection_AsciiString aText(
338     " // define points" EOL
339     " gp_Pnt P1(-300.,-300.,0.); " EOL
340     " gp_Pnt P2(300.,-300.,0.);" EOL
341     " gp_Pnt P3(300.,300.,0.);" EOL
342     " gp_Pnt P4(-300.,300.,0.); " EOL
343     " gp_Pnt P5(0.,0.,150.); " EOL
344     " gp_Pnt P6(-150.,-100.,30.);" EOL EOL
345     
346     " // define parameters" EOL
347     " Standard_Integer Order = 0;" EOL
348     " Standard_Integer Tang = 0;" EOL
349     " Standard_Integer Degree = 3;" EOL
350     " Standard_Integer NbPtsOnCur = 10;" EOL
351     " Standard_Integer NbIter = 3;" EOL
352     " Standard_Integer MaxSeg=9;" EOL
353     " Standard_Integer MaxDegree=5;" EOL
354     " Standard_Real dmax,Tol = 0.001;" EOL EOL
355     
356     " // create lines between points" EOL
357     " Handle(Geom_Line) aLine1,aLine2,Line3;" EOL
358     "  aLine1 = new Geom_Line(P1,gp_Dir(1,0,0));" EOL
359     "  aLine2 = new Geom_Line(P2,gp_Dir(0,1,0));" EOL
360     "  aLine3 = new Geom_Line(P3,gp_Dir(-1,0,0));" EOL EOL
361     
362     " // adapted curves" EOL
363     " Handle(GeomAdaptor_HCurve) aCurve1,aCurve2,aCurve3; " EOL
364     "  aCurve1 = new GeomAdaptor_HCurve(aLine1); " EOL
365     "  aCurve2 = new GeomAdaptor_HCurve(aLine2); " EOL
366     "  aCurve3 = new GeomAdaptor_HCurve(aLine3); " EOL EOL
367     
368     " // curves constraint" EOL
369     " Handle(BRepFill_CurveConstraint) aBFCC1,aBFCC2,aBFCC3; " EOL
370     "  aBFCC1 = new BRepFill_CurveConstraint(aCurve1,Tang);" EOL
371     "  aBFCC2 = new BRepFill_CurveConstraint(aCurve2,Tang);" EOL
372     "  aBFCC3 = new BRepFill_CurveConstraint(aCurve3,Tang);" EOL EOL
373     
374     " // point constraint" EOL
375     " Handle(GeomPlate_PointConstraint) PCont,PCont1; " EOL
376     "  PCont = new GeomPlate_PointConstraint(P5,Order);" EOL 
377     "  PCont1 = new GeomPlate_PointConstraint(P6,Order);" EOL EOL
378     
379     " // define object BuildPlateSurface" EOL
380     " GeomPlate_BuildPlateSurface BPSurf(Degree,NbPtsOnCur,NbIter);" EOL EOL
381     
382     " // add all used constraints " EOL
383     " BPSurf.Add(PCont);" EOL
384     " BPSurf.Add(PCont1);" EOL
385     " BPSurf.Add(aBFCC1);" EOL
386     " BPSurf.Add(aBFCC2);" EOL
387     " BPSurf.Add(aBFCC3);" EOL EOL
388  
389     " // build BuildPlateSurface" EOL
390     " BPSurf.Perform();" EOL EOL
391     
392     " // make PlateSurface" EOL
393     " Handle(GeomPlate_Surface) PSurf = BPSurf.Surface();" EOL EOL
394     
395     " // define parameter approximation" EOL
396     " dmax = Max(0.01,10*BPSurf.G0Error());" EOL EOL
397     
398     " // make approximation" EOL
399     " GeomPlate_MakeApprox Mapp(PSurf,Tol,MaxSeg,MaxDegree,dmax);" EOL
400     " Handle(Geom_Surface) aSurf;" EOL
401     " aSurf = Mapp.Surface();" EOL EOL
402     );
403   setResultText(aText.ToCString());
404  
405   // define points
406   gp_Pnt P1(-300.,-300.,0.); 
407   gp_Pnt P2(300.,-300.,0.);
408   gp_Pnt P3(300.,300.,0.);
409   gp_Pnt P4(-300.,300.,0.); 
410   gp_Pnt P5(0.,0.,150.); 
411   gp_Pnt P6(-150.,-100.,30.);
412   
413   // define parameters
414   Standard_Integer Order = 0;
415   Standard_Integer Tang = 0;
416   Standard_Integer Degree = 3;
417   Standard_Integer NbPtsOnCur = 10;
418   Standard_Integer NbIter = 3;
419   Standard_Integer MaxSeg=9;
420   Standard_Integer MaxDegree=5;
421   Standard_Real dmax,Tol = 0.001;
422
423   // make lines
424   Handle(Geom_Line) aLine1 = new Geom_Line(P1,gp_Dir(1,0,0));
425   Handle(Geom_Line) aLine2 = new Geom_Line(P2,gp_Dir(0,1,0));
426   Handle(Geom_Line) aLine3 = new Geom_Line(P3,gp_Dir(-1,0,0));
427   
428   // trimmed lines
429   Handle(Geom_TrimmedCurve) aLine11 = 
430     new Geom_TrimmedCurve(aLine1,0,P1.Distance(P2));
431   Handle(Geom_TrimmedCurve) aLine21 = 
432     new Geom_TrimmedCurve(aLine2,0,P2.Distance(P3));
433   Handle(Geom_TrimmedCurve) aLine31 = 
434     new Geom_TrimmedCurve(aLine3,0,P3.Distance(P4));
435   
436   // adapted curves
437   Handle(GeomAdaptor_HCurve) aCurve1 = new GeomAdaptor_HCurve(aLine11);
438   Handle(GeomAdaptor_HCurve) aCurve2 = new GeomAdaptor_HCurve(aLine21);
439   Handle(GeomAdaptor_HCurve) aCurve3 = new GeomAdaptor_HCurve(aLine31);
440
441   // curves constraint
442   Handle(BRepFill_CurveConstraint) aBFCC1= 
443     new BRepFill_CurveConstraint(aCurve1,Tang);
444   Handle(BRepFill_CurveConstraint) aBFCC2= 
445     new BRepFill_CurveConstraint(aCurve2,Tang);
446   Handle(BRepFill_CurveConstraint) aBFCC3= 
447     new BRepFill_CurveConstraint(aCurve3,Tang);
448
449   // points constraint
450   Handle(GeomPlate_PointConstraint) PCont = 
451     new GeomPlate_PointConstraint(P5,Order);
452   Handle(GeomPlate_PointConstraint) PCont1 = 
453     new GeomPlate_PointConstraint(P6,Order);
454   
455   // define object BuildPlateSurface
456   GeomPlate_BuildPlateSurface BPSurf(Degree,NbPtsOnCur,NbIter);
457  
458   // ======= 1 =========
459   BPSurf.Add(PCont);
460   BPSurf.Add(PCont1);
461   BPSurf.Add(aBFCC1);
462   BPSurf.Add(aBFCC2);
463   BPSurf.Add(aBFCC3);
464   BPSurf.Perform();
465    // make PlateSurface
466   Handle(GeomPlate_Surface) PSurf3 = BPSurf.Surface();
467   // define parameter approximation
468    dmax = Max(0.01,10*BPSurf.G0Error());
469   // make approximation
470   GeomPlate_MakeApprox Mapp3(PSurf3,Tol,MaxSeg,MaxDegree,dmax);
471   Handle(Geom_Surface) aSurf3 = Mapp3.Surface();
472   
473   // ======= 2 =========
474   BPSurf.Init();
475   BPSurf.Add(PCont);
476   BPSurf.Add(aBFCC1);
477   BPSurf.Add(aBFCC2);
478   BPSurf.Add(aBFCC3);
479   BPSurf.Perform();
480    // make PlateSurface
481   Handle(GeomPlate_Surface) PSurf2 = BPSurf.Surface();
482    // make approximation
483   GeomPlate_MakeApprox Mapp2(PSurf2,Tol,MaxSeg,MaxDegree,dmax);
484   Handle(Geom_Surface) aSurf2 = Mapp2.Surface();
485
486   // ======= 3 =========
487   BPSurf.Init();
488   BPSurf.Add(aBFCC1);
489   BPSurf.Add(PCont);
490   BPSurf.Add(aBFCC3);
491   BPSurf.Perform();
492    // make PlateSurface
493   Handle(GeomPlate_Surface) PSurf1 = BPSurf.Surface();
494   // make approximation
495   GeomPlate_MakeApprox Mapp1(PSurf1,Tol,MaxSeg,MaxDegree,dmax);
496   Handle(Geom_Surface) aSurf1 = Mapp1.Surface();
497   
498   // ===== output =====
499
500   // make and trimmed plane
501   Handle(Geom_Plane) aPlane = new Geom_Plane(P1,gp_Dir(0,0,1));
502   Handle(Geom_RectangularTrimmedSurface) aTrimmedPlane = 
503     new Geom_RectangularTrimmedSurface(aPlane,-200,700,-200,700,Standard_True,Standard_True);
504
505   Handle(AIS_InteractiveObject) aObj;
506   
507   drawCurve(aLine11);
508   drawCurve(aLine31);
509   if(WAIT_A_SECOND) return;
510   aObj=drawSurface(aTrimmedPlane);
511   if(WAIT_A_SECOND) return;
512   
513   drawPoint(P5);
514   if(WAIT_A_SECOND) return;
515   getAISContext()->Erase(aObj,Standard_False);
516   aObj=drawSurface(aSurf1);
517   if(WAIT_A_SECOND) return;
518   
519   drawCurve(aLine21);
520   if(WAIT_A_SECOND) return;
521   getAISContext()->Erase(aObj,Standard_False);
522   aObj=drawSurface(aSurf2);
523   if(WAIT_A_SECOND) return;
524
525   drawPoint(P6);
526   if(WAIT_A_SECOND) return;
527   getAISContext()->Erase(aObj,Standard_False);
528   drawSurface(aSurf3);
529 }
530
531
532 //==========================================================================================
533 // Function : GeomConstraints_Presentation::sample3
534 // Purpose  : 
535 //==========================================================================================
536
537 void GeomConstraints_Presentation::sample3()
538 {
539   
540   setResultTitle("Surface from cloud of points");
541   TCollection_AsciiString aText(
542     " // define parameters for GeomPlate_BuildPlateSurface" EOL
543     " Standard_Integer Degree = 3;" EOL
544     " Standard_Integer NbPtsOnCur = 10;" EOL
545     " Standard_Integer NbIter = 3;" EOL
546     " Standard_Integer Order = 0;" EOL
547     " Standard_Integer MaxSeg=9;" EOL
548     " Standard_Integer MaxDegree=5;" EOL
549     " Standard_Real dmax,anApproxTol = 0.001;" EOL
550     " Standard_Real aConstrTol = Precision::Confusion();" EOL
551     "" EOL
552     " // number of points for GeomPlate_BuildPlateSurface" EOL
553     " Standard_Integer aSize;" EOL
554     "" EOL
555     " // define aSize ..." EOL
556     "" EOL
557     " // define array of points" EOL 
558     " TColgp_Array1OfPnt aTColPnt(1,aSize);" EOL
559     "" EOL
560     " // initialize array " EOL
561     " // ..." EOL
562     "" EOL
563     " // define object BuildPlateSurface" EOL
564     " GeomPlate_BuildPlateSurface BPSurf(Degree,NbPtsOnCur,NbIter);" EOL
565     "" EOL
566     " for (Standard_Integer i = 1; i <= aSize ; i++)" EOL
567     " {" EOL
568     "   // points constraint" EOL
569     "   Handle(GeomPlate_PointConstraint) PCont = " EOL
570     "     new GeomPlate_PointConstraint(aTColPnt.Value(i),Order,aConstrTol);" EOL
571     "   BPSurf.Add(PCont);" EOL
572     " }" EOL
573     "    " EOL
574     " // build BuildPlateSurface" EOL
575     " BPSurf.Perform();" EOL
576     "" EOL
577     " // make PlateSurface" EOL
578     " Handle(GeomPlate_Surface) PSurf;" EOL
579     " Handle(Geom_Surface) aSurf;" EOL
580     " " EOL
581     " if (BPSurf.IsDone())" EOL
582     " {" EOL
583     "   PSurf = BPSurf.Surface();" EOL
584     ""EOL
585     "   // define parameter approximation" EOL
586     "   dmax = Max(0.01,10*BPSurf.G0Error());" EOL
587     ""EOL
588     "   // make approximation" EOL
589     "   GeomPlate_MakeApprox Mapp(PSurf,anApproxTol,MaxSeg,MaxDegree,dmax);" EOL
590     "   aSurf = Mapp.Surface();" EOL
591     " }" EOL
592   );
593   setResultText(aText.ToCString()); 
594
595   TCollection_AsciiString aFileName(GetDataDir());
596   aFileName += "\\points.dat";
597
598   // open file
599   ifstream aFile;
600   aFile.open(aFileName.ToCString(), ios::failbit);
601   if(!aFile)
602   {
603     aFileName += " was not found.  The sample can not be shown.";
604     setResultText(aFileName.ToCString());
605     return;
606   }
607     
608   // define parameters
609   Standard_Integer aSize;
610   Standard_Integer aVal1 = 0;
611   Standard_Integer aVal2 = 0;
612   Standard_Integer aVal3 = 0;
613
614   aFile>>aSize;
615   
616   // define array
617   TColgp_Array1OfPnt aTColPnt(1,aSize);
618   gp_Pnt aPoint(0,0,-2);
619   gp_Dir aDir(0,0,1);
620   Handle(Geom_Plane) aPlane = 
621     new Geom_Plane(aPoint,aDir);
622  
623   // read of file
624   for(Standard_Integer i =0; i < aSize; i++)
625   {
626     aFile>>aVal1;
627     aFile>>aVal2;
628     aFile>>aVal3;
629     aTColPnt(i+1) = gp_Pnt(aVal1*40, aVal2*40, aVal3*40);
630   }  
631   aFile.close();
632
633   Handle_AIS_InteractiveObject anIO,aNewIO;
634  
635   for(Standard_Integer j = 1; j <= int(aSize / 20); j++)
636   {
637     // output points
638     for(Standard_Integer n = 20*(j-1) + 1; n <= 20*j; n++)
639     {
640       drawPoint(aTColPnt.Value(n));
641     }
642
643     if(WAIT_A_SECOND) return;
644
645     // create surface
646     Handle(Geom_Surface) aSurf = createSurface(n-1, aTColPnt,aPlane);
647    
648     if (!aSurf.IsNull())
649     {
650       // output surface
651       aNewIO = drawSurface(aSurf, Quantity_NOC_LEMONCHIFFON3, Standard_False);
652       getAISContext()->Erase(anIO, Standard_False);
653       getAISContext()->Display(aNewIO);
654       anIO = aNewIO;
655       if(WAIT_A_SECOND) return;
656      }
657   }
658 }
659
660 //==========================================================================================
661 // Function : GeomConstraints_Presentation::sample4
662 // Purpose  : Make Bezier Surface by Bezier Curves
663 //==========================================================================================
664
665 void GeomConstraints_Presentation::sample4()
666 {
667   setResultTitle("Fill surface between bezier curves");
668   TCollection_AsciiString aText(
669     
670     " // define Bezier curves " EOL
671     " Handle(Geom_BezierCurve) aBezierCurve,aBezierCurve1,aBezierCurve2; " EOL
672     " // initializing bezier curves  ..." EOL EOL
673
674     " // initializing object that creates a surface based on the given bezier curves" EOL
675     " GeomFill_BezierCurves aFBC1(aBezierCurve,aBezierCurve1,GeomFill_CurvedStyle);" EOL
676     " GeomFill_BezierCurves aFBC2(aBezierCurve,aBezierCurve1,aBezierCurve2,GeomFill_CoonsStyle);" EOL EOL
677     " // make Bezier Surface" EOL
678     " Handle(Geom_BezierSurface) aBezierSurf1 = aFBC1.Surface();" EOL
679     " Handle(Geom_BezierSurface) aBezierSurf2 = aFBC2.Surface();" EOL
680
681
682     );
683   setResultText(aText.ToCString());
684
685   Handle(AIS_InteractiveObject) aObjs[2];
686
687   // define arrays of points
688   Standard_Real aCoords[][3] = {{-6,0,-3},{-4,1,-3},{-2,-3,-3},{0,3,-1}};
689   Standard_Real aCoords1[][3] = {{-6,0,-3},{-4,2,-2},{-4,0,-1},{-6,0,1}};
690   Standard_Real aCoords2[][3] = {{-6,0,1},{-3,0,0},{2,3,1}};
691   
692   // define lengths 
693   Standard_Integer nPoles = sizeof(aCoords)/(sizeof(Standard_Real)*3);
694   Standard_Integer nPoles1 = sizeof(aCoords1)/(sizeof(Standard_Real)*3);
695   Standard_Integer nPoles2 = sizeof(aCoords2)/(sizeof(Standard_Real)*3);
696   
697   // make Bezier curves
698   Handle(Geom_BezierCurve) aBezierCurve = createBezierCurve(nPoles,aCoords);
699   Handle(Geom_BezierCurve) aBezierCurve1 = createBezierCurve(nPoles1,aCoords1);
700   Handle(Geom_BezierCurve) aBezierCurve2 = createBezierCurve(nPoles2,aCoords2);
701
702
703    // initializing object that creates a surface based on the given bezier curves
704   GeomFill_BezierCurves aFBC1(aBezierCurve,aBezierCurve1,GeomFill_CurvedStyle);
705   GeomFill_BezierCurves aFBC2(aBezierCurve,aBezierCurve1,aBezierCurve2,GeomFill_CurvedStyle);
706   
707   Handle(Geom_BezierSurface) aBezierSurf1 = aFBC1.Surface();
708   Handle(Geom_BezierSurface) aBezierSurf2 = aFBC2.Surface();
709  
710   // output bezier curves and surface
711   drawCurve(aBezierCurve);  
712   if(WAIT_A_LITTLE) return;
713   drawCurve(aBezierCurve1);
714   if(WAIT_A_SECOND) return;
715   // output surface 1
716   aObjs[0]=drawSurface(aBezierSurf1);
717   if(WAIT_A_SECOND) return;
718   getAISContext()->Erase(aObjs[0],Standard_False);
719   if(WAIT_A_LITTLE) return;
720   drawCurve(aBezierCurve2);  
721   if(WAIT_A_SECOND) return;
722   // output surface 2
723   aObjs[1]=drawSurface(aBezierSurf2);
724 }
725
726 //==========================================================================================
727 // Function : GeomConstraints_Presentation::sample5
728 // Purpose  : Make BSpline Surface by BSpline Curves
729 //==========================================================================================
730
731 void GeomConstraints_Presentation::sample5()
732
733   setResultTitle("Fill surface between bspline curves");
734   TCollection_AsciiString aText(
735     " // define bspline curves " EOL
736     " Handle (Geom_BSplineCurve) aBSCurve1,aBSCurve2,aBSCurve3,aBSCurve4; "EOL
737     " //initializing bspline curves ..." EOL EOL
738
739     " // initializing object that creates a surface based on the given bspline curves" EOL
740     " GeomFill_BSplineCurves aFBSC1(aBSCurve1,aBSCurve2,aBSCurve3,GeomFill_CurvedStyle);" EOL
741     " GeomFill_BSplineCurves aFBSC2(aBSCurve1,aBSCurve2,aBSCurve3,aBSCurve4,GeomFill_CurvedStyle);" EOL EOL
742
743     " // make BSpline Surface" EOL
744     " Handle(Geom_BSplineSurface) aBSplineSurf1 = aFBSC1.Surface();" EOL
745     " Handle(Geom_BSplineSurface) aBSplineSurf2 = aFBSC2.Surface();" EOL
746     );
747   setResultText(aText.ToCString());
748
749
750   Handle(AIS_InteractiveObject) aObjs[2];
751   // define arrays of points 
752   Standard_Real aCoords[][3] = {{-4,0,-2},{-2,0,-4},{0,0,-1},{3,0,2}};
753   Standard_Real aCoords1[][3] = {{-4,0,-2},{-3,2,-1},{-2,2,1}};
754   Standard_Real aCoords2[][3] = {{-2,2,1},{-1,0,0},{0,1,2}};
755   Standard_Real aCoords3[][3] = {{0,1,2},{2,2,4},{3,0,2}};
756   
757   // define lengths 
758   Standard_Integer nPoles = sizeof(aCoords)/(sizeof(Standard_Real)*3);
759   Standard_Integer nPoles1 = sizeof(aCoords1)/(sizeof(Standard_Real)*3);
760   Standard_Integer nPoles2 = sizeof(aCoords2)/(sizeof(Standard_Real)*3);
761   Standard_Integer nPoles3 = sizeof(aCoords3)/(sizeof(Standard_Real)*3);
762   
763   // make bspline curves  
764   Handle(Geom_BSplineCurve) aBSCurve1 = createBSplineCurve(nPoles,aCoords); 
765   Handle(Geom_BSplineCurve) aBSCurve2 = createBSplineCurve(nPoles1,aCoords1);
766   Handle(Geom_BSplineCurve) aBSCurve3 = createBSplineCurve(nPoles2,aCoords2);
767   Handle(Geom_BSplineCurve) aBSCurve4 = createBSplineCurve(nPoles3,aCoords3);
768
769   // initializing object that creates a surface based on the given bspline curves
770   GeomFill_BSplineCurves aFBSC1(aBSCurve1,aBSCurve2,aBSCurve3,GeomFill_CurvedStyle);
771   GeomFill_BSplineCurves aFBSC2(aBSCurve1,aBSCurve2,aBSCurve3,aBSCurve4,GeomFill_CurvedStyle);
772
773   Handle(Geom_BSplineSurface) aBSplineSurf1 = aFBSC1.Surface();
774   Handle(Geom_BSplineSurface) aBSplineSurf2 = aFBSC2.Surface();
775  
776   // output
777   drawCurve(aBSCurve1);
778   if(WAIT_A_LITTLE) return;
779   drawCurve(aBSCurve2);
780   if(WAIT_A_LITTLE) return;
781   drawCurve(aBSCurve3);
782   if(WAIT_A_SECOND) return;
783   
784   aObjs[0]=drawSurface(aBSplineSurf1);  
785   if(WAIT_A_SECOND) return;
786   getAISContext()->Erase(aObjs[0],Standard_False);
787   if(WAIT_A_LITTLE) return;
788   drawCurve(aBSCurve4);
789   if(WAIT_A_SECOND) return;
790   aObjs[1]=drawSurface(aBSplineSurf2);
791   
792 }
793
794 //==========================================================================================
795 // Function : GeomConstraints_Presentation::sample6
796 // Purpose  : Create a surface based on the given bspline and bezier curves
797 //==========================================================================================
798
799 void GeomConstraints_Presentation::sample6()
800 {
801   setResultTitle("Constraint Filling");
802   TCollection_AsciiString aText(
803     " // define parameters" EOL
804     " Standard_Real Tol = 0.00001;" EOL
805     " Standard_Real dummy = 0.;" EOL
806     " Standard_Integer MaxDeg = 3;" EOL
807     " Standard_Integer MaxSeg = 8;" EOL EOL
808
809     " // make bspline curves " EOL
810     " Handle(Geom_BSplineCurve) aBSCurve,aBSCurve1; "EOL
811     " //initializing bspline curves ..." EOL EOL
812
813     " // make bezier curves " EOL
814     " Handle(Geom_BezierCurve) aBezierCurve; "EOL
815     " // initializing bezier curves ..." EOL EOL
816     
817     " // adapted bspline and bezier curves" EOL
818     " Handle(GeomAdaptor_HCurve) adapHCurve = " EOL
819     "  new GeomAdaptor_HCurve(aBSCurve);" EOL
820     " Handle(GeomAdaptor_HCurve) adapHCurve1 = " EOL
821     "  new GeomAdaptor_HCurve(aBSCurve1);" EOL
822     " Handle(GeomAdaptor_HCurve) adapHCurve2 = " EOL
823     "  new GeomAdaptor_HCurve(aBezierCurve);" EOL EOL
824
825     " // simple bound" EOL
826     " Handle(GeomFill_SimpleBound) myBoundary = " EOL 
827     "  new GeomFill_SimpleBound(adapHCurve,Tol,dummy); " EOL
828     " Handle(GeomFill_SimpleBound) myBoundary1 = " EOL
829     "  new GeomFill_SimpleBound(adapHCurve1,Tol,dummy); " EOL
830     " Handle(GeomFill_SimpleBound) myBoundary2 = " EOL
831     "  new GeomFill_SimpleBound(adapHCurve2,Tol,dummy); " EOL EOL
832
833     " // define and initilization ConstrainedFilling" EOL
834     " GeomFill_ConstrainedFilling aFCF(MaxDeg,MaxSeg);" EOL EOL
835     " aFCF.Init(myBoundary,myBoundary1,myBoundary2); " EOL EOL
836     " // make BSpline Surface" EOL
837     " Handle(Geom_BSplineSurface) aBSplineSurf; "EOL
838     "  aBSplineSurface = aFCF.Surface();" EOL EOL
839     );
840   setResultText(aText.ToCString());
841
842   // define arrays of points 
843   Standard_Real aCoords[][3] = {{-5,2,-2},{-3,1,-4},{0,0,-1},{3,0,2}};
844   Standard_Real aCoords1[][3] = {{-5,2,-2},{-3,4,-1},{-2,3,1}};
845   Standard_Real aCoords2[][3] = {{-2,3,1},{-1,3,0},{2,1,0},{3,0,2}};
846   
847   Standard_Integer nPoles = sizeof(aCoords)/(sizeof(Standard_Real)*3);
848   Standard_Integer nPoles1 = sizeof(aCoords1)/(sizeof(Standard_Real)*3);
849   Standard_Integer nPoles2 = sizeof(aCoords2)/(sizeof(Standard_Real)*3);
850   
851   // define parameters
852   Standard_Real Tol = 0.00001;
853   Standard_Real dummy = 0.;
854   Standard_Integer MaxDeg = 3;
855   Standard_Integer MaxSeg = 8;
856
857   // The adapted curves is created in the following way:
858   Handle(Geom_Curve) aBSCurve = createBSplineCurve(nPoles,aCoords); 
859   Handle(Geom_Curve) aBSCurve1 = createBSplineCurve(nPoles1,aCoords1);
860   Handle(Geom_BezierCurve) aBezierCurve = createBezierCurve(nPoles2,aCoords2);
861
862   // adapted BSpline and Bezier curves
863   Handle(GeomAdaptor_HCurve) adapHCurve = new GeomAdaptor_HCurve(aBSCurve);
864   Handle(GeomAdaptor_HCurve) adapHCurve1 = new GeomAdaptor_HCurve(aBSCurve1);
865   Handle(GeomAdaptor_HCurve) adapHCurve2 = new GeomAdaptor_HCurve(aBezierCurve);
866
867   // simple bound
868   Handle(GeomFill_SimpleBound) myBoundary = 
869     new GeomFill_SimpleBound(adapHCurve,Tol,dummy);
870   Handle(GeomFill_SimpleBound) myBoundary1 = 
871     new GeomFill_SimpleBound(adapHCurve1,Tol,dummy);
872   Handle(GeomFill_SimpleBound) myBoundary2 = 
873     new GeomFill_SimpleBound(adapHCurve2,Tol,dummy);
874
875   // define and initilization ConstrainedFilling
876   GeomFill_ConstrainedFilling aFCF(MaxDeg,MaxSeg);
877   aFCF.Init(myBoundary,myBoundary1,myBoundary2); 
878   // make BSpline Surface
879   Handle(Geom_BSplineSurface) aBSplineSurf = aFCF.Surface();
880
881   // output curves and surface
882   drawCurve(aBSCurve);
883   if(WAIT_A_LITTLE) return;
884   drawCurve(aBSCurve1);
885   if(WAIT_A_LITTLE) return;
886   drawCurve(aBezierCurve);
887   if(WAIT_A_SECOND) return;
888   drawSurface(aBSplineSurf);
889 }