laser-lovers@uw-beaver (07/18/85)
From: JRBRINKEMA@USC-ISI.arpa Somewhere I came upon a reference to a QMS plot program (equiv to the UNIX plot(1) command) called Qplot (I think). Does anyone have a pointer to it? tia.
laser-lovers@uw-beaver (07/21/85)
From: allegra!packard!harvard!bu-cs!root@uw-beaver.arpa (BostonU SysMgr) Here is an implementation of a unix plot library (libqms.a) I wrote some time back. I am sure it's got some bugs and misfeatures but the other choice is to sit on it till I get some time to go over it, which isn't likely to happen this century. (I'll bet some of it is laughable, but as I remember it worked.) The idea was you use standard unix graphics calls and link a program cc .... -lqms You should be aware that for output it popen()'s to "qpr -q" as an output device, you may have to adjust this for your site (see the #define PCMD in qms.h, should be a trivial fix even for a non-programmer, just find out what program on your system can read raw QUIC commands through a pipe to its std input and change PCMD.) It's short, bug fixes etc welcome. -Barry Shein, Boston University ------ AS-IS Software Inc--- #!/bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #!/bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # Makefile # arc.c # circle.c # closepl.c # cont.c # erase.c # label.c # line.c # linemod.c # move.c # openpl.c # point.c # qms.h # space.c # This archive created: Sat Jul 20 13:41:12 1985 export PATH; PATH=/bin:$PATH if test -f 'Makefile' then echo shar: over-writing existing file "'Makefile'" fi cat << \SHAR_EOF > 'Makefile' CFLAGS= -O OBJS= arc.o circle.o closepl.o cont.o erase.o label.o line.o\ linemod.o move.o openpl.o point.o space.o LIBDIR= /usr/lib libqms.a: ${OBJS} ar cu libqms.a ${OBJS} ; ranlib libqms.a arc.o: arc.c qms.h circle.o: circle.c qms.h closepl.o: closepl.c qms.h cont.o: cont.c qms.h erase.o: erase.c qms.h label.o: label.c qms.h line.o: line.c qms.h linemod.o: linemod.c qms.h move.o: move.c qms.h openpl.o: openpl.c qms.h point.o: point.c qms.h space.o: space.c qms.h install: libqms.a cp libqms.a ${LIBDIR}/libqms.a clean: rm *.o libqms.a SHAR_EOF chmod +x 'Makefile' if test -f 'arc.c' then echo shar: over-writing existing file "'arc.c'" fi cat << \SHAR_EOF > 'arc.c' #include "qms.h" arc(x,y,x0,y0,x1,y1) int x, y, x0, y0, x1, y1 ; { extern double atan(), hypot() ; double fx, fy ; PUTS("^LA") ; /* center */ fprintf(qmspipe,"%05d%05d",toinch(x),toinch(y)) ; /* radius */ fprintf(qmspipe,"%05d", toinch((int) hypot((double)(x-x0),(double)(y-y0)))) ; /* starting and ending angles */ fx = x0 - x ; fy = y0 - y ; if(fy == 0.0) x = ((fx > 0.0) ? 90 : 270) ; else x = radde(atan(fx/fy)) ; if(x < 0) x += 360 ; fprintf(qmspipe,"%03d",x) ; fx = x1 - x ; fy = y1 - y ; if(fy == 0.0) x = ((fx > 0.0) ? 90 : 270) ; else x = radde(atan(fx/fy)) ; if(x < 0) x += 360 ; fprintf(qmspipe,"%03d",x) ; /* pen width */ fprintf(qmspipe,"%02d",qmspen & 037) ; /* done */ PUTS("^G") ; qmslasty = y1 ; } SHAR_EOF chmod +x 'arc.c' if test -f 'circle.c' then echo shar: over-writing existing file "'circle.c'" fi cat << \SHAR_EOF > 'circle.c' #include "qms.h" circle(x,y,r) int x, y, r ; { /* Indicate integer arc */ PUTS("^LA") ; /* center in thousandths of inches */ fprintf(qmspipe,"%05d%05d",toinch(x),toinch(y)) ; /* arc radius in thousands of inches */ fprintf(qmspipe,"%05d",toinch(r)) ; /* start/stop angles: 0,0 means circle */ PUTS("000000") ; /* pen width */ fprintf(qmspipe,"%02d",qmspen & 037) ; /* done */ PUTS("^G") ; qmslasty = y ; } SHAR_EOF chmod +x 'circle.c' if test -f 'closepl.c' then echo shar: over-writing existing file "'closepl.c'" fi cat << \SHAR_EOF > 'closepl.c' #include "qms.h" closepl() { PUTS(QUICOFF) ; return(pclose(qmspipe)) ; } SHAR_EOF chmod +x 'closepl.c' if test -f 'cont.c' then echo shar: over-writing existing file "'cont.c'" fi cat << \SHAR_EOF > 'cont.c' #include "qms.h" cont(x,y) int x, y ; { PUTS("^IGV^P") ; fprintf(qmspipe,"W%02d",qmspen & 037) ; PUTS("^D") ; fprintf(qmspipe,"%05d:",toinch(x)) ; fprintf(qmspipe,"%05d",toinch(y)) ; PUTS("^IGE^-") ; qmslasty = y ; } SHAR_EOF chmod +x 'cont.c' if test -f 'erase.c' then echo shar: over-writing existing file "'erase.c'" fi cat << \SHAR_EOF > 'erase.c' #include "qms.h" erase() { PUTS("^,^-") ; qmslasty = 0 ; } SHAR_EOF chmod +x 'erase.c' if test -f 'label.c' then echo shar: over-writing existing file "'label.c'" fi cat << \SHAR_EOF > 'label.c' #include "qms.h" label(s) char *s ; { fprintf(qmspipe,"%s%03d%03d%05d%s\r",qrot[qmsrot], qmshtch,qmswdch,toinch(qmslasty),s) ; } SHAR_EOF chmod +x 'label.c' if test -f 'line.c' then echo shar: over-writing existing file "'line.c'" fi cat << \SHAR_EOF > 'line.c' #include "qms.h" line(x1,y1,x2,y2) int x1, y1, x2, y2 ; { /* put into vector grafx and set pen width */ fprintf(qmspipe,"^IGV^PW%02d",qmspen & 037) ; PUTS("^U") ; /* move to first position with pen up */ /* scale into .001 inches */ fprintf(qmspipe,"%05d:%05d",toinch(x1),toinch(y1)) ; /* set pen down and move to second position */ PUTS("^D") ; fprintf(qmspipe,"%05d:%05d",toinch(x2),toinch(y2)) ; /* exit vector graphics drawing */ PUTS("^IGE") ; qmslasty = y2 ; } SHAR_EOF chmod +x 'line.c' if test -f 'linemod.c' then echo shar: over-writing existing file "'linemod.c'" fi cat << \SHAR_EOF > 'linemod.c' #include "qms.h" linemod(s) char *s ; { /* not supported */ return(0) ; } SHAR_EOF chmod +x 'linemod.c' if test -f 'move.c' then echo shar: over-writing existing file "'move.c'" fi cat << \SHAR_EOF > 'move.c' #include "qms.h" move(x,y) int x, y ; { fprintf(qmspipe,"^IGV^PW^U%05d:%05d^D+%05d:+%05d^IGE\r", toinch(x),toinch(y),0,0) ; qmslasty = y ; } SHAR_EOF chmod +x 'move.c' if test -f 'openpl.c' then echo shar: over-writing existing file "'openpl.c'" fi cat << \SHAR_EOF > 'openpl.c' #include "qms.h" openpl() { if((qmspipe = popen(PCMD,"w")) == NULL) { perror("openpl") ; exit(1) ; } qmshtch = DEFHT ; qmswdch = DEFWD ; qmspen = DEFPEN ; qmslasty = 0 ; PUTS(QUICON) ; } SHAR_EOF chmod +x 'openpl.c' if test -f 'point.c' then echo shar: over-writing existing file "'point.c'" fi cat << \SHAR_EOF > 'point.c' #include "qms.h" point(x,y) int x,y ; { line(x-3,y,x,y) ; qmslasty = y ; } SHAR_EOF chmod +x 'point.c' if test -f 'qms.h' then echo shar: over-writing existing file "'qms.h'" fi cat << \SHAR_EOF > 'qms.h' #include <stdio.h> /* * UNIX standard plot filter for the QMS * QMS definitions */ #define PUTS(s) fputs(s,qmspipe) FILE *qmspipe, *popen() ; #define PCMD "/usr/bin/qpr -q" #define MAXX (300.0 * 8.5) /* 8.5 inches, 300 dots per inch */ #define MAXY (300.0 * 11) /* 11 inches, 300 dots per inch */ #define derad(x) (1.745329251994328e-2 * (x)) #define radde(x) (57.29577951308232 * (x)) #define toinch(x) ((1000 * (x)) / 300) /* to 1000ths of inch */ /* * externals available to the user */ int qmspen ; /* qms pen width 03..31 */ #define DEFPEN 5 int qmsrot ; /* rotation of chars */ #define ROT0 0 #define ROT270 1 #define ROT90 2 #define ROT180 3 static char *qrot[] = { "^M", "^E", "^V", "^U" } ; int qmshtch ; /* ie. about 8lpi */ int qmswdch ; /* about 12cpi */ #define DEFHT (100/8) #define DEFWD (100/12) int qmslasty ; /* This blasted thing is needed by label! */ #define QUICON "\r^PY^-\r" #define QUICOFF "\r^-^PN^-\r" SHAR_EOF chmod +x 'qms.h' if test -f 'space.c' then echo shar: over-writing existing file "'space.c'" fi cat << \SHAR_EOF > 'space.c' #include "qms.h" space(x0,y0,x1,y1) { /* not supported */ return(0) ; } SHAR_EOF chmod +x 'space.c' # End of shell archive exit 0