1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
|
/*
****************************************************************************
*
* MODULE: Vector library
*
* AUTHOR(S): Original author CERL, probably Dave Gerdes or Mike Higgins.
* Update to GRASS 5.7 Radim Blazek and David D. Gray.
*
* PURPOSE: Higher level functions for reading/writing/manipulating vectors.
*
* COPYRIGHT: (C) 2001 by the GRASS Development Team
*
* This program is free software under the GNU General Public
* License (>=v2). Read the file COPYING that comes with GRASS
* for details.
*
*****************************************************************************/
#include "gis.h"
#include "glocale.h"
#include "Vect.h"
static long write_dummy () {
G_warning ( _("Vect_write_line() for this format/level not supported") );
return -1;
}
static int rewrite_dummy () {
G_warning ( _("Vect_rewrite_line() for this format/level not supported") );
return -1;
}
static int delete_dummy () {
G_warning ( _("Vect_delete_line() for this format/level not supported") );
return -1;
}
static int format () { G_fatal_error ( _("Requested format is not compiled in this version") ); return 0; }
static long (*Write_line_array[][3]) () =
{
{ write_dummy, V1_write_line_nat, V2_write_line_nat }
#ifdef HAVE_OGR
,{ write_dummy, write_dummy, write_dummy }
#else
,{ write_dummy, format, format }
#endif
};
static int (*Vect_rewrite_line_array[][3]) () =
{
{ rewrite_dummy, rewrite_dummy, V2_rewrite_line_nat }
#ifdef HAVE_OGR
,{ rewrite_dummy, rewrite_dummy, rewrite_dummy }
#else
,{ rewrite_dummy, format, format }
#endif
};
static int (*Vect_delete_line_array[][3]) () =
{
{ delete_dummy, delete_dummy, V2_delete_line_nat }
#ifdef HAVE_OGR
,{ delete_dummy, delete_dummy, delete_dummy }
#else
,{ delete_dummy, format, format }
#endif
};
/*!
\fn long Vect_write_line (
struct Map_info *Map,
int type,
struct line_pnts *points,
struct line_cats *cats)
\brief writes new line to the end of file (table)
the function calls fatal error on error
\return offset into file where the line starts
\param Map_info structure, vector type, line_pnts structure, line_cats structure
*/
long
Vect_write_line (
struct Map_info *Map,
int type,
struct line_pnts *points,
struct line_cats *cats)
{
long offset;
G_debug (3, "Vect_write_line(): name = %s, format = %d, level = %d",
Map->name, Map->format, Map->level);
if (!VECT_OPEN (Map))
G_fatal_error ( _("Cannot write line, the map is not opened") );
dig_line_reset_updated ( &(Map->plus) );
dig_node_reset_updated ( &(Map->plus) );
if ( !(Map->plus.update_cidx) ) {
Map->plus.cidx_up_to_date = 0;
}
offset = (*Write_line_array[Map->format][Map->level]) (Map, type, points, cats);
if ( offset == -1 )
G_fatal_error ( _("Cannot write line") );
return offset;
}
/*!
\fn int Vect_rewrite_line (
struct Map_info *Map,
int line,
int type,
struct line_pnts *points,
struct line_cats *cats)
\brief rewrites line info at the given offset. The number of points
or cats or type may change. If necessary, the old line is deleted and
new is written.
\return number of new line, -1 on error
\param Map_info structure, line number, vector type, line_pnts structure, line_cats structure
*/
int
Vect_rewrite_line (
struct Map_info *Map,
int line,
int type,
struct line_pnts *points,
struct line_cats *cats)
{
long ret;
G_debug (3, "Vect_rewrite_line(): name = %s", Map->name);
if (!VECT_OPEN (Map))
G_fatal_error ( _("Cannot rewrite line, the map is not opened") );
dig_line_reset_updated ( &(Map->plus) );
dig_node_reset_updated ( &(Map->plus) );
if ( !(Map->plus.update_cidx) ) {
Map->plus.cidx_up_to_date = 0;
}
ret = (*Vect_rewrite_line_array[Map->format][Map->level]) (Map, line, type, points, cats);
if ( ret == -1 )
G_fatal_error ( _("Cannot rewrite line") );
return ret;
}
/*
* Deletes line at the given offset. Map must be opened on level 2.
*
* Returns: 0 ok
* -1 on error
*/
/*
int
V1_delete_line (
struct Map_info *Map,
long offset)
{
#ifdef GDEBUG
G_debug (3, "V1_delete_line(): name = %s", Map->name);
#endif
return (*V1_delete_line_array[Map->format][Map->level]) (Map, offset);
}
*/
/*!
\fn int Vect_delete_line (
struct Map_info *Map,
int line)
\brief deletes line of given number. Map must be opened on level 2.
\return 0 on success, -1 on error
\param Map_info structure, line number
*/
int
Vect_delete_line (
struct Map_info *Map,
int line)
{
int ret;
G_debug (3, "Vect_delete_line(): name = %s", Map->name);
if ( Map->level < 2 ) {
G_fatal_error ( _("Cannot delete the line, map '%s' is not opened on level 2"), Map->name );
}
if ( Map->mode != GV_MODE_RW && Map->mode != GV_MODE_WRITE ) {
G_fatal_error ( _("Cannot delete the line, map '%s' is not in opened in 'write' mode"), Map->name );
}
dig_line_reset_updated ( &(Map->plus) );
dig_node_reset_updated ( &(Map->plus) );
if ( !(Map->plus.update_cidx) ) {
Map->plus.cidx_up_to_date = 0;
}
ret = (*Vect_delete_line_array[Map->format][Map->level]) (Map, line);
if ( ret == -1 )
G_fatal_error ( _("Cannot delete line") );
return ret;
}
|