Kaynağa Gözat

g.region: do not update WIND file when not needed (#1627)

Changes default behavior to behave more intuitively, now WIND file is written only with certain
options (e.g. raster=, n=, ...) and it is left untouched if only printing is needed.
Added force flag -o to force writing WIND file if desired.
This change help avoid issues with parallel processing.
Flag -u still makes sense for some cases (also keeps backward compatibility).
Anna Petrasova 3 yıl önce
ebeveyn
işleme
80b616db98
2 değiştirilmiş dosya ile 46 ekleme ve 9 silme
  1. 8 0
      general/g.region/g.region.html
  2. 38 9
      general/g.region/main.c

+ 8 - 0
general/g.region/g.region.html

@@ -122,6 +122,14 @@ This format can be given back to <em>g.region</em> on its command line.
 This may also be used to save region settings as shell environment variables
 This may also be used to save region settings as shell environment variables
 with the UNIX eval command, "<tt>eval `g.region -g`</tt>".
 with the UNIX eval command, "<tt>eval `g.region -g`</tt>".
 
 
+<p>With <b>-u</b> flag current region is not updated even if one or more
+options for changing region is used (<b>res=</b>, <b>raster=</b>, etc).
+This can be used for example to print modified region values for further use
+without actually modifing the current region.
+Similarly, <b>-o</b> flag forces to update current region file even when e.g., only
+printing was specified. Flag <b>-o</b> was added in GRASS GIS version 8 to simulate
+<em>g.region</em> behavior in prior versions when current region file was
+always updated unless <b>-u</b> was specified.
 
 
 <h3>Additional parameter information:</h3>
 <h3>Additional parameter information:</h3>
 
 

+ 38 - 9
general/g.region/main.c

@@ -31,7 +31,6 @@ int main(int argc, char *argv[])
     int i;
     int i;
     int print_flag = 0;
     int print_flag = 0;
     int flat_flag; 
     int flat_flag; 
-    int set_flag;
     double x, xs, ys, zs;
     double x, xs, ys, zs;
     int ival;
     int ival;
     int row_flag = 0, col_flag = 0;
     int row_flag = 0, col_flag = 0;
@@ -41,12 +40,13 @@ int main(int argc, char *argv[])
     const char *mapset;
     const char *mapset;
     char **rast_ptr, **vect_ptr;
     char **rast_ptr, **vect_ptr;
     int pix;
     int pix;
+    bool update_file = false;
 
 
     struct GModule *module;
     struct GModule *module;
     struct
     struct
     {
     {
 	struct Flag
 	struct Flag
-	    *update, *print, *gprint, *flprint, *lprint, *eprint, *nangle,
+	    *noupdate, *force, *print, *gprint, *flprint, *lprint, *eprint, *nangle,
 	    *center, *res_set, *dist_res, *dflt, *z, *savedefault,
 	    *center, *res_set, *dist_res, *dflt, *z, *savedefault,
 	    *bbox, *gmt_style, *wms_style;
 	    *bbox, *gmt_style, *wms_style;
     } flag;
     } flag;
@@ -160,10 +160,15 @@ int main(int argc, char *argv[])
 	  "works only for 2D resolution)");
 	  "works only for 2D resolution)");
     flag.res_set->guisection = _("Bounds");
     flag.res_set->guisection = _("Bounds");
 
 
-    flag.update = G_define_flag();
-    flag.update->key = 'u';
-    flag.update->description = _("Do not update the current region");
-    flag.update->guisection = _("Effects");
+    flag.noupdate = G_define_flag();
+    flag.noupdate->key = 'u';
+    flag.noupdate->description = _("Do not update the current region");
+    flag.noupdate->guisection = _("Effects");
+
+    flag.force = G_define_flag();
+    flag.force->key = 'o';
+    flag.force->description = _("Force update of the current region");
+    flag.force->guisection = _("Effects");
 
 
     /* parameters */
     /* parameters */
 
 
@@ -362,18 +367,21 @@ int main(int argc, char *argv[])
     G_option_required(flag.dflt, flag.savedefault, flag.print, flag.lprint,
     G_option_required(flag.dflt, flag.savedefault, flag.print, flag.lprint,
                       flag.eprint, flag.center, flag.gmt_style, flag.wms_style,
                       flag.eprint, flag.center, flag.gmt_style, flag.wms_style,
                       flag.dist_res, flag.nangle, flag. z, flag.bbox, flag.gprint,
                       flag.dist_res, flag.nangle, flag. z, flag.bbox, flag.gprint,
-                      flag.res_set, flag.update, parm.region, parm.raster,
+                      flag.res_set, flag.noupdate, parm.region, parm.raster,
                       parm.raster3d, parm.vect, parm.north, parm.south, parm.east,
                       parm.raster3d, parm.vect, parm.north, parm.south, parm.east,
                       parm.west, parm.top, parm.bottom, parm.rows, parm.cols,
                       parm.west, parm.top, parm.bottom, parm.rows, parm.cols,
                       parm.res, parm.res3, parm.nsres, parm.ewres, parm.tbres,
                       parm.res, parm.res3, parm.nsres, parm.ewres, parm.tbres,
                       parm.zoom, parm.align, parm.save, parm.grow, NULL);
                       parm.zoom, parm.align, parm.save, parm.grow, NULL);
+    G_option_exclusive(flag.noupdate, flag.force, NULL);
+    G_option_requires(flag.noupdate, flag.savedefault, flag.print, flag.lprint,
+                      flag.eprint, flag.center, flag.gmt_style, flag.wms_style,
+                      flag.dist_res, flag.nangle, flag.z, flag.bbox, flag.gprint, parm.save, NULL);
 
 
     if (G_parser(argc, argv))
     if (G_parser(argc, argv))
 	exit(EXIT_FAILURE);
 	exit(EXIT_FAILURE);
 
 
     G_get_default_window(&window);
     G_get_default_window(&window);
 
 
-    set_flag = !flag.update->answer;
     flat_flag = flag.flprint->answer;
     flat_flag = flag.flprint->answer;
 
 
     if (flag.print->answer)
     if (flag.print->answer)
@@ -422,6 +430,7 @@ int main(int argc, char *argv[])
 
 
     /* region= */
     /* region= */
     if ((name = parm.region->answer)) {
     if ((name = parm.region->answer)) {
+	update_file = true;
 	mapset = G_find_file2("windows", name, "");
 	mapset = G_find_file2("windows", name, "");
 	if (!mapset)
 	if (!mapset)
 	    G_fatal_error(_("Region <%s> not found"), name);
 	    G_fatal_error(_("Region <%s> not found"), name);
@@ -432,6 +441,7 @@ int main(int argc, char *argv[])
     if (parm.raster->answer) {
     if (parm.raster->answer) {
 	int first = 0;
 	int first = 0;
 
 
+	update_file = true;
 	rast_ptr = parm.raster->answers;
 	rast_ptr = parm.raster->answers;
 	for (; *rast_ptr != NULL; rast_ptr++) {
 	for (; *rast_ptr != NULL; rast_ptr++) {
 	    char rast_name[GNAME_MAX];
 	    char rast_name[GNAME_MAX];
@@ -464,6 +474,7 @@ int main(int argc, char *argv[])
     if ((name = parm.raster3d->answer)) {
     if ((name = parm.raster3d->answer)) {
 	RASTER3D_Region win;
 	RASTER3D_Region win;
 
 
+	update_file = true;
 	if ((mapset = G_find_raster3d(name, "")) == NULL)
 	if ((mapset = G_find_raster3d(name, "")) == NULL)
 	    G_fatal_error(_("3D raster map <%s> not found"), name);
 	    G_fatal_error(_("3D raster map <%s> not found"), name);
 
 
@@ -478,6 +489,7 @@ int main(int argc, char *argv[])
     if (parm.vect->answer) {
     if (parm.vect->answer) {
 	int first = 0;
 	int first = 0;
 
 
+	update_file = true;
 	vect_ptr = parm.vect->answers;
 	vect_ptr = parm.vect->answers;
 	for (; *vect_ptr != NULL; vect_ptr++) {
 	for (; *vect_ptr != NULL; vect_ptr++) {
             int ret;
             int ret;
@@ -560,6 +572,7 @@ int main(int argc, char *argv[])
 
 
     /* n= */
     /* n= */
     if ((value = parm.north->answer)) {
     if ((value = parm.north->answer)) {
+	update_file = true;
 	if ((i = nsew(value, "n+", "n-", "s+"))) {
 	if ((i = nsew(value, "n+", "n-", "s+"))) {
 	    if (!G_scan_resolution(value + 2, &x, window.proj))
 	    if (!G_scan_resolution(value + 2, &x, window.proj))
 		die(parm.north);
 		die(parm.north);
@@ -583,6 +596,7 @@ int main(int argc, char *argv[])
 
 
     /* s= */
     /* s= */
     if ((value = parm.south->answer)) {
     if ((value = parm.south->answer)) {
+	update_file = true;
 	if ((i = nsew(value, "s+", "s-", "n-"))) {
 	if ((i = nsew(value, "s+", "s-", "n-"))) {
 	    if (!G_scan_resolution(value + 2, &x, window.proj))
 	    if (!G_scan_resolution(value + 2, &x, window.proj))
 		die(parm.south);
 		die(parm.south);
@@ -606,6 +620,7 @@ int main(int argc, char *argv[])
 
 
     /* e= */
     /* e= */
     if ((value = parm.east->answer)) {
     if ((value = parm.east->answer)) {
+	update_file = true;
 	if ((i = nsew(value, "e+", "e-", "w+"))) {
 	if ((i = nsew(value, "e+", "e-", "w+"))) {
 	    if (!G_scan_resolution(value + 2, &x, window.proj))
 	    if (!G_scan_resolution(value + 2, &x, window.proj))
 		die(parm.east);
 		die(parm.east);
@@ -629,6 +644,7 @@ int main(int argc, char *argv[])
 
 
     /* w= */
     /* w= */
     if ((value = parm.west->answer)) {
     if ((value = parm.west->answer)) {
+	update_file = true;
 	if ((i = nsew(value, "w+", "w-", "e-"))) {
 	if ((i = nsew(value, "w+", "w-", "e-"))) {
 	    if (!G_scan_resolution(value + 2, &x, window.proj))
 	    if (!G_scan_resolution(value + 2, &x, window.proj))
 		die(parm.west);
 		die(parm.west);
@@ -652,6 +668,7 @@ int main(int argc, char *argv[])
 
 
     /* t= */
     /* t= */
     if ((value = parm.top->answer)) {
     if ((value = parm.top->answer)) {
+	update_file = true;
 	if ((i = nsew(value, "t+", "t-", "b+"))) {
 	if ((i = nsew(value, "t+", "t-", "b+"))) {
 	    if (sscanf(value + 2, "%lf", &x) != 1)
 	    if (sscanf(value + 2, "%lf", &x) != 1)
 		die(parm.top);
 		die(parm.top);
@@ -675,6 +692,7 @@ int main(int argc, char *argv[])
 
 
     /* b= */
     /* b= */
     if ((value = parm.bottom->answer)) {
     if ((value = parm.bottom->answer)) {
+	update_file = true;
 	if ((i = nsew(value, "b+", "b-", "t-"))) {
 	if ((i = nsew(value, "b+", "b-", "t-"))) {
 	    if (sscanf(value + 2, "%lf", &x) != 1)
 	    if (sscanf(value + 2, "%lf", &x) != 1)
 		die(parm.bottom);
 		die(parm.bottom);
@@ -698,6 +716,7 @@ int main(int argc, char *argv[])
 
 
     /* res= */
     /* res= */
     if ((value = parm.res->answer)) {
     if ((value = parm.res->answer)) {
+	update_file = true;
 	if (!G_scan_resolution(value, &x, window.proj))
 	if (!G_scan_resolution(value, &x, window.proj))
 	    die(parm.res);
 	    die(parm.res);
 	window.ns_res = x;
 	window.ns_res = x;
@@ -713,6 +732,7 @@ int main(int argc, char *argv[])
 
 
     /* res3= */
     /* res3= */
     if ((value = parm.res3->answer)) {
     if ((value = parm.res3->answer)) {
+	update_file = true;
 	if (!G_scan_resolution(value, &x, window.proj))
 	if (!G_scan_resolution(value, &x, window.proj))
 	    die(parm.res);
 	    die(parm.res);
 	window.ns_res3 = x;
 	window.ns_res3 = x;
@@ -722,6 +742,7 @@ int main(int argc, char *argv[])
 
 
     /* nsres= */
     /* nsres= */
     if ((value = parm.nsres->answer)) {
     if ((value = parm.nsres->answer)) {
+	update_file = true;
 	if (!G_scan_resolution(value, &x, window.proj))
 	if (!G_scan_resolution(value, &x, window.proj))
 	    die(parm.nsres);
 	    die(parm.nsres);
 	window.ns_res = x;
 	window.ns_res = x;
@@ -734,6 +755,7 @@ int main(int argc, char *argv[])
 
 
     /* ewres= */
     /* ewres= */
     if ((value = parm.ewres->answer)) {
     if ((value = parm.ewres->answer)) {
+	update_file = true;
 	if (!G_scan_resolution(value, &x, window.proj))
 	if (!G_scan_resolution(value, &x, window.proj))
 	    die(parm.ewres);
 	    die(parm.ewres);
 	window.ew_res = x;
 	window.ew_res = x;
@@ -746,6 +768,7 @@ int main(int argc, char *argv[])
 
 
     /* tbres= */
     /* tbres= */
     if ((value = parm.tbres->answer)) {
     if ((value = parm.tbres->answer)) {
+	update_file = true;
 	if (sscanf(value, "%lf", &x) != 1)
 	if (sscanf(value, "%lf", &x) != 1)
 	    die(parm.tbres);
 	    die(parm.tbres);
 	window.tb_res = x;
 	window.tb_res = x;
@@ -758,6 +781,7 @@ int main(int argc, char *argv[])
 
 
     /* rows= */
     /* rows= */
     if ((value = parm.rows->answer)) {
     if ((value = parm.rows->answer)) {
+	update_file = true;
 	if (sscanf(value, "%i", &ival) != 1)
 	if (sscanf(value, "%i", &ival) != 1)
 	    die(parm.rows);
 	    die(parm.rows);
 	window.rows = ival;
 	window.rows = ival;
@@ -766,6 +790,7 @@ int main(int argc, char *argv[])
 
 
     /* cols= */
     /* cols= */
     if ((value = parm.cols->answer)) {
     if ((value = parm.cols->answer)) {
+	update_file = true;
 	if (sscanf(value, "%i", &ival) != 1)
 	if (sscanf(value, "%i", &ival) != 1)
 	    die(parm.cols);
 	    die(parm.cols);
 	window.cols = ival;
 	window.cols = ival;
@@ -774,6 +799,7 @@ int main(int argc, char *argv[])
 
 
     /* zoom= */
     /* zoom= */
     if ((name = parm.zoom->answer)) {
     if ((name = parm.zoom->answer)) {
+	update_file = true;
 	mapset = G_find_raster2(name, "");
 	mapset = G_find_raster2(name, "");
 	if (!mapset)
 	if (!mapset)
 	    G_fatal_error(_("Raster map <%s> not found"), name);
 	    G_fatal_error(_("Raster map <%s> not found"), name);
@@ -782,6 +808,7 @@ int main(int argc, char *argv[])
 
 
     /* align= */
     /* align= */
     if ((name = parm.align->answer)) {
     if ((name = parm.align->answer)) {
+	update_file = true;
 	mapset = G_find_raster2(name, "");
 	mapset = G_find_raster2(name, "");
 	if (!mapset)
 	if (!mapset)
 	    G_fatal_error(_("Raster map <%s> not found"), name);
 	    G_fatal_error(_("Raster map <%s> not found"), name);
@@ -791,6 +818,7 @@ int main(int argc, char *argv[])
     
     
     /* grow by number of cells */
     /* grow by number of cells */
     if ((value = parm.grow->answer)){
     if ((value = parm.grow->answer)){
+        update_file = true;
         if (sscanf(value, "%i", &pix)){
         if (sscanf(value, "%i", &pix)){
             xs = window.ns_res * pix;
             xs = window.ns_res * pix;
             if (window.north + xs > window.south - xs){
             if (window.north + xs > window.south - xs){
@@ -828,6 +856,7 @@ int main(int argc, char *argv[])
 	
 	
     /* save= */
     /* save= */
     if ((name = parm.save->answer)) {
     if ((name = parm.save->answer)) {
+	update_file = false;
 	temp_window = window;
 	temp_window = window;
 	G_adjust_Cell_head3(&temp_window, 0, 0, 0);
 	G_adjust_Cell_head3(&temp_window, 0, 0, 0);
 	if (G_put_element_window(&temp_window, "windows", name) < 0)
 	if (G_put_element_window(&temp_window, "windows", name) < 0)
@@ -835,7 +864,7 @@ int main(int argc, char *argv[])
     }
     }
 
 
     G_adjust_Cell_head3(&window, row_flag, col_flag, 0);
     G_adjust_Cell_head3(&window, row_flag, col_flag, 0);
-    if (set_flag) {
+    if (flag.force->answer || (update_file && !flag.noupdate->answer)) {
 	if (G_put_window(&window) < 0)
 	if (G_put_window(&window) < 0)
 	    G_fatal_error(_("Unable to update current region"));
 	    G_fatal_error(_("Unable to update current region"));
     }
     }