Index: dlg.c =================================================================== --- dlg.c (revision 31471) +++ dlg.c (revision 31472) @@ -506,6 +506,26 @@ drc_rlist_pcb2dlg(); /* for the run time */ } +static void rlist_btn_export_cb(void *hid_ctx, void *caller_data, rnd_hid_attribute_t *attr_inp) +{ + drc_rlist_ctx_t *ctx = caller_data; + rnd_hid_row_t *row = rnd_dad_tree_get_selected(&(ctx->dlg[ctx->wrlist])); + pcb_board_t *pcb = (pcb_board_t *)rnd_gui->get_dad_hidlib(hid_ctx); + + if (row == NULL) { + rnd_message(RND_MSG_ERROR, "Select a rule first\n"); + return; + } + + rnd_actionva(&pcb->hidlib, "DrcQueryExport", row->cell[0], NULL); +} + +static void rlist_btn_import_cb(void *hid_ctx, void *caller_data, rnd_hid_attribute_t *attr_inp) +{ + +} + + static void rlist_select(rnd_hid_attribute_t *attrib, void *hid_ctx, rnd_hid_row_t *row) { rnd_hid_attr_val_t hv; @@ -710,6 +730,10 @@ RND_DAD_CHANGE_CB(drc_rlist_ctx.dlg, rlist_btn_edit_cb); RND_DAD_BUTTON(drc_rlist_ctx.dlg, "Toggle disable"); RND_DAD_CHANGE_CB(drc_rlist_ctx.dlg, rlist_btn_toggle_cb); + RND_DAD_BUTTON(drc_rlist_ctx.dlg, "Export..."); + RND_DAD_CHANGE_CB(drc_rlist_ctx.dlg, rlist_btn_export_cb); + RND_DAD_BUTTON(drc_rlist_ctx.dlg, "Import..."); + RND_DAD_CHANGE_CB(drc_rlist_ctx.dlg, rlist_btn_import_cb); RND_DAD_END(drc_rlist_ctx.dlg); RND_DAD_END(drc_rlist_ctx.dlg); Index: drc_query.c =================================================================== --- drc_query.c (revision 31471) +++ drc_query.c (revision 31472) @@ -648,6 +648,56 @@ return 0; } +static const char pcb_acts_DrcQueryExport[] = "DrcQueryExport(ruleID, [filename], [format])\n"; +static const char pcb_acth_DrcQueryExport[] = "Export a rule and related definitions to a file."; +static fgw_error_t pcb_act_DrcQueryExport(fgw_arg_t *res, int argc, fgw_arg_t *argv) +{ + int ires = 0; + const char *id, *fn = NULL, *fmt = "tEDAx"; + char *autofree = NULL; + rnd_hidlib_t *hl = RND_ACT_HIDLIB; + const char *pat_tdx[] = {".tdx", NULL}; + const char *pat_lht[] = {".lht", NULL}; + const rnd_hid_fsd_filter_t flt[] = { + {"tEDAx", "tEDAx", pat_tdx}, + {"lihata", "lihata", pat_lht}, + {NULL, NULL, NULL} + }; + + RND_ACT_CONVARG(1, FGW_STR, DrcQueryExport, id = argv[1].val.str); + RND_ACT_MAY_CONVARG(2, FGW_STR, DrcQueryExport, fn = argv[2].val.str); + RND_ACT_MAY_CONVARG(3, FGW_STR, DrcQueryExport, fmt = argv[3].val.str); + + if (fn == NULL) { + const char *ext = ".tdx", *sep; + char *fnid = rnd_concat(id, ext, NULL); +TODO("cleanup: fix format selection: generalize dlg_loadsave.c's subfmt code"); + fn = autofree = rnd_gui->fileselect(rnd_gui, "Export drc_query rule", "Export a drc_query rule and related definitions", + fnid, ext, flt, "export_drc_query", 0, NULL); + free(fnid); + if (fn == NULL) + return -1; + + sep = strrchr(fn, '.'); + if (sep != NULL) { + sep++; + switch(*sep) { + case 't': case 'T': fmt = "tEDAx"; break; + case 'l': case 'L': fmt = "lihata"; break; + } + } + } + + switch(*fmt) { + case 't': case 'T': ires = rnd_actionva(hl, "savetedax", "drc_query", fn, id, NULL); break; + default: rnd_message(RND_MSG_ERROR, "Can not save in format '%s'\n", fmt); ires = -1; break; + } + + free(autofree); + RND_ACT_IRES(ires); + return 0; +} + #include "dlg.c" static pcb_drc_impl_t drc_query_impl = {"drc_query", "query() based DRC", "drcquerylistrules"}; @@ -656,7 +706,8 @@ {"DrcQueryListRules", pcb_act_DrcQueryListRules, pcb_acth_DrcQueryListRules, pcb_acts_DrcQueryListRules}, {"DrcQueryEditRule", pcb_act_DrcQueryEditRule, pcb_acth_DrcQueryEditRule, pcb_acts_DrcQueryEditRule}, {"DrcQueryRuleMod", pcb_act_DrcQueryRuleMod, pcb_acth_DrcQueryRuleMod, pcb_acts_DrcQueryRuleMod}, - {"DrcQueryDefMod", pcb_act_DrcQueryDefMod, pcb_acth_DrcQueryDefMod, pcb_acts_DrcQueryDefMod} + {"DrcQueryDefMod", pcb_act_DrcQueryDefMod, pcb_acth_DrcQueryDefMod, pcb_acts_DrcQueryDefMod}, + {"DrcQueryExport", pcb_act_DrcQueryExport, pcb_acth_DrcQueryExport, pcb_acts_DrcQueryExport} }; int pplg_check_ver_drc_query(int ver_needed) { return 0; }