Index: trunk/src/data.c =================================================================== --- trunk/src/data.c (revision 21808) +++ trunk/src/data.c (revision 21809) @@ -799,7 +799,7 @@ #include "obj_arc_draw.h" #include "obj_line_draw.h" #include "conf_core.h" -void pcb_data_clear_flag(pcb_data_t *data, unsigned long flag, int redraw) +void pcb_data_clear_obj_flag(pcb_data_t *data, pcb_objtype_t tmask, unsigned long flag, int redraw) { pcb_rtree_it_t it; pcb_box_t *n; @@ -808,54 +808,75 @@ conf_core.temp.rat_warn = pcb_false; - for(n = pcb_r_first(data->padstack_tree, &it); n != NULL; n = pcb_r_next(&it)) { - if (PCB_FLAG_TEST(flag, (pcb_any_obj_t *)n)) { - PCB_FLAG_CLEAR(flag, (pcb_any_obj_t *)n); - if (redraw) - pcb_pstk_invalidate_draw((pcb_pstk_t *)n); - } - } - pcb_r_end(&it); - - for(li = 0, l = data->Layer; li < data->LayerN; li++,l++) { - for(n = pcb_r_first(l->line_tree, &it); n != NULL; n = pcb_r_next(&it)) { + if (tmask & PCB_OBJ_PSTK) { + for(n = pcb_r_first(data->padstack_tree, &it); n != NULL; n = pcb_r_next(&it)) { if (PCB_FLAG_TEST(flag, (pcb_any_obj_t *)n)) { PCB_FLAG_CLEAR(flag, (pcb_any_obj_t *)n); if (redraw) - pcb_line_invalidate_draw(l, (pcb_line_t *)n); + pcb_pstk_invalidate_draw((pcb_pstk_t *)n); } } pcb_r_end(&it); + } - for(n = pcb_r_first(l->arc_tree, &it); n != NULL; n = pcb_r_next(&it)) { - if (PCB_FLAG_TEST(flag, (pcb_any_obj_t *)n)) { - PCB_FLAG_CLEAR(flag, (pcb_any_obj_t *)n); - if (redraw) - pcb_arc_invalidate_draw(l, (pcb_arc_t *)n); + TODO("find: rat") + + if (tmask & (PCB_OBJ_LINE | PCB_OBJ_ARC | PCB_OBJ_POLY | PCB_OBJ_TEXT) == 0) + return; /* do not run the layer loop if no layer object is requested */ + + for(li = 0, l = data->Layer; li < data->LayerN; li++,l++) { + if (tmask & PCB_OBJ_LINE) { + for(n = pcb_r_first(l->line_tree, &it); n != NULL; n = pcb_r_next(&it)) { + if (PCB_FLAG_TEST(flag, (pcb_any_obj_t *)n)) { + PCB_FLAG_CLEAR(flag, (pcb_any_obj_t *)n); + if (redraw) + pcb_line_invalidate_draw(l, (pcb_line_t *)n); + } } + pcb_r_end(&it); } - pcb_r_end(&it); - for(n = pcb_r_first(l->polygon_tree, &it); n != NULL; n = pcb_r_next(&it)) { - if (PCB_FLAG_TEST(flag, (pcb_any_obj_t *)n)) { - PCB_FLAG_CLEAR(flag, (pcb_any_obj_t *)n); - if (redraw) - pcb_poly_invalidate_draw(l, (pcb_poly_t *)n); + if (tmask & PCB_OBJ_ARC) { + for(n = pcb_r_first(l->arc_tree, &it); n != NULL; n = pcb_r_next(&it)) { + if (PCB_FLAG_TEST(flag, (pcb_any_obj_t *)n)) { + PCB_FLAG_CLEAR(flag, (pcb_any_obj_t *)n); + if (redraw) + pcb_arc_invalidate_draw(l, (pcb_arc_t *)n); + } } + pcb_r_end(&it); } - pcb_r_end(&it); - for(n = pcb_r_first(l->text_tree, &it); n != NULL; n = pcb_r_next(&it)) { - if (PCB_FLAG_TEST(flag, (pcb_any_obj_t *)n)) { - PCB_FLAG_CLEAR(flag, (pcb_any_obj_t *)n); - if (redraw) - pcb_text_invalidate_draw(l, (pcb_text_t *)n); + if (tmask & PCB_OBJ_POLY) { + for(n = pcb_r_first(l->polygon_tree, &it); n != NULL; n = pcb_r_next(&it)) { + if (PCB_FLAG_TEST(flag, (pcb_any_obj_t *)n)) { + PCB_FLAG_CLEAR(flag, (pcb_any_obj_t *)n); + if (redraw) + pcb_poly_invalidate_draw(l, (pcb_poly_t *)n); + } } + pcb_r_end(&it); } - pcb_r_end(&it); + + if (tmask & PCB_OBJ_TEXT) { + for(n = pcb_r_first(l->text_tree, &it); n != NULL; n = pcb_r_next(&it)) { + if (PCB_FLAG_TEST(flag, (pcb_any_obj_t *)n)) { + PCB_FLAG_CLEAR(flag, (pcb_any_obj_t *)n); + if (redraw) + pcb_text_invalidate_draw(l, (pcb_text_t *)n); + } + } + pcb_r_end(&it); + } } } +void pcb_data_clear_flag(pcb_data_t *data, unsigned long flag, int redraw) +{ + pcb_data_clear_obj_flag(data, PCB_OBJ_CLASS_REAL, flag, redraw); +} + + void pcb_data_dynflag_clear(pcb_data_t *data, pcb_dynf_t dynf) { pcb_rtree_it_t it; Index: trunk/src/data.h =================================================================== --- trunk/src/data.h (revision 21808) +++ trunk/src/data.h (revision 21809) @@ -216,7 +216,9 @@ /* Recursively change flags of data; how is one of pcb_change_flag_t */ void pcb_data_flag_change(pcb_data_t *data, pcb_objtype_t mask, int how, unsigned long flags); -/* Clear specific static flag from all objects */ +/* Clear specific static flag from all objects, optionally with matching + object types only. */ +void pcb_data_clear_obj_flag(pcb_data_t *data, pcb_objtype_t tmask, unsigned long flag, int redraw); void pcb_data_clear_flag(pcb_data_t *data, unsigned long flag, int redraw); /* Clear the given dyflag bit from all objects under data */