Index: trunk/src_plugins/query/query_access.c =================================================================== --- trunk/src_plugins/query/query_access.c (revision 17020) +++ trunk/src_plugins/query/query_access.c (revision 17021) @@ -233,6 +233,50 @@ lyc = _f_->data.lytc.lyc; \ } while(0) +#define COMMON_FIELDS(obj, fh1, fld, res) \ +do { \ + if (fh1 == query_fields_a) { \ + const char *s2; \ + fld2str_req(s2, fld, 1); \ + if (!PCB_OBJ_IS_CLASS(obj->type, PCB_OBJ_CLASS_OBJ)) \ + PCB_QRY_RET_INV(res); \ + PCB_QRY_RET_STR(res, pcb_attribute_get(&obj->Attributes, s2)); \ + } \ + \ + if (fh1 == query_fields_ID) { \ + if (!PCB_OBJ_IS_CLASS(obj->type, PCB_OBJ_CLASS_OBJ)) \ + PCB_QRY_RET_INV(res); \ + PCB_QRY_RET_INT(res, obj->ID); \ + } \ + \ + if (fh1 == query_fields_bbox) { \ + query_fields_keys_t fh2; \ + \ + if (!PCB_OBJ_IS_CLASS(obj->type, PCB_OBJ_CLASS_OBJ)) \ + PCB_QRY_RET_INV(res); \ + \ + fld2hash_req(fh2, fld, 1); \ + switch(fh2) { \ + case query_fields_x1: PCB_QRY_RET_INT(res, obj->BoundingBox.X1); \ + case query_fields_y1: PCB_QRY_RET_INT(res, obj->BoundingBox.Y1); \ + case query_fields_x2: PCB_QRY_RET_INT(res, obj->BoundingBox.X2); \ + case query_fields_y2: PCB_QRY_RET_INT(res, obj->BoundingBox.Y2); \ + case query_fields_width: PCB_QRY_RET_INT(res, obj->BoundingBox.X2 - obj->BoundingBox.X1); \ + case query_fields_height: PCB_QRY_RET_INT(res, obj->BoundingBox.Y2 - obj->BoundingBox.Y1); \ + case query_fields_area: PCB_QRY_RET_DBL(res, (double)(obj->BoundingBox.Y2 - obj->BoundingBox.Y1) * (double)(obj->BoundingBox.X2 - obj->BoundingBox.X1)); \ + default:; \ + } \ + PCB_QRY_RET_INV(res); \ + } \ + \ + if (fh1 == query_fields_type) \ + PCB_QRY_RET_INT(res, obj->type); \ + \ + if (fh1 == query_fields_subc) \ + return field_subc_obj(obj, fld->next, res); \ + \ +} while(0) + static int field_layer(pcb_any_obj_t *obj, pcb_qry_node_t *fld, pcb_qry_val_t *res) { pcb_layer_t *l = (pcb_layer_t *)obj; @@ -608,9 +652,17 @@ PCB_QRY_RET_INV(res); } +static int field_subc_obj(pcb_any_obj_t *obj, pcb_qry_node_t *fld, pcb_qry_val_t *res); + static int field_subc_from_ptr(pcb_subc_t *s, pcb_qry_node_t *fld, pcb_qry_val_t *res) { - return field_subc((pcb_any_obj_t *)s, fld, res); + pcb_any_obj_t *obj = (pcb_any_obj_t *)s; + query_fields_keys_t fh1; + + fld2hash_req(fh1, fld, 0); + COMMON_FIELDS(obj, fh1, fld, res); + + return field_subc(obj, fld, res); } static int field_subc_obj(pcb_any_obj_t *obj, pcb_qry_node_t *fld, pcb_qry_val_t *res) @@ -647,46 +699,8 @@ fld2hash_req(fh1, fld, 0); - if (fh1 == query_fields_a) { - const char *s2; - fld2str_req(s2, fld, 1); - if (!PCB_OBJ_IS_CLASS(obj->type, PCB_OBJ_CLASS_OBJ)) - PCB_QRY_RET_INV(res); - PCB_QRY_RET_STR(res, pcb_attribute_get(&obj->Attributes, s2)); - } + COMMON_FIELDS(obj, fh1, fld, res); - if (fh1 == query_fields_ID) { - if (!PCB_OBJ_IS_CLASS(obj->type, PCB_OBJ_CLASS_OBJ)) - PCB_QRY_RET_INV(res); - PCB_QRY_RET_INT(res, obj->ID); - } - - if (fh1 == query_fields_bbox) { - query_fields_keys_t fh2; - - if (!PCB_OBJ_IS_CLASS(obj->type, PCB_OBJ_CLASS_OBJ)) - PCB_QRY_RET_INV(res); - - fld2hash_req(fh2, fld, 1); - switch(fh2) { - case query_fields_x1: PCB_QRY_RET_INT(res, obj->BoundingBox.X1); - case query_fields_y1: PCB_QRY_RET_INT(res, obj->BoundingBox.Y1); - case query_fields_x2: PCB_QRY_RET_INT(res, obj->BoundingBox.X2); - case query_fields_y2: PCB_QRY_RET_INT(res, obj->BoundingBox.Y2); - case query_fields_width: PCB_QRY_RET_INT(res, obj->BoundingBox.X2 - obj->BoundingBox.X1); - case query_fields_height: PCB_QRY_RET_INT(res, obj->BoundingBox.Y2 - obj->BoundingBox.Y1); - case query_fields_area: PCB_QRY_RET_DBL(res, (double)(obj->BoundingBox.Y2 - obj->BoundingBox.Y1) * (double)(obj->BoundingBox.X2 - obj->BoundingBox.X1)); - default:; - } - PCB_QRY_RET_INV(res); - } - - if (fh1 == query_fields_type) - PCB_QRY_RET_INT(res, obj->type); - - if (fh1 == query_fields_subc) - return field_subc_obj(obj, fld->next, res); - switch(obj->type) { /* case PCB_OBJ_POINT: return field_point(obj, fld, res);*/ case PCB_OBJ_LINE: return field_line(obj, fld, res);