From e1ed38e054575c54f98e0eb71a876db2d9498688 Mon Sep 17 00:00:00 2001 From: aml Date: Thu, 20 Aug 2015 10:24:15 +0300 Subject: [PATCH] 0026556: Infinite calculations of BRepOffset_MakeOffset Method for preanalysis of input data added (CheckInputData). Now it is possible to work with Error() function, which return error code. Extended output support for all offset commands added. Test-cases for issue #26556 --- src/BRepOffset/BRepOffset_Error.hxx | 10 +- src/BRepOffset/BRepOffset_MakeOffset.cxx | 226 +++++++++++++++++++--- src/BRepOffset/BRepOffset_MakeOffset.hxx | 15 +- src/BRepTest/BRepTest_FeatureCommands.cxx | 104 ++++++---- tests/bugs/modalg_2/bug21261_15 | 5 +- tests/bugs/modalg_2/bug21261_21 | 5 +- tests/bugs/modalg_2/bug427_6 | 1 + tests/bugs/modalg_2/bug5805_3 | 2 + tests/bugs/modalg_2/bug5805_4 | 1 - tests/bugs/modalg_4/bug5806 | 1 + tests/bugs/modalg_6/bug26556_1 | 18 ++ tests/bugs/modalg_6/bug26556_2 | 18 ++ tests/bugs/modalg_6/bug26556_3 | 18 ++ tests/bugs/modalg_6/bug26556_4 | 19 ++ tests/offset/compshape/A1 | 6 +- tests/offset/compshape/A4 | 5 +- tests/offset/faces_type_a/A3 | 2 +- tests/offset/faces_type_a/A4 | 2 +- tests/offset/faces_type_a/A9 | 2 +- tests/offset/faces_type_i/A9 | 2 +- tests/offset/faces_type_i/B3 | 2 +- tests/offset/faces_type_i/B4 | 2 +- tests/offset/faces_type_i/B5 | 2 +- tests/offset/faces_type_i/B6 | 2 +- tests/offset/faces_type_i/C1 | 2 +- tests/offset/faces_type_i/C2 | 2 +- tests/offset/faces_type_i/C3 | 2 +- tests/offset/faces_type_i/C7 | 2 +- tests/offset/faces_type_i/D1 | 2 +- tests/offset/faces_type_i/D2 | 2 +- tests/offset/faces_type_i/D3 | 2 +- tests/offset/faces_type_i/E7 | 2 +- tests/offset/faces_type_i/E8 | 2 +- tests/offset/faces_type_i/E9 | 2 +- tests/offset/faces_type_i/F1 | 2 +- tests/offset/faces_type_i/F2 | 2 +- tests/offset/faces_type_i/F3 | 2 +- tests/offset/faces_type_i/F4 | 2 +- tests/offset/faces_type_i/F5 | 2 +- tests/offset/faces_type_i/I5 | 2 +- tests/offset/faces_type_i/J5 | 2 +- tests/offset/faces_type_i/J7 | 2 +- tests/offset/faces_type_i/K6 | 2 +- tests/offset/faces_type_i/M6 | 2 +- tests/offset/faces_type_i/M8 | 2 +- tests/offset/faces_type_i/N1 | 2 +- tests/offset/shape/A1 | 1 + tests/offset/shape/A2 | 4 +- tests/offset/shape/A3 | 4 +- 49 files changed, 409 insertions(+), 114 deletions(-) create mode 100644 tests/bugs/modalg_6/bug26556_1 create mode 100644 tests/bugs/modalg_6/bug26556_2 create mode 100644 tests/bugs/modalg_6/bug26556_3 create mode 100644 tests/bugs/modalg_6/bug26556_4 diff --git a/src/BRepOffset/BRepOffset_Error.hxx b/src/BRepOffset/BRepOffset_Error.hxx index 89621eda86..447eec83ad 100644 --- a/src/BRepOffset/BRepOffset_Error.hxx +++ b/src/BRepOffset/BRepOffset_Error.hxx @@ -21,11 +21,11 @@ enum BRepOffset_Error { BRepOffset_NoError, -BRepOffset_OffsetSurfaceFailed, -BRepOffset_UnCorrectClosingFace, -BRepOffset_ExtentFaceFailed, -BRepOffset_RadiusEqualOffset, -BRepOffset_UnknownError +BRepOffset_UnknownError, +BRepOffset_BadNormalsOnGeometry, +BRepOffset_C0Geometry, +BRepOffset_NullOffset, +BRepOffset_NotConnectedShell }; #endif // _BRepOffset_Error_HeaderFile diff --git a/src/BRepOffset/BRepOffset_MakeOffset.cxx b/src/BRepOffset/BRepOffset_MakeOffset.cxx index b08afacf4f..15b64e83f2 100644 --- a/src/BRepOffset/BRepOffset_MakeOffset.cxx +++ b/src/BRepOffset/BRepOffset_MakeOffset.cxx @@ -111,6 +111,7 @@ #include #include #include +#include #include // POP for NT @@ -235,6 +236,11 @@ static void DEBVerticesControl (const TopTools_IndexedMapOfShape& NewEdges, } #endif +static BRepOffset_Error checkSinglePoint(const Standard_Real theUParam, + const Standard_Real theVParam, + const Handle(Geom_Surface)& theSurf, + const NCollection_Vector& theBadPoints); + //--------------------------------------------------------------------- static void UpdateTolerance ( TopoDS_Shape& myShape, const TopTools_IndexedMapOfShape& myFaces); @@ -679,28 +685,11 @@ void BRepOffset_MakeOffset::MakeOffsetShape() RemoveCorks (myShape,myFaces); } - if (! IsConnectedShell(myShape)) - Standard_ConstructionError::Raise("BRepOffset_MakeOffset : Incorrect set of faces to remove, the remaining shell is not connected"); - - if (Abs(myOffset) <= myTol) + if (!CheckInputData()) { - // Check for face with non-null offset value. - Standard_Boolean isFound = Standard_False; - TopTools_DataMapIteratorOfDataMapOfShapeReal anIter(myFaceOffset); - for( ; anIter.More(); anIter.Next()) - { - if (Abs(anIter.Value()) > myTol) - { - isFound = Standard_True; - break; - } - } - - if (!isFound) - { - // No face with non-null offset found. - return; - } + // There is error in input data. + // Check Error() method. + return; } TopAbs_State Side = TopAbs_IN; @@ -814,11 +803,18 @@ void BRepOffset_MakeOffset::MakeThickSolid() //-------------------------------------------------------------- MakeOffsetShape (); + if (!myDone) + { + // Save return code and myDone state. + return; + } + //-------------------------------------------------------------------- // Construction of a solid with the initial shell, parallel shell // limited by caps. //-------------------------------------------------------------------- - if (!myFaces.IsEmpty()) { + if (!myFaces.IsEmpty()) + { TopoDS_Solid Res; TopExp_Explorer exp; BRep_Builder B; @@ -827,7 +823,8 @@ void BRepOffset_MakeOffset::MakeThickSolid() B.MakeSolid(Res); BRepTools_Quilt Glue; - for (exp.Init(myShape,TopAbs_FACE); exp.More(); exp.Next()) { + for (exp.Init(myShape,TopAbs_FACE); exp.More(); exp.Next()) + { NbF++; Glue.Add (exp.Current()); } @@ -856,11 +853,13 @@ void BRepOffset_MakeOffset::MakeThickSolid() if (YaResult == 0) { myDone = Standard_False; + myError = BRepOffset_UnknownError; return; } myOffsetShape = Glue.Shells(); - for (exp.Init(myOffsetShape,TopAbs_SHELL); exp.More(); exp.Next()) { + for (exp.Init(myOffsetShape,TopAbs_SHELL); exp.More(); exp.Next()) + { B.Add(Res,exp.Current()); } Res.Closed(Standard_True); @@ -868,18 +867,20 @@ void BRepOffset_MakeOffset::MakeThickSolid() // Test of Validity of the result of thick Solid // more face than the initial solid. - Standard_Integer NbOF = 0; - for (exp.Init(myOffsetShape,TopAbs_FACE);exp.More(); exp.Next()) { + for (exp.Init(myOffsetShape,TopAbs_FACE);exp.More(); exp.Next()) + { NbOF++; } - if (NbOF <= NbF) { + if (NbOF <= NbF) + { myDone = Standard_False; + myError = BRepOffset_UnknownError; return; } } - if (myOffset > 0 ) myOffsetShape.Reverse(); + if (myOffset > 0 ) myOffsetShape.Reverse(); myDone = Standard_True; } @@ -3466,3 +3467,172 @@ void CorrectSolid(TopoDS_Solid& theSol, TopTools_ListOfShape& theSolList) } theSol = aNewSol; } + +//======================================================================= +//function : CheckInputData +//purpose : Check input data for possiblity of offset perform. +//======================================================================= +Standard_Boolean BRepOffset_MakeOffset::CheckInputData() +{ + // Set initial error state. + myError = BRepOffset_NoError; + TopoDS_Shape aTmpShape; + myBadShape = aTmpShape; + + // Non-null offset. + if (Abs(myOffset) <= myTol) + { + Standard_Boolean isFound = Standard_False; + TopTools_DataMapIteratorOfDataMapOfShapeReal anIter(myFaceOffset); + for( ; anIter.More(); anIter.Next()) + { + if (Abs(anIter.Value()) > myTol) + { + isFound = Standard_True; + break; + } + } + + if (!isFound) + { + // No face with non-null offset found. + myError = BRepOffset_NullOffset; + return Standard_False; + } + } + + // Connectivity of input shape. + if (!IsConnectedShell(myShape)) + { + myError = BRepOffset_NotConnectedShell; + return Standard_False; + } + + // Normals check and continuity check. + const Standard_Integer aPntPerDim = 20; // 21 points on each dimension. + Standard_Real aUmin, aUmax, aVmin, aVmax; + TopExp_Explorer anExpSF(myShape, TopAbs_FACE); + NCollection_Map aPresenceMap; + TopLoc_Location L; + gp_Pnt2d aPnt2d; + for( ; anExpSF.More(); anExpSF.Next()) + { + const TopoDS_Face& aF = TopoDS::Face(anExpSF.Current()); + + if (aPresenceMap.Contains(aF.TShape())) + { + // Not perform computations with partner shapes, + // since they are contain same geometry. + continue; + } + aPresenceMap.Add(aF.TShape()); + + const Handle(Geom_Surface)& aSurf = BRep_Tool::Surface(aF, L); + BRepTools::UVBounds(aF, aUmin, aUmax, aVmin, aVmax); + + // Continuity check. + if (aSurf->Continuity() == GeomAbs_C0) + { + myError = BRepOffset_C0Geometry; + return Standard_False; + } + + // Get degenerated points, to avoid check them. + NCollection_Vector aBad3dPnts; + TopExp_Explorer anExpFE(aF, TopAbs_EDGE); + for( ; anExpFE.More(); anExpFE.Next()) + { + const TopoDS_Edge &aE = TopoDS::Edge(anExpFE.Current()); + if (BRep_Tool::Degenerated(aE)) + { + aBad3dPnts.Append(BRep_Tool::Pnt((TopExp::FirstVertex(aE)))); + } + } + + // Geometry grid check. + for(Standard_Integer i = 0; i <= aPntPerDim; i++) + { + Standard_Real aUParam = aUmin + (aUmax - aUmin) * i / aPntPerDim; + for(Standard_Integer j = 0; j <= aPntPerDim; j++) + { + Standard_Real aVParam = aVmin + (aVmax - aVmin) * j / aPntPerDim; + + myError = checkSinglePoint(aUParam, aVParam, aSurf, aBad3dPnts); + if (myError != BRepOffset_NoError) + return Standard_False; + } + } + + // Vertex list check. + TopExp_Explorer anExpFV(aF, TopAbs_VERTEX); + for( ; anExpFV.More(); anExpFV.Next()) + { + const TopoDS_Vertex &aV = TopoDS::Vertex(anExpFV.Current()); + aPnt2d = BRep_Tool::Parameters(aV, aF); + + myError = checkSinglePoint(aPnt2d.X(), aPnt2d.Y(), aSurf, aBad3dPnts); + if (myError != BRepOffset_NoError) + return Standard_False; + } + } + + return Standard_True; +} + + +//======================================================================= +//function : GetBadShape +//purpose : Get shape where problems detected. +//======================================================================= +const TopoDS_Shape& BRepOffset_MakeOffset::GetBadShape() const +{ + return myBadShape; +} + + +//======================================================================= +//function : checkSinglePoint +//purpose : Check single point on surface for bad normals +//======================================================================= +BRepOffset_Error checkSinglePoint(const Standard_Real theUParam, + const Standard_Real theVParam, + const Handle(Geom_Surface)& theSurf, + const NCollection_Vector& theBadPoints) +{ + gp_Pnt aPnt; + gp_Vec aD1U, aD1V; + theSurf->D1(theUParam, theVParam, aPnt, aD1U, aD1V); + + if (aD1U.SquareMagnitude() < Precision::SquareConfusion() || + aD1V.SquareMagnitude() < Precision::SquareConfusion() ) + { + Standard_Boolean isKnownBadPnt = Standard_False; + for(Standard_Integer anIdx = theBadPoints.Lower(); + anIdx <= theBadPoints.Upper(); + ++anIdx) + { + if (aPnt.SquareDistance(theBadPoints(anIdx)) < Precision::SquareConfusion()) + { + isKnownBadPnt = Standard_True; + break; + } + } // for(Standard_Integer anIdx = theBadPoints.Lower(); + + if (!isKnownBadPnt) + { + return BRepOffset_BadNormalsOnGeometry; + } + else + { + return BRepOffset_NoError; + } + } // if (aD1U.SquareMagnitude() < Precision::SquareConfusion() || + + if (aD1U.IsParallel(aD1V, Precision::Confusion())) + { + // Isolines are collinear. + return BRepOffset_BadNormalsOnGeometry; + } + + return BRepOffset_NoError; +} diff --git a/src/BRepOffset/BRepOffset_MakeOffset.hxx b/src/BRepOffset/BRepOffset_MakeOffset.hxx index ece1577e0d..c194998935 100644 --- a/src/BRepOffset/BRepOffset_MakeOffset.hxx +++ b/src/BRepOffset/BRepOffset_MakeOffset.hxx @@ -76,7 +76,7 @@ public: Standard_EXPORT const TopoDS_Shape& Shape() const; - //! returns information if IsDone() = FALSE. + //! returns information about offset state. Standard_EXPORT BRepOffset_Error Error() const; //! Returns containing links between initials @@ -93,6 +93,18 @@ public: //! Returns the list of closing faces stores by AddFace Standard_EXPORT const TopTools_IndexedMapOfShape& ClosingFaces() const; + //! Makes pre analysis of possibility offset perform. Use method Error() to get more information. + //! Finds first error. List of checks: + //! 1) Check for existence object with non-null offset. + //! 2) Check for connectivity in offset shell. + //! 3) Check continuity of input surfaces. + //! 4) Check for normals existence on grid. + //! @return True if possible make computations and false otherwise. + Standard_EXPORT Standard_Boolean CheckInputData(); + + //! Return bad shape, which obtained in CheckInputData. + Standard_EXPORT const TopoDS_Shape& GetBadShape() const; + @@ -162,6 +174,7 @@ private: BRepOffset_Error myError; BRepOffset_MakeLoops myMakeLoops; Standard_Boolean myIsPerformSewing; // Handle bad walls in thicksolid mode. + TopoDS_Shape myBadShape; }; diff --git a/src/BRepTest/BRepTest_FeatureCommands.cxx b/src/BRepTest/BRepTest_FeatureCommands.cxx index 97acc216d0..bca729d9fb 100644 --- a/src/BRepTest/BRepTest_FeatureCommands.cxx +++ b/src/BRepTest/BRepTest_FeatureCommands.cxx @@ -340,7 +340,48 @@ static Standard_Integer CONTROL(Draw_Interpretor& theCommands, } return 0; } - + +//======================================================================= +//function : reportOffsetState +//purpose : Print state of offset operation by error code. +//======================================================================= +static void reportOffsetState(Draw_Interpretor& theCommands, + const BRepOffset_Error theErrorCode) +{ + switch(theErrorCode) + { + case BRepOffset_NoError: + { + theCommands << "OK. Offset performed succesfully."; + break; + } + case BRepOffset_BadNormalsOnGeometry: + { + theCommands << "ERROR. Degenerated normal on input data."; + break; + } + case BRepOffset_C0Geometry: + { + theCommands << "ERROR. C0 continuity of input data."; + break; + } + case BRepOffset_NullOffset: + { + theCommands << "ERROR. Null offset of all faces."; + break; + } + case BRepOffset_NotConnectedShell: + { + theCommands << "ERROR. Incorrect set of faces to remove, the remaining shell is not connected."; + break; + } + default: + { + theCommands << "ERROR. offsetperform operation not done."; + break; + } + } +} //======================================================================= //function : PRW @@ -801,13 +842,9 @@ static Standard_Integer SPLS(Draw_Interpretor& , //function : thickshell //purpose : //======================================================================= - -Standard_Integer thickshell(Draw_Interpretor& , - Standard_Integer n, const char** a) +Standard_Integer thickshell(Draw_Interpretor& theCommands, + Standard_Integer n, const char** a) { - - //OSD_Chronometer Clock; - if ( n < 4) return 1; TopoDS_Shape S = DBRep::Get(a[2]); if (S.IsNull()) return 1; @@ -816,13 +853,13 @@ Standard_Integer thickshell(Draw_Interpretor& , GeomAbs_JoinType JT= GeomAbs_Arc; if (n > 4) - { - if (!strcmp(a[4],"i")) - JT = GeomAbs_Intersection; - if (!strcmp(a[4],"t")) - JT = GeomAbs_Tangent; - } - + { + if (!strcmp(a[4],"i")) + JT = GeomAbs_Intersection; + if (!strcmp(a[4],"t")) + JT = GeomAbs_Tangent; + } + Standard_Boolean Inter = Standard_False; //Standard_True; Standard_Real Tol = Precision::Confusion(); if (n > 5) @@ -831,15 +868,12 @@ Standard_Integer thickshell(Draw_Interpretor& , BRepOffset_MakeOffset B; B.Initialize(S,Of,Tol,BRepOffset_Skin,Inter,0,JT, Standard_True); -// Clock.Start(); - B.MakeOffsetShape(); - //B.MakeThickSolid (); -// Clock.Show(); + const BRepOffset_Error aRetCode = B.Error(); + reportOffsetState(theCommands, aRetCode); DBRep::Set(a[1],B.Shape()); - return 0; } @@ -848,12 +882,9 @@ Standard_Integer thickshell(Draw_Interpretor& , //purpose : //======================================================================= -Standard_Integer offsetshape(Draw_Interpretor& , - Standard_Integer n, const char** a) +Standard_Integer offsetshape(Draw_Interpretor& theCommands, + Standard_Integer n, const char** a) { - - //OSD_Chronometer Clock; - if ( n < 4) return 1; TopoDS_Shape S = DBRep::Get(a[2]); if (S.IsNull()) return 1; @@ -861,7 +892,8 @@ Standard_Integer offsetshape(Draw_Interpretor& , Standard_Real Of = Draw::Atof(a[3]); Standard_Boolean Inter = (!strcmp(a[0],"offsetcompshape")); GeomAbs_JoinType JT= GeomAbs_Arc; - if (!strcmp(a[0],"offsetinter")) { + if (!strcmp(a[0],"offsetinter")) + { JT = GeomAbs_Intersection; Inter = Standard_True; } @@ -869,9 +901,11 @@ Standard_Integer offsetshape(Draw_Interpretor& , BRepOffset_MakeOffset B; Standard_Integer IB = 4; Standard_Real Tol = Precision::Confusion(); - if (n > 4) { + if (n > 4) + { TopoDS_Shape SF = DBRep::Get(a[4],TopAbs_FACE); - if (SF.IsNull()) { + if (SF.IsNull()) + { IB = 5; Tol = Draw::Atof(a[4]); } @@ -882,19 +916,21 @@ Standard_Integer offsetshape(Draw_Interpretor& , //---------------------------------------- Standard_Boolean YaBouchon = Standard_False; - for (Standard_Integer i = IB ; i < n; i++) { + for (Standard_Integer i = IB ; i < n; i++) + { TopoDS_Shape SF = DBRep::Get(a[i],TopAbs_FACE); - if (!SF.IsNull()) { + if (!SF.IsNull()) + { YaBouchon = Standard_True; B.AddFace(TopoDS::Face(SF)); } } -// Clock.Start(); - if (!YaBouchon) B.MakeOffsetShape(); else B.MakeThickSolid (); -// Clock.Show(); + + const BRepOffset_Error aRetCode = B.Error(); + reportOffsetState(theCommands, aRetCode); DBRep::Set(a[1],B.Shape()); @@ -1031,8 +1067,8 @@ Standard_Integer offsetperform(Draw_Interpretor& theCommands, } else { - theCommands << "ERROR. offsetperform operation not done."; - return 1; + const BRepOffset_Error aRetCode = TheOffset.Error(); + reportOffsetState(theCommands, aRetCode); } return 0; diff --git a/tests/bugs/modalg_2/bug21261_15 b/tests/bugs/modalg_2/bug21261_15 index c52710dab7..998fdb19ac 100755 --- a/tests/bugs/modalg_2/bug21261_15 +++ b/tests/bugs/modalg_2/bug21261_15 @@ -1,5 +1,6 @@ -puts "TODO OCC25916 ALL: \\*\\* Exception" -puts "TODO OCC25916 ALL: An exception was caught" +puts "TODO OCC25916 ALL: ERROR. C0 continuity of input data." +puts "TODO OCC26556 ALL: result is not a topological shape!!!" +puts "TODO OCC26556 ALL: Error: object with name 'result' does not exist!" puts "TODO OCC25916 ALL: TEST INCOMPLETE" puts "========" puts "OCC21261" diff --git a/tests/bugs/modalg_2/bug21261_21 b/tests/bugs/modalg_2/bug21261_21 index 40f2e6134f..248dfeebd5 100755 --- a/tests/bugs/modalg_2/bug21261_21 +++ b/tests/bugs/modalg_2/bug21261_21 @@ -1,5 +1,6 @@ -puts "TODO OCC25916 ALL: \\*\\* Exception" -puts "TODO OCC25916 ALL: An exception was caught" +puts "TODO OCC25916 ALL: ERROR. Incorrect set of faces to remove, the remaining shell is not connected." +puts "TODO OCC26556 ALL: result is not a topological shape!!!" +puts "TODO OCC26556 ALL: Error: object with name 'result' does not exist!" puts "TODO OCC25916 ALL: TEST INCOMPLETE" puts "========" puts "OCC21261" diff --git a/tests/bugs/modalg_2/bug427_6 b/tests/bugs/modalg_2/bug427_6 index 45c0cb1986..cefcb919b9 100755 --- a/tests/bugs/modalg_2/bug427_6 +++ b/tests/bugs/modalg_2/bug427_6 @@ -1,4 +1,5 @@ puts "TODO OCC23068 ALL: ERROR. offsetperform operation not done." +puts "TODO OCC23068 ALL: result is not a topological shape!!!" puts "TODO OCC23068 ALL: TEST INCOMPLETE" puts "========================" diff --git a/tests/bugs/modalg_2/bug5805_3 b/tests/bugs/modalg_2/bug5805_3 index 9acee07be6..f262fc146b 100755 --- a/tests/bugs/modalg_2/bug5805_3 +++ b/tests/bugs/modalg_2/bug5805_3 @@ -1,3 +1,5 @@ +puts "TODO OCC26556 ALL: ERROR. offsetperform operation not done." + puts "============" puts "OCC5805" puts "============" diff --git a/tests/bugs/modalg_2/bug5805_4 b/tests/bugs/modalg_2/bug5805_4 index 85d9963f07..731cff9d0f 100755 --- a/tests/bugs/modalg_2/bug5805_4 +++ b/tests/bugs/modalg_2/bug5805_4 @@ -1,5 +1,4 @@ puts "TODO OCC25925 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC25925 ALL: Faulty OCC5805 : offsetshape is wrong" puts "TODO OCC25925 ALL: Tcl Exception:" puts "TODO OCC25925 ALL: TEST INCOMPLETE" diff --git a/tests/bugs/modalg_4/bug5806 b/tests/bugs/modalg_4/bug5806 index b4033a948b..eafe5fa7e3 100755 --- a/tests/bugs/modalg_4/bug5806 +++ b/tests/bugs/modalg_4/bug5806 @@ -1,3 +1,4 @@ +puts "TODO OCC25925 ALL: ERROR. offsetperform operation not done." puts "============" puts "OCC5806" puts "============" diff --git a/tests/bugs/modalg_6/bug26556_1 b/tests/bugs/modalg_6/bug26556_1 new file mode 100644 index 0000000000..8fc715542c --- /dev/null +++ b/tests/bugs/modalg_6/bug26556_1 @@ -0,0 +1,18 @@ +puts "========" +puts "OCC26556" +puts "========" +puts "" +################################################## +# Infinite calculations of BRepOffset_MakeOffset +################################################## + +restore [locate_data_file OCC26556-004_extract_2015-01-C37_0216_res.brep] sh +offsetparameter 1e-7 p i +offsetload sh 300 +decho off +set bug_info [offsetperform r] +decho on + +if {$bug_info != "ERROR. Degenerated normal on input data."} { + puts "ERROR: OCC26556 is reproduced. Error message is absent." +} diff --git a/tests/bugs/modalg_6/bug26556_2 b/tests/bugs/modalg_6/bug26556_2 new file mode 100644 index 0000000000..ca9077a1ba --- /dev/null +++ b/tests/bugs/modalg_6/bug26556_2 @@ -0,0 +1,18 @@ +puts "========" +puts "OCC26556" +puts "========" +puts "" +################################################## +# Infinite calculations of BRepOffset_MakeOffset +################################################## + +restore [locate_data_file OCC26556-004_extract_2015-01-C37_0240_res.brep] sh +offsetparameter 1e-7 p i +offsetload sh 400 +decho off +set bug_info [offsetperform r] +decho on + +if {$bug_info != "ERROR. Degenerated normal on input data."} { + puts "ERROR: OCC26556 is reproduced. Error message is absent." +} diff --git a/tests/bugs/modalg_6/bug26556_3 b/tests/bugs/modalg_6/bug26556_3 new file mode 100644 index 0000000000..dd625dd130 --- /dev/null +++ b/tests/bugs/modalg_6/bug26556_3 @@ -0,0 +1,18 @@ +puts "========" +puts "OCC26556" +puts "========" +puts "" +################################################## +# Infinite calculations of BRepOffset_MakeOffset +################################################## + +restore [locate_data_file OCC26556-004_extract_2015-01-C37_0213_res.brep] sh +offsetparameter 1e-7 p i +offsetload sh 80 +decho off +set bug_info [offsetperform r] +decho on + +if {$bug_info != "ERROR. Degenerated normal on input data."} { + puts "ERROR: OCC26556 is reproduced. Error message is absent." +} diff --git a/tests/bugs/modalg_6/bug26556_4 b/tests/bugs/modalg_6/bug26556_4 new file mode 100644 index 0000000000..888a60abf7 --- /dev/null +++ b/tests/bugs/modalg_6/bug26556_4 @@ -0,0 +1,19 @@ +puts "========" +puts "OCC26556" +puts "========" +puts "" +################################################## +# Infinite calculations of BRepOffset_MakeOffset +################################################## + +restore [locate_data_file OCC26556-004_extract_2015-01-C37_0240_res.brep] sh +explode sh F +offsetparameter 1e-7 p i +offsetload sh_3 300 +decho off +set bug_info [offsetperform r] +decho on + +if {$bug_info != "ERROR. Degenerated normal on input data."} { + puts "ERROR: OCC26556 is reproduced. Error message is absent." +} diff --git a/tests/offset/compshape/A1 b/tests/offset/compshape/A1 index 1b38f68c0e..c451741766 100644 --- a/tests/offset/compshape/A1 +++ b/tests/offset/compshape/A1 @@ -1,6 +1,6 @@ -puts "TODO ?OCC23068 ALL: Error\\s*:\\s*The offset is not valid. The volume is" -puts "TODO ?OCC23068 ALL: result is not a topological shape" -puts "TODO ?OCC24156 ALL: TEST INCOMPLETE" +puts "TODO ?OCC23068 ALL: ERROR. offsetperform operation not done." +puts "TODO ?OCC23068 ALL: result is not a topological shape!!!" +puts "TODO ?OCC23068 ALL: TEST INCOMPLETE" ## ====================================== ## Grid : CCV002 diff --git a/tests/offset/compshape/A4 b/tests/offset/compshape/A4 index 77aece934c..f16e9e0081 100755 --- a/tests/offset/compshape/A4 +++ b/tests/offset/compshape/A4 @@ -4,11 +4,8 @@ ## Comment : From CV tests serie page 60 ## ====================================== -#puts "*" -#puts "TODO OCC22740 ALL: An exception was caught" -#puts "TODO OCC22740 ALL: \\*\\* Exception \\*\\*" -#puts "TODO OCC22740 ALL: Error : The offset cannot be built." puts "TODO OCC23524 ALL: Error : The offset is not valid" +puts "TODO ?OCC26556 ALL: ERROR. offsetperform operation not done." restore [locate_data_file CCV_2_d1_gsw.rle] s explode s F diff --git a/tests/offset/faces_type_a/A3 b/tests/offset/faces_type_a/A3 index 210e597154..91edd572a5 100644 --- a/tests/offset/faces_type_a/A3 +++ b/tests/offset/faces_type_a/A3 @@ -1,6 +1,6 @@ #old file ofcb19 puts "TODO CR25925 ALL: ERROR. offsetperform operation not done." -puts "TODO CR25925 ALL: TEST INCOMPLETE" +puts "TODO CR26556 ALL: Error : The offset cannot be built." restore [locate_data_file CHE_bb17.rle] s OFFSETSHAPE -0.04 {s_4 s_9 s_3 s_5 s_2 s_7 s_11} $calcul $type diff --git a/tests/offset/faces_type_a/A4 b/tests/offset/faces_type_a/A4 index fa94080530..518dea00c4 100644 --- a/tests/offset/faces_type_a/A4 +++ b/tests/offset/faces_type_a/A4 @@ -1,6 +1,6 @@ #old file ofcb23 puts "TODO CR25925 ALL: ERROR. offsetperform operation not done." -puts "TODO CR25925 ALL: TEST INCOMPLETE" +puts "TODO CR26556 ALL: Error : The offset cannot be built." restore [locate_data_file CHE_cc3.rle] s OFFSETSHAPE -0.01 {s_6} $calcul $type diff --git a/tests/offset/faces_type_a/A9 b/tests/offset/faces_type_a/A9 index 906605fc37..59e36394cd 100644 --- a/tests/offset/faces_type_a/A9 +++ b/tests/offset/faces_type_a/A9 @@ -1,6 +1,6 @@ #old file ofsb20 puts "TODO CR25925 ALL: ERROR. offsetperform operation not done." -puts "TODO CR25925 ALL: TEST INCOMPLETE" +puts "TODO CR26556 ALL: Error : The offset cannot be built." restore [locate_data_file CHE_bb20.rle] s OFFSETSHAPE -0.1 {s_4 s_7} $calcul $type diff --git a/tests/offset/faces_type_i/A9 b/tests/offset/faces_type_i/A9 index 3566dc61f2..c6d65c6945 100644 --- a/tests/offset/faces_type_i/A9 +++ b/tests/offset/faces_type_i/A9 @@ -1,5 +1,5 @@ puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." pcone s 5 0 12 90 trotate s 0 0 0 0 0 1 90 diff --git a/tests/offset/faces_type_i/B3 b/tests/offset/faces_type_i/B3 index 8e05374522..c8cbadd8fa 100644 --- a/tests/offset/faces_type_i/B3 +++ b/tests/offset/faces_type_i/B3 @@ -1,5 +1,5 @@ puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." pcone s 5 0 12 270 diff --git a/tests/offset/faces_type_i/B4 b/tests/offset/faces_type_i/B4 index 7654915669..5363f0cb80 100644 --- a/tests/offset/faces_type_i/B4 +++ b/tests/offset/faces_type_i/B4 @@ -1,5 +1,5 @@ puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." pcone s 5 0 12 270 diff --git a/tests/offset/faces_type_i/B5 b/tests/offset/faces_type_i/B5 index 9f8353d784..7d97464e41 100644 --- a/tests/offset/faces_type_i/B5 +++ b/tests/offset/faces_type_i/B5 @@ -1,5 +1,5 @@ puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." pcone s 5 0 12 270 diff --git a/tests/offset/faces_type_i/B6 b/tests/offset/faces_type_i/B6 index 89d3d8cd64..e9f27fdaf8 100644 --- a/tests/offset/faces_type_i/B6 +++ b/tests/offset/faces_type_i/B6 @@ -1,5 +1,5 @@ puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." psphere s 15 -90 60 90 trotate s 0 0 0 0 0 1 90 diff --git a/tests/offset/faces_type_i/C1 b/tests/offset/faces_type_i/C1 index 96d4e75191..752586087b 100644 --- a/tests/offset/faces_type_i/C1 +++ b/tests/offset/faces_type_i/C1 @@ -1,5 +1,5 @@ puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." psphere s 15 -90 60 270 diff --git a/tests/offset/faces_type_i/C2 b/tests/offset/faces_type_i/C2 index e0c5fa2095..7b9d0601e4 100644 --- a/tests/offset/faces_type_i/C2 +++ b/tests/offset/faces_type_i/C2 @@ -1,5 +1,5 @@ puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." psphere s 15 -90 60 270 diff --git a/tests/offset/faces_type_i/C3 b/tests/offset/faces_type_i/C3 index 8618d70c32..d5572a13fc 100644 --- a/tests/offset/faces_type_i/C3 +++ b/tests/offset/faces_type_i/C3 @@ -1,5 +1,5 @@ puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." psphere s 15 -90 60 270 diff --git a/tests/offset/faces_type_i/C7 b/tests/offset/faces_type_i/C7 index 7ecdbd8139..9f5d0d7f30 100644 --- a/tests/offset/faces_type_i/C7 +++ b/tests/offset/faces_type_i/C7 @@ -1,5 +1,5 @@ puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." psphere s 15 90 trotate s 0 0 0 0 0 1 90 diff --git a/tests/offset/faces_type_i/D1 b/tests/offset/faces_type_i/D1 index 338d87721b..9609133d05 100644 --- a/tests/offset/faces_type_i/D1 +++ b/tests/offset/faces_type_i/D1 @@ -1,5 +1,5 @@ puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." psphere s 15 270 diff --git a/tests/offset/faces_type_i/D2 b/tests/offset/faces_type_i/D2 index 5e7b6786b1..ff784b5f35 100644 --- a/tests/offset/faces_type_i/D2 +++ b/tests/offset/faces_type_i/D2 @@ -1,5 +1,5 @@ puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." psphere s 15 270 diff --git a/tests/offset/faces_type_i/D3 b/tests/offset/faces_type_i/D3 index f09583d38e..1545993117 100644 --- a/tests/offset/faces_type_i/D3 +++ b/tests/offset/faces_type_i/D3 @@ -1,5 +1,5 @@ puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." psphere s 15 270 diff --git a/tests/offset/faces_type_i/E7 b/tests/offset/faces_type_i/E7 index 51943b2594..e57ede9a79 100755 --- a/tests/offset/faces_type_i/E7 +++ b/tests/offset/faces_type_i/E7 @@ -2,7 +2,7 @@ puts "TODO OCC24156 MacOS: \\*\\* Exception \\*\\*.*" puts "TODO OCC24156 MacOS: An exception was caught" puts "TODO OCC24156 MacOS: TEST INCOMPLETE" puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." ellipse w1 0 0 0 15 10 mkedge w1 w1 0 pi/2 diff --git a/tests/offset/faces_type_i/E8 b/tests/offset/faces_type_i/E8 index a061911737..2d4a927b15 100644 --- a/tests/offset/faces_type_i/E8 +++ b/tests/offset/faces_type_i/E8 @@ -2,7 +2,7 @@ puts "TODO OCC24156 MacOS: \\*\\* Exception \\*\\*.*" puts "TODO OCC24156 MacOS: An exception was caught" puts "TODO OCC24156 MacOS: TEST INCOMPLETE" puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." ellipse w1 0 0 0 15 10 mkedge w1 w1 0 pi/2 diff --git a/tests/offset/faces_type_i/E9 b/tests/offset/faces_type_i/E9 index 7332ff8b29..b2c36affeb 100644 --- a/tests/offset/faces_type_i/E9 +++ b/tests/offset/faces_type_i/E9 @@ -2,7 +2,7 @@ puts "TODO OCC24156 MacOS: \\*\\* Exception \\*\\*.*" puts "TODO OCC24156 MacOS: An exception was caught" puts "TODO OCC24156 MacOS: TEST INCOMPLETE" puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." ellipse w1 0 0 0 15 10 mkedge w1 w1 0 pi/2 diff --git a/tests/offset/faces_type_i/F1 b/tests/offset/faces_type_i/F1 index 453e5411fb..8fc7ae1ce1 100644 --- a/tests/offset/faces_type_i/F1 +++ b/tests/offset/faces_type_i/F1 @@ -1,5 +1,5 @@ puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." ellipse w1 0 0 0 15 10 mkedge w1 w1 0 pi/2 diff --git a/tests/offset/faces_type_i/F2 b/tests/offset/faces_type_i/F2 index 123ef2fb2d..6590cb9c16 100755 --- a/tests/offset/faces_type_i/F2 +++ b/tests/offset/faces_type_i/F2 @@ -2,7 +2,7 @@ puts "TODO OCC24156 MacOS: \\*\\* Exception \\*\\*.*" puts "TODO OCC24156 MacOS: An exception was caught" puts "TODO OCC24156 MacOS: TEST INCOMPLETE" puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." ellipse w1 0 0 0 15 10 mkedge w1 w1 0 pi/2 diff --git a/tests/offset/faces_type_i/F3 b/tests/offset/faces_type_i/F3 index b26f0c9747..e988509ebd 100644 --- a/tests/offset/faces_type_i/F3 +++ b/tests/offset/faces_type_i/F3 @@ -2,7 +2,7 @@ puts "TODO OCC24156 MacOS: \\*\\* Exception \\*\\*.*" puts "TODO OCC24156 MacOS: An exception was caught" puts "TODO OCC24156 MacOS: TEST INCOMPLETE" puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." cpulimit 400 diff --git a/tests/offset/faces_type_i/F4 b/tests/offset/faces_type_i/F4 index a30edba4fd..66718bdab6 100644 --- a/tests/offset/faces_type_i/F4 +++ b/tests/offset/faces_type_i/F4 @@ -2,7 +2,7 @@ puts "TODO OCC24156 MacOS: \\*\\* Exception \\*\\*.*" puts "TODO OCC24156 MacOS: An exception was caught" puts "TODO OCC24156 MacOS: TEST INCOMPLETE" puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." ellipse w1 0 0 0 15 10 mkedge w1 w1 0 pi/2 diff --git a/tests/offset/faces_type_i/F5 b/tests/offset/faces_type_i/F5 index 9f6d43b98e..2bb88b021d 100644 --- a/tests/offset/faces_type_i/F5 +++ b/tests/offset/faces_type_i/F5 @@ -2,7 +2,7 @@ puts "TODO OCC24156 MacOS: \\*\\* Exception \\*\\*.*" puts "TODO OCC24156 MacOS: An exception was caught" puts "TODO OCC24156 MacOS: TEST INCOMPLETE" puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." # 17.01.2010 cpulimit 600 diff --git a/tests/offset/faces_type_i/I5 b/tests/offset/faces_type_i/I5 index 4333bf9667..dc23b60e1f 100644 --- a/tests/offset/faces_type_i/I5 +++ b/tests/offset/faces_type_i/I5 @@ -1,5 +1,5 @@ puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." pcylinder s 5 10 270 diff --git a/tests/offset/faces_type_i/J5 b/tests/offset/faces_type_i/J5 index 32af5783d3..8d4a62c7fb 100644 --- a/tests/offset/faces_type_i/J5 +++ b/tests/offset/faces_type_i/J5 @@ -1,5 +1,5 @@ puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." pcone s 9 4 15 270 diff --git a/tests/offset/faces_type_i/J7 b/tests/offset/faces_type_i/J7 index 13927555bd..d6dea78f92 100644 --- a/tests/offset/faces_type_i/J7 +++ b/tests/offset/faces_type_i/J7 @@ -1,5 +1,5 @@ puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." pcone s 9 4 15 270 diff --git a/tests/offset/faces_type_i/K6 b/tests/offset/faces_type_i/K6 index dfc5677c11..e361f40f6d 100644 --- a/tests/offset/faces_type_i/K6 +++ b/tests/offset/faces_type_i/K6 @@ -1,5 +1,5 @@ puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." ptorus s 10 10 0 45 270 diff --git a/tests/offset/faces_type_i/M6 b/tests/offset/faces_type_i/M6 index b03f64d19e..8e7c789065 100644 --- a/tests/offset/faces_type_i/M6 +++ b/tests/offset/faces_type_i/M6 @@ -1,5 +1,5 @@ puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." circle w -20 0 0 20 mkedge w w 0 pi*2/5 diff --git a/tests/offset/faces_type_i/M8 b/tests/offset/faces_type_i/M8 index 5aeb496166..79a232c3d3 100644 --- a/tests/offset/faces_type_i/M8 +++ b/tests/offset/faces_type_i/M8 @@ -1,5 +1,5 @@ puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." circle w -20 0 0 20 mkedge w w 0 pi*2/5 diff --git a/tests/offset/faces_type_i/N1 b/tests/offset/faces_type_i/N1 index b3ac6ab829..2c2eee4620 100644 --- a/tests/offset/faces_type_i/N1 +++ b/tests/offset/faces_type_i/N1 @@ -2,7 +2,7 @@ puts "TODO OCC24156 MacOS: \\*\\* Exception \\*\\*.*" puts "TODO OCC24156 MacOS: An exception was caught" puts "TODO OCC24156 MacOS: TEST INCOMPLETE" puts "TODO OCC23748 ALL: ERROR. offsetperform operation not done." -puts "TODO OCC23748 ALL: TEST INCOMPLETE" +puts "TODO OCC26556 ALL: Error : The offset cannot be built." beziersurf c 3 2 \ 0 0 0 0 5 5 2 14 3 \ diff --git a/tests/offset/shape/A1 b/tests/offset/shape/A1 index 77f204a7e1..a85e2345f0 100644 --- a/tests/offset/shape/A1 +++ b/tests/offset/shape/A1 @@ -1,4 +1,5 @@ puts "TODO OCC23068 ALL: Error : The offset is not valid" +puts "TODO OCC26556 ALL: ERROR. offsetperform operation not done." # Original bug : hkg60144 # Date : 17Juillet98 diff --git a/tests/offset/shape/A2 b/tests/offset/shape/A2 index 4c9ee74456..be2f2ded02 100644 --- a/tests/offset/shape/A2 +++ b/tests/offset/shape/A2 @@ -1,5 +1,5 @@ -puts "TODO OCC23190 ALL: An exception was caugh.*Offset with no C1 Surface" -puts "TODO OCC23190 ALL: \\*\\* Exception \\*\\*.*Offset with no C1 Surface" +puts "TODO OCC23190 ALL: ERROR. C0 continuity of input data." +puts "TODO OCC23190 ALL: result is not a topological shape!!!" puts "TODO OCC23068 ALL: TEST INCOMPLETE" # Original bug : hkg60144/pro15325 # Date : 17Juillet98 diff --git a/tests/offset/shape/A3 b/tests/offset/shape/A3 index 4d94a3b9bb..65f492c1b2 100644 --- a/tests/offset/shape/A3 +++ b/tests/offset/shape/A3 @@ -1,5 +1,5 @@ -puts "TODO OCC23190 ALL: An exception was caught.*Offset with no C1 Surface" -puts "TODO OCC23190 ALL: \\*\\* Exception \\*\\*.*Offset with no C1 Surface" +puts "TODO OCC23190 ALL: ERROR. C0 continuity of input data." +puts "TODO OCC23190 ALL: result is not a topological shape!!!" puts "TODO OCC23068 ALL: TEST INCOMPLETE" # Original bug : cts21271 # Date : 11Sept98