Index: bxl.h =================================================================== --- bxl.h (revision 30629) +++ bxl.h (revision 30630) @@ -33,6 +33,10 @@ int proto_id; struct { + pcb_coord_t origin_x, origin_y, pick_x, pick_y, glue_x, glue_y; + } pat_state; + + struct { pcb_layer_t *layer; pcb_coord_t origin_x, origin_y, endp_x, endp_y, width, height, radius; pcb_coord_t hole; @@ -69,6 +73,7 @@ void pcb_bxl_pattern_begin(pcb_bxl_ctx_t *ctx, const char *name); void pcb_bxl_pattern_end(pcb_bxl_ctx_t *ctx); void pcb_bxl_reset(pcb_bxl_ctx_t *ctx); +void pcb_bxl_reset_pattern(pcb_bxl_ctx_t *ctx); void pcb_bxl_set_layer(pcb_bxl_ctx_t *ctx, const char *layer_name); void pcb_bxl_set_justify(pcb_bxl_ctx_t *ctx, const char *str); void pcb_bxl_set_text_str(pcb_bxl_ctx_t *ctx, char *str); Index: bxl_gram.c =================================================================== --- bxl_gram.c (revision 30629) +++ bxl_gram.c (revision 30630) @@ -693,12 +693,24 @@ break; case 49: #line 210 "../../src_plugins/io_bxl/bxl_gram.y" - { pcb_bxl_pattern_begin(ctx, yyctx->stack.l_mark[-1].un.s); free(yyctx->stack.l_mark[-1].un.s); } + { pcb_bxl_reset_pattern(ctx); pcb_bxl_pattern_begin(ctx, yyctx->stack.l_mark[-1].un.s); free(yyctx->stack.l_mark[-1].un.s); } break; case 50: #line 212 "../../src_plugins/io_bxl/bxl_gram.y" - { pcb_bxl_pattern_end(ctx); } + { pcb_bxl_pattern_end(ctx); pcb_bxl_reset_pattern(ctx); } break; +case 54: +#line 222 "../../src_plugins/io_bxl/bxl_gram.y" + { ctx->pat_state.origin_x = XCRD(yyctx->stack.l_mark[-3].un.c); ctx->pat_state.origin_y = YCRD(yyctx->stack.l_mark[-1].un.c); } +break; +case 55: +#line 223 "../../src_plugins/io_bxl/bxl_gram.y" + { ctx->pat_state.pick_x = XCRD(yyctx->stack.l_mark[-3].un.c); ctx->pat_state.pick_y = YCRD(yyctx->stack.l_mark[-1].un.c); } +break; +case 56: +#line 224 "../../src_plugins/io_bxl/bxl_gram.y" + { ctx->pat_state.glue_x = XCRD(yyctx->stack.l_mark[-3].un.c); ctx->pat_state.glue_y = YCRD(yyctx->stack.l_mark[-1].un.c); } +break; case 68: #line 252 "../../src_plugins/io_bxl/bxl_gram.y" { pcb_bxl_pad_begin(ctx); } @@ -811,7 +823,7 @@ #line 362 "../../src_plugins/io_bxl/bxl_gram.y" { ctx->state.rot = yyctx->stack.l_mark[0].un.d; } break; -#line 827 "../../src_plugins/io_bxl/bxl_gram.c" +#line 839 "../../src_plugins/io_bxl/bxl_gram.c" } yyctx->stack.s_mark -= yyctx->yym; yyctx->state = *yyctx->stack.s_mark; Index: bxl_gram.y =================================================================== --- bxl_gram.y (revision 30629) +++ bxl_gram.y (revision 30630) @@ -207,9 +207,9 @@ /*** Pattern ***/ pattern: - T_PATTERN T_QSTR nl { pcb_bxl_pattern_begin(ctx, $2); free($2); } + T_PATTERN T_QSTR nl { pcb_bxl_reset_pattern(ctx); pcb_bxl_pattern_begin(ctx, $2); free($2); } pattern_chldrn - T_ENDPATTERN { pcb_bxl_pattern_end(ctx); } + T_ENDPATTERN { pcb_bxl_pattern_end(ctx); pcb_bxl_reset_pattern(ctx); } ; pattern_chldrn: @@ -219,9 +219,9 @@ pattern_chld: data - | T_ORIGINPOINT '(' coord ',' coord ')' - | T_PICKPOINT '(' coord ',' coord ')' - | T_GLUEPOINT '(' coord ',' coord ')' + | T_ORIGINPOINT '(' coord ',' coord ')' { ctx->pat_state.origin_x = XCRD($3); ctx->pat_state.origin_y = YCRD($5); } + | T_PICKPOINT '(' coord ',' coord ')' { ctx->pat_state.pick_x = XCRD($3); ctx->pat_state.pick_y = YCRD($5); } + | T_GLUEPOINT '(' coord ',' coord ')' { ctx->pat_state.glue_x = XCRD($3); ctx->pat_state.glue_y = YCRD($5); } ; data: Index: read.c =================================================================== --- read.c (revision 30629) +++ read.c (revision 30630) @@ -116,6 +116,10 @@ void pcb_bxl_pattern_end(pcb_bxl_ctx_t *ctx) { + pcb_subc_create_aux(ctx->subc, ctx->pat_state.origin_x, ctx->pat_state.origin_y, 0, 0); + pcb_subc_create_aux_point(ctx->subc, ctx->pat_state.pick_x, ctx->pat_state.pick_y, "pnp-origin"); + pcb_subc_create_aux_point(ctx->subc, ctx->pat_state.glue_x, ctx->pat_state.glue_y, "glue-origin"); + ctx->in_target_fp = 0; } @@ -127,6 +131,12 @@ memset(&ctx->state, 0, sizeof(ctx->state)); } +void pcb_bxl_reset_pattern(pcb_bxl_ctx_t *ctx) +{ + SKIP; + memset(&ctx->pat_state, 0, sizeof(ctx->pat_state)); +} + void pcb_bxl_set_layer(pcb_bxl_ctx_t *ctx, const char *layer_name) { htsp_entry_t *e;