Index: trunk/src_plugins/io_pads/delay_create.c =================================================================== --- trunk/src_plugins/io_pads/delay_create.c (revision 33753) +++ trunk/src_plugins/io_pads/delay_create.c (revision 33754) @@ -37,6 +37,7 @@ #include "obj_text.h" #include "obj_line.h" #include "obj_arc.h" +#include "obj_pstk.h" #include "delay_create.h" @@ -194,6 +195,52 @@ return obj; } +pcb_dlcr_draw_t *pcb_dlcr_via_new(pcb_dlcr_t *dlcr, rnd_coord_t x, rnd_coord_t y, rnd_coord_t clearance, long id, const char *name) +{ + pcb_dlcr_draw_t *obj; + pcb_pstk_t *p; + rnd_cardinal_t i, pid = -1; + pcb_data_t *data = (dlcr->subc_begin != NULL) ? &dlcr->subc_begin->val.subc_begin.pstks : &dlcr->pstks; + + if (id >= 0) { + if (id < data->ps_protos.used) + pid = id; + } + else if (name != NULL) { + for(i = 0; i < data->ps_protos.used; i++) { + const char *pname = data->ps_protos.array[i].name; + if ((pname != NULL) && (strcmp(pname, name) == 0)) { + pid = i; + break; + } + } + } + + if (pid == -1) { + rnd_message(RND_MSG_ERROR, "pcb_dlcr_via_new(): padstack prototype not found: '%s'/%ld\n", name, id); + return NULL; /* found by neither id nor name */ + } + + obj = dlcr_new(dlcr, DLCR_OBJ); + p = &obj->val.obj.obj.pstk; + p->type = PCB_OBJ_PSTK; + p->x = x; + p->y = y; + p->proto = pid; + p->Clearance = clearance; + +TODO("why does this fail?"); +#if 0 + pcb_pstk_bbox(p); + if (dlcr->subc_begin != NULL) + rnd_box_bump_box(&dlcr->subc_begin->val.subc_begin.bbox, &p->bbox_naked); + else + rnd_box_bump_box(&dlcr->board_bbox, &p->bbox_naked); +#endif + return obj; +} + + pcb_pstk_proto_t *pcb_dlcr_pstk_proto_new(pcb_dlcr_t *dlcr) { pcb_data_t *data = (dlcr->subc_begin != NULL) ? &dlcr->subc_begin->val.subc_begin.pstks : &dlcr->pstks; @@ -251,24 +298,29 @@ static void pcb_dlcr_draw_free_obj(pcb_board_t *pcb, pcb_subc_t *subc, pcb_dlcr_t *dlcr, pcb_dlcr_draw_t *obj) { + pcb_data_t *data = (subc != NULL) ? subc->data : pcb->Data; pcb_any_obj_t *r; pcb_line_t *l = &obj->val.obj.obj.line; pcb_arc_t *a = &obj->val.obj.obj.arc; pcb_text_t *t = &obj->val.obj.obj.text; + pcb_pstk_t *p = &obj->val.obj.obj.pstk; pcb_layer_t *ly; int specd; - if (subc != NULL) { - TODO("create objects on a subc layer"); - return; - } - else - ly = pcb_dlcr_lookup_board_layer(pcb, dlcr, obj, &specd); + /* retrieve target layer for layer objects */ + if (obj->val.obj.obj.any.type != PCB_OBJ_PSTK) { + if (subc != NULL) { + TODO("create objects on a subc layer"); + return; + } + else + ly = pcb_dlcr_lookup_board_layer(pcb, dlcr, obj, &specd); - if (ly == NULL) { - if (!specd) - rnd_message(RND_MSG_ERROR, "delay create: layer not specified (loc: %ld)\n", obj->loc_line); - return; + if (ly == NULL) { + if (!specd) + rnd_message(RND_MSG_ERROR, "delay create: layer not specified (loc: %ld)\n", obj->loc_line); + return; + } } switch(obj->val.obj.obj.any.type) { @@ -282,6 +334,9 @@ r = (pcb_any_obj_t *)pcb_text_new(ly, pcb_font(pcb, 0, 1), CRDX(t->X), CRDY(t->Y), t->rot, t->Scale, t->thickness, t->TextString, pcb_flag_make(PCB_FLAG_CLEARLINE)); free(t->TextString); break; + case PCB_OBJ_PSTK: + r = (pcb_any_obj_t *)pcb_pstk_new(data, 0, p->proto, CRDX(p->x), CRDY(p->y), p->Clearance, pcb_flag_make(PCB_FLAG_CLEARLINE)); + break; default: break; } Index: trunk/src_plugins/io_pads/delay_create.h =================================================================== --- trunk/src_plugins/io_pads/delay_create.h (revision 33753) +++ trunk/src_plugins/io_pads/delay_create.h (revision 33754) @@ -46,6 +46,7 @@ pcb_line_t line; pcb_arc_t arc; pcb_text_t text; + pcb_pstk_t pstk; } obj; long layer_id; char *layer_name; @@ -80,6 +81,7 @@ pcb_dlcr_draw_t *pcb_dlcr_line_new(pcb_dlcr_t *dlcr, rnd_coord_t x1, rnd_coord_t y1, rnd_coord_t x2, rnd_coord_t y2, rnd_coord_t width, rnd_coord_t clearance); pcb_dlcr_draw_t *pcb_dlcr_arc_new(pcb_dlcr_t *dlcr, rnd_coord_t cx, rnd_coord_t cy, rnd_coord_t r, double start_deg, double delta_deg, rnd_coord_t width, rnd_coord_t clearance); pcb_dlcr_draw_t *pcb_dlcr_text_new(pcb_dlcr_t *dlcr, rnd_coord_t x, rnd_coord_t y, double rot, int scale, rnd_coord_t thickness, const char *str); +pcb_dlcr_draw_t *pcb_dlcr_via_new(pcb_dlcr_t *dlcr, rnd_coord_t x, rnd_coord_t y, rnd_coord_t clearance, long id, const char *name); pcb_pstk_proto_t *pcb_dlcr_pstk_proto_new(pcb_dlcr_t *dlcr); Index: trunk/src_plugins/io_pads/read_high.c =================================================================== --- trunk/src_plugins/io_pads/read_high.c (revision 33753) +++ trunk/src_plugins/io_pads/read_high.c (revision 33754) @@ -441,6 +441,8 @@ pads_eatup_till_nl(rctx); proto = pcb_dlcr_pstk_proto_new(&rctx->dlcr); + pcb_pstk_proto_change_name(proto, name, 0); + ts = pcb_vtpadstack_tshape_get(&proto->tr, 0, 1); ts->shape = calloc(sizeof(pcb_pstk_shape_t), num_lines); ts->len = num_lines; @@ -765,7 +767,7 @@ static int pads_parse_signal_crd(pads_read_ctx_t *rctx, pads_sig_piece_t *spc, long idx) { - char vianame[64]; + char vianame[64], teardrop[16]; long real_level, level, flags, loc_line; rnd_coord_t x, y, width; int res, arcdir = 0, thermal = 0; @@ -782,14 +784,28 @@ if (pads_has_field(rctx)) { if ((res = pads_read_word(rctx, vianame, sizeof(vianame), 0)) <= 0) return res; + if (strcmp(vianame, "TEARDROP") == 0) { + *vianame = '\0'; + goto teardrop; + } + if (strcmp(vianame, "CW") == 0) { arcdir = -1; *vianame = '\0'; } else if (strcmp(vianame, "CCW") == 0) { arcdir = +1; *vianame = '\0'; } else arcdir = 0; if (strcmp(vianame, "THERMAL") == 0) { thermal = 1; *vianame = '\0'; } - /* the rest of the line is jumper wire and teardrop - ignore those */ } + + if (pads_has_field(rctx)) { + if ((res = pads_read_word(rctx, teardrop, sizeof(teardrop), 0)) <= 0) return res; + if (strcmp(teardrop, "TEARDROP") == 0) { + teardrop:; + /* for now, ignore teardrop fields */ + } + } + + pads_eatup_till_nl(rctx); rnd_trace(" %mm;%mm level=%ld w=%mm flags=%ld vianame=%s arcdir=%d thermal=%d\n", @@ -816,10 +832,13 @@ real_level = level; if (*vianame != '\0') { + pcb_dlcr_draw_t *via; /* in this case level is the via's target level and our trace segment is really on the same level as the previous */ level = spc->lastlev; - TODO("place the via here"); + via = pcb_dlcr_via_new(&rctx->dlcr, x, y, 0, -1, vianame); + if (via != NULL) + via->loc_line = loc_line; } TODO("process flags\n"); @@ -836,8 +855,10 @@ double starta, deltaa; get_arc_angles(r, spc->cx, spc->cy, spc->x0, spc->y0, x, y, spc->arcdir, &starta, &deltaa); arc = pcb_dlcr_arc_new(&rctx->dlcr, spc->cx, spc->cy, r, starta, deltaa, width, 0); - arc->val.obj.layer_id = level; - arc->loc_line = loc_line; + if (arc != NULL) { + arc->val.obj.layer_id = level; + arc->loc_line = loc_line; + } spc->arcdir = 0; } spc->omit = 0; @@ -849,8 +870,10 @@ if (level != 0) { if ((idx > 0) && (!spc->omit)) { pcb_dlcr_draw_t *line = pcb_dlcr_line_new(&rctx->dlcr, spc->x, spc->y, x, y, width, 0); - line->val.obj.layer_id = level; - line->loc_line = loc_line; + if (line != NULL) { + line->val.obj.layer_id = level; + line->loc_line = loc_line; + } } spc->omit = 0; }