Index: trunk/src_plugins/io_pads/delay_create.c =================================================================== --- trunk/src_plugins/io_pads/delay_create.c (revision 33772) +++ trunk/src_plugins/io_pads/delay_create.c (revision 33773) @@ -139,7 +139,6 @@ return subc; } - static pcb_dlcr_draw_t *dlcr_new(pcb_dlcr_t *dlcr, pcb_dlcr_type_t type) { pcb_dlcr_draw_t *obj = calloc(sizeof(pcb_dlcr_draw_t), 1); @@ -260,7 +259,23 @@ return obj; } +pcb_dlcr_draw_t *pcb_dlcr_subc_new_from_lib(pcb_dlcr_t *dlcr, rnd_coord_t x, rnd_coord_t y, double rot, int on_bottom, const char *names, long names_len) +{ + pcb_dlcr_draw_t *obj = dlcr_new(dlcr, DLCR_SUBC_FROM_LIB); + obj->val.subc_from_lib.x = x; + obj->val.subc_from_lib.y = y; + obj->val.subc_from_lib.rot = rot; + obj->val.subc_from_lib.on_bottom = on_bottom; + obj->val.subc_from_lib.names = malloc(names_len+1); + memcpy(obj->val.subc_from_lib.names, names, names_len); + obj->val.subc_from_lib.names[names_len] = '\0'; /* add an extra \0, just in case; this makes the call easier with a single name which can be passed as a simple \0 terminated string */ + + /* can not update the bbox as we may not yet have the subc in lib */ + + 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.subc->data : &dlcr->pstks; @@ -391,6 +406,28 @@ free(obj); } +static void pcb_dlcr_draw_subc_from_lib(pcb_board_t *pcb, pcb_dlcr_t *dlcr, pcb_dlcr_draw_t *obj) +{ + pcb_subc_t *subc; + char *name; + + rnd_trace("*** new from lib:\n"); + for(name = obj->val.subc_from_lib.names; *name != '\0'; name = name + strlen(name) + 1) { + subc = htsp_get(&dlcr->name2subc, name); + if (subc != NULL) + break; + } + + if (subc == NULL) { + rnd_message(RND_MSG_ERROR, "delay create: invalid subc-from-lib: not found by name (loc: %ld); tried:\n", obj->loc_line); + for(name = obj->val.subc_from_lib.names; *name != '\0'; name = name + strlen(name) + 1) + rnd_message(RND_MSG_ERROR, " '%s'\n", name); + return; + } + + rnd_trace(" using name '%s' %p\n", name, subc); +} + TODO("this is pads-specific, figure how to handle this; see also: TODO#71"); static void proto_layer_lookup(pcb_dlcr_t *dlcr, pcb_pstk_shape_t *shp) { @@ -450,6 +487,7 @@ case DLCR_OBJ: pcb_dlcr_draw_free_obj(pcb, subc, dlcr, obj); break; case DLCR_SUBC_BEGIN: subc = obj->val.subc_begin.subc; break; case DLCR_SUBC_END: subc = NULL; break; + case DLCR_SUBC_FROM_LIB: pcb_dlcr_draw_subc_from_lib(pcb, dlcr, obj); break; } } } Index: trunk/src_plugins/io_pads/delay_create.h =================================================================== --- trunk/src_plugins/io_pads/delay_create.h (revision 33772) +++ trunk/src_plugins/io_pads/delay_create.h (revision 33773) @@ -32,7 +32,8 @@ typedef enum { DLCR_OBJ, DLCR_SUBC_BEGIN, - DLCR_SUBC_END + DLCR_SUBC_END, + DLCR_SUBC_FROM_LIB /* place a subc from local lib by a list of names */ /* DLCR_SEQPOLY_BEGIN, DLCR_SEQPOLY_END*/ } pcb_dlcr_type_t; @@ -56,6 +57,13 @@ struct { pcb_subc_t *subc; } subc_begin; /* in DLCR_SUBC_BEGIN */ + struct { + rnd_coord_t x; + rnd_coord_t y; + double rot; + int on_bottom; + char *names; /* \0 separated list with an empty string at the end (double \0) */ + } subc_from_lib; } val; long loc_line; /* for debug */ gdl_elem_t link; @@ -87,6 +95,7 @@ void pcb_dlcr_layer_reg(pcb_dlcr_t *dlcr, pcb_dlcr_layer_t *layer); void pcb_dlcr_layer_free(pcb_dlcr_layer_t *layer); +/* allocate a new named subcircuit within the local dlcr lib */ pcb_subc_t *pcb_dlcr_subc_new_in_lib(pcb_dlcr_t *dlcr, const char *name); 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); @@ -94,6 +103,11 @@ 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); +/* delayed place a subcricuit from the local dlcr lib by name; names is either + a single string or a \0 separated list of strings with an empty string at + the end */ +pcb_dlcr_draw_t *pcb_dlcr_subc_new_from_lib(pcb_dlcr_t *dlcr, rnd_coord_t x, rnd_coord_t y, double rot, int on_bottom, const char *names, long names_len); + pcb_pstk_proto_t *pcb_dlcr_pstk_proto_new(pcb_dlcr_t *dlcr); void pcb_dlcr_subc_begin(pcb_dlcr_t *dlcr, pcb_subc_t *subc); Index: trunk/src_plugins/io_pads/read.c =================================================================== --- trunk/src_plugins/io_pads/read.c (revision 33772) +++ trunk/src_plugins/io_pads/read.c (revision 33773) @@ -57,6 +57,7 @@ typedef struct pads_read_decal_s { TODO("do we need swaps?") + int decal_names_len; /* in bytes, double \0 at the end included */ char decal_names[1]; /* really as long as it needs to be */ } pads_read_part_t; Index: trunk/src_plugins/io_pads/read_high.c =================================================================== --- trunk/src_plugins/io_pads/read_high.c (revision 33772) +++ trunk/src_plugins/io_pads/read_high.c (revision 33773) @@ -709,7 +709,7 @@ part = htsp_get(&rctx->parts, partname); if (part != NULL) { - PADS_ERROR((RND_MSG_ERROR, "*PART* called '%s' is defined multiple times\n", partname)); + PADS_ERROR((RND_MSG_ERROR, "*PARTTYPE* called '%s' is defined multiple times\n", partname)); return -1; } @@ -716,6 +716,7 @@ dnl = strlen(decals)+1; part = calloc(sizeof(pads_read_part_t) + dnl + 2, 1); memcpy(part->decal_names, decals, dnl); + part->decal_names_len = dnl+1; htsp_set(&rctx->parts, rnd_strdup(partname), part); /* the decal name list should consist of null-terminated string with an extra @@ -741,6 +742,7 @@ static int pads_parse_part(pads_read_ctx_t *rctx) { + pads_read_part_t *part; char refdes[64], partname[64], glue[4], mirr[4]; long n, altdeclnum, clustid = -1, clsattr = 0, brotherid = -1, num_labels; rnd_coord_t xo, yo; @@ -767,6 +769,18 @@ rnd_trace("part: '%s' of '%s' num_labels=%ld\n", refdes, partname, num_labels); + part = htsp_get(&rctx->parts, partname); + if (part != NULL) { + pcb_dlcr_draw_t *po = pcb_dlcr_subc_new_from_lib(&rctx->dlcr, xo, yo, rot, mirr, part->decal_names, part->decal_names_len); + po->loc_line = rctx->line; + } + else { + PADS_ERROR((RND_MSG_ERROR, "*PART* on undefined parttype '%s'\n", partname)); + return -1; + } + +TODO("add refdes and labels"); + for(n = 0; n < num_labels; n++) if ((res = pads_parse_label(rctx, xo, yo)) <= 0) return res; return 1;