home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / grafik / tiff / hpgl2dxf.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-05-15  |  4.7 KB  |  185 lines

  1. /* ============================================ */
  2. /* Rumpf eines Konvertierers von HP-GL nach DXF */
  3. /* ============================================ */
  4. /* Interpretierte Befehle: SP, PU, PD, PA, PR    */
  5. /* ============================================ */
  6.  
  7. #include <stdio.h>
  8. #include <string.h>
  9.  
  10. #define FALSE 0
  11. #define TRUE 1
  12. #define UP 1
  13. #define DOWN 0
  14. #define RELATIVE 1
  15. #define ABSOLUTE 0
  16. #define ENABLED 1
  17. #define DISABLED 0
  18. #define BEFEHL_PUFFER_GROESSE 200
  19. #define SEPARATOR(a)  ((a==' ')||(a== ','))
  20. #define TERMINATOR(a) ((a==';')||(a=='\r'))
  21. #define VALID_CHAR(a) (((a>='A')&&(a<='Z'))||((a>='0')&&(a<='9')))
  22.  
  23. void transfer (FILE *pfile, FILE *ofile)
  24. {
  25. /* Übersetzt HPGL-Code des Streams 'pfile' (Plot-File) ins DXF-Format */
  26. /* Die Ausgabe der DXF-Befehle erfolgt nach 'ofile'              */
  27.  
  28.   char       befehl[BEFEHL_PUFFER_GROESSE];
  29.   unsigned layer, korrekte_werte, penstatus, strichmodus;
  30.   unsigned i, j, separator, interpretierbar;
  31.   double   xfakt, yfakt, xalt, yalt, xneu, yneu;
  32.  
  33.   /* Aktuelle Position, Offset und Maßstabsfaktoren initialisieren: */
  34.   xalt=yalt=0.0;
  35.   xfakt=yfakt=0.025;
  36.   strichmodus=ABSOLUTE;
  37.   penstatus=UP;
  38.  
  39.   /* Analyse des Plot-Files: */
  40.   while (!feof(pfile)) {
  41.     /* Einen Befehl puffern und ungültige Zeichen überspringen: */
  42.     i=0;
  43.     separator=ENABLED;
  44.     do {
  45.       befehl[i]=fgetc(pfile);
  46.       if ((interpretierbar=SEPARATOR(befehl[i]))==TRUE) {
  47.     if (separator==ENABLED) {
  48.       befehl[i]=',';
  49.       i++;
  50.       separator=DISABLED;
  51.     }
  52.       }
  53.       else if ((interpretierbar=VALID_CHAR(befehl[i]))==TRUE) {
  54.     i++;
  55.     separator=ENABLED;
  56.       }
  57.     }
  58.     while (interpretierbar||((!TERMINATOR(befehl[i]))&&(!feof(pfile))));
  59.     befehl[i]='\00';
  60.  
  61.     /* HPGL-Befehle analysieren: */
  62.     if ((befehl[0]=='S')&&(befehl[1]=='P')) {
  63.       /* Neuer Stift=>Layer wechseln */
  64.       i=sscanf (befehl+2, "%u", &layer);
  65.       if (i<1) layer=0;
  66.     }
  67.     else if (befehl[0]=='P') {
  68.       if (befehl[1]=='U') {
  69.     penstatus=UP;
  70.       }
  71.       else if (befehl[1]=='D') {
  72.     penstatus=DOWN;
  73.       }
  74.       else if (befehl[1]=='A') {
  75.     strichmodus=ABSOLUTE;
  76.       }
  77.       else if (befehl[1]=='R') {
  78.     strichmodus=RELATIVE;
  79.       }
  80.       else { /* nicht interpretierbarer Befehl */
  81.     break;
  82.       }
  83.  
  84.       /* Enthält der String 'befehl+i' Koordinatenpaare? */
  85.       i=2;
  86.       /* Eventuell führendes Komma überspringen */
  87.       if (befehl[i]==',') i++;
  88.       while (befehl[i]!='\00') {
  89.     /* Einlesen zweier Werte und */
  90.     /* Interpretation als Koordinatenpaar: */
  91.     korrekte_werte=sscanf (befehl+i,"%lf,%lf",&xneu,&yneu);
  92.     xneu*=xfakt;
  93.     yneu*=yfakt;
  94.     if (korrekte_werte==2) {
  95.       if (penstatus==UP) {
  96.         /* Keine Linie, aber Koordinaten übernehmen */
  97.         if (strichmodus==ABSOLUTE) {
  98.           xalt=xneu;
  99.           yalt=yneu;
  100.         }
  101.         else {
  102.           /* strichmodus ist RELATIVE (Umrechnung in abs. Werte) */
  103.           xalt+=xneu;
  104.           yalt+=yneu;
  105.         }
  106.       }
  107.       else { /* penstatus ist DOWN, also DXF-Linie zeichnen */
  108.         fprintf (ofile, "0\nLINE\n8\n%u\n10\n%6.3lf\n20\n%6.3lf\n",
  109.              layer, xalt, yalt);
  110.         if (strichmodus==ABSOLUTE) {
  111.           xalt=xneu;
  112.           yalt=yneu;
  113.           fprintf (ofile, "11\n%6.3lf\n21\n%6.3lf\n", xalt, yalt);
  114.         }
  115.         else {
  116.           /* strichmodus ist RELATIVE (Umrechnung in abs. Werte) */
  117.           xalt+=xneu;
  118.           yalt+=yneu;
  119.           fprintf (ofile, "11\n%6.3f\n21%6.3f\n", xalt, yalt);
  120.         }
  121.       }
  122.     }
  123.  
  124.     /* Prüfen, ob weitere Koordinatenpaare vorhanden:        */
  125.     /* i wird solange erhöht, bis zwei Separatoren gefunden wurden! */
  126.     j=0;
  127.     do {
  128.       if (befehl[i]==',') j++;
  129.       i++;
  130.     }
  131.     while ((j<2)&&(befehl[i]!='\00'));
  132.       }
  133.     }
  134.   }
  135.   return;
  136. }
  137.  
  138. main ()
  139. {
  140.   char file[128+4], c;
  141.   int i;
  142.   FILE *of, *pf;
  143.  
  144.   do {
  145.     printf ("\nHP-GL-Datei [.PLT]: ");
  146.     for (i=0; (scanf ("%c", file+i), file[i]!='\n'); i++);
  147.     file[i]='\0';
  148.     strtok (file,", ");
  149.     if (strchr(file, '.')==NULL) strcat (file, ".PLT");
  150.     if ((pf=fopen (file, "r"))!=NULL) {
  151.       break;
  152.     }
  153.     else {
  154.       fprintf (stderr, "\nDatei <%s> kann nicht geöffnet werden\n", file);
  155.     }
  156.   } while (1);
  157.  
  158.   do {
  159.     strtok (file,". ,");
  160.     printf("\nAusgabe-Datei [%s.DXF]: ", file);
  161.     i=0;
  162.     while (scanf("%c", &c), c!='\n') {
  163.       file[i]=c;
  164.       file[++i]='\0';
  165.     }
  166.     if (strchr(file, '.')==NULL) strcat (file, ".DXF");
  167.     if ((of=fopen (file, "w"))!=NULL) {
  168.       break;
  169.     }
  170.     else {
  171.       fprintf (stderr, "\nDatei <%s> kann nicht geöffnet werden\n", file);
  172.     }
  173.   }  while (1);
  174.  
  175.   fprintf (of, "0\nSECTION\n2\nENTITIES\n");
  176.  
  177.   /* Umsetzen des PLOT-(HPGL-)Files in das DXF-Format: */
  178.   transfer (pf, of);
  179.  
  180.   fprintf (of, "0\nENDSEC\n0\nEOF\n");
  181.  
  182.   fcloseall();
  183.   return;
  184. }
  185.