]> OCCT Git - occt-copy.git/commitdiff
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)
committerabv <abv@opencascade.com>
Wed, 16 Sep 2015 07:48:31 +0000 (10:48 +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 7b845631a96d3d87c30e950cdcaeef4aa03df7da..f92351498299fa29e05b8e0d9f88e02cee10b77f 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 5d6976b3320489fc2a81b78306512f6f79094aff..dc8ca183b60570ec3108c5f157c2d9934d8a189b 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 f41fda1d8bc5bcc0f503cd016853196d151693e1..14523402faf3594ae775f4f32f16a44486bc89fe 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..19003ea
@@ -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  ( 2063 )  N2Labels = 0  ( 0 )   TotalLabels = 1652  ( 2064 )   NameLabels = 1652  ( 2053 )   ColorLabels = 1651  ( 2063 )   LayerLabels = 0  ( 0 )
 PROPS       : Centroid = 0  ( 0 )  Volume   = 0  ( 0 )  Area     = 0  ( 0 )
 NCOLORS     : NColors  = 1  ( 1 )
 COLORS      : Colors   = WHITE  ( WHITE )