v21i041: 2D graphic system with table beautifier, Part10/14
Rich Salz
rsalz at uunet.uu.net
Sat Mar 24 06:21:47 AEST 1990
Submitted-by: Steve Grubb <uunet!lsr-vax!scg>
Posting-number: Volume 21, Issue 41
Archive-name: ipl/part10
# ipl part10
# This is a shell archive.
# Remove everything above and including the cut line.
# Then run the rest of the file through sh.
#---------------------- cut here -----------------------------
#!/bin/sh
# shar: Shell Archiver
# Run the following text with /bin/sh to create:
# src/shading.h
# src/siplmenu.c
# src/sunv.c
# src/template.h
# src/text.c
cat << \SHAR_EOF > src/shading.h
/* shading .... */
static short w_im_00[] = { /* black */
#include <images/square_black.pr>
};
mpr_static( w_s_00, 16, 16, 1, w_im_00 );
static short w_im_10[] = {
/* Format_version=1, Width=16, Height=16, Depth=1, Valid_bits_per_item=16
*/
0x7F7F,0xFFFF,0xF7F7,0xFFFF,0x7F7F,0xFFFF,0xF7F7,0xFFFF,
0x7F7F,0xFFFF,0xF7F7,0xFFFF,0x7F7F,0xFFFF,0xF7F7,0xFFFF
};
mpr_static( w_s_10, 16, 16, 1, w_im_10 );
static short w_im_20[] = {
/* Format_version=1, Width=16, Height=16, Depth=1, Valid_bits_per_item=16
*/
0x7777,0xFFFF,0x7777,0xFFFF,0x7777,0xFFFF,0x7777,0xFFFF,
0x7777,0xFFFF,0x7777,0xFFFF,0x7777,0xFFFF,0x7777,0xFFFF
};
mpr_static( w_s_20, 16, 16, 1, w_im_20 );
static short w_im_30[] = {
/* Format_version=1, Width=16, Height=16, Depth=1, Valid_bits_per_item=16
*/
0x7DF7,0xDF7D,0xFBEF,0xEFBE,0xBEFB,0xF7DF,0x7DF7,0xDF7D,
0xFBEF,0xEFBE,0xBEFB,0xF7DF,0x7DF7,0xDF7D,0xFBEF,0xEFBE
} ;
mpr_static( w_s_30, 16, 16, 1, w_im_30 );
static short w_im_40[] = {
/* Format_version=1, Width=16, Height=16, Depth=1, Valid_bits_per_item=16
*/
0x7777,0xDDDD,0x7777,0xDDDD,0x7777,0xDDDD,0x7777,0xDDDD,
0x7777,0xDDDD,0x7777,0xDDDD,0x7777,0xDDDD,0x7777,0xDDDD
} ;
mpr_static( w_s_40, 16, 16, 1, w_im_40 );
static short w_im_50[] = {
/* Format_version=1, Width=16, Height=16, Depth=1, Valid_bits_per_item=16
*/
0xEEEE,0xAAAA,0xAAAA,0xBBBB,0xEEEE,0xAAAA,0xAAAA,0xBBBB,
0xEEEE,0xAAAA,0xAAAA,0xBBBB,0xEEEE,0xAAAA,0xAAAA,0xBBBB
};
mpr_static( w_s_50, 16, 16, 1, w_im_50 );
static short w_im_60[] = {
/* Format_version=1, Width=16, Height=16, Depth=1, Valid_bits_per_item=16
*/
0x5555,0x5555,0x5555,0x5555,0x5555,0x5555,0x5555,0x5555,
0x5555,0x5555,0x5555,0x5555,0x5555,0x5555,0x5555,0x5555
};
mpr_static( w_s_60, 16, 16, 1, w_im_60 );
static short w_im_70[] = {
/* Format_version=1, Width=16, Height=16, Depth=1, Valid_bits_per_item=16
*/
0x8888,0x2222,0x8888,0x2222,0x8888,0x2222,0x8888,0x2222,
0x8888,0x2222,0x8888,0x2222,0x8888,0x2222,0x8888,0x2222
};
mpr_static( w_s_70, 16, 16, 1, w_im_70 );
static short w_im_80[] = {
#include <images/square_17.pr>
/* Format_version=1, Width=16, Height=16, Depth=1, Valid_bits_per_item=16 6
*/
/* 0x8888,0x2222,0x8888,0x0000,0x8888,0x2222,0x8888,0x0000,
0x8888,0x2222,0x8888,0x0000,0x8888,0x2222,0x8888,0x0000
*/
};
mpr_static( w_s_80, 16, 16, 1, w_im_80 );
static short w_im_90[] = {
/* Format_version=1, Width=16, Height=16, Depth=1, Valid_bits_per_item=16
*/
0x8080,0x0000,0x0808,0x0000,0x8080,0x0000,0x0808,0x0000,
0x8080,0x0000,0x0808,0x0000,0x8080,0x0000,0x0808,0x0000
};
mpr_static( w_s_90, 16, 16, 1, w_im_90 );
static short w_im1_0[] = { /* black */
/* Format_version=1, Width=16, Height=16, Depth=1, Valid_bits_per_item=16
*/
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
};
mpr_static( w_s1_0, 16, 16, 1, w_im1_0 );
SHAR_EOF
############################
cat << \SHAR_EOF > src/siplmenu.c
#include "ipl.x"
siplmenu( proc )
char proc[];
{
char p1[80], p2[80];
if( strcmp( proc, "Endoffile" )==0 ) while( 1 ) {
message( Controlfile,
"Press RETURN for next file,",
"enter another file to view,",
"or enter 'q' to quit." );
get_string_box( p2, "> ", 8.0, 9.5, 11.0, 9.8 );
if( strcmp( p2, "q" )==0 ) { gdp_exit(); }
else {
message( "Next control file:", p2, "", "" );
if( ! restart( p2 ) ) { sleep( 3 ); continue; }
NTshow();
break;
}
}
if( strcmp( proc, "Pagebreak" )==0 ) {
message( "SIPL graphics previewer", "", "More..", "Press RETURN.." );
get_string_box( p2, "> ", 8.0, 9.5, 11.0, 9.8 );
}
}
SHAR_EOF
############################
cat << \SHAR_EOF > src/sunv.c
/* sunview.c
IPL sunview driver. (c) 1989 Steve Grubb.
Use compile option -DNOEVENTS if you do not need to handle mouse/keyboard events.
Otherwise, you have to write a function handle_event( x, y, e ) that will get
called whenever waiting for an event. Arguments: x and y are double values indicating
the position of the mouse at the time of the event, in your units; e is the integer
event identifier (see Sunview Pixwind guide), generally the ascii value of keys, and
other values for mouse events.
User origin is lower-left.
*/
#include <stdio.h>
#include <ctype.h>
#include <sys/file.h>
#include <suntool/sunview.h> /* sun stuff */
#include <suntool/canvas.h> /* sun stuff */
#include "shading.h"
#define SUNV_FONT_PATH "/usr/lib/fonts/fixedwidthfonts"
#define MAX_D_ROWS 1000
#define AREA_WIDTH 900
#define AREA_HEIGHT 900
#define WHITE 0
#define BLACK 255
double xscale, yscale;
double xsca_inv(), ysca_inv();
double oldx, oldy;
int color, backcolor;
/* polygon vertexes */
struct pr_pos vlist[MAX_D_ROWS];
int nv = 0;
/* sunview variables.. */
Frame w_fr;
Canvas w_cvs;
int w_width, w_height;
struct rect w_rect; /* drawing area rect */
struct pixwin *w_pw; /* window handle */
Pixfont *w_font; /* current font */
int w_ppc; /* pixels per character (across) for current font */
Pr_brush w_br, *w_brush = &w_br ; /* line width */
Pr_texture w_tex, *w_texture = &w_tex; /* line dash pattern */
static void SVevent();
int w_waitflag = 0;
short w_dash[4][10][6]= {
{ {1}, {1,1}, {3,1}, {5,1}, {2,1,1,1}, {4,1,1,1}, {6,1,1,1},
{2,1,1,1,1,1}, {4,1,1,1,1,1}, {6,1,1,1,1,1} },
{ {2}, {2,2}, {6,2}, {10,2}, {4,2,2,2}, {8,2,2,2}, {12,2,2,2},
{4,2,2,2,2,2}, {8,2,2,2,2,2}, {12,2,2,2,2,2} },
{ {3}, {3,3}, {9,3}, {15,3}, {6,3,3,3}, {12,3,3,3}, {18,3,3,3},
{6,3,3,3,3,3}, {12,3,3,3,3,3}, {18,3,3,3,3,3} },
{ {4}, {4,4}, {12,4}, {20,4}, {8,4,4,4}, {16,4,4,4}, {24,4,4,4},
{8,4,4,4,4,4}, {16,4,4,4,4,4}, {24,4,4,4,4,4} }
};
/* icon */
static short ic_image[258] = {
#include "ipl.icon"
};
mpr_static(gfxic_mpr, 64, 64, 1, ic_image);
static struct icon icon = {64, 64, (struct pixrect *)NULL, 0, 0, 64, 64,
&gfxic_mpr, 0, 0, 0, 0, NULL, (struct pixfont *)NULL,
ICON_BKGRDCLR};
/* =============================================== */
/* SVsetup()-- initialize the window and parameters */
SVsetup( x_max, y_max )
double x_max, y_max;
{
w_fr = window_create( NULL, FRAME,
WIN_HEIGHT, AREA_HEIGHT, WIN_WIDTH, AREA_WIDTH, WIN_X, 0, WIN_Y, 0,
FRAME_LABEL, "sipl", FRAME_ICON, &icon, 0 );
w_cvs = window_create( w_fr, CANVAS, WIN_EVENT_PROC, SVevent, 0 );
window_set( w_cvs, WIN_CONSUME_KBD_EVENT, WIN_ASCII_EVENTS, 0 );
w_pw = canvas_pixwin( w_cvs );
color = BLACK;
backcolor = WHITE;
w_height = AREA_HEIGHT - 20; /* in pixels */
w_width = AREA_WIDTH; /* in pixels */
xscale = (double)(w_width) / (x_max);
yscale = (double)(w_height) / (y_max);
w_texture->pattern = w_dash[0][0];
w_brush->width = 1;
window_set( w_fr, WIN_SHOW, TRUE, 0 );
(void) notify_dispatch();
}
/* ====================== */
static void SVevent( ecvs, e )
Canvas ecvs;
Event *e;
{
int x1, y1, eid;
#ifndef NOEVENT
x1 = event_x( e );
y1 = event_y( e );
if( event_is_ascii(e) ) {
w_waitflag = handle_event( xsca_inv( x1 ), ysca_inv( y1 ), event_action( e ) );
}
if( event_is_button(e) ) {
/* use generic button identifiers.. */
if( event_action(e) == MS_LEFT ) eid = 1001;
if( event_action(e) == MS_MIDDLE ) eid = 1002;
if( event_action(e) == MS_RIGHT ) eid = 1003;
w_waitflag = handle_event( xsca_inv( x1 ), ysca_inv( y1 ), eid );
}
#endif
}
/* ====================== */
SVwait()
{
w_waitflag = 0;
#ifndef NOEVENT
while( ! w_waitflag ) {
(void) notify_dispatch();
usleep( 10000 ); /* check notifier every .01 seconds */
}
#endif
}
/* ==================== scale in x to window size */
xsca( f )
double f;
{
int iout;
iout = (int) (f * xscale);
return( iout );
}
/* ==================== inverse of xsca */
double xsca_inv( i )
int i;
{
double out;
out = (double) i / xscale;
return( out );
}
/* ==================== scale in y to window size */
ysca( f )
double f;
{
int iout;
iout = w_height - (int) (f * yscale);
return( iout );
}
/* ===================== inverse of ysca */
double ysca_inv( i )
int i;
{
double out;
out = (double)(w_height-i) / yscale;
return( out );
}
/* ==================== clear the display */
SVclear()
{
pw_writebackground( w_pw, 0, 0, w_width, w_height, (PIX_SRC | PIX_COLOR(backcolor)) );
}
/* ==================== line to */
SVlineto(x,y)
double x, y;
{
int a, b, c, d;
a = xsca( oldx ); b = ysca( oldy ); c = xsca( x ); d = ysca( y );
pw_line( w_pw, a, b, c, d, w_brush, w_texture, (PIX_SRC | PIX_COLOR(color)) );
oldx=x;
oldy=y;
}
/* ===================== moveto */
SVmoveto(x,y)
double x, y;
{
oldx = x;
oldy = y;
}
/* ===================== dot */
SVdot(x,y)
double x, y;
{
pw_put( w_pw, xsca(x), ysca(y), color );
}
/* ===================== read pixel value */
SVread(x,y)
double x, y;
{
pw_get( w_pw, xsca(x), ysca(y) );
}
/* ===================== set point size of type */
/* SVpointsize */
SVpointsize( p )
int p;
{
char fontdir[60], buf[65];
strcpy( fontdir, SUNV_FONT_PATH );
if( p <= 6 ) { p = 6; w_ppc = 4; }
if( p == 7 || p == 8 ) { p = 7; w_ppc = 6; }
if( p == 9 || p == 10 ) { p = 10; w_ppc = 7; }
if( p == 11 ) { w_ppc = 7; }
if( p == 12 || p == 13 ){ p = 12; w_ppc = 8; }
if( p == 14 || p == 15 ){ p = 14; w_ppc = 9; }
if( p == 16 || p == 17 ){ p = 16; w_ppc = 10; }
if( p >= 18 && p <= 22 ){ p = 18; w_ppc = 11; }
if( p > 22 ){ p = 24; w_ppc = 14; }
if( p < 10 ) sprintf( buf, "%s/screen.r.%d", fontdir, p );
else if( p == 11 ) sprintf( buf, "%s/screen.r.%d", fontdir, p );
else sprintf( buf, "%s/cour.b.%d", fontdir, p );
if( w_font != (Pixfont *) 0 ) pf_close( w_font );
w_font = pf_open( buf );
if( w_font == NULL ) { w_font = pw_pfsysopen(); }
return( w_ppc );
}
/* ==================== display left adjusted text starting at current position */
SVtext( s, aw )
char s[];
double *aw; /* actual string width in inches (sent back) */
{
pw_ttext( w_pw, xsca(oldx), ysca(oldy), (PIX_SRC | PIX_COLOR(color)), w_font, s );
oldx+= (double)((strlen(s)-1)* w_ppc );
*aw = xsca_inv( (strlen(s)-1) * w_ppc );
}
/* ==================== display centered text */
SVcentext( s, w, x, aw )
char s[];
double w;
double *x; /* actual X starting point in inches (sent back) */
double *aw; /* actual string width in inches (sent back) */
{
double width;
strip_ws( s );
width = xsca_inv( w_ppc*strlen( s ) );
SVmoveto( oldx+((w-width)/2.0), oldy );
SVtext( s, aw );
*x = xsca_inv((int)( oldx+((w-width)/2.0) ) );
}
/* ==================== display right-justified text */
SVrightjust( s, w, x, aw )
char s[];
double w;
double *x; /* actual X starting point in inches (sent back) */
double *aw; /* actual string width in inches (sent back) */
{
double width;
strip_ws( s );
width = xsca_inv( w_ppc*strlen( s ) );
SVmoveto( oldx+(w-width), oldy );
SVtext( s, aw );
*x = xsca_inv((int)(oldx+(w-width) ));
}
/* ==================== set the drawing color */
SVcolor( d, b )
int d, b;
{
color = d; backcolor = b;
}
/* ==================== add to "fill path" */
SVpath( x, y )
double x, y;
{
if( nv == 0 ) { vlist[0].x = xsca( oldx ); vlist[0].y = ysca( oldy ); nv++; }
vlist[nv].x = xsca(x);
vlist[nv].y = ysca(y);
nv++;
}
/* ==================== fill prev. defined polygon path with color c */
SVshade( c )
double c;
{
int n[1];
Pixrect *pr;
if( c >= 0.0 && c <= 1.0 ) {
if( c == 1.0 ) pr = &w_s1_0;
else if( c > .95 ) pr = &w_s_90;
else if( c > .90 ) pr = &w_s_80;
else if( c > .85 ) pr = &w_s_70;
else if( c > .75 ) pr = &w_s_60;
else if( c > .65 ) pr = &w_s_50;
else if( c > .55 ) pr = &w_s_40;
else if( c > .45 ) pr = &w_s_30;
else if( c > .35 ) pr = &w_s_20;
else if( c > .15 ) pr = &w_s_10;
else if( c >= 0.0 ) pr = &w_s_00;
else pr = (Pixrect *) 0;
}
n[0] = nv;
pw_polygon_2( w_pw, 0, 0, 1, n, vlist, (PIX_SRC | PIX_COLOR((int)(c))), pr, 0, 0 );
nv = 0;
}
/* ========= set line dotting attribs ============= */
SVlinetype( t, w, mag )
char t[];
double w, mag;
{
int i, j, k;
if( strlen( t ) < 1 ) return( 0 );
if( mag < 1 ) mag = 1;
if( mag > 4 ) mag = 4;
w_brush->width = (int)((w*1.6)+0.5);
w_texture->pattern = w_dash[ (int)mag-1 ][ atoi( t ) % 10 ];
}
/* ========= batch calls for efficiency ========== */
SVbatch_on()
{
(void) notify_dispatch();
pw_batch_on( w_pw );
}
SVbatch_off()
{
(void) notify_dispatch();
pw_batch_off( w_pw );
}
/* =========================================== */
/* sets up color map, 0 = white, 255 = black, color mixes from 1 to 114 */
setup_colormap()
{
u_char red[256], grn[256], blu[256];
int i, j;
red[0] = (u_char) 0; /* background color */
grn[0] = (u_char) 0;
blu[0] = (u_char) 0;
for (i=0; i<19; i++) {
red[i + 1] = (u_char) ( 0.99 * 256 ); /* ramp to yellow */
grn[i + 1] = (u_char) ( 0.055*i * 256 );
blu[i + 1] = (u_char) ( 0.0 * 256 );
red[i + 20] = (u_char) ( (0.99-0.055*i) * 256 ); /* ramp to green */
grn[i + 20] = (u_char) ( 0.99 * 256 );
blu[i + 20] = (u_char) ( 0.0 * 256 );
red[i + 39] = (u_char) ( 0.0 * 256 ); /* ramp to turqouise */
grn[i + 39] = (u_char) ( 0.99 * 256 );
blu[i + 39] = (u_char) ( 0.055*i * 256 );
red[i + 58] = (u_char) ( 0.0 * 256 ); /* ramp to blue */
grn[i + 58] = (u_char) ( ( 0.99-0.055*i ) * 256 );
blu[i + 58] = (u_char) ( 0.99 * 256 );
red[i + 77] = (u_char) ( 0.055*i * 256 ); /* ramp to violet */
grn[i + 77] = (u_char) ( 0.0 * 256 );
blu[i + 77] = (u_char) ( 0.99 * 256 );
red[i + 96] = (u_char) ( 0.99 * 256 ); /* ramp to red */
grn[i + 96] = (u_char) ( 0.0 * 256 );
blu[i + 96] = (u_char) ( (0.99-0.055*i) * 256 );
}
for( i = 115, j = 0; i < 125; i++, j+= 25 ) red[i] = blu[i] = grn[i] = j;
for( i = 125, j = 255; i < 256; i++ ) { j = abs(j-255); red[i] = blu[i] = grn[i] = j ; }
pw_setcmsname( w_pw, "dots" );
pw_putcolormap( w_pw, 0, 256, red, grn, blu );
}
SHAR_EOF
############################
cat << \SHAR_EOF > src/template.h
char *Template[350] = { "Proc Areadef:",
"Area.bottom: 0 to 12 : : Units are inches from lower left.",
"Area.file: token : : file containing user defined areas",
"Area.left: 0 to 12 : :",
"Area.rectangle: 2coordpair : : alternately, two coord-pairs (low left, up right) rectangle",
"Area.right: 0 to 12 : : | These four must all be used together.",
"Area.top: 0 to 12 : : ",
"Area: token : standard : preset graphics area name (see area.coords)",
"Clone: token : : to inherit parms from a previous Areadef.",
"Font: font : : standard font to be used on axis labels etc.",
"Frame: {single,double,none} : none : frame of graphic area ",
"Saveas: token : : to give this Areadef a name so it can be Cloned later.",
"Shade: color : : shade of graphic area",
"Subtitle.above: -12 to 12 (T) : 0.02 : distance of 1st area title line above window top, inches",
"Subtitle.font: font : : font for area title",
"Subtitle.justify: {center,left,right} : left : title to be centered, left, or right justified",
"Subtitle.size: charsize : 10 : char size of title",
"Subtitle: text : : area title",
"Xaxis: {bottom,top,both,none} : bottom : where to draw X axis",
"Xinc: number : 1 : increment.. put a tic mark every n units",
"Xlabel.position: -12 to 12 (X) : 0.6 : distance of x axis identifier from window bottom, inches",
"Xlabel.size: charsize : 10 : char size for x axis identifier",
"Xlabel: text : : x axis identifier",
"Xmax: number : : maximum in x",
"Xmin: number : 0 : minimum in x",
"Xscaletype: {linear,log,yymm} : linear : x scaling discipline",
"Xstart.0or1: 0 to 10 : 0 : tell x stubs where to start ",
"Xstub.fileline: number : 0 : line in a stub text file to start at",
"Xstub.grid: {line,shade,none,wline} : none : form a grid of lines or shaded blocks",
"Xstub.minor: 0 to 100 : 0 : create this many divisions between regular tics",
"Xstub.nolonetics: {y,n} : y : if y, no tics will be produced where there are no stubs",
"Xstub.shade: color : 0.98 : shade for the shaded blocks",
"Xstub.size: charsize : 7 : char size for stubs",
"Xstub.startmonth: 1 to 12 : : for month stubs, leftmost month",
"Xstub.startyear: 0 to 99 : : for month stubs, leftmost year ",
"Xstub.stubs: {bottom,top,both,none} : bottom : produce labeled axis on left, right, or both sides",
"Xstub.ticlen.minor: -2 to 2 (X) : 0.035 : length of minor tics in inches (negative inverts it)",
"Xstub.ticlen: -2 to 2 (X) : 0.08 : length of major tics in inches (negative inverts it)",
"Xstub.tics: {bottom,top,both,none} : bottom : which side(s) to put tics on",
"Xstub.yofs: -2 to 2 (X) : 0.2 : distance of stubs up(-) or down(+) from x axis in inches",
"Xstub: text : num : stubs for tics (num, a file name, a var, or literal)",
"Xticfmt: token : %4.0f : format for display of numbers in X (like printf)",
"Yaxis: {left,right,both,none} : left : where to draw Y axis",
"Yinc: number : 1 : increment.. put a tic mark every n units",
"Ylabel.position: -12 to 12 (Y) : 0.6 : distance of y axis identifier from window left, inches",
"Ylabel.size: charsize : 10 : char size for y axis identifier",
"Ylabel: text : : y axis identifier",
"Ymax: number : : maximum in y",
"Ymin: number : 0 : minimum in y",
"Yscaletype: {linear,log} : linear : y scaling discipline",
"Ystart.0or1: 0 to 10 : 0 : tell y stubs to start at 0 ",
"Ystub.fileline: number : 0 : line in a stub text file to start at",
"Ystub.grid: {line,shade,none,wline} : none : form a grid of lines or shaded blocks",
"Ystub.minor: 0 to 100 : 0 : create this many divisions between regular tics",
"Ystub.nolonetics: {y,n} : y : if y, no tics will be produced where there are no stubs",
"Ystub.shade: color : 0.98 : shade for the shaded blocks",
"Ystub.size: charsize : 7 : char size for stubs",
"Ystub.stubs: {left,right,both,none} : left : produce labeled axis on left, right, or both sides",
"Ystub.ticlen.minor: -2 to 2 (Y) : 0.035 : length of minor tics in inches (negative inverts it)",
"Ystub.ticlen: -2 to 2 (Y) : 0.08 : length of major tics in inches (negative inverts it)",
"Ystub.tics: {left,right,both,none} : left : which side(s) to put tics on",
"Ystub.xofs: -2 to 2 (Y) : 0.1 : distance from y axis to right side of y stub",
"Ystub: text : num : stubs for tics (num, a file name, a var, or literal)",
"Yticfmt: token : %4.0f : format for display of numbers in Y (like printf)",
"Proc Arrow:",
"Clone: token : :",
"Points: 2coordpair : : x1, y1, x2, y2. Arrowhead will be at (x2, y2)",
"Saveas: token : : ",
"Proc Bargraph:",
"Clone: token : : to clone an earlier proc's set of parameters",
"Field: dfield (list8) (M) : : a field for each bar or subbar",
"Format: {single,cluster,stack} : single : single bars, clusters of bars, or bars stacked up",
"Idfield.position: -1 to 1 : 0.02 : distance of label above (or below) top of bar (inches)",
"Idfield.size: charsize : 6 : char size of labels",
"Idfield: dfield (list8) : : bars can be labeled using these field(s)",
"Killwild: number : : if a data value greater than this is found, abort ",
"Outlinebars: {y,n} : y : outline for each bar",
"Saveas: token : : to save a set of parms for cloning",
"Segment: {y,n} : n : segment bars at axis tics",
"Separation.sub: -2 to 2 : 0.03 : separation factor between sub-bars in a cluster",
"Separation: -2 to 2 : 0.20 : separation factor between major bar spaces ",
"Shade: color (list8) : .2 .5 .8 1 0 : a shade for each bar or subbar",
"Xfield: dfield : : X position of bars can be determined by this data field *",
"Xstart.0or1: {0,1} : 1 : start bars at X=0 or X=1",
"Zeroat: number : : bars point down at values less than this (usually 0)",
"Proc Boxplot:",
"Clone: token : : to clone an earlier proc's set of parameters",
"Datarow: number : 1 : the row in the data that contains the above 6 values",
"Ends: {y,n} : y : do little cross-bars on the ends?",
"Fields: dfield (list6) (M) : : the 6 data fields (see below)",
"Label.size: charsize : 7 : size of N label in points",
"Linethick: 0 to 5 : 1 : thickness of boxplot line",
"Printn: {y,n} : y : print an N=... string at the bottom?",
"Saveas: token : : to save a set of parms for cloning",
"Width: number : 0.5 : width of box, in data units",
"Xloc: number : 0.5 : where box will be centered in x, in data units",
"Proc Distribution:",
"Axdist.length: -2 to 2 : 0.08 : length of distribution bars ",
"Axdist: {y,n} : n : show bar distributions on axes",
"Clone: token : : to clone an earlier proc's set of parameters",
"Cluster: {y,n} : y : offset overlaying points slightly to show duplicity",
"Idfield: dfield : : case identifier may be in this field",
"Mark.field: dfield : : if specified, mark is contents of this field",
"Mark.font: font : : font for points",
"Mark.size: charsize : 6 : size (in point units) for data points",
"Mark: token : sym6e : symbol code (symNS) or character(s) for points",
"Saveas: token : : to save a set of parms for cloning",
"Shadefield: dfield : : if specified, shade of point symbols controlled by field",
"Shadescale: number : : factor for scaling data to acceptable shade range (0..1)",
"Sizefield: dfield : : if specified, size of symbols controlled by field ",
"Sizescale: number : 1 : factor for scaling data to acceptable size (4..20)",
"Xfield: dfield (M) : : x data comes from this field ",
"Yfield: dfield : : y data field. If Yfield ommitted, do a bar distr.",
"Proc Draw:",
"Clone: token : : to clone an earlier proc's set of parameters",
"Linethick: 0.1 to 10 : 1 : thickness of line",
"Linetype.magnify: 0.1 to 10 : 1 : magnification of patterns",
"Linetype: 0 to 8 : 0 : line dash pattern",
"Points: text (M) (C) : : coord pairs, 2 per line (move+draw) or 1 per line (draw)",
"Saveas: token : : to save a set of parms for cloning",
"System: {data,absolute} : absolute : which coord system points are in",
"Proc Errorbars:",
"Clone: token : : to clone an earlier proc's set of parameters",
"Double: {y,n} : y : display 2 times the error amount?",
"Errfield: dfield (M) : : field containing error amount in y",
"Linethick: 0 to 10 : 0.3 : line thickness for error bars",
"Offset: -1 to 1 : 0 : amount of offset in X, in inches",
"Saveas: token : : to save a set of parms for cloning",
"Taillen: 0 to 1 : 0.04 : width of tails at the end of the bars",
"Xfield: dfield (M) : : field containing point x location",
"Yfield: dfield (M) : : field containing point y location",
"Proc Getdata:",
"Append: {y,n} : n : if y, new data will be put below existing data",
"Clone: token : : to clone an earlier proc's set of parameters",
"Data: text : : following lines contain data",
"Datafile: token (M) : : file name, '-' (terminal), or a Unix command ",
"Join: {y,n} : n : if y, new data will be put beside existing data",
"Percents: dfield (list20) : : change these fields from N to percentages, based on total",
"Saveas: token : : to save a set of parms for cloning",
"Selectfields: token (list20) : all : select only these fields from input",
"Startline: number : 1 : line to start with (first line is line 1)",
"Stopline: number : 9999 : stop reading after this line is read",
"Proc Legend:",
"Backshade: color : : shade for backing box",
"Clone: token : : to clone an earlier proc's set of parameters",
"Corner: {A,B,C,D} : A : which corner of the area, clockwise from upperleft",
"Entry.font: font : : font for legend entries",
"Entry.size: charsize : 7 : char size for legend entries",
"Entry: text (M) : : text for legend entries, one per line ",
"Linethick: number (list10) : 1 1 1 1 1 1 1 1 1 1 : thickness of line(s)",
"Linetype.magnify: number (list10) : 3 3 3 3 3 3 3 3 3 3 : mag. factor for dash pattern",
"Linetype: number (list10) : : line dash type for (each) line",
"Location.system: {absolute,data} : absolute : coord system for the above",
"Location: coordpair : : location for upperleft of legend",
"Mark.font: font : : ",
"Mark.size: charsize : 7 :",
"Mark: list : : list of marks for legend entries (symNS or chars)",
"Outlinebars: {y,n} : n : ' '",
"Saveas: token : : to save a set of parms for cloning",
"Shade: color (list10) : : for bar graphs",
"Title.size: charsize : 10 : size for legend title",
"Title: text : : legend title",
"Proc Lineplot:",
"Accum: {y,n} : n : option to accumulate yalues of y",
"Clone: token : : to clone an earlier proc's set of parameters",
"Label.size: charsize : 8 : char size for line identifier",
"Label: text : : curve identifier, one per line",
"Linethick: 0 to 10 (list8) : 1 1 1 1 1 1 1 1 : thickness of line(s)",
"Linetype.magnify: 0 to 10 (list8) : 3 3 3 3 3 3 3 3 : mag. factor for dash pattern",
"Linetype: 0 to 8 (list8) : 0 1 2 3 4 5 6 7 : line dash type for (each) line",
"Mark.size: charsize : 7 : Size for mark chars",
"Mark: list : : Mark char for points, one per line",
"Numberfinal: {y,n} : n : display y value of rightmost point",
"Numbers.offset: -1 to 1 : 0.015 : abs distance of numbers (+) above or (-)below line",
"Numbers: {y,n} : n : display y value at each point",
"Saveas: token : : to save a set of parms for cloning",
"Shade: color (list8) : : shading below lines",
"Stairstep.bars: {y,n} : n : for superimposing line over bar graph (moves it 1/2)",
"Stairstep: {y,n} : n : lines form steps rather than diagonals",
"Xfield: dfield : : line's x data field (optional)",
"Xstart.0or1: {0,1} : 0 : if no x data field specified, start on or beside origin",
"Yfield: dfield (list8) (M) : : list of y fields for each line ",
"Zeroat: number : 0 : point for zero crossing with shading ",
"Proc Map:",
"Clone: token : : to clone an earlier proc's set of parameters",
"Country.linethick: 0.1 to 5 : 1 : thickness for country boundary lines",
"Country: {usa,usa+canada} : usa+canada : map format",
"List: {y,n} : y : list state distribution down right side",
"Mode: {country,state,statedist} : state : country outln, state outln, or state distribution",
"Saveas: token : : to save a set of parms for cloning",
"Shade: color (list10) : 1 .9 .8 .6 .4 .2 : shades corresponding to the above thresholds",
"State.linethick: 0.1 to 5 : 0.2 : thickness for state boundary lines",
"Statefield: dfield : : field in which standard state/province name can be found",
"Threshold: number (list10) : : thresholds for shading (don't include 0 or max)",
"Valfield: dfield : : field in which n value can be found",
"Proc Nicetab:",
"Area.rectangle: 2coordpair : : two coord pairs (low left, up right) defining area",
"Area: token :nicetab : a pre-defined area name, see area.coords",
"Body.font: font : : body font",
"Body.only: {y,n} : n : indicates no title present, process all as table body.",
"Body.size: token : 8 : body char size",
"Clone: token : : to clone an earlier proc's set of parameters",
"File: token (M) : : file containing ascii table",
"Saveas: token : : to save a set of parms for cloning",
"Title.font: font : : title font",
"Title.size: charsize : 11 : title char size",
"Proc Page:",
"Clone: token : : to clone an earlier proc's set of parameters",
"Paperway: {portrait,landscape,screen} : portrait : the way paper will be held to look at",
"Saveas: token : : to save a set of parms for cloning",
"Standard.font: font : /Helvetica : default font for everything on page",
"Standard.linethick: 0 to 6 : 1 : standard line thickness",
"Title.belowtop: -12 to 12 (T) : 0.2 : distance of 1st title line below top of page",
"Title.file: token : : file containing title",
"Title.font: font : : font for page title",
"Title.size: charsize : 12 : char size of title",
"Title: text : : window title",
"Proc Pagebreak:",
"Clone: token : : this is not really useful, but all procs must have this",
"Saveas: token : : this is not really useful, but all procs must have this",
"Proc Pie:",
"Field: dfield (M) : : Data field to use. Numbers should be integer percentages.",
"Center: coordpair : 4.0 5.5 : Location of center, in absolute units." ,
"Radius: 0 to 5 : 3 : Radius of pie, in absolute units.",
"Shade: color list20 : : Shades of pie sections",
"Linethick: 0 to 10 : 1 : Thickness of lines",
"Explode: 0 to 3 : 0.1 : Distance in abs units to 'explode' each piece",
"Rotate: 0 to 360 : 0 : Rotate entire pie this many degrees counterclockwise",
"Clone: token : :",
"Saveas: token : :",
"Proc Point:",
"Clone: token : : ",
"Mark: token : sym6e : symbol code (see example point1.g)",
"Position: text (M) (C) : : position in absolute data system",
"Saveas: token : : ",
"Size: 1 to 20 : 5 : marker size",
"Proc Polygon:",
"Clone: token : : to clone an earlier proc's set of parameters",
"Linethick: 0.1 to 10 : 1 : thickness of line for outline",
"Linetype.magnify: 0.1 to 10 : 1 : magnification of patterns for outline",
"Linetype: 0 to 8 : 0 : line dash pattern for outline",
"Outline: {y,n} : n : outline polygon with a line?",
"Points: text (M) (C) : : one coord pair per line (points making up a polygon)",
"Rectangle: 2coordpair : : (lower left and upper right) for a rectangle, abs units ",
"Saveas: token : : to save a set of parms for cloning",
"Shade: color : 0.5 : shade of polygon",
"System: {data,absolute} : absolute : which coord system points are in",
"Proc QuitAppend:",
"Clone: token : : ",
"Saveas: token : : ",
"Proc Rangebar:",
"Clone: token : : to clone an earlier proc's set of parameters",
"Ends: {y,n} : y : do little cross-bars on the ends?",
"Field: dfield (list5) (M) : : data fields (should have Nval members)",
"Idfield: dfield : : data field holding id label",
"Label.position: number : 1 : position for N=.. label in Y data units",
"Label.size: charsize : 6 : size of the above label in points",
"Linethick: 0 to 5 : 1 : thickness of boxplot line",
"Midlineright: {y,n} : n : option for making median lines protrude right only",
"Midlinewidth: number : 0 : size of median line in user units, 0 uses Width value",
"Nval: 1 to 5 : 5 : number of values making up the box",
"Saveas: token : : to save a set of parms for cloning",
"Shade: color : 1.0 : shade for inside of bar",
"Width: number : 0.3 : width of box, in data units",
"Xfield: dfield : : (optional) data field, bar x placement",
"Proc Text:",
"Clone: token : : to clone an earlier proc's set of parameters",
"Direction: 0 to 359 : 0 : direction of text in degrees counterclockwise",
"File: token : : file containing text",
"Embeddedcoords: {y,n} : n : if y look for x and y values at beginning of each line",
"Font: font : : font to use",
"Position: coordpair (M) : : location of beginning of 1st text line",
"Saveas: token : : to save a set of parms for cloning",
"Size: charsize : 10 : size of text",
"System: {data,absolute} : absolute : which coord system position is in",
"Text: text : : the text itself",
"Proc Vbargraph:",
"Clone: token : : to clone an earlier proc's set of parameters",
"Field: dfield (list8) : : a field for each bar and subbar",
"Format: {single,cluster,stack} : single : single bars, clusters of bars, or bars stacked up",
"Idfield.position: -1 to 1 : 0.02 : distance of label above (or below) top of bar (inches)",
"Idfield.size: charsize : 6 : char size of labels",
"Idfield: dfield (list8) : : bars can be labeled using these field(s)",
"Killwild: number : : if a data value greater than this is found, abort ",
"Outlinebars: {y,n} : y : outline for each bar",
"Saveas: token : : to save a set of parms for cloning",
"Segment: {y,n} : n : segment bars at axis tics",
"Separation.sub: 0 to 1 : 0.03 : distance between sub-bars in cluster",
"Separation: 0 to 1 : 0.20 : distance between major bar spaces",
"Shade: color (list8) : .2 .5 .8 1 0 : a shade for each bar and subbar",
"Yfield: dfield : : Y position of bars (optional)",
"Ystart.0or1: {0,1} : 1 : start bars at Y=0 or Y=1",
"Zeroat: number : : bars point down at values less than this (usually 0)",
"Proc Vector:",
"Point1fields: dfield (list2) (M) : :fields in data holding x and y describing point p1 (x,y)",
"Point2fields: dfield (list2) (M) : :fields in data holding x and y describing point p2 (x,y)",
"Headlength: 0 to 2 : 0.2 :determines size of arrowhead, length in inches from point",
"Headwidth: 0 to 0.8 : 0.24 :determines size of arrowhead, arc of half of arrow in radians",
"Headshade: color : 0.0 :color of arrowhead",
"Saveas: token : : to save a set of parms for cloning",
"Clone: token : : to clone an earlier proc's set of parameters",
"Proc Vrangebar:",
"Clone: token : : to clone an earlier proc's set of parameters",
"Ends: {y,n} : y : do little cross-bars on the ends?",
"Field: dfield (list5) (M) : : data fields (should have Nval members)",
"Idfield: dfield : : data field holding id label",
"Label.size: charsize : 6 : size of the above label in points",
"Label.position: number : 1 : position for N=.. label in Y data units",
"Linethick: 0 to 5 : 1 : thickness of boxplot line",
"Midlinewidth: number : 0 : size of median line in user units, 0 uses Width value",
"Midlineright: {y,n} : n : option for making median lines protrude right only",
"Nval: 1 to 5 : 5 : number of values making up the box",
"Saveas: token : : to save a set of parms for cloning",
"Shade: color : 1.0 : shade for inside of bar",
"Width: number : 0.3 : width of box, in data units",
"Yfield: dfield : : (optional) data field, bar x placement",
"", "", "" } ;
/* number of lines per proc */
int Tdx[30] = { 0,
64, /* Areadef */
4, /* Arrow */
17, /* Barg */
11, /* Boxp */
17, /* Dist */
8, /* Draw */
10, /* Errorbars */
11, /* Getdata */
20, /* Legend */
21, /* Linep */
12, /* Map */
11, /* Nicetab */
11, /* Page */
3, /* Pagebreak */
10, /* Pie */
6, /* Point */
11, /* Polygon */
3, /* QuitAppend */
15, /* Rangebar */
11, /* Text */
17, /* Vbar */
8, /* Vector */
15, /* Vrangebar */
0, 0, 0, 0 };
/* Note, only one space allowed after word "Proc" */
SHAR_EOF
############################
cat << \SHAR_EOF > src/text.c
#include "ipl.x"
#define DATA 0
#define ABSOLUTE 1
Text( )
{
int sys, ln, embedded, p, ix;
double x, y, theta, size;
char s1[40], s2[40];
FILE *fp;
gget( Buf, "System" );
if( Buf[0] == 'd' ) {
sys = DATA;
if( DXlo == 0 && DXhi == 0 ) { fprintf( stderr, "No graphics area.\n" ); gdp_exit(); }
}
else sys = ABSOLUTE;
gget( Buf, "Font" ); NTfont( Buf );
gget( Buf, "Size" ); size = atof( Buf ); NTptsize( size );
gget( Buf, "Position" );
sscanf( Buf, "%lf %lf", &x, &y );
gget( Buf, "Direction" ); theta = atof( Buf );
if( theta != 0 ) NTchardir( theta );
gget( Buf, "Embeddedcoords" );
if( Buf[0] == 'y' ) embedded = 1; else embedded = 0;
gget( Buf, "File" );
if( strlen( Buf ) > 0 ) fp = fopen( Buf, "r" ); /* text in a file */
else { /* text given-- put it in a file */
gget( Buf, "Text" );
text_tofile( Buf, Tempfile );
fp = fopen( Tempfile, "r" );
}
if( fp == NULL ) { fprintf( stderr, "Cant open text file" ); gdp_exit(); }
/* read the file and print the text */
if( !embedded ) {
if( sys == DATA ) NTm( x, y );
else NTmov( x, y );
}
ln = 1;
while( fgets( Buf, 200, fp ) != NULL ) {
if( embedded ) {
ix = 0;
strcpy( s1, getok( Buf, &ix ) );
strcpy( s2, getok( Buf, &ix ) );
if( goodnum( s1, &p ) && goodnum( s2, &p ) ) {
x = atof( s1 ); y = atof( s2 );
if( sys == DATA ) NTm( x, y );
else NTmov( x, y );
strcpy( Buf, &Buf[ix] );
strip_ws( Buf );
}
}
NTtext( Buf );
if( sys == DATA ) NTmov( da_x(x), da_y(y)-(ln*Chh) );
else NTmov( x, y-(ln*Chh) );
ln++;
}
fclose( fp );
NTchardir( 0 );
}
SHAR_EOF
############################
--
Please send comp.sources.unix-related mail to rsalz at uunet.uu.net.
Use a domain-based address or give alternate paths, or you may lose out.
More information about the Comp.sources.unix
mailing list