123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- /* Function: do_plt
- **
- ** Author: Paul W. Carlson March 1992
- */
- #include <string.h>
- #include <grass/gis.h>
- #include <grass/glocale.h>
- #include <grass/symbol.h>
- #include "clr.h"
- #include "local_proto.h"
- int do_plt(int after_masking)
- {
- FILE *fp;
- char buf[1024], symb[1024], sname[100];
- char name[1024] /*, prev_name[50] */;
- double e1, n1, e2, n2, llx, lly, urx, ury;
- int color_R, color_G, color_B;
- int fcolor_R, fcolor_G, fcolor_B;
- int masked;
- double size, scale, rotate;
- int i;
- int x_int, y_int;
- double width, x, y, x_off, y_off;
- PSCOLOR pcolor, pfcolor;
- SYMBOL *Symb;
- static int snum = 0;
- if (PS.plfile == NULL)
- return 1;
- fp = fopen(PS.plfile, "r");
- if (fp == NULL) {
- error("point/line file", "", "can't open");
- return 1;
- }
- G_message(_("Reading point/line file ..."));
- while (fgets(buf, sizeof buf, fp))
- switch (*buf) {
- case 'L':
- if (sscanf(buf, "L %d %lf %lf %lf %lf %d %d %d %lf", &masked, &e1,
- &n1, &e2, &n2, &color_R, &color_G, &color_B,
- &width) == 9) {
- if (masked && after_masking)
- continue;
- if (!masked && !after_masking)
- continue;
- if (color_R == -1)
- continue; /* ie color was set to "none" */
- set_color(&pcolor, color_R, color_G, color_B);
- set_ps_color(&pcolor);
- set_line_width(width);
- if (G_projection() == PROJECTION_LL) {
- /* use the same method as the vlines instruction,
- for completely out of region lines just move, don't put
- the pen down. but the thing this method has going for it
- is that for lat/lon (AFAIU) it draws the line twice,
- so that at least one of them will go the desired way
- around the sphere, and the other will be discarded.
- (I think). But it means your self-defined lines need to
- keep at least one little toe in the map box. --HB Feb2012 */
- start_line(e1, n1);
- sec_draw = 0;
- G_plot_line(e1, n1, e2, n2);
- }
- else {
- G_plot_where_xy(e1, n1, &x_int, &y_int);
- llx = (double)x_int / 10.;
- lly = (double)y_int / 10.;
- G_plot_where_xy(e2, n2, &x_int, &y_int);
- urx = (double)x_int / 10.;
- ury = (double)y_int / 10.;
- fprintf(PS.fp, " %.1f %.1f NM %.1f %.1f LN",
- llx, lly, urx, ury);
- }
- fprintf(PS.fp, " stroke\n");
- }
- break;
- case 'R':
- if (sscanf(buf, "R %d %lf %lf %lf %lf %d %d %d %d %d %d %lf",
- &masked, &e1, &n1, &e2, &n2, &color_R, &color_G,
- &color_B, &fcolor_R, &fcolor_G, &fcolor_B,
- &width) == 12) {
- if (masked && after_masking)
- continue;
- if (!masked && !after_masking)
- continue;
- fprintf(PS.fp, " NP\n");
- G_plot_where_xy(e1, n1, &x_int, &y_int);
- llx = (double)x_int / 10.;
- lly = (double)y_int / 10.;
- G_plot_where_xy(e2, n2, &x_int, &y_int);
- urx = (double)x_int / 10.;
- ury = (double)y_int / 10.;
- fprintf(PS.fp, " %.1f %.1f M %.1f %.1f LN\n", llx, lly, urx,
- lly);
- fprintf(PS.fp, " %.1f %.1f LN %.1f %.1f LN\n", urx, ury, llx,
- ury);
- fprintf(PS.fp, " CP\n");
- if (fcolor_R != -1) { /* ie color is not set to "none" */
- set_color(&pfcolor, fcolor_R, fcolor_G, fcolor_B);
- set_ps_color(&pfcolor);
- fprintf(PS.fp, " F\n");
- }
- if (color_R != -1) { /* ie color is not set to "none" */
- set_color(&pcolor, color_R, color_G, color_B);
- set_ps_color(&pcolor);
- set_line_width(width);
- fprintf(PS.fp, " D\n");
- }
- }
- break;
- case 'P':
- i = sscanf(buf, "P %d %lf %lf %d %d %d %d %d %d %lf %lf %s %lf",
- &masked, &e1, &n1, &color_R, &color_G, &color_B,
- &fcolor_R, &fcolor_G, &fcolor_B, &size, &rotate, symb,
- &width);
- if (i == 13) {
- if (masked && after_masking)
- continue;
- if (!masked && !after_masking)
- continue;
- if (size <= 0.0)
- size = 10;
- /* HB 7/2005: allow all points through as only way to generate
- one is explicitly with the ps.map "point" instruction. */
- /*
- if (n1 > PS.w.north || n1 < PS.w.south) continue;
- if (e1 > PS.w.east || e1 < PS.w.west ) continue;
- */
- G_plot_where_xy(e1, n1, &x_int, &y_int);
- x = (double)x_int / 10.;
- y = (double)y_int / 10.;
- if (color_R == -1)
- unset_color(&pcolor);
- else
- set_color(&pcolor, color_R, color_G, color_B);
- if (fcolor_R == -1)
- unset_color(&pfcolor);
- else
- set_color(&pfcolor, fcolor_R, fcolor_G, fcolor_B);
- if (width < 0) /* default: autoscale relative to size */
- width = 0.05 * size;
- /* Read symbol */
- sprintf(sname, "POINTSYMBOL%d", snum);
- Symb = S_read(symb);
- if (Symb == NULL)
- G_warning(_("Cannot read symbol, using default icon"));
- symbol_save(Symb, &pcolor, &pfcolor, sname);
- symbol_draw(sname, x, y, size, rotate, width);
- snum++;
- }
- break;
- case 'E': /* EPS file */
- if (sscanf(buf, "E %d %lf %lf %lf %lf %[^\n]s",
- &masked, &e1, &n1, &scale, &rotate, name) == 6) {
- if (masked && after_masking)
- continue;
- if (!masked && !after_masking)
- continue;
- /* find eps bbox */
- if (!eps_bbox(name, &llx, &lly, &urx, &ury))
- continue;
- G_plot_where_xy(e1, n1, &x_int, &y_int);
- x = (double)x_int / 10.;
- y = (double)y_int / 10.;
- /* calculate translation */
- eps_trans(llx, lly, urx, ury, x, y, scale, rotate, &x_off,
- &y_off);
- /* write eps to PS */
- eps_draw(PS.fp, name, x_off, y_off, scale, rotate);
- }
- break;
- }
- fclose(fp);
- return 0;
- }
|