void movemesh() { int num_steps = 1; int step = 1; // just for info of total number of steps int numtri = 1; // number of triangulations needed generateDG(); testdg = dg; cout << "DGmove: movemesh(): Calculating containing elements and area coordinates for each interior point\n"; // cycle over interior points for(int ipoin = 0; ipoin < ninpoin; ipoin++) { // first find containing DG element by "walking-through" the DG dat = dg.find_containing_triangle_and_area_coords(points(ipoin,0), points(ipoin,1), dg.elems.size()/2); // store DG element and area coords in points points(ipoin,2) = dat.elem; for(int i = 0; i < ndim+1; i++) points(ipoin,i+3) = dat.areacoords[i]; } while(num_steps > 0) { //cout << "DGmove: movemesh(): Step " << step << endl; cout << "DGmove: movemesh(): number of steps " << num_steps << endl; // update coordinates in dgpoints using bmotion cout << "DGmove: movemesh(): Moving the Delaunay graph\n"; int k = 0; //testdgpoints.zeros(); for(int i = 0; i < bmot->rows(); i++) { if(bflag(i) == 1) { for(int j = 0; j < ndim; j++) testdgpoints(k,j) = dgpoints(k,j) + bmot->get(i,j); k++; } } // check for validity of Delaunay graph movegraph(testdg, testdgpoints); testdg.compute_jacobians(); check = testdg.detect_negative_jacobians(); cout << "DGmove: movemesh(): Check is " << check << endl; if(check == true) { testdgpoints = dgpoints; // reset testdgpoints to original values testdg = dg; // reset the DG as well //halve the boundary motion for(int i = 0; i < bmot->rows(); i++) for(int j = 0; j < bmot->cols(); j++) (*bmot)(i,j) = bmot->get(i,j)/2; num_steps *= 2; continue; } else { dgpoints = testdgpoints; movegraph(dg, dgpoints); num_steps--; } // calculate new positions of interior points by mapping them to deformed DG elements using area coordinates calculated before cout << "DGmove: movemesh(): Moving the interior points\n"; int elem; for(int ipoin = 0; ipoin < ninpoin; ipoin++) { elem = points(ipoin,2); for(int dim = 0; dim < ndim; dim++) { points(ipoin,dim) = 0.0; for(int i = 0; i < ndim+1; i++) points(ipoin,dim) += points(ipoin,i+3)*dgpoints(dginpoel(elem,i),dim); } } //ouput intermediate mesh newcoords = getcoords(); m->setcoords(&newcoords); //m->writeGmsh2("mesh-step"+to_string(step)+".msh"); writeMeshToVtu("xmesh-step"+to_string(step)+".vtu", *m); cout << "DGmove: movemesh(): Intermediate mesh written\n"; if(num_steps > 0) { cout << "DGmove: movemesh(): Re-triangulating\n"; dg.clear(); dg.setup(&dgpoints,ndgpoin); generateDG(); numtri++; // re-calculate area-coords for(int ipoin = 0; ipoin < ninpoin; ipoin++) { // first find containing DG element by "walking-through" the DG dat = dg.find_containing_triangle_and_area_coords(points(ipoin,0), points(ipoin,1), dg.elems.size()/2); // store DG element and area coords in points points(ipoin,2) = dat.elem; for(int i = 0; i < ndim+1; i++) points(ipoin,i+3) = dat.areacoords[i]; } } step++; } cout << "DGmove: movemesh(): Number of triangulations needed: " << numtri << ".\n"; }
int PLP_annotate() { char attr[NAMEMAXLEN], val[256]; char *line, *lineval; int nt, lvp; int first; int align; double adjx, adjy; double x, y; char textdetails[256]; char fromfile[256]; int fromfilemode; int nlines, maxlen; char box[256]; char backcolor[COLORLEN]; int verttext; double bm; char mapurl[MAXPATH]; double bevelsize, shadowsize; char lowbevelcolor[COLORLEN], hibevelcolor[COLORLEN], shadowcolor[COLORLEN]; int ioutline; char maplabel[MAXTT]; int clickmap_on; int do_ellipse; double bd_1, bd_2, bd_3, bd_4; int backdim; double cx, cy, px, py; int clip; TDH_errprog( "pl proc annotate" ); /* initialize */ strcpy( PL_bigbuf, "" ); strcpy( textdetails, "" ); strcpy( fromfile, "" ); fromfilemode = 0; x = 3.0; y = 3.0; arrowh = arrowt = 0; arrow2h = arrow2t = 0; strcpy( arrowdet, "" ); ahsize = 0.1; strcpy( box, "" ); strcpy( backcolor, "" ); verttext = 0; bm = 0.0; strcpy( mapurl, "" ); bevelsize = 0.0; shadowsize = 0.0; strcpy( lowbevelcolor, "0.6" ); strcpy( hibevelcolor, "0.8" ); strcpy( shadowcolor, "black" ); strcpy( maplabel, "" ); clickmap_on = 0; do_ellipse = 0; backdim = 0; clip = 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, "location" )==0 ) { getcoords( "location", lineval, &x, &y ); } else if( stricmp( attr, "text" )==0 ) getmultiline( "text", lineval, MAXBIGBUF, PL_bigbuf ); else if( stricmp( attr, "textdetails" )==0 ) strcpy( textdetails, lineval ); else if( stricmp( attr, "fromfile" )==0 ) { strcpy( fromfile, lineval ); fromfilemode = 1; } else if( stricmp( attr, "fromcommand" )==0 ) { strcpy( fromfile, lineval ); fromfilemode = 2; } else if( stricmp( attr, "arrowhead" )==0 ) { getcoords( "arrowhead", lineval, &ahx, &ahy ); arrowh = 1; } else if( stricmp( attr, "arrowtail" )==0 ) { getcoords( "arrowtail", lineval, &atx, &aty ); arrowt = 1; } else if( stricmp( attr, "arrowhead2" )==0 ) { getcoords( "arrowhead2", lineval, &ah2x, &ah2y ); arrow2h = 1; } else if( stricmp( attr, "arrowtail2" )==0 ) { getcoords( "arrowtail2", lineval, &at2x, &at2y ); arrow2t = 1; } else if( stricmp( attr, "arrowdetails" )==0 ) strcpy( arrowdet, lineval ); else if( stricmp( attr, "arrowheadsize" )==0 ) { ahsize = atof( val ); if( ahsize <= 0.0 ) ahsize = 0.0; /* no arrow */ if( PLS.usingcm ) ahsize /= 2.54; } else if( stricmp( attr, "box" )==0 || stricmp( attr, "outline" )==0 ) strcpy( box, lineval ); else if( stricmp( attr, "ellipse" )==0 ) { if( strnicmp( val, YESANS, 1 )==0 ) do_ellipse = 1; else do_ellipse = 0; } 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, "boxmargin" )==0 ) { bm = atof( val ); if( PLS.usingcm ) bm /= 2.54; } else if( stricmp( attr, "verttext" )==0 ) { if( strnicmp( val, YESANS, 1 )==0 ) verttext = 1; else verttext = 0; } else if( stricmp( attr, "backcolor" )==0 ) strcpy( backcolor, val ); else if( stricmp( attr, "bevelsize" )==0 ) bevelsize = atof( val ); else if( stricmp( attr, "shadowsize" )==0 ) shadowsize = atof( val ); else if( stricmp( attr, "lowbevelcolor" )==0 ) strcpy( lowbevelcolor, val ); else if( stricmp( attr, "hibevelcolor" )==0 ) strcpy( hibevelcolor, val ); else if( stricmp( attr, "shadowcolor" )==0 ) strcpy( shadowcolor, val ); else if( stricmp( attr, "backdim" )==0 ) { PL_getbox( "backdim", lineval, &bd_1, &bd_2, &bd_3, &bd_4 ); backdim = 1; } else if( stricmp( attr, "clip" )==0 ) { if( strnicmp( val, YESANS, 1 )==0 ) clip = 1; else clip = 0; } else Eerr( 1, "attribute not recognized", attr ); } if( fromfilemode > 0 ) file_to_buf( fromfile, fromfilemode, PL_bigbuf, MAXBIGBUF ); textdet( "textdetails", textdetails, &align, &adjx, &adjy, 0, "R", 1.0 ); if( align == '?' ) align = 'C'; px = x + adjx; py = y + adjy; /* figure backing box */ measuretext( PL_bigbuf, &nlines, &maxlen ); boxw = (maxlen+2) * Ecurtextwidth; boxh = (nlines*1.2) * Ecurtextheight; uly = py + Ecurtextheight; if( align == 'C' ) ulx = px - (boxw/2.0); else if( align == 'L' ) ulx = px; else if( align == 'R' ) ulx = px - boxw; if( bm != 0.0 ) { ulx -= bm; uly += bm; boxw += (bm*2); boxh += (bm*2); } if( clip ) PLG_pcodeboundingbox( 0 ); /* clip the annotation to the cropped size (by turning off bb) */ if( backcolor[0] != '\0' || ( box[0] != '\0' && strnicmp( box, "no", 2 )!= 0 ) ) { if( box[0] != '\0' && strnicmp( box, "no", 2 )!= 0 ) { ioutline = 1; linedet( "box", box, 0.5 ); } else ioutline = 0; if( do_ellipse ) { cx = ulx+(boxw/2.0); cy = uly-(boxh/2.0); if( backdim ) { cx = bd_1; cy = bd_2; boxw = bd_3; boxh = bd_4; } do_arrows(); /* do this before ellipse to get abutting edge */ PLG_ellipse( cx, cy, ((boxw/2.0)*1.3), ((boxh/2.0)*1.3), backcolor, ioutline ); } else { if( backdim ) { ulx = bd_1; uly = bd_2; boxw = bd_3; boxh = bd_4; } do_arrows(); /* do this before fill to get abutting edge */ Ecblock( ulx, (uly-boxh), ulx+boxw, uly, backcolor, ioutline ); if( bevelsize > 0.0 || shadowsize > 0.0 ) Ecblockdress( ulx, (uly-boxh), ulx+boxw, uly, bevelsize, lowbevelcolor, hibevelcolor, shadowsize, shadowcolor); } } else do_arrows(); if( clickmap_on ) { if( backdim && do_ellipse ) { /* need to solve back to ulx,uly in this case.. */ ulx = (((boxw/2.0)-cx)*-1.0); uly = (((boxw/2.0)-cy)*-1.0) + boxh; } clickmap_entry( 'r', mapurl, 0, ulx, (uly-boxh), ulx+boxw, uly, 1, 0, maplabel ); } /* now render the text.. */ textdet( "textdetails", textdetails, &align, &adjx, &adjy, 0, "R", 1.0 ); /* need to do again */ if( align == '?' ) align = 'C'; Emov( x + adjx, y + adjy ); if( verttext ) Etextdir( 90 ); Edotext( PL_bigbuf, align ); if( verttext ) Etextdir( 0 ); if( clip ) PLG_pcodeboundingbox( 1 ); /* restore */ return( 0 ); }
int PLP_line() { char attr[NAMEMAXLEN], *line, *lineval; int lvp, first; char buf[256]; double x, y, ancx, ancy; char *linedetails, *drawpoints; char notation; char a[40], b[40], c[40], d[40]; int nt, ix, buflen, ancgiven; TDH_errprog( "pl proc line" ); /* initialize */ linedetails = ""; notation = LOCVAL; x = 0.0; y = 0.0; ancx = 0.0; ancy = 0.0; ancgiven = 0; /* get attributes.. */ first = 1; while( 1 ) { line = getnextattr( first, attr, &lvp ); if( line == NULL ) break; first = 0; lineval = &line[lvp]; if( strcmp( attr, "points" )==0 ) drawpoints = getmultiline( lineval, "get" ); else if( strcmp( attr, "linedetails" )==0 ) linedetails = lineval; else if( strcmp( attr, "notation" )==0 ) notation = lineval[0]; else if( strcmp( attr, "anchor" )==0 ) { getcoords( "anchor", lineval, &ancx, &ancy ); ancgiven = 1; } else Eerr( 1, "attribute not recognized", attr ); } /* overrides & sanity checks.. */ if( notation != ABSOLUTE && notation != SCALED && notation != LOCVAL ) { notation = LOCVAL; Eerr( 479, "warning: invalid 'notation'.. using locval", "" ); } if( ancgiven && notation == SCALED ) { Eerr( 478, "warning, 'anchor' can't be used with notation=scaled .. ignored", "" ); ancx = ancy = 0.0; } /* now do the plotting work.. */ linedet( "linedetails", linedetails, 1.0 ); ix = 0; first = 1; buflen = strlen( drawpoints ); while( 1 ) { GL_getchunk( buf, drawpoints, &ix, "\n" ); nt = sscanf( buf, "%s %s %s %s", a, b, c, d ); if( nt == 4 || first ) { if( notation == ABSOLUTE ) { Emov( atof( a )+ancx, atof( b )+ancy ); Elin( atof( c )+ancx, atof( d )+ancy ); } else if( notation == SCALED ) { Emov( PL_u( X, a ), PL_u( Y, b ) ); if( Econv_error() ) Eerr( 2945, "unplottable value(s) ", buf ); if( nt == 4 ) { Elin( PL_u( X, c ), PL_u( Y, d ) ); if( Econv_error() ) Eerr( 2946, "unplottable value(s) ", buf ); } } else if( notation == LOCVAL ) { Eposex( a, X, &x ); Eposex( b, Y, &y ); Emov( x+ancx, y+ancy ); if( Econv_error() ) Eerr( 2947, "unplottable value(s) ", buf ); Eposex( c, X, &x ); Eposex( d, Y, &y ); Elin( x+ancx, y+ancy ); if( Econv_error() ) Eerr( 2948, "unplottable value(s) ", buf ); } } else if( nt == 2 ) { if( notation == ABSOLUTE ) Elin( atof( a )+ancx, atof( b )+ancy ); else if( notation == SCALED ) Elin( PL_u( X, a ), PL_u( Y, b ) ); else if( notation == LOCVAL ) { Eposex( a, X, &x ); Eposex( b, Y, &y ); Elin( x+ancx, y+ancy ); } } else if( nt <= 0 ) ; else Eerr( 2959, "warning: points must have either 4 or 2 values per line", "" ); first = 0; if( ix >= buflen ) break; } return( 0 ); }
int PLP_page( ) { int lvp, first; char attr[NAMEMAXLEN], *line, *lineval; char buf[512], devval[20]; char *outfilename, *mapfilename, *titledet, *pagetitle, *url; int stat, nt, align, nlines, maxlen, landscapemode, dobackground, dopagebox, pagesizegiven, clickmap_enabled_here, tight, map; double adjx, adjy, scalex, scaley, sx, sy; TDH_errprog( "pl proc page" ); /* initialize */ landscapemode = PLS.landscape; /* from command line */ titledet = ""; outfilename = ""; mapfilename = ""; pagetitle = ""; dobackground = 1; dopagebox = 1; if( GL_member( PLS.device, "gesf" )) dopagebox = 0; /* bounding box shouldn't include entire page for gif , eps */ if( PLS.device == 'e' ) dobackground = 0; pagesizegiven = 0; strcpy( devval, "" ); scalex = scaley = 1.0; clickmap_enabled_here = 0; /* get attributes.. */ first = 1; while( 1 ) { line = getnextattr( first, attr, &lvp ); if( line == NULL ) break; first = 0; lineval = &line[lvp]; /* if an attribute is given on command line, it overrides anything here.. */ if( GL_slmember( attr, PLS.cmdlineparms )) continue; if( strcmp( attr, "landscape" )==0 && GL_slmember( "portrait", PLS.cmdlineparms )) continue; if( strcmp( attr, "outfilename" )==0 && GL_slmember( "o", PLS.cmdlineparms )) continue; if( strcmp( attr, "landscape" )==0 ) landscapemode = getyn( lineval ); else if( strcmp( attr, "title" )==0 ) pagetitle = getmultiline( lineval, "get" ); else if( strcmp( attr, "titledetails" )==0 ) titledet = lineval; else if( strcmp( attr, "color" )==0 ) tokncpy( Estandard_color, lineval, COLORLEN ); else if( strcmp( attr, "scale" )==0 ) { nt = sscanf( lineval, "%lf %lf", &scalex, &scaley ); if( nt == 1 ) scaley = scalex; } else if( strcmp( attr, "backgroundcolor" )==0 ) { tokncpy( Estandard_bkcolor, lineval, COLORLEN ); Ebackcolor( Estandard_bkcolor ); dobackground = 1; /* added scg 9/27/99 */ } else if( strcmp( attr, "linewidth" )==0 ) Estandard_lwscale = ftokncpy( lineval ); else if( strcmp( attr, "textsize" )==0 ) Estandard_textsize = itokncpy( lineval ); else if( strcmp( attr, "font" )==0 ) tokncpy( Estandard_font, lineval, FONTLEN ); else if( strcmp( attr, "dobackground" )==0 ) dobackground = getyn( lineval ); else if( strcmp( attr, "dopagebox" )==0 ) dopagebox = getyn( lineval ); else if( strcmp( attr, "tightcrop" )==0 ) { tight = getyn( lineval ); Etightbb( tight ); } else if( strncmp( attr, "crop", 4 )==0 ) { double cropx1, cropy1, cropx2, cropy2; nt = sscanf( lineval, "%lf %lf %lf %lf", &cropx1, &cropy1, &cropx2, &cropy2 ); if( nt != 4 ) Eerr( 2707, "usage: crop x1 y1 x2 y2 OR croprel left bottom right top", "" ); else { if( PLS.usingcm ) { cropx1 /= 2.54; cropy1 /= 2.54; cropx2 /= 2.54; cropy2 /= 2.54; } if( strcmp( attr, "croprel" )==0 ) Especifycrop( 2, cropx1, cropy1, cropx2, cropy2 ); /* relative to tight */ else Especifycrop( 1, cropx1, cropy1, cropx2, cropy2 ); /* absolute */ } } else if( strcmp( attr, "pixsize" ) ==0 ) { /* added scg 1/9/08 */ int reqwidth, reqheight; nt = sscanf( lineval, "%d %d", &reqwidth, &reqheight ); if( nt != 2 ) Eerr( 57233, "pixsize ignored.. it requires width and height (in pixels)", "" ); #ifndef NOGD PLGG_setimpixsize( reqwidth, reqheight ); #endif if( PLS.device != 'g' ) Eerr( 24795, "pixsize ignored.. it's only applicable when generating png/gif/jpeg images", "" ); } else if( strcmp( attr, "pagesize" )==0 ) { getcoords( "pagesize", lineval, &(PLS.winw), &(PLS.winh) ); pagesizegiven = 1; } else if( strcmp( attr, "outfilename" )==0 ) { outfilename = lineval; if( strlen( outfilename ) > MAXPATH-1 ) { PLS.skipout = 1; return( Eerr( 57932, "outfilename too long", "" ) ); } } else if( strncmp( attr, "mapfile", 7 )==0 ) { mapfilename = lineval; if( strlen( mapfilename ) > MAXPATH-1 ) { Eerr( 57932, "mapfile name too long", "" ); mapfilename = ""; } } else if( strcmp( attr, "clickmapdefault" )==0 ) { url = lineval; if( strlen( url ) > MAXURL-1 ) Eerr( 57933, "clickmapdefault url too long", "" ); else clickmap_setdefaulturl( url ); } else if( strcmp( attr, "map" )==0 ) { map = getyn( lineval ); if( map ) { PLS.clickmap = 1; clickmap_enabled_here = 1; }} else if( strcmp( attr, "csmap" )==0 ){ map = getyn( lineval ); if( map ) { PLS.clickmap = 2; clickmap_enabled_here = 1; }} else if( strcmp( attr, "outlabel" )==0 ) Esetoutlabel( lineval ); else Eerr( 1, "page attribute not recognized", attr ); } /* -------------------------- */ /* Page break logic.. */ /* -------------------------- */ if( PLS.npages == 0 ) { /* following 3 lines moved here from above - also replicated below. scg 10/31/00 */ if( scalex != 1.0 || scaley != 1.0 ) Esetglobalscale( scalex, scaley ); Egetglobalscale( &sx, &sy ); if( pagesizegiven ) Esetsize( PLS.winw * sx, PLS.winh * sy, PLS.winx, PLS.winy ); else if( landscapemode && !PLS.winsizegiven ) Esetsize( 11.0, 8.5, PLS.winx, PLS.winy ); /* landscape */ /* clickmap (must come before init for eg. svg - scg 2/7/05) */ if( clickmap_enabled_here ) { if( mapfilename[0] == '\0' ) { if( PLS.clickmap == 2 ) strcpy( PLS.mapfile, "stdout" ); /* csmap defaults to stdout.. scg 8/26/04 */ else if( PLS.outfile[0] != '\0' ) makeoutfilename( PLS.outfile, PLS.mapfile, 'm', 1); else strcpy( PLS.mapfile, "unnamed.map" ); } PL_clickmap_init(); #ifndef NOSVG /* must update this now too.. scg 2/7/05 */ if( PLS.device == 's' ) PLGS_setparms( PLS.debug, PLS.tmpname, PLS.clickmap ); #endif } else if( mapfilename[0] != '\0' ) strcpy( PLS.mapfile, mapfilename ); /* PPP */ /* initialize and give specified output file name .. */ if( outfilename[0] != '\0' ) Esetoutfilename( outfilename ); stat = Einit( PLS.device ); if( stat ) { PLS.skipout = 1; return( stat ); } /* set paper orientation */ if( landscapemode ) Epaper( 1 ); } else if( PLS.npages > 0 ) { if( GL_member( PLS.device, "gesf" )) { /* finish up current page before moving on to next one.. */ Eshow(); stat = Eendoffile(); if( stat ) return( stat ); /* now set file name for next page.. */ if( outfilename[0] != '\0' ) Esetoutfilename( outfilename ); else { makeoutfilename( PLS.outfile, buf, PLS.device, (PLS.npages)+1 ); if( PLS.debug ) fprintf( PLS.diagfp, "Setting output file name to %s\n", PLS.outfile ); Esetoutfilename( buf ); } if( PLS.clickmap ) { /* initialize a new click map file.. */ if( mapfilename[0] != '\0' ) strcpy( PLS.mapfile, mapfilename ); else makeoutfilename( PLS.outfile, PLS.mapfile, 'm', (PLS.npages)+1 ); PL_clickmap_init(); } /* perhaps set global scaling and/or page size for next page.. */ /* following 3 lines copied here from above - scg 10/31/00 */ if( scalex != 1.0 || scaley != 1.0 ) Esetglobalscale( scalex, scaley ); Egetglobalscale( &sx, &sy ); if( pagesizegiven ) Esetsize( PLS.winw * sx, PLS.winh * sy, PLS.winx, PLS.winy ); else if( landscapemode && !PLS.winsizegiven ) Esetsize( 11.0, 8.5, PLS.winx, PLS.winy ); /* landscape */ /* initialize next page.. */ stat = Einit( PLS.device ); if( stat ) return( stat ); } else if ( PLS.device == 'x' ) PL_do_x_button( "More.." ); else if ( GL_member( PLS.device, "pc" ) ) { Eprint(); if( landscapemode ) Epaper( 1 ); /* added scg 2/29/00 */ Elinetype( 0, 0.6, 1.0 ); /* added scg 9/20/99 */ } } (PLS.npages)++; /* -------------------------- */ /* now do other work.. */ /* -------------------------- */ /* do background.. */ /* if( dopagebox ) Ecblock( 0.0, 0.0, EWinx, EWiny, Ecurbkcolor, 0 ); */ /* does update bb */ if( dopagebox ) Ecblock( 0.0, 0.0, PLS.winw, PLS.winh, Ecurbkcolor, 0 ); /* does update bb */ else if( dobackground ) { /* EPS color=transparent - best to do nothing.. */ if( PLS.device == 'e' && strcmp( Ecurbkcolor, "transparent" )==0 ) ; else Eclr(); /* doesn't update bb */ } if( pagetitle[0] != '\0' ) { textdet( "titledetails", titledet, &align, &adjx, &adjy, 3, "B", 1.0 ); if( align == '?' ) align = 'C'; measuretext( pagetitle, &nlines, &maxlen ); if( align == 'L' ) Emov( 1.0 + adjx, (PLS.winh-0.8) + adjy ); else if ( align == 'C' ) Emov( (PLS.winw / 2.0 ) + adjx, (PLS.winh-0.8) + adjy ); else if( align == 'R' ) Emov( (PLS.winw-1.0) + adjx, (PLS.winh-0.8) + adjy ); Edotext( pagetitle, align ); } return( 0 ); }
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_venndisk() { char attr[NAMEMAXLEN], val[256]; char *line, *lineval; int first, nt, lvp; double cenx, ceny, area, radius; char color[COLORLEN]; char leglabel[128]; double densfact; char outline[128]; double ofs; int botflag; double areascale; int datadriven, xfld, areafld, clrfld; double yloc; int irow; double y; int solidfill; int lblfld; char lbldet[128]; double adjx, adjy; int align; TDH_errprog( "pl proc venn" ); cenx = ceny = area = -1.0; densfact = 1.0; strcpy( leglabel, "" ); strcpy( color, "red" ); strcpy( outline, "" ); botflag = 0; areascale = 1.0; ofs = 0.0; datadriven = xfld = areafld = clrfld = 0; yloc = 0.5; solidfill = 0; lblfld = 0; strcpy( lbldet, "" ); /* 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, "location" )==0 ) getcoords( "location", lineval, &cenx, &ceny ); else if( stricmp( attr, "bottomlocation" )==0 ) { getcoords( "bottomlocation", lineval, &cenx, &ceny ); /* given in scale units */ botflag = 1; } else if( stricmp( attr, "area" )==0 ) area = atof( val ); /* square inches unless areascale given */ else if( stricmp( attr, "areascale" )==0 ) areascale = atof( val ); else if( stricmp( attr, "color" )==0 ) strcpy( color, val ); else if( stricmp( attr, "legendlabel" )==0 || stricmp( attr, "label" )==0 ) strcpy( leglabel, lineval ); else if( stricmp( attr, "labelfield" )==0 ) lblfld = fref( val ); else if( stricmp( attr, "labeldetails" )==0 ) strcpy( lbldet, lineval ); else if( stricmp( attr, "density" )==0 ) densfact = atof( val ); else if( stricmp( attr, "outline" )==0 ) strcpy( outline, lineval ); else if( stricmp( attr, "dotsize" )==0 ) ofs = atof( val ); else if( stricmp( attr, "areafld" )==0 ) { areafld = fref( val ); datadriven = 1; } else if( stricmp( attr, "xfld" )==0 ) xfld = fref( val ); else if( stricmp( attr, "colorfld" )==0 ) clrfld = fref( val ); else if( stricmp( attr, "yloc" )==0 ) yloc = atof( val ); else if( stricmp( attr, "solidfill" )==0 ) { if( strnicmp( val, YESANS, 1 )==0 ) solidfill = 1; else solidfill = 0; } else Eerr( 1, "attribute not recognized", attr ); } /* sanity checks.. */ if( !datadriven ) { if( cenx < 0.0 || ceny < 0.0 || area < 0.0 ) return( Eerr( 428, "The attributes x, y, and area must all be specified", "" ) ); } if( datadriven && !scalebeenset() ) return( Eerr( 51, "datadriven requires scaled units.. no scaled plotting area has been defined yet w/ proc areadef", "" )); /* overrides.. */ if( solidfill ) densfact = 0.0; if( datadriven ) { ceny = Ea( Y, yloc ); for( irow = 0; irow < Nrecords; irow++ ) { area = atof( da( irow, areafld-1 ) ); area *= areascale; if( area > 50.0 ) { Eerr( 72405, "skipping a very large disk", da( irow, areafld ) ); continue; } radius = sqrt( area / PI ); if( xfld > 0 ) cenx = Ea( X, fda( irow, xfld-1, X )); else cenx = Ea( X, (double)(irow+1) ); if( clrfld > 0 ) strcpy( color, da( irow, clrfld-1 )); y = ceny + radius; /* so all disk bottoms are on the line.. */ do_disk( cenx, y, radius, color, densfact, ofs, outline, solidfill ); if( lblfld > 0 ) { double labx, laby; textdet( "labeldetails", lbldet, &align, &adjx, &adjy, -2, "R", 1.0 ); if( align == '?' ) align = 'C'; labx = cenx+adjx; laby = (Elimit( Y, 'l', 'a' )-(Ecurtextheight*2.0))+adjy; Emov( labx, laby ); Edotext( da( irow, lblfld-1 ), align ); } } } else { /* individual disks */ /* now do the plotting work.. */ /* convert area to a radius in inches.. */ area *= areascale; if( area > 50.0 ) return( Eerr( 72405, "disk area is too large.. reduce 'area' or reduce 'areascale'", "" ) ); radius = sqrt( area / PI ); if( PLS.usingcm ) { cenx /= 2.54; ceny /= 2.54; ofs /= 2.54; radius /= 2.54; } if( botflag ) ceny += radius; do_disk( cenx, ceny, radius, color, densfact, ofs, outline, solidfill ); if( leglabel[0] != '\0' ) PL_add_legent( LEGEND_COLOR, leglabel, "", color, "", "" ); } return( 0 ); }