Index: trunk/src/data.c =================================================================== --- trunk/src/data.c (revision 12128) +++ trunk/src/data.c (revision 12129) @@ -30,6 +30,7 @@ #include "board.h" #include "data.h" +#include "data_list.h" #include "rtree.h" #include "list_common.h" #include "obj_all.h" @@ -490,3 +491,30 @@ } PCB_ENDALL_LOOP; } + +void pcb_data_list_by_flag(pcb_data_t *data, vtp0_t *dst, pcb_objtype_t type, unsigned long mask) +{ + if (type & PCB_OBJ_VIA) PCB_VIA_LOOP(data); { + if (PCB_FLAG_TEST(mask, via)) vtp0_append(dst, via); + } PCB_END_LOOP; + if (type & PCB_OBJ_ELEMENT) PCB_ELEMENT_LOOP(data); { + if (PCB_FLAG_TEST(mask, element)) vtp0_append(dst, element); + } PCB_END_LOOP; + if (type & PCB_OBJ_SUBC) PCB_SUBC_LOOP(data); { + if (PCB_FLAG_TEST(mask, subc)) vtp0_append(dst, subc); + } PCB_END_LOOP; + if (type & PCB_OBJ_LINE) PCB_LINE_ALL_LOOP(data); { + if (PCB_FLAG_TEST(mask, line)) vtp0_append(dst, line); + } PCB_ENDALL_LOOP; + if (type & PCB_OBJ_ARC) PCB_ARC_ALL_LOOP(data); { + if (PCB_FLAG_TEST(mask, arc)) vtp0_append(dst, arc); + } PCB_ENDALL_LOOP; + if (type & PCB_OBJ_TEXT) PCB_TEXT_ALL_LOOP(data); { + if (PCB_FLAG_TEST(mask, text)) vtp0_append(dst, text); + } PCB_ENDALL_LOOP; + if (type & PCB_OBJ_POLYGON) PCB_POLY_ALL_LOOP(data); { + if (PCB_FLAG_TEST(mask, polygon)) vtp0_append(dst, polygon); + } PCB_ENDALL_LOOP; +} + + Index: trunk/src/data_list.h =================================================================== --- trunk/src/data_list.h (nonexistent) +++ trunk/src/data_list.h (revision 12129) @@ -0,0 +1,33 @@ +/* + * COPYRIGHT + * + * pcb-rnd, interactive printed circuit board design + * Copyright (C) 2017 Tibor 'Igor2' Palinkas + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#ifndef PCB_DATA_LIST_H +#define PCB_DATA_LIST_H + +#include +#include "data.h" + +/* append objects or type, with flags matching mask to dst; pointer are + valid only until the first change to data */ +void pcb_data_list_by_flag(pcb_data_t *data, vtp0_t *dst, pcb_objtype_t type, unsigned long mask); + +#endif