22 #include <grass/glocale.h>
23 #include <grass/gis.h>
24 #include <grass/Vect.h>
39 int j, area, isle, n_lines, line,
type, direction;
42 struct Plus_head *plus;
44 static struct line_pnts *Points, *APoints;
50 G_debug(3,
"Vect_build_line_area() line = %d, side = %d", iline, side);
60 G_debug(3,
" area/isle = %d -> skip", area);
65 G_debug(3,
" n_lines = %d", n_lines);
72 for (j = 0; j < n_lines; j++) {
74 BLine = plus->Line[line];
75 offset = BLine->offset;
76 G_debug(3,
" line[%d] = %d, offset = %ld", j, line, offset);
79 direction = GV_FORWARD;
81 direction = GV_BACKWARD;
86 G_debug(3,
" area/isle size = %f", area_size);
93 G_fatal_error(_(
"Unable to add area (map closed, topo saved)"));
95 G_debug(3,
" -> area %d", area);
98 else if (area_size < 0) {
102 G_fatal_error(_(
"Unable to add isle (map closed, topo saved)"));
104 G_debug(3,
" -> isle %d", isle);
112 G_warning(_(
"Area of size = 0.0 ignored"));
128 int j, line, node, sel_area,
first, area, poly;
129 static int first_call = 1;
130 struct Plus_head *plus;
135 double size, cur_size;
137 static struct ilist *List;
138 static struct line_pnts *APoints;
144 G_debug(3,
"Vect_isle_find_area () island = %d", isle);
147 if (plus->Isle[isle] ==
NULL) {
148 G_warning(_(
"Request to find area outside nonexistent isle"));
158 Isle = plus->Isle[isle];
159 line = abs(Isle->lines[0]);
160 Line = plus->Line[line];
162 Node = plus->Node[node];
169 box.T = PORT_DOUBLE_MAX;
170 box.B = -PORT_DOUBLE_MAX;
172 G_debug(3,
"%d areas overlap island boundary point", List->n_values);
178 for (j = 0; j < List->n_values; j++) {
179 area = List->value[j];
182 Area = plus->Area[area];
185 if (abs(Isle->lines[0]) == abs(Area->lines[0])) {
186 G_debug(3,
" area inside isolated isle");
197 if (box.E > abox.E || box.W < abox.W || box.N > abox.N ||
199 G_debug(3,
" isle not completely inside area box");
204 G_debug(3,
" poly = %d", poly);
220 G_debug(3,
" first area size = %f (n points = %d)",
221 cur_size, APoints->n_points);
229 G_debug(3,
" area size = %f (n points = %d)", cur_size,
232 if (size < cur_size) {
237 G_debug(3,
"sel_area = %d cur_size = %f", sel_area, cur_size);
241 G_debug(3,
"Island %d in area %d", isle, sel_area);
244 G_debug(3,
"Island %d is not in area", isle);
262 struct Plus_head *plus;
266 G_debug(3,
"Vect_attach_isle (): isle = %d", isle);
271 G_debug(3,
" isle = %d -> area outside = %d", isle, sel_area);
273 Isle = plus->Isle[isle];
274 if (Isle->area > 0) {
276 "Attempt to attach isle %d to more areas (=>topology is not clean)",
280 Isle->area = sel_area;
298 static int first = 1;
299 static struct ilist *List;
300 struct Plus_head *plus;
302 G_debug(3,
"Vect_attach_isles ()");
312 G_debug(3,
" number of isles to attach = %d", List->n_values);
314 for (i = 0; i < List->n_values; i++) {
315 isle = List->value[i];
331 int i, sel_area, centr;
332 static int first = 1;
333 static struct ilist *List;
336 struct Plus_head *plus;
338 G_debug(3,
"Vect_attach_centroids ()");
374 G_debug(3,
" number of centroids to reattach = %d", List->n_values);
375 for (i = 0; i < List->n_values; i++) {
378 centr = List->value[i];
379 Line = plus->Line[centr];
389 orig_area = Line->left;
392 G_debug(3,
" centroid %d is in area %d", centr, sel_area);
394 Area = plus->Area[sel_area];
395 if (Area->centroid == 0) {
396 G_debug(3,
" first centroid -> attach to area");
397 Area->centroid = centr;
398 Line->left = sel_area;
400 if (sel_area != orig_area && plus->do_uplist)
403 else if (Area->centroid != centr) {
406 G_debug(3,
" duplicate centroid -> do not attach to area");
407 Line->left = -sel_area;
409 if (-sel_area != orig_area && plus->do_uplist)
414 if (sel_area != orig_area && plus->do_uplist)
432 struct Plus_head *plus;
433 int i,
s,
type, lineid;
435 int side, line, area;
436 struct line_pnts *Points, *APoints;
437 struct line_cats *Cats;
444 G_debug(3,
"Vect_build_nat() build = %d", build);
448 if (build == plus->built)
452 if (build < plus->built) {
455 if (plus->built >= GV_BUILD_CENTROIDS && build < GV_BUILD_CENTROIDS) {
459 for (line = 1; line <= nlines; line++) {
460 Line = plus->Line[line];
461 if (Line && Line->type == GV_CENTROID)
471 if (plus->built >= GV_BUILD_AREAS && build < GV_BUILD_AREAS) {
475 for (line = 1; line <= nlines; line++) {
476 Line = plus->Line[line];
477 if (Line && Line->type == GV_BOUNDARY) {
487 if (plus->built >= GV_BUILD_BASE && build < GV_BUILD_BASE) {
503 if (plus->built < GV_BUILD_BASE) {
516 G_message(_(
"Registering primitives..."));
525 G_warning(_(
"Unable to read vector map"));
528 else if (type == -2) {
532 npoints += Points->n_points;
534 offset = Map->head.last_offset;
536 G_debug(3,
"Register line: offset = %ld", offset);
545 if (build == GV_BUILD_ALL) {
548 for (c = 0; c < Cats->n_cats; c++) {
552 if (Cats->n_cats == 0)
557 if (format == G_INFO_FORMAT_PLAIN)
558 fprintf(stderr,
"%d..", i);
560 fprintf(stderr,
"%9d\b\b\b\b\b\b\b\b\b", i);
567 fprintf(stderr,
"\r");
569 G_message(_(
"%d primitives registered"), plus->n_lines);
570 G_message(_(
"%d vertices registered"), npoints);
572 plus->built = GV_BUILD_BASE;
575 if (build < GV_BUILD_AREAS)
578 if (plus->built < GV_BUILD_AREAS) {
582 for (i = 1; i <= plus->n_lines; i++) {
586 if (plus->Line[i] ==
NULL) {
589 Line = plus->Line[i];
590 if (Line->type != GV_BOUNDARY) {
594 for (s = 0; s < 2; s++) {
600 G_debug(3,
"Build area for line = %d, side = %d", i, side);
604 G_message(_(
"%d areas built"), plus->n_areas);
605 G_message(_(
"%d isles built"), plus->n_isles);
606 plus->built = GV_BUILD_AREAS;
609 if (build < GV_BUILD_ATTACH_ISLES)
613 if (plus->built < GV_BUILD_ATTACH_ISLES) {
615 for (i = 1; i <= plus->n_isles; i++) {
619 plus->built = GV_BUILD_ATTACH_ISLES;
622 if (build < GV_BUILD_CENTROIDS)
626 if (plus->built < GV_BUILD_CENTROIDS) {
632 for (line = 1; line <= nlines; line++) {
635 Line = plus->Line[line];
639 if (Line->type != GV_CENTROID)
642 Node = plus->Node[Line->N1];
647 G_debug(3,
"Centroid (line=%d) in area %d", line, area);
649 Area = plus->Area[area];
651 if (Area->centroid == 0) {
652 Area->centroid = line;
660 plus->built = GV_BUILD_CENTROIDS;
664 for (area = 1; area <= plus->n_areas; area++) {
667 if (plus->Area[area] ==
NULL)
670 if (plus->Area[area]->centroid > 0) {
673 for (c = 0; c < Cats->n_cats; c++) {
679 if (plus->Area[area]->centroid == 0 || Cats->n_cats == 0)