Index: trunk/src/data.c =================================================================== --- trunk/src/data.c (revision 14088) +++ trunk/src/data.c (revision 14089) @@ -645,21 +645,32 @@ pcb_r_dir_t pcb_data_r_search(pcb_data_t *data, pcb_objtype_t types, const pcb_box_t *starting_region, pcb_r_dir_t (*region_in_search) (const pcb_box_t *region, void *cl), pcb_r_dir_t (*rectangle_in_region) (const pcb_box_t *box, void *cl), - void *closure, int *num_found) + void *closure, int *num_found, pcb_bool vis_only) { pcb_layer_id_t lid; pcb_r_dir_t res = 0; - if (types & PCB_OBJ_VIA) rsearch(data->via_tree); - if (types & PCB_OBJ_RAT) rsearch(data->rat_tree); - if (types & PCB_OBJ_PIN) rsearch(data->pin_tree); - if (types & PCB_OBJ_PAD) rsearch(data->pad_tree); + if (!vis_only || PCB->ViaOn) + if (types & PCB_OBJ_VIA) rsearch(data->via_tree); + + if (!vis_only || PCB->RatOn) + if (types & PCB_OBJ_RAT) rsearch(data->rat_tree); + + if (!vis_only || PCB->PinOn) { + if (types & PCB_OBJ_PIN) rsearch(data->pin_tree); + if (types & PCB_OBJ_PAD) rsearch(data->pad_tree); + } if (types & PCB_OBJ_PSTK) rsearch(data->padstack_tree); - if (types & PCB_OBJ_SUBC) rsearch(data->subc_tree); + if (!vis_only || PCB->SubcOn) + if (types & PCB_OBJ_SUBC) rsearch(data->subc_tree); for(lid = 0; lid < data->LayerN; lid++) { pcb_layer_t *ly = data->Layer + lid; + + if (vis_only && (!ly->meta.real.vis)) + continue; + if (types & PCB_OBJ_LINE) rsearch(ly->line_tree); if (types & PCB_OBJ_TEXT) rsearch(ly->text_tree); if (types & PCB_OBJ_POLY) rsearch(ly->polygon_tree); Index: trunk/src/data.h =================================================================== --- trunk/src/data.h (revision 14088) +++ trunk/src/data.h (revision 14089) @@ -175,7 +175,7 @@ pcb_r_dir_t pcb_data_r_search(pcb_data_t *data, pcb_objtype_t types, const pcb_box_t *starting_region, pcb_r_dir_t (*region_in_search) (const pcb_box_t *region, void *cl), pcb_r_dir_t (*rectangle_in_region) (const pcb_box_t *box, void *cl), - void *closure, int *num_found); + void *closure, int *num_found, pcb_bool vis_only); /* Either pcb->data or the subcircuit's data if PCB is a subc (footprint edit mode) */ #define PCB_REAL_DATA(pcb) \ Index: trunk/src/select.c =================================================================== --- trunk/src/select.c (revision 14088) +++ trunk/src/select.c (revision 14089) @@ -571,7 +571,7 @@ * Flag determines if the block is to be selected or unselected * returns pcb_true if the state of any object has changed */ -pcb_bool pcb_select_block(pcb_board_t *pcb, pcb_box_t *Box, pcb_bool flag) +pcb_bool pcb_select_block(pcb_board_t *pcb, pcb_box_t *Box, pcb_bool flag, pcb_bool vis_only) { select_ctx_t ctx; @@ -582,7 +582,7 @@ fix_box_dir(Box, 1); - return pcb_data_r_search(pcb->Data, PCB_OBJ_ANY, Box, NULL, pcb_select_block_cb, &ctx, NULL) == PCB_R_DIR_FOUND_CONTINUE; + return pcb_data_r_search(pcb->Data, PCB_OBJ_ANY, Box, NULL, pcb_select_block_cb, &ctx, NULL, vis_only) == PCB_R_DIR_FOUND_CONTINUE; } /* ---------------------------------------------------------------------- Index: trunk/src/select.h =================================================================== --- trunk/src/select.h (revision 14088) +++ trunk/src/select.h (revision 14089) @@ -37,7 +37,7 @@ PCB_TYPE_PIN | PCB_TYPE_PAD | PCB_TYPE_PSTK | PCB_TYPE_ELEMENT_NAME | PCB_TYPE_RATLINE | PCB_TYPE_ARC) pcb_bool pcb_select_object(pcb_board_t *pcb); -pcb_bool pcb_select_block(pcb_board_t *pcb, pcb_box_t *, pcb_bool); +pcb_bool pcb_select_block(pcb_board_t *pcb, pcb_box_t *Box, pcb_bool flag, pcb_bool vis_only); long int *pcb_list_block(pcb_board_t *pcb, pcb_box_t *Box, int *len); pcb_bool pcb_select_connection(pcb_board_t *pcb, pcb_bool); Index: trunk/src/select_act.c =================================================================== --- trunk/src/select_act.c (revision 14088) +++ trunk/src/select_act.c (revision 14089) @@ -192,7 +192,7 @@ box.Y2 = MAX(pcb_crosshair.AttachedBox.Point1.Y, pcb_crosshair.AttachedBox.Point2.Y); pcb_notify_crosshair_change(pcb_false); pcb_tool_notify_block(); - if (pcb_crosshair.AttachedBox.State == PCB_CH_STATE_THIRD && pcb_select_block(PCB, &box, pcb_true)) { + if (pcb_crosshair.AttachedBox.State == PCB_CH_STATE_THIRD && pcb_select_block(PCB, &box, pcb_true, pcb_true)) { pcb_board_set_changed_flag(pcb_true); pcb_crosshair.AttachedBox.State = PCB_CH_STATE_FIRST; } @@ -200,7 +200,7 @@ break; } - /* select all visible objects */ + /* select all visible(?) objects */ case F_All: { pcb_box_t box; @@ -209,7 +209,7 @@ box.Y1 = -PCB_MAX_COORD; box.X2 = PCB_MAX_COORD; box.Y2 = PCB_MAX_COORD; - if (pcb_select_block(PCB, &box, pcb_true)) + if (pcb_select_block(PCB, &box, pcb_true, pcb_true)) pcb_board_set_changed_flag(pcb_true); break; } @@ -363,7 +363,7 @@ box.Y2 = MAX(pcb_crosshair.AttachedBox.Point1.Y, pcb_crosshair.AttachedBox.Point2.Y); pcb_notify_crosshair_change(pcb_false); pcb_tool_notify_block(); - if (pcb_crosshair.AttachedBox.State == PCB_CH_STATE_THIRD && pcb_select_block(PCB, &box, pcb_false)) { + if (pcb_crosshair.AttachedBox.State == PCB_CH_STATE_THIRD && pcb_select_block(PCB, &box, pcb_false, pcb_true)) { pcb_board_set_changed_flag(pcb_true); pcb_crosshair.AttachedBox.State = PCB_CH_STATE_FIRST; } @@ -380,7 +380,7 @@ box.Y1 = -PCB_MAX_COORD; box.X2 = PCB_MAX_COORD; box.Y2 = PCB_MAX_COORD; - if (pcb_select_block(PCB, &box, pcb_false)) + if (pcb_select_block(PCB, &box, pcb_false, pcb_false)) pcb_board_set_changed_flag(pcb_true); break; } Index: trunk/src/tool_arrow.c =================================================================== --- trunk/src/tool_arrow.c (revision 14088) +++ trunk/src/tool_arrow.c (revision 14089) @@ -103,7 +103,7 @@ box.X2 = PCB_MAX_COORD; box.Y2 = PCB_MAX_COORD; /* unselect first if shift key not down */ - if (!pcb_gui->shift_is_pressed() && pcb_select_block(PCB, &box, pcb_false)) + if (!pcb_gui->shift_is_pressed() && pcb_select_block(PCB, &box, pcb_false, pcb_false)) pcb_board_set_changed_flag(pcb_true); pcb_tool_notify_block(); pcb_crosshair.AttachedBox.Point1.X = pcb_tool_note.X; @@ -159,7 +159,7 @@ pcb_undo_save_serial(); /* unselect first if shift key not down */ if (!pcb_gui->shift_is_pressed()) { - if (pcb_select_block(PCB, &box, pcb_false)) + if (pcb_select_block(PCB, &box, pcb_false, pcb_false)) pcb_board_set_changed_flag(pcb_true); if (pcb_tool_note.Moving) { pcb_tool_note.Moving = 0; @@ -184,7 +184,7 @@ box.Y2 = pcb_crosshair.AttachedBox.Point2.Y; pcb_undo_restore_serial(); - if (pcb_select_block(PCB, &box, pcb_true)) + if (pcb_select_block(PCB, &box, pcb_true, pcb_true)) pcb_board_set_changed_flag(pcb_true); else if (pcb_bumped) pcb_undo_inc_serial();