Index: trunk/src/drc.c =================================================================== --- trunk/src/drc.c (revision 33026) +++ trunk/src/drc.c (revision 33027) @@ -52,7 +52,7 @@ -void pcb_drc_set_data(pcb_view_t *violation, const rnd_coord_t *measured_value, rnd_coord_t required_value) +void pcb_drc_set_data(pcb_view_t *violation, const fgw_arg_t *measured_value, fgw_arg_t required_value) { violation->data_type = PCB_VIEW_DRC; violation->data.drc.required_value = required_value; @@ -100,9 +100,9 @@ rnd_printf("%m+within %$m4\n", rnd_conf.editor.grid_unit->allow, v->bbox.X1, v->bbox.Y1, v->bbox.X2, v->bbox.Y2); if (v->have_xy) rnd_printf("%m+at %$m2\n", rnd_conf.editor.grid_unit->allow, v->x, v->y); - rnd_printf("%m+required value %$mS\n", rnd_conf.editor.grid_unit->allow, v->data.drc.required_value); + rnd_printf("%m+required value %mw\n", rnd_conf.editor.grid_unit->allow, v->data.drc.required_value); if (v->data.drc.have_measured) - rnd_printf("%m+measured value %$mS\n", rnd_conf.editor.grid_unit->allow, v->data.drc.measured_value); + rnd_printf("%m+measured value %mw\n", rnd_conf.editor.grid_unit->allow, v->data.drc.measured_value); printf("%s\n\n", v->description); } } @@ -114,9 +114,9 @@ rnd_message(RND_MSG_INFO, "%m+within %$m4\n", rnd_conf.editor.grid_unit->allow, v->bbox.X1, v->bbox.Y1, v->bbox.X2, v->bbox.Y2); if (v->have_xy) rnd_message(RND_MSG_INFO, "%m+at %$m2\n", rnd_conf.editor.grid_unit->allow, v->x, v->y); - rnd_printf("%m+required value %$mS\n", rnd_conf.editor.grid_unit->allow, v->data.drc.required_value); + rnd_printf("%m+required value %$mw\n", rnd_conf.editor.grid_unit->allow, v->data.drc.required_value); if (v->data.drc.have_measured) - rnd_message(RND_MSG_INFO, "%m+measured value %$mS\n", rnd_conf.editor.grid_unit->allow, v->data.drc.measured_value); + rnd_message(RND_MSG_INFO, "%m+measured value %$mw\n", rnd_conf.editor.grid_unit->allow, v->data.drc.measured_value); rnd_message(RND_MSG_INFO, "%s\n\n", v->description); } } @@ -131,9 +131,9 @@ rnd_printf("B%mm %mm %mm %mm mm\n", v->bbox.X1, v->bbox.Y1, v->bbox.X2, v->bbox.Y2); if (v->have_xy) rnd_printf("A%mm %mm mm\n", v->x, v->y); - rnd_printf("R%$mm\n", v->data.drc.required_value); + rnd_printf("R%$mw\n", v->data.drc.required_value); if (v->data.drc.have_measured) - rnd_printf("M%$mm\n", v->data.drc.measured_value); + rnd_printf("M%$mw\n", v->data.drc.measured_value); for(s = v->description; *s != '\0'; s++) if (*s == '\n') *s = ' '; Index: trunk/src/drc.h =================================================================== --- trunk/src/drc.h (revision 33026) +++ trunk/src/drc.h (revision 33027) @@ -43,8 +43,9 @@ gdl_elem_t link; } pcb_drc_impl_t; -/* Load drc-specific fields of a view; if measured_value is NULL, it is not available */ -void pcb_drc_set_data(pcb_view_t *violation, const rnd_coord_t *measured_value, rnd_coord_t required_value); +/* Load drc-specific fields of a view; if measured_value is NULL, it + is not available. Values should be long, double or coord */ +void pcb_drc_set_data(pcb_view_t *violation, const fgw_arg_t *measured_value, fgw_arg_t required_value); extern pcb_view_list_t pcb_drc_lst; Index: trunk/src/view.c =================================================================== --- trunk/src/view.c (revision 33026) +++ trunk/src/view.c (revision 33027) @@ -276,9 +276,9 @@ case PCB_VIEW_DRC: rnd_append_printf(dst, "%s data_type = drc\n", prefix); rnd_append_printf(dst, "%s ha:data {\n", prefix); - rnd_append_printf(dst, "%s required_value = %.08$$mm\n", prefix, v->data.drc.required_value); + rnd_append_printf(dst, "%s required_value = %mw\n", prefix, v->data.drc.required_value); if (v->data.drc.have_measured) - rnd_append_printf(dst, "%s measured_value = %.08$$mm\n", prefix, v->data.drc.measured_value); + rnd_append_printf(dst, "%s measured_value = %mw\n", prefix, v->data.drc.measured_value); rnd_append_printf(dst, "%s }\n", prefix); break; } @@ -385,6 +385,40 @@ } } +static fgw_arg_t load_drc_val(const char *val) +{ + const rnd_unit_t *u; + double d; + fgw_arg_t a; + char *end; + + if (rnd_get_value_unit(val, NULL, 1, &d, &u)) { + a.type = FGW_COORD; + fgw_coord(&a) = d; + return a; + } + + if (strchr(val, '.')) { + d = strtod(val, &end); + if (*end == '\0') { + a.type = FGW_DOUBLE; + a.val.nat_double = d; + return a; + } + } + else { + long l = strtol(val, &end, 10); + if (*end == '\0') { + a.type = FGW_LONG; + a.val.nat_long = l; + return a; + } + } + + a.type = FGW_VOID; + return a; +} + pcb_view_t *pcb_view_load_next(void *load_ctx, pcb_view_t *dst) { load_ctx_t *ctx = load_ctx; @@ -508,13 +542,14 @@ if ((n != NULL) && (n->type == LHT_HASH)) { c = lht_dom_hash_get(n, "required_value"); if ((c != NULL) && (c->type == LHT_TEXT)) { - dst->data.drc.required_value = rnd_get_value(c->data.text.value, NULL, NULL, &succ); + dst->data.drc.required_value = load_drc_val(c->data.text.value); + if (!succ) rnd_message(RND_MSG_ERROR, LOADERR "invalid drc required value: '%s'\n", c->data.text.value); } c = lht_dom_hash_get(n, "measured_value"); if ((c != NULL) && (c->type == LHT_TEXT)) { - dst->data.drc.measured_value = rnd_get_value(c->data.text.value, NULL, NULL, &succ); + dst->data.drc.measured_value = load_drc_val(c->data.text.value); if (succ) dst->data.drc.have_measured = 1; else Index: trunk/src/view.h =================================================================== --- trunk/src/view.h (revision 33026) +++ trunk/src/view.h (revision 33027) @@ -31,6 +31,7 @@ #include #include #include +#include #include "global_typedefs.h" #include #include "idpath.h" @@ -69,8 +70,8 @@ union { struct { unsigned have_measured:1; - rnd_coord_t measured_value; - rnd_coord_t required_value; + fgw_arg_t measured_value; /* should be long, double or coord */ + fgw_arg_t required_value; /* should be long, double or coord */ } drc; } data; Index: trunk/src_plugins/dialogs/dlg_view.c =================================================================== --- trunk/src_plugins/dialogs/dlg_view.c (revision 33026) +++ trunk/src_plugins/dialogs/dlg_view.c (revision 33027) @@ -175,9 +175,9 @@ break; case PCB_VIEW_DRC: if (v->data.drc.have_measured) - RND_DAD_SET_VALUE(ctx->dlg_hid_ctx, ctx->wmeasure, str, rnd_strdup_printf("DRC: %m+required: %$ms\nmeasured: %$ms\n", rnd_conf.editor.grid_unit->allow, v->data.drc.required_value, v->data.drc.measured_value)); + RND_DAD_SET_VALUE(ctx->dlg_hid_ctx, ctx->wmeasure, str, rnd_strdup_printf("DRC: %m+required: %$mw\nmeasured: %$mw\n", rnd_conf.editor.grid_unit->allow, v->data.drc.required_value, v->data.drc.measured_value)); else - RND_DAD_SET_VALUE(ctx->dlg_hid_ctx, ctx->wmeasure, str, rnd_strdup_printf("DRC: %m+required: %$ms\n", rnd_conf.editor.grid_unit->allow, v->data.drc.required_value)); + RND_DAD_SET_VALUE(ctx->dlg_hid_ctx, ctx->wmeasure, str, rnd_strdup_printf("DRC: %m+required: %$mw\n", rnd_conf.editor.grid_unit->allow, v->data.drc.required_value)); break; } } Index: trunk/src_plugins/drc_query/drc_query.c =================================================================== --- trunk/src_plugins/drc_query/drc_query.c (revision 33026) +++ trunk/src_plugins/drc_query/drc_query.c (revision 33027) @@ -80,20 +80,37 @@ long hit_cnt; } drc_qry_ctx_t; -rnd_coord_t load_obj_const(pcb_obj_qry_const_t *cnst) +static fgw_arg_t load_obj_const(pcb_obj_qry_const_t *cnst) { + fgw_arg_t a; + switch(cnst->val.type) { - case PCBQ_VT_COORD: return cnst->val.data.crd; - case PCBQ_VT_LONG: return cnst->val.data.lng; - case PCBQ_VT_DOUBLE: return cnst->val.data.dbl; - + case PCBQ_VT_COORD: + a.type = FGW_COORD; + fgw_coord(&a) = cnst->val.data.crd; + return a; + case PCBQ_VT_LONG: + a.type = FGW_LONG; + a.val.nat_long = cnst->val.data.lng; + return a; + case PCBQ_VT_DOUBLE: + a.type = FGW_DOUBLE; + a.val.nat_double = cnst->val.data.dbl; + return a; + + case PCBQ_VT_STRING: + a.type = FGW_STR | FGW_DYN; + a.val.str = rnd_strdup(cnst->val.data.str); + return a; + case PCBQ_VT_VOID: case PCBQ_VT_OBJ: case PCBQ_VT_LST: - case PCBQ_VT_STRING: break; } - return 0; + + a.type = FGW_VOID; + return a; } void drc_qry_exec_cb(void *user_ctx, pcb_qry_val_t *res, pcb_any_obj_t *current) @@ -117,7 +134,7 @@ violation = pcb_view_new(&qctx->pcb->hidlib, qctx->type, qctx->title, qctx->desc); if (res->type == PCBQ_VT_LST) { int i; - rnd_coord_t *expv = NULL, expv_, *mesv = NULL, mesv_; + fgw_arg_t *expv = NULL, expv_, *mesv = NULL, mesv_; for(i = 0; i < res->data.lst.used-1; i+=2) { pcb_any_obj_t *cmd = res->data.lst.array[i], *obj = res->data.lst.array[i+1]; pcb_qry_drc_ctrl_t ctrl = pcb_qry_drc_ctrl_decode(cmd); Index: trunk/src_plugins/query/fnc_list.c =================================================================== --- trunk/src_plugins/query/fnc_list.c (revision 33026) +++ trunk/src_plugins/query/fnc_list.c (revision 33027) @@ -60,9 +60,7 @@ break; case PCB_QRY_DRC_EXPECT: case PCB_QRY_DRC_MEASURE: - PCB_QRY_ARG_CONV_TO_COORD(dummy, val, return -1); - (void)dummy; - break; + break; /* accept as is */ case PCB_QRY_DRC_TEXT: break; /* accept anything */ default: @@ -95,8 +93,8 @@ } else if ((ctrl == PCB_QRY_DRC_EXPECT) || (ctrl == PCB_QRY_DRC_MEASURE)) { tmp = malloc(sizeof(pcb_obj_qry_const_t)); - tmp->val.type = PCBQ_VT_COORD; - PCB_QRY_ARG_CONV_TO_COORD(tmp->val.data.crd, val, ;); /* can't fail, already checked above */ + tmp->val = *val; + tmp->type = PCB_OBJ_QRY_CONST; vtp0_append(&res->data.lst, argv[n].data.obj); vtp0_append(&res->data.lst, tmp); vtp0_append(&ectx->autofree, tmp);