/***************************************************************************** * ORTEP-II (Oak Ridge Thermal Ellipsoid Plot) for SGI * * * * ORTEP-II was originally written by C. K. Johnson (1976). Report ORNL-5138. * * Oak Ridge National Lab., Oak Ridge, TN, USA. * * ORTEP-II for OpenWindows was written by Norimasa Yamazaki, University of * * Electro-Communications, Tokyo, Japan (yam@crystal.pc.uec.ac.jp). * * * * ORTEP-II for SGI is based on the above two programs. * * List of Files: * * Makefile: make file * * ort.f: ORTEP-II main program written by C. K. Johnson * * ortep.c: interface to ORTEP-II for SGI * * Compilation: Just type 'make'. * * Usage: ortep filename * * ortep -ps filename * * * * If -ps option is specified, PostScript output is printed on your * * terminal (stdout). To save it in a file, redirect the standard * * output, i.e., do 'ortep -ps filename > file.ps' * * Features: * * nothing fancy really. * * It creates only either graphics window on SGI or PostScript file. * * Author: Dongchul Lim, Dept of Chemistry, Yale Univ., New Haven, CT, USA * * (lim@rani.chem.yale.edu), April, 1994. * ******************************************************************************/ #include #include #include #include #include #include #include #include #define ROUND(x) (int)(((x)<0.0)?(x)-.5:(x)+.5) #define MAX(x, y) (((x) > (y)) ? (x) : (y)) #define MIN(x, y) (((x) < (y)) ? (x) : (y)) #define MAXLINES 64000 #define MAXSYMBOLS 2000 typedef struct { float x, y; float height; char str[72]; float angle; } Symbol; typedef struct { float x, y; int id; } Lines; static float pensize = 0.5; static float xorigin = 0.0; static float yorigin = 0.0; static Lines lines[MAXLINES]; static int nlines = 0; static Symbol symbols[MAXSYMBOLS]; static int nsymbols = 0; static fmfonthandle fh = NULL; /* dummy functions which are called by ortepmain */ void gpsltm_(void) {} void ginit_(void) {} void vsini_(void) {} void device_(void) {} void rwind_(void) {} void charac_(void) {} void newpen_(void) {} void vsterm_(void) {} void tinput_(void) {} void pinit_(void) {} void drawtitle_(void) {} void setpensize_ (float *size) { if (*size > 0 && *size < 4) pensize = *size; else pensize = 0.5; } void plot_ (float *x, float *y, int *id) { if (nlines >= MAXLINES) { fprintf(stderr, "Maximum # of lines reached.\n"); return; } lines[nlines].x = *x + xorigin; lines[nlines].y = *y + yorigin; lines[nlines].id = *id; nlines++; if (*id < 0) { xorigin += *x; yorigin += *y; } } static int trim_str (char *str, char *delim) { trim_head(str, delim); return trim_tail(str, delim); } static int trim_head (char *str, char *delim) { char *bgn, *p, *q; if (!str || !str[0]) return 0; bgn = str + strspn(str, delim); if (!*bgn) { str[0] = '\0'; return 0; } else if (bgn == str) return 1; for(p=bgn,q=str;*p;p++,q++) *q = *p; *q = '\0'; return 1; } static int trim_tail (char *str, char *delim) { char *p; int i, len; if (!str || !str[0]) return 0; len = strlen(str); for(i=len-1;i>=0;i--) { if (!strchr(delim, str[i])) return 1; else str[i] = '\0'; } return 0; } void symbol_ (float *x, float *y, float *height, char *ch, float *angle, int *len) { char *str; if (nsymbols >= MAXSYMBOLS) { fprintf(stderr, "Maximum # of symbols reached.\n"); return; } symbols[nsymbols].x = *x + xorigin; symbols[nsymbols].y = *y + yorigin; symbols[nsymbols].height = *height; symbols[nsymbols].angle = *angle; str = symbols[nsymbols].str; sprintf(str, "%.*s\0", *len, ch); trim_str(str, " \t\n"); nsymbols++; } void number_ (float *x, float *y, float *height, float *val, float *angle, int *num) { char *str; *x += 260; *y += 320; symbols[nsymbols].x = *x + xorigin; symbols[nsymbols].y = *y + yorigin; symbols[nsymbols].height = *height; symbols[nsymbols].angle = *angle; str = symbols[nsymbols].str; sprintf(str, "%.*f\0", *num, *val); trim_str(str, " \t\n"); nsymbols++; } int main (int argc, char *argv[]) { short val; long dev; char *filename, *prog; if ((prog = strrchr(argv[0], '/'))) prog++; else prog = argv[0]; if (argc < 2) { fprintf(stderr, "Usage: %s filename\n", prog); fprintf(stderr, " %s -ps filename\n", prog); exit(1); } filename = argv[1]; if (argc > 2) { if (strncasecmp(argv[1], "-ps", 3) == 0) { filename = argv[2]; ortepmain_(filename); saveas_postscript(filename); exit(0); } } prefsize(650, 550); maxsize(650, 550); minsize(650, 550); winopen(filename); RGBmode(); doublebuffer(1); backbuffer(1); gconfig(); fminit(); if (!(fh = fmfindfont("Times-Roman"))) { fprintf(stderr, "Can't find Helvetica font.\n"); exit(); } qdevice(ESCKEY); qdevice(WINQUIT); qdevice(WINSHUT); qreset(); ortepmain_(filename); redraw_scene(); while (1) { if (qtest()) { dev = qread(&val); switch (dev) { case REDRAW: ortepmain_(filename); redraw_scene(); break; case ESCKEY: case WINQUIT: case WINSHUT: exit(0); break; } } sginap(1); } } static int redraw_scene (void) { register int i; int lw; double height; float v1[2], v2[2]; fmfonthandle fnt; fmfontinfo info; cpack(0xFFFFFF); clear(); cpack(0x0); lw = MAX(ROUND(pensize), 1); linewidth(lw); if (nlines > 0) { for(i=0;i 0) { height = 12.0; fnt = fmscalefont(fh, height); fmgetfontinfo(fnt, &info); fmsetfont(fnt); for(i=0;i