00001
00020 #include <grass/gis.h>
00021 #include <grass/glocale.h>
00022 #include <grass/Vect.h>
00023
00024 static long write_dummy()
00025 {
00026 G_warning("Vect_write_line() %s",
00027 _("for this format/level not supported"));
00028 return -1;
00029 }
00030 static int rewrite_dummy()
00031 {
00032 G_warning("Vect_rewrite_line() %s",
00033 _("for this format/level not supported"));
00034 return -1;
00035 }
00036 static int delete_dummy()
00037 {
00038 G_warning("Vect_delete_line() %s",
00039 _("for this format/level not supported"));
00040 return -1;
00041 }
00042
00043 static int restore_dummy()
00044 {
00045 G_warning("Vect_restore_line() %s",
00046 _("for this format/level not supported"));
00047 return -1;
00048 }
00049
00050 #ifndef HAVE_OGR
00051 static int format()
00052 {
00053 G_fatal_error(_("Requested format is not compiled in this version"));
00054 return 0;
00055 }
00056
00057 static long format_l()
00058 {
00059 G_fatal_error(_("Requested format is not compiled in this version"));
00060 return 0;
00061 }
00062
00063 #endif
00064
00065 static long (*Write_line_array[][3]) () = {
00066 {
00067 write_dummy, V1_write_line_nat, V2_write_line_nat}
00068 #ifdef HAVE_OGR
00069 , {
00070 write_dummy, write_dummy, write_dummy}
00071 #else
00072 , {
00073 write_dummy, format_l, format_l}
00074 #endif
00075 };
00076
00077 static int (*Vect_rewrite_line_array[][3]) () = {
00078 {
00079 rewrite_dummy, rewrite_dummy, V2_rewrite_line_nat}
00080 #ifdef HAVE_OGR
00081 , {
00082 rewrite_dummy, rewrite_dummy, rewrite_dummy}
00083 #else
00084 , {
00085 rewrite_dummy, format, format}
00086 #endif
00087 };
00088
00089 static int (*Vect_delete_line_array[][3]) () = {
00090 {
00091 delete_dummy, delete_dummy, V2_delete_line_nat}
00092 #ifdef HAVE_OGR
00093 , {
00094 delete_dummy, delete_dummy, delete_dummy}
00095 #else
00096 , {
00097 delete_dummy, format, format}
00098 #endif
00099 };
00100
00101 static int (*Vect_restore_line_array[][3]) () = {
00102 {
00103 restore_dummy, restore_dummy, V2_restore_line_nat}
00104 #ifdef HAVE_OGR
00105 , {
00106 restore_dummy, restore_dummy, restore_dummy}
00107 #else
00108 , {
00109 restore_dummy, format, format}
00110 #endif
00111 };
00112
00125 long
00126 Vect_write_line(struct Map_info *Map,
00127 int type, struct line_pnts *points, struct line_cats *cats)
00128 {
00129 long offset;
00130
00131 G_debug(3, "Vect_write_line(): name = %s, format = %d, level = %d",
00132 Map->name, Map->format, Map->level);
00133
00134 if (!VECT_OPEN(Map))
00135 G_fatal_error(_("Unable to write feature, vector map is not opened"));
00136
00137 dig_line_reset_updated(&(Map->plus));
00138 dig_node_reset_updated(&(Map->plus));
00139 if (!(Map->plus.update_cidx)) {
00140 Map->plus.cidx_up_to_date = 0;
00141 }
00142
00143 offset =
00144 (*Write_line_array[Map->format][Map->level]) (Map, type, points,
00145 cats);
00146
00147 if (offset == -1)
00148 G_fatal_error(_("Unable to write feature (negative offset)"));
00149
00150 return offset;
00151 }
00152
00153
00171 int
00172 Vect_rewrite_line(struct Map_info *Map,
00173 int line,
00174 int type, struct line_pnts *points, struct line_cats *cats)
00175 {
00176 long ret;
00177
00178 G_debug(3, "Vect_rewrite_line(): name = %s, line = %d", Map->name, line);
00179
00180 if (!VECT_OPEN(Map))
00181 G_fatal_error(_("Unable to rewrite feature, vector map is not opened"));
00182
00183 dig_line_reset_updated(&(Map->plus));
00184 dig_node_reset_updated(&(Map->plus));
00185 if (!(Map->plus.update_cidx)) {
00186 Map->plus.cidx_up_to_date = 0;
00187 }
00188
00189 ret =
00190 (*Vect_rewrite_line_array[Map->format][Map->level]) (Map, line, type,
00191 points, cats);
00192
00193 if (ret == -1)
00194 G_fatal_error(_("Unable to rewrite feature %d"), line);
00195
00196 return ret;
00197 }
00198
00212 int Vect_delete_line(struct Map_info *Map, int line)
00213 {
00214 int ret;
00215
00216 G_debug(3, "Vect_delete_line(): name = %s, line = %d", Map->name, line);
00217
00218 if (Map->level < 2) {
00219 G_fatal_error(_("Unable to delete feature %d, "
00220 "vector map <%s> is not opened on topology level"),
00221 line, Map->name);
00222 }
00223
00224 if (Map->mode != GV_MODE_RW && Map->mode != GV_MODE_WRITE) {
00225 G_fatal_error(_("Unable to delete feature %d, "
00226 "vector map <%s> is not opened in 'write' mode"),
00227 line, Map->name);
00228 }
00229
00230 dig_line_reset_updated(&(Map->plus));
00231 dig_node_reset_updated(&(Map->plus));
00232 if (!(Map->plus.update_cidx)) {
00233 Map->plus.cidx_up_to_date = 0;
00234 }
00235
00236 ret = (*Vect_delete_line_array[Map->format][Map->level]) (Map, line);
00237
00238 if (ret == -1)
00239 G_fatal_error(_("Unable to feature %d from vector map <%s>"),
00240 line, Map->name);
00241
00242 return ret;
00243 }
00244
00258 int Vect_restore_line(struct Map_info *Map, int line, long offset)
00259 {
00260 int ret;
00261
00262 G_debug(3, "Vect_restore_line(): name = %s, line = %d", Map->name, line);
00263
00264 if (Map->level < 2) {
00265 G_fatal_error(_("Unable to restore feature %d, "
00266 "vector map <%s> is not opened on topology level"),
00267 line, Map->name);
00268 }
00269
00270 if (Map->mode != GV_MODE_RW && Map->mode != GV_MODE_WRITE) {
00271 G_fatal_error(_("Unable to restore feature %d, "
00272 "vector map <%s> is not opened in 'write' mode"),
00273 line, Map->name);
00274 }
00275
00276 dig_line_reset_updated(&(Map->plus));
00277 dig_node_reset_updated(&(Map->plus));
00278 if (!(Map->plus.update_cidx)) {
00279 Map->plus.cidx_up_to_date = 0;
00280 }
00281
00282 ret = (*Vect_restore_line_array[Map->format][Map->level]) (Map, line, offset);
00283
00284 if (ret == -1)
00285 G_fatal_error(_("Unable to restore feature %d from vector map <%s>"),
00286 line, Map->name);
00287
00288 return ret;
00289 }