[GRASS5] [bug #2225] (grass) v.in.dxf not converting 8bit TEXT

Request Tracker grass-bugs at intevation.de
Sun Nov 16 06:21:27 EST 2003


this bug's URL: http://intevation.de/rt/webrt?serial_num=2225
-------------------------------------------------------------------------

Subject: v.in.dxf not converting 8bit TEXT

Platform: GNU/Linux/i386
grass obtained from: Mirror of Trento site
grass binary for platform: Compiled from Sources

DXF has a convention for encoding 8bit strings in 7bit strings by using a 
decimal representation ('%%ddd') for bytes with 8th bit set. Example: 
 
  0 
TEXT 
  8 
TOPOGRAPHIE 
 62 
7 
 10 
3453700.036000 
 20 
5556212.001000 
 30 
0.000000 
 40 
3.200000 
 41 
1.200000 
  1 
Kantstra%%223e 
  7 
ISO8 
 50 
43.988400000000 
 51 
16.700000000000 
 
v.in.dxf does not convert the 7bit encoding to 8bit. 
 
I have made the following patch to src/mapdev/v.in.dxf/label_box.c to solve 
the problem for myself: 
 
*** label_box.c.orig    Tue Jan 22 05:51:14 2002 
--- label_box.c Sun Nov 16 10:58:00 2003 
*************** 
*** 31,36 **** 
--- 31,37 ---- 
        DXF_DIG *layer_fd, *label_fd; 
        int     count, char_cnt, code; 
        char    label[256];                     /* same size as dxf_line */ 
+         char    text_style[256]; 
        double  start_x, start_y, angle, theta, height, length, diag; 
        double base1, base2; 
        int arr_size = 0; 
*************** 
*** 42,47 **** 
--- 43,49 ---- 
        start_y = 0.0; 
        height = 1.0; 
        angle = 0.0; 
+         text_style[0] = '\0'; 
 
        while ((code = dxf_readcode (dxf_file)) > 0) 
        { 
*************** 
*** 73,78 **** 
--- 75,83 ---- 
                case 50:        /* Text angle */ 
                    angle = atof (dxf_line); 
                    break; 
+               case  7:        /* Text Style */ 
+                     strcpy(text_style,dxf_line); 
+                     break; 
 
                case 30:        /* Z */ 
                case 41:        /* relative X scale factor */ 
*************** 
*** 86,92 **** 
 
                debugf("TEXT got unused code %d\n", code ); 
                case 62:        /* Color */ 
-               case  7:        /* Text Style */ 
                case  6:        /* Line type */ 
                default: 
                    break; 
--- 91,96 ---- 
*************** 
*** 181,186 **** 
--- 185,195 ---- 
        ** fprintf (label_fd->fd, "L  %lf %lf 
%d\n",pt_array[2].x,pt_array[2].y,label); 
        ** Labels now characters, not integers  BCH-J 
        */ 
+ 
+     if (strcmp(text_style,"ISO8") == 0) { 
+       iso8_convert(label); 
+     } 
+ 
      fprintf (label_fd->fd, "L  %f %f %s\n",xinfo[0],yinfo[0],label); 
      return (0); 
  } 
*************** 
*** 212,214 **** 
--- 221,252 ---- 
      } 
      return (-1);      /* NOT NUMERIC */ 
  } 
+ 
+ 
+ int iso8_convert(char *s) { 
+   char *sub; 
+ 
+   if (s == NULL) return(-1); 
+ 
+   while  ((sub = strstr(s, "%%")) != NULL) { 
+     int sublen = strlen(sub); 
+     if (sublen < 5) break; 
+     if (isdigit(sub[2]) && isdigit(sub[3]) && isdigit(sub[4])) { 
+       char dec[4]; 
+       int c, i; 
+       strncpy(dec, &(sub[2]), 3); 
+       dec[3] = '\0'; 
+       c = atoi(dec); 
+       sub[0] = c; 
+       i = 5; 
+       while (sub[i] != '\0') { 
+         sub[i-4] = sub[i]; 
+         i++; 
+       } 
+       sub[i-4] = '\0'; 
+     } 
+     s = &(sub[1]); 
+   } 
+ 
+   return(0); 
+ } 
 
 
Best regards, 
Michael Sczittnick 

-------------------------------------------- Managed by Request Tracker




More information about the grass-dev mailing list