17
#include <sys/types.h>
17
18
#include <stdlib.h>
18
#include <grass/Vect.h>
19
#include <grass/vector.h>
20
static int add_line(struct Plus_head *plus, int lineid, int type, struct line_pnts *Points,
21
static int add_line(struct Plus_head *plus, int lineid, int type, const struct line_pnts *Points,
22
const struct bound_box *box, off_t offset)
24
int node, lp, node_new;
27
27
plus->Line[lineid] = dig_alloc_line();
28
28
line = plus->Line[lineid];
31
line->offset = offset;
33
dig_spidx_add_line(plus, lineid, box);
34
if (plus->uplist.do_uplist) {
35
dig_line_add_updated(plus, lineid, offset);
38
if (type & GV_POINT) {
43
line->topo = dig_alloc_topo(type);
45
if (type & GV_CENTROID) {
46
struct P_topo_c *topo = (struct P_topo_c *)line->topo;
52
/* Add nodes for lines */
31
53
G_debug(3, "Register node: type = %d, %f,%f", type, Points->x[0],
34
57
node = dig_find_node(plus, Points->x[0], Points->y[0], Points->z[0]);
35
58
G_debug(3, "node = %d", node);
37
60
node = dig_add_node(plus, Points->x[0], Points->y[0], Points->z[0]);
38
61
G_debug(3, "Add new node: %d", node);
65
G_debug(3, "Old node found: %d", node);
69
if (type == GV_LINE) {
70
struct P_topo_l *topo = (struct P_topo_l *)line->topo;
75
else if (type == GV_BOUNDARY) {
76
struct P_topo_b *topo = (struct P_topo_b *)line->topo;
84
dig_node_add_line(plus, node, lineid, Points, type);
85
if (plus->uplist.do_uplist)
86
dig_node_add_updated(plus, node_new ? -node : node);
89
lp = Points->n_points - 1;
90
G_debug(3, "Register node %f,%f", Points->x[lp], Points->y[lp]);
91
node = dig_find_node(plus, Points->x[lp], Points->y[lp],
93
G_debug(3, "node = %d", node);
95
node = dig_add_node(plus, Points->x[lp], Points->y[lp],
97
G_debug(3, "Add new node: %d", node);
41
101
G_debug(3, "Old node found: %d", node);
44
dig_node_add_line(plus, node, lineid, Points, type);
46
dig_node_add_updated(plus, node);
48
if (type & GV_LINES) {
49
lp = Points->n_points - 1;
50
G_debug(3, "Register node %f,%f", Points->x[lp], Points->y[lp]);
52
dig_find_node(plus, Points->x[lp], Points->y[lp], Points->z[lp]);
53
G_debug(3, "node = %d", node);
56
dig_add_node(plus, Points->x[lp], Points->y[lp],
58
G_debug(3, "Add new node: %d", node);
61
G_debug(3, "Old node found: %d", node);
64
dig_node_add_line(plus, node, -lineid, Points, type);
66
dig_node_add_updated(plus, node);
73
line->offset = offset;
81
dig_line_box(Points, &box);
82
dig_line_set_box(plus, lineid, &box);
83
dig_spidx_add_line(plus, lineid, &box);
85
dig_line_add_updated(plus, lineid);
104
if (type == GV_LINE) {
105
struct P_topo_l *topo = (struct P_topo_l *)line->topo;
109
else if (type == GV_BOUNDARY) {
110
struct P_topo_b *topo = (struct P_topo_b *)line->topo;
115
dig_node_add_line(plus, node, -lineid, Points, type);
116
if (plus->uplist.do_uplist)
117
dig_node_add_updated(plus, node_new ? -node : node);
91
123
* \brief Add new line to Plus_head structure.
93
125
* \param[in,out] plus pointer to Plus_head structure
94
* \param[in] type feature type
95
* \param[in] Points line geometry
96
* \param[in] offset line offset
126
* \param type feature type
127
* \param Points line geometry
128
* \param box bounding box
129
* \param offset line offset
98
131
* \return -1 on error
102
dig_add_line(struct Plus_head *plus, int type, struct line_pnts *Points,
135
dig_add_line(struct Plus_head *plus, int type, const struct line_pnts *Points,
136
const struct bound_box *box, off_t offset)
146
179
* \brief Restore line in Plus_head structure.
148
181
* \param[in,out] plus pointer to Plus_head structure
149
* \param[in] type feature type
150
* \param[in] Points line geometry
151
* \param[in] offset line offset
182
* \param type feature type
183
* \param Points line geometry
184
* \param box bounding box
185
* \param offset line offset
153
187
* \return -1 on error
154
188
* \return line id
157
191
dig_restore_line(struct Plus_head *plus, int lineid,
158
int type, struct line_pnts *Points,
192
int type, const struct line_pnts *Points,
193
const struct bound_box *box, off_t offset)
161
195
if (lineid < 1 || lineid > plus->n_lines) {
165
return add_line(plus, lineid, type, Points, offset);
199
return add_line(plus, lineid, type, Points, box, offset);
176
210
* \param[in,out] plus pointer to Plus_head structure
177
211
* \param[in] line line id
212
* \param[in] x,y,z coordinates
179
214
* \return -1 on error
183
int dig_del_line(struct Plus_head *plus, int line)
218
int dig_del_line(struct Plus_head *plus, int line, double x, double y, double z)
221
plus_t N1 = 0, N2 = 0;
189
/* TODO: free structures */
190
225
G_debug(3, "dig_del_line() line = %d", line);
192
227
Line = plus->Line[line];
193
dig_spidx_del_line(plus, line);
228
dig_spidx_del_line(plus, line, x, y, z);
230
if (plus->uplist.do_uplist) {
231
dig_line_add_updated(plus, line, -Line->offset);
234
if (!(Line->type & GV_LINES)) {
237
plus->Line[line] = NULL;
195
242
/* Delete from nodes (and nodes) */
196
Node = plus->Node[Line->N1];
198
for (i = 0; i < Node->n_lines; i++) {
200
Node->lines[i - 1] = Node->lines[i];
201
Node->angles[i - 1] = Node->angles[i];
204
if (abs(Node->lines[i]) == line)
209
if (Node->n_lines == 0) {
210
G_debug(3, " node %d has 0 lines -> delete", Line->N1);
211
dig_spidx_del_node(plus, Line->N1);
212
plus->Node[Line->N1] = NULL;
216
dig_node_add_updated(plus, Line->N1);
219
if (Line->type & GV_LINES) {
220
Node = plus->Node[Line->N2];
222
for (i = 0; i < Node->n_lines; i++) {
224
Node->lines[i - 1] = Node->lines[i];
225
Node->angles[i - 1] = Node->angles[i];
228
if (abs(Node->lines[i]) == line)
233
if (Node->n_lines == 0) {
234
G_debug(3, " node %d has 0 lines -> delete", Line->N2);
235
dig_spidx_del_node(plus, Line->N2);
236
plus->Node[Line->N2] = NULL;
240
dig_node_add_updated(plus, Line->N2);
243
if (Line->type == GV_LINE) {
244
struct P_topo_l *topo = (struct P_topo_l *)Line->topo;
248
else if (Line->type == GV_BOUNDARY) {
249
struct P_topo_b *topo = (struct P_topo_b *)Line->topo;
254
Node = plus->Node[N1];
257
for (i = 0; i < Node->n_lines; i++) {
259
Node->lines[i - 1] = Node->lines[i];
260
Node->angles[i - 1] = Node->angles[i];
263
if (Node->lines[i] == line)
269
if (plus->uplist.do_uplist) {
270
dig_node_add_updated(plus, Node->n_lines > 0 ? N1 : -N1);
272
if (Node->n_lines == 0) {
273
G_debug(3, " node %d has 0 lines -> delete", N1);
274
dig_spidx_del_node(plus, N1);
275
/* free structures */
277
plus->Node[N1] = NULL;
280
if (Line->type == GV_LINE) {
281
struct P_topo_l *topo = (struct P_topo_l *)Line->topo;
285
else if (Line->type == GV_BOUNDARY) {
286
struct P_topo_b *topo = (struct P_topo_b *)Line->topo;
291
Node = plus->Node[N2];
293
for (i = 0; i < Node->n_lines; i++) {
295
Node->lines[i - 1] = Node->lines[i];
296
Node->angles[i - 1] = Node->angles[i];
299
if (Node->lines[i] == -line)
305
if (plus->uplist.do_uplist) {
306
dig_node_add_updated(plus, Node->n_lines > 0 ? N2 : -N2);
308
if (Node->n_lines == 0) {
309
G_debug(3, " node %d has 0 lines -> delete", N2);
310
dig_spidx_del_node(plus, N2);
311
/* free structures */
313
plus->Node[N2] = NULL;
244
316
/* Delete line */
245
318
plus->Line[line] = NULL;