[GRASS5] Re: [PATCH] ps.map - legend in columns

Morten Hulden morten at untamo.net
Wed Mar 3 21:59:16 EST 2004


On Thu, 4 Mar 2004, Morten Hulden wrote:

> A small patch to ps.map that adds a 'cols' option to vlegend, 
...

Sorry, forgot special case if (lcount%vector.cols) lc++;

Morten

Here is the patch again:


diff -uw grass57_exp_2004_02_28/ps/ps.map/ps_vlegend.c grass57_my/ps/ps.map/ps_vlegend.c
--- grass57_exp_2004_02_28/ps/ps.map/ps_vlegend.c	2003-03-26 16:56:15.000000000 +0100
+++ grass57_my/ps/ps.map/ps_vlegend.c	2004-03-04 02:53:37.000000000 +0100
@@ -2,6 +2,7 @@
 **
 ** Author: Paul W. Carlson	April 1992
 ** Modified by: Radim Blazek Jan 2000 area, label added 
+** Modified by: Morten Hulden Mar 2004, support for legend in columns added 
 */
 
 #include "vector.h"
@@ -10,8 +11,8 @@
 
 int PS_vlegend (void)
 {
-    int i, j, k, l, lcount, nopos;
-    double x, y, fontsize, dy, xo, yo, margin, width;
+    int h, i, j, k, l, lc, st, lcount, nopos;
+    double x, y, fontsize, dx, dy, xo, yo, xs, ys, margin, width;
     int **vec, *nvec;
 
     G_debug (2, "vect_legend(): count = %d", vector.count );
@@ -71,9 +72,22 @@
     margin = 0.4 * fontsize;
     if (x < PS.map_left + margin) x = PS.map_left + margin;
 
+    if (lcount < vector.cols) vector.cols = lcount;
+    dx = (PS.map_right - x) / vector.cols;
+    xs = x; /*save x and y*/
+    ys = y;
+    lc = (int) lcount/vector.cols; /* lines per column */
+    if (lcount%vector.cols) lc++;
+
+    for ( h = 0; h < vector.cols; h++) { 
+
+	y = ys;
+	if (h) x+=dx;
+	st = ((h+1)*lc < lcount) ? ((h+1)*lc) : lcount;
+
     /* make PostScript array "a" of name-mapset strings */
     fprintf(PS.fp, "/a [\n");
-    for ( i = 0; i < lcount; i++ ) {
+
+	for ( i = h*lc; i < st; i++ ) {
         G_debug (4, "  row = %d", i );
 	if ( nvec[i] > 0 ) { /* used position */
 	    j = vec[i][nvec[i]-1]; /* vector with label */
@@ -101,11 +115,11 @@
     	/* make white background for text */
     	fprintf(PS.fp, "1 1 1 C ");
     	fprintf(PS.fp, "%.1f %.1f w %.1f B fill \n", 
-		x - margin,  y - lcount * dy - margin, y);
+		x - margin,  y - lc * dy - margin, y);
     }
 
     /* make the legend */
-    for ( j = 0; j < lcount; j++ ) { /* each row */
+	for ( j = h*lc; j < st; j++ ) { /*each row */
         G_debug (4, "  row = %d", j );
 	y -= dy; /* set position of next row */
 	for (k = 0; k < nvec[j]; k++) {
@@ -166,8 +180,12 @@
 
 	/* plot the text */
 	set_rgb_color(BLACK);
-        fprintf(PS.fp, "a %d get %.1f %.1f MS\n", j, x + width, y);
+    	    fprintf(PS.fp, "a %d get %.1f %.1f MS\n", j - h*lc, x + width, y);
     }
+    } /*h*/
+    x = xs;
+    y = ys - lc*dy;
+
     fprintf(PS.fp, "[] 0 setdash\n");
 
     if (PS.min_y > y) PS.min_y = y;
diff -uw grass57_exp_2004_02_28/ps/ps.map/r_vlegend.c grass57_my/ps/ps.map/r_vlegend.c
--- grass57_exp_2004_02_28/ps/ps.map/r_vlegend.c	2003-03-26 16:56:15.000000000 +0100
+++ grass57_my/ps/ps.map/r_vlegend.c	2004-03-03 20:43:22.000000000 +0100
@@ -16,6 +16,8 @@
     "where      x y",
     "font       fontname",
     "fontsize   fontsize",
+    "width	width",
+    "cols	cols",
     ""
 };
 
@@ -24,12 +26,13 @@
 {	
     char buf[1024];
     char *key, *data;
-    int fontsize;
+    int fontsize, cols;
     double x, y, width;
 
     fontsize = 0;
     x = y = 0.0;
     width = -1;
+    cols = 1;
     while (input(2, buf, help))
     {
 	if (!key_data(buf, &key, &data)) continue;
@@ -65,6 +68,13 @@
 	    continue;
 	}
 
+	if (KEY("cols"))
+	{
+	    cols = atoi (data);
+	    if (cols < 1 || cols > 10) cols = 1;
+	    continue;
+	}
+
 	error(key, data, "illegal vlegend sub-request");
     }
     vector.x = x;
@@ -74,5 +84,7 @@
     if (width > 0) vector.width = width;
     else vector.width = 3 * fontsize / 72.0;
 
+    vector.cols = cols;
+
     return 0;
 }
diff -uw grass57_exp_2004_02_28/ps/ps.map/vector.h grass57_my/ps/ps.map/vector.h
--- grass57_exp_2004_02_28/ps/ps.map/vector.h	2003-10-11 06:15:12.000000000 +0200
+++ grass57_my/ps/ps.map/vector.h	2004-03-04 02:34:20.000000000 +0100
@@ -1,5 +1,6 @@
 /** Modified by: Janne Soimasuo August 1994 line_cat added **/
 /** Modified by: Radim Blazek Jan 2000 acolor, label added **/
+/** Modified by: Morten Hulden Mar 2004 cols added to vector **/
 #include "clr.h"
 #define PI 3.14159265   
 /* #define MAXVECTORS 20 */
@@ -81,6 +82,7 @@
     int fontsize; /* legend font size */
     char *font;    /* legend font */
     double width;  /* width of legend symbols */
+    int cols; /* number of colums  */
     LAYER *layer;
 } ;
 

-------------- next part --------------
diff -uw grass57_exp_2004_02_28/ps/ps.map/ps_vlegend.c grass57_my/ps/ps.map/ps_vlegend.c
--- grass57_exp_2004_02_28/ps/ps.map/ps_vlegend.c	2003-03-26 16:56:15.000000000 +0100
+++ grass57_my/ps/ps.map/ps_vlegend.c	2004-03-04 02:53:37.000000000 +0100
@@ -2,6 +2,7 @@
 **
 ** Author: Paul W. Carlson	April 1992
 ** Modified by: Radim Blazek Jan 2000 area, label added 
+** Modified by: Morten Hulden Mar 2004, support for legend in columns added 
 */
 
 #include "vector.h"
@@ -10,8 +11,8 @@
 
 int PS_vlegend (void)
 {
-    int i, j, k, l, lcount, nopos;
-    double x, y, fontsize, dy, xo, yo, margin, width;
+    int h, i, j, k, l, lc, st, lcount, nopos;
+    double x, y, fontsize, dx, dy, xo, yo, xs, ys, margin, width;
     int **vec, *nvec;
 
     G_debug (2, "vect_legend(): count = %d", vector.count );
@@ -71,9 +72,22 @@
     margin = 0.4 * fontsize;
     if (x < PS.map_left + margin) x = PS.map_left + margin;
 
+    if (lcount < vector.cols) vector.cols = lcount;
+    dx = (PS.map_right - x) / vector.cols;
+    xs = x; /*save x and y*/
+    ys = y;
+    lc = (int) lcount/vector.cols; /* lines per column */
+    if (lcount%vector.cols) lc++;
+
+    for ( h = 0; h < vector.cols; h++) { 
+
+	y = ys;
+	if (h) x+=dx;
+	st = ((h+1)*lc < lcount) ? ((h+1)*lc) : lcount;
+
     /* make PostScript array "a" of name-mapset strings */
     fprintf(PS.fp, "/a [\n");
-    for ( i = 0; i < lcount; i++ ) {
+
+	for ( i = h*lc; i < st; i++ ) {
         G_debug (4, "  row = %d", i );
 	if ( nvec[i] > 0 ) { /* used position */
 	    j = vec[i][nvec[i]-1]; /* vector with label */
@@ -101,11 +115,11 @@
     	/* make white background for text */
     	fprintf(PS.fp, "1 1 1 C ");
     	fprintf(PS.fp, "%.1f %.1f w %.1f B fill \n", 
-		x - margin,  y - lcount * dy - margin, y);
+		x - margin,  y - lc * dy - margin, y);
     }
 
     /* make the legend */
-    for ( j = 0; j < lcount; j++ ) { /* each row */
+	for ( j = h*lc; j < st; j++ ) { /*each row */
         G_debug (4, "  row = %d", j );
 	y -= dy; /* set position of next row */
 	for (k = 0; k < nvec[j]; k++) {
@@ -166,8 +180,12 @@
 
 	/* plot the text */
 	set_rgb_color(BLACK);
-        fprintf(PS.fp, "a %d get %.1f %.1f MS\n", j, x + width, y);
+    	    fprintf(PS.fp, "a %d get %.1f %.1f MS\n", j - h*lc, x + width, y);
     }
+    } /*h*/
+    x = xs;
+    y = ys - lc*dy;
+
     fprintf(PS.fp, "[] 0 setdash\n");
 
     if (PS.min_y > y) PS.min_y = y;
diff -uw grass57_exp_2004_02_28/ps/ps.map/r_vlegend.c grass57_my/ps/ps.map/r_vlegend.c
--- grass57_exp_2004_02_28/ps/ps.map/r_vlegend.c	2003-03-26 16:56:15.000000000 +0100
+++ grass57_my/ps/ps.map/r_vlegend.c	2004-03-03 20:43:22.000000000 +0100
@@ -16,6 +16,8 @@
     "where      x y",
     "font       fontname",
     "fontsize   fontsize",
+    "width	width",
+    "cols	cols",
     ""
 };
 
@@ -24,12 +26,13 @@
 {	
     char buf[1024];
     char *key, *data;
-    int fontsize;
+    int fontsize, cols;
     double x, y, width;
 
     fontsize = 0;
     x = y = 0.0;
     width = -1;
+    cols = 1;
     while (input(2, buf, help))
     {
 	if (!key_data(buf, &key, &data)) continue;
@@ -65,6 +68,13 @@
 	    continue;
 	}
 
+	if (KEY("cols"))
+	{
+	    cols = atoi (data);
+	    if (cols < 1 || cols > 10) cols = 1;
+	    continue;
+	}
+
 	error(key, data, "illegal vlegend sub-request");
     }
     vector.x = x;
@@ -74,5 +84,7 @@
     if (width > 0) vector.width = width;
     else vector.width = 3 * fontsize / 72.0;
 
+    vector.cols = cols;
+
     return 0;
 }
diff -uw grass57_exp_2004_02_28/ps/ps.map/vector.h grass57_my/ps/ps.map/vector.h
--- grass57_exp_2004_02_28/ps/ps.map/vector.h	2003-10-11 06:15:12.000000000 +0200
+++ grass57_my/ps/ps.map/vector.h	2004-03-04 02:34:20.000000000 +0100
@@ -1,5 +1,6 @@
 /** Modified by: Janne Soimasuo August 1994 line_cat added **/
 /** Modified by: Radim Blazek Jan 2000 acolor, label added **/
+/** Modified by: Morten Hulden Mar 2004 cols added to vector **/
 #include "clr.h"
 #define PI 3.14159265   
 /* #define MAXVECTORS 20 */
@@ -81,6 +82,7 @@
     int fontsize; /* legend font size */
     char *font;    /* legend font */
     double width;  /* width of legend symbols */
+    int cols; /* number of colums  */
     LAYER *layer;
 } ;
 


More information about the grass-dev mailing list