0025621: CAST analysis - Avoid constructors not supplying an initial value for all...
[occt.git] / src / IGESToBRep / IGESToBRep_CurveAndSurface.cxx
1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 // 22.12.98 dce S3767
15 // 21.12.98 rln, gka S4054
16 //#74 rln,pdn 11.03.99 S4135: Setting minimum and maximum tolerances according to static parameters
17 // sln 13.06.2002 OCC448 : Correction in  method TransferGeometry to avoid transfering invisiable sub entities
18
19 #include <Standard_ErrorHandler.hxx>
20 #include <IGESToBRep_CurveAndSurface.ixx>
21 #include <Standard_Failure.hxx>
22
23 #include <IGESToBRep.hxx>
24 #include <IGESToBRep_TopoCurve.hxx>
25 #include <IGESToBRep_TopoSurface.hxx>
26 #include <IGESToBRep_BRepEntity.hxx>
27
28 #include <IGESBasic_Group.hxx>
29 #include <IGESBasic_GroupWithoutBackP.hxx>
30
31 #include <IGESBasic_SubfigureDef.hxx>
32 #include <IGESBasic_SingularSubfigure.hxx>
33
34 #include <IGESData_ToolLocation.hxx>
35
36 #include <BRep_Builder.hxx>
37
38 #include <BRepLib.hxx>
39
40 #include <gp_Trsf.hxx>
41 #include <gp_GTrsf.hxx>
42 #include <gp_Vec.hxx>
43 #include <Precision.hxx>
44
45 #include <Interface_Macros.hxx>
46 #include <Interface_Static.hxx>
47
48 #include <TopExp_Explorer.hxx>
49 #include <TopLoc_Location.hxx>
50 #include <TopoDS.hxx>
51 #include <TopoDS_Compound.hxx>
52 #include <TopoDS_Edge.hxx>
53 #include <TopoDS_Shape.hxx>
54
55 #include <Transfer_TransientProcess.hxx>
56 #include <TransferBRep_ShapeBinder.hxx>
57 #include <TransferBRep_ShapeListBinder.hxx>
58 #include <stdio.h>
59
60 #include <Message_Msg.hxx>
61 #include <Message_Messenger.hxx>
62 #include <Message_ProgressSentry.hxx>
63 #include <GeomAdaptor_Surface.hxx>
64
65 //=======================================================================
66 //function : IGESToBRep_CurveAndSurface
67 //purpose  :
68 //=======================================================================
69
70 IGESToBRep_CurveAndSurface::IGESToBRep_CurveAndSurface()
71 : myEps         (1.e-04),
72   myEpsCoeff    (1.e-06),
73   myEpsGeom     (1.e-04),
74   myMinTol      (-1.0),
75   myMaxTol      (-1.0),
76   myModeIsTopo  (Standard_True),
77   myModeApprox  (Standard_False),
78   myContIsOpti  (Standard_False),
79   myUnitFactor  (1.0),
80   mySurfaceCurve(0),
81   myContinuity  (0),
82   myUVResolution(0.0),
83   myIsResolCom  (Standard_False),
84   myTP          (new Transfer_TransientProcess())
85 {
86   UpdateMinMaxTol();
87 }
88
89
90 //=======================================================================
91 //function : IGESToBRep_CurveAndSurface
92 //purpose  : 
93 //=======================================================================
94
95 IGESToBRep_CurveAndSurface::IGESToBRep_CurveAndSurface
96   (const IGESToBRep_CurveAndSurface& other)
97 : myEps         (other.myEps),
98   myEpsCoeff    (other.myEpsCoeff),
99   myEpsGeom     (other.myEpsGeom),
100   myMinTol      (other.myMinTol),
101   myMaxTol      (other.myMaxTol),
102   myModeIsTopo  (other.myModeIsTopo),
103   myModeApprox  (other.myModeApprox),
104   myContIsOpti  (other.myContIsOpti),
105   myUnitFactor  (other.myUnitFactor),
106   mySurfaceCurve(other.mySurfaceCurve),
107   myContinuity  (other.myContinuity),
108   mySurface     (other.mySurface),
109   myUVResolution(other.myUVResolution),
110   myIsResolCom  (other.myIsResolCom),
111   myModel       (other.myModel),
112   myTP          (other.myTP)
113 {  
114 }
115
116
117 //=======================================================================
118 //function : IGESToBRep_CurveAndSurface
119 //purpose  : 
120 //=======================================================================
121
122 IGESToBRep_CurveAndSurface::IGESToBRep_CurveAndSurface
123   (const Standard_Real    eps,
124    const Standard_Real    epsCoeff,
125    const Standard_Real    epsGeom,
126    const Standard_Boolean mode,
127    const Standard_Boolean modeapprox,
128    const Standard_Boolean optimized)
129 : myEps         (eps),
130   myEpsCoeff    (epsCoeff),
131   myEpsGeom     (epsGeom),
132   myMinTol      (-1.0),
133   myMaxTol      (-1.0),
134   myModeIsTopo  (mode),
135   myModeApprox  (modeapprox),
136   myContIsOpti  (optimized),
137   myUnitFactor  (1.0),
138   mySurfaceCurve(0),
139   myContinuity  (0),
140   myUVResolution(0.0),
141   myIsResolCom  (Standard_False),
142   myTP          (new Transfer_TransientProcess())
143 {
144   UpdateMinMaxTol();
145 }
146
147 //=======================================================================
148 //function : Init
149 //purpose  : 
150 //=======================================================================
151
152 void IGESToBRep_CurveAndSurface::Init()
153 {  
154   myEps        = 1.E-04;
155   myEpsCoeff   = 1.E-06;
156   myEpsGeom    = 1.E-04;
157   myModeIsTopo = Standard_True;
158   myModeApprox = Standard_False;
159   myContIsOpti = Standard_False;
160   myUnitFactor = 1.;
161   mySurfaceCurve = 0;
162   myContinuity = 0;
163   myTP         = new Transfer_TransientProcess();
164   
165   mySurface.Nullify();
166   myIsResolCom = Standard_False;
167   myUVResolution = 0.;
168   UpdateMinMaxTol();
169 }
170
171 //=======================================================================
172 //function : SetEpsGeom
173 //purpose  : 
174 //=======================================================================
175 void IGESToBRep_CurveAndSurface::SetEpsGeom(const Standard_Real eps)
176 {
177   myEpsGeom = eps;
178   UpdateMinMaxTol();
179 }
180
181
182 //=======================================================================
183 //function : UpdateMinMaxTol
184 //purpose  : 
185 //=======================================================================
186
187 void IGESToBRep_CurveAndSurface::UpdateMinMaxTol()
188 {
189   //#74 rln 11.03.99 S4135: Setting maximum tolerances according to
190   //static parameter
191   myMaxTol = Max (Interface_Static::RVal ("read.maxprecision.val"), myEpsGeom * myUnitFactor);
192   myMinTol = Precision::Confusion();
193 }
194
195 //=======================================================================
196 //function : SetModel
197 //purpose  : 
198 //=======================================================================
199 void IGESToBRep_CurveAndSurface::SetModel(const Handle(IGESData_IGESModel)& model)
200 {  
201   myModel = model;  
202   Standard_Real unitfactor = myModel->GlobalSection().UnitValue();
203   if (unitfactor != 1.)
204     {
205       if ( myTP->TraceLevel() > 2 )
206         myTP->Messenger() << "UnitFactor = "<< unitfactor << endl;
207       myUnitFactor = unitfactor;
208     }
209   UpdateMinMaxTol();
210 }
211
212 //=======================================================================
213 //function : TransferCurveAndSurface
214 //purpose  : 
215 //=======================================================================
216
217 TopoDS_Shape IGESToBRep_CurveAndSurface::TransferCurveAndSurface
218        (const Handle(IGESData_IGESEntity)& start)
219 {
220   TopoDS_Shape res;
221   if (start.IsNull()) {
222     Message_Msg msg1005("IGES_1005");
223     SendFail(start, msg1005);
224     return res;
225   }
226   Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(start);
227 //  Standard_Integer typeNumber = start->TypeNumber();
228   
229   if (IGESToBRep::IsTopoCurve(start)) {
230     IGESToBRep_TopoCurve TC(*this);
231     res = TC.TransferTopoCurve(start);
232   }  
233   else if (IGESToBRep::IsTopoSurface(start)) {
234     IGESToBRep_TopoSurface TS(*this);
235     res = TS.TransferTopoSurface(start);
236   }
237   else if (IGESToBRep::IsBRepEntity(start)) {
238     IGESToBRep_BRepEntity TS(*this);
239     res = TS.TransferBRepEntity(start);
240   }
241   else {
242     Message_Msg msg1015("IGES_1015");
243     SendFail(start, msg1015);
244     // AddFail(start, "The IGESEntity is not a curve a Surface or a BRep Entity.");
245   }
246   // mjm le 12/09/96
247 /*
248   if (!res.IsNull()) {
249     try {
250       OCC_CATCH_SIGNALS
251       Standard_Real Eps = GetEpsGeom()*GetUnitFactor();
252       BRepLib::SameParameter(res,Eps);
253     }
254     catch(Standard_Failure) {
255     Message_Msg msg1010("IGES_1010");
256       SendWarning (start,msg1010);
257     }
258   }
259 */
260   return res;
261 }
262
263
264
265 //=======================================================================
266 //function : TransferGeometry
267 //purpose  : 
268 //=======================================================================
269
270 TopoDS_Shape IGESToBRep_CurveAndSurface::TransferGeometry
271                                (const Handle(IGESData_IGESEntity)& start)
272 {
273   // Declaration of messages// 
274   // DCE 22/12/98
275   //Message_Msg msg1005("IGES_1005");  //  Software error :  start IsNull.
276   //Message_Msg msg1015("IGES_1015");  //  invalid type or execption raising (software error).
277   //Message_Msg msg1010("IGES_1010");  //  Not sameparameter.
278   //  Message_Msg msg1015("IGES_1015");
279   //Message_Msg msg210 ("XSTEP_210");  
280   //Message_Msg msg202 ("XSTEP_202");
281   ////////////////////////////
282   TopoDS_Shape res;
283   gp_Trsf T408;
284   if (start.IsNull()) {
285     Message_Msg msg1005("IGES_1005");  //  Software error :  start IsNull.
286     SendFail(start, msg1005);
287     return res;
288   }
289
290   // Read of the DE number and the type number of the entity
291   Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(start);
292   //Standard_Integer typeNumber = start->TypeNumber();
293   
294   // sln 13.06.2002 OCC448: Avoid transfering invisiable sub entities which
295   // logicaly depend on the one
296   Standard_Integer onlyvisible = Interface_Static::IVal("read.iges.onlyvisible");
297   
298   if (IGESToBRep::IsCurveAndSurface(start)) {
299     if(onlyvisible && start->BlankStatus() == 1)
300       return res;
301     try {
302       OCC_CATCH_SIGNALS
303         res = TransferCurveAndSurface(start);
304     }
305     catch(Standard_Failure) {
306       Message_Msg msg1015("IGES_1015");
307       SendFail(start, msg1015);
308     }
309     return res;
310   }
311
312   //408 : SingularSubfigure
313   if (start->IsKind(STANDARD_TYPE(IGESBasic_SingularSubfigure))) 
314     {
315       if(onlyvisible && start->BlankStatus() == 1)
316         return res;
317         
318       DeclareAndCast(IGESBasic_SingularSubfigure, st408, start);
319       Handle (IGESBasic_SubfigureDef) stsub = st408->Subfigure();
320       gp_XYZ trans = st408->Translation();
321       gp_Vec vectr(trans);
322       Standard_Real scunit = GetUnitFactor();
323       vectr.Multiply(scunit);
324       T408.SetTranslation(vectr);
325       if (st408->HasScaleFactor()) {
326           Standard_Real scalef = st408->ScaleFactor();
327           T408.SetScaleFactor(scalef);
328         }
329       if (HasShapeResult(stsub)) {
330         res = GetShapeResult(stsub);
331       }
332       else {
333         try {
334           OCC_CATCH_SIGNALS
335           res = TransferGeometry(stsub);
336         }
337         catch(Standard_Failure) {
338           res.Nullify();
339           Message_Msg msg1015("IGES_1015");
340           SendFail( st408, msg1015);
341         }
342         if (!res.IsNull()) {
343           SetShapeResult(stsub,res);
344         }
345       }
346     }
347   
348   // 308 : SubfigureDefinition
349   else if (start->IsKind(STANDARD_TYPE(IGESBasic_SubfigureDef))) {
350     DeclareAndCast(IGESBasic_SubfigureDef, st308, start);
351     TopoDS_Compound group;
352     BRep_Builder B;
353     B.MakeCompound (group);
354     if (st308->NbEntities() < 1) {
355       Message_Msg msg210 ("XSTEP_210");  
356       SendFail( st308, msg210);
357       return res;
358     }
359     Message_ProgressSentry PS ( myTP->GetProgress(), "Subfigure item", 0, st308->NbEntities(), 1 );
360     for (Standard_Integer i=1; i <= st308->NbEntities() && PS.More(); i++, PS.Next()) {
361       TopoDS_Shape item;
362       if (st308->AssociatedEntity(i).IsNull()) {
363         Message_Msg msg1020("IGES_1020");
364         msg1020.Arg(i);
365         SendWarning( st308, msg1020);
366         continue;
367       }
368       if(onlyvisible && st308->AssociatedEntity(i)->BlankStatus() == 1 )
369         continue;      
370         
371       if (HasShapeResult(st308->AssociatedEntity(i)))
372         {
373           item = GetShapeResult(st308->AssociatedEntity(i));
374         }
375       else {
376         try {      
377           OCC_CATCH_SIGNALS
378           item = TransferGeometry(st308->AssociatedEntity(i));
379         }
380         catch(Standard_Failure) {
381           item.Nullify();
382           Message_Msg msg1015("IGES_1015");
383           SendFail( st308->AssociatedEntity(i), msg1015);
384         }
385       }
386       if (item.IsNull()) {
387         Message_Msg msg1025("IGES_1025");
388         msg1025.Arg(i);
389         SendWarning (start,msg1025);
390       }
391       else {
392         B.Add(group, item);
393         SetShapeResult (st308->AssociatedEntity(i),item);
394       }
395     }
396     res = group;
397   }
398   else if (start->IsKind(STANDARD_TYPE(IGESBasic_Group))) {
399     if(onlyvisible && start->BlankStatus() == 1)
400       return res;      
401     
402     DeclareAndCast(IGESBasic_Group, st402f1, start);
403     TopoDS_Compound group;
404     BRep_Builder B;
405     B.MakeCompound (group);
406     if (st402f1->NbEntities() < 1) {
407       Message_Msg msg202 ("XSTEP_202");
408       msg202.Arg(st402f1->FormNumber());
409       SendFail(st402f1, msg202);
410       return res;
411     }
412     Message_ProgressSentry PS ( myTP->GetProgress(), "Group item", 0, st402f1->NbEntities(), 1 );
413     Standard_Boolean ProblemInGroup = Standard_False;
414     for (Standard_Integer i=1; i <= st402f1->NbEntities() && PS.More(); i++, PS.Next()) {
415       TopoDS_Shape item;
416       if (st402f1->Entity(i).IsNull()) {
417         Message_Msg msg1020("IGES_1020");
418         msg1020.Arg(i);
419         SendFail( st402f1, msg1020);
420         continue;
421       }
422       
423       if(onlyvisible && st402f1->Entity(i)->BlankStatus() == 1)
424         continue;      
425       
426       if (HasShapeResult(st402f1->Entity(i))) {
427         item = GetShapeResult(st402f1->Entity(i));
428       }
429       else {
430         try {
431           OCC_CATCH_SIGNALS
432           item = TransferGeometry(st402f1->Entity(i));
433         }
434         catch(Standard_Failure) {
435           item.Nullify();
436           Message_Msg msg1015("IGES_1015");
437           SendFail(st402f1->Entity(i),msg1015);
438         }
439       }
440       if (item.IsNull()) {
441         //Message_Msg msg1030("IGES_1030");
442         //msg1030.Arg(st402f1->FormNumber());
443         //msg1030.Arg(i);
444         //SendWarning (st402f1,msg1030);
445         ProblemInGroup = Standard_True;
446       }
447       else {
448         B.Add(group, item);
449         SetShapeResult (st402f1->Entity(i),item);
450       }
451     }
452     res = group;
453     if(ProblemInGroup) {
454       Message_Msg msg1030("IGES_1030");
455       msg1030.Arg(st402f1->FormNumber());
456       SendWarning (st402f1,msg1030);
457     }
458   }
459   else if (start->IsKind(STANDARD_TYPE(IGESBasic_GroupWithoutBackP))) { 
460     
461     if(onlyvisible && start->BlankStatus() == 1)
462       return res;      
463     
464     DeclareAndCast(IGESBasic_GroupWithoutBackP, st402f7, start);
465     TopoDS_Compound group;
466 //unused    Handle(TCollection_HAsciiString) label = GetModel()->StringLabel(st402f7);
467     BRep_Builder B;
468     B.MakeCompound (group);
469     if (st402f7->NbEntities() < 1) {
470       Message_Msg msg202 ("XSTEP_202");
471       msg202.Arg(st402f7->FormNumber());
472       SendFail(st402f7, msg202); 
473       return res;
474     }
475     Message_ProgressSentry PS ( myTP->GetProgress(), "Group item", 0, st402f7->NbEntities(), 1 );
476     Standard_Boolean ProblemInGroup = Standard_False;
477     for (Standard_Integer i=1; i <= st402f7->NbEntities() && PS.More(); i++, PS.Next()) {
478       TopoDS_Shape item;
479       if (st402f7->Entity(i).IsNull()) {
480         Message_Msg msg1020("IGES_1020");
481         msg1020.Arg(i);
482         SendFail( st402f7, msg1020);
483         continue;
484       }
485       
486       if(onlyvisible && st402f7->Entity(i)->BlankStatus() == 1 )
487         continue;      
488
489       if (HasShapeResult(st402f7->Entity(i))) {
490         item = GetShapeResult(st402f7->Entity(i));
491       }
492       else {
493         try {
494           OCC_CATCH_SIGNALS
495           item = TransferGeometry(st402f7->Entity(i));
496         }
497         catch(Standard_Failure) {
498           item.Nullify();
499           Message_Msg msg1015("IGES_1015");
500           SendFail(st402f7->Entity(i),msg1015);
501         }
502       }
503       if (item.IsNull()) {
504         //Message_Msg msg1030("IGES_1030");
505         //msg1030.Arg(st402f7->FormNumber());
506         //msg1030.Arg(i);
507         //SendWarning (st402f7,msg1030);
508         ProblemInGroup = Standard_True;
509       }
510       else {
511         B.Add(group, item);
512         SetShapeResult (st402f7->Entity(i),item);
513       }
514     }
515     res = group;
516     if(ProblemInGroup) {
517       Message_Msg msg1030("IGES_1030");
518       msg1030.Arg(st402f7->FormNumber());
519       SendWarning (st402f7,msg1030);
520     }
521   }
522   else {
523     Message_Msg msg1001("IGES_1001");
524     msg1001.Arg(start->FormNumber());
525     SendFail (start,msg1001);
526     return res;
527   }
528   
529   if (start->HasTransf()) {
530     gp_Trsf T;
531     SetEpsilon(1.E-04);
532     if (IGESData_ToolLocation::ConvertLocation(GetEpsilon(),start->CompoundLocation(),
533                                                T,GetUnitFactor())) {
534       if (start->IsKind(STANDARD_TYPE(IGESBasic_SingularSubfigure))) 
535         {
536           gp_XYZ tra = T.TranslationPart();
537           gp_XYZ trans = T408.TranslationPart();
538           tra.Add(trans);
539           T.SetTranslationPart(tra);
540           Standard_Real sc = T.ScaleFactor();
541           Standard_Real scalef = T408.ScaleFactor();
542           sc = sc*scalef;
543           T.SetScaleFactor(sc);
544         }
545       TopLoc_Location L(T);
546       res.Move(L);
547     }
548     else {
549       Message_Msg msg1035("IGES_1035");
550       SendWarning (start,msg1035);
551     }
552   }
553   else {
554     if (start->IsKind(STANDARD_TYPE(IGESBasic_SingularSubfigure))) {
555       TopLoc_Location L(T408);
556       res.Move(L);        
557     }
558   }  
559   return res;
560 }
561
562
563 //=======================================================================
564 //function : HasShapeResult
565 //purpose  : 
566 //=======================================================================
567
568 Standard_Boolean IGESToBRep_CurveAndSurface::HasShapeResult 
569   (const Handle(IGESData_IGESEntity)& start) const
570 {
571   DeclareAndCast(TransferBRep_ShapeBinder,binder,myTP->Find(start));
572   if (binder.IsNull()) return Standard_False;
573   return binder->HasResult();
574 }
575
576
577 //=======================================================================
578 //function : GetShapeResult
579 //purpose  : 
580 //=======================================================================
581
582 TopoDS_Shape IGESToBRep_CurveAndSurface::GetShapeResult 
583   (const Handle(IGESData_IGESEntity)& start) const
584 {
585   TopoDS_Shape res;
586
587   DeclareAndCast(TransferBRep_ShapeBinder, binder, myTP->Find(start));
588   if (binder.IsNull()) return res;
589   if (binder->HasResult())
590     res = binder->Result();
591   return res;
592 }
593
594
595 //=======================================================================
596 //function : SetShapeResult
597 //purpose  : 
598 //=======================================================================
599
600 void IGESToBRep_CurveAndSurface::SetShapeResult 
601   (const Handle(IGESData_IGESEntity)& start,
602    const TopoDS_Shape& result)
603 {
604   Handle(TransferBRep_ShapeBinder) binder = new TransferBRep_ShapeBinder;
605   myTP->Bind(start,binder);
606   binder->SetResult(result);
607 }
608
609 //=======================================================================
610 //function : NbShapeResult
611 //purpose  : 
612 //=======================================================================
613
614 Standard_Integer IGESToBRep_CurveAndSurface::NbShapeResult 
615   (const Handle(IGESData_IGESEntity)& start) const
616 {
617   Standard_Integer nbres = 0;
618   DeclareAndCast(TransferBRep_ShapeListBinder,binder,myTP->Find(start));
619   if (binder.IsNull()) return nbres;
620   nbres = binder->NbShapes();
621   return nbres;
622 }
623
624
625 //=======================================================================
626 //function : GetShapeResult
627 //purpose  : 
628 //=======================================================================
629
630 TopoDS_Shape IGESToBRep_CurveAndSurface::GetShapeResult 
631   (const Handle(IGESData_IGESEntity)& start, const Standard_Integer num) const
632 {
633   TopoDS_Shape res;
634
635   DeclareAndCast(TransferBRep_ShapeListBinder,binder,myTP->Find(start));
636   if (binder.IsNull()) return res;
637   
638   if (num <= binder->NbShapes()) 
639     res = binder->Shape(num);
640   return res;
641 }
642
643
644 //=======================================================================
645 //function : AddShapeResult
646 //purpose  : 
647 //=======================================================================
648
649 void IGESToBRep_CurveAndSurface::AddShapeResult 
650   (const Handle(IGESData_IGESEntity)& start,
651    const TopoDS_Shape& result)
652 {
653   DeclareAndCast(TransferBRep_ShapeListBinder,binder,myTP->Find(start));
654   if (binder.IsNull()){
655     binder = new TransferBRep_ShapeListBinder;
656     myTP->Bind(start,binder);
657   }
658   binder->AddResult(result);
659 }
660
661 void IGESToBRep_CurveAndSurface::SetSurface(const Handle(Geom_Surface)& theSurface)
662 {
663   if(mySurface!=theSurface) {
664     mySurface = theSurface;
665     myIsResolCom = Standard_False;
666     myUVResolution = 0.;
667   }
668 }
669
670 Handle(Geom_Surface) IGESToBRep_CurveAndSurface::Surface() const 
671 {
672   return mySurface;
673 }
674
675 Standard_Real IGESToBRep_CurveAndSurface::GetUVResolution()
676 {
677   if(!myIsResolCom && !mySurface.IsNull()) {
678     myIsResolCom = Standard_True;
679     GeomAdaptor_Surface aGAS(mySurface);
680     myUVResolution = Min(aGAS.UResolution(1.), aGAS.VResolution(1.));
681   }
682   return myUVResolution;
683 }
684
685
686
687
688
689