#include #include #include #include #include "plot.h" #include int topo ( struct Map_info *Map, int type, int do_area, LATTR *lattr ) { int i, ltype, num, el; double xl, yl; struct line_pnts *Points; struct line_cats *Cats; int X, Y, T, B, L, R, Xoffset, Yoffset, xarr[5], yarr[5]; char text[50]; G_debug (1, "display topo:"); Points = Vect_new_line_struct (); Cats = Vect_new_cats_struct (); R_color(lattr->color) ; R_text_size(lattr->size, lattr->size) ; R_font(lattr->font) ; Vect_rewind ( Map ); num = Vect_get_num_lines(Map); G_debug (1, "n_lines = %d", num); /* Lines */ for ( el = 1; el <= num; el++ ) { if ( !Vect_line_alive (Map, el ) ) continue; ltype = Vect_read_line (Map, Points, Cats, el ); G_debug (3, "ltype = %d", ltype); switch ( ltype ) { case -1: fprintf (stderr, _("\nERROR: vector file - can't read\n" )); return -1; case -2: /* EOF */ return 0; } if ( !(type & ltype) ) continue; /* used for both lines and labels */ if ( (ltype & GV_POINTS) || Points->n_points == 1 ) /* point/centroid or line/boundary with one coor */ { X = (int)(D_u_to_d_col(Points->x[0])) ; Y = (int)(D_u_to_d_row(Points->y[0])) ; } else if ( Points->n_points == 2 ) /* line with two coors */ { xl = (Points->x[0] + Points->x[1]) / 2; yl = (Points->y[0] + Points->y[1]) / 2; X = (int)(D_u_to_d_col(xl)) ; Y = (int)(D_u_to_d_row(yl)) ; } else { i = Points->n_points / 2; X = (int)(D_u_to_d_col(Points->x[i])) ; Y = (int)(D_u_to_d_row(Points->y[i])) ; } X = X + 0.5 * lattr->size; Y = Y + 1.5 * lattr->size; R_move_abs(X, Y) ; sprintf (text, "%d", el); R_get_text_box(text, &T, &B, &L, &R); /* Expand border 1/2 of text size */ T = T - lattr->size / 2 ; B = B + lattr->size / 2 ; L = L - lattr->size / 2 ; R = R + lattr->size / 2 ; Xoffset = 0; Yoffset = 0; if (lattr->xref == LCENTER) Xoffset = -(R - L) / 2 ; if (lattr->xref == LRIGHT ) Xoffset = -(R - L) ; if (lattr->yref == LCENTER) Yoffset = -(B - T) / 2 ; if (lattr->yref == LBOTTOM) Yoffset = -(B - T) ; if ( lattr->bgcolor || lattr->bcolor ) { xarr[0] = xarr[1] = xarr[4] = L + Xoffset; xarr[2] = xarr[3] = R + Xoffset; yarr[0] = yarr[3] = yarr[4] = B + Yoffset; yarr[1] = yarr[2] = T + Yoffset; if( lattr->bgcolor) { R_color( lattr->bgcolor) ; R_polygon_abs(xarr, yarr, 5) ; } if( lattr->bcolor) { R_color( lattr->bcolor) ; R_polyline_abs(xarr, yarr, 5) ; } R_color(lattr->color) ; } R_move_abs(X + Xoffset, Y + Yoffset) ; R_text(text); } num = Vect_get_num_nodes(Map); G_debug (1, "n_nodes = %d", num); /* Nodes */ for ( el = 1; el <= num; el++ ) { if ( !Vect_node_alive (Map, el ) ) continue; Vect_get_node_coor (Map, el, &xl, &yl, NULL ); G_debug (3, "node = %d", el); X = (int)(D_u_to_d_col(xl)) ; Y = (int)(D_u_to_d_row(yl)) ; X = X + 0.5 * lattr->size; Y = Y + 1.5 * lattr->size; R_move_abs(X, Y) ; sprintf (text, "n%d", el); R_get_text_box(text, &T, &B, &L, &R); /* Expand border 1/2 of text size */ T = T - lattr->size / 2 ; B = B + lattr->size / 2 ; L = L - lattr->size / 2 ; R = R + lattr->size / 2 ; Xoffset = 0; Yoffset = 0; /* if (lattr->xref == LCENTER) Xoffset = -(R - L) / 2 ; if (lattr->xref == LRIGHT ) Xoffset = -(R - L) ; */ Xoffset = -(R - L) ; if (lattr->yref == LCENTER) Yoffset = -(B - T) / 2 ; if (lattr->yref == LBOTTOM) Yoffset = -(B - T) ; if ( lattr->bgcolor || lattr->bcolor ) { xarr[0] = xarr[1] = xarr[4] = L + Xoffset; xarr[2] = xarr[3] = R + Xoffset; yarr[0] = yarr[3] = yarr[4] = B + Yoffset; yarr[1] = yarr[2] = T + Yoffset; if( lattr->bgcolor) { R_color( lattr->bgcolor) ; R_polygon_abs(xarr, yarr, 5) ; } if( lattr->bcolor) { R_color( lattr->bcolor) ; R_polyline_abs(xarr, yarr, 5) ; } R_color(lattr->color) ; } R_move_abs(X + Xoffset, Y + Yoffset) ; R_text(text); } Vect_destroy_line_struct (Points); Vect_destroy_cats_struct (Cats); return 0; }