0026573: IGES file with one entity 128 is not read
authorika <ika@opencascade.com>
Thu, 3 Sep 2015 11:58:25 +0000 (14:58 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 3 Sep 2015 11:59:39 +0000 (14:59 +0300)
Add some workaround to read IGES files with lines, which lengths are less than standard 80.

Test case for issue CR26573

Correction of test cases for issue CR26573

Correction of test case for issue CR26573

src/IGESFile/igesread.c
src/IGESFile/liriges.c
tests/bugs/iges/bug26573 [new file with mode: 0644]
tests/bugs/moddata_1/bug22165
tests/de/iges_1/G7 [changed mode: 0644->0755]

index 7b84563..f923514 100644 (file)
@@ -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;
       }
     }
   }
index 5d6976b..dc8ca18 100644 (file)
@@ -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 (file)
index 0000000..d41e5b4
--- /dev/null
@@ -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
index f41fda1..1452340 100644 (file)
@@ -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}"
     }
 }
old mode 100644 (file)
new mode 100755 (executable)
index 15c4175..dcadd42
@@ -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 )