Index: line_of_vias.c =================================================================== --- line_of_vias.c (revision 28836) +++ line_of_vias.c (revision 28837) @@ -26,13 +26,11 @@ * mailing list: pcb-rnd (at) list.repo.hu (send "subscribe") */ +#define LID_EDIT 0 + typedef struct { pcb_coord_t pitch; pcb_coord_t clearance; - - /* cached */ - pcb_coord_t x1, y1, x2, y2; - double len, dx, dy; } line_of_vias; static void pcb_line_of_vias_del_pre(pcb_subc_t *subc) @@ -42,21 +40,9 @@ subc->extobj_data = NULL; } -static void line_of_vias_udpate_line(line_of_vias *lov, pcb_line_t *line) -{ - lov->x1 = line->Point1.X; - lov->y1 = line->Point1.Y; - lov->x2 = line->Point2.X; - lov->y2 = line->Point2.Y; - lov->len = pcb_distance(line->Point1.X, line->Point1.Y, line->Point2.X, line->Point2.Y); - lov->dx = (double)(line->Point2.X - line->Point1.X) / lov->len; - lov->dy = (double)(line->Point2.Y - line->Point1.Y) / lov->len; -} - static void line_of_vias_unpack(pcb_subc_t *obj) { line_of_vias *lov; - pcb_any_obj_t *edit; if (obj->extobj_data == NULL) obj->extobj_data = calloc(sizeof(line_of_vias), 1); @@ -64,13 +50,6 @@ pcb_extobj_unpack_coord(obj, &lov->pitch, "extobj::pitch"); pcb_extobj_unpack_coord(obj, &lov->clearance, "extobj::clearance"); - -TODO("iterate over all edit roled objects"); -/* - edit = pcb_extobj_get_editobj_by_attr(obj); - if ((edit != NULL) && (edit->type == PCB_OBJ_LINE)) - line_of_vias_udpate_line(lov, (pcb_line_t *)edit); -*/ } /* remove all existing padstacks from the subc */ @@ -83,32 +62,31 @@ } } +#define line_geo_def \ + double len, dx, dy \ + +#define line_geo_calc(line) \ + do { \ + len = pcb_distance(line->Point1.X, line->Point1.Y, line->Point2.X, line->Point2.Y); \ + dx = (double)(line->Point2.X - line->Point1.X) / len; \ + dy = (double)(line->Point2.Y - line->Point1.Y) / len; \ + } while(0) + + /* create all new padstacks */ -static int line_of_vias_gen(pcb_subc_t *subc, pcb_any_obj_t *edit_obj) +static void line_of_vias_gen_line(pcb_board_t *pcb, pcb_subc_t *subc, pcb_line_t *line) { + line_geo_def; double offs, x, y, pitch, too_close, qbox_bloat; - line_of_vias *lov; - pcb_line_t *line = (pcb_line_t *)edit_obj; - pcb_board_t *pcb; + line_of_vias *lov = subc->extobj_data; - if (edit_obj->type != PCB_OBJ_LINE) - return -1; - - pcb = pcb_data_get_top(subc->data); - - if (subc->extobj_data == NULL) - line_of_vias_unpack(subc); - lov = subc->extobj_data; - line_of_vias_udpate_line(lov, line); - - pcb_exto_regen_begin(subc); - + line_geo_calc(line); x = line->Point1.X; y = line->Point1.Y; pitch = lov->pitch; too_close = pitch/2.0; qbox_bloat = pitch/4.0; - for(offs = 0; offs <= lov->len; offs += pitch) { + for(offs = 0; offs <= len; offs += pitch) { pcb_rtree_it_t it; pcb_rtree_box_t qbox; pcb_pstk_t *cl; @@ -128,44 +106,70 @@ if (!skip) pcb_pstk_new(subc->data, -1, 0, rx, ry, lov->clearance, pcb_flag_make(PCB_FLAG_CLEARLINE)); - x += lov->dx * pitch; - y += lov->dy * pitch; + x += dx * pitch; + y += dy * pitch; } +} +static int line_of_vias_gen(pcb_subc_t *subc, pcb_any_obj_t *edit_obj) +{ + pcb_line_t *line; + pcb_board_t *pcb = pcb_data_get_top(subc->data); + pcb_layer_t *ly = &subc->data->Layer[LID_EDIT]; + + if (subc->extobj_data == NULL) + line_of_vias_unpack(subc); + + pcb_exto_regen_begin(subc); + for(line = linelist_first(&ly->Line); line != NULL; line = linelist_next(line)) + line_of_vias_gen_line(pcb, subc, line); + return pcb_exto_regen_end(subc); } - -static void pcb_line_of_vias_draw_mark(pcb_draw_info_t *info, pcb_subc_t *subc) +static void draw_mark_line(pcb_draw_info_t *info, pcb_subc_t *subc, pcb_line_t *line) { - int selected = PCB_FLAG_TEST(PCB_FLAG_SELECTED, subc); - line_of_vias *lov; + int selected; double disp = PCB_MM_TO_COORD(0.05); double arrow = PCB_MM_TO_COORD(0.2); double ax, ay, ax1, ay1, ax2, ay2; + line_geo_def; + pcb_coord_t x1 = line->Point1.X, y1 = line->Point1.Y, x2 = line->Point2.X, y2 = line->Point2.Y; +/* line_of_vias *lov = subc->extobj_data;*/ - if (subc->extobj_data == NULL) - line_of_vias_unpack(subc); - lov = subc->extobj_data; + line_geo_calc(line); + selected = PCB_FLAG_TEST(PCB_FLAG_SELECTED, line); pcb_render->set_color(pcb_draw_out.fgGC, selected ? &conf_core.appearance.color.selected : &conf_core.appearance.color.extobj); pcb_hid_set_line_width(pcb_draw_out.fgGC, -1); - pcb_render->draw_line(pcb_draw_out.fgGC, lov->x1 - lov->dy * +disp, lov->y1 + lov->dx * +disp, lov->x2 - lov->dy * +disp, lov->y2 + lov->dx * +disp); - pcb_render->draw_line(pcb_draw_out.fgGC, lov->x1 - lov->dy * -disp, lov->y1 + lov->dx * -disp, lov->x2 - lov->dy * -disp, lov->y2 + lov->dx * -disp); + pcb_render->draw_line(pcb_draw_out.fgGC, x1 - dy * +disp, y1 + dx * +disp, x2 - dy * +disp, y2 + dx * +disp); + pcb_render->draw_line(pcb_draw_out.fgGC, x1 - dy * -disp, y1 + dx * -disp, x2 - dy * -disp, y2 + dx * -disp); pcb_hid_set_line_width(pcb_draw_out.fgGC, -2); - ax = lov->x1 + lov->dx * arrow; - ay = lov->y1 + lov->dy * arrow; - ax1 = lov->x1 - lov->dy * +arrow; - ay1 = lov->y1 + lov->dx * +arrow; - ax2 = lov->x1 - lov->dy * -arrow; - ay2 = lov->y1 + lov->dx * -arrow; + ax = x1 + dx * arrow; + ay = y1 + dy * arrow; + ax1 = x1 - dy * +arrow; + ay1 = y1 + dx * +arrow; + ax2 = x1 - dy * -arrow; + ay2 = y1 + dx * -arrow; pcb_render->draw_line(pcb_draw_out.fgGC, ax1, ay1, ax2, ay2); pcb_render->draw_line(pcb_draw_out.fgGC, ax1, ay1, ax, ay); pcb_render->draw_line(pcb_draw_out.fgGC, ax2, ay2, ax, ay); } +static void pcb_line_of_vias_draw_mark(pcb_draw_info_t *info, pcb_subc_t *subc) +{ + pcb_line_t *line; + pcb_layer_t *ly = &subc->data->Layer[LID_EDIT]; + if (subc->extobj_data == NULL) + line_of_vias_unpack(subc); + + for(line = linelist_first(&ly->Line); line != NULL; line = linelist_next(line)) + draw_mark_line(info, subc, line); +} + + static void pcb_line_of_vias_float_pre(pcb_subc_t *subc, pcb_any_obj_t *edit_obj) { pcb_trace("LoV: edit pre %ld %ld\n", subc->ID, edit_obj->ID); @@ -188,13 +192,9 @@ { pcb_trace("LoV chg_attr\n"); if (strncmp(key, "extobj::", 8) == 0) { -TODO("iterate over all edit roled objects"); - pcb_any_obj_t *edit_obj;/* = pcb_extobj_get_editobj_by_attr(subc); - if (edit_obj == NULL)*/ - return; line_of_vias_clear(subc); line_of_vias_unpack(subc); - line_of_vias_gen(subc, edit_obj); + line_of_vias_gen(subc, NULL); } }