[GRASS-dev] v.edit updates

Michael Barton michael.barton at asu.edu
Wed Dec 13 12:15:19 EST 2006


Jachym,

Because we need to have a digitizing tool that works without x11, I'm in
favor of moving ahead with v.edit since it is by far the most advanced
attempt to get this rolling so far.

I haven't had time to review and test it however.

Michael 


On 12/13/06 3:17 AM, "Jachym Cepicky" <jachym.cepicky at centrum.cz> wrote:

> Hallo,
> since nobody answared, I suppose there nobody had enough time to check
> the patches. 
> 
> Before I move with further development, I would like to hear from the
> GRASS-core developers, that this changes are all right and worth to be
> committed to cvs.
> I did not commit this changes yet, because of they are changing behavior
> and features of v.edit significantly.
> 
> Removed options:
>     type - there is no need to define type of the vector input feature,
>             this can be done using other methods (grass ascii format)
>     values - all database updates should be done via db.* commands
> 
> Changes options:
>     coords - coords were used for data inputs. But it could come to
>             maximum length of a line limit.
>             coords option is used for feature identification, not for
>             data input
>     action->tool - IMHO "tool" does fit idea of the option better, than
>             action
> 
>     tools:  merge - removed
>             new tools introduced
> 
> Added options:
>     to - moving to coordinates
>     at - breaking/spliting at this coordinates
>     bbox - for bounding box feature selection
>     about - (not added yet) for moving features +- map units
>     
> How to test this:
> This commands should give you impression about how v.edit currently
> works:
> 
> # copy soils map
> g.copy vect=soils,tmp --o
> d.mon x0
> d.vect tmp
> 
> # add new line the soils map
> echo "L 2 1
> 593229.5625       4917307.3125
> 606824.0625            4926102
> 1 60" | v.edit map=tmp tool=add
> 
> v.build tmp
> echo "insert into tmp (cat, label) values (60,'road');"|db.execute
> d.redraw
> 
> # remove feature defined by coordinates
> v.edit map=tmp tool=delete coords=593229.5625,4917307.3125
> d.redraw # line should be removed
> 
> # remove feature defined by category
> v.edit map=tmp tool=delete cat=13
> d.redraw # big soil area on south should be removed
> 
> # remove featuers defined by bounding box
> d.graph -m color=0:255:0 << EOF
> width 4
> polyline
> 602203.125 4918112.25
> 602203.125 4924402.6875
> 604319.8125 4924402.6875
> 604319.8125 4918112.25
> 602203.125 4918112.25
> EOF
> 
> v.edit map=tmp tool=delete bbox=602203.125,4918112.25,604319.8125,4924402.6875
> d.redraw
> 
> I prepared new patch (attached). If there will be no provisos, I would
> like to add this to cvs soon and continue with the development.
> 
> Thank you
> 
> Jachym
> 
> 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

__________________________________________
Michael Barton, Professor of Anthropology
School of Human Evolution & Social Change
Center for Social Dynamics and Complexity
Arizona State University

phone: 480-965-6213
fax: 480-965-7671
www: http://www.public.asu.edu/~cmbarton 




More information about the grass-dev mailing list