[GRASS-SVN] r56326 - grass/trunk/misc/m.nviz.image

svn_grass at osgeo.org svn_grass at osgeo.org
Mon May 20 05:35:25 PDT 2013


Author: martinl
Date: 2013-05-20 05:35:20 -0700 (Mon, 20 May 2013)
New Revision: 56326

Modified:
   grass/trunk/misc/m.nviz.image/local_proto.h
   grass/trunk/misc/m.nviz.image/vector.c
Log:
m.nviz.image: fix check_thematic logic
              fix z-mode for 3D vector maps


Modified: grass/trunk/misc/m.nviz.image/local_proto.h
===================================================================
--- grass/trunk/misc/m.nviz.image/local_proto.h	2013-05-20 12:27:46 UTC (rev 56325)
+++ grass/trunk/misc/m.nviz.image/local_proto.h	2013-05-20 12:35:20 UTC (rev 56326)
@@ -56,7 +56,7 @@
 int load_vpoints(const struct GParams *, nv_data *);
 int vlines_set_attrb(const struct GParams *);
 int vpoints_set_attrb(const struct GParams *);
-int check_thematic(const struct GParams *, int);
+int check_map(const struct GParams *, int, int, int *, int *);
 
 /* volume.c */
 int load_rasters3d(const struct GParams *, nv_data *);

Modified: grass/trunk/misc/m.nviz.image/vector.c
===================================================================
--- grass/trunk/misc/m.nviz.image/vector.c	2013-05-20 12:27:46 UTC (rev 56325)
+++ grass/trunk/misc/m.nviz.image/vector.c	2013-05-20 12:35:20 UTC (rev 56326)
@@ -3,7 +3,7 @@
   
   \brief Vector subroutines
   
-  (C) 2008, 2010-2011 by the GRASS Development Team
+  (C) 2008-2013 by the GRASS Development Team
 
   This program is free software under the GNU General Public
   License (>=v2). Read the file COPYING that comes with GRASS
@@ -124,7 +124,7 @@
     vect_list = GV_get_vect_list(&nvects);
 
     for (i = 0; i < nvects; i++) {
-	layer = check_thematic(params, TRUE);
+	check_map(params, i, TRUE, &layer, NULL);
 	
 	color = Nviz_color_from_str(params->vline_color->answers[i]);
 	color_column = params->vline_color_column->answers ?
@@ -170,7 +170,7 @@
 */
 int vpoints_set_attrb(const struct GParams *params)
 {
-    int i, layer, have_colors;
+    int i, layer, have_colors, with_z;
     int *site_list, nsites;
     int marker, color, width;
     float size;
@@ -181,7 +181,7 @@
     site_list = GP_get_site_list(&nsites);
 
     for (i = 0; i < nsites; i++) {
-	layer = check_thematic(params, FALSE);
+        check_map(params, i, FALSE, &layer, &with_z);
 	color = Nviz_color_from_str(params->vpoint_color->answers[i]);
 	color_column = params->vpoint_color_column->answers ?
 	    params->vpoint_color_column->answers[i] : NULL;
@@ -195,7 +195,10 @@
 	marker_column = params->vpoint_marker_column->answers ?
 	    params->vpoint_marker_column->answers[i] : NULL;
 	marker = GP_str_to_marker(marker_str);
-	
+
+        if (with_z)
+            GP_set_zmode(site_list[i], TRUE);
+
 	if (GP_set_style(site_list[i], color, width, size, marker) < 0)
 	    return 0;
 
@@ -215,101 +218,123 @@
     return 1;
 }
 
-int check_thematic(const struct GParams *params, int vlines)
+/*!
+  \brief Check vector map
+
+  \param params parameters
+  \param index answers array index
+  \param vlines TRUE for lines otherwise points
+  \param[out] field number
+  \param[out] WITH_Z for 3D maps
+
+  \return 0 on success otherwise 1
+*/
+int check_map(const struct GParams *params, int index, int vlines,
+                   int *field, int *with_z)
 {
-    int i, type;
+    int type;
     struct Map_info Map;
-    struct Option *map, *layer, *color, *size, *width, *marker;
+    const char *map, *layer, *color, *size, *width, *marker;
     struct field_info *Fi;
 
     dbDriver *driver;
     dbColumn *column;
     
     Fi = NULL;
-    
+    driver = NULL;
+
     if (vlines) {
-	map    = params->vlines;
-	layer  = params->vline_layer;
-	color  = params->vline_color_column;
+	map    = params->vlines->answers[index];
+	layer  = params->vline_layer->answers[index];
+	color  = params->vline_color_column->answers ? 
+            params->vline_color_column->answers[index] : NULL;
 	size   = NULL;
-	width  = params->vline_width_column;
+	width  = params->vline_width_column->answers ?
+            params->vline_width_column->answers[index] : NULL;
 	marker = NULL;
     }
     else {
-	map    = params->vpoints;
-	layer  = params->vpoint_layer;
-	color  = params->vpoint_color_column;
-	size   = params->vpoint_size_column;
-	width  = params->vpoint_width_column;
-	marker = params->vpoint_marker_column;
+	map    = params->vpoints->answers[index];
+	layer  = params->vpoint_layer->answers[index];
+	color  = params->vpoint_color_column->answers ?
+            params->vpoint_color_column->answers[index] : NULL;
+	size   = params->vpoint_size_column->answers ?
+            params->vpoint_size_column->answers[index] : NULL;
+	width  = params->vpoint_width_column->answers ?
+            params->vpoint_width_column->answers[index] : NULL;
+	marker = params->vpoint_marker_column->answers ?
+            params->vpoint_marker_column->answers[index] : NULL;
     }
+
+    if (!map)
+        return 1;
     
-    driver = NULL;
-    for (i = 0; map->answers[i]; i++) {
-	if (1 > Vect_open_old(&Map, map->answers[i], ""))
-	    G_fatal_error(_("Unable to open vector map <%s>"), map->answers[i]);
-        G_add_error_handler(error_handler_vector, &Map);
-        
-	Fi = Vect_get_field2(&Map, layer->answers[i]);
-	if (!Fi)
-	    continue;
-	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);
-	G_add_error_handler(error_handler_db, driver);
+    if (1 > Vect_open_old(&Map, map, ""))
+        G_fatal_error(_("Unable to open vector map <%s>"), map);
+    G_add_error_handler(error_handler_vector, &Map);
 
-	if (color->answers && color->answers[i]) {
-	    db_get_column(driver, Fi->table, color->answers[i], &column);
-	    if (!column)
-		G_fatal_error(_("Column <%s> in table <%s> not found"),
-			      color->answers[i], Fi->table);
-	    
-	    if (db_column_Ctype(driver, Fi->table, color->answers[i]) != DB_C_TYPE_STRING)
-		G_fatal_error(_("Data type of color column must be character"));
-	}
-	if (size && size->answers && size->answers[i]) {
-	    db_get_column(driver, Fi->table, size->answers[i], &column);
-	    if (!column)
-		G_fatal_error(_("Column <%s> in table <%s> not found"),
-			      size->answers[i], Fi->table);
-	    
-	    type = db_column_Ctype(driver, Fi->table, size->answers[i]);
-	    if (type != DB_C_TYPE_INT && type != DB_C_TYPE_DOUBLE)
-		G_fatal_error(_("Data type of size column must be numeric"));
-	}
-	if (width->answers && width->answers[i]) {
-	    db_get_column(driver, Fi->table, width->answers[i], &column);
-	    if (!column)
-		G_fatal_error(_("Column <%s> in table <%s> not found"),
-			      width->answers[i], Fi->table);
-	    
-	    type = db_column_Ctype(driver, Fi->table, width->answers[i]);
-	    if (type != DB_C_TYPE_INT && type != DB_C_TYPE_DOUBLE)
-		G_fatal_error(_("Data type of width column must be numeric"));
-	}
-	if (marker && marker->answers && marker->answers[i]) {
-	    db_get_column(driver, Fi->table, marker->answers[i], &column);
-	    if (!column)
-		G_fatal_error(_("Column <%s> in table <%s> not found"),
-			      marker->answers[i], Fi->table);
-	  
-	  type = db_column_Ctype(driver, Fi->table, marker->answers[i]);
-	    if (db_column_Ctype(driver, Fi->table, marker->answers[i]) != DB_C_TYPE_STRING)
-		G_fatal_error(_("Data type of marker column must be character"));
-	}
+    if (with_z)
+        *with_z = Vect_is_3d(&Map);
 
+    *field = -1;    
+    Fi = Vect_get_field2(&Map, layer);
+    if (Fi) {
+        *field = Fi->number;
+    
+        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);
+        G_add_error_handler(error_handler_db, driver);
+        
+        if (color) {
+            db_get_column(driver, Fi->table, color, &column);
+            if (!column)
+                G_fatal_error(_("Column <%s> in table <%s> not found"),
+                              color, Fi->table);
+            
+            if (db_column_Ctype(driver, Fi->table, color) != DB_C_TYPE_STRING)
+                G_fatal_error(_("Data type of color column must be character"));
+        }
+        if (size) {
+            db_get_column(driver, Fi->table, size, &column);
+            if (!column)
+                G_fatal_error(_("Column <%s> in table <%s> not found"),
+                              size, Fi->table);
+            
+            type = db_column_Ctype(driver, Fi->table, size);
+            if (type != DB_C_TYPE_INT && type != DB_C_TYPE_DOUBLE)
+                G_fatal_error(_("Data type of size column must be numeric"));
+        }
+        if (width) {
+            db_get_column(driver, Fi->table, width, &column);
+            if (!column)
+                G_fatal_error(_("Column <%s> in table <%s> not found"),
+                              width, Fi->table);
+            
+            type = db_column_Ctype(driver, Fi->table, width);
+            if (type != DB_C_TYPE_INT && type != DB_C_TYPE_DOUBLE)
+                G_fatal_error(_("Data type of width column must be numeric"));
+        }
+        if (marker) {
+            db_get_column(driver, Fi->table, marker, &column);
+            if (!column)
+                G_fatal_error(_("Column <%s> in table <%s> not found"),
+                              marker, Fi->table);
+            
+            type = db_column_Ctype(driver, Fi->table, marker);
+            if (db_column_Ctype(driver, Fi->table, marker) != DB_C_TYPE_STRING)
+                G_fatal_error(_("Data type of marker column must be character"));
+        }
+        
         G_remove_error_handler(error_handler_db, driver);        
         db_close_database_shutdown_driver(driver);
     }
-
+    
     G_remove_error_handler(error_handler_vector, &Map);
     Vect_close(&Map);
 
-    if (Fi) 
-	return Fi->number;
-    
-    return 1;
+    return 0;
 }
 
 void error_handler_vector(void *p)



More information about the grass-commit mailing list