瀏覽代碼

i.group: add file option for a file with a list of raster maps (https://trac.osgeo.org/grass/ticket/3627)

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@73147 15284696-431f-4ddb-bdfa-cd5b030d7da7
Markus Metz 6 年之前
父節點
當前提交
60da8fb3d1
共有 1 個文件被更改,包括 46 次插入7 次删除
  1. 46 7
      imagery/i.group/main.c

+ 46 - 7
imagery/i.group/main.c

@@ -40,9 +40,10 @@ static void print_subgroups(char *group, int simple);
 int main(int argc, char *argv[])
 {
     char group[GNAME_MAX], mapset[GMAPSET_MAX];
+    char **rasters = NULL;
     int m, k = 0;
 
-    struct Option *grp, *rast, *sgrp;
+    struct Option *grp, *rast, *rastf, *sgrp;
     struct Flag *r, *l, *s, *simple_flag;
     struct GModule *module;
 
@@ -67,6 +68,11 @@ int main(int argc, char *argv[])
     rast->description = _("Name of raster map(s) to include in group");
     rast->guisection = _("Maps");
 
+    rastf = G_define_standard_option(G_OPT_F_INPUT);
+    rastf->key = "file";
+    rastf->description = _("Input file with one raster map name per line");
+    rastf->required = NO;
+
     r = G_define_flag();
     r->key = 'r';
     r->description =
@@ -97,12 +103,45 @@ int main(int argc, char *argv[])
     if ((simple_flag->answer && !s->answer) && !l->answer)
 	l->answer = TRUE;
 
-    /* Determine number of files to include */
+    /* Determine number of raster maps to include */
     if (rast->answers) {
 	for (m = 0; rast->answers[m]; m++) {
 	    k = m;
 	}
 	k++;
+	rasters = rast->answers;
+    }
+    /* process the input maps from the file */
+    else if (rastf->answer) {
+	FILE *in;
+    
+	m = 10;
+	rasters = G_malloc(m * sizeof(char *));
+	in = fopen(rastf->answer, "r");
+	if (!in)
+	    G_fatal_error(_("Unable to open input file <%s>"), rastf->answer);
+    
+	for (;;) {
+	    char buf[GNAME_MAX];
+	    char *name;
+
+	    if (!G_getl2(buf, sizeof(buf), in))
+		break;
+
+	    name = G_chop(buf);
+
+	    /* Ignore empty lines */
+	    if (!*name)
+		continue;
+
+	    if (m <= k) {
+		m += 10;
+		rasters = G_realloc(rasters, m * sizeof(char *));
+	    }
+	    rasters[k] = G_store(name);
+	    k++;
+	}
+	fclose(in);
     }
 
     if (k < 1 && !(l->answer || s->answer))	/* remove if input is requirement */
@@ -131,12 +170,12 @@ int main(int argc, char *argv[])
 	if (sgrp->answer) {
 	    G_verbose_message(_("Removing raster maps from subgroup <%s>..."),
 			      sgrp->answer);
-	    remove_subgroup_files(group, sgrp->answer, rast->answers, k);
+	    remove_subgroup_files(group, sgrp->answer, rasters, k);
 	}
 	else {
 	    G_verbose_message(_("Removing raster maps from group <%s>..."),
 			      group);
-	    remove_group_files(group, rast->answers, k);
+	    remove_group_files(group, rasters, k);
 	}
     }
     else {
@@ -188,16 +227,16 @@ int main(int argc, char *argv[])
 	    if (sgrp->answer) {
 		G_verbose_message(_("Adding raster maps to group <%s>..."),
 				  group);
-		add_or_update_group(group, rast->answers, k);
+		add_or_update_group(group, rasters, k);
 
 		G_verbose_message(_("Adding raster maps to subgroup <%s>..."),
 				  sgrp->answer);
-		add_or_update_subgroup(group, sgrp->answer, rast->answers, k);
+		add_or_update_subgroup(group, sgrp->answer, rasters, k);
 	    }
 	    else {
 		G_verbose_message(_("Adding raster maps to group <%s>..."),
 				  group);
-		add_or_update_group(group, rast->answers, k);
+		add_or_update_group(group, rasters, k);
 	    }
 	}
     }