Index: fnc.c =================================================================== --- fnc.c (revision 34207) +++ fnc.c (revision 34208) @@ -166,6 +166,7 @@ pcb_qry_fnc_reg("getconf", pcb_qry_fnc_getconf); pcb_qry_fnc_reg("pstkring", fnc_pstkring); pcb_qry_fnc_reg("netlen", fnc_netlen); + pcb_qry_fnc_reg("obj_by_idpath", fnc_obj_by_idpath); pcb_qry_fnc_reg("thermal_on", fnc_thermal_on); Index: fnc_glue.c =================================================================== --- fnc_glue.c (revision 34207) +++ fnc_glue.c (revision 34208) @@ -304,3 +304,25 @@ PCB_QRY_RET_COORD(res, nl->len); } + +static int fnc_obj_by_idpath(pcb_qry_exec_t *ectx, int argc, pcb_qry_val_t *argv, pcb_qry_val_t *res) +{ + pcb_board_t *pcb = ectx->pcb; + pcb_idpath_t *path; + pcb_any_obj_t *obj; + + if ((argc != 1) || (argv[0].type != PCBQ_VT_STRING)) + return -1; + + path = pcb_str2idpath(pcb, argv[0].data.str); /* slash separated list of ids */ + if (path == NULL) + PCB_QRY_RET_INV(res); + + obj = pcb_idpath2obj_in(pcb->Data, path); + pcb_idpath_destroy(path); + + if (obj == NULL) + PCB_QRY_RET_INV(res); + + PCB_QRY_RET_OBJ(res, obj); +}