瀏覽代碼

d.vect: major code reorganization

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@47485 15284696-431f-4ddb-bdfa-cd5b030d7da7
Martin Landa 13 年之前
父節點
當前提交
042bcf3ce3

+ 38 - 111
display/d.vect/area.c

@@ -8,39 +8,44 @@
 #include <grass/vector.h>
 #include <grass/display.h>
 #include <grass/colors.h>
-#include <grass/dbmi.h>
+
 #include <grass/glocale.h>
 #include "plot.h"
 #include "local_proto.h"
 
-int darea(struct Map_info *Map, struct cat_list *Clist,
-	  const struct color_rgb *bcolor, const struct color_rgb *fcolor,
-	  int chcat, int id_flag, int table_colors_flag, int cats_color_flag,
-	  struct Cell_head *window, char *rgb_column, int default_width,
-	  char *width_column, double width_scale, int z_color_flag,
-	  char *style)
+int display_area(struct Map_info *Map, struct cat_list *Clist, const struct Cell_head *window,
+		 const struct color_rgb *bcolor, const struct color_rgb *fcolor, int chcat, int id_flag, 
+		 int table_colors_flag, int cats_color_flag, const char *rgb_column,
+		 int default_width, const char *width_column, double width_scale,
+		 int z_color_flag, const char *z_column,
+		 dbCatValArray *cvarr_rgb, dbCatValArray *cvarr_width, int nrec_width)
 {
-
     int num, area, isle, n_isles, n_points;
     double xl, yl;
     struct line_pnts *Points, * APoints, **IPoints;
     struct line_cats *Cats;
     int n_ipoints_alloc;
-    int cat, centroid = 0;
+    int cat, centroid;
     int red, grn, blu;
 
-    struct field_info *fi = NULL;
-    dbDriver *driver = NULL;
-    dbCatValArray cvarr_rgb, cvarr_width;
-    dbCatVal *cv_rgb = NULL, *cv_width = NULL;
-    int nrec_rgb = 0, nrec_width = 0;
+    dbCatVal *cv_rgb, *cv_width;
 
-    int open_db;
-    int i, rgb = 0;		/* 0|1 */
+    int i, rgb;	     
     char colorstring[12];	/* RRR:GGG:BBB */
     unsigned char which;
     int width;
 
+    centroid = 0;
+    cv_rgb = cv_width = NULL;
+    rgb = 0;
+
+    if (Vect_level(Map) < 2) {
+	G_warning(_("Unable to display areas, topology not available. "
+		    "Please try to rebuild topology using "
+		    "v.build or v.build.all."));
+	return 1;
+    }
+    
     G_debug(1, "display areas:");
     Points = Vect_new_line_struct();
     APoints = Vect_new_line_struct();
@@ -50,89 +55,7 @@ int darea(struct Map_info *Map, struct cat_list *Clist,
 	IPoints[i] = Vect_new_line_struct();
     }
     Cats = Vect_new_cats_struct();
-
-    open_db = table_colors_flag || width_column;
-
-    if (open_db) {
-
-	fi = Vect_get_field(Map, (Clist->field > 0 ? Clist->field : 1));
-	if (fi == NULL) {
-	    G_fatal_error(_("Database connection not defined for layer %d"),
-			  (Clist->field > 0 ? Clist->field : 1));
-	}
-
-	driver = db_start_driver_open_database(fi->driver, fi->database);
-	if (driver == NULL)
-	    G_fatal_error(_("Unable to open database <%s> by driver <%s>"),
-			  fi->database, fi->driver);
-
-    }
-
-    if (table_colors_flag) {
-	/* for reading RRR:GGG:BBB color strings from table */
-
-	if (rgb_column == NULL || *rgb_column == '\0')
-	    G_fatal_error(_("Color definition column not specified."));
-
-	db_CatValArray_init(&cvarr_rgb);
-
-	nrec_rgb = db_select_CatValArray(driver, fi->table, fi->key,
-					 rgb_column, NULL, &cvarr_rgb);
-
-	G_debug(3, "nrec_rgb (%s) = %d", rgb_column, nrec_rgb);
-
-	if (cvarr_rgb.ctype != DB_C_TYPE_STRING)
-	    G_fatal_error(_("Color definition column (%s) not a string. "
-			    "Column must be of form RRR:GGG:BBB where RGB values range 0-255."),
-			  rgb_column);
-
-
-	if (nrec_rgb < 0)
-	    G_fatal_error(_("Cannot select data (%s) from table"),
-			  rgb_column);
-
-	G_debug(2, "\n%d records selected from table", nrec_rgb);
-
-	for (i = 0; i < cvarr_rgb.n_values; i++) {
-	    G_debug(4, "cat = %d  %s = %s", cvarr_rgb.value[i].cat,
-		    rgb_column, db_get_string(cvarr_rgb.value[i].val.s));
-	}
-    }
-
-    if (width_column) {
-	if (*width_column == '\0')
-	    G_fatal_error(_("Line width column not specified."));
-
-	db_CatValArray_init(&cvarr_width);
-
-	nrec_width = db_select_CatValArray(driver, fi->table, fi->key,
-					   width_column, NULL, &cvarr_width);
-
-	G_debug(3, "nrec_width (%s) = %d", width_column, nrec_width);
-
-	if (cvarr_width.ctype != DB_C_TYPE_INT &&
-	    cvarr_width.ctype != DB_C_TYPE_DOUBLE)
-	    G_fatal_error(_("Line width column (%s) not a number."),
-			  width_column);
-
-	if (nrec_width < 0)
-	    G_fatal_error(_("Cannot select data (%s) from table"),
-			  width_column);
-
-	G_debug(2, "\n%d records selected from table", nrec_width);
-
-	for (i = 0; i < cvarr_width.n_values; i++) {
-	    G_debug(4, "cat = %d  %s = %d", cvarr_width.value[i].cat,
-		    width_column,
-		    (cvarr_width.ctype ==
-		     DB_C_TYPE_INT ? cvarr_width.value[i].val.
-		     i : (int)cvarr_width.value[i].val.d));
-	}
-    }
-
-    if (open_db)
-	db_close_database_shutdown_driver(driver);
-
+    
     num = Vect_get_num_areas(Map);
     G_debug(2, "n_areas = %d", num);
 
@@ -152,7 +75,7 @@ int darea(struct Map_info *Map, struct cat_list *Clist,
 
 	    if (window->proj != PROJECTION_LL)
 		continue;
-	    else {		/* out of bounds for -180 to 180, try 0 to 360 as well */
+	    else { /* out of bounds for -180 to 180, try 0 to 360 as well */
 		if (box.N < window->south || box.S > window->north)
 		    continue;
 		if (box.E + 360 < window->west || box.W + 360 > window->east)
@@ -160,14 +83,16 @@ int darea(struct Map_info *Map, struct cat_list *Clist,
 	    }
 	}
 
-	if (chcat) {		/* check category: where_opt or cat_opt used */
+	/* check category: where_opt or cat_opt used */
+	if (chcat) {		
 	    if (id_flag) {
 		if (!(Vect_cat_in_cat_list(area, Clist)))
 		    continue;
 	    }
 	    else {
-		int found = 0;
-
+		int found;
+		
+		found = FALSE;
 		centroid = Vect_get_area_centroid(Map, area);
 		G_debug(3, "centroid = %d", centroid);
 		if (centroid < 1)
@@ -180,17 +105,19 @@ int darea(struct Map_info *Map, struct cat_list *Clist,
 
 		    if (Cats->field[i] == Clist->field &&
 			Vect_cat_in_cat_list(Cats->cat[i], Clist)) {
-			found = 1;
+			found = TRUE;
 			break;
 		    }
 		}
+		
 		if (!found)
 		    continue;
 	    }			/* end else */
 	}			/* end if id_flag */
 	else if (Clist->field > 0) {
-	    int found = 0;
+	    int found;
 
+	    found = FALSE;
 	    centroid = Vect_get_area_centroid(Map, area);
 	    G_debug(3, "centroid = %d", centroid);
 	    if (centroid < 1)
@@ -201,10 +128,11 @@ int darea(struct Map_info *Map, struct cat_list *Clist,
 		G_debug(3, "  centroid = %d, field = %d, cat = %d", centroid,
 			Cats->field[i], Cats->cat[i]);
 		if (Cats->field[i] == Clist->field) {
-		    found = 1;
+		    found = TRUE;
 		    break;
 		}
 	    }
+	    
 	    /* lines with no category will be displayed */
 	    if (Cats->n_cats > 0 && !found)
 		continue;
@@ -257,12 +185,11 @@ int darea(struct Map_info *Map, struct cat_list *Clist,
 		    area, centroid, cat, Points->x[0], Points->y[0],
 		    Points->z[0]);
 	    rgb = 1;
-	    Rast_make_fp_colors(&colors, style, box.B, box.T);
+	    Rast_make_fp_colors(&colors, z_column, box.B, box.T);
 	    Rast_get_color(&zval, &red, &grn, &blu, &colors, DCELL_TYPE);
 	    G_debug(3, "b %d, g: %d, r %d", blu, grn, red);
 	}
 
-
 	if (table_colors_flag) {
 	    centroid = Vect_get_area_centroid(Map, area);
 	    if (cat >= 0) {
@@ -270,7 +197,7 @@ int darea(struct Map_info *Map, struct cat_list *Clist,
 			centroid, cat);
 
 		/* Read RGB colors from db for current area # */
-		if (db_CatValArray_get_value(&cvarr_rgb, cat, &cv_rgb) !=
+		if (db_CatValArray_get_value(cvarr_rgb, cat, &cv_rgb) !=
 		    DB_OK) {
 		    rgb = 0;
 		}
@@ -347,13 +274,13 @@ int darea(struct Map_info *Map, struct cat_list *Clist,
 			centroid, cat);
 
 		/* Read line width from db for current area # */
-		if (db_CatValArray_get_value(&cvarr_width, cat, &cv_width) !=
+		if (db_CatValArray_get_value(cvarr_width, cat, &cv_width) !=
 		    DB_OK) {
 		    width = default_width;
 		}
 		else {
 		    width =
-			width_scale * (cvarr_width.ctype ==
+			width_scale * (cvarr_width->ctype ==
 				       DB_C_TYPE_INT ? cv_width->val.
 				       i : (int)cv_width->val.d);
 		    if (width < 0) {

+ 3 - 3
display/d.vect/attr.c

@@ -7,8 +7,8 @@
 #include "local_proto.h"
 #include "plot.h"
 
-int attr(struct Map_info *Map, int type, char *attrcol,
-	 struct cat_list *Clist, LATTR *lattr, int chcat)
+int display_attr(struct Map_info *Map, int type, char *attrcol,
+		 struct cat_list *Clist, LATTR *lattr, int chcat)
 {
     int i, ltype, more;
     struct line_pnts *Points;
@@ -49,7 +49,7 @@ int attr(struct Map_info *Map, int type, char *attrcol,
 	ltype = Vect_read_next_line(Map, Points, Cats);
 	switch (ltype) {
 	case -1:
-	    G_fatal_error(_("Can't read vector map"));
+	    G_fatal_error(_("Unable to read vector map"));
 	case -2:		/* EOF */
 	    return 0;
 	}

+ 2 - 2
display/d.vect/dir.c

@@ -4,7 +4,7 @@
 #include <grass/glocale.h>
 #include "plot.h"
 
-int dir(struct Map_info *Map, int type, struct cat_list *Clist, int chcat)
+int display_dir(struct Map_info *Map, int type, struct cat_list *Clist, int chcat)
 {
     int ltype, dsize;
     double len, x, y, angle, msize;
@@ -24,7 +24,7 @@ int dir(struct Map_info *Map, int type, struct cat_list *Clist, int chcat)
 	ltype = Vect_read_next_line(Map, Points, Cats);
 	switch (ltype) {
 	case -1:
-	    G_fatal_error(_("Can't read vector map"));
+	    G_fatal_error(_("Unable to read vector map"));
 	case -2:		/* EOF */
 	    return 0;
 	}

+ 80 - 3
display/d.vect/label.c

@@ -5,8 +5,8 @@
 #include "local_proto.h"
 #include "plot.h"
 
-int label(struct Map_info *Map, int type, int do_area,
-	  struct cat_list *Clist, LATTR *lattr, int chcat)
+int display_label(struct Map_info *Map, int type, int do_area,
+		  struct cat_list *Clist, LATTR *lattr, int chcat)
 {
     int i, ltype;
     struct line_pnts *Points;
@@ -23,7 +23,7 @@ int label(struct Map_info *Map, int type, int do_area,
 	ltype = Vect_read_next_line(Map, Points, Cats);
 	switch (ltype) {
 	case -1:
-	    G_fatal_error(_("Can't read vector map"));
+	  G_fatal_error(_("Unable to read vector map"));
 	case -2:		/* EOF */
 	    return 0;
 	}
@@ -86,3 +86,80 @@ int label(struct Map_info *Map, int type, int do_area,
 
     return 0;
 }
+
+void show_label(double *px, double *py, LATTR *lattr, const char *text)
+{
+    double X = *px, Y = *py;
+    int Xoffset, Yoffset;
+    double xarr[5], yarr[5];
+    double T, B, L, R;
+
+    X = X + D_get_d_to_u_xconv() * 0.5 * lattr->size;
+    Y = Y + D_get_d_to_u_yconv() * 1.5 * lattr->size;
+
+    D_pos_abs(X, Y);
+    D_get_text_box(text, &T, &B, &L, &R);
+
+    /* Expand border 1/2 of text size */
+    T = T - D_get_d_to_u_yconv() * lattr->size / 2;
+    B = B + D_get_d_to_u_yconv() * lattr->size / 2;
+    L = L - D_get_d_to_u_xconv() * lattr->size / 2;
+    R = R + D_get_d_to_u_xconv() * lattr->size / 2;
+
+    Xoffset = 0;
+    Yoffset = 0;
+    if (lattr->xref == LCENTER)
+	Xoffset = -(R - L) / 2;
+    if (lattr->xref == LRIGHT)
+	Xoffset = -(R - L);
+    if (lattr->yref == LCENTER)
+	Yoffset = -(B - T) / 2;
+    if (lattr->yref == LBOTTOM)
+	Yoffset = -(B - T);
+
+    if (lattr->has_bgcolor || lattr->has_bcolor) {
+	xarr[0] = xarr[1] = xarr[4] = L + Xoffset;
+	xarr[2] = xarr[3] = R + Xoffset;
+	yarr[0] = yarr[3] = yarr[4] = B + Yoffset;
+	yarr[1] = yarr[2] = T + Yoffset;
+
+	if (lattr->has_bgcolor) {
+	    D_RGB_color(lattr->bgcolor.R, lattr->bgcolor.G,
+			lattr->bgcolor.B);
+	    D_polygon_abs(xarr, yarr, 5);
+	}
+
+	if (lattr->has_bcolor) {
+	    D_RGB_color(lattr->bcolor.R, lattr->bcolor.G,
+			lattr->bcolor.B);
+	    D_polyline_abs(xarr, yarr, 5);
+	}
+	D_RGB_color(lattr->color.R, lattr->color.G, lattr->color.B);
+    }
+
+    D_pos_abs(X + Xoffset, Y + Yoffset);
+    D_text(text);
+}
+
+void show_label_line(const struct line_pnts *Points, int ltype, LATTR *lattr, const char *text)
+{
+    double X, Y;
+
+    if ((ltype & GV_POINTS) || Points->n_points == 1)
+	/* point/centroid or line/boundary with one coor */
+    {
+	X = Points->x[0];
+	Y = Points->y[0];
+    }
+    else if (Points->n_points == 2) {	/* line with two coors */
+	X = (Points->x[0] + Points->x[1]) / 2;
+	Y = (Points->y[0] + Points->y[1]) / 2;
+    }
+    else {
+	int i = Points->n_points / 2;
+	X = Points->x[i];
+	Y = Points->y[i];
+    }
+
+    show_label(&X, &Y, lattr, text);
+}

+ 43 - 176
display/d.vect/plot1.c

@@ -36,41 +36,49 @@ struct rgb_color palette[16] = {
     {0, 139, 139}		/* 16: dark cyan */
 };
 
-/* *************************************************************** */
-/* *************************************************************** */
-/* *************************************************************** */
-int plot1(struct Map_info *Map, int type, int area, struct cat_list *Clist,
-	  const struct color_rgb *color, const struct color_rgb *fcolor,
-	  int chcat, char *symbol_name, double size, char *size_column,
-	  int sqrt_flag, char *rot_column, int id_flag, int table_colors_flag,
-	  int cats_color_flag, char *rgb_column, int default_width,
-	  char *width_column, double width_scale, int z_color_flag,
-	  char *style)
+int display_lines(struct Map_info *Map, int type, struct cat_list *Clist,
+		  const struct color_rgb *color, const struct color_rgb *fcolor, int chcat,
+		  const char *symbol_name,  double size, const char *size_column, int sqrt_flag, const char *rot_column,
+		  int id_flag, int table_colors_flag, int cats_color_flag, const char *rgb_column,
+		  int default_width, const char *width_column, double width_scale,
+		  int z_color_flag, const char *z_column,
+		  dbCatValArray *cvarr_rgb, dbCatValArray *cvarr_width, int nrec_width,
+		  dbCatValArray *cvarr_size, int nrec_size,
+		  dbCatValArray *cvarr_rot, int nrec_rot)
+
 {
-    int i, ltype, nlines = 0, line, cat = -1;
+    int i, ltype, nlines, line, cat;
     double *x, *y;
-    struct line_pnts *Points, *PPoints;
+    struct line_pnts *Points;
     struct line_cats *Cats;
     double x0, y0;
 
-    struct field_info *fi = NULL;
-    dbDriver *driver = NULL;
-    dbCatValArray cvarr_rgb, cvarr_width, cvarr_size, cvarr_rot;
-    dbCatVal *cv_rgb = NULL, *cv_width = NULL, *cv_size = NULL, *cv_rot = NULL;
-    int nrec_rgb = 0, nrec_width = 0, nrec_size = 0, nrec_rot = 0;
+    dbCatVal *cv_rgb, *cv_width, *cv_size, *cv_rot;
     int nerror_rgb;
     int n_points, n_lines, n_centroids, n_boundaries, n_faces;
-
-    int open_db;
-    int custom_rgb = FALSE;
+    
+    int custom_rgb;
     char colorstring[12];	/* RRR:GGG:BBB */
     int red, grn, blu;
     RGBA_Color *line_color, *fill_color, *primary_color;
     unsigned char which;
     int width;
-    SYMBOL *Symb = NULL;
+    SYMBOL *Symb;
     double var_size, rotation;
 
+    Symb = NULL;
+    custom_rgb = FALSE;
+    cv_rgb = cv_width = cv_size = cv_rot = NULL;
+    cat = -1;
+    nlines = 0;
+    
+    if (id_flag && Vect_level(Map) < 2) {
+	G_warning(_("Unable to display lines by id, topology not available. "
+		    "Please try to rebuild topology using "
+		    "v.build or v.build.all."));
+	return 1;
+    }
+
     var_size = size;
     rotation = 0.0;
     nerror_rgb = 0;
@@ -78,7 +86,6 @@ int plot1(struct Map_info *Map, int type, int area, struct cat_list *Clist,
     line_color = G_malloc(sizeof(RGBA_Color));
     fill_color = G_malloc(sizeof(RGBA_Color));
     primary_color = G_malloc(sizeof(RGBA_Color));
-
     primary_color->a = RGBA_COLOR_OPAQUE;
 
     /* change function prototype to pass RGBA_Color instead of color_rgb? */
@@ -100,160 +107,17 @@ int plot1(struct Map_info *Map, int type, int area, struct cat_list *Clist,
     else
 	fill_color->a = RGBA_COLOR_NONE;
 
-
     Points = Vect_new_line_struct();
-    PPoints = Vect_new_line_struct();
     Cats = Vect_new_cats_struct();
 
-    open_db = table_colors_flag || width_column || size_column || rot_column;
-
-    if (open_db) {
-	fi = Vect_get_field(Map, (Clist->field > 0 ? Clist->field : 1));
-	if (fi == NULL) {
-	    G_fatal_error(_("Database connection not defined for layer %d"),
-			  (Clist->field > 0 ? Clist->field : 1));
-	}
-
-	driver = db_start_driver_open_database(fi->driver, fi->database);
-	if (driver == NULL)
-	    G_fatal_error(_("Unable to open database <%s> by driver <%s>"),
-			  fi->database, fi->driver);
-    }
-
-    if (table_colors_flag) {
-	/* for reading RRR:GGG:BBB color strings from table */
-
-	if (rgb_column == NULL || *rgb_column == '\0')
-	    G_fatal_error(_("Color definition column not specified"));
-
-	db_CatValArray_init(&cvarr_rgb);
-
-	nrec_rgb = db_select_CatValArray(driver, fi->table, fi->key,
-					 rgb_column, NULL, &cvarr_rgb);
-
-	G_debug(3, "nrec_rgb (%s) = %d", rgb_column, nrec_rgb);
-
-	if (cvarr_rgb.ctype != DB_C_TYPE_STRING)
-	    G_fatal_error(_("Color definition column (%s) not a string. "
-			    "Column must be of form RRR:GGG:BBB where RGB values range 0-255."),
-			  rgb_column);
-
-	if (nrec_rgb < 0)
-	    G_fatal_error(_("Cannot select data (%s) from table"),
-			  rgb_column);
-
-	G_debug(2, "\n%d records selected from table", nrec_rgb);
-
-	for (i = 0; i < cvarr_rgb.n_values; i++) {
-	    G_debug(4, "cat = %d  %s = %s", cvarr_rgb.value[i].cat,
-		    rgb_column, db_get_string(cvarr_rgb.value[i].val.s));
-	}
-    }
-
-    if (width_column) {
-	if (*width_column == '\0')
-	    G_fatal_error(_("Line width column not specified."));
-
-	db_CatValArray_init(&cvarr_width);
-
-	nrec_width = db_select_CatValArray(driver, fi->table, fi->key,
-					   width_column, NULL, &cvarr_width);
-
-	G_debug(3, "nrec_width (%s) = %d", width_column, nrec_width);
-
-	if (cvarr_width.ctype != DB_C_TYPE_INT &&
-	    cvarr_width.ctype != DB_C_TYPE_DOUBLE)
-	    G_fatal_error(_("Line width column (%s) is not numeric."),
-			  width_column);
-
-	if (nrec_width < 0)
-	    G_fatal_error(_("Cannot select data (%s) from table"),
-			  width_column);
-
-	G_debug(2, " %d records selected from table", nrec_width);
-
-	for (i = 0; i < cvarr_width.n_values; i++) {
-	    G_debug(4, "(width) cat = %d  %s = %d", cvarr_width.value[i].cat,
-		    width_column,
-		    (cvarr_width.ctype ==
-		     DB_C_TYPE_INT ? cvarr_width.value[i].val.
-		     i : (int)cvarr_width.value[i].val.d));
-	}
-    }
-
-    if (size_column) {
-	if (*size_column == '\0')
-	    G_fatal_error(_("Symbol size column not specified."));
-
-	db_CatValArray_init(&cvarr_size);
-
-	nrec_size = db_select_CatValArray(driver, fi->table, fi->key,
-					   size_column, NULL, &cvarr_size);
-
-	G_debug(3, "nrec_size (%s) = %d", size_column, nrec_size);
-
-	if (cvarr_size.ctype != DB_C_TYPE_INT &&
-	    cvarr_size.ctype != DB_C_TYPE_DOUBLE)
-	    G_fatal_error(_("Symbol size column (%s) is not numeric."),
-			  size_column);
-
-	if (nrec_size < 0)
-	    G_fatal_error(_("Cannot select data (%s) from table"),
-			  size_column);
-
-	G_debug(2, " %d records selected from table", nrec_size);
-
-	for (i = 0; i < cvarr_size.n_values; i++) {
-	    G_debug(4, "(size) cat = %d  %s = %.2f", cvarr_size.value[i].cat,
-		    size_column,
-		    (cvarr_size.ctype ==
-		     DB_C_TYPE_INT ? (double)cvarr_size.value[i].val.i
-		     : cvarr_size.value[i].val.d));
-	}
-    }
-
-    if (rot_column) {
-	if (*rot_column == '\0')
-	    G_fatal_error(_("Symbol rotation column not specified."));
-
-	db_CatValArray_init(&cvarr_rot);
-
-	nrec_rot = db_select_CatValArray(driver, fi->table, fi->key,
-					   rot_column, NULL, &cvarr_rot);
-
-	G_debug(3, "nrec_rot (%s) = %d", rot_column, nrec_rot);
-
-	if (cvarr_rot.ctype != DB_C_TYPE_INT &&
-	    cvarr_rot.ctype != DB_C_TYPE_DOUBLE)
-	    G_fatal_error(_("Symbol rotation column (%s) is not numeric."),
-			  rot_column);
-
-	if (nrec_rot < 0)
-	    G_fatal_error(_("Cannot select data (%s) from table"),
-			  rot_column);
-
-	G_debug(2, " %d records selected from table", nrec_rot);
-
-	for (i = 0; i < cvarr_rot.n_values; i++) {
-	    G_debug(4, "(rot) cat = %d  %s = %.2f", cvarr_rot.value[i].cat,
-		    rot_column,
-		    (cvarr_rot.ctype ==
-		     DB_C_TYPE_INT ? (double)cvarr_rot.value[i].val.i
-		     : cvarr_rot.value[i].val.d));
-	}
-    }
-
-    if( !(nrec_size || nrec_rot) ) {
+    if (!(nrec_size || nrec_rot) ) {
 	Symb = S_read(symbol_name);
-	if (Symb == NULL)
+	if (!Symb)
 	    G_warning(_("Unable to read symbol, unable to display points"));
 	else
 	    S_stroke(Symb, size, 0.0, 0);
     }
-
-    if (open_db)
-	db_close_database_shutdown_driver(driver);
-
+    
     Vect_rewind(Map);
 
     /* Is it necessary to reset line/label color in each loop ? */
@@ -337,7 +201,7 @@ int plot1(struct Map_info *Map, int type, int area, struct cat_list *Clist,
 	    G_debug(3, "display line %d, cat %d, x: %f, y: %f, z: %f", line,
 		    cat, Points->x[0], Points->y[0], Points->z[0]);
 	    custom_rgb = TRUE;
-	    Rast_make_fp_colors(&colors, style, box.B, box.T);
+	    Rast_make_fp_colors(&colors, z_column, box.B, box.T);
 	    Rast_get_color(&zval, &red, &grn, &blu, &colors, DCELL_TYPE);
 	    G_debug(3, "b %d, g: %d, r %d", blu, grn, red);
 	}
@@ -353,7 +217,7 @@ int plot1(struct Map_info *Map, int type, int area, struct cat_list *Clist,
 		G_debug(3, "display element %d, cat %d", line, cat);
 
 		/* Read RGB colors from db for current area # */
-		if (db_CatValArray_get_value(&cvarr_rgb, cat, &cv_rgb) !=
+		if (db_CatValArray_get_value(cvarr_rgb, cat, &cv_rgb) !=
 		    DB_OK) {
 		    custom_rgb = FALSE;
 		}
@@ -438,13 +302,13 @@ int plot1(struct Map_info *Map, int type, int area, struct cat_list *Clist,
 		G_debug(3, "display element %d, cat %d", line, cat);
 
 		/* Read line width from db for current area # */
-		if (db_CatValArray_get_value(&cvarr_width, cat, &cv_width) !=
+		if (db_CatValArray_get_value(cvarr_width, cat, &cv_width) !=
 		    DB_OK) {
 		    width = default_width;
 		}
 		else {
 		    width =
-			width_scale * (cvarr_width.ctype ==
+			width_scale * (cvarr_width->ctype ==
 				       DB_C_TYPE_INT ? cv_width->val.i
 				       : (int)cv_width->val.d);
 		    if (width < 0) {
@@ -492,13 +356,13 @@ int plot1(struct Map_info *Map, int type, int area, struct cat_list *Clist,
 		    G_debug(3, "display element %d, cat %d", line, cat);
 
 		    /* Read symbol size from db for current symbol # */
-		    if (db_CatValArray_get_value(&cvarr_size, cat, &cv_size) !=
+		    if (db_CatValArray_get_value(cvarr_size, cat, &cv_size) !=
 			DB_OK) {
 			var_size = size;
 		    }
 		    else {
 			var_size = size *
-			    (cvarr_size.ctype == DB_C_TYPE_INT ?
+			    (cvarr_size->ctype == DB_C_TYPE_INT ?
 			     (double)cv_size->val.i : cv_size->val.d);
 
 			if (var_size < 0.0) {
@@ -529,13 +393,13 @@ int plot1(struct Map_info *Map, int type, int area, struct cat_list *Clist,
 		    G_debug(3, "display element %d, cat %d", line, cat);
 
 		    /* Read symbol rotation from db for current symbol # */
-		    if (db_CatValArray_get_value(&cvarr_rot, cat, &cv_rot) !=
+		    if (db_CatValArray_get_value(cvarr_rot, cat, &cv_rot) !=
 			DB_OK) {
 			rotation = 0.0;
 		    }
 		    else {
 			rotation =
-			    (cvarr_rot.ctype == DB_C_TYPE_INT ?
+			    (cvarr_rot->ctype == DB_C_TYPE_INT ?
 			     (double)cv_rot->val.i : cv_rot->val.d);
 		    }
 		}		/* end if cat */
@@ -630,6 +494,9 @@ int plot1(struct Map_info *Map, int type, int area, struct cat_list *Clist,
     
     Vect_destroy_line_struct(Points);
     Vect_destroy_cats_struct(Cats);
+    G_free(line_color);
+    G_free(fill_color);
+    G_free(primary_color);
 
     return 0;			/* not reached */
 }

+ 54 - 14
display/d.vect/local_proto.h

@@ -1,20 +1,60 @@
+#include <grass/gis.h>
 #include <grass/colors.h>
+#include <grass/vector.h>
+#include <grass/dbmi.h>
+
 #include "plot.h"
 
-FILE *open_vect(char *, char *);
-int close_vect(FILE *);
-int plot1(struct Map_info *, int, int, struct cat_list *,
-	  const struct color_rgb *, const struct color_rgb *, int, char *,
-	  double, char *, int, char *, int, int, int, char *, int, char *, double,
-	  int, char *);
-int label(struct Map_info *, int, int, struct cat_list *, LATTR *, int);
-int topo(struct Map_info *, int, int, LATTR *);
-int dir(struct Map_info *, int, struct cat_list *, int);
-int darea(struct Map_info *, struct cat_list *, const struct color_rgb *,
-	  const struct color_rgb *, int, int, int, int, struct Cell_head *,
-	  char *, int, char *, double, int, char *);
-int attr(struct Map_info *, int, char *, struct cat_list *, LATTR *, int);
-int zcoor(struct Map_info *, int, LATTR *);
 int test_bg_color(const char *);
+
+/* attr.c */
+int display_attr(struct Map_info *, int, char *, struct cat_list *, LATTR *, int);
+
+/* area.c */
+int display_area(struct Map_info *, struct cat_list *, const struct Cell_head *,
+		 const struct color_rgb *, const struct color_rgb *, int, int,
+		 int, int, const char *,
+		 int, const char *, double,
+		 int, const char *,
+		 dbCatValArray *, dbCatValArray *, int);
+
+/* dir.c */
+int display_dir(struct Map_info *, int, struct cat_list *, int);
+
+/* labels.c */
+int display_label(struct Map_info *, int, int, struct cat_list *, LATTR *, int);
 void show_label(double *, double *, LATTR *, const char *);
 void show_label_line(const struct line_pnts *, int, LATTR *, const char *);
+
+/* lines.c */
+int display_lines(struct Map_info *, int, struct cat_list *,
+		  const struct color_rgb *, const struct color_rgb *, int,
+		  const char *, double, const char *, int, const char *,
+		  int, int, int, const char *,
+		  int, const char *, double,
+		  int, const char *,
+		  dbCatValArray *, dbCatValArray *, int,
+		  dbCatValArray *, int, dbCatValArray *, int);
+
+/* shape.c */
+int display_shape(struct Map_info *, int, int, struct cat_list *, const struct Cell_head *, 
+		  const struct color_rgb *, const struct color_rgb *, int,
+		  const char *, double, const char *, int, const char *, /* lines only */
+		  int, int, int, char *,
+		  int, char *, double,
+		  int, char *);
+
+/* opt.c */
+int option_to_display(const struct Option *);
+void options_to_lattr(LATTR *, const char *,
+		      const char *, const char *, const char *,
+		      int, const char *, const char *,
+		      const char *, const char *);
+int option_to_color(struct color_rgb *, const char *);
+void option_to_where(struct Map_info *, struct cat_list *, const char *);
+
+/* topo.c */
+int display_topo(struct Map_info *, int, int, LATTR *);
+
+/* zcoor.c */
+int display_zcoor(struct Map_info *, int, LATTR *);

+ 50 - 230
display/d.vect/main.c

@@ -19,8 +19,6 @@
 #include <grass/gis.h>
 #include <grass/raster.h>
 #include <grass/display.h>
-#include <grass/vector.h>
-#include <grass/colors.h>
 #include <grass/dbmi.h>
 #include <grass/glocale.h>
 #include "plot.h"
@@ -76,16 +74,16 @@ static char *icon_files(void)
 int main(int argc, char **argv)
 {
     int ret, level;
-    int i, stat = 0, type, area, display;
-    int chcat = 0;
-    int r, g, b;
+    int stat, type, area, display;
+    int chcat;
     int has_color, has_fcolor;
     struct color_rgb color, fcolor;
     double size;
     int default_width;
     double width_scale;
     double minreg, maxreg, reg;
-    char map_name[128];
+    char map_name[GNAME_MAX];
+    
     struct GModule *module;
     struct Option *map_opt;
     struct Option *color_opt, *fcolor_opt, *rgbcol_opt, *zcol_opt;
@@ -99,17 +97,15 @@ int main(int argc, char **argv)
     struct Option *width_opt, *wcolumn_opt, *wscale_opt;
     struct Flag *id_flag, *table_acolors_flag, *cats_acolors_flag,
 	*zcol_flag, *sqrt_flag;
+    
     struct cat_list *Clist;
-    int *cats, ncat;
     LATTR lattr;
     struct Map_info Map;
-    struct field_info *fi;
-    dbDriver *driver;
-    dbHandle handle;
     struct Cell_head window;
     struct bound_box box;
     double overlap;
 
+    stat = 0;
     /* Initialize the GIS calls */
     G_gisinit(argv[0]);
 
@@ -380,15 +376,13 @@ int main(int argc, char **argv)
     
     G_get_set_window(&window);
     
-    /* Read map options */
-
     /* Check min/max region */
     reg = ((window.east - window.west) + (window.north - window.south)) / 2;
     if (minreg_opt->answer) {
 	minreg = atof(minreg_opt->answer);
 
 	if (reg < minreg) {
-	    G_message(_("Region size is lower than minreg, nothing displayed."));
+	    G_important_message(_("Region size is lower than minreg, nothing displayed"));
 	    exit(EXIT_SUCCESS);
 	}
     }
@@ -396,7 +390,7 @@ int main(int argc, char **argv)
 	maxreg = atof(maxreg_opt->answer);
 
 	if (reg > maxreg) {
-	    G_message(_("Region size is greater than maxreg, nothing displayed."));
+	    G_important_message(_("Region size is greater than maxreg, nothing displayed"));
 	    exit(EXIT_SUCCESS);
 	}
     }
@@ -415,35 +409,10 @@ int main(int argc, char **argv)
     }
 
     color = G_standard_color_rgb(WHITE);
-    ret = G_str_to_color(color_opt->answer, &r, &g, &b);
-    if (ret == 1) {
-	has_color = 1;
-	color.r = r;
-	color.g = g;
-	color.b = b;
-    }
-    else if (ret == 2) {	/* none */
-	has_color = 0;
-    }
-    else if (ret == 0) {	/* error */
-	G_fatal_error(_("Unknown color: [%s]"), color_opt->answer);
-    }
-
+    has_color = option_to_color(&color, color_opt->answer);
     fcolor = G_standard_color_rgb(WHITE);
-    ret = G_str_to_color(fcolor_opt->answer, &r, &g, &b);
-    if (ret == 1) {
-	has_fcolor = 1;
-	fcolor.r = r;
-	fcolor.g = g;
-	fcolor.b = b;
-    }
-    else if (ret == 2) {	/* none */
-	has_fcolor = 0;
-    }
-    else if (ret == 0) {	/* error */
-	G_fatal_error(_("Unknown color: '%s'"), fcolor_opt->answer);
-    }
-
+    has_fcolor = option_to_color(&fcolor, fcolor_opt->answer);
+    
     size = atof(size_opt->answer);
 
     /* if where_opt was specified select categories from db 
@@ -454,147 +423,32 @@ int main(int argc, char **argv)
     /* open vector */
     level = Vect_open_old2(&Map, map_name, "", field_opt->answer);
 
+    chcat = 0;
     if (where_opt->answer) {
 	if (Clist->field < 1)
-	    G_fatal_error(_("'layer' must be > 0 for 'where'."));
+	    G_fatal_error(_("Option <%s> must be > 0"), field_opt->key);
 	chcat = 1;
-	if ((fi = Vect_get_field(&Map, Clist->field)) == NULL)
-	    G_fatal_error(_("Database connection not defined"));
-	if (fi != NULL) {
-	    driver = db_start_driver(fi->driver);
-	    if (driver == NULL)
-		G_fatal_error(_("Unable to start driver <%s>"), fi->driver);
-
-	    db_init_handle(&handle);
-	    db_set_handle(&handle, fi->database, NULL);
-	    if (db_open_database(driver, &handle) != DB_OK)
-		G_fatal_error(_("Unable to open database <%s>"),
-			      fi->database);
-
-	    ncat =
-		db_select_int(driver, fi->table, fi->key, where_opt->answer,
-			      &cats);
-
-	    db_close_database(driver);
-	    db_shutdown_driver(driver);
-
-	    Vect_array_to_cat_list(cats, ncat, Clist);
-	}
+	option_to_where(&Map, Clist, where_opt->answer);
     }
     else if (cat_opt->answer) {
 	if (Clist->field < 1)
-	    G_fatal_error(_("'layer' must be > 0 for 'cats'."));
+	    G_fatal_error(_("Option <%s> must be > 0"), field_opt->key);
 	chcat = 1;
 	ret = Vect_str_to_cat_list(cat_opt->answer, Clist);
 	if (ret > 0)
 	    G_warning(_("%d errors in cat option"), ret);
     }
+    
+    type = Vect_option_to_types(type_opt);
+    area = type & GV_AREA;
+    
+    display = option_to_display(display_opt);
 
-    i = 0;
-    type = 0;
-    area = FALSE;
-    while (type_opt->answers[i]) {
-	switch (type_opt->answers[i][0]) {
-	case 'p':
-	    type |= GV_POINT;
-	    break;
-	case 'l':
-	    type |= GV_LINE;
-	    break;
-	case 'b':
-	    type |= GV_BOUNDARY;
-	    break;
-	case 'f':
-	    type |= GV_FACE;
-	    break;
-	case 'c':
-	    type |= GV_CENTROID;
-	    break;
-	case 'a':
-	    area = TRUE;
-	    break;
-	}
-	i++;
-    }
-
-    i = 0;
-    display = 0;
-    while (display_opt->answers[i]) {
-	switch (display_opt->answers[i][0]) {
-	case 's':
-	    display |= DISP_SHAPE;
-	    break;
-	case 'c':
-	    display |= DISP_CAT;
-	    break;
-	case 't':
-	    display |= DISP_TOPO;
-	    break;
-	case 'd':
-	    display |= DISP_DIR;
-	    break;
-	case 'a':
-	    display |= DISP_ATTR;
-	    break;
-	case 'z':
-	    display |= DISP_ZCOOR;
-	    break;
-	}
-	i++;
-    }
-
-    /* Read label options */
-    if (lfield_opt->answer != NULL)
-	lattr.field = atoi(lfield_opt->answer);
-    else
-	lattr.field = Clist->field;
-
-    lattr.color.R = lattr.color.G = lattr.color.B = 255;
-    if (G_str_to_color(lcolor_opt->answer, &r, &g, &b)) {
-	lattr.color.R = r;
-	lattr.color.G = g;
-	lattr.color.B = b;
-    }
-    lattr.has_bgcolor = 0;
-    if (G_str_to_color(bgcolor_opt->answer, &r, &g, &b) == 1) {
-	lattr.has_bgcolor = 1;
-	lattr.bgcolor.R = r;
-	lattr.bgcolor.G = g;
-	lattr.bgcolor.B = b;
-    }
-    lattr.has_bcolor = 0;
-    if (G_str_to_color(bcolor_opt->answer, &r, &g, &b) == 1) {
-	lattr.has_bcolor = 1;
-	lattr.bcolor.R = r;
-	lattr.bcolor.G = g;
-	lattr.bcolor.B = b;
-    }
-
-    lattr.size = atoi(lsize_opt->answer);
-    lattr.font = font_opt->answer;
-    lattr.enc = enc_opt->answer;
-    switch (xref_opt->answer[0]) {
-    case 'l':
-	lattr.xref = LLEFT;
-	break;
-    case 'c':
-	lattr.xref = LCENTER;
-	break;
-    case 'r':
-	lattr.xref = LRIGHT;
-	break;
-    }
-    switch (yref_opt->answer[0]) {
-    case 't':
-	lattr.yref = LTOP;
-	break;
-    case 'c':
-	lattr.yref = LCENTER;
-	break;
-    case 'b':
-	lattr.yref = LBOTTOM;
-	break;
-    }
+    /* labels */
+    options_to_lattr(&lattr, lfield_opt->answer,
+		     lcolor_opt->answer, bgcolor_opt->answer, bcolor_opt->answer,
+		     atoi(lsize_opt->answer), font_opt->answer, enc_opt->answer,
+		     xref_opt->answer, yref_opt->answer);
 
     D_setup(0);
     D_set_reduction(1.0);
@@ -608,12 +462,12 @@ int main(int argc, char **argv)
 		       window.east < box.W ||
 		       window.west > G_adjust_easting(box.E, &window))) {
 	G_message(_("The bounding box of the map is outside the current region, "
-		   "nothing drawn."));
-	stat = 0;
+		    "nothing drawn"));
+	exit(EXIT_SUCCESS);
     }
     else {
-	overlap =
-	    G_window_percentage_overlap(&window, box.N, box.S, box.E, box.W);
+	overlap = G_window_percentage_overlap(&window, box.N, box.S,
+					      box.E, box.W);
 	G_debug(1, "overlap = %f \n", overlap);
 	if (overlap < 1)
 	    Vect_set_constraint_region(&Map, window.north, window.south,
@@ -624,52 +478,22 @@ int main(int argc, char **argv)
 	if (!wcolumn_opt->answer)
 	    D_line_width(default_width);
 
-	if (area) {
-	    if (level >= 2) {
-		if (display & DISP_SHAPE) {
-		    stat = darea(&Map, Clist,
-				 has_color ? &color : NULL,
-				 has_fcolor ? &fcolor : NULL, chcat,
-				 (int)id_flag->answer,
-				 table_acolors_flag->answer,
-				 cats_acolors_flag->answer, &window,
-				 rgbcol_opt->answer, default_width,
-				 wcolumn_opt->answer, width_scale,
-				 zcol_flag->answer, zcol_opt->answer);
-		}
-		if (wcolumn_opt->answer)
-		    D_line_width(default_width);
-	    }
-	    else
-		G_warning(_("Unable to display areas, topology not available. "
-			    "Please try to rebuild topology using "
-			    "v.build or v.build.all."));
-	}
-
 	if (display & DISP_SHAPE) {
-	    if (id_flag->answer && level < 2) {
-		G_warning(_("Unable to display lines by id, topology not available. "
-			    "Please try to rebuild topology using "
-			    "v.build or v.build.all."));
-	    }
-	    else {
-		stat = plot1(&Map, type, area, Clist,
-			     has_color ? &color : NULL,
-			     has_fcolor ? &fcolor : NULL, chcat, icon_opt->answer,
-			     size, sizecolumn_opt->answer, (int)sqrt_flag->answer, rotcolumn_opt->answer,
-			     (int)id_flag->answer, table_acolors_flag->answer,
-			     cats_acolors_flag->answer, rgbcol_opt->answer,
-			     default_width, wcolumn_opt->answer, width_scale,
-			     zcol_flag->answer, zcol_opt->answer);
-		if (wcolumn_opt->answer)
-		    D_line_width(default_width);
-	    }
+	    stat += display_shape(&Map, type, area, Clist, &window,
+				  has_color ? &color : NULL, has_fcolor ? &fcolor : NULL, chcat,
+				  icon_opt->answer, size, sizecolumn_opt->answer, sqrt_flag->answer ? 1 : 0, rotcolumn_opt->answer,
+				  id_flag->answer ? 1 : 0, table_acolors_flag->answer ? 1 : 0, cats_acolors_flag->answer ? 1 : 0, rgbcol_opt->answer,
+				  default_width,  wcolumn_opt->answer, width_scale,
+				  zcol_flag->answer ? 1 : 0, zcol_opt->answer);
+	    
+	    if (wcolumn_opt->answer)
+		D_line_width(default_width);
 	}
 
 	if (has_color) {
 	    D_RGB_color(color.r, color.g, color.b);
 	    if (display & DISP_DIR)
-		stat = dir(&Map, type, Clist, chcat);
+		stat += display_dir(&Map, type, Clist, chcat);
 	}
 
 	/* reset line width: Do we need to get line width from display
@@ -678,9 +502,9 @@ int main(int argc, char **argv)
 	 * d.linewidth). */
 	if (!wcolumn_opt->answer)
 	    D_line_width(0);
-
+	
 	if (display & DISP_CAT)
-	    stat = label(&Map, type, area, Clist, &lattr, chcat);
+	    stat += display_label(&Map, type, area, Clist, &lattr, chcat);
 
 	if (display & DISP_ATTR) {
 	    int attr_type = type;
@@ -688,21 +512,14 @@ int main(int argc, char **argv)
 	    if (area && !(attr_type & GV_CENTROID))
 		attr_type |= GV_CENTROID;
 		
-	    stat =
-		attr(&Map, attr_type, attrcol_opt->answer, Clist, &lattr, chcat);
+	    stat += display_attr(&Map, attr_type, attrcol_opt->answer, Clist, &lattr, chcat);
 	    }
 
 	if (display & DISP_ZCOOR)
-	    stat = zcoor(&Map, type, &lattr);
-
-	if (display & DISP_TOPO) {
-	    if (level >= 2)
-		stat = topo(&Map, type, area, &lattr);
-	    else
-		G_warning(_("Unable to display topology, not available."
-			    "Please try to rebuild topology using "
-			    "v.build or v.build.all."));
-	}
+	    stat += display_zcoor(&Map, type, &lattr);
+
+	if (display & DISP_TOPO)
+	    stat += display_topo(&Map, type, area, &lattr);
     }
 
     D_save_command(G_recreate_command());
@@ -713,5 +530,8 @@ int main(int argc, char **argv)
     Vect_close(&Map);
     Vect_destroy_cat_list(Clist);
 
-    exit(stat);
+    if (stat != 0)
+	exit(EXIT_FAILURE);
+
+    exit(EXIT_SUCCESS);
 }

+ 161 - 0
display/d.vect/opt.c

@@ -0,0 +1,161 @@
+#include <grass/gis.h>
+#include <grass/dbmi.h>
+#include <grass/glocale.h>
+
+#include "local_proto.h"
+
+int option_to_display(const struct Option *opt)
+{
+    int i, display;
+    
+    i = display = 0;
+    while (opt->answers[i]) {
+	switch (opt->answers[i][0]) {
+	case 's':
+	    display |= DISP_SHAPE;
+	    break;
+	case 'c':
+	    display |= DISP_CAT;
+	    break;
+	case 't':
+	    display |= DISP_TOPO;
+	    break;
+	case 'd':
+	    display |= DISP_DIR;
+	    break;
+	case 'a':
+	    display |= DISP_ATTR;
+	    break;
+	case 'z':
+	    display |= DISP_ZCOOR;
+	    break;
+	}
+	i++;
+    }
+
+    return display;
+}
+
+void options_to_lattr(LATTR *lattr, const char *layer,
+		      const char *color, const char *bgcolor, const char *bcolor,
+		      int size, const char *font, const char *encoding,
+		      const char *xref, const char *yref)
+{
+    int r, g, b;
+    
+    if (layer)
+	lattr->field = atoi(layer);
+    else
+	lattr->field = 1;
+
+    lattr->color.R = lattr->color.G = lattr->color.B = 255;
+    if (G_str_to_color(color, &r, &g, &b)) {
+	lattr->color.R = r;
+	lattr->color.G = g;
+	lattr->color.B = b;
+    }
+    lattr->has_bgcolor = 0;
+    if (G_str_to_color(bgcolor, &r, &g, &b) == 1) {
+	lattr->has_bgcolor = 1;
+	lattr->bgcolor.R = r;
+	lattr->bgcolor.G = g;
+	lattr->bgcolor.B = b;
+    }
+    lattr->has_bcolor = 0;
+    if (G_str_to_color(bcolor, &r, &g, &b) == 1) {
+	lattr->has_bcolor = 1;
+	lattr->bcolor.R = r;
+	lattr->bcolor.G = g;
+	lattr->bcolor.B = b;
+    }
+
+    lattr->size = size;
+    lattr->font = font;
+    lattr->enc = encoding;
+    if (xref) {
+	switch (xref[0]) {
+	case 'l':
+	    lattr->xref = LLEFT;
+	    break;
+	case 'c':
+	    lattr->xref = LCENTER;
+	    break;
+	case 'r':
+	    lattr->xref = LRIGHT;
+	    break;
+	}
+    }
+    else
+	lattr->xref = LCENTER;
+    
+    if (yref) {
+	switch (yref[0]) {
+	case 't':
+	    lattr->yref = LTOP;
+	    break;
+	case 'c':
+	    lattr->yref = LCENTER;
+	    break;
+	case 'b':
+	    lattr->yref = LBOTTOM;
+	    break;
+	}
+    }
+    else
+	lattr->yref = LCENTER;
+}
+
+int option_to_color(struct color_rgb *color, const char *color_val)
+{
+    int has_color, ret;
+    int r, g, b;
+    
+    ret = G_str_to_color(color_val, &r, &g, &b);
+    if (ret == 1) {
+	has_color = 1;
+	color->r = r;
+	color->g = g;
+	color->b = b;
+    }
+    else if (ret == 2) {	/* none */
+	has_color = 0;
+    }
+    else if (ret == 0) {	/* error */
+	G_fatal_error(_("Unknown color: '%s'"), color_val);
+    }
+    
+    return has_color;
+}
+
+void option_to_where(struct Map_info *Map, struct cat_list *Clist,
+		     const char *where)
+{
+    int ncat;
+    int *cats;
+    struct field_info *fi;
+    dbDriver *driver;
+    dbHandle handle;
+    
+    fi = Vect_get_field(Map, Clist->field);
+    if (!fi)
+	G_fatal_error(_("Database connection not defined"));
+    
+    driver = db_start_driver(fi->driver);
+    if (!driver)
+	G_fatal_error(_("Unable to start driver <%s>"), fi->driver);
+    
+    db_init_handle(&handle);
+    db_set_handle(&handle, fi->database, NULL);
+    if (db_open_database(driver, &handle) != DB_OK)
+	G_fatal_error(_("Unable to open database <%s>"),
+		      fi->database);
+    
+    ncat = db_select_int(driver, fi->table, fi->key, where,
+			 &cats);
+    
+    db_close_database(driver);
+    db_shutdown_driver(driver);
+    
+    Vect_array_to_cat_list(cats, ncat, Clist);
+}	
+	

+ 2 - 2
display/d.vect/plot.h

@@ -19,8 +19,8 @@ typedef struct
     int has_bcolor;
     struct rgb_color color, bgcolor, bcolor;
     int size;
-    char *font;
-    char *enc;
+    const char *font;
+    const char *enc;
     int xref, yref;
 } LATTR;
 

+ 184 - 0
display/d.vect/shape.c

@@ -0,0 +1,184 @@
+#include <grass/vector.h>
+#include <grass/dbmi.h>
+#include <grass/glocale.h>
+
+#include "local_proto.h"
+
+int display_shape(struct Map_info *Map, int type, int area, struct cat_list *Clist, const struct Cell_head *window, 
+		  const struct color_rgb *bcolor, const struct color_rgb *fcolor, int chcat,
+		  const char *icon, double size, const char *size_column, int sqrt_flag, const char *rot_column, /* lines only */
+		  int id_flag, int table_colors_flag, int cats_colors_flag, char *rgb_column,
+		  int default_width, char *width_column, double width_scale,
+		  int z_color_flag, char *z_column)
+{
+    int open_db, field, i, stat;
+    dbCatValArray cvarr_rgb, cvarr_width, cvarr_size, cvarr_rot;
+    struct field_info *fi;
+    dbDriver *driver;
+    int nrec_rgb, nrec_width, nrec_size, nrec_rot;
+
+    stat = 0;
+    nrec_rgb = nrec_width = nrec_size = nrec_rot = 0;
+    
+    open_db = table_colors_flag || width_column || size_column || rot_column;
+    if (open_db) {
+	field = Clist->field > 0 ? Clist->field : 1;
+	fi = Vect_get_field(Map, field);
+	if (!fi) {
+	    G_fatal_error(_("Database connection not defined for layer %d"),
+			  field);
+	}
+	
+	driver = db_start_driver_open_database(fi->driver, fi->database);
+	if (!driver)
+	    G_fatal_error(_("Unable to open database <%s> by driver <%s>"),
+			  fi->database, fi->driver);
+    }
+    
+    if (table_colors_flag) {
+	/* for reading RRR:GGG:BBB color strings from table */
+	if (!rgb_column || *rgb_column == '\0')
+	    G_fatal_error(_("Color definition column not specified"));
+	
+	db_CatValArray_init(&cvarr_rgb);
+
+	nrec_rgb = db_select_CatValArray(driver, fi->table, fi->key,
+					 rgb_column, NULL, &cvarr_rgb);
+
+	G_debug(3, "nrec_rgb (%s) = %d", rgb_column, nrec_rgb);
+
+	if (cvarr_rgb.ctype != DB_C_TYPE_STRING)
+	    G_fatal_error(_("Color definition column (%s) not a string. "
+			    "Column must be of form RRR:GGG:BBB where RGB values range 0-255."),
+			  rgb_column);
+
+
+	if (nrec_rgb < 0)
+	    G_fatal_error(_("Unable to select data (%s) from table"),
+			  rgb_column);
+
+	G_debug(2, "\n%d records selected from table", nrec_rgb);
+
+	for (i = 0; i < cvarr_rgb.n_values; i++) {
+	    G_debug(4, "cat = %d  %s = %s", cvarr_rgb.value[i].cat,
+		    rgb_column, db_get_string(cvarr_rgb.value[i].val.s));
+	}
+    }
+
+    if (width_column) {
+	if (*width_column == '\0')
+	    G_fatal_error(_("Line width column not specified"));
+
+	db_CatValArray_init(&cvarr_width);
+
+	nrec_width = db_select_CatValArray(driver, fi->table, fi->key,
+					   width_column, NULL, &cvarr_width);
+
+	G_debug(3, "nrec_width (%s) = %d", width_column, nrec_width);
+
+	if (cvarr_width.ctype != DB_C_TYPE_INT &&
+	    cvarr_width.ctype != DB_C_TYPE_DOUBLE)
+	    G_fatal_error(_("Line width column (%s) not a number"),
+			  width_column);
+
+	if (nrec_width < 0)
+	    G_fatal_error(_("Unable to select data (%s) from table"),
+			  width_column);
+
+	G_debug(2, "\n%d records selected from table", nrec_width);
+
+	for (i = 0; i < cvarr_width.n_values; i++) {
+	    G_debug(4, "cat = %d  %s = %d", cvarr_width.value[i].cat,
+		    width_column,
+		    (cvarr_width.ctype ==
+		     DB_C_TYPE_INT ? cvarr_width.value[i].val.
+		     i : (int)cvarr_width.value[i].val.d));
+	}
+    }
+
+    if (size_column) {
+	if (*size_column == '\0')
+	    G_fatal_error(_("Symbol size column not specified"));
+	
+	db_CatValArray_init(&cvarr_size);
+
+	nrec_size = db_select_CatValArray(driver, fi->table, fi->key,
+					  size_column, NULL, &cvarr_size);
+	
+	G_debug(3, "nrec_size (%s) = %d", size_column, nrec_size);
+
+	if (cvarr_size.ctype != DB_C_TYPE_INT &&
+	    cvarr_size.ctype != DB_C_TYPE_DOUBLE)
+	    G_fatal_error(_("Symbol size column (%s) is not numeric"),
+			  size_column);
+
+	if (nrec_size < 0)
+	    G_fatal_error(_("Unable to select data (%s) from table"),
+			  size_column);
+
+	G_debug(2, " %d records selected from table", nrec_size);
+
+	for (i = 0; i < cvarr_size.n_values; i++) {
+	    G_debug(4, "(size) cat = %d  %s = %.2f", cvarr_size.value[i].cat,
+		    size_column,
+		    (cvarr_size.ctype ==
+		     DB_C_TYPE_INT ? (double)cvarr_size.value[i].val.i
+		     : cvarr_size.value[i].val.d));
+	}
+    }
+
+    if (rot_column) {
+	if (*rot_column == '\0')
+	    G_fatal_error(_("Symbol rotation column not specified"));
+
+	db_CatValArray_init(&cvarr_rot);
+
+	nrec_rot = db_select_CatValArray(driver, fi->table, fi->key,
+					 rot_column, NULL, &cvarr_rot);
+
+	G_debug(3, "nrec_rot (%s) = %d", rot_column, nrec_rot);
+
+	if (cvarr_rot.ctype != DB_C_TYPE_INT &&
+	    cvarr_rot.ctype != DB_C_TYPE_DOUBLE)
+	    G_fatal_error(_("Symbol rotation column (%s) is not numeric"),
+			  rot_column);
+
+	if (nrec_rot < 0)
+	    G_fatal_error(_("Unable to select data (%s) from table"),
+			  rot_column);
+
+	G_debug(2, " %d records selected from table", nrec_rot);
+
+	for (i = 0; i < cvarr_rot.n_values; i++) {
+	    G_debug(4, "(rot) cat = %d  %s = %.2f", cvarr_rot.value[i].cat,
+		    rot_column,
+		    (cvarr_rot.ctype ==
+		     DB_C_TYPE_INT ? (double)cvarr_rot.value[i].val.i
+		     : cvarr_rot.value[i].val.d));
+	}
+    }
+
+    if (open_db)
+	db_close_database_shutdown_driver(driver);
+
+    stat = 0;
+    if (area)
+	stat += display_area(Map, Clist, window, 
+			     bcolor, fcolor, chcat,
+			     id_flag, table_colors_flag, cats_colors_flag,
+			     rgb_column, default_width, width_column, width_scale,
+			     z_color_flag, z_column,
+			     &cvarr_rgb, &cvarr_width, nrec_width);
+			     
+    
+    stat += display_lines(Map, type, Clist,
+			  bcolor, fcolor, chcat,
+			  icon, size, size_column, sqrt_flag, rot_column,
+			  id_flag, table_colors_flag, cats_colors_flag,
+			  rgb_column, default_width, width_column, width_scale,
+			  z_color_flag, z_column,
+			  &cvarr_rgb, &cvarr_width, nrec_width,
+			  &cvarr_size, nrec_size, &cvarr_rot, nrec_rot);
+    
+    return stat;
+}

+ 9 - 3
display/d.vect/topo.c

@@ -5,7 +5,7 @@
 #include "local_proto.h"
 #include "plot.h"
 
-int topo(struct Map_info *Map, int type, int do_area, LATTR *lattr)
+int display_topo(struct Map_info *Map, int type, int do_area, LATTR *lattr)
 {
     int ltype, num, el;
     struct line_pnts *Points;
@@ -13,6 +13,13 @@ int topo(struct Map_info *Map, int type, int do_area, LATTR *lattr)
     char text[50];
     LATTR lattr2 = *lattr;
 
+    if (Vect_level(Map) < 2) {
+	G_warning(_("Unable to display topology, not available."
+		    "Please try to rebuild topology using "
+		    "v.build or v.build.all."));
+	return 1;
+    }
+    
     lattr2.xref = lattr->xref == LRIGHT ? LLEFT : LRIGHT;
 
     G_debug(1, "display topo:");
@@ -39,8 +46,7 @@ int topo(struct Map_info *Map, int type, int do_area, LATTR *lattr)
 	G_debug(3, "ltype = %d", ltype);
 	switch (ltype) {
 	case -1:
-	    fprintf(stderr, _("\nERROR: vector map - can't read\n"));
-	    return -1;
+	    G_fatal_error(_("Unable to read vector map"));
 	case -2:		/* EOF */
 	    return 0;
 	}

+ 0 - 84
display/d.vect/utils.c

@@ -1,84 +0,0 @@
-#include <grass/gis.h>
-#include <grass/vector.h>
-#include <grass/display.h>
-#include <grass/glocale.h>
-#include "local_proto.h"
-#include "plot.h"
-
-void show_label(double *px, double *py, LATTR *lattr, const char *text)
-{
-    double X = *px, Y = *py;
-    int Xoffset, Yoffset;
-    double xarr[5], yarr[5];
-    double T, B, L, R;
-
-    X = X + D_get_d_to_u_xconv() * 0.5 * lattr->size;
-    Y = Y + D_get_d_to_u_yconv() * 1.5 * lattr->size;
-
-    D_pos_abs(X, Y);
-    D_get_text_box(text, &T, &B, &L, &R);
-
-    /* Expand border 1/2 of text size */
-    T = T - D_get_d_to_u_yconv() * lattr->size / 2;
-    B = B + D_get_d_to_u_yconv() * lattr->size / 2;
-    L = L - D_get_d_to_u_xconv() * lattr->size / 2;
-    R = R + D_get_d_to_u_xconv() * lattr->size / 2;
-
-    Xoffset = 0;
-    Yoffset = 0;
-    if (lattr->xref == LCENTER)
-	Xoffset = -(R - L) / 2;
-    if (lattr->xref == LRIGHT)
-	Xoffset = -(R - L);
-    if (lattr->yref == LCENTER)
-	Yoffset = -(B - T) / 2;
-    if (lattr->yref == LBOTTOM)
-	Yoffset = -(B - T);
-
-    if (lattr->has_bgcolor || lattr->has_bcolor) {
-	xarr[0] = xarr[1] = xarr[4] = L + Xoffset;
-	xarr[2] = xarr[3] = R + Xoffset;
-	yarr[0] = yarr[3] = yarr[4] = B + Yoffset;
-	yarr[1] = yarr[2] = T + Yoffset;
-
-	if (lattr->has_bgcolor) {
-	    D_RGB_color(lattr->bgcolor.R, lattr->bgcolor.G,
-			lattr->bgcolor.B);
-	    D_polygon_abs(xarr, yarr, 5);
-	}
-
-	if (lattr->has_bcolor) {
-	    D_RGB_color(lattr->bcolor.R, lattr->bcolor.G,
-			lattr->bcolor.B);
-	    D_polyline_abs(xarr, yarr, 5);
-	}
-	D_RGB_color(lattr->color.R, lattr->color.G, lattr->color.B);
-    }
-
-    D_pos_abs(X + Xoffset, Y + Yoffset);
-    D_text(text);
-}
-
-void show_label_line(const struct line_pnts *Points, int ltype, LATTR *lattr, const char *text)
-{
-    double X, Y;
-
-    if ((ltype & GV_POINTS) || Points->n_points == 1)
-	/* point/centroid or line/boundary with one coor */
-    {
-	X = Points->x[0];
-	Y = Points->y[0];
-    }
-    else if (Points->n_points == 2) {	/* line with two coors */
-	X = (Points->x[0] + Points->x[1]) / 2;
-	Y = (Points->y[0] + Points->y[1]) / 2;
-    }
-    else {
-	int i = Points->n_points / 2;
-	X = Points->x[i];
-	Y = Points->y[i];
-    }
-
-    show_label(&X, &Y, lattr, text);
-}
-

+ 8 - 2
display/d.vect/zcoor.c

@@ -3,10 +3,12 @@
 #include <grass/gis.h>
 #include <grass/vector.h>
 #include <grass/display.h>
+#include <grass/glocale.h>
+
 #include "local_proto.h"
 #include "plot.h"
 
-int zcoor(struct Map_info *Map, int type, LATTR *lattr)
+int display_zcoor(struct Map_info *Map, int type, LATTR *lattr)
 {
     int num, el;
     double xl, yl, zl;
@@ -14,6 +16,11 @@ int zcoor(struct Map_info *Map, int type, LATTR *lattr)
     struct line_cats *Cats;
     char text[50];
 
+    if (!Vect_is_3d(Map)) {
+	G_warning(_("Vector map is not 3D. Unable to display z-coordinates."));
+	return 1;
+    }
+    
     G_debug(1, "display zcoor:");
     Points = Vect_new_line_struct();
     Cats = Vect_new_cats_struct();
@@ -27,7 +34,6 @@ int zcoor(struct Map_info *Map, int type, LATTR *lattr)
 
     Vect_rewind(Map);
 
-
     num = Vect_get_num_nodes(Map);
     G_debug(1, "n_nodes = %d", num);