Initial release of Maemo 5 port of gnuplot
[gnuplot] / term / dxf.trm
diff --git a/term/dxf.trm b/term/dxf.trm
new file mode 100644 (file)
index 0000000..54d0662
--- /dev/null
@@ -0,0 +1,423 @@
+/* Hello, Emacs, this is -*-C-*-
+ * $Id: dxf.trm,v 1.16 2006/07/21 02:35:45 sfeam Exp $
+ *
+ */
+
+/* GNUPLOT - dxf.trm */
+
+/*[
+ * Copyright 1991 - 1993, 1998, 2004
+ *
+ * Permission to use, copy, and distribute this software and its
+ * documentation for any purpose with or without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.
+ *
+ * Permission to modify the software is granted, but not the right to
+ * distribute the complete modified source code.  Modifications are to
+ * be distributed as patches to the released version.  Permission to
+ * distribute binaries produced by compiling modified sources is granted,
+ * provided you
+ *   1. distribute the corresponding source modifications from the
+ *    released version in the form of a patch file along with the binaries,
+ *   2. add special version identification to distinguish your version
+ *    in addition to the base release version number,
+ *   3. provide your name and address as the primary contact for the
+ *    support of your modified version, and
+ *   4. retain our contact information in regard to use of the base
+ *    software.
+ * Permission to distribute the released version of the source code along
+ * with corresponding source modifications in the form of a patch file is
+ * granted with same provisions 2 through 4 for binary distributions.
+ *
+ * This software is provided "as is" without express or implied warranty
+ * to the extent permitted by applicable law.
+]*/
+
+/*
+ * This file is included by ../term.c.
+ *
+ * This terminal driver supports:
+ *   AutoCad (Release 10.x) dxf file format (import with AutoCad dxfin command)
+ *
+ *
+ * AUTHOR
+ *   Florian Hiss  (fhis1231@w204zrz.zrz.tu-berlin.de)
+ *
+ * send your comments or suggestions to (gnuplot-info@lists.sourceforge.net).
+*/
+
+/*
+ * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
+ */
+
+#include "driver.h"
+
+#ifdef TERM_REGISTER
+register_term(dxf)
+#endif
+
+#ifdef TERM_PROTO
+TERM_PUBLIC void DXF_init __PROTO((void));
+TERM_PUBLIC void DXF_graphics __PROTO((void));
+TERM_PUBLIC void DXF_text __PROTO((void));
+TERM_PUBLIC void DXF_linetype __PROTO((int linetype));
+TERM_PUBLIC void DXF_move __PROTO((unsigned int x, unsigned int y));
+TERM_PUBLIC void DXF_vector __PROTO((unsigned int ux, unsigned int uy));
+TERM_PUBLIC void DXF_put_text __PROTO((unsigned int x, unsigned int y,
+                                      const char str[]));
+TERM_PUBLIC int DXF_text_angle __PROTO((int ang));
+TERM_PUBLIC int DXF_justify_text __PROTO((enum JUSTIFY mode));
+TERM_PUBLIC void DXF_reset __PROTO((void));
+
+#define DXF_XMAX (120.0 * DXF_UNIT)
+#define DXF_YMAX (80.0 * DXF_UNIT)
+#if 0 /* HBB 20030626: old version */
+#define DXF_HTIC (0.01 * DXF_XMAX)     /* 1.0 percent */
+#define DXF_VTIC (0.01 * DXF_YMAX)     /* 1.0 percent */
+#else
+/* HBB 20030626: make them have the same length in DXF_UNITs ! */
+# define DXF_HTIC (2.0 * DXF_UNIT)
+# define DXF_VTIC (2.0 * DXF_UNIT)
+#endif
+#define DXF_HCHAR (0.014 * DXF_XMAX)   /* 1.4 percent */
+#define DXF_VCHAR (0.026 * DXF_YMAX)   /* 2.6 percent */
+#endif /* TERM_PROTO */
+
+#ifndef TERM_PROTO_ONLY
+#ifdef TERM_BODY
+
+#define DXF_UNIT 60.0
+#define LINEWIDTH 0.0351       /* default line width is 1 pt */
+
+/* 120 (autocad units) wide by 80 (autocad units) high (default)
+ * use the GNUPLOT 'set size' command to change the defaults */
+/* actual text height */
+#define DXF_TEXTHEIGHT (0.7 * DXF_VCHAR)
+
+/* actual text width, only a guess, we don't know the width of
+ * a character of given height of the AutoCad STANDARD text font,
+ * so change it if you like */
+#define DXF_TEXTWIDTH (0.7 * DXF_HCHAR)
+
+/* number of line types we support. see below  */
+#define DXF_LINE_TYPES 7
+
+/* number of layers used for the drawing. see below */
+#define MAX_LAYER 7
+
+/* line type scaling */
+#define LT_SCALE 1
+
+static unsigned int DXF_posx;
+static unsigned int DXF_posy;
+/* linetype is mapped to a layer. see below. */
+static unsigned int dxf_linetype;
+static enum JUSTIFY dxf_justify = LEFT;
+static float dxf_angle = 0.0;  /* 0 is horizontal, 90.0 is vertical */
+
+/* text style used in the entire drawing */
+static const char *text_style = "STANDARD";
+
+/* text always resides on layer 0 */
+#define TEXT_LAYER 0
+
+/* each linetype resides on its own layer. each layer has its own color.
+ * this avoids difficulties that AutoCad has with proper scaling of
+ * the linetypes.
+ * change the colors according to your needs */
+static const char *layer_name[] ={ "0", "1", "2", "3", "4", "5", "6" };
+
+/* the colours are white, red, yellow, green, cyan, blue, magenta.
+ * change them according to your needs.
+ * when using a black and white plotting device the colours map to different
+ * line thicknesses. see description of AutoCad print / plot command */
+static const char *layer_colour[] = { "7", "1", "2", "3", "4", "5", "6" };
+
+/* support line types AutoCad has to offer by default. */
+static const char *layer_lines[] = {
+    "CONTINUOUS", "DASHED", "HIDDEN", "CENTER", "PHANTOM", "DOT", "DASHDOT"
+};
+
+static TBOOLEAN vector_was_last = FALSE;
+
+TERM_PUBLIC void
+DXF_init()
+{
+    DXF_posx = DXF_posy = 0;
+    dxf_linetype = 0;
+    dxf_angle = 0.0;
+    vector_was_last = FALSE;
+}
+
+TERM_PUBLIC void
+DXF_graphics()
+{
+    register struct termentry *t = term;
+    int i;
+    static char GPFAR dxfi1[] = "\
+999\n\
+%% GNUPLOT: dxf file for AutoCad\n\
+  0\nSECTION\n  2\nHEADER\n\
+  9\n$EXTMIN\n\
+ 10\n0.000\n 20\n0.000\n\
+  9\n$EXTMAX\n\
+ 10\n%-6.3f\n 20\n%-6.3f\n\
+  9\n$LIMMIN\n\
+ 10\n0.000\n 20\n0.000\n\
+  9\n$LIMMAX\n\
+ 10\n%-6.3f\n 20\n%-6.3f\n\
+  9\n$TEXTSTYLE\n  7\n%s\n\
+  9\n$TEXTSIZE\n 40\n%-6.3f\n\
+  9\n$PLINEWID\n 40\n%-6.4f\n\
+  9\n$LTSCALE\n  40\n%-6.3f\n\
+  9\n$COORDS\n 70\n  1\n\
+  9\n$CELTYPE\n 6\nBYLAYER\n\
+  9\n$CLAYER\n  8\n0\n\
+  9\n$CECOLOR\n 62\n   %s\n\
+  9\n$MENU\n  1\nacad\n\
+  0\nENDSEC\n\
+  0\nSECTION\n  2\nTABLES\n";
+    static char GPFAR dxfi2[] = "\
+0\nTABLE\n  2\nLTYPE\n 70\n    %d\n\
+0\nLTYPE\n  2\nCONTINUOUS\n 70\n    64\n\
+  3\nSolid line\n 72\n    65\n 73\n      0\n 40\n0.0\n\
+  0\nLTYPE\n  2\nDASHED\n 70\n    64\n\
+  3\n__ __ __ __ __ __ __ __ __ __ __ __ __ __ __\n\
+ 72\n    65\n 73\n     2\n 40\n0.75\n 49\n0.5\n 49\n-0.25\n\
+  0\nLTYPE\n  2\nHIDDEN\n 70\n    64\n\
+  3\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\
+ 72\n    65\n 73\n     2\n 40\n0.375\n 49\n0.25\n 49\n-0.125\n\
+  0\nLTYPE\n  2\nCENTER\n 70\n    64\n\
+  3\n____ _ ____ _ ____ _ ____ _ ____ _ ____ _ ____\n\
+ 72\n    65\n 73\n     4\n 40\n2.0\n 49\n1.25\n 49\n-0.25\n\
+ 49\n0.25\n 49\n-0.25\n\
+  0\nLTYPE\n  2\nPHANTOM\n 70\n    64\n\
+  3\n_____ _ _ _____ _ _ _____ _ _ _____ _ _ ____\n\
+ 72\n    65\n 73\n     6\n 40\n2.5\n 49\n1.25\n\
+ 49\n-0.25\n 49\n0.25\n 49\n-0.25\n 49\n0.25\n 49\n-0.25\n\
+  0\nLTYPE\n  2\nDOT\n 70\n    64\n\
+  3\n...............................................\n\
+ 72\n    65\n 73\n     2\n 40\n0.25\n 49\n0.0\n 49\n-0.25\n\
+  0\nLTYPE\n  2\nDASHDOT\n 70\n    64\n\
+  3\n__ . __ . __ . __ . __ . __ . __ . __ . __ . __\n\
+ 72\n    65\n 73\n     4\n 40\n1.0\n 49\n0.5\n 49\n-0.25\n\
+ 49\n0.0\n 49\n-0.25\n\
+  0\nENDTAB\n";
+
+    fprintf(gpoutfile, dxfi1,
+           t->xmax / DXF_UNIT, t->ymax / DXF_UNIT,
+           t->xmax / DXF_UNIT, t->ymax / DXF_UNIT,
+           text_style,
+           DXF_TEXTHEIGHT / DXF_UNIT,
+           LINEWIDTH,
+           (double) LT_SCALE,
+           layer_colour[0]);
+    /* the linetype table */
+    fprintf(gpoutfile, dxfi2, DXF_LINE_TYPES);
+    /* the layer table */
+    fprintf(gpoutfile, "  0\nTABLE\n  2\nLAYER\n 70\n   %-d\n", MAX_LAYER);
+    for (i = 1; i <= MAX_LAYER; i++)
+       fprintf(gpoutfile, "  0\nLAYER\n  2\n%s\n 70\n   64\n62\n   %s\n  6\n%s\n", layer_name[i - 1], layer_colour[i - 1], layer_lines[i - 1]);
+
+    /* no blocks for insertion */
+    /* start the entity section */
+    fputs("  0\nENDTAB\n0\nENDSEC\n\
+  0\nSECTION\n  2\nBLOCKS\n  0\nENDSEC\n\
+  0\nSECTION\n\
+  2\nENTITIES\n",
+         gpoutfile);
+}
+
+TERM_PUBLIC void
+DXF_text()
+{
+    if (vector_was_last)
+       fputs("  0\nSEQEND\n", gpoutfile);
+    fputs("  0\nENDSEC\n  0\nEOF\n", gpoutfile);
+}
+
+TERM_PUBLIC void
+DXF_linetype(int linetype)
+{
+    linetype = ABS(linetype);
+    linetype = linetype % DXF_LINE_TYPES;
+    dxf_linetype = linetype;
+}
+
+TERM_PUBLIC void
+DXF_move(unsigned int x, unsigned int y)
+{
+    DXF_posx = x;
+    DXF_posy = y;
+    if (vector_was_last)
+       fputs("  0\nSEQEND\n", gpoutfile);
+    vector_was_last = FALSE;
+    fprintf(gpoutfile, "\
+  0\nPOLYLINE\n  8\n%s\n 66\n   1\n\
+  6\n%s\n\
+  0\nVERTEX\n  8\n%s\n\
+  6\n%s\n\
+ 10\n%-6.3f\n 20\n%-6.3f\n 30\n0.000\n",
+           layer_name[dxf_linetype],
+           layer_lines[dxf_linetype],
+           layer_name[dxf_linetype],
+           layer_lines[dxf_linetype],
+           DXF_posx / DXF_UNIT, DXF_posy / DXF_UNIT);
+
+}
+
+TERM_PUBLIC void
+DXF_vector(unsigned int ux, unsigned int uy)
+{
+    DXF_posx = ux;
+    DXF_posy = uy;
+    vector_was_last = TRUE;
+
+    fprintf(gpoutfile, "\
+  0\nVERTEX\n  8\n%s\n\
+  6\n%s\n\
+  10\n%-6.3f\n  20\n%-6.3f\n  30\n0.000\n",
+           layer_name[dxf_linetype],
+           layer_lines[dxf_linetype],
+           DXF_posx / DXF_UNIT, DXF_posy / DXF_UNIT);
+}
+
+TERM_PUBLIC void
+DXF_put_text(unsigned int x, unsigned int y, const char str[])
+{
+    int stl;
+    float xleftpos, yleftpos, xrightpos, yrightpos;
+
+    /* shut up gcc warnings  - SB */
+    xleftpos = yleftpos = xrightpos = yrightpos = 1.0; /* dummy */
+    /* ignore empty strings */
+    if (str[0] == NUL)
+       return;
+
+    stl = 0;
+    while (str[stl] != NUL)
+       ++stl;                  /* get string length */
+
+    if (vector_was_last)
+       fputs("  0\nSEQEND\n", gpoutfile);
+    vector_was_last = FALSE;
+    fprintf(gpoutfile, "  0\nTEXT\n  8\n%s\n", layer_name[TEXT_LAYER]);
+    if (dxf_angle != 90.0) {
+       switch (dxf_justify) {
+       case LEFT:
+           xleftpos = (float) x;
+           yleftpos = (float) (y - DXF_VCHAR / 4.0);
+           xrightpos = (float) (x + stl * DXF_TEXTWIDTH);
+           yrightpos = yleftpos;
+           break;
+       case RIGHT:
+           xleftpos = (float) (x - stl * DXF_TEXTWIDTH);
+           yleftpos = (float) (y - DXF_VCHAR / 4.0);
+           xrightpos = (float) x;
+           yrightpos = yleftpos;
+           break;
+       case CENTRE:
+           xleftpos = (float) (x - stl * DXF_TEXTWIDTH / 2.0);
+           yleftpos = (float) (y - DXF_VCHAR / 4.0);
+           xrightpos = (float) x;      /* center point */
+           yrightpos = yleftpos;
+           break;
+       }
+    } else {
+       switch (dxf_justify) {
+       case LEFT:
+           xleftpos = (float) (x + DXF_VCHAR / 4.0);
+           yleftpos = (float) y;
+           xrightpos = xleftpos;
+           yrightpos = (float) (y + stl * DXF_TEXTWIDTH);
+           break;
+       case RIGHT:
+           xleftpos = (float) (x + DXF_VCHAR / 4.0);
+           yleftpos = (float) (y - stl * DXF_HCHAR);
+           xrightpos = xleftpos;
+           yrightpos = (float) y;
+           break;
+       case CENTRE:
+           xleftpos = (float) (x + DXF_VCHAR / 4.0);
+           yleftpos = (float) (y - stl * DXF_TEXTWIDTH / 2.0);
+           xrightpos = xleftpos;
+           yrightpos = (float) y;      /* center point */
+           break;
+       }
+    }
+
+    fprintf(gpoutfile, "\
+ 10\n%-6.3f\n 20\n%-6.3f\n 30\n0.000\n\
+ 40\n%-6.3f\n  1\n%s\n 50\n%-6.3f\n\
+  7\n%s\n",
+           xleftpos / DXF_UNIT, yleftpos / DXF_UNIT,
+           DXF_TEXTHEIGHT / DXF_UNIT, str, dxf_angle,
+           text_style);
+
+    if (dxf_justify != LEFT) {
+       fprintf(gpoutfile, " 72\n%d\n\
+ 11\n%-6.3f\n 21\n%-6.3f\n 31\n0.000\n",
+               dxf_justify,
+               xrightpos / DXF_UNIT, yrightpos / DXF_UNIT);
+    }
+}
+
+TERM_PUBLIC int
+DXF_text_angle(int ang)
+{
+    dxf_angle = (ang ? 90.0 : 0.0);
+    return (TRUE);
+}
+
+TERM_PUBLIC int
+DXF_justify_text(enum JUSTIFY mode)
+{
+    dxf_justify = mode;
+    return (TRUE);
+}
+
+TERM_PUBLIC void
+DXF_reset()
+{
+    DXF_posx = DXF_posy = 0;
+}
+
+#endif /* TERM_BODY */
+
+#ifdef TERM_TABLE
+TERM_TABLE_START(dxf_driver)
+  "dxf", "dxf-file for AutoCad (default size 120x80)",
+    DXF_XMAX, DXF_YMAX, DXF_VCHAR, DXF_HCHAR,
+    DXF_VTIC, DXF_HTIC, options_null, DXF_init, DXF_reset,
+    DXF_text, null_scale, DXF_graphics, DXF_move, DXF_vector,
+    DXF_linetype, DXF_put_text, DXF_text_angle,
+    DXF_justify_text, do_point, do_arrow, set_font_null
+TERM_TABLE_END(dxf_driver)
+
+#undef LAST_TERM
+#define LAST_TERM dxf_driver
+
+#endif /* TERM_TABLE */
+#endif /* TERM_PROTO_ONLY */
+
+#ifdef TERM_HELP
+START_HELP(dxf)
+"1 dxf",
+"?commands set terminal dxf",
+"?set terminal dxf",
+"?set term dxf",
+"?terminal dxf",
+"?term dxf",
+"?dxf",
+" The `dxf` terminal driver creates pictures that can be imported into AutoCad",
+" (Release 10.x).  It has no options of its own, but some features of its plots",
+" may be modified by other means.  The default size is 120x80 AutoCad units,",
+" which can be changed by `set size`.  `dxf` uses seven colors (white, red,",
+" yellow, green, cyan, blue and magenta), which can be changed only by",
+" modifying the source file.  If a black-and-white plotting device is used, the",
+" colors are mapped to differing line thicknesses.  See the description of the",
+" AutoCad print/plot command."
+END_HELP(dxf)
+#endif /* TERM_HELP */