[BACK]Return to dxf.trm CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gnuplot / term

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>