[comp.sys.hp] Fixing starbase graphics spooling

plb@cbnewsi.ATT.COM (peter.l.berghold) (08/17/89)

Hi Folks,

Here is a filter that I whipped up to fix problems with spooling to HP
plotters from STARBASE.   The problem that it fixes is one of sizing.
Normally STARBASE spools thinking it is working with E size paper. This is fine
if you really are, but if you are using an A size plotter, most of your plot
ends up off the page.   So, here it is...


# This is a shell archive.  Remove anything before this line,
# then unpack it by saving it in a file and typing "sh file".
#
# Wrapped by plb at violin on Tue Aug 15 12:47:33 1989
#
# This archive contains:
#	Makefile	hp7550a.l	hp7550a.doc	README		
#
# Error checking via wc(1) will be performed.

LANG=""; export LANG

echo x - Makefile
cat >Makefile <<'@EOF'
################################################################################
# @(#)Makefile	1.12 	06/09/89
#
#
awkscript=../bin/prog_fltr.awk
LIBES=-ll -lddhpgl -ldvio -lsb1 -lsb2 
save_files=Makefile hp7550a.l hp7550a.doc README 

all:hp7550a listing shar README document

hp7550a: hp7550a.c
	cc -g -v hp7550a.c $(LIBES) -o hp7550a
	size hp7550a
hp7550a.c: hp7550a.l
	lex hp7550a.l
	set -vx ; awk -f ../lib/prog_fltr.awk lex.yy.c > hp7550a.c
	rm -fr lex.yy.c
listing: hp7550a.c
	cc -C -Wc,-m -Wc,-L -Wc,-o  hp7550a.c $(LIBES) -o hp7550a 2> /dev/null | lp -s  &
	touch listing
shar: $(save_files)
	set -ex ; shar -t -v -b -c $(save_files) > ../etc/hp7550a.shar.1
	touch shar
README: hp7550a.doc
	set -ex;tbl hp7550a.doc | nroff -mm -Tlp -e > README
document: hp7550a.doc
	set -ex;tbl hp7550a.doc | nroff -mm -Tlp -e | col -l | lp -s -dlaser
	touch document
.DEFAULT:
	get ../sccs/s.$<
#
#
################################################################################
###
hp7550a.o: /usr/include/starbase.c.h
@EOF
if test "`wc -lwc <Makefile`" != '     35    123   1015'
then
	echo ERROR: wc results of Makefile are `wc -lwc <Makefile` should be      35    123   1015
fi

chmod 444 Makefile

echo x - hp7550a.l
cat >hp7550a.l <<'@EOF'
%{
/*============================================================================*/
#pragma VERSIONID "@(#)hp7550a.l	2.7	06/09/89"
#pragma COPYRIGHT_DATE "@(#) Spooled plotter filter for hp7550a. (c) 1987."
#pragma COPYRIGHT "@(#) Peter L. Berghold, Microwave Semiconductor Corp."
/*		Authorship: 					*/
/*				Peter L. Berghold 		*/
/*				Microwave Semiconductor Corporation	*/
/*				100 School House Rd.			*/
/*				Somerset, NJ	08873			*/
/*					(201) 563-6535			*/
/*				(c) Copyright 1987, All rights reserved	*/
/*									      */
/*============================================================================*/
#include <starbase.c.h>
#define BUGS	0
#define TRACE	if (BUGS == 1) 

typedef struct {
	float	x,y;
	} coords;


int	a,b,c,d;
int	i;
float	x1,y1,x2,y2;
float 	fix_y_parm(),fix_x_parm();
int	pen_state=0; /* We will start with the pen up! */
int 	plotter;
int	plotter_open=0;
int	speed=80; 
int	transparency=0;
float	basex=0.0;
float	basey=0.0;
float	maxx=1000.0;
float	maxy=1000.0;
coords	P1={80.0,320.0};
coords	P2={10080.0,7520.0};
gescape_arg	arg1,arg2;

extern int	getopt();
extern int 	optind,opterr;
extern char	*optarg;


%}
pval	[0-9]*
nval	[-0-9]*
%start PEN_AT1 PEN_AT2 IP1 IP2 IP3 IP4 SP VS 
%start LT1
%%
<INITIAL>";"	{
			/*Ignore a solitary ";" */
		}
<INITIAL>"PA"	{
		BEGIN PEN_AT1;
		}
<PEN_AT1>{pval}[","]    	{
					a=atoi(yytext);
					BEGIN PEN_AT2;
				}
<PEN_AT1>{nval}[","]    	{
					a=atoi(yytext);
					BEGIN PEN_AT2;
				}
<PEN_AT2>{nval}[";""\n"]	{
					b=atoi(yytext);
					x1=a;
					x1=fix_x_parm((float)a);
					y1=b;
					y1=fix_y_parm((float)b);
					
					if (pen_state == 0)  {
						TRACE printf("Pen moved to %1.6f,%1.6f\n",x1,y1);
						move2d(plotter,x1,y1);
						make_picture_current(plotter);
					}
					else {
						TRACE printf("Line draw to %1.6f,%1.6f\n",x1,y1);
						draw2d(plotter,x1,y1);
						make_picture_current(plotter);
						}
					BEGIN 0;
				}
<PEN_AT2>{nval}[","]		{
					b=atoi(yytext);
					x1=a;
					x1=fix_x_parm((float)a);
					y1=b;
					y1=fix_y_parm((float)b);
					if (pen_state == 0) 
							{
						TRACE printf("Pen moved to %1.6f,%1.6f\n",x1,y1);
							move2d(plotter,x1,y1);
						make_picture_current(plotter);
							}
					else {
				TRACE printf("Line draw to %1.6f,%1.6f\n",x1,y1);
						draw2d(plotter,x1,y1);
						make_picture_current(plotter);
						}
					BEGIN PEN_AT1;
				}
<PEN_AT2>{pval}[";""\n"]	{
					b=atoi(yytext);
					x1=a;
					x1=fix_x_parm((float)a);
					y1=b;
					y1=fix_y_parm((float)b);
					if (pen_state == 0) 
						{
						TRACE printf("Pen moved to %1.6f,%1.6f\n",x1,y1);
						move2d(plotter,x1,y1);
						make_picture_current(plotter);
						}
					else {
				TRACE printf("Line draw to %1.6f,%1.6f\n",x1,y1);
						draw2d(plotter,x1,y1);
						make_picture_current(plotter);
						}
					BEGIN 0;
				}
<PEN_AT2>{pval}[","]		{
					b=atoi(yytext);
					x1=a;
					x1=fix_x_parm((float)a);
					y1=b;
					y1=fix_y_parm((float)b);
					if (pen_state == 0) 
						{
						TRACE printf("Pen moved to %1.6f,%1.6f\n",x1,y1);
						move2d(plotter,x1,y1);
						make_picture_current(plotter);
						}
					else {
						TRACE printf("Line draw to %1.6f,%1.6f\n",x1,y1);
						draw2d(plotter,x1,y1);
						make_picture_current(plotter);
						}
					BEGIN PEN_AT1;
				}
<INITIAL>"IP"	{
			BEGIN IP1;
		}
<IP1>{pval}[","]	|
<IP1>{nval}[","]	{
			a=atoi(yytext);
			BEGIN IP2;
		}
<IP2>{pval}[","]	|
<IP2>{nval}[","]	{
			b=atoi(yytext);
			BEGIN IP3;
		}
<IP3>{pval}[","]	|
<IP3>{pval}[","]	{
			c=atoi(yytext);
			BEGIN IP4;
		}
<IP4>{pval}[";""\n"]	|
<IP4>{nval}[";""\n"]	{
			d=atoi(yytext);
			basex=a;
			basey=b;
			maxx=c;
			maxy=d;
			TRACE printf("Scaling set: (x1,y1)=%4.3f,%4.3f ",basex,basey);
			TRACE printf("(x2,y2)=%4.3f,%4.3f\n",maxx,maxy);
			BEGIN 0;
		}
<INITIAL>"PG"[";""\n"]	{
			clear_view_surface(plotter);
			TRACE printf("Plotter paper fed.");
		}
<INITIAL>"VS"	{
			BEGIN VS;
		}
<VS>{pval}[";""\n"]	{
			speed=atoi(yylex);
			if (! transparency ) {
				arg1.i[0]=speed; 
				arg2.i[0]=0; 
				gescape(plotter,HPGL_SET_PEN_SPEED,&arg1,&arg2); 
			}
			BEGIN 0;
		}
<INITIAL>[a-zA-Z0-9",""."";""\n"]	{
			for (i=0;i<yyleng;i++) arg1.c[i]=yytext[i];
			arg2.i[0]=yyleng;
			gescape(plotter,HPGL_WRITE_BUFFER,&arg1,&arg2);
		}
%%
float fix_x_parm(xx)
float xx;
{
	float tmp;
	float range;
	TRACE printf("fix_x_parm: value passed: %3.3f\n",xx);
	tmp=(xx+15710.0)/31420.0;

	TRACE printf("Returned value= %12.6f\n",tmp);

	return(tmp);

}
float fix_y_parm(xx)
float xx;
{
	float tmp;
	float range;

	TRACE printf("fix_y_parm: value passed: %3.3f\n",xx);
	
	tmp=(xx+10060.0)/20120.0;
	TRACE printf("returned value= %12.6f\n",tmp);

	return(tmp);
}

main(argc,argv)
int	argc;
char	*argv[];
{
	int 	dummy;
	int	c;
	int	flag=0;

	while((c=getopt(argc,argv,"ts:"))!=EOF)
		switch(c){
		case 't':
			speed=10; /* Let's go real slow for overheads! */				transparency=1;
			break;
		case 's':
			speed=atoi(optarg);
			break;
		case '?':
			flag++;
			break;

		}

	
	plotter=gopen("/dev/hpib/1a7",OUTDEV,"hpgl",INIT); 
	mapping_mode(plotter,1); 
	
	vdc_extent(plotter,0.0,0.0,0.0,1.0,1.0,1.0); 
	fprintf(stderr,"Setting plotter speed to %d CM/SEC\n",speed);
	
	arg1.i[0]=speed; 
	arg2.i[0]=0; 
	gescape(plotter,HPGL_SET_PEN_SPEED,&arg1,&arg2); 
		

	while((dummy=yylex())!=NULL);

	strcpy(arg1.c,"PG;");
	arg2.i[0]=3;
	gescape(plotter,HPGL_WRITE_BUFFER,&arg1,&arg2);

	plotter=gclose(plotter);
}
@EOF
if test "`wc -lwc <hp7550a.l`" != '    261    488   5436'
then
	echo ERROR: wc results of hp7550a.l are `wc -lwc <hp7550a.l` should be     261    488   5436
fi

chmod 444 hp7550a.l

echo x - hp7550a.doc
cat >hp7550a.doc <<'@EOF'
.PH "'hp7550a 1.8 06/09/89''Printed: \*(DT'"
.PF "'MSC, ATE Group'[%]'Peter L. Berghold'"
.H 1 "The problem:"
To spool the output of a STARBASE driven graphics program to a plotter, one needs to use the HPGL graphics drivers.
As a result, this spooled output will not result in the expected results on the  hp7550a plotter as well as other plotters.
.P 1
The reason for this is that the HPGL driver expects to be sending its output to an E sized plotter.
The reality of this may be (and probably is) that one is attempting to plot to an A sized plotter as in the case of an hp7550a plotter.
Where the difficulty lies is in how "P1" and "P2", the lower left hand and upper right hand corners respectively, on the plotter are defined in plotter units.
.DS
.nf
.sp 2

.PS
move right 0.2
P1CORN: "P1 " rjust
line up 2.0 then right 5.0 
P2CORN:
" P2" ljust
line from P2CORN -0,0 down 2.0 then left 5.0
.PE

	HPGL driver: 
.EQ
   	             P1 sub {xy}=[-15710,-10060]
	             P2 sub {xy}=[15710,10060]

.EN
.sp 2
	HP7550a plotter:  [For "A" sized paper] 
.EQ
	                 P1 sub {xy}=[80,320]
	                 P2 sub {xy}=[10080,7520]

.EN
.sp 2
	Above values in logical plotter units.
.fi
.sp 2
.FG "P1 & P2 Illustrated."
.DE
.bp
.sp 2
.H 1 "The solution:"
The spooled plot data is piped through a filter that will plot directly to the plotter via the STARBASE device drivers.
This filter is driven by the line printer spooler via the interface script.
.P 1
Scaling is performed to turn the integer value coordinate data into values between 0 and 1 which STARBASE will accept as values to be plotted.
Also the plot data in the form of HPGL instructions is parsed for the applicable instructions to be translated into STARBASE function calls.
.H 1 "The nitty gritty:"
The three basic HPGL instructions that effect the plotting are as follows:
.sp 3
.BL
.LI
PU - Pen up.
.LI
PD - Pen down.
.LI
PA - Pen at.
.LE
.sp 2
A lexical analysis program was written through the use of LEX to perform the parsing of the HPGL instructions.
The xy coordinate information is extracted and the scaling performed.
.nf
.sp 2
.EQ
	x'={x+15710} over 31420
	y'={y+10060} over 20120
.EN
.sp 2
.fi
.FG "Equations used to normalize the xy coordinate data parsed from the HPGL data file stream."
.sp 2
The action that takes place on these xy coordinate data is dependant on the instruction itself, and the last PU or PD HPGL instruction parsed.
.P 1
When the lexical analysis program encounters either a PU or a PD instruction a flag is set accordingly.
When a PA is encountered and the flag is a FALSE condition as a result of a PU instruction the pen is moved with no line being drawn.
When a PD is encountered and the flag is a TRUE condition a line is drawn.
Simple.
.P 1
The other instruction that is parsed is the SP (Select Pen) instruction.
This allows the plotting of multi-colored plots. 
Pen numbers of 0-9 are allowed.
.H 1 "The last word:"
There are many other featured instructions of the HPGL instruction set that are not parsed, but are probably not needed.
They will be added in future releases of this package.
.TC
@EOF
if test "`wc -lwc <hp7550a.doc`" != '     87    554   3118'
then
	echo ERROR: wc results of hp7550a.doc are `wc -lwc <hp7550a.doc` should be      87    554   3118
fi

chmod 444 hp7550a.doc

echo x - README
cat >README <<'@EOF'



       hp7550a 1.8 06/09/89                Printed: August 15, 1989



       1.  TTTThhhheeee pppprrrroooobbbblllleeeemmmm::::

       To spool the output of a STARBASE driven graphics program to
       a plotter, one needs to use the HPGL graphics drivers.  As a
       result, this spooled output will not result in the expected
       results on the  hp7550a plotter as well as other plotters.

            The reason for this is that the HPGL driver expects to
       be sending its output to an E sized plotter.  The reality of
       this may be (and probably is) that one is attempting to plot
       to an A sized plotter as in the case of an hp7550a plotter.
       Where the difficulty lies is in how "P1" and "P2", the lower
       left hand and upper right hand corners respectively, on the
       plotter are defined in plotter units.




       move right 0.2
       P1CORN: "P1 " rjust
       line up 2.0 then right 5.0
       P2CORN:
       " P2" ljust
       line from P2CORN -0,0 down 2.0 then left 5.0

               HPGL driver:


               HP7550a plotter:  [For "A" sized paper]


               Above values in logical plotter units.


                     FFFFiiiigggguuuurrrreeee 1111....  P1 & P2 Illustrated.



















       MSC, ATE Group              [1]            Peter L. Berghold







       hp7550a 1.8 06/09/89                Printed: August 15, 1989



       2.  TTTThhhheeee ssssoooolllluuuuttttiiiioooonnnn::::

       The spooled plot data is piped through a filter that will
       plot directly to the plotter via the STARBASE device
       drivers.  This filter is driven by the line printer spooler
       via the interface script.

            Scaling is performed to turn the integer value
       coordinate data into values between 0 and 1 which STARBASE
       will accept as values to be plotted.  Also the plot data in
       the form of HPGL instructions is parsed for the applicable
       instructions to be translated into STARBASE function calls.


       3.  TTTThhhheeee nnnniiiittttttttyyyy ggggrrrriiiittttttttyyyy::::

       The three basic HPGL instructions that effect the plotting
       are as follows:




          o+ PU - Pen up.

          o+ PD - Pen down.

          o+ PA - Pen at.


       A lexical analysis program was written through the use of
       LEX to perform the parsing of the HPGL instructions.  The xy
       coordinate information is extracted and the scaling
       performed.




       FFFFiiiigggguuuurrrreeee 2222....  Equations used to normalize the xy coordinate
                  data parsed from the HPGL data file stream.


       The action that takes place on these xy coordinate data is
       dependant on the instruction itself, and the last PU or PD
       HPGL instruction parsed.

            When the lexical analysis program encounters either a
       PU or a PD instruction a flag is set accordingly.  When a PA
       is encountered and the flag is a FALSE condition as a result
       of a PU instruction the pen is moved with no line being
       drawn.  When a PD is encountered and the flag is a TRUE
       condition a line is drawn.  Simple.



       MSC, ATE Group              [2]            Peter L. Berghold







       hp7550a 1.8 06/09/89                Printed: August 15, 1989



            The other instruction that is parsed is the SP (Select
       Pen) instruction.  This allows the plotting of multi-colored
       plots. Pen numbers of 0-9 are allowed.


       4.  TTTThhhheeee llllaaaasssstttt wwwwoooorrrrdddd::::

       There are many other featured instructions of the HPGL
       instruction set that are not parsed, but are probably not
       needed.  They will be added in future releases of this
       package.











































       MSC, ATE Group              [3]            Peter L. Berghold











                                 CONTENTS


       1.  The problem:.........................................  1

       2.  The solution:........................................  2

       3.  The nitty gritty:....................................  2

       4.  The last word:.......................................  3












































                                  - i -














                             LIST OF FIGURES


       Figure 1.  P1 & P2 Illustrated...........................  1

       Figure 2.  Equations used to normalize the xy coordinate
                  data parsed from the HPGL data file
                  stream........................................  2











































                                  - ii -




@EOF
if test "`wc -lwc <README`" != '    330    572   4910'
then
	echo ERROR: wc results of README are `wc -lwc <README` should be     330    572   4910
fi

chmod 600 README

exit 0


^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> 


           _   /|
           \`o_O'      Formerly of MSC, Now with AT&T.   
             ( )        UUCP: ..!att!violin!plb
              U
          Aachk!
              Phft!

stroyan@hpfcdc.HP.COM (Mike Stroyan) (08/18/89)

> Here is a filter that I whipped up to fix problems with spooling to HP
> plotters from STARBASE.  The problem that it fixes is one of sizing.
> Normally STARBASE spools thinking it is working with E size paper.  This
> is fine if you really are, but if you are using an A size plotter, most
> of your plot ends up off the page.  So, here it is...

The earliest of the Starbase releases did use a constant plotter size
when spooling.  The problem has been corrected since at least as far
back as the 6.2 series 300 and 2.0 series 800 releases.  The current
Starbase HPGL driver issues an "SC" command in spool files which causes
the plotter to scale the D size coordinates in the output to the
actual size of plotter.  The scaling can be overriden by calling
"set_p1_p2" with "METRIC" coordinates.  Perhaps you are dealing with
an old release of the driver or with a program that uses "set_p1_p2"
with "METRIC".  A spooled file that does not scale to the plotter
size could be made to scale by adding an "SC<xmin>,<xmax>,<ymin>,<ymax>"
command to the front and filtering out other SC commands in the file.

If you are interested in spooling output for later interpretation into
Starbase calls, then the hpcgm driver would be more convenient.  CGM
files written by the hpcgm driver can be interpreted by calling
"cgm_to_starbase".  There is an example CGM interpreter program in
"/usr/lib/starbase/demos/interp_cgm.c".

Mike Stroyan, stroyan@hpfcla.hp.com

plb@cbnewsi.ATT.COM (peter.l.berghold) (08/22/89)

In article <5570271@hpfcdc.HP.COM> stroyan@hpfcdc.HP.COM (Mike Stroyan) writes:
>The earliest of the Starbase releases did use a constant plotter size
>when spooling.  The problem has been corrected since at least as far
>back as the 6.2 series 300 and 2.0 series 800 releases.  The current

I was not aware of that as I am still hearing from folks wanting to know how I 
fixed that problem at my last job.   Not everybody is on updates! :-)

Pete


^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|     _   /|    || Peter L. Berghold, AT&T, HRSAG, UUCP: att!violin!plb        |
|     \`o_O'    ||============================================================ |
|       ( )     || Disclaimer: If you find an opinion in this posting somewhere|
|        U      || it is no doubt mine, and not my employers.  I'm the only    |
|    Aachk!     || person crazy enough to take this stand!                     |
|        Phft!  ||                                                             |
VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV