diff --git a/src/IGESFile/igesread.c b/src/IGESFile/igesread.c index 7b845631a9..f923514982 100644 --- a/src/IGESFile/igesread.c +++ b/src/IGESFile/igesread.c @@ -70,13 +70,13 @@ int igesread (char* nomfic, int lesect[6], int modefnes) for(;;) { numl ++; i = iges_lire(lefic,&numsec,ligne,modefnes); - if (i <= 0) { + if (i <= 0 || i < i0) { if (i == 0) break; /* Sending of message : Syntax error */ { - str[1] = '\0'; - str[0] = sects[i0]; - IGESFile_Check2 (0,"XSTEP_18",numl,str); /* //gka 15 Sep 98: str instead of sects[i0]); */ + str[1] = '\0'; + str[0] = sects[i0]; + IGESFile_Check2 (0,"XSTEP_18",numl,str); /* //gka 15 Sep 98: str instead of sects[i0]); */ } if (i0 == 0) return -1; @@ -98,21 +98,21 @@ int igesread (char* nomfic, int lesect[6], int modefnes) if (i == 2) { /* Header (Global sect) */ iges_setglobal(); for (;;) { - if (lesect[i] == 1) { /* Separation specifique */ - int n0 = 0; - if (ligne[0] != ',') { c_separ = ligne[2]; n0 = 3; } - if (ligne[n0+1] != c_separ) { c_fin = ligne[n0+3]; } - } - iges_param(&Pstat,ligne,c_separ,c_fin,72); - if (Pstat != 2) break; + if (lesect[i] == 1) { /* Separation specifique */ + int n0 = 0; + if (ligne[0] != ',') { c_separ = ligne[2]; n0 = 3; } + if (ligne[n0+1] != c_separ) { c_fin = ligne[n0+3]; } + } + iges_param(&Pstat,ligne,c_separ,c_fin,72); + if (Pstat != 2) break; } } if (i == 3) iges_Dsect(&Dstat,numsec,ligne); /* Directory (Dsect) */ if (i == 4) { /* Parametres (Psect) */ iges_Psect(numsec,ligne); for (;;) { - iges_param(&Pstat,ligne,c_separ,c_fin,64); - if (Pstat != 2) break; + iges_param(&Pstat,ligne,c_separ,c_fin,64); + if (Pstat != 2) break; } } } diff --git a/src/IGESFile/liriges.c b/src/IGESFile/liriges.c index 5d6976b332..dc8ca183b6 100644 --- a/src/IGESFile/liriges.c +++ b/src/IGESFile/liriges.c @@ -67,10 +67,7 @@ int iges_lire (FILE* lefic, int *numsec, char ligne[100], int modefnes) while ( fgets ( ligne, 2, lefic ) && ( ligne[0] == '\r' || ligne[0] == '\n' ) ) { } - - - fgets(&ligne[1],80,lefic); -/* fgets(ligne,81,lefic); */ + fgets(&ligne[1],80,lefic); } } @@ -96,42 +93,66 @@ int iges_lire (FILE* lefic, int *numsec, char ligne[100], int modefnes) iges_fautrelire = 0; if (ligne[0] == '\0' || ligne[0] == '\n' || ligne[0] == '\r') return iges_lire(lefic,numsec,ligne,modefnes); /* 0 */ - if (sscanf(&ligne[73],"%d",&result) == 0) - return -1; -/* { printf("Erreur, ligne n0.%d :\n%s\n",*numl,ligne); return (*numsec > 0 ? -1 : -2); } */ - *numsec = result; - typesec = ligne[72]; - switch (typesec) { - case 'S' : ligne[72] = '\0'; return (1); - case 'G' : ligne[72] = '\0'; return (2); - case 'D' : ligne[72] = '\0'; return (3); - case 'P' : ligne[72] = '\0'; return (4); - case 'T' : ligne[72] = '\0'; return (5); - default :; /* printf("Ligne incorrecte, ignoree n0.%d :\n%s\n",*numl,ligne); */ - } - /* the column 72 is empty, try to check the neghbour*/ - if(strlen(ligne)==80 - && (ligne[79]=='\n' || ligne[79]=='\r') && (ligne[0]<='9' && ligne[0]>='0')) { - /*check if the case of losted .*/ - int index; - for(index = 1; ligne[index]<='9' && ligne[index]>='0'; index++); - if (ligne[index]=='D' || ligne[index]=='d') { - for(index = 79; index > 0; index--) - ligne[index] = ligne[index-1]; - ligne[0]='.'; - } - + + if (!sscanf(&ligne[73],"%d",&result) == 0) { + *numsec = result; typesec = ligne[72]; switch (typesec) { - case 'S' : ligne[72] = '\0'; return (1); - case 'G' : ligne[72] = '\0'; return (2); - case 'D' : ligne[72] = '\0'; return (3); - case 'P' : ligne[72] = '\0'; return (4); - case 'T' : ligne[72] = '\0'; return (5); - default :; /* printf("Ligne incorrecte, ignoree n0.%d :\n%s\n",*numl,ligne); */ + case 'S' : ligne[72] = '\0'; return (1); + case 'G' : ligne[72] = '\0'; return (2); + case 'D' : ligne[72] = '\0'; return (3); + case 'P' : ligne[72] = '\0'; return (4); + case 'T' : ligne[72] = '\0'; return (5); + default :; + } + /* the column 72 is empty, try to check the neighbour*/ + if(strlen(ligne)==80 + && (ligne[79]=='\n' || ligne[79]=='\r') && (ligne[0]<='9' && ligne[0]>='0')) { + /*check if the case of losted .*/ + int index; + for(index = 1; ligne[index]<='9' && ligne[index]>='0'; index++); + if (ligne[index]=='D' || ligne[index]=='d') { + for(index = 79; index > 0; index--) + ligne[index] = ligne[index-1]; + ligne[0]='.'; + } + typesec = ligne[72]; + switch (typesec) { + case 'S' : ligne[72] = '\0'; return (1); + case 'G' : ligne[72] = '\0'; return (2); + case 'D' : ligne[72] = '\0'; return (3); + case 'P' : ligne[72] = '\0'; return (4); + case 'T' : ligne[72] = '\0'; return (5); + default :; + } } } + // the line is not conform to standard, try to read it (if there are some missing spaces) + // find the number end + i = (int)strlen(ligne); + while ((ligne[i] == '\0' || ligne[i] == '\n' || ligne[i] == '\r' || ligne[i] == ' ') && i > 0) + i--; + if (i != (int)strlen(ligne)) + ligne[i + 1] = '\0'; + // find the number start + while (ligne[i] >= '0' && ligne[i] <= '9' && i > 0) + i--; + if (sscanf(&ligne[i + 1],"%d",&result) == 0) + return -1; + *numsec = result; + // find type of line + while (ligne[i] == ' ' && i > 0) + i--; + typesec = ligne[i]; + switch (typesec) { + case 'S' : ligne[i] = '\0'; return (1); + case 'G' : ligne[i] = '\0'; return (2); + case 'D' : ligne[i] = '\0'; return (3); + case 'P' : ligne[i] = '\0'; return (4); + case 'T' : ligne[i] = '\0'; return (5); + default :; /* printf("Ligne incorrecte, ignoree n0.%d :\n%s\n",*numl,ligne); */ + } return -1; } diff --git a/tests/bugs/iges/bug26573 b/tests/bugs/iges/bug26573 new file mode 100644 index 0000000000..d41e5b4573 --- /dev/null +++ b/tests/bugs/iges/bug26573 @@ -0,0 +1,28 @@ +puts "========" +puts "OCC26573" +puts "========" +puts "" +########################################################################## +# IGES file with one entity 128 is not read +########################################################################## + +igesbrep [locate_data_file bug26573_loft.igs] a * +tpcompound result + +set square 240.546 + +set nbshapes_expected " +Number of shapes in shape + VERTEX : 4 + EDGE : 4 + WIRE : 1 + FACE : 1 + SHELL : 0 + SOLID : 0 + COMPSOLID : 0 + COMPOUND : 1 + SHAPE : 11 +" +checknbshapes result -ref ${nbshapes_expected} -t -m "importing file" + +set 3dviewer 1 diff --git a/tests/bugs/moddata_1/bug22165 b/tests/bugs/moddata_1/bug22165 index f41fda1d8b..14523402fa 100644 --- a/tests/bugs/moddata_1/bug22165 +++ b/tests/bugs/moddata_1/bug22165 @@ -23,7 +23,7 @@ if { ${LogLength} < 21 } { puts "Faulty ${BugNumber}" } else { regexp -all {1[ \t]*F: Syntax error in IGES file at line ([-0-9.+eE]+) in section ([A-Z]).} $Log full word1 word2 - if { ${word1} != "206" || ${word2} != "P" } { + if { ${word1} != "204" || ${word2} != "P" } { puts "Faulty ${BugNumber}" } } diff --git a/tests/de/iges_1/G7 b/tests/de/iges_1/G7 old mode 100644 new mode 100755 index 15c4175c21..dcadd42b9f --- a/tests/de/iges_1/G7 +++ b/tests/de/iges_1/G7 @@ -1,14 +1,18 @@ # !!!! This file is generated automatically, do not edit manually! See end script +puts "TODO CR23096 ALL: TPSTAT : Faulty" +puts "TODO CR23096 ALL: LABELS : Faulty" + + set filename frame.igs set ref_data { -DATA : Faulties = 0 ( 9879 ) Warnings = 0 ( 2629 ) Summary = 0 ( 12508 ) -TPSTAT : Faulties = 0 ( 0 ) Warnings = 0 ( 0 ) Summary = 0 ( 0 ) +DATA : Faulties = 0 ( 5005 ) Warnings = 0 ( 1 ) Summary = 0 ( 5006 ) +TPSTAT : Faulties = 0 ( 0 ) Warnings = 6 ( 0 ) Summary = 6 ( 0 ) CHECKSHAPE : Wires = 0 ( 0 ) Faces = 0 ( 0 ) Shells = 0 ( 0 ) Solids = 0 ( 0 ) -NBSHAPES : Solid = 0 ( 0 ) Shell = 0 ( 0 ) Face = 0 ( 0 ) Summary = 2830 ( 2830 ) -STATSHAPE : Solid = 0 ( 0 ) Shell = 0 ( 0 ) Face = 0 ( 0 ) FreeWire = 0 ( 0 ) FreeEdge = 944 ( 944 ) SharedEdge = 944 ( 944 ) -TOLERANCE : MaxTol = 1e-07 ( 1e-07 ) AvgTol = 1e-07 ( 1e-07 ) -LABELS : N0Labels = 944 ( 944 ) N1Labels = 0 ( 0 ) N2Labels = 0 ( 0 ) TotalLabels = 944 ( 944 ) NameLabels = 944 ( 944 ) ColorLabels = 944 ( 944 ) LayerLabels = 0 ( 0 ) +NBSHAPES : Solid = 0 ( 0 ) Shell = 0 ( 0 ) Face = 410 ( 410 ) Summary = 11585 ( 11585 ) +STATSHAPE : Solid = 0 ( 0 ) Shell = 0 ( 0 ) Face = 410 ( 410 ) FreeWire = 410 ( 410 ) FreeEdge = 2910 ( 2910 ) SharedEdge = 4569 ( 4569 ) +TOLERANCE : MaxTol = 0.6309534605 ( 0.6309534603 ) AvgTol = 0.01007170672 ( 0.0100718085 ) +LABELS : N0Labels = 1 ( 1 ) N1Labels = 1651 ( 2074 ) N2Labels = 0 ( 0 ) TotalLabels = 1652 ( 2075 ) NameLabels = 1652 ( 2053 ) ColorLabels = 1651 ( 2074 ) LayerLabels = 0 ( 0 ) PROPS : Centroid = 0 ( 0 ) Volume = 0 ( 0 ) Area = 0 ( 0 ) NCOLORS : NColors = 1 ( 1 ) COLORS : Colors = WHITE ( WHITE )