Index: trunk/src/change.c =================================================================== --- trunk/src/change.c (revision 10753) +++ trunk/src/change.c (revision 10754) @@ -409,7 +409,7 @@ static pcb_opfunc_t InvalLabelFunctions = { pcb_lineop_invalidate_label, /*pcb_textop_invalidate_label*/ NULL, - /*pcb_polyop_invalidate_label*/ NULL, + pcb_polyop_invalidate_label, pcb_pinop_invalidate_label, NULL, NULL, Index: trunk/src/draw.c =================================================================== --- trunk/src/draw.c (revision 10753) +++ trunk/src/draw.c (revision 10754) @@ -454,8 +454,14 @@ info.layer = Layer; - /* print the non-clearing polys */ - pcb_r_search(Layer->polygon_tree, screen, NULL, pcb_poly_draw_callback, &info, NULL); + if (lflg & PCB_LYT_COPPER) { + /* print the non-clearing polys */ + pcb_r_search(Layer->polygon_tree, screen, NULL, pcb_poly_draw_term_callback, &info, NULL); + } + else { + /* print the non-clearing polys */ + pcb_r_search(Layer->polygon_tree, screen, NULL, pcb_poly_draw_callback, &info, NULL); + } if (conf_core.editor.check_planes) return; @@ -609,8 +615,9 @@ static void pcb_draw_obj_label(pcb_any_obj_t *obj) { switch(obj->type) { - case PCB_OBJ_LINE: pcb_line_draw_label((pcb_line_t *)obj); return; - case PCB_OBJ_ARC: pcb_arc_draw_label((pcb_line_t *)obj); return; + case PCB_OBJ_LINE: pcb_line_draw_label((pcb_line_t *)obj); return; + case PCB_OBJ_ARC: pcb_arc_draw_label((pcb_arc_t *)obj); return; + case PCB_OBJ_POLYGON: pcb_poly_draw_label((pcb_polygon_t *)obj); return; default: break; } } Index: trunk/src/gui_act.c =================================================================== --- trunk/src/gui_act.c (revision 10753) +++ trunk/src/gui_act.c (revision 10754) @@ -522,7 +522,7 @@ } /* toggle terminal ID print for subcircuit parts */ - type = pcb_search_screen(x, y, PCB_TYPE_SUBC | PCB_TYPE_SUBC_PART | PCB_TYPE_VIA | PCB_TYPE_LINE | PCB_TYPE_ARC, (void **)&ptr1, (void **)&ptr2, (void **)&ptr3); + type = pcb_search_screen(x, y, PCB_TYPE_SUBC | PCB_TYPE_SUBC_PART | PCB_TYPE_VIA | PCB_TYPE_LINE | PCB_TYPE_ARC | PCB_TYPE_POLYGON, (void **)&ptr1, (void **)&ptr2, (void **)&ptr3); if (type) { pcb_any_obj_t *obj = ptr2; @@ -534,10 +534,10 @@ case PCB_TYPE_VIA: case PCB_TYPE_LINE: case PCB_TYPE_ARC: + case PCB_TYPE_POLYGON: pcb_obj_invalidate_label(type, ptr1, ptr2, ptr3); break; #warning term TODO: these; also convert this into an op so we don't need the switch here - case PCB_TYPE_POLYGON: case PCB_TYPE_TEXT: default: Index: trunk/src/obj_poly.c =================================================================== --- trunk/src/obj_poly.c (revision 10753) +++ trunk/src/obj_poly.c (revision 10754) @@ -806,11 +806,47 @@ } while(pa != p->Clipped); } +void *pcb_polyop_invalidate_label(pcb_opctx_t *ctx, pcb_polygon_t *poly) +{ + pcb_poly_name_invalidate_draw(poly); + return poly; +} +/*** draw ***/ +static pcb_bool is_poly_term_vert(const pcb_polygon_t *poly) +{ + pcb_coord_t dx, dy; -/*** draw ***/ + dx = poly->BoundingBox.X2 - poly->BoundingBox.X1; + if (dx < 0) + dx = -dx; + dy = poly->BoundingBox.Y2 - poly->BoundingBox.Y1; + if (dy < 0) + dy = -dy; + + return dx < dy; +} + + +void pcb_poly_name_invalidate_draw(pcb_polygon_t *poly) +{ + if (poly->term != NULL) { + pcb_text_t text; + pcb_term_label_setup(&text, (poly->BoundingBox.X1 + poly->BoundingBox.X2)/2, (poly->BoundingBox.Y1 + poly->BoundingBox.Y2)/2, + 100.0, is_poly_term_vert(poly), pcb_true, poly->term); + pcb_draw_invalidate(&text); + } +} + +void pcb_poly_draw_label(pcb_polygon_t *poly) +{ + if (poly->term != NULL) + pcb_term_label_draw((poly->BoundingBox.X1 + poly->BoundingBox.X2)/2, (poly->BoundingBox.Y1 + poly->BoundingBox.Y2)/2, + 100.0, is_poly_term_vert(poly), pcb_true, poly->term); +} + void pcb_poly_draw_(pcb_polygon_t *polygon, const pcb_box_t *drawn_area, int allow_term_gfx) { if ((pcb_gui->thindraw_pcb_polygon != NULL) && (conf_core.editor.thin_draw || conf_core.editor.thin_draw_poly)) @@ -825,6 +861,11 @@ for (poly.Clipped = polygon->Clipped->f; poly.Clipped != polygon->Clipped; poly.Clipped = poly.Clipped->f) pcb_gui->thindraw_pcb_polygon(Output.fgGC, &poly, drawn_area); } + + if (polygon->term != NULL) { + if ((pcb_draw_doing_pinout) || PCB_FLAG_TEST(PCB_FLAG_TERMNAME, polygon)) + pcb_draw_delay_label_add((pcb_any_obj_t *)polygon); + } } static void pcb_poly_draw(pcb_layer_t *layer, pcb_polygon_t *polygon, const pcb_box_t *drawn_area, int allow_term_gfx) @@ -866,6 +907,22 @@ return PCB_R_DIR_FOUND_CONTINUE; } +pcb_r_dir_t pcb_poly_draw_term_callback(const pcb_box_t * b, void *cl) +{ + pcb_draw_info_t *i = cl; + pcb_polygon_t *polygon = (pcb_polygon_t *) b; + + if (!polygon->Clipped) + return PCB_R_DIR_NOT_FOUND; + + if (!PCB->SubcPartsOn && pcb_lobj_parent_subc(polygon->parent_type, &polygon->parent)) + return PCB_R_DIR_NOT_FOUND; + + pcb_poly_draw(i->layer, polygon, i->drawn_area, 1); + + return PCB_R_DIR_FOUND_CONTINUE; +} + /* erases a polygon on a layer */ void pcb_poly_invalidate_erase(pcb_polygon_t *Polygon) { Index: trunk/src/obj_poly_draw.h =================================================================== --- trunk/src/obj_poly_draw.h (revision 10753) +++ trunk/src/obj_poly_draw.h (revision 10754) @@ -29,7 +29,11 @@ /* Include rtree.h for these */ #ifdef PCB_RTREE_H pcb_r_dir_t pcb_poly_draw_callback(const pcb_box_t * b, void *cl); +pcb_r_dir_t pcb_poly_draw_term_callback(const pcb_box_t * b, void *cl); #endif void pcb_poly_invalidate_erase(pcb_polygon_t *Polygon); void pcb_poly_invalidate_draw(pcb_layer_t *Layer, pcb_polygon_t *Polygon); +void pcb_poly_name_invalidate_draw(pcb_polygon_t *poly); +void pcb_poly_draw_label(pcb_polygon_t *poly); + Index: trunk/src/obj_poly_op.h =================================================================== --- trunk/src/obj_poly_op.h (revision 10753) +++ trunk/src/obj_poly_op.h (revision 10754) @@ -45,5 +45,6 @@ void *pcb_polyop_copy(pcb_opctx_t *ctx, pcb_layer_t *Layer, pcb_polygon_t *Polygon); void *pcb_polyop_rotate90(pcb_opctx_t *ctx, pcb_layer_t *Layer, pcb_polygon_t *Polygon); void *pcb_polyop_change_flag(pcb_opctx_t *ctx, pcb_layer_t *Layer, pcb_polygon_t *Polygon); +void *pcb_polyop_invalidate_label(pcb_opctx_t *ctx, pcb_polygon_t *poly);