home *** CD-ROM | disk | FTP | other *** search
- /* ============================================ */
- /* Rumpf eines Konvertierers von HP-GL nach DXF */
- /* ============================================ */
- /* Interpretierte Befehle: SP, PU, PD, PA, PR */
- /* ============================================ */
-
- #include <stdio.h>
- #include <string.h>
-
- #define FALSE 0
- #define TRUE 1
- #define UP 1
- #define DOWN 0
- #define RELATIVE 1
- #define ABSOLUTE 0
- #define ENABLED 1
- #define DISABLED 0
- #define BEFEHL_PUFFER_GROESSE 200
- #define SEPARATOR(a) ((a==' ')||(a== ','))
- #define TERMINATOR(a) ((a==';')||(a=='\r'))
- #define VALID_CHAR(a) (((a>='A')&&(a<='Z'))||((a>='0')&&(a<='9')))
-
- void transfer (FILE *pfile, FILE *ofile)
- {
- /* Übersetzt HPGL-Code des Streams 'pfile' (Plot-File) ins DXF-Format */
- /* Die Ausgabe der DXF-Befehle erfolgt nach 'ofile' */
-
- char befehl[BEFEHL_PUFFER_GROESSE];
- unsigned layer, korrekte_werte, penstatus, strichmodus;
- unsigned i, j, separator, interpretierbar;
- double xfakt, yfakt, xalt, yalt, xneu, yneu;
-
- /* Aktuelle Position, Offset und Maßstabsfaktoren initialisieren: */
- xalt=yalt=0.0;
- xfakt=yfakt=0.025;
- strichmodus=ABSOLUTE;
- penstatus=UP;
-
- /* Analyse des Plot-Files: */
- while (!feof(pfile)) {
- /* Einen Befehl puffern und ungültige Zeichen überspringen: */
- i=0;
- separator=ENABLED;
- do {
- befehl[i]=fgetc(pfile);
- if ((interpretierbar=SEPARATOR(befehl[i]))==TRUE) {
- if (separator==ENABLED) {
- befehl[i]=',';
- i++;
- separator=DISABLED;
- }
- }
- else if ((interpretierbar=VALID_CHAR(befehl[i]))==TRUE) {
- i++;
- separator=ENABLED;
- }
- }
- while (interpretierbar||((!TERMINATOR(befehl[i]))&&(!feof(pfile))));
- befehl[i]='\00';
-
- /* HPGL-Befehle analysieren: */
- if ((befehl[0]=='S')&&(befehl[1]=='P')) {
- /* Neuer Stift=>Layer wechseln */
- i=sscanf (befehl+2, "%u", &layer);
- if (i<1) layer=0;
- }
- else if (befehl[0]=='P') {
- if (befehl[1]=='U') {
- penstatus=UP;
- }
- else if (befehl[1]=='D') {
- penstatus=DOWN;
- }
- else if (befehl[1]=='A') {
- strichmodus=ABSOLUTE;
- }
- else if (befehl[1]=='R') {
- strichmodus=RELATIVE;
- }
- else { /* nicht interpretierbarer Befehl */
- break;
- }
-
- /* Enthält der String 'befehl+i' Koordinatenpaare? */
- i=2;
- /* Eventuell führendes Komma überspringen */
- if (befehl[i]==',') i++;
- while (befehl[i]!='\00') {
- /* Einlesen zweier Werte und */
- /* Interpretation als Koordinatenpaar: */
- korrekte_werte=sscanf (befehl+i,"%lf,%lf",&xneu,&yneu);
- xneu*=xfakt;
- yneu*=yfakt;
- if (korrekte_werte==2) {
- if (penstatus==UP) {
- /* Keine Linie, aber Koordinaten übernehmen */
- if (strichmodus==ABSOLUTE) {
- xalt=xneu;
- yalt=yneu;
- }
- else {
- /* strichmodus ist RELATIVE (Umrechnung in abs. Werte) */
- xalt+=xneu;
- yalt+=yneu;
- }
- }
- else { /* penstatus ist DOWN, also DXF-Linie zeichnen */
- fprintf (ofile, "0\nLINE\n8\n%u\n10\n%6.3lf\n20\n%6.3lf\n",
- layer, xalt, yalt);
- if (strichmodus==ABSOLUTE) {
- xalt=xneu;
- yalt=yneu;
- fprintf (ofile, "11\n%6.3lf\n21\n%6.3lf\n", xalt, yalt);
- }
- else {
- /* strichmodus ist RELATIVE (Umrechnung in abs. Werte) */
- xalt+=xneu;
- yalt+=yneu;
- fprintf (ofile, "11\n%6.3f\n21%6.3f\n", xalt, yalt);
- }
- }
- }
-
- /* Prüfen, ob weitere Koordinatenpaare vorhanden: */
- /* i wird solange erhöht, bis zwei Separatoren gefunden wurden! */
- j=0;
- do {
- if (befehl[i]==',') j++;
- i++;
- }
- while ((j<2)&&(befehl[i]!='\00'));
- }
- }
- }
- return;
- }
-
- main ()
- {
- char file[128+4], c;
- int i;
- FILE *of, *pf;
-
- do {
- printf ("\nHP-GL-Datei [.PLT]: ");
- for (i=0; (scanf ("%c", file+i), file[i]!='\n'); i++);
- file[i]='\0';
- strtok (file,", ");
- if (strchr(file, '.')==NULL) strcat (file, ".PLT");
- if ((pf=fopen (file, "r"))!=NULL) {
- break;
- }
- else {
- fprintf (stderr, "\nDatei <%s> kann nicht geöffnet werden\n", file);
- }
- } while (1);
-
- do {
- strtok (file,". ,");
- printf("\nAusgabe-Datei [%s.DXF]: ", file);
- i=0;
- while (scanf("%c", &c), c!='\n') {
- file[i]=c;
- file[++i]='\0';
- }
- if (strchr(file, '.')==NULL) strcat (file, ".DXF");
- if ((of=fopen (file, "w"))!=NULL) {
- break;
- }
- else {
- fprintf (stderr, "\nDatei <%s> kann nicht geöffnet werden\n", file);
- }
- } while (1);
-
- fprintf (of, "0\nSECTION\n2\nENTITIES\n");
-
- /* Umsetzen des PLOT-(HPGL-)Files in das DXF-Format: */
- transfer (pf, of);
-
- fprintf (of, "0\nENDSEC\n0\nEOF\n");
-
- fcloseall();
- return;
- }