Annotation of OpenXM_contrib/gnuplot/term/dxf.trm, Revision 1.1
1.1 ! maekawa 1: /*
! 2: * $Id: dxf.trm,v 1.15 1998/04/14 00:17:37 drd Exp $
! 3: *
! 4: */
! 5:
! 6: /* GNUPLOT - dxf.trm */
! 7:
! 8: /*[
! 9: * Copyright 1991 - 1993, 1998
! 10: *
! 11: * Permission to use, copy, and distribute this software and its
! 12: * documentation for any purpose with or without fee is hereby granted,
! 13: * provided that the above copyright notice appear in all copies and
! 14: * that both that copyright notice and this permission notice appear
! 15: * in supporting documentation.
! 16: *
! 17: * Permission to modify the software is granted, but not the right to
! 18: * distribute the complete modified source code. Modifications are to
! 19: * be distributed as patches to the released version. Permission to
! 20: * distribute binaries produced by compiling modified sources is granted,
! 21: * provided you
! 22: * 1. distribute the corresponding source modifications from the
! 23: * released version in the form of a patch file along with the binaries,
! 24: * 2. add special version identification to distinguish your version
! 25: * in addition to the base release version number,
! 26: * 3. provide your name and address as the primary contact for the
! 27: * support of your modified version, and
! 28: * 4. retain our contact information in regard to use of the base
! 29: * software.
! 30: * Permission to distribute the released version of the source code along
! 31: * with corresponding source modifications in the form of a patch file is
! 32: * granted with same provisions 2 through 4 for binary distributions.
! 33: *
! 34: * This software is provided "as is" without express or implied warranty
! 35: * to the extent permitted by applicable law.
! 36: ]*/
! 37:
! 38: /*
! 39: * This file is included by ../term.c.
! 40: *
! 41: * This terminal driver supports:
! 42: * AutoCad (Release 10.x) dxf file format (import with AutoCad dxfin command)
! 43: *
! 44: *
! 45: * AUTHOR
! 46: * Florian Hiss (fhis1231@w204zrz.zrz.tu-berlin.de)
! 47: *
! 48: * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
! 49: */
! 50:
! 51: /*
! 52: * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
! 53: */
! 54:
! 55: #include "driver.h"
! 56:
! 57: #ifdef TERM_REGISTER
! 58: register_term(dxf)
! 59: #endif
! 60:
! 61: #ifdef TERM_PROTO
! 62: TERM_PUBLIC void DXF_init __PROTO((void));
! 63: TERM_PUBLIC void DXF_graphics __PROTO((void));
! 64: TERM_PUBLIC void DXF_text __PROTO((void));
! 65: TERM_PUBLIC void DXF_linetype __PROTO((int linetype));
! 66: TERM_PUBLIC void DXF_move __PROTO((unsigned int x, unsigned int y));
! 67: TERM_PUBLIC void DXF_vector __PROTO((unsigned int ux, unsigned int uy));
! 68: TERM_PUBLIC void DXF_put_text __PROTO((unsigned int x, unsigned int y,
! 69: char str[]));
! 70: TERM_PUBLIC int DXF_text_angle __PROTO((int ang));
! 71: TERM_PUBLIC int DXF_justify_text __PROTO((enum JUSTIFY mode));
! 72: TERM_PUBLIC void DXF_reset __PROTO((void));
! 73:
! 74: #define DXF_XMAX (120.0 * DXF_UNIT)
! 75: #define DXF_YMAX (80.0 * DXF_UNIT)
! 76: #define DXF_HTIC (0.01 * DXF_XMAX) /* 1.0 percent */
! 77: #define DXF_VTIC (0.01 * DXF_YMAX) /* 1.0 percent */
! 78: #define DXF_HCHAR (0.014 * DXF_XMAX) /* 1.4 percent */
! 79: #define DXF_VCHAR (0.026 * DXF_YMAX) /* 2.6 percent */
! 80: #endif /* TERM_PROTO */
! 81:
! 82: #ifndef TERM_PROTO_ONLY
! 83: #ifdef TERM_BODY
! 84:
! 85: #define DXF_UNIT 60.0
! 86: #define LINEWIDTH 0.0351 /* default line width is 1 pt */
! 87:
! 88: /* 120 (autocad units) wide by 80 (autocad units) high (default)
! 89: * use the GNUPLOT 'set size' command to change the defaults */
! 90: /* actual text height */
! 91: #define DXF_TEXTHEIGHT (0.7 * DXF_VCHAR)
! 92: /* actual text width, only a guess, we don't know the width of
! 93: * a character of given height of the AutoCad STANDARD text font,
! 94: * so change it if you like */
! 95: #define DXF_TEXTWIDTH (0.7 * DXF_HCHAR)
! 96: /* number of line types we support. see below */
! 97: #define DXF_LINE_TYPES 7
! 98: /* number of layers used for the drawing. see below */
! 99: #define MAX_LAYER 7
! 100: /* line type scaling */
! 101: #define LT_SCALE 1
! 102:
! 103: static unsigned int DXF_posx;
! 104: static unsigned int DXF_posy;
! 105: /* linetype is mapped to a layer. see below. */
! 106: static unsigned int dxf_linetype;
! 107: enum JUSTIFY dxf_justify = LEFT;
! 108: static float dxf_angle = 0.0; /* either 0 (horizontal) or 90.0 (vertical) */
! 109:
! 110: /* text style used in the entire drawing */
! 111: static char *text_style = "STANDARD";
! 112: /* text always resides on layer 0 */
! 113: #define TEXT_LAYER 0
! 114: /* each linetype resides on its own layer. each layer has its own color.
! 115: * this avoids difficulties that AutoCad has with proper scaling of
! 116: * the linetypes.
! 117: * change the colors according to your needs */
! 118: static char *layer_name[] ={ "0", "1", "2", "3", "4", "5", "6" };
! 119: /* the colours are white, red, yellow, green, cyan, blue, magenta.
! 120: * change them according to your needs.
! 121: * when using a black and white plotting device the colours map to different
! 122: * line thicknesses. see description of AutoCad print / plot command */
! 123: static char *layer_colour[] = { "7", "1", "2", "3", "4", "5", "6" };
! 124: /* support line types AutoCad has to offer by default. */
! 125: static char *layer_lines[] = { "CONTINUOUS", "DASHED", "HIDDEN", "CENTER",
! 126: "PHANTOM", "DOT", "DASHDOT" };
! 127:
! 128: static TBOOLEAN vector_was_last = FALSE;
! 129:
! 130: TERM_PUBLIC void DXF_init()
! 131: {
! 132: DXF_posx = DXF_posy = 0;
! 133: dxf_linetype = 0;
! 134: dxf_angle = 0.0;
! 135: vector_was_last = FALSE;
! 136: }
! 137:
! 138: TERM_PUBLIC void DXF_graphics()
! 139: {
! 140: register struct termentry *t = term;
! 141: int i;
! 142: static char GPFAR dxfi1[] = "\
! 143: 999\n\
! 144: %% GNUPLOT: dxf file for AutoCad\n\
! 145: 0\nSECTION\n 2\nHEADER\n\
! 146: 9\n$EXTMIN\n\
! 147: 10\n0.000\n 20\n0.000\n\
! 148: 9\n$EXTMAX\n\
! 149: 10\n%-6.3f\n 20\n%-6.3f\n\
! 150: 9\n$LIMMIN\n\
! 151: 10\n0.000\n 20\n0.000\n\
! 152: 9\n$LIMMAX\n\
! 153: 10\n%-6.3f\n 20\n%-6.3f\n\
! 154: 9\n$TEXTSTYLE\n 7\n%s\n\
! 155: 9\n$TEXTSIZE\n 40\n%-6.3f\n\
! 156: 9\n$PLINEWID\n 40\n%-6.4f\n\
! 157: 9\n$LTSCALE\n 40\n%-6.3f\n\
! 158: 9\n$COORDS\n 70\n 1\n\
! 159: 9\n$CELTYPE\n 6\nBYLAYER\n\
! 160: 9\n$CLAYER\n 8\n0\n\
! 161: 9\n$CECOLOR\n 62\n %s\n\
! 162: 9\n$MENU\n 1\nacad\n\
! 163: 0\nENDSEC\n\
! 164: 0\nSECTION\n 2\nTABLES\n";
! 165: static char GPFAR dxfi2[] = "\
! 166: 0\nTABLE\n 2\nLTYPE\n 70\n %d\n\
! 167: 0\nLTYPE\n 2\nCONTINUOUS\n 70\n 64\n\
! 168: 3\nSolid line\n 72\n 65\n 73\n 0\n 40\n0.0\n\
! 169: 0\nLTYPE\n 2\nDASHED\n 70\n 64\n\
! 170: 3\n__ __ __ __ __ __ __ __ __ __ __ __ __ __ __\n\
! 171: 72\n 65\n 73\n 2\n 40\n0.75\n 49\n0.5\n 49\n-0.25\n\
! 172: 0\nLTYPE\n 2\nHIDDEN\n 70\n 64\n\
! 173: 3\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\
! 174: 72\n 65\n 73\n 2\n 40\n0.375\n 49\n0.25\n 49\n-0.125\n\
! 175: 0\nLTYPE\n 2\nCENTER\n 70\n 64\n\
! 176: 3\n____ _ ____ _ ____ _ ____ _ ____ _ ____ _ ____\n\
! 177: 72\n 65\n 73\n 4\n 40\n2.0\n 49\n1.25\n 49\n-0.25\n\
! 178: 49\n0.25\n 49\n-0.25\n\
! 179: 0\nLTYPE\n 2\nPHANTOM\n 70\n 64\n\
! 180: 3\n_____ _ _ _____ _ _ _____ _ _ _____ _ _ ____\n\
! 181: 72\n 65\n 73\n 6\n 40\n2.5\n 49\n1.25\n\
! 182: 49\n-0.25\n 49\n0.25\n 49\n-0.25\n 49\n0.25\n 49\n-0.25\n\
! 183: 0\nLTYPE\n 2\nDOT\n 70\n 64\n\
! 184: 3\n...............................................\n\
! 185: 72\n 65\n 73\n 2\n 40\n0.25\n 49\n0.0\n 49\n-0.25\n\
! 186: 0\nLTYPE\n 2\nDASHDOT\n 70\n 64\n\
! 187: 3\n__ . __ . __ . __ . __ . __ . __ . __ . __ . __\n\
! 188: 72\n 65\n 73\n 4\n 40\n1.0\n 49\n0.5\n 49\n-0.25\n\
! 189: 49\n0.0\n 49\n-0.25\n\
! 190: 0\nENDTAB\n";
! 191:
! 192: fprintf(gpoutfile, dxfi1,
! 193: t->xmax / DXF_UNIT, t->ymax / DXF_UNIT,
! 194: t->xmax / DXF_UNIT, t->ymax / DXF_UNIT,
! 195: text_style,
! 196: DXF_TEXTHEIGHT / DXF_UNIT,
! 197: LINEWIDTH,
! 198: (double) LT_SCALE,
! 199: layer_colour[0]);
! 200: /* the linetype table */
! 201: fprintf(gpoutfile, dxfi2, DXF_LINE_TYPES);
! 202: /* the layer table */
! 203: fprintf(gpoutfile, " 0\nTABLE\n 2\nLAYER\n 70\n %-d\n", MAX_LAYER);
! 204: for (i = 1; i <= MAX_LAYER; i++)
! 205: 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]);
! 206:
! 207: /* no blocks for insertion */
! 208: /* start the entity section */
! 209: fputs(" 0\nENDTAB\n0\nENDSEC\n\
! 210: 0\nSECTION\n 2\nBLOCKS\n 0\nENDSEC\n\
! 211: 0\nSECTION\n\
! 212: 2\nENTITIES\n",
! 213: gpoutfile);
! 214: }
! 215:
! 216: TERM_PUBLIC void DXF_text()
! 217: {
! 218: if (vector_was_last)
! 219: fputs(" 0\nSEQEND\n", gpoutfile);
! 220: fputs(" 0\nENDSEC\n 0\nEOF\n", gpoutfile);
! 221: }
! 222:
! 223: TERM_PUBLIC void DXF_linetype(linetype)
! 224: int linetype;
! 225: {
! 226: linetype = ABS(linetype);
! 227: linetype = linetype % DXF_LINE_TYPES;
! 228: dxf_linetype = linetype;
! 229: }
! 230:
! 231: TERM_PUBLIC void DXF_move(x, y)
! 232: unsigned int x, y;
! 233: {
! 234: DXF_posx = x;
! 235: DXF_posy = y;
! 236: if (vector_was_last)
! 237: fputs(" 0\nSEQEND\n", gpoutfile);
! 238: vector_was_last = FALSE;
! 239: fprintf(gpoutfile, "\
! 240: 0\nPOLYLINE\n 8\n%s\n 66\n 1\n\
! 241: 6\n%s\n\
! 242: 0\nVERTEX\n 8\n%s\n\
! 243: 6\n%s\n\
! 244: 10\n%-6.3f\n 20\n%-6.3f\n 30\n0.000\n",
! 245: layer_name[dxf_linetype],
! 246: layer_lines[dxf_linetype],
! 247: layer_name[dxf_linetype],
! 248: layer_lines[dxf_linetype],
! 249: DXF_posx / DXF_UNIT, DXF_posy / DXF_UNIT);
! 250:
! 251: }
! 252:
! 253: TERM_PUBLIC void DXF_vector(ux, uy)
! 254: unsigned int ux, uy;
! 255: {
! 256: DXF_posx = ux;
! 257: DXF_posy = uy;
! 258: vector_was_last = TRUE;
! 259:
! 260: fprintf(gpoutfile, "\
! 261: 0\nVERTEX\n 8\n%s\n\
! 262: 6\n%s\n\
! 263: 10\n%-6.3f\n 20\n%-6.3f\n 30\n0.000\n",
! 264: layer_name[dxf_linetype],
! 265: layer_lines[dxf_linetype],
! 266: DXF_posx / DXF_UNIT, DXF_posy / DXF_UNIT);
! 267: }
! 268:
! 269: TERM_PUBLIC void DXF_put_text(x, y, str)
! 270: unsigned int x, y;
! 271: char str[];
! 272: {
! 273: int stl;
! 274: float xleftpos, yleftpos, xrightpos, yrightpos;
! 275:
! 276: /* shut up gcc warnings - SB */
! 277: xleftpos = yleftpos = xrightpos = yrightpos = 1.0; /* dummy */
! 278: /* ignore empty strings */
! 279: if (str[0] == NUL)
! 280: return;
! 281:
! 282: stl = 0;
! 283: while (str[stl] != NUL)
! 284: ++stl; /* get string length */
! 285:
! 286: if (vector_was_last)
! 287: fputs(" 0\nSEQEND\n", gpoutfile);
! 288: vector_was_last = FALSE;
! 289: fprintf(gpoutfile, " 0\nTEXT\n 8\n%s\n", layer_name[TEXT_LAYER]);
! 290: if (dxf_angle != 90.0) {
! 291: switch (dxf_justify) {
! 292: case LEFT:
! 293: xleftpos = (float) x;
! 294: yleftpos = (float) (y - DXF_VCHAR / 4.0);
! 295: xrightpos = (float) (x + stl * DXF_TEXTWIDTH);
! 296: yrightpos = yleftpos;
! 297: break;
! 298: case RIGHT:
! 299: xleftpos = (float) (x - stl * DXF_TEXTWIDTH);
! 300: yleftpos = (float) (y - DXF_VCHAR / 4.0);
! 301: xrightpos = (float) x;
! 302: yrightpos = yleftpos;
! 303: break;
! 304: case CENTRE:
! 305: xleftpos = (float) (x - stl * DXF_TEXTWIDTH / 2.0);
! 306: yleftpos = (float) (y - DXF_VCHAR / 4.0);
! 307: xrightpos = (float) x; /* center point */
! 308: yrightpos = yleftpos;
! 309: break;
! 310: }
! 311: } else {
! 312: switch (dxf_justify) {
! 313: case LEFT:
! 314: xleftpos = (float) (x + DXF_VCHAR / 4.0);
! 315: yleftpos = (float) y;
! 316: xrightpos = xleftpos;
! 317: yrightpos = (float) (y + stl * DXF_TEXTWIDTH);
! 318: break;
! 319: case RIGHT:
! 320: xleftpos = (float) (x + DXF_VCHAR / 4.0);
! 321: yleftpos = (float) (y - stl * DXF_HCHAR);
! 322: xrightpos = xleftpos;
! 323: yrightpos = (float) y;
! 324: break;
! 325: case CENTRE:
! 326: xleftpos = (float) (x + DXF_VCHAR / 4.0);
! 327: yleftpos = (float) (y - stl * DXF_TEXTWIDTH / 2.0);
! 328: xrightpos = xleftpos;
! 329: yrightpos = (float) y; /* center point */
! 330: break;
! 331: }
! 332: }
! 333:
! 334: fprintf(gpoutfile, "\
! 335: 10\n%-6.3f\n 20\n%-6.3f\n 30\n0.000\n\
! 336: 40\n%-6.3f\n 1\n%s\n 50\n%-6.3f\n\
! 337: 7\n%s\n",
! 338: xleftpos / DXF_UNIT, yleftpos / DXF_UNIT,
! 339: DXF_TEXTHEIGHT / DXF_UNIT, str, dxf_angle,
! 340: text_style);
! 341:
! 342: if (dxf_justify != LEFT) {
! 343: fprintf(gpoutfile, " 72\n%d\n\
! 344: 11\n%-6.3f\n 21\n%-6.3f\n 31\n0.000\n",
! 345: dxf_justify,
! 346: xrightpos / DXF_UNIT, yrightpos / DXF_UNIT);
! 347: }
! 348: }
! 349:
! 350: TERM_PUBLIC int DXF_text_angle(ang)
! 351: int ang;
! 352: {
! 353: dxf_angle = 0.0;
! 354: if (ang == 1)
! 355: dxf_angle = 90.0;
! 356: return (TRUE);
! 357: }
! 358:
! 359: TERM_PUBLIC int DXF_justify_text(mode)
! 360: enum JUSTIFY mode;
! 361: {
! 362: dxf_justify = mode;
! 363: return (TRUE);
! 364: }
! 365:
! 366: TERM_PUBLIC void DXF_reset()
! 367: {
! 368: DXF_posx = DXF_posy = 0;
! 369: }
! 370:
! 371: #endif /* TERM_BODY */
! 372:
! 373: #ifdef TERM_TABLE
! 374: TERM_TABLE_START(dxf_driver)
! 375: "dxf", "dxf-file for AutoCad (default size 120x80)",
! 376: DXF_XMAX, DXF_YMAX, DXF_VCHAR, DXF_HCHAR,
! 377: DXF_VTIC, DXF_HTIC, options_null, DXF_init, DXF_reset,
! 378: DXF_text, null_scale, DXF_graphics, DXF_move, DXF_vector,
! 379: DXF_linetype, DXF_put_text, DXF_text_angle,
! 380: DXF_justify_text, do_point, do_arrow, set_font_null
! 381: TERM_TABLE_END(dxf_driver)
! 382:
! 383: #undef LAST_TERM
! 384: #define LAST_TERM dxf_driver
! 385:
! 386: #endif /* TERM_TABLE */
! 387: #endif /* TERM_PROTO_ONLY */
! 388:
! 389: #ifdef TERM_HELP
! 390: START_HELP(dxf)
! 391: "1 dxf",
! 392: "?commands set terminal dxf",
! 393: "?set terminal dxf",
! 394: "?set term dxf",
! 395: "?terminal dxf",
! 396: "?term dxf",
! 397: "?dxf",
! 398: " The `dxf` terminal driver creates pictures that can be imported into AutoCad",
! 399: " (Release 10.x). It has no options of its own, but some features of its plots",
! 400: " may be modified by other means. The default size is 120x80 AutoCad units,",
! 401: " which can be changed by `set size`. `dxf` uses seven colors (white, red,",
! 402: " yellow, green, cyan, blue and magenta), which can be changed only by",
! 403: " modifying the source file. If a black-and-white plotting device is used, the",
! 404: " colors are mapped to differing line thicknesses. See the description of the",
! 405: " AutoCad print/plot command."
! 406: END_HELP(dxf)
! 407: #endif /* TERM_HELP */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>