[GRASS-SVN] r69986 - grass/trunk/display/d.linegraph
svn_grass at osgeo.org
svn_grass at osgeo.org
Sat Dec 3 13:29:30 PST 2016
Author: wenzeslaus
Date: 2016-12-03 13:29:30 -0800 (Sat, 03 Dec 2016)
New Revision: 69986
Modified:
grass/trunk/display/d.linegraph/main.c
Log:
d.linegraph: scale for X and Y values or labels
Modified: grass/trunk/display/d.linegraph/main.c
===================================================================
--- grass/trunk/display/d.linegraph/main.c 2016-12-03 20:48:29 UTC (rev 69985)
+++ grass/trunk/display/d.linegraph/main.c 2016-12-03 21:29:30 UTC (rev 69986)
@@ -220,6 +220,8 @@
struct Option *point_color2_opt;
struct Option *secondary_width_opt;
struct Flag *do_points_flg, *no_lines_flg;
+ struct Option *x_scale_opt, *y_scale_opt;
+ struct Flag *x_scale_labels_flg, *y_scale_labels_flg;
/* Initialize the GIS calls */
G_gisinit(argv[0]);
@@ -317,6 +319,26 @@
ytics_opt->required = NO;
ytics_opt->multiple = YES;
+ x_scale_opt = G_define_option();
+ x_scale_opt->key = "x_scale";
+ x_scale_opt->description = _("Scale for X values");
+ x_scale_opt->type = TYPE_DOUBLE;
+ x_scale_opt->required = NO;
+
+ y_scale_opt = G_define_option();
+ y_scale_opt->key = "y_scale";
+ y_scale_opt->description = _("Scale for Y values");
+ y_scale_opt->type = TYPE_DOUBLE;
+ y_scale_opt->required = NO;
+
+ x_scale_labels_flg = G_define_flag();
+ x_scale_labels_flg->key = 'x';
+ x_scale_labels_flg->description = "Scale only X labels, not values";
+
+ y_scale_labels_flg = G_define_flag();
+ y_scale_labels_flg->key = 'y';
+ y_scale_labels_flg->description = "Scale only Y labels, not values";
+
point_symbol_opt = G_define_option();
/* TODO: name must be icon to get GUI dialog */
point_symbol_opt->key = "icon";
@@ -412,6 +434,30 @@
G_fatal_error(_("Maximum of 10 Y data files exceeded"));
}
+ /* scales */
+
+ int scale_x_values = 0;
+ int scale_y_values = 0;
+ int scale_x_labels = 0;
+ int scale_y_labels = 0;
+ double x_scale = 1;
+ double y_scale = 1;
+
+ if (x_scale_opt->answer) {
+ sscanf(x_scale_opt->answer, "%lf", &x_scale);
+ if (x_scale_labels_flg->answer)
+ scale_x_labels = 1;
+ else
+ scale_x_values = 1;
+ }
+ if (y_scale_opt->answer) {
+ sscanf(y_scale_opt->answer, "%lf", &y_scale);
+ if (y_scale_labels_flg->answer)
+ scale_y_labels = 1;
+ else
+ scale_y_values = 1;
+ }
+
/* set colors */
title_color = D_translate_color(t_color_opt->answer);
@@ -588,6 +634,8 @@
in[i].num_pnts = 0;
while ((err = fscanf(in[i].fp, "%f", &in[i].value)) != EOF) {
+ if (scale_y_values)
+ in[i].value *= y_scale;
in[i].num_pnts++;
in[i].max = MAX(in[i].max, in[i].value);
in[i].min = MIN(in[i].min, in[i].value);
@@ -660,6 +708,9 @@
strcpy(tic_name, "");
}
+ if (tic_unit != 1 && scale_x_labels)
+ G_fatal_error(_("Scale X labels cannot be used with this range"
+ " of data (%f, %f)"), in[0].min, in[0].max);
/* open all the data files again */
@@ -681,6 +732,8 @@
for (line = 0; line < in[0].num_pnts; line++) {
/* scan in an X value */
err = fscanf(in[0].fp, "%f", &in[0].value);
+ if (scale_x_values)
+ in[0].value *= x_scale;
/* didn't find a number or hit EOF before our time */
if ((err != 1) || (err == EOF)) {
@@ -693,6 +746,8 @@
/* check to see that we do indeed have data for this point */
if (line < in[i].num_pnts) {
err = fscanf(in[i].fp, "%f", &in[i].value);
+ if (scale_y_values)
+ in[i].value *= y_scale;
if ((in[i].num_pnts >= line) && (err != 1)) {
D_close_driver();
G_fatal_error(_("Problem reading <%s> data file at line %d"),
@@ -780,11 +835,17 @@
D_end();
D_stroke();
- if ((in[0].value >= 1) || (in[0].value <= -1) ||
- (in[0].value == 0))
- sprintf(txt, "%.0f", (in[0].value / tic_unit));
- else
- sprintf(txt, "%.2f", (in[0].value));
+ double value = in[0].value;
+ /* the scale goes against the auto units scaling
+ * (but doing the scaling before would place the values
+ * differently which is not what we want with label scaling
+ */
+ if (scale_x_labels)
+ value *= x_scale;
+ if ((value >= 1) || (value <= -1) || (value == 0))
+ sprintf(txt, "%.0f", (value / tic_unit));
+ else
+ sprintf(txt, "%.2f", (value));
text_height = (b - t) * TEXT_HEIGHT;
text_width = (r - l) * TEXT_WIDTH;
D_text_size(text_width, text_height);
@@ -893,6 +954,9 @@
tic_unit = 1;
strcpy(tic_name, "");
}
+ if (tic_unit != 1 && scale_y_labels)
+ G_fatal_error(_("Scale Y labels cannot be used with this"
+ "range of data (%f, %f)"), min_y, max_y);
/* Y-AXIS LOOP */
for (i = (int)min_y; i <= (int)max_y; i += tic_unit) {
if (rem(i, tic_every) == 0.0) {
@@ -906,7 +970,10 @@
/* draw a tic-mark number */
- sprintf(txt, "%d", (i / tic_unit));
+ if (scale_y_labels)
+ sprintf(txt, "%f.0", (i / tic_unit * y_scale));
+ else
+ sprintf(txt, "%d", (i / tic_unit));
text_height = (b - t) * TEXT_HEIGHT;
text_width = (r - l) * TEXT_WIDTH;
set_optimal_text_size(text_width, text_height, txt, &tt, &tb, &tl, &tr);
More information about the grass-commit
mailing list