1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- #include <grass/vector.h>
- #include <grass/glocale.h>
- void write_lines(struct Map_info *In, struct field_info *IFi, int *ALines,
- int *AAreas,
- struct Map_info *Out, int table_flag, int reverse_flag,
- int nfields, int *fields, int *ncats, int **cats)
- {
- int i, f, j, aline, nalines;
- int atype;
-
- struct line_pnts *APoints;
- struct line_cats *ACats;
-
- APoints = Vect_new_line_struct();
- ACats = Vect_new_cats_struct();
-
- for (i = 0; i < nfields; i++) {
- ncats[i] = 0;
- cats[i] =
- (int *)G_malloc(Vect_cidx_get_num_cats_by_index(&(In[0]), i) *
- sizeof(int));
- fields[i] = Vect_cidx_get_field_number(&(In[0]), i);
- }
- nalines = Vect_get_num_lines(In);
- G_message(_("Writing selected features..."));
- for (aline = 1; aline <= nalines; aline++) {
- G_debug(3, "aline = %d ALines[aline] = %d", aline, ALines[aline]);
- G_percent(aline, nalines, 2);
- if ((!reverse_flag && !(ALines[aline])))
- continue;
- atype = Vect_read_line(&(In[0]), APoints, ACats, aline);
- if ((reverse_flag && ALines[aline])) {
- if (atype == GV_BOUNDARY && AAreas) {
- int left, right, skipme;
- skipme = 1;
- Vect_get_line_areas(&(In[0]), aline, &left, &right);
- if (left < 0)
- left = Vect_get_isle_area(&(In[0]), abs(left));
- if (left > 0 && !AAreas[left])
- skipme = 0;
- if (right < 0)
- right = Vect_get_isle_area(&(In[0]), abs(right));
- if (right > 0 && !AAreas[right])
- skipme = 0;
- if (skipme)
- continue;
- }
- else
- continue;
- }
- Vect_write_line(Out, atype, APoints, ACats);
- if (!table_flag && (IFi != NULL)) {
- for (i = 0; i < ACats->n_cats; i++) {
- f = -1;
- for (j = 0; j < nfields; j++) { /* find field */
- if (fields[j] == ACats->field[i]) {
- f = j;
- break;
- }
- }
- if (f >= 0) {
- cats[f][ncats[f]] = ACats->cat[i];
- ncats[f]++;
- }
- }
- }
- }
- Vect_destroy_line_struct(APoints);
- Vect_destroy_cats_struct(ACats);
- }
|