int PLP_pie() { char attr[NAMEMAXLEN], *line, *lineval; int lvp, first; char *labels, *outlinedetails, *lablinedetails, *labelmode, *mapurl, *maplabel, *textdetails; char *pctfmt, *labelback, *lblfmtstring, *expandedurl, *expandedlabel, *color1; char buf[256], color[MAXSLICE][40], lbl[256], pctstr[80]; int j, align, df, lblfld, ncolors, nexpl, ibb, colorfield, nlines; int maxlen, irow, ilabmode, labelbackoutline, exactcolorfield, wraplen; double expl[MAXSLICE]; double adjx, adjy, cx, cy, radius, theta, total, ux, uy, stop, starttheta, sin(), cos(); double fval, x, y, oldx, oldy, stheta, lblfarout, boxwid, boxhi, labx, laby, dval; TDH_errprog( "pl proc pie" ); /* initialize */ labels = ""; outlinedetails = ""; lablinedetails = ""; textdetails = ""; mapurl = ""; maplabel = ""; labelback = ""; lblfmtstring = ""; ncolors = 0; labelbackoutline = 0; wraplen = 0; nexpl = 0; theta = 0.0; cx = cy = -1.0; radius = -1.0; labelmode = "legend"; starttheta = 90.0 * TORAD; total = 0.0; lblfarout = 0.0; pctfmt = "%.1f"; lblfld = -1; colorfield = -1; exactcolorfield = -1; /* get attributes.. */ first = 1; while( 1 ) { line = getnextattr( first, attr, &lvp ); if( line == NULL ) break; first = 0; lineval = &line[lvp]; if( strcmp( attr, "datafield" )==0 ) df = fref( lineval ) -1 ; else if( strcmp( attr, "center" )==0 ) getcoords( "center", lineval, &cx, &cy ); else if( strcmp( attr, "radius" )==0 ) Elenex( lineval, X, &radius ); else if( strcmp( attr, "firstslice" )==0 ) starttheta = ((360-ftokncpy( lineval )) * TORAD ) + 90.0 * TORAD; else if( strcmp( attr, "total" )==0 ) total = ftokncpy( lineval ); else if( strcmp( attr, "clickmapurl" )==0 ) mapurl = lineval; else if( strcmp( attr, "clickmaplabel" )==0 ) maplabel = lineval; else if( strcmp( attr, "clickmaplabeltext" )==0 ) maplabel = getmultiline( lineval, "get" ); else if( strcmp( attr, "colors" )==0 ) { int i, ix; for( i = 0, ix = 0; i < MAXSLICE; i++ ) { strcpy( color[i], GL_getok( lineval, &ix ) ); if( color[i][0] == '\0' ) break; } ncolors = i; } else if( strcmp( attr, "labels" )==0 ) labels = getmultiline( lineval, "get" ); else if( strcmp( attr, "labelfield" )==0 ) lblfld = fref( lineval ) - 1; else if( strcmp( attr, "labelfmtstring" )==0 ) lblfmtstring = lineval; else if( strcmp( attr, "colorfield" )==0 ) colorfield = fref( lineval ) - 1; else if( strcmp( attr, "exactcolorfield" )==0 ) exactcolorfield = fref( lineval ) - 1; else if( strcmp( attr, "outlinedetails" )==0 ) outlinedetails = lineval; else if( strcmp( attr, "lablinedetails" )==0 ) lablinedetails = lineval; else if( strcmp( attr, "textdetails" )==0 ) textdetails = lineval; else if( strcmp( attr, "labelmode" )==0 ) labelmode = lineval; else if( strcmp( attr, "labelfarout" )==0 ) lblfarout = ftokncpy( lineval ); else if( strcmp( attr, "labelback" )==0 ) labelback = lineval; else if( strcmp( attr, "labelbackoutline" )==0 ) labelbackoutline = getyn( lineval ); else if( strcmp( attr, "pctformat" )==0 ) pctfmt = lineval; else if( strcmp( attr, "explode" )==0 ) { int i, ix; for( i = 0, ix = 0; i < MAXSLICE; i++ ) { strcpy( buf, GL_getok( lineval, &ix )); if( buf[0] == '\0' ) break; else expl[i] = atof( buf ); } nexpl = i; } else if( strcmp( attr, "wraplen" )==0 ) wraplen = itokncpy( lineval ); else Eerr( 1, "attribute not recognized", attr ); } /* overrides and degenerate cases */ /* -------------------------- */ if( Nrecords < 1 ) return( Eerr( 17, "No data has been read yet w/ proc getdata", "" ) ); if( df < 0 || df >= Nfields ) return( Eerr( 2840, "invalid datafield", "" ) ); if( cx < 0.0 || cy < 0.0 ) return( Eerr( 2841, "invalid center", "" ) ); if( radius < 0.0 || radius > 5.0 ) return( Eerr( 2842, "invalid radius", "" ) ); if( lblfarout < 0.001 && strncmp( labelmode, "label", 5 )==0 ) lblfarout = 0.67; if( lblfarout < 0.001 && strncmp( labelmode, "line", 4 )==0 ) lblfarout = 1.3; if( labelbackoutline && labelback[0] == '\0' ) labelback = Ecurbkcolor; /* now do the plotting work.. */ /* -------------------------- */ /* compute total.. */ if( total <= 0.0 ) { total = 0.0; for( irow = 0; irow < Nrecords; irow++ ) { total += atof( da( irow, df ) ); } } ibb = 0; if( strncmp( labelmode, "legend", 6 )==0 ) ilabmode = LEGEND; else if( strncmp( labelmode, "labelonly", 5 ) ==0 ) ilabmode = LABEL; else if( strncmp( labelmode, "line+label", 4 ) ==0 ) ilabmode = LINELABEL; else ilabmode = 0; for( j = 0; j < 2; j++ ) { /* first time - colors; 2nd time, lines */ theta = starttheta + 6.28319; if( j == 1 ) { /* set line details for outline.. */ linedet( "outlinedetails", outlinedetails, 0.5 ); } for( irow = 0; irow < Nrecords; irow++ ) { /* take val as % of total and convert to rads */ dval = atof( da( irow, df ) ); if( dval == 0.0 ) continue; /* prevent slice attempt on degenerate case - scg 7/21/03 */ fval = ( dval / total ) * 6.28319; stop = theta - fval; /* find (ux,uy), the point at the wedge of the slice, normalized to 0,0 center.. */ if( nexpl <= 0 ) { /* don't explode any slices */ ux = 0.0; uy = 0.0; } else if( irow >= nexpl ) { /* explode slice according to last explode value */ ux = (expl[nexpl-1]*radius) * cos( theta+(fval/-2.0) ); uy = (expl[nexpl-1]*radius) * sin( theta+(fval/-2.0) ); } else if( irow < nexpl ) { /* explode slice according to explode value [i] */ ux = (expl[irow]*radius) * cos( theta+(fval/-2.0) ); uy = (expl[irow]*radius) * sin( theta+(fval/-2.0) ); } first = 1; stheta = theta; if( j == 1 && strncmp( outlinedetails, "no", 2 )==0 ) /* break; */ goto DOLAB; /* changed again, scg 4/29/05 */ for( ; theta > stop; theta -= 0.03 ) { if( theta - stop < 0.03 ) theta = stop; x = cx + (radius * cos( theta )); y = cy + (radius * sin( theta )); if( j == 0 ) { if( first ) { first = 0; oldx = x; oldy = y; Emov( cx+ux, cy+uy ); Epath( x+ux, y+uy ); continue; } Epath( x+ux, y+uy ); oldx = x; oldy = y; } else if( j == 1 ) { if( first ) { Emov( cx+ux, cy+uy ); Elin( x+ux, y+uy ); first = 0; } Elin( x+ux, y+uy ); } } if( j == 1 ) Elin( cx+ux, cy+uy ); color1 = ""; if( j == 0 ) { Epath( cx+ux, cy+uy ); if( colorfield >=0 ) { color1 = PL_get_legent( da( irow, colorfield ) ); Ecolorfill( color1 ); } else if( exactcolorfield >= 0 ) { color1 = da( irow, exactcolorfield ); Ecolorfill( color1 ); } else if( strcmp( color[0], "auto" )==0 ) { color1 = Eicolor( irow ); Ecolorfill( color1 ); } else if( irow < ncolors ) Ecolorfill( color[irow] ); else if( ncolors > 0 ) Ecolorfill( color[ncolors-1] ); else Ecolorfill( "0.8" ); } /* labeling */ /* if doing legend, handle this during j == 0 because color is available; otherwise do labeling during j == 1 to avoid color fill obliterating labels.. */ DOLAB: if( ( j == 0 && ilabmode == LEGEND ) || ( j == 1 && ilabmode != 0 ) ) { strcpy( lbl, ""); sprintf( pctstr, pctfmt, (atof( da( irow, df ) ) / total)*100.0 ); if( PLS.bignumspacer ) rewritenums( pctstr ); /* added 4/5/03 */ if( lblfld >= 0 ) strcpy( lbl, da( irow, lblfld ) ); else if( labels != "" ) GL_getseg( lbl, labels, &ibb, "\n" ); else if( lblfmtstring[0] != '\0' ) { /* added scg 8/20/04 */ strcpy( buf, lblfmtstring ); GL_varsub( buf, "@PCT", pctstr ); do_subst( lbl, buf, irow, NORMAL ); } GL_varsub( lbl, "@PCT", pctstr ); convertnl( lbl ); /* allow @field substitutions into url */ if( PLS.clickmap && ( mapurl != "" || maplabel != "" )) { expandedurl = PL_bigbuf; expandedlabel = &PL_bigbuf[2000]; do_subst( expandedurl, mapurl, irow, URL_ENCODED ); do_subst( expandedlabel, maplabel, irow, NORMAL ); } /* if( ilabmode == LEGEND ) */ /* changed 7/14/03 scg */ if( j == 0 && ilabmode == LEGEND ) { if( color1[0] != '\0' ) PL_add_legent( LEGEND_COLOR, lbl, "", color1, "", "" ); else PL_add_legent( LEGEND_COLOR, lbl, "", color[irow], "", "" ); } else if( j == 1 && ilabmode == LABEL ) { double htheta; double x1, y1, x2, y2; int centerit = 0; htheta = stop + ((stheta - stop) / 2.0 ); x = cx + ( (radius * lblfarout) * cos( htheta ) ); y = cy + ( (radius * lblfarout) * sin( htheta ) ); if( wraplen ) GL_wraptext( lbl, wraplen ); /* added scg 8/16/05 */ measuretext( lbl, &nlines, &maxlen ); labx = x+ux; laby = y+uy; boxhi = nlines * Ecurtextheight; boxwid = (maxlen * Ecurtextwidth); if( (htheta >= 7.7 && htheta <= 8.2 ) || (htheta >= 4.5 && htheta <= 5.0 )) centerit = 1; if( centerit ) { x1 = labx-(boxwid/2.0); x2 = labx+(boxwid/2.0); } else if( x < cx ) { x1 = labx - boxwid; x2 = labx; } else { x1 = labx; x2 = labx + boxwid; } y1 = laby-boxhi; y2 = laby; if( labelback != "" ) Ecblock( x1-0.1, y1+(Ecurtextheight*0.6), x2+0.1, y2+Ecurtextheight, labelback, labelbackoutline ); textdet( "textdetails", textdetails, &align, &adjx, &adjy, -2,"R", 1.0 ); Emov( labx, laby ); if( !centerit && x < cx ) Erightjust( lbl ); else if( !centerit && x >= cx ) Etext( lbl ); else Ecentext( lbl ); if( PLS.clickmap && ( mapurl != "" || maplabel != "" )) clickmap_entry( 'r', expandedurl, 0, x1, y1+Ecurtextheight, x2, y2+Ecurtextheight, 1, 0, expandedlabel ); linedet( "linedetails", outlinedetails, 0.5 ); /* restore */ } /* else if( ilabmode == LINELABEL ) */ /* changed 7/14/03 scg */ else if( j == 1 && ilabmode == LINELABEL ) { double htheta, px, py, w, z; if( wraplen ) GL_wraptext( lbl, wraplen ); /* added scg 8/16/05 */ measuretext( lbl, &nlines, &maxlen ); boxwid = maxlen * Ecurtextwidth; boxhi = nlines * Ecurtextheight; w = radius * lblfarout; if( w < (1.1 * radius) ) z = lblfarout; else z = 1.1; htheta = stop + ((stheta - stop) / 2.0 ); px = cx + ( (radius * 0.9 ) * cos( htheta ) ); py = cy + ( (radius * 0.9 ) * sin( htheta ) ); x = cx + ( (radius * z ) * cos( htheta ) ); y = cy + ( (radius * z ) * sin( htheta ) ); linedet( "lablinedetails", lablinedetails, 0.5 ); Emov( px+ux, py+uy ); Elin( x+ux, y+uy ); if( x+ux < cx ) { Elin( (cx+ux)-w, y+uy ); textdet( "textdetails", textdetails, &align, &adjx, &adjy, -2,"R", 1.0 ); labx = ((cx+ux)-w)-0.1; laby = y+uy; if( labelback[0] != '\0' ) Ecblock( labx-boxwid-0.1, laby-boxhi+(Ecurtextheight*0.6), labx+0.1, laby+Ecurtextheight, labelback, labelbackoutline ); Emov( labx, laby ); Erightjust( lbl ); if( PLS.clickmap && ( mapurl != "" || maplabel != "" )) clickmap_entry( 'r', expandedurl, 0, labx-boxwid, laby-boxhi+Ecurtextheight, labx, laby+Ecurtextheight, 1, 0, expandedlabel ); } else { Elin( (cx+ux)+w, y+uy ); textdet( "textdetails", textdetails, &align, &adjx, &adjy, -2,"R", 1.0 ); labx = cx+ux+w+0.1; laby = y+uy; if( labelback[0] != '\0' ) Ecblock( labx-0.1, laby-boxhi+(Ecurtextheight*0.6), labx+boxwid+0.1, laby+Ecurtextheight, labelback, labelbackoutline ); Emov( labx, laby ); Etext( lbl ); if( PLS.clickmap && ( mapurl != "" || maplabel != "" )) clickmap_entry( 'r', expandedurl, 0, labx, laby-boxhi+Ecurtextheight, labx+boxwid, laby+Ecurtextheight, 1, 0, expandedlabel ); } linedet( "outlinedetails", outlinedetails, 0.5 ); /* restore */ } } theta = stop; } } return( 0 ); }
int PLP_areadef() { int i; char attr[NAMEMAXLEN], val[256]; char *line, *lineval; int nt, lvp; int first; int stat; double xlo, xhi, ylo, yhi; char areaname[NAMEMAXLEN]; char xscaletype[50], yscaletype[50]; char title[256]; char title2[256]; char titledet[256]; char title2det[256]; char frame[256]; int nlines, maxlen; int doframe; int namedarea; int align; double adjx, adjy; int gotarea, gotxrange, gotyrange; int doxaxis, doyaxis; char areacolor[COLORLEN]; char xminstr[256], xmaxstr[120]; /* was xminstr[120] - needs bigger if big autorange datafield list given - scg 10/25/04 */ char yminstr[256], ymaxstr[120]; /* was yminstr[120] - '' - scg 10/25/04 */ double height, width; int locspec; char linebottom[256]; char lineside[256]; double autowf, autowmin, autowmax; double autohf, autohmin, autohmax; char mapurl[MAXPATH]; double cmadj; int docats; char maplabel[MAXTT]; int clickmap_on; TDH_errprog( "pl proc areadef" ); /* initialize */ strcpy( xscaletype, "linear" ); strcpy( yscaletype, "linear" ); strcpy( areaname, "standard" ); gotxrange = gotyrange = 0; if( PLS.device == 'c' || PLS.device == 'p' ) strcpy( areaname, "standardp" ); /* for sheet of paper */ strcpy( title, "" ); strcpy( title2, "" ); doframe = 0; strcpy( frame, "" ); strcpy( titledet, "" ); strcpy( title2det, "" ); namedarea = 1; /* doxaxis = doyaxis = 1; */ doxaxis = doyaxis = 0; strcpy( areacolor, "" ); strcpy( PL_bigbuf, "" ); height = 4.0; width = 6.0; xlo = 1.5; ylo = 5.0; locspec = 0; strcpy( xminstr, "" ); strcpy( xmaxstr, "" ); strcpy( yminstr, "" ); strcpy( ymaxstr, "" ); strcpy( linebottom, "" ); strcpy( lineside, "" ); gotarea = 1; autowf = 0.0; autowmin = 0.0; autowmax = 20.0; autohf = 0.0; autohmin = 0.0; autohmax = 20.0; strcpy( mapurl, "" ); strcpy( maplabel, "" ); docats = 0; clickmap_on = 0; /* get attributes.. */ first = 1; while( 1 ) { line = getnextattr( first, attr, val, &lvp, &nt ); if( line == NULL ) break; first = 0; lineval = &line[lvp]; if( stricmp( attr, "areaname" )==0 ) { strcpy( areaname, val ); gotarea = 1; } else if( stricmp( attr, "rectangle" )==0 ) { stat = getbox( "rectangle", lineval, &xlo, &ylo, &xhi, &yhi ); if( stat ) { PLS.skipout = 1; return( 1 ); } namedarea = 0; gotarea = 1; } else if( stricmp( attr, "box" )==0 ) { sscanf( lineval, "%lf %lf", &width, &height ); if( PLS.usingcm ) { width /= 2.54; height /= 2.54; } namedarea = 0; gotarea = 1; } else if( stricmp( attr, "location" )==0 ) { sscanf( lineval, "%lf %lf", &xlo, &ylo ); if( PLS.usingcm ) { xlo /= 2.54; ylo /= 2.54; } locspec = 1; } else if( stricmp( attr, "autowidth" )==0 ) { nt = sscanf( lineval, "%lf %lf %lf", &autowf, &autowmin, &autowmax ); } else if( stricmp( attr, "autoheight" )==0 ) { nt = sscanf( lineval, "%lf %lf %lf", &autohf, &autohmin, &autohmax ); } else if( stricmp( attr, "xrange" )==0 || stricmp( attr, "xautorange" )==0 ) { if( strnicmp( val, "datafield", 9 )==0 ) strcpy( xminstr, lineval ); else if( stricmp( val, "categories" )==0 ) { strcpy( xscaletype, val ); continue; } else { nt = sscanf( lineval, "%s %s", xminstr, xmaxstr ); if( nt != 2 ) { PLS.skipout = 1; return( Eerr( 105, "both min and max expected", "xrange" )); } } gotxrange = 1; } else if( stricmp( attr, "yrange" )==0 || stricmp( attr, "yautorange" )==0 ) { if( strnicmp( val, "datafield", 9 )==0 ) strcpy( yminstr, lineval ); else if( stricmp( val, "categories" )==0 ) { strcpy( yscaletype, val ); continue; } else { nt = sscanf( lineval, "%s %s", yminstr, ymaxstr ); if( nt != 2 ) { PLS.skipout = 1; return( Eerr( 105, "both min and max expected", "yrange" )); } } gotyrange = 1; } else if( stricmp( attr, "xscaletype" )==0 ) strcpy( xscaletype, lineval ); else if( stricmp( attr, "yscaletype" )==0 ) strcpy( yscaletype, lineval ); else if( stricmp( attr, "frame" )==0 ) { if( strnicmp( val, "no", 2 )==0 ) doframe = 0; else { strcpy( frame, lineval ); doframe = 1; } } else if( stricmp( attr, "title" )==0 ) { strcpy( title, lineval ); convertnl( title ); } else if( stricmp( attr, "title2" )==0 ) { strcpy( title2, lineval ); convertnl( title2 ); } else if( stricmp( attr, "titledetails" )==0 ) strcpy( titledet, lineval ); else if( stricmp( attr, "title2details" )==0 ) strcpy( title2det, lineval ); else if( stricmp( attr, "areacolor" )==0 ) strcpy( areacolor, val ); else if( stricmp( attr, "linebottom" )==0 ) { if( strnicmp( val, "no", 2 )!=0 ) strcpy( linebottom, lineval ); } else if( stricmp( attr, "lineside" )==0 ) { if( strnicmp( val, "no", 2 )!= 0 ) strcpy( lineside, lineval ); } else if( stricmp( attr, "clickmapurl" )==0 ) { if( PLS.clickmap ) { strcpy( mapurl, val ); clickmap_on = 1 ; } } else if( stricmp( attr, "clickmaplabel" )==0 ) { if( PLS.clickmap ) { strcpy( maplabel, lineval ); clickmap_on = 1 ; } } else if( stricmp( attr, "clickmaplabeltext" )==0 ) { if( PLS.clickmap ) { getmultiline( "clickmaplabeltext", lineval, MAXTT, maplabel ); clickmap_on = 1; } } else if( stricmp( attr, "axes" )==0 ) { if( stricmp( val, "none" )==0 ) { doxaxis = 0; doyaxis = 0; } else if( stricmp( val, "x" )==0 ) doxaxis = 1; else if( stricmp( val, "y" )==0 ) doyaxis = 1; else if( stricmp( val, "both" )==0 ) { doxaxis = 1; doyaxis = 1; } } else if( GL_slmember( attr, "?axis.stubs ?axis.selflocatingstubs" )) { if( strnicmp( attr, "xaxis.", 6 )==0 ) doxaxis = 1; if( strnicmp( attr, "yaxis.", 6 )==0 ) doyaxis = 1; if( GL_slmember( val, "none inc* dat*matic file datafield* list categories usecategories" )) ; else getmultiline( "stubtext", lineval, MAXBIGBUF-5, PL_bigbuf ); /* just to skip past it..*/ } else if( strnicmp( attr, "xaxis.", 6 )==0 ) { doxaxis = 1; continue; } else if( strnicmp( attr, "yaxis.", 6 )==0 ) { doyaxis = 1; continue; } else if( GL_slmember( attr, "axisline tic* minortic*" )) continue; else if( GL_slmember( attr, "?categories ?extracategory catcompmethod" )) { docats = 1; if( GL_slmember( attr, "?categories" ) && strnicmp( val, "datafield", 9 )!=0 ) getmultiline( "categories", lineval, MAXBIGBUF-5, PL_bigbuf ); /* skip over it.. */ if( attr[0] == 'x' ) strcpy( xscaletype, "categories" ); if( attr[0] == 'y' ) strcpy( yscaletype, "categories" ); } else Eerr( 1, "areadef attribute not recognized", attr ); } /* now do the plotting work.. */ PL_resetstacklist(); /* (obscure) - reset the bar graph list that tries to keep track of fields for automatic stacking */ /* go set up category sets if needed.. */ if( docats ) { PLP_categories(); TDH_errprog( "pl proc areadef" ); } if( stricmp( xscaletype, "categories" )==0 ) { if( PL_ncats('x') < 1 ) { PLS.skipout = 1; return( Eerr( 5972, "no x categories exist", "" ) ); } gotxrange = 1; /* note- categories could have been filled from a previous data set */ strcpy( xminstr, "0" ); sprintf( xmaxstr, "%d", PL_ncats('x')+1 ); } if( stricmp( yscaletype, "categories" )==0 ) { if( PL_ncats('y') < 1 ) { PLS.skipout = 1; return( Eerr( 5973, "no y categories exist", "" ) ); } gotyrange = 1; /* note- categories could have been filled from a previous data set */ strcpy( yminstr, "0" ); sprintf( ymaxstr, "%d", PL_ncats('y')+1 ); } if( locspec ) { /* location and box specified, calculate xhi and yhi.. */ xhi = xlo + width; yhi = ylo + height; } /* determine area.. */ if( namedarea ) { RETRY: strcat( areaname, " " ); for( i = 0; i < nareas; i++ ) { if( strnicmp( areas[i], areaname, strlen( areaname ) )==0 ) { if( Ecurpaper == 0 ) sscanf( areas[i], "%*s %lf %lf %lf %lf", &xlo, &ylo, &xhi, &yhi ); else if( Ecurpaper == 1 ) sscanf( areas[i], "%*s %*s %*s %*s %*s %lf %lf %lf %lf", &xlo, &ylo, &xhi, &yhi ); break; } } if( i == nareas ) { areaname[ strlen( areaname ) -1 ] = '\0'; Eerr( 110, "warning, areaname not recognized, using 'standard'..", areaname ); strcpy( areaname, "standard" ); goto RETRY; } } if( !gotarea && !locspec ) { /* && !locspec added scg 11/21/00 */ PLS.skipout = 1; return( Eerr( 130, "No plotting area has been specified", "" ) ); } if( !gotxrange ) { PLS.skipout = 1; return( Eerr( 130, "No xrange has been specified", "" ) ); } if( !gotyrange ) { PLS.skipout = 1; return( Eerr( 130, "No yrange has been specified", "" ) ); } /* set scaling type and special units if any.. */ stat = Escaletype( xscaletype, 'x' ); if( stat != 0 ) Escaletype( "linear", 'x' ); if( strnicmp( xscaletype, "log", 3 )==0 ) Esetunits( 'x', "linear" ); else Esetunits( 'x', xscaletype ); stat = Escaletype( yscaletype, 'y' ); if( stat != 0 ) Escaletype( "linear", 'y' ); if( strnicmp( yscaletype, "log", 3 )==0 ) Esetunits( 'y', "linear" ); else Esetunits( 'y', yscaletype ); /* if autoranging is specified, do it now.. */ if( strnicmp( xminstr, "datafield", 9 ) == 0 ) PLP_autorange( 'x', xminstr, xminstr, xmaxstr ); if( strnicmp( yminstr, "datafield", 9 ) == 0 ) PLP_autorange( 'y', yminstr, yminstr, ymaxstr ); /* if scaletype is log but there are data values = 0.0, go to log+1 scaling.. */ if( stricmp( xscaletype, "log" )==0 && atof( xminstr ) <= 0.0 ) Escaletype( "log+1", 'x' ); if( stricmp( yscaletype, "log" )==0 && atof( yminstr ) <= 0.0 ) Escaletype( "log+1", 'y' ); /* if using autowidth or autoheight, revise plotting area now.. */ if( autowf != 0.0 ) { double xmin, xmax; if( stricmp( xscaletype, "categories" )== 0 ) { xmin = atof( xminstr ); xmax = atof( xmaxstr ); } else { xmin = Econv( 'x', xminstr ); xmax = Econv( 'x', xmaxstr ); } xhi = xlo + ((xmax-xmin) * autowf); if( xhi - xlo < autowmin ) xhi = xlo + autowmin; else if( xhi - xlo > autowmax ) xhi = xlo + autowmax; } if( autohf != 0.0 ) { double ymin, ymax; if( stricmp( yscaletype, "categories" )== 0 ) { ymin = atof( yminstr ); ymax = atof( ymaxstr ); } else { ymin = Econv( 'y', yminstr ); ymax = Econv( 'y', ymaxstr ); } yhi = ylo + ((ymax-ymin) * autohf); if( yhi - ylo < autohmin ) yhi = ylo + autohmin; else if( yhi - ylo > autohmax ) yhi = ylo + autohmax; } /* set the scaling for the plot area.. */ stat = Esetscale( 'x', xlo, xhi, xminstr, xmaxstr ); stat += Esetscale( 'y', ylo, yhi, yminstr, ymaxstr ); if( PLS.debug ) fprintf( PLS.diagfp, "areadef: lowerleft: %g,%g upperright: %g,%g\n", xlo, ylo, xhi, yhi ); if( PLS.debug ) fprintf( PLS.diagfp, "areadef: xrange is %s to %s. yrange is %s to %s.\n", xminstr, xmaxstr, yminstr, ymaxstr ); if( stat != 0 ) return( stat ); DT_suppress_twin_warn( 0 ); /* set variables to hold plot area bounds and scale min/max.. */ if( PLS.usingcm ) cmadj = 2.54; else cmadj = 1.0; setfloatvar( "AREATOP", EYhi * cmadj ); setfloatvar( "AREABOTTOM", EYlo * cmadj ); setfloatvar( "AREALEFT", EXlo * cmadj ); setfloatvar( "AREARIGHT", EXhi * cmadj ); setcharvar( "XMIN", xminstr ); setcharvar( "XMAX", xmaxstr ); setcharvar( "YMIN", yminstr ); setcharvar( "YMAX", ymaxstr ); if( areacolor[0] != '\0' ) Ecblock( EXlo, EYlo, EXhi, EYhi, areacolor, 0 ); if( clickmap_on ) { if( GL_slmember( mapurl, "*@XVAL*" ) || GL_slmember( mapurl, "*@YVAL*" )) clickmap_seturlt( mapurl ); else clickmap_entry( 'r', mapurl, 0, EXlo, EYlo, EXhi, EYhi, 0, 0, maplabel ); } /* draw a frame of the graphics area */ if( doframe ) { if( stricmp( frame, "bevel" )==0 ) { Ecblockdress( EXlo, EYlo, EXhi, EYhi, 0.1, "0.6", "0.8", 0.0, "" ); } else { linedet( "frame", frame, 1.0 ); Ecblock( EXlo, EYlo, EXhi, EYhi, "", 1 ); } } /* draw bottom line */ if( linebottom[0] != '\0' ) { linedet( "linebottom", linebottom, 1.0 ); Emov( EXlo, EYlo ); Elin( EXhi, EYlo ); } /* draw side line */ if( lineside[0] != '\0' ) { linedet( "lineside", lineside, 1.0 ); Emov( EXlo, EYlo ); Elin( EXlo, EYhi ); } /* title */ if( title[0] != '\0' ) { textdet( "titledetails", titledet, &align, &adjx, &adjy, 0, "R", 1.0 ); measuretext( title, &nlines, &maxlen ); if( align == '?' ) align = 'L'; if( align == 'L' ) Emov( EXlo + adjx, EYhi + ((nlines-1) * Ecurtextheight ) + adjy + 0.02 ); else if( align == 'C' ) Emov( EXlo+((EXhi-EXlo) / 2.0 ) + adjx, EYhi + ((nlines-1) * Ecurtextheight ) +adjy + 0.02 ); else if( align == 'R' ) Emov( EXhi + adjx, EYhi + ((nlines-1) * Ecurtextheight ) +adjy + 0.02); Edotext( title, align ); } /* title 2 */ if( title2[0] != '\0' ) { textdet( "title2details", title2det, &align, &adjx, &adjy, 0, "R", 1.0 ); measuretext( title2, &nlines, &maxlen ); if( align == '?' ) align = 'L'; if( align == 'L' ) Emov( EXlo + adjx, EYhi + ((nlines-1) * Ecurtextheight ) + adjy + 0.02 ); else if( align == 'C' ) Emov( EXlo+((EXhi-EXlo) / 2.0 ) + adjx, EYhi + ((nlines-1) * Ecurtextheight ) +adjy + 0.02 ); else if( align == 'R' ) Emov( EXhi + adjx, EYhi + ((nlines-1) * Ecurtextheight ) +adjy + 0.02 ); Edotext( title2, align ); } if( doxaxis ) PLP_axis( 'x', 6 ); if( doyaxis ) PLP_axis( 'y', 6 ); return( 0 ); }
int PLP_print() { int i, lvp, first; char attr[NAMEMAXLEN], *line, *lineval; char *printstring, *label, *selectex, *outfile, *outmode; char buf[512], tok[80]; int result, dontclose, nrecords; FILE *outfp; TDH_errprog( "pl proc print" ); /* initialize */ printstring = ""; label = ""; selectex = ""; outfile = ""; outmode = "w"; /* get attributes.. */ first = 1; while( 1 ) { line = getnextattr( first, attr, &lvp ); if( line == NULL ) break; first = 0; lineval = &line[lvp]; if( strcmp( attr, "select" )==0 ) selectex = lineval; else if( strcmp( attr, "label" )==0 ) { label = lineval; convertnl( label ); } else if( strcmp( attr, "print" )==0 ) { printstring = lineval; convertnl( printstring ); } else if( strcmp( attr, "outfile" )==0 ) outfile = lineval; else if( strcmp( attr, "outmode" )==0 ) outmode = lineval; else Eerr( 1, "attribute not recognized", attr ); } if( printstring[0] != '\0' && Nrecords < 1 ) return( Eerr( 17, "Warning: no data has been read yet w/ proc getdata", "" ) ); fprintf( PLS.errfp, "Warning, proc print is deprecated in 2.40\n" ); /* now do the work.. */ dontclose = 0; if( outfile[0] != '\0' ) { sprintf( tok, "%c", outmode[0] ); outfp = fopen( outfile, tok ); if( outfp == NULL ) { Eerr( 7259, "cannot open outfile", outfile ); outfp = PLS.diagfp; dontclose = 1; } } else { outfp = PLS.diagfp; dontclose = 1; } if( label[0] != '\0' ) fprintf( outfp, "%s\n", label ); nrecords = 0; for( i = 0; i < Nrecords; i++ ) { do_select( selectex, i, &result ); if( result == 1 ) { if( printstring[0] != '\0' ) { do_subst( buf, printstring, i, NORMAL ); fprintf( outfp, "%s\n", buf ); } nrecords++; } } setintvar( "NSELECTED", nrecords ); if( !dontclose ) fclose( outfp ); return( 0 ); }
int PLP_scatterplot() { int i; char attr[NAMEMAXLEN], val[256]; char *line, *lineval; int nt, lvp; int first; int stat; int align; double adjx, adjy; int xfield, yfield; char symbol[256]; double linelen; char linedetails[256]; double xloc, yloc; int cluster; double radius; char symcode[80]; double x, y; char text[256]; double cx, cy; double hlinelen; char textdetails[256]; int lblfield; char selex[256]; int result; double sizescale; int sizefield; double ox[38], oy[38]; double clusterfact; double oldx, oldy; int dupcount; int subdupcount; int clustevery; int verttext; int nrow; char legendlabel[256]; /* raised (can contain urls for clickmap) scg 4/22/04 */ char xrange[80], yrange[80]; double xlo, xhi, ylo, yhi; char rhi[40], rlo[40]; double clusterdiff; int realrow; int clustermeth; int symfield; int symfield_userange; int dupsleg; char mapurl[MAXPATH], expurl[MAXPATH]; char maplabel[MAXTT], explabel[MAXTT]; int irow; double ptx, pty; double hw, txhi; char linedir, reqlinedir; double rectw, recth; int dorect, rectoutline; int clickmap_on; int flop2; int maxdups; char labelword[80], labeltxt[80]; double vennden; TDH_errprog( "pl proc scatterplot" ); /* initialize */ xfield = -1; yfield = -1; strcpy( symbol, "" ); linelen = -1.0; strcpy( linedetails, "" ); xloc = 0.0; yloc = 0.0; /* cluster = 1; */ cluster = 0; /* changed and added to "breakers" in docs, scg 5/29/06 */ strcpy( text, "" ); strcpy( textdetails, "" ); lblfield = -1; strcpy( selex, "" ); sizefield = -1; sizescale = 0.5/72.0; /* correspond roughly with pt size */ clusterfact = 0.01; verttext = 0; strcpy( legendlabel, "" ); strcpy( xrange, "" ); strcpy( yrange, "" ); clustevery = 0; clusterdiff = 0.001; clustermeth = 0; symfield = -1; dupsleg = 0; symfield_userange = 0; strcpy( mapurl, "" ); strcpy( expurl, "" ); strcpy( maplabel, "" ); strcpy( explabel, "" ); dorect = 0; rectoutline = 0; linedir = reqlinedir = '\0'; /* scg 3/4/03 */ clickmap_on = 0; strcpy( labelword, "@VAL" ); vennden = 0.0; /* get attributes.. */ first = 1; while( 1 ) { line = getnextattr( first, attr, val, &lvp, &nt ); if( line == NULL ) break; first = 0; lineval = &line[lvp]; if( stricmp( attr, "xfield" )==0 ) xfield = fref( val ) -1; else if( stricmp( attr, "yfield" )==0 ) yfield = fref( val ) -1; else if( stricmp( attr, "labelfield" )==0 ) lblfield = fref( val ) -1; else if( stricmp( attr, "symbol" )==0 ) strcpy( symbol, lineval ); else if( stricmp( attr, "text" )==0 ) strcpy( text, val ); else if( stricmp( attr, "textdetails" )==0 ) strcpy( textdetails, lineval ); else if( stricmp( attr, "sizefield" )==0 ) sizefield = fref( val ) -1; else if( stricmp( attr, "sizescale" )==0 ) sizescale = atof( val ) * 0.5/72.0; else if( stricmp( attr, "xrange" )==0 ) strcpy( xrange, lineval ); else if( stricmp( attr, "yrange" )==0 ) strcpy( yrange, lineval ); else if( stricmp( attr, "clickmapurl" )==0 ) { if( PLS.clickmap ) { strcpy( mapurl, val ); clickmap_on = 1; } } else if( stricmp( attr, "clickmaplabel" )==0 ) { if( PLS.clickmap ) { strcpy( maplabel, lineval ); clickmap_on = 1; } } else if( stricmp( attr, "clickmaplabeltext" )==0 ) { if( PLS.clickmap ) { getmultiline( "clickmaplabeltext", lineval, MAXTT, maplabel ); clickmap_on = 1; } } else if( stricmp( attr, "linelen" )==0 ) { if( val[0] == '\0' ) linelen = -1.0; else { linelen = atof( val ); if( PLS.usingcm ) linelen /= 2.54; } } else if( stricmp( attr, "linedir" )==0 ) reqlinedir = tolower( val[0] ); else if( stricmp( attr, "linedetails" )==0 ) strcpy( linedetails, lineval ); else if( stricmp( attr, "xlocation" )==0 ) { Eposex( lineval, X, &xloc ); /* val -> lineval scg 5/3/99 */ if( Econv_error() ) Eerr( 2394, "invalid xlocation", val ); } else if( stricmp( attr, "ylocation" )==0 ) { Eposex( lineval, Y, &yloc ); /* val -> lineval 5/3/99 */ if( Econv_error() ) Eerr( 2395, "invalid ylocation", val ); } else if( stricmp( attr, "select" )==0 ) strcpy( selex, lineval ); else if( stricmp( attr, "legendlabel" )==0 ) strcpy( legendlabel, lineval ); else if( stricmp( attr, "cluster" )==0 ) { if( strnicmp( val, YESANS, 1 )==0 ) cluster = 1; else cluster = 0; } else if( stricmp( attr, "clusterdiff" )==0 ) { cluster = 1; clusterdiff = atof( val ); } else if( stricmp( attr, "clustermethod" )==0 ) { cluster = 1; clustermeth = tolower( val[0] ); /* h, v, 2, u, r, .. */ } else if( stricmp( attr, "clusterfact" )==0 ) { cluster = 1; clusterfact = atof( val ) * .01; } else if( stricmp( attr, "clustevery" )==0 ) { cluster = 1; clustevery = atoi( val ); if( clustevery < 1 ) clustevery = 1; } else if( stricmp( attr, "dupsleg" )==0 ) { if( strnicmp( val, YESANS, 1 )==0 ) { dupsleg = 1; cluster = 1; clustermeth = 'l'; strcpy( symbol, "sym6a" ); /* just to get us into symbol mode */ } else dupsleg = 0; } else if( stricmp( attr, "symfield" )==0 ) { strcpy( symbol, "sym6a" ); /* just to get us into symbol mode */ symfield = fref( val ) -1; symfield_userange = 0; } else if( stricmp( attr, "symrangefield" )==0 ) { strcpy( symbol, "sym6a" ); /* just to get us into symbol mode */ symfield = fref( val ) -1; symfield_userange = 1; } else if( stricmp( attr, "verticaltext" )==0 ) { if( strnicmp( val, YESANS, 1 )==0 ) verttext = 1; else verttext = 0; } else if( stricmp( attr, "rectangle" )==0 ) { nt = sscanf( lineval, "%lf %lf %s", &rectw, &recth, val ); if( nt == 3 ) rectoutline = 1; rectw *= 0.5; recth *= 0.5; rectw = Eax( rectw ) - Eax( 0.0 ); recth = Eay( recth ) - Eay( 0.0 ); dorect = 1; } else if( stricmp( attr, "labelword" ) == 0 ) strcpy( labelword, lineval ); else if( stricmp( attr, "vennden" ) == 0 ) vennden = atof( val ); else Eerr( 1, "attribute not recognized", attr ); } /* overrides and degenerate cases */ /* -------------------------- */ if( Nrecords < 1 ) return( Eerr( 17, "No data has been read yet w/ proc getdata", "" ) ); if( !scalebeenset() ) return( Eerr( 51, "No scaled plotting area has been defined yet w/ proc areadef", "" ) ); if( xfield < 0 && yfield < 0 ) return( Eerr( 2205, "Niether xfield nor yfield defined", "" )); if( lblfield >= 0 ) cluster = 0; /* added scg 12/21/00 */ if( stricmp( legendlabel, "#usexname" )==0 ) getfname( xfield+1, legendlabel ); if( stricmp( legendlabel, "#useyname" )==0 ) getfname( yfield+1, legendlabel ); if( dorect ) strcpy( symbol, "" ); /* now do the plotting work.. */ /* -------------------------- */ if( cluster ) { /* make offsets */ for( i = 0; i < 38; i++ ) { ox[i] = xofst[i] * clusterfact; oy[i] = yofst[i] * clusterfact; } /* determine cluster method */ if( clustermeth == 0 ) { if( yfield < 0 ) clustermeth = 'v'; /* 1-d horizontal - cluster vertically (was 'h'-scg 4/21/05) */ else if( xfield < 0 ) clustermeth = 'h'; /* 1-d vertical - cluster horizontally (was 'v'-scg 4/21/05) */ else clustermeth = '2'; /* 2-d cluster */ } } /* ranges */ xlo = EDXlo; xhi = EDXhi; ylo = EDYlo; yhi = EDYhi; if( xrange[0] != '\0' ) { nt = sscanf( xrange, "%s %s", rlo, rhi ); xlo = Econv( X, rlo ); if( Econv_error() ) { Eerr( 3958, "xrange bad format", rlo ); xlo = EDXlo; } if( nt == 2 ) xhi = Econv( X, rhi ); if( Econv_error() ) { Eerr( 3958, "xrange bad format", rhi ); xhi = EDXhi; } } if( yrange[0] != '\0' ) { nt = sscanf( yrange, "%s %s", rlo, rhi ); ylo = Econv( Y, rlo ); if( Econv_error() ) { Eerr( 3958, "yrange bad format", rlo ); ylo = EDYlo; } if( nt == 2 ) yhi = Econv( Y, rhi ); if( Econv_error() ) { Eerr( 3958, "yrange bad format", rhi ); yhi = EDYhi; } } nrow = 0; for( i = 0; i < Nrecords; i++ ) { if( selex[0] != '\0' ) { /* process against selection condition if any.. */ stat = do_select( selex, i, &result ); if( stat != 0 ) { Eerr( stat, "Select error", selex ); continue; } if( result == 0 ) continue; /* reject */ } /* get x value.. */ if( xfield >= 0 ) { x = fda( i, xfield, 'x' ); if( Econv_error() ) { conv_msg( i, xfield, "xfield" ); continue; } if( x < xlo || x > xhi ) continue; } /* get y value.. */ if( yfield >= 0 ) { y = fda( i, yfield, 'y' ); if( Econv_error() ) { conv_msg( i, yfield, "yfield" ); continue; } if( y < ylo || y > yhi ) continue; } /* go to absolute units.. */ if( xfield < 0 ) x = xloc; else x = Eax(x); if( yfield < 0 ) y = yloc; else y = Eay(y); /* put (x,y) into PLV array so points can be sorted.. */ if( nrow >= PLVthirdsize ) { fprintf( PLS.errfp, "point capacity exceeded, skipping data point (raise using -maxvector)\n" ); continue; } dat3d( nrow, 0 ) = x; dat3d( nrow, 1 ) = y; dat3d( nrow, 2 ) = (double)i; /* added scg 12/21/00 - went from dat2d to dat3d */ /* need to keep track of actual location in data array for labels, sizefield, etc.. */ nrow++; } /* if clustering and not using a label field, sort PLV array */ if( cluster && lblfield < 0 && sizefield < 0 ) { if( PLS.debug ) fprintf( PLS.diagfp, "sorting points for scatterplot\n" ); qsort( PLV, nrow, sizeof(double)*3, ptcompare ); } if( verttext ) Etextdir( 90 ); /* these are used in clustering.. */ oldx = NEGHUGE; oldy = NEGHUGE; dupcount = 0; subdupcount = 0; maxdups = 0; strcpy( symcode, "sym6a" ); radius = 0.04; /* in the following, text must come before symbol.. */ if( text[0] != '\0' || lblfield >= 0 ) { textdet( "textdetails", textdetails, &align, &adjx, &adjy, -3, "R", 1.0 ); } if( symbol[0] != '\0' ) { symdet( "symbol", symbol, symcode, &radius ); } if( linelen > 0.0 || rectoutline ) { linedet( "linedetails", linedetails, 0.5 ); } cx = Ecurtextwidth * 0.3; cy = Ecurtextheight * 0.3; hlinelen = linelen * 0.5; txhi = cy + cy; if( text[0] != '\0' ) hw = strlen( text ) * Ecurtextwidth * 0.5; /* now display points.. */ for( irow = 0; irow < nrow; irow++ ) { x = dat3d( irow, 0 ); y = dat3d( irow, 1 ); realrow = (int)dat3d( irow, 2 ); /* added scg 12/21/00 */ /* in this loop, you MUST USE REALROW, NOT IROW for accessing ancillary data fields!! */ if( cluster ) { if( GL_close_to( x, oldx, clusterdiff ) && GL_close_to( y, oldy, clusterdiff ) ) { subdupcount++; if( subdupcount >= clustevery ) { dupcount++; subdupcount = 0; } if( dupcount % 2 == 0 ) flop2 = 1; else flop2 = -1; if( clustermeth == '2' && dupcount > 37 ) { maxdups = 37; dupcount = 0; /* mod */ } if( clustermeth == 'h' ) x += ((dupcount+1)/2) * clusterfact * 2.0 * flop2; else if( clustermeth == 'v' ) y += ((dupcount+1)/2) * clusterfact * 2.0 * flop2; else if( clustermeth == 'u' ) y += dupcount * clusterfact * 2.0; /* 1D upward */ else if( clustermeth == 'r' ) x += dupcount * clusterfact * 2.0; /* 1D rightward */ else if( clustermeth == 'l' ) ; /* legend lookup, no offset */ else if( clustermeth == '2' ) { x += ox[dupcount%38]; y += oy[dupcount%38]; } /* 2-D */ if( clustermeth == 'l' ) { /* if more duplicate points coming, skip.. */ if( irow < nrow-1 ) { double nextx, nexty; nextx = dat3d( irow+1, 0 ); nexty = dat3d( irow+1, 1 ); if( GL_close_to( x, nextx, clusterdiff ) && GL_close_to( y, nexty, clusterdiff ) ) continue; } } } else { if( dupcount > maxdups ) maxdups = dupcount; oldx = x; oldy = y; dupcount = 0; subdupcount = 0; } } /* allow @field substitutions into url */ if( clickmap_on ) { do_subst( expurl, mapurl, realrow, URL_ENCODED ); do_subst( explabel, maplabel, realrow, NORMAL ); } /* render text, mark or line.. */ /* text can be combined with mark if text and symbol both specified */ /* symbol or rectangle.. */ if( symbol[0] != '\0' || dorect || ( text[0] == '\0' && linelen <= 0.0 && lblfield < 0 ) ) { if( symfield >= 0 ) { /* look it up in legend list.. */ if( symfield_userange ) { stat = PL_get_legent_rg( atof( da( realrow, symfield ) ), symbol, NULL, NULL ); } else stat = PL_get_legent( da( realrow, symfield ), symbol, NULL, NULL ); if( stat ) Eerr( 7429, "warning: symfield: no matching legend entry tag found", da( realrow, symfield ) ); if( !dorect ) symdet( "symfield", symbol, symcode, &radius ); } if( dupsleg ) { /* look it up in legend list.. */ stat = PL_get_legent_rg( (double)dupcount+1, symbol, NULL, NULL ); if( stat ) Eerr( 7692, "warning: dupsleg: no appropriate legend entry tag\n", "" ); if( !dorect ) symdet( "symfield", symbol, symcode, &radius ); /* note: currently all marks will be rendered; the last one will be on "top" */ } if( sizefield >= 0 ) radius = sqrt((atof( da( realrow, sizefield ) ) * sizescale)/3.1415927); /* sizefield scales up the AREA of symbol, not the diameter */ if( dorect ) { char color[ COLORLEN ]; strcpy( color, "" ); /* added scg 9/1/05 - heatmap bug */ if( symfield >=0 || dupsleg ) sscanf( symbol, "%s", color ); /* strip off any trailing space */ Ecblock( x-rectw, y-recth, x+rectw, y+recth, color, rectoutline ); symbol[0] = '\0'; } else if( vennden > 0.0 ) { double urad; for( urad = 0.01; urad < radius; urad += vennden ) Emark( x, y, symcode, urad ); } else Emark( x, y, symcode, radius ); if( clickmap_on ) { if( dorect ) clickmap_entry( 'r', expurl, 0, x-rectw, y-recth, x+rectw, y+recth, 0, 0, explabel ); else clickmap_entry( 'r', expurl, 0, x-radius, y-radius, x+radius, y+radius, 0, 0, explabel ); } } /* text */ if( text[0] != '\0' ) { if( symbol[0] != '\0' ) /* set text color etc... */ textdet( "textdetails", textdetails, &align, &adjx, &adjy, -3, "R", 1.0 ); if( sizefield >= 0 ) Etextsize( (int) (atof( da( realrow, sizefield ) ) * sizescale) ); if( verttext ) { ptx = (x+cy)+adjx; pty = y; } /* cy puts midheight of character on point */ else { ptx = x+adjx; pty = (y-cy)+adjy; } convertnl( text ); Emov( ptx, pty ); if( align == '?' ) Edotext( text, 'C' ); else Edotext( text, align ); if( symbol[0] != '\0' ) /* restore symbol color etc... */ symdet( "symbol", symbol, symcode, &radius ); if( clickmap_on ) clickmap_entry( 'r', expurl, 0, ptx-hw, pty, x+hw, y+txhi, 0, 0, explabel ); } /* label from data */ else if( lblfield >= 0 ) { if( sizefield >= 0 ) Etextsize( (int) (atof( da( realrow, sizefield ) ) * sizescale) ); if( verttext) { ptx = (x+cy)+adjx; pty = y+adjy; } /* cy puts midheight of character on point */ else { ptx = x+adjx; pty = (y-cy)+adjy; } strcpy( labeltxt, labelword ); GL_varsub( labeltxt, "@VAL", da( realrow, lblfield ) ); Emov( ptx, pty ); if( align == '?' ) Edotext( labeltxt, 'C' ); else Edotext( labeltxt, align ); if( clickmap_on ) { hw = strlen( labeltxt ) * Ecurtextwidth * 0.5; if( GL_member( align, "C?" ))clickmap_entry( 'r', expurl, 0, ptx-hw, pty, x+hw, y+txhi, 0, 0, explabel ); else if( align == 'L' ) clickmap_entry( 'r', expurl, 0, ptx, pty, x+(hw*2.0), y+txhi, 0, 0, explabel ); else if( align == 'R' ) clickmap_entry( 'r', expurl, 0, ptx-(hw*2.0), pty, x, y+txhi, 0, 0, explabel ); } } /* line */ /* (no clickmap support) */ /* no legend support either (?) */ else if( linelen > 0.0 ) { if( sizefield >= 0 ) hlinelen = linelen * 0.5 * atof( da( realrow, sizefield ) ); /* sizefield acts as a scale factor to linelen */ if( reqlinedir != '\0' ) linedir = reqlinedir; else if( xfield >= 0 && yfield >= 0 ) linedir = 'h'; /* arbitrary .. scg 5/16/03 */ else if( xfield >= 0 ) linedir = 'v'; else linedir = 'h'; /* scg 3/5/03 */ if( linedir == 'v' ) { Emov( x, y-hlinelen ); Elin( x, y+hlinelen ); } else if( linedir == 'u' ) { Emov( x, y ); Elin( x, y+(hlinelen*2.0) ); } else if( linedir == 'r' ) { Emov( x, y ); Elin( x+(hlinelen*2.0), y ); } else { Emov( x-hlinelen, y ); Elin( x+hlinelen, y ); } } } if( verttext ) Etextdir( 0 ); if( legendlabel[0] != '\0' ) { char s[40]; sprintf( s, "%d", nrow ); GL_varsub( legendlabel, "@NVALUES", s ); if( linelen <= 0.0 && lblfield < 0 && text[0] == '\0' ) PL_add_legent( LEGEND_SYMBOL, legendlabel, "", symbol, "", "" ); else if( symbol[0] != '\0' && text[0] != '\0' ) PL_add_legent( LEGEND_SYMBOL+LEGEND_TEXT, legendlabel, "", text, textdetails, symbol ); else if( linelen > 0.0 ) { char dirstr[8]; sprintf( dirstr, "%c", linedir ); PL_add_legent( LEGEND_LINEMARK, legendlabel, "", linedetails, dirstr, "" ); } } setintvar( "NVALUES", nrow ); maxdups++; setintvar( "MAXDUPS", maxdups ); return( 0 ); }