[GRASS-dev] v.edit updates

Jachym Cepicky jachym.cepicky at centrum.cz
Fri Dec 15 11:40:39 EST 2006


Dear all,

all changes are in CVS now.

New tool=move implemented.

Documentation [1] updated.

Jachym

[1] http://grass.gdf-hannover.de/wiki/GRASS_Digitizing_tool#v.edit

On Tue, Dec 12, 2006 at 02:41:42PM +0100, Jachym Cepicky wrote:
> Hallo,
> according to suggested funtion of v.edit [1], I started to work on
> v.edit module.
> 
> I prepared patch for this and it would be great, if anybody could look
> at it and say, if it is worth to commit to cvs.
> 
> Currently, only tools "delete" and "add" are supported. But they cand be
> used on slightly different way:
> 
> With this patch, v.edit no longer accepts input in form of comma
> separated list of coordinates, but it reads input (tools "create" and
> "add") from stdin or from ASCII file. I used a2b.c file from v.in.ascii
> for this purpose. Currently, it does not accept header of the vector
> file, so v.out.ascii vect|v.edit tool=add would not work.
> 
> For "tool=remove", new ways for feature definition are defined:
> 
> coords=x,y - remove feature, which can be found on coordinates x,y
> 
> cats=3,4 - remove reature with category 3 or 4
> 
> bbox=x1,y1,x2,y2 - remove features in bounding box
> 
> If everything will be all right, I'll continue on v.edit with moving and
> spliting tools
> 
> Looking forward to your feedback
> 
> Jachym
> 
> [1] http://grass.gdf-hannover.de/wiki/GRASS_Digitizing_tool#v.edit
> -- 
> Jachym Cepicky
> e-mail: jachym.cepicky at centrum.cz
> URL: http://les-ejk.cz
> GPG: http://www.les-ejk.cz/pgp/jachym_cepicky-gpg.pub
> -----------------------------------------   
> OFFICE:                                     
> Department of Geoinformation Technologies 
> Zemedelska 3
> 613 00, Brno
> Czech Republick
> e-mail: xcepicky at node.mendelu.cz
> URL:    http://mapserver.mendelu.cz
> Tel.:   +420 545 134 514

> Index: vector/v.edit/a2b.c
> ===================================================================
> RCS file: vector/v.edit/a2b.c
> diff -N vector/v.edit/a2b.c
> --- /dev/null	1 Jan 1970 00:00:00 -0000
> +++ vector/v.edit/a2b.c	12 Dec 2006 13:29:22 -0000
> @@ -0,0 +1,171 @@
> +/*
> + * This file has been adopted from v.in.ascii code
> + */
> +
> +#include <stdio.h>
> +#include <string.h>
> +#include <grass/gis.h>
> +#include <grass/Vect.h>
> +#include <grass/glocale.h>
> +#include "global.h"
> +
> +#define BUFFSIZE 128
> +
> +int asc_to_bin(FILE *ascii , struct Map_info *Map)
> +{
> +	char ctype ;
> +	char buff[BUFFSIZE];
> +	double *xarray ;
> +	double *yarray ;
> +	double *zarray ;	
> +	double *x, *y, *z;
> +	int i, n_points, n_coors, n_cats ;
> +	int type;
> +	int alloc_points ;
> +	int end_of_file ;
> +	struct line_pnts *Points;
> +	struct line_cats *Cats;	
> +	int catn;
> +	int cat;
> +
> +	/* Must always use this to create an initialized  line_pnts structure */
> +	Points = Vect_new_line_struct ();
> +	Cats = Vect_new_cats_struct ();	
> +
> +	end_of_file = 0 ;
> +	/*alloc_points     = 1000 ; */
> +	alloc_points     = 1;
> +	xarray = (double *) G_calloc(alloc_points, sizeof(double)) ;
> +	yarray = (double *) G_calloc(alloc_points, sizeof(double)) ;
> +	zarray = (double *) G_calloc(alloc_points, sizeof(double)) ;
> +
> +	while( G_getl2(buff,BUFFSIZE-1,ascii) != 0 )
> +	{
> +	    n_cats=0;
> +	    if (buff[0] == '\0') {
> +		G_debug(3, "a2b: skipping blank line");
> +		continue;
> +	    }
> +
> +	    if (  sscanf(buff, "%1c%d%d", &ctype, &n_coors, &n_cats) < 2  || n_coors < 0 || n_cats < 0 ) {
> +		if (ctype == '#') {
> +		    G_debug(2, "a2b: skipping commented line");
> +		    continue;
> +		}
> +		G_warning (_("Error reading ascii file <%s>"), buff) ;
> +		return 0;
> +	    }
> +	    if (ctype == '#') {
> +		G_debug(2, "a2b: Skipping commented line");
> +		continue;
> +	    }
> +
> +	    switch(ctype){
> +		case 'A':
> +			type = GV_BOUNDARY ;
> +			break ;
> +		case 'B':
> +			type = GV_BOUNDARY ;
> +			break ;
> +		case 'C':
> +			type = GV_CENTROID ;
> +			break ;			
> +		case 'L':
> +			type = GV_LINE ;
> +			break ;
> +		case 'P':
> +			type = GV_POINT ;
> +			break ;
> +		case 'F':
> +			type = GV_FACE ;
> +			break ;
> +		case 'K':
> +			type = GV_KERNEL ;
> +			break ;
> +		case 'a':
> +		case 'b':
> +		case 'c':
> +		case 'l':
> +		case 'p':
> +			type = 0; /* dead -> ignore */
> +			break;
> +		default:
> +			G_warning (_("Error reading ascii file: <%s>"), buff) ;
> +			return 0;
> +	    }
> +	    G_debug(5, "feature type = %d", type);
> +
> +	    n_points = 0 ;
> +	    x = xarray ;
> +	    y = yarray ;
> +	    z = zarray ;		
> +
> +	    /* Collect the points */
> +	    for( i=0; i<n_coors; i++)
> +	    {
> +		    if ( G_getl2(buff,BUFFSIZE-1,ascii) == 0 ) {
> +			G_warning (_("End of ascii file reached before end of coordinates")) ;
> +			return 0;
> +		    }
> +		    if (buff[0] == '\0') {
> +			G_debug(3, "a2b: skipping blank line while reading vertices");
> +			i--;
> +			continue;
> +		    }
> +
> +		    *z=0;
> +		    if ( sscanf(buff, "%lf%lf%lf", x, y, z) < 2 ) {			
> +			G_warning (_("Error reading ascii file: <%s>"), buff) ;
> +			return 0;
> +		    }    
> +		    G_debug( 5, "coor in: %s -> x = %f y = %f z = %f", G_chop(buff), *x, *y, *z);
> +		    
> +		    n_points++;
> +		    x++;
> +		    y++;
> +		    z++;			
> +    
> +		    if (n_points >= alloc_points)
> +		    {
> +			    alloc_points = n_points + 1000 ;
> +			    xarray = (double *) G_realloc((void *)xarray, alloc_points * sizeof(double) );
> +			    yarray = (double *) G_realloc((void *)yarray, alloc_points * sizeof(double) );
> +			    zarray = (double *) G_realloc((void *)zarray, alloc_points * sizeof(double) );
> +			    x = xarray + n_points ;
> +			    y = yarray + n_points ;
> +			    z = zarray + n_points ;
> +		    }
> +	    }
> +
> +	    /* Collect the cats */
> +	    for( i=0; i<n_cats; i++)
> +	    {
> +		    if ( G_getl2(buff,BUFFSIZE-1,ascii) == 0 ) {
> +			G_warning (_("End of ascii file reached before end of categories.")) ;
> +			return 0;
> +		    }
> +		    if (buff[0] == '\0') {
> +			G_debug(3, "a2b: skipping blank line while reading category info");
> +			i--;
> +			continue;
> +		    }
> +
> +		    if ( sscanf(buff, "%u%u", &catn, &cat) != 2 ) {
> +			G_warning (_("Error reading categories: <%s>"), buff) ;
> +			return 0;
> +		    }
> +		    Vect_cat_set ( Cats, catn, cat );
> +	    }
> +
> +	    /* Allocation is handled for line_pnts */
> +	    if (0 > Vect_copy_xyz_to_pnts (Points, xarray, yarray, zarray, n_points))
> +		G_fatal_error(_("Out of memory"));
> +
> +	    if ( type > 0 )
> +		Vect_write_line ( Map, type, Points, Cats );
> +    
> +	    Vect_reset_cats ( Cats ); 
> +	}
> +	return 0;	
> +}
> +
> Index: vector/v.edit/args.c
> ===================================================================
> RCS file: /grassrepository/grass6/vector/v.edit/args.c,v
> retrieving revision 1.6
> diff -u -r1.6 args.c
> --- vector/v.edit/args.c	7 Jun 2006 19:16:16 -0000	1.6
> +++ vector/v.edit/args.c	12 Dec 2006 13:29:22 -0000
> @@ -4,48 +4,74 @@
>  {
>      map_opt = G_define_standard_option(G_OPT_V_MAP);
>  
> -    act_opt = G_define_option();
> -    act_opt->key         = "action";
> -    act_opt->type        = TYPE_STRING;
> -    act_opt->required    = YES;
> -    act_opt->multiple    = NO;
> -    act_opt->description = _("The edit action to take.");
> -    act_opt->options     = "create,add,delete,move,merge";
> -
> -    typ_opt = G_define_standard_option(G_OPT_V_TYPE);
> -    typ_opt->required    = NO;
> -    typ_opt->description = _("Select type. Required for add action.");
> -    typ_opt->options     = "point,line,area,centroid,boundary";
> -    typ_opt->answer      = "point";
> -    
> +    tool_opt = G_define_option();
> +    tool_opt->key         = "tool";
> +    tool_opt->type        = TYPE_STRING;
> +    tool_opt->required    = YES;
> +    tool_opt->multiple    = NO;
> +    tool_opt->description = _("The edit tool to take.\n"
> +                             "\t\tcreate - Create new vector file\n"
> +                             "\t\tadd    - Add new vector feature to existing vector file\n"
> +                             "\t\tdelete - Delete feature from vector file\n"
> +                             "\t\tmove   - Move feature in vector file\n"
> +                             "\t\tvertex - Move just only vertex\n"
> +                             "\t\tbreak  - Add new vertex to existing vector line\n"
> +                             "\t\tsplit  - Split line into two separate lines");
> +    tool_opt->options     = "create,add,delete,move,vertex,break,split";
> +
> +    input_opt = G_define_option();
> +    input_opt->key      = "input";
> +    input_opt->type     = TYPE_STRING;
> +    input_opt->required = NO;
> +    input_opt->multiple = NO;
> +    input_opt->description = _("ASCII file to be converted to binary vector file, if not given reads from standard input");
> +
>      cat_opt = G_define_standard_option(G_OPT_V_CATS);
>      cat_opt->required    = NO;
>      
> -    pnt_opt = G_define_option();
> -    pnt_opt->key         = "coords";
> -    pnt_opt->key_desc    = "x,y";
> -    pnt_opt->type        = TYPE_DOUBLE;
> -    pnt_opt->required    = NO;
> -    pnt_opt->multiple    = YES;
> -    pnt_opt->description = _("An x,y list of points. Required for add and move actions.");
> -    
> -    val_opt = G_define_option();
> -    val_opt->key         = "values";
> -    val_opt->type        = TYPE_STRING;
> -    val_opt->required    = NO;
> -    val_opt->multiple    = NO;
> -    val_opt->description = _("A comma-separated list of attr=val pairs.");
> -
> +    coord_opt = G_define_option();
> +    coord_opt->key         = "coords";
> +    coord_opt->key_desc    = "x,y";
> +    coord_opt->type        = TYPE_DOUBLE;
> +    coord_opt->required    = NO;
> +    coord_opt->multiple    = YES;
> +    coord_opt->description = _("An x,y list of points. Required for add and move actions.");
> +    
> +    to_opt = G_define_option();
> +    to_opt->key         = "to";
> +    to_opt->key_desc    = "x,y";
> +    to_opt->type        = TYPE_DOUBLE;
> +    to_opt->required    = NO;
> +    to_opt->multiple    = NO;
> +    to_opt->description = _("An x,y location of selected feature");
> +    
> +    at_opt =  G_define_option();
> +    at_opt->key         = "at";
> +    at_opt->key_desc    = "x,y";
> +    at_opt->type        = TYPE_DOUBLE;
> +    at_opt->required    = NO;
> +    at_opt->multiple    = NO;
> +    at_opt->description = _("An x,y location of breaking feature");
> +    
> +    bbox_opt =  G_define_option();
> +    bbox_opt->key         = "bbox";
> +    bbox_opt->key_desc    = "x1,y1,x2,y2";
> +    bbox_opt->type        = TYPE_DOUBLE;
> +    bbox_opt->required    = NO;
> +    bbox_opt->multiple    = NO;
> +    bbox_opt->description = _("Bounding box of selected feature");
> +
> +    snap_opt = G_define_option();
> +    snap_opt->key         = "snap";
> +    snap_opt->type        = TYPE_DOUBLE;
> +    snap_opt->required    = NO;
> +    snap_opt->multiple    = NO;
> +    snap_opt->description = _("Object points will snap to existing points within snap units.");
> +    snap_opt->answer      = "5.0";
> +    
> + 
>      fld_opt = G_define_standard_option(G_OPT_V_FIELD);
>  
> -    snp_opt = G_define_option();
> -    snp_opt->key         = "snap";
> -    snp_opt->type        = TYPE_DOUBLE;
> -    snp_opt->required    = NO;
> -    snp_opt->multiple    = NO;
> -    snp_opt->description = _("Object points will snap to existing points within snap units.");
> -    snp_opt->answer      = "5.0";
> -    
>      t_flg = G_define_flag();
>      t_flg->key = 't';
>      t_flg->description = _("Do not use topology.");
> @@ -62,59 +88,136 @@
>      c_flg->key = 'c';
>      c_flg->description = _("Do not close boundaries");
>  
> +    n_flg = G_define_flag();
> +    n_flg->key          = 'n';
> +    n_flg->description  = _("Don't expect a header");
> +
>      if(G_parser(argc, argv))
>  	return 0;
>  
>      /* check that the given arguments makes sense together*/
>  /** @todo check for incorrect extra parameters */
>  
> -    if(strcmp(act_opt->answer, "create")==0) { /* create requires nothing extra*/
> +    if ( input_opt->answer != NULL ) {
> +        if ( (ascii = fopen ( input_opt->answer, "r" ) ) == NULL )
> +        {
> +            G_warning(_("Could not open ascii file <%s>"), input_opt->answer);
> +            G_usage();
> +        }
> +    } else {
> +        ascii = stdin;
> +    }
> +
> +    /* check for coordinate param */
> +    if (coord_opt->answers != NULL) {
> +        int i = 0;
> +        for (i = 0; coord_opt->answers[i]; i ++)
> +            ;
> +        if (i%2 != 0) {
> +            G_warning(_("Number of coordinates must be odd number"));
> +            G_usage();
> +	    return 0;
> +        }
> +
> +    }
> +
> +    /* check for bbox param */
> +    if (bbox_opt->answers != NULL) {
> +        int i = 0;
> +        for (i = 0; bbox_opt->answers[i]; i ++)
> +            ;
> +        if (i%2 != 0) {
> +            G_warning(_("Number of coordinates must be odd number"));
> +            G_usage();
> +	    return 0;
> +        }
> +
> +    }
> +
> +    if(strcmp(tool_opt->answer, "create")==0) { /* create requires nothing extra*/
>  	action_mode = MODE_CREATE;
>  	return 1;
>      }
>      
> -    snap = atof(snp_opt->answer);
> -    
> -    if(strcmp(act_opt->answer, "add")==0) { /* add requires a points argument */
> +    if(strcmp(tool_opt->answer, "add")==0) { /* add requires a points argument */
>  	action_mode = MODE_ADD;
> -	if(pnt_opt->answers == NULL) {
> -	    help(_("Required parameter <points> not set"));
> +	return 1;
> +    }
> +    else if(strcmp(tool_opt->answer, "delete")==0) { /* del requires a cats or or bbox or coords*/
> +	action_mode = MODE_DEL;
> +	if((cat_opt->answers == NULL) && 
> +           (coord_opt->answers == NULL) &&
> +           (bbox_opt->answers == NULL)) {
> +	    G_warning(_("At least one from <%s> must be specified"),"cats, coords, bbox");
> +            G_usage();
>  	    return 0;
>  	};
>  	return 1;
>      }
> -    else if(strcmp(act_opt->answer, "delete")==0) { /* del requires a cats */
> -	action_mode = MODE_DEL;
> -	if(cat_opt->answers == NULL) {
> -	    help(_("Required parameter <cats> not set"));
> +    else if(strcmp(tool_opt->answer, "move")==0) { /* move requires coords or cats arguments */
> +	action_mode = MODE_MOVE;
> +	if(to_opt->answers == NULL) { 
> +            G_warning(_("For <%s> operation, option <%s> must be set"),"move","to");
> +            G_usage();
> +	    return 0;
> +        }
> +	if((coord_opt->answers == NULL) && 
> +            (cat_opt->answers == NULL) &&
> +            (bbox_opt->answers == NULL)) {
> +	    G_warning(_("At least one from <%s> must be specified"),"cats, coords, bbox");
> +            G_usage();
>  	    return 0;
>  	};
>  	return 1;
>      }
> -    else if(strcmp(act_opt->answer, "move")==0) { /* move requires points and cats arguments */
> -	action_mode = MODE_ADD;
> -	if((pnt_opt->answers == NULL)||(cat_opt->answers == NULL)) {
> -	    help(_("Both parameters <points> and <cats> are required."));
> +
> +    else if(strcmp(tool_opt->answer, "vertex")==0) { /* move vertex requires a coord and to options */
> +	action_mode = MODE_VERTEX;
> +	if(coord_opt->answers == NULL) {
> +	    G_warning(_("Required parameter <coords> not set"));
> +            G_usage();
> +	    return 0;
> +	};
> +	if(to_opt->answers == NULL) {
> +	    G_warning(_("Required parameter <to> not set"));
> +            G_usage();
>  	    return 0;
>  	};
>  	return 1;
>      }
> -    else if(strcmp(act_opt->answer, "merge")==0) { /* merge requires a cats argument */
> -	action_mode = MODE_ADD;
> -	if(cat_opt->answers == NULL) {
> -	    help(_("Required parameter <cats> not set"));
> +    else if(strcmp(tool_opt->answer, "break")==0) { /* break line requires a coord and at options */
> +	action_mode = MODE_BREAK;
> +	if(coord_opt->answers == NULL) {
> +	    G_warning(_("Required parameter <coords> not set"));
> +            G_usage();
> +	    return 0;
> +	};
> +	if(at_opt->answers == NULL) {
> +	    G_warning(_("Required parameter <at> not set"));
> +            G_usage();
>  	    return 0;
>  	};
>  	return 1;
>      }
> +    else if(strcmp(tool_opt->answer, "split")==0) { /* split line requires a coord and at options */
> +	action_mode = MODE_SPLIT;
> +	if(coord_opt->answers == NULL) {
> +	    G_warning(_("Required parameter <coords> not set"));
> +            G_usage();
> +	    return 0;
> +	};
> +	if(at_opt->answers == NULL) {
> +	    G_warning(_("Required parameter <at> not set"));
> +            G_usage();
> +	    return 0;
> +	};
> +	return 1;
> +    }
> +
>      else {
> -	help(_("This should never happen."));
> +	G_warning(_("Operation <%s> not implemented."),tool_opt->answer);
> +        G_usage();
>  	return 0;
>      }
>  }
>  
> -void help(const char *msg)
> -{
> -    G_message("\nERROR: %s\n\n", msg);
> -    G_usage();
> -}
> Index: vector/v.edit/del.c
> ===================================================================
> RCS file: /grassrepository/grass6/vector/v.edit/del.c,v
> retrieving revision 1.2
> diff -u -r1.2 del.c
> --- vector/v.edit/del.c	6 Oct 2006 06:47:56 -0000	1.2
> +++ vector/v.edit/del.c	12 Dec 2006 13:29:23 -0000
> @@ -2,45 +2,151 @@
>  
>  int do_del(struct Map_info *Map)
>  {
> -    int i;
> +    int res = 0;
> +
> +
> +    /* cats or coord or bbox */
> +    if(cat_opt->answer != NULL) {
> +        
> +        res = delete_categories(Map);
> +    }
> +    else if (coord_opt->answer != NULL) {
> +
> +        res = delete_coordinates(Map);
> +    }
> +    else if (bbox_opt->answer != NULL) {
> +
> +        res = delete_bbox(Map);
> +    }
> +    else {
> +        /* this case should not happen, see args.c for details */
> +        G_warning("cats, coord or bbox must be specified");
> +    }
> +
> +}
> +
> +int delete_bbox(struct Map_info *Map) 
> +{
> +    double x1,y1,x2,y2;
> +    BOUND_BOX bbox;
> +    BOUND_BOX feature_bbox;
> +    int cat, ret, type, i;
> +    struct ilist *List;
> +    SPATIAL_INDEX si;
> +    struct line_pnts *Points;
> +    struct line_cats *Cats;
> +    int removed = 0;
> +    
> +
> +    /* bounding box */
> +    x1 = atof(bbox_opt->answers[0]);
> +    y1 = atof(bbox_opt->answers[1]);
> +    x2 = atof(bbox_opt->answers[2]);
> +    y2 = atof(bbox_opt->answers[3]);
> +    bbox.N = y1 < y2 ? y2 : y1;
> +    bbox.S = y1 < y2 ? y1 : y2;
> +    bbox.W = x1 < x2 ? x1 : x2;
> +    bbox.E = x1 < x2 ? x2 : x1;
> +    bbox.T = 0.0;
> +    bbox.B = 0.0;
> +
> +    Points = Vect_new_line_struct();
> +    Cats = Vect_new_cats_struct();
> +    List = Vect_new_list ();
> +
> +    /* get lines number */
> +    Vect_select_lines_by_box ( Map, &bbox, GV_POINTS | GV_LINES | GV_BOUNDARY | GV_CENTROID, List );
> +    G_debug ( 1, "  %d lines selected by box", List->n_values );
> +
> +    for ( i = 0; i < List->n_values; i++) {
> +
> +        type = Vect_read_line(Map, Points, Cats, List->value[i]);
> +        G_debug(2, "Deleting type [%d] number [%d]", type, List->value[i]);
> +        Vect_delete_line(Map, List->value[i]); 
> +        removed++;
> +        /* attr_del(Map, layer, cat);*/
> +    }
> +    G_message(_("%d features deleted"), removed);
> +    return 1;
> +}
> +
> +int delete_coordinates(struct Map_info *Map) 
> +{
> +    double east, north;
> +    int line;
> +    double maxdist = 0.5;
> +    char buff[16] = "";
> +
> +    int type;
> +    struct line_pnts *Points;
> +    struct line_cats *Cats;
> +    int cat;
> +    int field=atoi(fld_opt->answer);
> +    int removed = 0;
> +
> +    east = atof(coord_opt->answers[0]);
> +    north = atof(coord_opt->answers[1]);
> +
> +    line = Vect_find_line(Map, east, north, 0.0, GV_POINT | GV_CENTROID, maxdist, 0, 0);
> +
> +    if (line == 0) 
> +        line = Vect_find_line(Map, east, north, 0.0, GV_LINE | GV_BOUNDARY | GV_FACE, maxdist, 0, 0);
> +
> +
> +    G_debug (2, "line = %d", line);
> +
> +    if (line == 0) {
> +        G_warning(_("Nothing Found."));
> +        return 0;
> +
> +    }
> +    else {
> +        type = Vect_read_line(Map, Points, Cats, line);
> +	Points = Vect_new_line_struct();
> +	Cats = Vect_new_cats_struct();
> +        if ((cat = Vect_get_line_cat(Map, line, field )) > 0) 
> +            sprintf(buff,_("category [%d]"),cat);
> +            
> +        G_debug(2, "Deleting type [%d] number [%d] %s", type, line, buff);
> +        Vect_delete_line(Map, line); 
> +        removed++;
> +
> +        /* attr_del(Map, layer, cat);*/
> +    }
> +
> +    G_message(_("%d features deleted"), removed);
> +    return 1;
> +}
> +
> +
> +int delete_categories(struct Map_info *Map) 
> +{
> +    
>      struct cat_list * cl;
>      int layer=atoi(fld_opt->answer);
> +    int i, removed=0;
>  
> -    G_debug(1,"layer = %d",layer);
> -/*
> -    if(cat_opt->answer=NULL) {
> -	cats = coords_catlist(Map);
> -    }
> - */
>      cl = Vect_new_cat_list();
>      Vect_str_to_cat_list(cat_opt->answer, cl);
> -    
> +
> +    G_debug(1,"layer = %d",layer);
> +
>      for(i=0;i<cl->n_ranges;i++) {
>  	int cat, type, id, ret;
>  	G_debug(1, "cl->min[%d]=%d, cl->max[%d]=%d, layer=%d",
>  		i, cl->min[i], i, cl->max[i], cl->field);
>  	for(cat=cl->min[i]; cat <= cl->max[i]; cat++) {
> -	    ret = Vect_cidx_find_next(Map, layer, cat, GV_POINTS|GV_LINES, 
> +	    ret = Vect_cidx_find_next(Map, layer, cat, GV_POINTS|GV_LINES | GV_BOUNDARY | GV_CENTROID, 
>  				      0, &type, &id);
>  	    G_debug(1, "ret=%d", ret);
>  	    if(ret<0) continue;
> -	    G_debug(1, "Found something to delete: id=%d, type=%d",id,type);
> -	    if(type==GV_CENTROID) {
> -		int area;
> -		double x,y;
> -		Vect_get_node_coor(Map, id, &x, &y, NULL);
> -		area = Vect_find_area(Map, x, y);
> -		G_debug(1, "Deleteing area %d: id=%d, area=%d",cat,id,area);
> -/* 		Vect_delete_line(Map, id); */
> -/* 		Vect_delete_line(Map, area); */
> -		attr_del(Map, layer, cat);
> -	    }
> -	    else {
> -/* 		Vect_delete_line(Map, id); */
> -		attr_del(Map, layer, cat);
> -	    }
> +            G_debug(2,"Deleting type [%d] number [%d] cat [%d]", type, id, cat);
> +            Vect_delete_line(Map, id); 
> +            /* attr_del(Map, layer, cat);*/
> +            removed ++;
>  	}
>      }
> +    G_message(_("%d features deleted"), removed);
>  
>      return 1;
>  }
> Index: vector/v.edit/global.h
> ===================================================================
> RCS file: /grassrepository/grass6/vector/v.edit/global.h,v
> retrieving revision 1.6
> diff -u -r1.6 global.h
> --- vector/v.edit/global.h	7 Jun 2006 19:16:16 -0000	1.6
> +++ vector/v.edit/global.h	12 Dec 2006 13:29:23 -0000
> @@ -18,15 +18,18 @@
>      MODE_ADD,
>      MODE_DEL,
>      MODE_MOVE,
> -    MODE_MERGE
> +    MODE_VERTEX,
> +    MODE_SPLIT,
> +    MODE_BREAK
>  };
>  
> -void help(const char *msg);
>  int parser(int argc, char*argv[]);
>  
> -int do_add(struct Map_info *Map);
> +int asc_to_bin(FILE *, struct Map_info *);
>  int do_del(struct Map_info *Map);
> -
> +int delete_categories(struct Map_info *Map);
> +int delete_coordinates(struct Map_info *Map);
> +int delete_bbox(struct Map_info *Map);
>  
>  void cat_max_set ( int field, int cat);
>  int cat_max_get ( int field );
> @@ -37,11 +40,12 @@
>  int attr_edit(struct Map_info *Map, int field, int cat, const char *vals);
>  int attr_del(struct Map_info *Map, int field, int cat);
>  
> -global struct Option *map_opt, *act_opt, *typ_opt, *cat_opt, *pnt_opt, *fld_opt, *val_opt, *snp_opt;
> -global struct Flag *n_flg, *t_flg, *d_flg, *b_flg, *c_flg;
> +global struct Option *input_opt, *map_opt, *tool_opt, *coord_opt, *cat_opt, *to_opt, *at_opt, *bbox_opt, *snap_opt, *fld_opt;
> +global struct Flag *n_flg, *t_flg, *d_flg, *b_flg, *c_flg, *n_flg;
>  global struct GModule *module;
>  global struct Map_info Map;
>  global enum mode action_mode;
>  global char *mapset;
> -global double snap;
> +
> +global FILE *ascii;
>  #endif
> Index: vector/v.edit/main.c
> ===================================================================
> RCS file: /grassrepository/grass6/vector/v.edit/main.c,v
> retrieving revision 1.9
> diff -u -r1.9 main.c
> --- vector/v.edit/main.c	6 Oct 2006 06:47:56 -0000	1.9
> +++ vector/v.edit/main.c	12 Dec 2006 13:29:23 -0000
> @@ -21,6 +21,7 @@
>  
>  #define MAIN
>  #include "global.h"
> +
>  /* static int error_routine(const char*msg, int fatal); */
>  
>  int main (int argc, char *argv[])
> @@ -56,7 +57,6 @@
>      }
>      else {
>  /* 	Vect_set_open_level(2); */
> -	G_message(_("Reading vector file ..."));
>  	Vect_open_update (&Map, map_opt->answer, mapset);
>      }
>  /*     Vect_set_category_index_update ( &Map ); */
> @@ -66,7 +66,8 @@
>  
>      switch(action_mode) {
>        case MODE_ADD:
> -	ret = do_add(&Map);
> +	G_message(_("Adding new features to vector file ..."));
> +        ret = asc_to_bin(ascii, &Map) ;
>  	break;
>        case MODE_DEL:
>  	ret = do_del(&Map);




> _______________________________________________
> grass-dev mailing list
> grass-dev at grass.itc.it
> http://grass.itc.it/mailman/listinfo/grass-dev

-- 
Jachym Cepicky
e-mail: jachym.cepicky at centrum.cz
URL: http://les-ejk.cz
GPG: http://www.les-ejk.cz/pgp/jachym_cepicky-gpg.pub
-----------------------------------------   
OFFICE:                                     
Department of Geoinformation Technologies 
Zemedelska 3
613 00, Brno
Czech Republick
e-mail: xcepicky at node.mendelu.cz
URL:    http://mapserver.mendelu.cz
Tel.:   +420 545 134 514
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://lists.osgeo.org/pipermail/grass-dev/attachments/20061215/cc11b82e/attachment.bin


More information about the grass-dev mailing list