mirror of
git://projects.qi-hardware.com/eda-tools.git
synced 2024-11-26 07:54:06 +02:00
eeshow/: support format symbols %%, %N, %S, and %T in page layout
This commit is contained in:
parent
b925268c90
commit
dc4c29c5be
@ -232,7 +232,8 @@ void render_sheet(struct gui_sheet *sheet)
|
|||||||
|
|
||||||
gfx_init(&cro_canvas_ops, 1, argv);
|
gfx_init(&cro_canvas_ops, 1, argv);
|
||||||
if (sheet->ctx->pl)
|
if (sheet->ctx->pl)
|
||||||
pl_render(sheet->ctx->pl, sheet->sch->w, sheet->sch->h);
|
pl_render(sheet->ctx->pl, sheet->hist->sch_ctx.sheets,
|
||||||
|
sheet->sch);
|
||||||
sch_render(sheet->sch);
|
sch_render(sheet->sch);
|
||||||
cro_canvas_end(gfx_ctx,
|
cro_canvas_end(gfx_ctx,
|
||||||
&sheet->w, &sheet->h, &sheet->xmin, &sheet->ymin);
|
&sheet->w, &sheet->h, &sheet->xmin, &sheet->ymin);
|
||||||
|
@ -10,9 +10,10 @@
|
|||||||
* (at your option) any later version.
|
* (at your option) any later version.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define _GNU_SOURCE /* for asprintf */
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "misc/util.h"
|
#include "misc/util.h"
|
||||||
@ -20,6 +21,7 @@
|
|||||||
#include "gfx/style.h"
|
#include "gfx/style.h"
|
||||||
#include "gfx/text.h"
|
#include "gfx/text.h"
|
||||||
#include "gfx/gfx.h"
|
#include "gfx/gfx.h"
|
||||||
|
#include "kicad/sch.h"
|
||||||
#include "kicad/pl-common.h"
|
#include "kicad/pl-common.h"
|
||||||
#include "kicad/pl.h"
|
#include "kicad/pl.h"
|
||||||
|
|
||||||
@ -42,11 +44,95 @@ static int coord(int v, int d, int o, int e)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void render_text(const struct pl_ctx *pl, const struct pl_obj *obj,
|
static char *expand(const struct pl_ctx *pl, const char *s,
|
||||||
int x, int y)
|
const struct sheet *sheets, const struct sheet *sheet)
|
||||||
{
|
{
|
||||||
|
const struct sheet *sch;
|
||||||
|
char *res = NULL;
|
||||||
|
const char *p;
|
||||||
|
unsigned size = 0;
|
||||||
|
unsigned len;
|
||||||
|
char *x;
|
||||||
|
unsigned n;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
p = strchr(s, '%');
|
||||||
|
if (!p)
|
||||||
|
break;
|
||||||
|
switch (p[1]) {
|
||||||
|
case '%':
|
||||||
|
x = "%";
|
||||||
|
break;
|
||||||
|
case 'C':
|
||||||
|
x = "%C"; // comment #n
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
x = "%D"; // date
|
||||||
|
break;
|
||||||
|
case 'F':
|
||||||
|
x = "%F"; // file name
|
||||||
|
break;
|
||||||
|
case 'K':
|
||||||
|
x = "%K"; // KiCad version
|
||||||
|
break;
|
||||||
|
case 'N':
|
||||||
|
n = 0;
|
||||||
|
for (sch = sheets; sch; sch = sch->next)
|
||||||
|
n++;
|
||||||
|
if (asprintf(&x, "%u", n)) {}
|
||||||
|
break;
|
||||||
|
case 'P':
|
||||||
|
x = "%P"; // sheet path
|
||||||
|
break;
|
||||||
|
case 'R':
|
||||||
|
x = "%R"; // revision
|
||||||
|
break;
|
||||||
|
case 'S':
|
||||||
|
n = 1;
|
||||||
|
for (sch = sheets; sch != sheet;
|
||||||
|
sch = sch->next)
|
||||||
|
n++;
|
||||||
|
if (asprintf(&x, "%u", n)) {}
|
||||||
|
break;
|
||||||
|
case 'T':
|
||||||
|
x = (char *) sheet->title;
|
||||||
|
break;
|
||||||
|
case 'Y':
|
||||||
|
x = "%Y"; // company name
|
||||||
|
break;
|
||||||
|
case 'Z':
|
||||||
|
x = "%Z"; // paper format
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
x = "???";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
len = strlen(x);
|
||||||
|
res = realloc(res, size + p - s + len);
|
||||||
|
if (!res)
|
||||||
|
diag_pfatal("realloc");
|
||||||
|
memcpy(res + size, s, p - s);
|
||||||
|
size += p - s;
|
||||||
|
s = p + 2;
|
||||||
|
memcpy(res + size, x, len);
|
||||||
|
size += len;
|
||||||
|
}
|
||||||
|
|
||||||
|
len = strlen(s);
|
||||||
|
res = realloc(res, size + len + 1);
|
||||||
|
if (!res)
|
||||||
|
diag_pfatal("realloc");
|
||||||
|
memcpy(res + size, s, len + 1);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void render_text(const struct pl_ctx *pl, const struct pl_obj *obj,
|
||||||
|
int x, int y, const struct sheet *sheets, const struct sheet *sheet)
|
||||||
|
{
|
||||||
|
|
||||||
struct text txt = {
|
struct text txt = {
|
||||||
.s = obj->s,
|
.s = expand(pl, obj->s, sheets, sheet),
|
||||||
.size = mil(obj->ey ? obj->ey : pl->ty),
|
.size = mil(obj->ey ? obj->ey : pl->ty),
|
||||||
.x = x,
|
.x = x,
|
||||||
.y = y,
|
.y = y,
|
||||||
@ -56,12 +142,16 @@ static void render_text(const struct pl_ctx *pl, const struct pl_obj *obj,
|
|||||||
};
|
};
|
||||||
|
|
||||||
text_fig(&txt, COLOR_COMP_DWG, LAYER_COMP_DWG);
|
text_fig(&txt, COLOR_COMP_DWG, LAYER_COMP_DWG);
|
||||||
|
free((void *) txt.s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void render_obj(const struct pl_ctx *pl, const struct pl_obj *obj,
|
static void render_obj(const struct pl_ctx *pl, const struct pl_obj *obj,
|
||||||
unsigned i, int w, int h)
|
unsigned i,
|
||||||
|
const struct sheet *sheets, const struct sheet *sheet)
|
||||||
{
|
{
|
||||||
|
int w = sheet->w;
|
||||||
|
int h = sheet->h;
|
||||||
int xo = mil(pl->l);
|
int xo = mil(pl->l);
|
||||||
int yo = mil(pl->r);
|
int yo = mil(pl->r);
|
||||||
int xe = w - mil(pl->t);
|
int xe = w - mil(pl->t);
|
||||||
@ -97,7 +187,7 @@ static void render_obj(const struct pl_ctx *pl, const struct pl_obj *obj,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case pl_obj_text:
|
case pl_obj_text:
|
||||||
render_text(pl, obj, x, y);
|
render_text(pl, obj, x, y, sheets, sheet);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -105,12 +195,13 @@ static void render_obj(const struct pl_ctx *pl, const struct pl_obj *obj,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void pl_render(struct pl_ctx *pl, int w, int h)
|
void pl_render(struct pl_ctx *pl, const struct sheet *sheets,
|
||||||
|
const struct sheet *sheet)
|
||||||
{
|
{
|
||||||
const struct pl_obj *obj;
|
const struct pl_obj *obj;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (obj = pl->objs; obj; obj = obj->next)
|
for (obj = pl->objs; obj; obj = obj->next)
|
||||||
for (i = 0; i != obj->repeat; i++)
|
for (i = 0; i != obj->repeat; i++)
|
||||||
render_obj(pl, obj, i, w, h);
|
render_obj(pl, obj, i, sheets, sheet);
|
||||||
}
|
}
|
||||||
|
@ -15,12 +15,14 @@
|
|||||||
#define KICAD_PL_H
|
#define KICAD_PL_H
|
||||||
|
|
||||||
#include "file/file.h"
|
#include "file/file.h"
|
||||||
|
#include "kicad/sch.h"
|
||||||
|
|
||||||
|
|
||||||
struct pl_ctx;
|
struct pl_ctx;
|
||||||
|
|
||||||
|
|
||||||
void pl_render(struct pl_ctx *pl, int w, int h);
|
void pl_render(struct pl_ctx *pl, const struct sheet *sheets,
|
||||||
|
const struct sheet *sheet);
|
||||||
|
|
||||||
struct pl_ctx *pl_parse(struct file *file);
|
struct pl_ctx *pl_parse(struct file *file);
|
||||||
void pl_free(struct pl_ctx *pl);
|
void pl_free(struct pl_ctx *pl);
|
||||||
|
Loading…
Reference in New Issue
Block a user