00001
00017 #include <stdlib.h>
00018 #include <grass/Vect.h>
00019
00020 static int add_line(struct Plus_head *plus, int lineid, int type, struct line_pnts *Points,
00021 long offset)
00022 {
00023 int node, lp;
00024 P_LINE *line;
00025 BOUND_BOX box;
00026
00027 plus->Line[lineid] = dig_alloc_line();
00028 line = plus->Line[lineid];
00029
00030
00031 G_debug(3, "Register node: type = %d, %f,%f", type, Points->x[0],
00032 Points->y[0]);
00033
00034 node = dig_find_node(plus, Points->x[0], Points->y[0], Points->z[0]);
00035 G_debug(3, "node = %d", node);
00036 if (node == 0) {
00037 node = dig_add_node(plus, Points->x[0], Points->y[0], Points->z[0]);
00038 G_debug(3, "Add new node: %d", node);
00039 }
00040 else {
00041 G_debug(3, "Old node found: %d", node);
00042 }
00043 line->N1 = node;
00044 dig_node_add_line(plus, node, lineid, Points, type);
00045 if (plus->do_uplist)
00046 dig_node_add_updated(plus, node);
00047
00048 if (type & GV_LINES) {
00049 lp = Points->n_points - 1;
00050 G_debug(3, "Register node %f,%f", Points->x[lp], Points->y[lp]);
00051 node =
00052 dig_find_node(plus, Points->x[lp], Points->y[lp], Points->z[lp]);
00053 G_debug(3, "node = %d", node);
00054 if (node == 0) {
00055 node =
00056 dig_add_node(plus, Points->x[lp], Points->y[lp],
00057 Points->z[lp]);
00058 G_debug(3, "Add new node: %d", node);
00059 }
00060 else {
00061 G_debug(3, "Old node found: %d", node);
00062 }
00063 line->N2 = node;
00064 dig_node_add_line(plus, node, -lineid, Points, type);
00065 if (plus->do_uplist)
00066 dig_node_add_updated(plus, node);
00067 }
00068 else {
00069 line->N2 = 0;
00070 }
00071
00072 line->type = type;
00073 line->offset = offset;
00074 line->left = 0;
00075 line->right = 0;
00076 line->N = 0;
00077 line->S = 0;
00078 line->E = 0;
00079 line->W = 0;
00080
00081 dig_line_box(Points, &box);
00082 dig_line_set_box(plus, lineid, &box);
00083 dig_spidx_add_line(plus, lineid, &box);
00084 if (plus->do_uplist)
00085 dig_line_add_updated(plus, lineid);
00086
00087 return (lineid);
00088 }
00089
00101 int
00102 dig_add_line(struct Plus_head *plus, int type, struct line_pnts *Points,
00103 long offset)
00104 {
00105 int ret;
00106
00107
00108
00109 if (plus->n_lines >= plus->alloc_lines) {
00110 if (dig_alloc_lines(plus, 1000) == -1)
00111 return -1;
00112 }
00113
00114 ret = add_line(plus, plus->n_lines + 1, type, Points, offset);
00115
00116 if (ret == -1)
00117 return ret;
00118
00119 plus->n_lines++;
00120
00121 switch (type) {
00122 case GV_POINT:
00123 plus->n_plines++;
00124 break;
00125 case GV_LINE:
00126 plus->n_llines++;
00127 break;
00128 case GV_BOUNDARY:
00129 plus->n_blines++;
00130 break;
00131 case GV_CENTROID:
00132 plus->n_clines++;
00133 break;
00134 case GV_FACE:
00135 plus->n_flines++;
00136 break;
00137 case GV_KERNEL:
00138 plus->n_klines++;
00139 break;
00140 }
00141
00142 return ret;
00143 }
00144
00156 int
00157 dig_restore_line(struct Plus_head *plus, int lineid,
00158 int type, struct line_pnts *Points,
00159 long offset)
00160 {
00161 if (lineid < 1 || lineid > plus->n_lines) {
00162 return -1;
00163 }
00164
00165 return add_line(plus, lineid, type, Points, offset);
00166 }
00167
00183 int dig_del_line(struct Plus_head *plus, int line)
00184 {
00185 int i, mv;
00186 P_LINE *Line;
00187 P_NODE *Node;
00188
00189
00190 G_debug(3, "dig_del_line() line = %d", line);
00191
00192 Line = plus->Line[line];
00193 dig_spidx_del_line(plus, line);
00194
00195
00196 Node = plus->Node[Line->N1];
00197 mv = 0;
00198 for (i = 0; i < Node->n_lines; i++) {
00199 if (mv) {
00200 Node->lines[i - 1] = Node->lines[i];
00201 Node->angles[i - 1] = Node->angles[i];
00202 }
00203 else {
00204 if (abs(Node->lines[i]) == line)
00205 mv = 1;
00206 }
00207 }
00208 Node->n_lines--;
00209 if (Node->n_lines == 0) {
00210 G_debug(3, " node %d has 0 lines -> delete", Line->N1);
00211 dig_spidx_del_node(plus, Line->N1);
00212 plus->Node[Line->N1] = NULL;
00213 }
00214 else {
00215 if (plus->do_uplist)
00216 dig_node_add_updated(plus, Line->N1);
00217 }
00218
00219 if (Line->type & GV_LINES) {
00220 Node = plus->Node[Line->N2];
00221 mv = 0;
00222 for (i = 0; i < Node->n_lines; i++) {
00223 if (mv) {
00224 Node->lines[i - 1] = Node->lines[i];
00225 Node->angles[i - 1] = Node->angles[i];
00226 }
00227 else {
00228 if (abs(Node->lines[i]) == line)
00229 mv = 1;
00230 }
00231 }
00232 Node->n_lines--;
00233 if (Node->n_lines == 0) {
00234 G_debug(3, " node %d has 0 lines -> delete", Line->N2);
00235 dig_spidx_del_node(plus, Line->N2);
00236 plus->Node[Line->N2] = NULL;
00237 }
00238 else {
00239 if (plus->do_uplist)
00240 dig_node_add_updated(plus, Line->N2);
00241 }
00242 }
00243
00244
00245 plus->Line[line] = NULL;
00246
00247 return 0;
00248 }
00249
00261 plus_t dig_line_get_area(struct Plus_head * plus, plus_t line, int side)
00262 {
00263 P_LINE *Line;
00264
00265 Line = plus->Line[line];
00266 if (side == GV_LEFT) {
00267 G_debug(3,
00268 "dig_line_get_area(): line = %d, side = %d (left), area = %d",
00269 line, side, Line->left);
00270 return (Line->left);
00271 }
00272 if (side == GV_RIGHT) {
00273 G_debug(3,
00274 "dig_line_get_area(): line = %d, side = %d (right), area = %d",
00275 line, side, Line->right);
00276
00277 return (Line->right);
00278 }
00279
00280 return (-1);
00281 }
00282
00293 int
00294 dig_line_set_area(struct Plus_head *plus, plus_t line, int side, plus_t area)
00295 {
00296 P_LINE *Line;
00297
00298 Line = plus->Line[line];
00299 if (side == GV_LEFT) {
00300 Line->left = area;
00301 }
00302 else if (side == GV_RIGHT) {
00303 Line->right = area;
00304 }
00305
00306 return (1);
00307 }
00308
00318 int dig_line_set_box(struct Plus_head *plus, plus_t line, BOUND_BOX * Box)
00319 {
00320 P_LINE *Line;
00321
00322 Line = plus->Line[line];
00323
00324 Line->N = Box->N;
00325 Line->S = Box->S;
00326 Line->E = Box->E;
00327 Line->W = Box->W;
00328 Line->T = Box->T;
00329 Line->B = Box->B;
00330
00331 return (1);
00332 }
00333
00343 int dig_line_get_box(struct Plus_head *plus, plus_t line, BOUND_BOX * Box)
00344 {
00345 P_LINE *Line;
00346
00347 Line = plus->Line[line];
00348
00349 Box->N = Line->N;
00350 Box->S = Line->S;
00351 Box->E = Line->E;
00352 Box->W = Line->W;
00353 Box->T = Line->T;
00354 Box->B = Line->B;
00355
00356 return (1);
00357 }