Commit | Line | Data |
---|---|---|
b311480e | 1 | // Created on: 1996-03-05 |
2 | // Created by: Joelle CHAUVET | |
3 | // Copyright (c) 1996-1999 Matra Datavision | |
973c2be1 | 4 | // Copyright (c) 1999-2014 OPEN CASCADE SAS |
b311480e | 5 | // |
973c2be1 | 6 | // This file is part of Open CASCADE Technology software library. |
b311480e | 7 | // |
d5f74e42 | 8 | // This library is free software; you can redistribute it and/or modify it under |
9 | // the terms of the GNU Lesser General Public License version 2.1 as published | |
973c2be1 | 10 | // by the Free Software Foundation, with special exception defined in the file |
11 | // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT | |
12 | // distribution for complete text of the license and disclaimer of any warranty. | |
b311480e | 13 | // |
973c2be1 | 14 | // Alternatively, this file may be used under the terms of Open CASCADE |
15 | // commercial license or contractual agreement. | |
b311480e | 16 | |
7fd59977 | 17 | |
42cf5bc1 | 18 | #include <AdvApp2Var_ApproxAFunc2Var.hxx> |
19 | #include <AdvApp2Var_Criterion.hxx> | |
20 | #include <AdvApprox_Cutting.hxx> | |
21 | #include <AdvApprox_DichoCutting.hxx> | |
22 | #include <AdvApprox_PrefCutting.hxx> | |
7fd59977 | 23 | #include <Geom_BSplineSurface.hxx> |
24 | #include <Geom_Surface.hxx> | |
42cf5bc1 | 25 | #include <GeomPlate_MakeApprox.hxx> |
26 | #include <GeomPlate_PlateG0Criterion.hxx> | |
27 | #include <GeomPlate_PlateG1Criterion.hxx> | |
28 | #include <GeomPlate_Surface.hxx> | |
7fd59977 | 29 | #include <gp_Pnt.hxx> |
42cf5bc1 | 30 | #include <gp_Vec.hxx> |
7fd59977 | 31 | #include <gp_XY.hxx> |
42cf5bc1 | 32 | #include <Plate_Plate.hxx> |
7fd59977 | 33 | #include <PLib.hxx> |
42cf5bc1 | 34 | #include <TColgp_SequenceOfXY.hxx> |
35 | #include <TColgp_SequenceOfXYZ.hxx> | |
7fd59977 | 36 | #include <TColStd_HArray1OfInteger.hxx> |
42cf5bc1 | 37 | #include <TColStd_HArray1OfReal.hxx> |
7fd59977 | 38 | #include <TColStd_HArray2OfReal.hxx> |
7fd59977 | 39 | |
41194117 K |
40 | class GeomPlate_MakeApprox_Eval : public AdvApp2Var_EvaluatorFunc2Var |
41 | { | |
42 | ||
43 | public: | |
44 | ||
45 | GeomPlate_MakeApprox_Eval (const Handle(Geom_Surface)& theSurf) | |
46 | : mySurf (theSurf) {} | |
47 | ||
48 | virtual void Evaluate (Standard_Integer* theDimension, | |
49 | Standard_Real* theUStartEnd, | |
50 | Standard_Real* theVStartEnd, | |
51 | Standard_Integer* theFavorIso, | |
52 | Standard_Real* theConstParam, | |
53 | Standard_Integer* theNbParams, | |
54 | Standard_Real* theParameters, | |
55 | Standard_Integer* theUOrder, | |
56 | Standard_Integer* theVOrder, | |
57 | Standard_Real* theResult, | |
58 | Standard_Integer* theErrorCode) const; | |
7fd59977 | 59 | |
41194117 | 60 | private: |
7fd59977 | 61 | |
41194117 K |
62 | Handle(Geom_Surface) mySurf; |
63 | ||
64 | }; | |
65 | ||
66 | void GeomPlate_MakeApprox_Eval::Evaluate (Standard_Integer * Dimension, | |
7fd59977 | 67 | // Dimension |
68 | Standard_Real * UStartEnd, | |
69 | // StartEnd[2] in U | |
70 | Standard_Real * VStartEnd, | |
71 | // StartEnd[2] in V | |
72 | Standard_Integer * FavorIso, | |
73 | // Choice of constante, 1 for U, 2 for V | |
74 | Standard_Real * ConstParam, | |
75 | // Value of constant parameter | |
76 | Standard_Integer * NbParams, | |
77 | // Number of parameters N | |
78 | Standard_Real * Parameters, | |
79 | // Values of parameters, | |
80 | Standard_Integer * UOrder, | |
81 | // Derivative Request in U | |
82 | Standard_Integer * VOrder, | |
83 | // Derivative Request in V | |
84 | Standard_Real * Result, | |
85 | // Result[Dimension,N] | |
41194117 | 86 | Standard_Integer * ErrorCode) const |
7fd59977 | 87 | // Error Code |
41194117 | 88 | { |
7fd59977 | 89 | *ErrorCode = 0; |
90 | Standard_Integer idim,jpar; | |
91 | Standard_Real Upar,Vpar; | |
92 | ||
93 | // Dimension incorrecte | |
94 | if (*Dimension!=3) { | |
95 | *ErrorCode = 1; | |
96 | } | |
97 | ||
98 | // Parametres incorrects | |
99 | if (*FavorIso==1) { | |
100 | Upar = *ConstParam; | |
101 | if (( Upar < UStartEnd[0] ) || ( Upar > UStartEnd[1] )) { | |
102 | *ErrorCode = 2; | |
103 | } | |
104 | for (jpar=1;jpar<=*NbParams;jpar++) { | |
105 | Vpar = Parameters[jpar-1]; | |
106 | if (( Vpar < VStartEnd[0] ) || ( Vpar > VStartEnd[1] )) { | |
107 | *ErrorCode = 2; | |
108 | } | |
109 | } | |
110 | } | |
111 | else { | |
112 | Vpar = *ConstParam; | |
113 | if (( Vpar < VStartEnd[0] ) || ( Vpar > VStartEnd[1] )) { | |
114 | *ErrorCode = 2; | |
115 | } | |
116 | for (jpar=1;jpar<=*NbParams;jpar++) { | |
117 | Upar = Parameters[jpar-1]; | |
118 | if (( Upar < UStartEnd[0] ) || ( Upar > UStartEnd[1] )) { | |
119 | *ErrorCode = 2; | |
120 | } | |
121 | } | |
122 | } | |
123 | ||
124 | // Initialisation | |
125 | for (idim=1;idim<=*Dimension;idim++) { | |
126 | for (jpar=1;jpar<=*NbParams;jpar++) { | |
127 | Result[idim-1+(jpar-1)*(*Dimension)] = 0.; | |
128 | } | |
129 | } | |
130 | ||
131 | ||
132 | Standard_Integer Order = *UOrder + *VOrder; | |
133 | gp_Pnt pnt; | |
134 | // gp_Vec vect, v1, v2, v3, v4, v5, v6, v7, v8, v9; | |
135 | gp_Vec v1, v2, v3, v4, v5; | |
136 | ||
137 | if (*FavorIso==1) { | |
138 | Upar = *ConstParam; | |
139 | switch (Order) { | |
140 | case 0 : | |
141 | for (jpar=1;jpar<=*NbParams;jpar++) { | |
142 | Vpar = Parameters[jpar-1]; | |
41194117 | 143 | pnt = mySurf->Value (Upar, Vpar); |
7fd59977 | 144 | Result[(jpar-1)*(*Dimension)] = pnt.X(); |
145 | Result[1+(jpar-1)*(*Dimension)] = pnt.Y(); | |
146 | Result[2+(jpar-1)*(*Dimension)] = pnt.Z(); | |
147 | } | |
148 | break; | |
149 | case 1 : | |
150 | for (jpar=1;jpar<=*NbParams;jpar++) { | |
151 | Vpar = Parameters[jpar-1]; | |
41194117 | 152 | mySurf->D1 (Upar, Vpar, pnt, v1, v2); |
7fd59977 | 153 | if (*UOrder==1) { |
154 | Result[(jpar-1)*(*Dimension)] = v1.X(); | |
155 | Result[1+(jpar-1)*(*Dimension)] = v1.Y(); | |
156 | Result[2+(jpar-1)*(*Dimension)] = v1.Z(); | |
157 | } | |
158 | else { | |
159 | Result[(jpar-1)*(*Dimension)] = v2.X(); | |
160 | Result[1+(jpar-1)*(*Dimension)] = v2.Y(); | |
161 | Result[2+(jpar-1)*(*Dimension)] = v2.Z(); | |
162 | } | |
163 | } | |
164 | break; | |
165 | case 2 : | |
166 | for (jpar=1;jpar<=*NbParams;jpar++) { | |
167 | Vpar = Parameters[jpar-1]; | |
41194117 | 168 | mySurf->D2 (Upar, Vpar, pnt, v1, v2, v3, v4, v5); |
7fd59977 | 169 | if (*UOrder==2) { |
170 | Result[(jpar-1)*(*Dimension)] = v3.X(); | |
171 | Result[1+(jpar-1)*(*Dimension)] = v3.Y(); | |
172 | Result[2+(jpar-1)*(*Dimension)] = v3.Z(); | |
173 | } | |
174 | else if (*UOrder==1) { | |
175 | Result[(jpar-1)*(*Dimension)] = v5.X(); | |
176 | Result[1+(jpar-1)*(*Dimension)] = v5.Y(); | |
177 | Result[2+(jpar-1)*(*Dimension)] = v5.Z(); | |
178 | } | |
179 | else if (*UOrder==0) { | |
180 | Result[(jpar-1)*(*Dimension)] = v4.X(); | |
181 | Result[1+(jpar-1)*(*Dimension)] = v4.Y(); | |
182 | Result[2+(jpar-1)*(*Dimension)] = v4.Z(); | |
183 | } | |
184 | } | |
185 | break; | |
186 | } | |
187 | } | |
188 | else { | |
189 | Vpar = *ConstParam; | |
190 | switch (Order) { | |
191 | case 0 : | |
192 | for (jpar=1;jpar<=*NbParams;jpar++) { | |
193 | Upar = Parameters[jpar-1]; | |
41194117 | 194 | pnt = mySurf->Value (Upar, Vpar); |
7fd59977 | 195 | Result[(jpar-1)*(*Dimension)] = pnt.X(); |
196 | Result[1+(jpar-1)*(*Dimension)] = pnt.Y(); | |
197 | Result[2+(jpar-1)*(*Dimension)] = pnt.Z(); | |
198 | } | |
199 | break; | |
200 | case 1 : | |
201 | for (jpar=1;jpar<=*NbParams;jpar++) { | |
202 | Upar = Parameters[jpar-1]; | |
41194117 | 203 | mySurf->D1 (Upar, Vpar, pnt, v1, v2); |
7fd59977 | 204 | if (*UOrder==1) { |
205 | Result[(jpar-1)*(*Dimension)] = v1.X(); | |
206 | Result[1+(jpar-1)*(*Dimension)] = v1.Y(); | |
207 | Result[2+(jpar-1)*(*Dimension)] = v1.Z(); | |
208 | } | |
209 | else { | |
210 | Result[(jpar-1)*(*Dimension)] = v2.X(); | |
211 | Result[1+(jpar-1)*(*Dimension)] = v2.Y(); | |
212 | Result[2+(jpar-1)*(*Dimension)] = v2.Z(); | |
213 | } | |
214 | } | |
215 | break; | |
216 | case 2 : | |
217 | for (jpar=1;jpar<=*NbParams;jpar++) { | |
218 | Upar = Parameters[jpar-1]; | |
41194117 | 219 | mySurf->D2 (Upar, Vpar, pnt, v1, v2, v3, v4, v5); |
7fd59977 | 220 | if (*UOrder==2) { |
221 | Result[(jpar-1)*(*Dimension)] = v3.X(); | |
222 | Result[1+(jpar-1)*(*Dimension)] = v3.Y(); | |
223 | Result[2+(jpar-1)*(*Dimension)] = v3.Z(); | |
224 | } | |
225 | else if (*UOrder==1) { | |
226 | Result[(jpar-1)*(*Dimension)] = v5.X(); | |
227 | Result[1+(jpar-1)*(*Dimension)] = v5.Y(); | |
228 | Result[2+(jpar-1)*(*Dimension)] = v5.Z(); | |
229 | } | |
230 | else if (*UOrder==0) { | |
231 | Result[(jpar-1)*(*Dimension)] = v4.X(); | |
232 | Result[1+(jpar-1)*(*Dimension)] = v4.Y(); | |
233 | Result[2+(jpar-1)*(*Dimension)] = v4.Z(); | |
234 | } | |
235 | } | |
236 | break; | |
237 | } | |
238 | } | |
239 | ||
240 | } | |
241 | ||
242 | ||
243 | //======================================================================= | |
244 | //function : GeomPlate_MakeApprox | |
245 | //purpose : | |
246 | //======================================================================= | |
247 | ||
248 | GeomPlate_MakeApprox::GeomPlate_MakeApprox(const Handle(GeomPlate_Surface)& SurfPlate, | |
249 | const AdvApp2Var_Criterion& PlateCrit, | |
250 | const Standard_Real Tol3d, | |
251 | const Standard_Integer Nbmax, | |
252 | const Standard_Integer dgmax, | |
253 | const GeomAbs_Shape Continuity, | |
254 | const Standard_Real EnlargeCoeff) | |
255 | { | |
256 | myPlate = SurfPlate; | |
7fd59977 | 257 | |
258 | Standard_Real U0=0., U1=0., V0=0., V1=0.; | |
259 | myPlate->RealBounds(U0, U1, V0, V1); | |
260 | U0 = EnlargeCoeff * U0; | |
261 | U1 = EnlargeCoeff * U1; | |
262 | V0 = EnlargeCoeff * V0; | |
263 | V1 = EnlargeCoeff * V1; | |
264 | ||
265 | Standard_Integer nb1 = 0, nb2 = 0, nb3 = 1; | |
266 | Handle(TColStd_HArray1OfReal) nul1 = | |
267 | new TColStd_HArray1OfReal(1,1); | |
268 | nul1->Init(0.); | |
269 | Handle(TColStd_HArray2OfReal) nul2 = | |
270 | new TColStd_HArray2OfReal(1,1,1,4); | |
271 | nul2->Init(0.); | |
272 | Handle(TColStd_HArray1OfReal) eps3D = | |
273 | new TColStd_HArray1OfReal(1,1); | |
274 | eps3D->Init(Tol3d); | |
275 | Handle(TColStd_HArray2OfReal) epsfr = | |
276 | new TColStd_HArray2OfReal(1,1,1,4); | |
277 | epsfr->Init(Tol3d); | |
278 | GeomAbs_IsoType myType = GeomAbs_IsoV; | |
279 | Standard_Integer myPrec = 0; | |
280 | ||
281 | AdvApprox_DichoCutting myDec; | |
282 | ||
283 | //POP pour WNT | |
41194117 | 284 | GeomPlate_MakeApprox_Eval ev (myPlate); |
7fd59977 | 285 | AdvApp2Var_ApproxAFunc2Var AppPlate(nb1, nb2, nb3, |
286 | nul1,nul1,eps3D, | |
287 | nul2,nul2,epsfr, | |
288 | U0,U1,V0,V1, | |
289 | myType, | |
290 | Continuity, Continuity, | |
291 | myPrec, | |
292 | dgmax,dgmax,Nbmax,ev, | |
293 | // dgmax,dgmax,Nbmax,myPlateSurfEval, | |
294 | PlateCrit,myDec,myDec); | |
295 | mySurface = AppPlate.Surface(1); | |
296 | myAppError = AppPlate.MaxError(3,1); | |
297 | myCritError = AppPlate.CritError(3,1); | |
0797d9d3 | 298 | #ifdef OCCT_DEBUG |
04232180 | 299 | std::cout<<"Approximation results"<<std::endl; |
300 | std::cout<<" Approximation error : "<<myAppError<<std::endl; | |
301 | std::cout<<" Criterium error : "<<myCritError<<std::endl; | |
7fd59977 | 302 | #endif |
303 | } | |
304 | ||
305 | ||
306 | //======================================================================= | |
307 | //function : GeomPlate_MakeApprox | |
308 | //purpose : | |
309 | //======================================================================= | |
310 | ||
311 | GeomPlate_MakeApprox::GeomPlate_MakeApprox(const Handle(GeomPlate_Surface)& SurfPlate, | |
312 | const Standard_Real Tol3d, | |
313 | const Standard_Integer Nbmax, | |
314 | const Standard_Integer dgmax, | |
315 | const Standard_Real dmax, | |
316 | const Standard_Integer CritOrder, | |
317 | const GeomAbs_Shape Continuity, | |
318 | const Standard_Real EnlargeCoeff) | |
319 | { | |
320 | myPlate = SurfPlate; | |
7fd59977 | 321 | |
322 | TColgp_SequenceOfXY Seq2d; | |
323 | TColgp_SequenceOfXYZ Seq3d; | |
324 | ||
325 | if (CritOrder>=0) { | |
326 | ||
327 | // contraintes 2d d'ordre 0 | |
328 | myPlate->Constraints(Seq2d); | |
329 | ||
330 | // contraintes 3d correspondantes sur plate | |
331 | Standard_Integer i,nbp=Seq2d.Length(); | |
332 | for(i=1;i<=nbp;i++){ | |
333 | gp_XY P2d=Seq2d.Value(i); | |
334 | gp_Pnt PP; | |
335 | gp_Vec v1h,v2h,v3h; | |
336 | if (CritOrder==0) { | |
337 | // a l'ordre 0 | |
41194117 | 338 | myPlate->D0 (P2d.X(), P2d.Y(), PP); |
7fd59977 | 339 | gp_XYZ P3d(PP.X(),PP.Y(),PP.Z()); |
340 | Seq3d.Append(P3d); | |
341 | } | |
342 | else { | |
343 | // a l'ordre 1 | |
41194117 | 344 | myPlate->D1 (P2d.X(), P2d.Y(), PP, v1h, v2h); |
7fd59977 | 345 | v3h=v1h^v2h; |
346 | gp_XYZ P3d(v3h.X(),v3h.Y(),v3h.Z()); | |
347 | Seq3d.Append(P3d); | |
348 | } | |
349 | } | |
350 | } | |
351 | ||
352 | Standard_Real U0=0., U1=0., V0=0., V1=0.; | |
353 | myPlate->RealBounds(U0, U1, V0, V1); | |
354 | U0 = EnlargeCoeff * U0; | |
355 | U1 = EnlargeCoeff * U1; | |
356 | V0 = EnlargeCoeff * V0; | |
357 | V1 = EnlargeCoeff * V1; | |
358 | ||
359 | Standard_Real seuil = Tol3d; | |
360 | if (CritOrder==0&&Tol3d<10*dmax) { | |
361 | seuil=10*dmax; | |
0797d9d3 | 362 | #ifdef OCCT_DEBUG |
04232180 | 363 | std::cout<<"Seuil G0 choisi trop faible par rapport au contour. On prend "<<seuil<<std::endl; |
7fd59977 | 364 | #endif |
365 | } | |
366 | if (CritOrder==1&&Tol3d<10*dmax) { | |
367 | seuil=10*dmax; | |
0797d9d3 | 368 | #ifdef OCCT_DEBUG |
04232180 | 369 | std::cout<<"Seuil G1 choisi trop faible par rapport au contour. On prend "<<seuil<<std::endl; |
7fd59977 | 370 | #endif |
371 | } | |
372 | Standard_Integer nb1 = 0, nb2 = 0, nb3 = 1; | |
373 | Handle(TColStd_HArray1OfReal) nul1 = | |
374 | new TColStd_HArray1OfReal(1,1); | |
375 | nul1->Init(0.); | |
376 | Handle(TColStd_HArray2OfReal) nul2 = | |
377 | new TColStd_HArray2OfReal(1,1,1,4); | |
378 | nul2->Init(0.); | |
379 | Handle(TColStd_HArray1OfReal) eps3D = | |
380 | new TColStd_HArray1OfReal(1,1); | |
381 | eps3D->Init(Tol3d); | |
382 | Handle(TColStd_HArray2OfReal) epsfr = | |
383 | new TColStd_HArray2OfReal(1,1,1,4); | |
384 | epsfr->Init(Tol3d); | |
385 | ||
386 | GeomAbs_IsoType myType = GeomAbs_IsoV; | |
387 | Standard_Integer myPrec = 0; | |
388 | ||
389 | AdvApprox_DichoCutting myDec; | |
390 | ||
391 | if (CritOrder==-1) { | |
392 | myPrec = 1; | |
393 | // POP pour NT | |
41194117 | 394 | GeomPlate_MakeApprox_Eval ev (myPlate); |
7fd59977 | 395 | AdvApp2Var_ApproxAFunc2Var AppPlate(nb1, nb2, nb3, |
396 | nul1,nul1,eps3D, | |
397 | nul2,nul2,epsfr, | |
398 | U0,U1,V0,V1, | |
399 | myType, | |
400 | Continuity, Continuity, | |
401 | myPrec, | |
402 | dgmax,dgmax,Nbmax,ev, | |
403 | myDec,myDec); | |
404 | mySurface = AppPlate.Surface(1); | |
405 | myAppError = AppPlate.MaxError(3,1); | |
406 | myCritError = 0.; | |
0797d9d3 | 407 | #ifdef OCCT_DEBUG |
04232180 | 408 | std::cout<<"Approximation results"<<std::endl; |
409 | std::cout<<" Approximation error : "<<myAppError<<std::endl; | |
7fd59977 | 410 | #endif |
411 | } | |
412 | else if (CritOrder==0) { | |
413 | GeomPlate_PlateG0Criterion Crit0(Seq2d,Seq3d,seuil); | |
414 | // POP pour NT | |
41194117 | 415 | GeomPlate_MakeApprox_Eval ev (myPlate); |
7fd59977 | 416 | AdvApp2Var_ApproxAFunc2Var AppPlate(nb1, nb2, nb3, |
417 | nul1,nul1,eps3D, | |
418 | nul2,nul2,epsfr, | |
419 | U0,U1,V0,V1, | |
420 | myType, | |
421 | Continuity, Continuity, | |
422 | myPrec, | |
423 | dgmax,dgmax,Nbmax,ev, | |
424 | // dgmax,dgmax,Nbmax,myPlateSurfEval, | |
425 | Crit0,myDec,myDec); | |
426 | mySurface = AppPlate.Surface(1); | |
427 | myAppError = AppPlate.MaxError(3,1); | |
428 | myCritError = AppPlate.CritError(3,1); | |
0797d9d3 | 429 | #ifdef OCCT_DEBUG |
04232180 | 430 | std::cout<<"Approximation results"<<std::endl; |
431 | std::cout<<" Approximation error : "<<myAppError<<std::endl; | |
432 | std::cout<<" Criterium error : "<<myCritError<<std::endl; | |
7fd59977 | 433 | #endif |
434 | } | |
435 | else if (CritOrder==1) { | |
436 | GeomPlate_PlateG1Criterion Crit1(Seq2d,Seq3d,seuil); | |
437 | // POP pour NT | |
41194117 | 438 | GeomPlate_MakeApprox_Eval ev (myPlate); |
7fd59977 | 439 | AdvApp2Var_ApproxAFunc2Var AppPlate(nb1, nb2, nb3, |
440 | nul1,nul1,eps3D, | |
441 | nul2,nul2,epsfr, | |
442 | U0,U1,V0,V1, | |
443 | myType, | |
444 | Continuity, Continuity, | |
445 | myPrec, | |
446 | dgmax,dgmax,Nbmax,ev, | |
447 | // dgmax,dgmax,Nbmax,myPlateSurfEval, | |
448 | Crit1,myDec,myDec); | |
449 | mySurface = AppPlate.Surface(1); | |
450 | myAppError = AppPlate.MaxError(3,1); | |
451 | myCritError = AppPlate.CritError(3,1); | |
0797d9d3 | 452 | #ifdef OCCT_DEBUG |
04232180 | 453 | std::cout<<"Approximation results"<<std::endl; |
454 | std::cout<<" Approximation error : "<<myAppError<<std::endl; | |
455 | std::cout<<" Criterium error : "<<myCritError<<std::endl; | |
7fd59977 | 456 | #endif |
457 | } | |
458 | } | |
459 | ||
460 | ||
461 | ||
462 | //======================================================================= | |
463 | //function : Surface | |
464 | //purpose : | |
465 | //======================================================================= | |
466 | ||
467 | Handle(Geom_BSplineSurface) GeomPlate_MakeApprox::Surface() const | |
468 | { | |
469 | return mySurface; | |
470 | } | |
471 | ||
472 | ||
473 | //======================================================================= | |
474 | //function : ApproxError | |
475 | //purpose : | |
476 | //======================================================================= | |
477 | ||
478 | Standard_Real GeomPlate_MakeApprox::ApproxError() const | |
479 | { | |
480 | return myAppError; | |
481 | } | |
482 | ||
483 | ||
484 | //======================================================================= | |
485 | //function : CriterionError | |
486 | //purpose : | |
487 | //======================================================================= | |
488 | ||
489 | Standard_Real GeomPlate_MakeApprox::CriterionError() const | |
490 | { | |
491 | return myCritError; | |
492 | } |