Index: trunk/src/change.c =================================================================== --- trunk/src/change.c (revision 10750) +++ trunk/src/change.c (revision 10751) @@ -417,7 +417,7 @@ NULL, NULL, NULL, - /*pcb_arcop_invalidate_label*/ NULL, + pcb_arcop_invalidate_label, NULL, NULL, /*pcb_subcop_invalidate_flag*/ NULL Index: trunk/src/draw.c =================================================================== --- trunk/src/draw.c (revision 10750) +++ trunk/src/draw.c (revision 10751) @@ -465,14 +465,18 @@ if (lflg & PCB_LYT_COPPER) { /* draw all visible lines this layer - with terminal gfx */ pcb_r_search(Layer->line_tree, screen, NULL, pcb_line_draw_term_callback, Layer, NULL); + + /* draw the layer arcs on screen */ + pcb_r_search(Layer->arc_tree, screen, NULL, pcb_arc_draw_term_callback, Layer, NULL); } else { /* draw all visible lines this layer */ pcb_r_search(Layer->line_tree, screen, NULL, pcb_line_draw_callback, Layer, NULL); + + /* draw the layer arcs on screen */ + pcb_r_search(Layer->arc_tree, screen, NULL, pcb_arc_draw_callback, Layer, NULL); } - /* draw the layer arcs on screen */ - pcb_r_search(Layer->arc_tree, screen, NULL, pcb_arc_draw_callback, Layer, NULL); /* draw the layer text on screen */ pcb_r_search(Layer->text_tree, screen, NULL, pcb_text_draw_callback, Layer, NULL); @@ -606,6 +610,7 @@ { 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; default: break; } } Index: trunk/src/gui_act.c =================================================================== --- trunk/src/gui_act.c (revision 10750) +++ trunk/src/gui_act.c (revision 10751) @@ -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, (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, (void **)&ptr1, (void **)&ptr2, (void **)&ptr3); if (type) { pcb_any_obj_t *obj = ptr2; @@ -533,10 +533,10 @@ return 0; case PCB_TYPE_VIA: case PCB_TYPE_LINE: + case PCB_TYPE_ARC: 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_ARC: case PCB_TYPE_POLYGON: case PCB_TYPE_TEXT: Index: trunk/src/obj_arc.c =================================================================== --- trunk/src/obj_arc.c (revision 10750) +++ trunk/src/obj_arc.c (revision 10751) @@ -735,25 +735,87 @@ return Arc; } +void *pcb_arcop_invalidate_label(pcb_opctx_t *ctx, pcb_arc_t *arc) +{ + pcb_arc_name_invalidate_draw(arc); + return arc; +} + /*** draw ***/ -void pcb_arc_draw_(pcb_arc_t * arc) + +static void arc_label_pos(const pcb_arc_t *arc, pcb_coord_t *x0, pcb_coord_t *y0, pcb_bool_t *vert) { + double da, ea, la; + + da = PCB_CLAMP(arc->Delta, -360, 360); + ea = arc->StartAngle + da; + while(ea < -360) ea += 360; + while(ea > +360) ea -= 360; + + la = (arc->StartAngle+ea)/2.0; + + *x0 = pcb_round((double)arc->X - (double)arc->Width * cos(la * PCB_M180)); + *y0 = pcb_round((double)arc->Y + (double)arc->Height * sin(la * PCB_M180)); + *vert = (((la < 45) && (la > -45)) || ((la > 135) && (la < 225))); +} + +void pcb_arc_name_invalidate_draw(pcb_arc_t *arc) +{ + if (arc->term != NULL) { + pcb_text_t text; + pcb_coord_t x0, y0; + pcb_bool_t vert; + + arc_label_pos(arc, &x0, &y0, &vert); + pcb_term_label_setup(&text, x0, y0, 100.0, vert, pcb_true, arc->term); + pcb_draw_invalidate(&text); + } +} + +void pcb_arc_draw_label(pcb_arc_t *arc) +{ + if (arc->term != NULL) { + pcb_coord_t x0, y0; + pcb_bool_t vert; + + arc_label_pos(arc, &x0, &y0, &vert); + pcb_term_label_draw(x0, y0, 100.0, vert, pcb_true, arc->term); + } +} + +void pcb_arc_draw_(pcb_arc_t * arc, int allow_term_gfx) +{ if (!arc->Thickness) return; PCB_DRAW_BBOX(arc); - if (conf_core.editor.thin_draw) + if (!conf_core.editor.thin_draw) + { + if ((arc->term != NULL) && (allow_term_gfx)) { + pcb_hid_gc_t gc = PCB_FLAG_TEST(PCB_FLAG_SELECTED, arc) ? Output.padselGC : Output.padGC; + pcb_gui->set_line_width(gc, arc->Thickness); + pcb_gui->draw_arc(gc, arc->X, arc->Y, arc->Width, arc->Height, arc->StartAngle, arc->Delta); + pcb_gui->set_line_width(Output.fgGC, arc->Thickness/4); + } + else + pcb_gui->set_line_width(Output.fgGC, arc->Thickness); + } + else pcb_gui->set_line_width(Output.fgGC, 0); - else - pcb_gui->set_line_width(Output.fgGC, arc->Thickness); + pcb_gui->set_line_cap(Output.fgGC, Trace_Cap); pcb_gui->draw_arc(Output.fgGC, arc->X, arc->Y, arc->Width, arc->Height, arc->StartAngle, arc->Delta); + + if (arc->term != NULL) { + if ((pcb_draw_doing_pinout) || PCB_FLAG_TEST(PCB_FLAG_TERMNAME, arc)) + pcb_draw_delay_label_add((pcb_any_obj_t *)arc); + } } -void pcb_arc_draw(pcb_layer_t * layer, pcb_arc_t * arc) +static void pcb_arc_draw(pcb_layer_t * layer, pcb_arc_t * arc, int allow_term_gfx) { const char *color; char buf[sizeof("#XXXXXX")]; @@ -775,7 +837,7 @@ color = buf; } pcb_gui->set_color(Output.fgGC, color); - pcb_arc_draw_(arc); + pcb_arc_draw_(arc, allow_term_gfx); } pcb_r_dir_t pcb_arc_draw_callback(const pcb_box_t * b, void *cl) @@ -785,10 +847,21 @@ if (!PCB->SubcPartsOn && pcb_lobj_parent_subc(arc->parent_type, &arc->parent)) return PCB_R_DIR_NOT_FOUND; - pcb_arc_draw((pcb_layer_t *)cl, arc); + pcb_arc_draw((pcb_layer_t *)cl, arc, 0); return PCB_R_DIR_FOUND_CONTINUE; } +pcb_r_dir_t pcb_arc_draw_term_callback(const pcb_box_t * b, void *cl) +{ + pcb_arc_t *arc = (pcb_arc_t *)b; + + if (!PCB->SubcPartsOn && pcb_lobj_parent_subc(arc->parent_type, &arc->parent)) + return PCB_R_DIR_NOT_FOUND; + + pcb_arc_draw((pcb_layer_t *)cl, arc, 1); + return PCB_R_DIR_FOUND_CONTINUE; +} + /* erases an arc on a layer */ void pcb_arc_invalidate_erase(pcb_arc_t *Arc) { Index: trunk/src/obj_arc_draw.h =================================================================== --- trunk/src/obj_arc_draw.h (revision 10750) +++ trunk/src/obj_arc_draw.h (revision 10751) @@ -29,9 +29,10 @@ /* Include rtree.h for this */ #ifdef PCB_RTREE_H pcb_r_dir_t pcb_arc_draw_callback(const pcb_box_t * b, void *cl); +pcb_r_dir_t pcb_arc_draw_term_callback(const pcb_box_t * b, void *cl); #endif -void pcb_arc_draw_(pcb_arc_t * arc); -void pcb_arc_draw(pcb_layer_t * layer, pcb_arc_t * arc); +void pcb_arc_draw_(pcb_arc_t * arc, int allow_term_gfx); void pcb_arc_invalidate_erase(pcb_arc_t *Arc); void pcb_arc_invalidate_draw(pcb_layer_t *Layer, pcb_arc_t *Arc); +void pcb_arc_name_invalidate_draw(pcb_arc_t *arc); Index: trunk/src/obj_arc_op.h =================================================================== --- trunk/src/obj_arc_op.h (revision 10750) +++ trunk/src/obj_arc_op.h (revision 10751) @@ -46,6 +46,7 @@ void *pcb_arcop_remove_point(pcb_opctx_t *ctx, pcb_layer_t *l, pcb_arc_t *a, int *end_id); void *pcb_arcop_rotate90(pcb_opctx_t *ctx, pcb_layer_t *Layer, pcb_arc_t *Arc); void *pcb_arcop_change_flag(pcb_opctx_t *ctx, pcb_layer_t *Layer, pcb_arc_t *Arc); +void *pcb_arcop_invalidate_label(pcb_opctx_t *ctx, pcb_arc_t *arc); void *pcb_arc_insert_point(pcb_opctx_t *ctx, pcb_layer_t *Layer, pcb_arc_t *arc); Index: trunk/src/obj_elem.c =================================================================== --- trunk/src/obj_elem.c (revision 10750) +++ trunk/src/obj_elem.c (revision 10751) @@ -1878,7 +1878,7 @@ PCB_END_LOOP; PCB_ARC_LOOP(element); { - pcb_arc_draw_(arc); + pcb_arc_draw_(arc, 0); } PCB_END_LOOP; } Index: trunk/src/obj_text.c =================================================================== --- trunk/src/obj_text.c (revision 10750) +++ trunk/src/obj_text.c (revision 10751) @@ -679,7 +679,7 @@ if (xordraw) pcb_gui->draw_arc(pcb_crosshair.GC, xordx + newarc.X, xordy + newarc.Y, newarc.Width, newarc.Height, newarc.StartAngle, newarc.Delta); else - pcb_arc_draw_(&newarc); + pcb_arc_draw_(&newarc, 0); } /* draw the polygons */