00001
00018 #include <grass/dbmi.h>
00019 #include <grass/vedit.h>
00020
00035 int Vedit_bulk_labeling(struct Map_info *Map, struct ilist *List,
00036 double x1, double y1, double x2, double y2,
00037 double start, double step)
00038 {
00039 int i, cv_i, p_i;
00040 int line, type, temp_line;
00041 int nlines_modified;
00042 double value, dist;
00043
00044 struct line_cats *Cats;
00045 struct line_pnts *Points, *Points_se;
00046
00047
00048 struct line_pnts **Points_a, **Points_b;
00049 int nlines_a, nlines_b;
00050
00051 dbCatValArray cv;
00052
00053 nlines_modified = 0;
00054
00055 value = start;
00056
00057 Points = Vect_new_line_struct();
00058 Points_se = Vect_new_line_struct();
00059 Cats = Vect_new_cats_struct();
00060
00061
00062 db_CatValArray_alloc(&cv, List->n_values);
00063 cv.ctype = DB_C_TYPE_DOUBLE;
00064 cv.n_values = 0;
00065
00066 Vect_append_point(Points_se, x1, y1, -PORT_DOUBLE_MAX);
00067 Vect_append_point(Points_se, x2, y2, PORT_DOUBLE_MAX);
00068
00069
00070 temp_line = Vect_write_line(Map, GV_LINE, Points_se, Cats);
00071 if (temp_line < 0) {
00072 return -1;
00073 }
00074
00075
00076 cv_i = 0;
00077 for (i = 0; i < List->n_values; i++) {
00078 line = List->value[i];
00079
00080 if (!Vect_line_alive(Map, line))
00081 continue;
00082
00083 type = Vect_read_line(Map, Points, NULL, line);
00084
00085 if (!(type & GV_LINE))
00086 continue;
00087
00088 if (Vect_line_check_intersection(Points_se, Points, WITH_Z)) {
00089 Vect_line_intersection(Points_se, Points,
00090 &Points_a, &Points_b, &nlines_a, &nlines_b,
00091 WITHOUT_Z);
00092
00093 if (nlines_a < 2 || nlines_b < 1)
00094 continue;
00095
00096
00097 for (p_i = 0; p_i < Points_a[0]->n_points; p_i++) {
00098 Points_a[0]->z[p_i] = 0;
00099 }
00100 dist = Vect_line_length(Points_a[0]);
00101
00102 cv.value[cv_i].cat = line;
00103 cv.value[cv_i++].val.d = dist;
00104 cv.n_values++;
00105 }
00106 }
00107
00108
00109 db_CatValArray_sort_by_value(&cv);
00110
00111
00112 for (cv_i = 0; cv_i < cv.n_values; cv_i++) {
00113 line = cv.value[cv_i].cat;
00114 Vect_read_line(Map, Points, Cats, line);
00115
00116 for (p_i = 0; p_i < Points->n_points; p_i++) {
00117 Points->z[p_i] = value;
00118 }
00119
00120 if (Vect_rewrite_line(Map, line, type, Points, Cats) < 0) {
00121 return -1;
00122 }
00123 nlines_modified++;
00124
00125 value += step;
00126 }
00127
00128 if (Vect_delete_line(Map, temp_line) < 0) {
00129 return -1;
00130 }
00131
00132 db_CatValArray_free(&cv);
00133 Vect_destroy_line_struct(Points);
00134 Vect_destroy_line_struct(Points_se);
00135 Vect_destroy_cats_struct(Cats);
00136
00137 return nlines_modified;
00138 }