Index: trunk/src/drc.c =================================================================== --- trunk/src/drc.c (revision 21255) +++ trunk/src/drc.c (revision 21256) @@ -29,6 +29,8 @@ #include "drc.h" +pcb_view_list_t pcb_drc_lst; + void pcb_drc_set_data(pcb_view_t *violation, const pcb_coord_t *measured_value, pcb_coord_t required_value) { violation->data_type = PCB_VIEW_DRC; Index: trunk/src/drc.h =================================================================== --- trunk/src/drc.h (revision 21255) +++ trunk/src/drc.h (revision 21256) @@ -37,5 +37,8 @@ /* Load drc-specific fields of a view; if measured_value is NULL, it is not available */ void pcb_drc_set_data(pcb_view_t *violation, const pcb_coord_t *measured_value, pcb_coord_t required_value); +extern pcb_view_list_t pcb_drc_lst; +void pcb_drc_all(void); + #endif Index: trunk/src/find_drc.c =================================================================== --- trunk/src/find_drc.c (revision 21255) +++ trunk/src/find_drc.c (revision 21256) @@ -322,32 +322,32 @@ { pcb_view_t *violation; - PCB_PADSTACK_LOOP(PCB->Data); - { - pcb_coord_t ring = 0, hole = 0; - pcb_poly_plows(PCB->Data, PCB_OBJ_PSTK, padstack, padstack, drc_callback, lst); - pcb_pstk_drc_check_and_warn(padstack, &ring, &hole); - if ((ring > 0) || (hole > 0)) { - pcb_undo_add_obj_to_flag(padstack); - PCB_FLAG_SET(TheFlag, padstack); - pcb_pstk_invalidate_draw(padstack); - if (ring) { - violation = pcb_view_new("thin", "padstack annular ring too small", "Annular rings that are too small may erode during etching,\nresulting in a broken connection"); - pcb_drc_set_data(violation, &ring, conf_core.design.min_ring); - pcb_view_append_obj(violation, 0, (pcb_any_obj_t *)padstack); - pcb_view_set_bbox_by_objs(PCB->Data, violation); - pcb_view_list_append(lst, violation); - } - if (hole > 0) { - violation = pcb_view_new("drill", "Padstack drill size is too small", "Process rules dictate the minimum drill size which can be used"); - pcb_drc_set_data(violation, &hole, conf_core.design.min_drill); - pcb_view_append_obj(violation, 0, (pcb_any_obj_t *)padstack); - pcb_view_set_bbox_by_objs(PCB->Data, violation); - pcb_view_list_append(lst, violation); - } + PCB_PADSTACK_LOOP(PCB->Data); + { + pcb_coord_t ring = 0, hole = 0; + pcb_poly_plows(PCB->Data, PCB_OBJ_PSTK, padstack, padstack, drc_callback, lst); + pcb_pstk_drc_check_and_warn(padstack, &ring, &hole); + if ((ring > 0) || (hole > 0)) { + pcb_undo_add_obj_to_flag(padstack); + PCB_FLAG_SET(TheFlag, padstack); + pcb_pstk_invalidate_draw(padstack); + if (ring) { + violation = pcb_view_new("thin", "padstack annular ring too small", "Annular rings that are too small may erode during etching,\nresulting in a broken connection"); + pcb_drc_set_data(violation, &ring, conf_core.design.min_ring); + pcb_view_append_obj(violation, 0, (pcb_any_obj_t *)padstack); + pcb_view_set_bbox_by_objs(PCB->Data, violation); + pcb_view_list_append(lst, violation); } + if (hole > 0) { + violation = pcb_view_new("drill", "Padstack drill size is too small", "Process rules dictate the minimum drill size which can be used"); + pcb_drc_set_data(violation, &hole, conf_core.design.min_drill); + pcb_view_append_obj(violation, 0, (pcb_any_obj_t *)padstack); + pcb_view_set_bbox_by_objs(PCB->Data, violation); + pcb_view_list_append(lst, violation); + } } - PCB_END_LOOP; + } + PCB_END_LOOP; } /* check silkscreen minimum widths outside of subcircuits */ @@ -357,19 +357,19 @@ #warning DRC TODO: need to check text and polygons too! TheFlag = PCB_FLAG_SELECTED; - PCB_LINE_SILK_LOOP(PCB->Data); - { - if (line->Thickness < conf_core.design.min_slk) { - PCB_FLAG_SET(TheFlag, line); - pcb_line_invalidate_draw(layer, line); - violation = pcb_view_new("thin", "Silk line is too thin", "Process specifications dictate a minimum silkscreen feature-width\nthat can reliably be reproduced"); - pcb_drc_set_data(violation, &line->Thickness, conf_core.design.min_slk); - pcb_view_append_obj(violation, 0, (pcb_any_obj_t *)line); - pcb_view_set_bbox_by_objs(PCB->Data, violation); - pcb_view_list_append(lst, violation); - } + PCB_LINE_SILK_LOOP(PCB->Data); + { + if (line->Thickness < conf_core.design.min_slk) { + PCB_FLAG_SET(TheFlag, line); + pcb_line_invalidate_draw(layer, line); + violation = pcb_view_new("thin", "Silk line is too thin", "Process specifications dictate a minimum silkscreen feature-width\nthat can reliably be reproduced"); + pcb_drc_set_data(violation, &line->Thickness, conf_core.design.min_slk); + pcb_view_append_obj(violation, 0, (pcb_any_obj_t *)line); + pcb_view_set_bbox_by_objs(PCB->Data, violation); + pcb_view_list_append(lst, violation); } - PCB_ENDALL_LOOP; + } + PCB_ENDALL_LOOP; } @@ -379,8 +379,11 @@ pcb_reset_conns(pcb_false); } -void pcb_drc_all(pcb_view_list_t *lst) +void pcb_drc_all() { + pcb_view_list_t *lst = &pcb_drc_lst; + pcb_view_list_free_fields(lst); + pcb_layervis_save_stack(); pcb_layervis_reset_stack(); pcb_event(PCB_EVENT_LAYERVIS_CHANGED, NULL); Index: trunk/src/view.h =================================================================== --- trunk/src/view.h (revision 21255) +++ trunk/src/view.h (revision 21256) @@ -108,7 +108,4 @@ /* Calculate and set v->bbox from v->objs[] bboxes */ void pcb_view_set_bbox_by_objs(pcb_data_t *data, pcb_view_t *v); -/*** temporary, until moved out to a plugin ***/ -void pcb_drc_all(pcb_view_list_t *lst); - #endif Index: trunk/src_plugins/dialogs/dlg_view.c =================================================================== --- trunk/src_plugins/dialogs/dlg_view.c (revision 21255) +++ trunk/src_plugins/dialogs/dlg_view.c (revision 21256) @@ -35,6 +35,7 @@ #include "conf_core.h" #include "view.h" #include "draw.h" +#include "drc.h" #include "event.h" #include "hid_inlines.h" #include "hid_dad.h" @@ -45,7 +46,8 @@ typedef struct { PCB_DAD_DECL_NOINIT(dlg) pcb_board_t *pcb; - pcb_view_list_t drc; + pcb_view_list_t *lst; + pcb_view_list_t lst_local; int alloced, active; unsigned long int selected; @@ -74,7 +76,7 @@ pcb_hid_row_t *r; char *cell[3], *cursor_path = NULL; - sprintf(tmp, "%d", pcb_view_list_length(&ctx->drc)); + sprintf(tmp, "%d", pcb_view_list_length(ctx->lst)); PCB_DAD_SET_VALUE(ctx->dlg_hid_ctx, ctx->wcount, str_value, tmp); attr = &ctx->dlg[ctx->wlist]; @@ -91,7 +93,7 @@ /* add all items */ cell[2] = NULL; - for(v = pcb_view_list_first(&ctx->drc); v != NULL; v = pcb_view_list_next(v)) { + for(v = pcb_view_list_first(ctx->lst); v != NULL; v = pcb_view_list_next(v)) { pcb_hid_row_t *r, *rt; rt = htsp_get(&tree->paths, v->type); if (rt == NULL) { @@ -143,7 +145,7 @@ if (row != NULL) { ctx->selected = row->user_data2.lng; - v = pcb_view_by_uid(&ctx->drc, ctx->selected); + v = pcb_view_by_uid(ctx->lst, ctx->selected); if (v != NULL) { pcb_view_goto(v); PCB_DAD_SET_VALUE(ctx->dlg_hid_ctx, ctx->wexplanation, str_value, re_wrap(pcb_strdup(v->explanation), 32)); @@ -175,7 +177,7 @@ pcb_xform_t xform; int old_termlab, g; static const char *offend_color[] = {"#ff0000", "#0000ff"}; - pcb_view_t *v = pcb_view_by_uid(&ctx->drc, ctx->selected); + pcb_view_t *v = pcb_view_by_uid(ctx->lst, ctx->selected); size_t n; void **p; @@ -323,7 +325,8 @@ pcb_dlg_drc(&drc_gui_ctx, "DRC violations"); } - pcb_drc_all(&drc_gui_ctx.drc); + pcb_drc_all(); + drc_gui_ctx.lst = &pcb_drc_lst; view2dlg(&drc_gui_ctx); return 0;