[GRASS-SVN] r70615 - grass/trunk/vector/v.distance

svn_grass at osgeo.org svn_grass at osgeo.org
Sat Feb 18 06:16:18 PST 2017


Author: hcho
Date: 2017-02-18 06:16:17 -0800 (Sat, 18 Feb 2017)
New Revision: 70615

Modified:
   grass/trunk/vector/v.distance/main.c
Log:
v.distance: Don't require -p or column= just to create new features with no attributes; Don't output to stdout when -a is used with column= (stdout only with -p)

v.distance from= to=				# new map
v.distance from= to= upload= -p 		# new map & stdout
v.distance from= to= upload= column=		# new map with attributes
v.distance -a from= to=				# new map
v.distance -a from= to=	upload= -p		# new map & stdout
v.distance -a from= to=	upload= column= table=	# new map with attributes


Modified: grass/trunk/vector/v.distance/main.c
===================================================================
--- grass/trunk/vector/v.distance/main.c	2017-02-18 09:52:36 UTC (rev 70614)
+++ grass/trunk/vector/v.distance/main.c	2017-02-18 14:16:17 UTC (rev 70615)
@@ -38,6 +38,7 @@
     int i, j;
     int print_as_matrix;	/* only for do_all=TRUE */
     int do_all;			/* calculate from each to each within the threshold */
+    int upload;
     struct GModule *module;
     struct {
 	struct Option *from, *to, *from_type, *to_type,
@@ -81,6 +82,7 @@
     char *sep;
 
     do_all = FALSE;
+    upload = FALSE;
     print_as_matrix = FALSE;
     column = NULL;
 
@@ -151,7 +153,7 @@
     opt.upload = G_define_option();
     opt.upload->key = "upload";
     opt.upload->type = TYPE_STRING;
-    opt.upload->required = YES;
+    opt.upload->required = NO;
     opt.upload->multiple = YES;
     opt.upload->guisection = _("From");
     opt.upload->options = "cat,dist,to_x,to_y,to_along,to_angle,to_attr";
@@ -217,8 +219,9 @@
     flag.all->label =
 	_("Calculate distances to all features within the threshold");
     flag.all->description =
-	_("Output is written to stdout but may be uploaded to a new table "
-	  "created by this module; multiple 'upload' options may be used.");
+	_("Output may be written to stdout using the 'print' flag, "
+	  "or uploaded to a new table created by the 'table' option; "
+	  "multiple 'upload' options may be used.");
 
     /* GUI dependency */
     opt.from->guidependency = G_store(opt.from_field->key);
@@ -227,7 +230,11 @@
     opt.to_field->guidependency = G_store(opt.to_column->key);
     
     G_option_exclusive(opt.column, flag.print, NULL);
-    G_option_required(opt.column, flag.print, NULL);
+    G_option_exclusive(opt.table, flag.print, NULL);
+    G_option_requires(opt.upload, flag.print, opt.column, NULL);
+    G_option_requires(opt.column, opt.upload, NULL);
+    G_option_requires(flag.print, opt.upload, NULL);
+    G_option_requires_all(opt.table, flag.all, opt.upload, NULL);
 
     if (G_parser(argc, argv))
 	exit(EXIT_FAILURE);
@@ -240,6 +247,8 @@
 
     if (flag.all->answer)
 	do_all = TRUE;
+    if (opt.column->answer || flag.print->answer)
+	upload = TRUE;
 
     geodesic = G_projection() == PROJECTION_LL;
     if (geodesic)
@@ -250,7 +259,7 @@
     /* Read upload and column options */
     /* count */
     i = 0;
-    while (opt.upload->answers[i])
+    while (opt.upload->answer && opt.upload->answers[i])
 	i++;
     if (strcmp(opt.from->answer, opt.to->answer) == 0 &&
 	do_all && !opt.table->answer && i == 1)
@@ -260,7 +269,7 @@
     Upload = (UPLOAD *) G_calloc(i + 1, sizeof(UPLOAD));
     /* read upload */
     i = 0;
-    while (opt.upload->answers[i]) {
+    while (opt.upload->answer && opt.upload->answers[i]) {
 	if (strcmp(opt.upload->answers[i], "cat") == 0)
 	    Upload[i].upload = CAT;
 	else if (strcmp(opt.upload->answers[i], "from_x") == 0)
@@ -286,9 +295,8 @@
 	    Upload[i].upload = TO_ATTR;
 	}
 
-	/* store relation names if -p is given because column= and -p are
-	 * mutually exclusive */
-	if (flag.print->answer)
+	/* store default column names if column= is not given */
+	if (!opt.column->answer)
 	    Upload[i].column = G_store(opt.upload->answers[i]);
 
 	i++;
@@ -457,7 +465,7 @@
     db_init_string(&dbstr);
     driver = NULL;
     Fi = NULL;
-    if (!flag.print->answer && !do_all) {
+    if (upload && !flag.print->answer && !do_all) {
 
 	Fi = Vect_get_field(&From, from_field);
 	if (Fi == NULL)
@@ -525,7 +533,7 @@
 	}
 
 	/* Check column types */
-	if (!flag.print->answer && !do_all) {
+	if (upload && !flag.print->answer && !do_all) {
 	    char *fcname = NULL;
 	    int fctype, tctype;
 
@@ -1295,13 +1303,13 @@
     }
 
     /* open from driver */
-    if (!flag.print->answer) {
+    if (upload && !flag.print->answer) {
 	if (!do_all) {
 
 	    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);
+				Fi->database, Fi->driver);
 	}
 	else {
 	    driver = db_start_driver_open_database(NULL, NULL);
@@ -1370,7 +1378,7 @@
 			  opt.table->answer);
 
     }
-    else if (!do_all) {		/* read existing cats from table */
+    else if (upload && !do_all) {	/* read existing cats from table */
 	ncatexist =
 	    db_select_int(driver, Fi->table, Fi->key, NULL, &catexist);
 	G_debug(1, "%d cats selected from the table", ncatexist);
@@ -1386,13 +1394,13 @@
     if (driver)
 	db_begin_transaction(driver);
 
-    if (!(flag.print->answer || (do_all && !opt.table->answer))) /* no printing */
+    if (!flag.print->answer) /* no printing */
 	G_message("Update vector attributes...");
 
     for (i = 0; i < count; i++) {
 	dbCatVal *catval = 0;
 
-	if (!(flag.print->answer || (do_all && !opt.table->answer))) /* no printing */
+	if (!flag.print->answer) /* no printing */
 	    G_percent(i, count, 1);
 
 	/* Write line connecting nearest points */
@@ -1423,7 +1431,7 @@
 	    db_CatValArray_get_value(&cvarr, Near[i].to_cat, &catval);
 	}
 
-	if (flag.print->answer || (do_all && !opt.table->answer)) {	/* print only */
+	if (flag.print->answer) {	/* print only */
 	    /*
 	       input and output is the same &&
 	       calculate distances &&
@@ -1455,7 +1463,7 @@
 		fprintf(stdout, "\n");
 	    }
 	}
-	else if (do_all) {		/* insert new record */
+	else if (do_all && opt.table->answer) {		/* insert new record */
 	    if (!Outp)
 		sprintf(buf1, "insert into %s values ( %d ", opt.table->answer,
 			Near[i].from_cat);
@@ -1538,7 +1546,7 @@
 		update_err++;
 	    }
 	}
-	else {			/* update table */
+	else if (upload) {			/* update table */
 	    /* check if exists in table */
 	    cex =
 		(int *)bsearch((void *)&(Near[i].from_cat), catexist,
@@ -1652,7 +1660,7 @@
 	G_message(_("%d categories - no nearest feature found"),
 		  update_notfound);
 
-    if (!flag.print->answer) {
+    if (upload && !flag.print->answer) {
 	db_close_database_shutdown_driver(driver);
 	db_free_string(&stmt);
 



More information about the grass-commit mailing list