From a42a18fef3d37b3752e5e889073334f32f1ed348 Mon Sep 17 00:00:00 2001 From: Werner Almesberger Date: Mon, 5 Sep 2011 05:46:25 -0300 Subject: [PATCH] cameo/: new gnuplot tag #%id= with generator-assigned identifier Excellon and Gerber store the file name there. --- cameo/excellon.c | 14 +++++++------- cameo/gerber.c | 2 +- cameo/gnuplot.c | 18 +++++++++++++++--- cameo/ops.c | 6 +++--- cameo/path.c | 6 ++++-- cameo/path.h | 3 ++- cameo/shape.c | 8 ++++---- cameo/shape.h | 8 ++++---- 8 files changed, 40 insertions(+), 25 deletions(-) diff --git a/cameo/excellon.c b/cameo/excellon.c index b47cb7b..53007a0 100644 --- a/cameo/excellon.c +++ b/cameo/excellon.c @@ -159,7 +159,7 @@ static void header(FILE *file) /* ----- body parsing ------------------------------------------------------ */ -static int do_cmd(char cmd, double v, int nl) +static int do_cmd(char cmd, double v, int nl, const char *name) { static int metric = 1; static int slotting = 0; @@ -220,7 +220,7 @@ static int do_cmd(char cmd, double v, int nl) if (!metric) v = IN2MM(v); if (slotting) { - *anchor = path_new(d/2); + *anchor = path_new(d/2, name); path_add(*anchor, x0, y, 0); path_add(*anchor, x, v, 0); anchor = &(*anchor)->next; @@ -229,7 +229,7 @@ static int do_cmd(char cmd, double v, int nl) } if (nl) { assert(d); - *anchor = path_new(d/2); + *anchor = path_new(d/2, name); path_add(*anchor, x, v, 0); anchor = &(*anchor)->next; break; @@ -245,7 +245,7 @@ static int do_cmd(char cmd, double v, int nl) } -static void body(FILE *file) +static void body(FILE *file, const char *name) { char cmd = 0; double v = 0, f = 1; @@ -255,7 +255,7 @@ static void body(FILE *file) if (c == '\n') { lineno++; if (cmd) - do_cmd(cmd, s ? -v : v, 1); + do_cmd(cmd, s ? -v : v, 1, name); cmd = 0; } else if (isdigit(c)) { if (f == 1) @@ -270,7 +270,7 @@ static void body(FILE *file) s = !s; } else { if (cmd) - if (!do_cmd(cmd, s ? -v : v, 0)) + if (!do_cmd(cmd, s ? -v : v, 0, name)) return; cmd = c; v = 0; @@ -296,7 +296,7 @@ struct path *excellon_read(const char *name) anchor = &paths; header(file); - body(file); + body(file, name); fclose(file); return paths; diff --git a/cameo/gerber.c b/cameo/gerber.c index 5d26a5b..62eaaa4 100644 --- a/cameo/gerber.c +++ b/cameo/gerber.c @@ -72,7 +72,7 @@ struct path *gerber_read(const char *name, double r_tool_default) switch (d) { case 1: if (!path) { - path = path_new(r_tool_default); + path = path_new(r_tool_default, name); *anchor = path; anchor = &path->next; path_add(path, start_x, start_y, 0); diff --git a/cameo/gnuplot.c b/cameo/gnuplot.c index 4e582de..2571261 100644 --- a/cameo/gnuplot.c +++ b/cameo/gnuplot.c @@ -1,8 +1,8 @@ /* * gnuplot.c - Gnuplot file input/output * - * Written 2010 by Werner Almesberger - * Copyright 2010 Werner Almesberger + * Written 2010-2011 by Werner Almesberger + * Copyright 2010-2011 Werner Almesberger * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,6 +16,7 @@ #include #include +#include "util.h" #include "path.h" #include "gnuplot.h" @@ -25,6 +26,7 @@ struct path *gnuplot_read(const char *name, double r_tool_default) FILE *file; int lineno = 0; char buf[1024]; + char *id = NULL, *s; double x, y, z, tmp; double r_tool = r_tool_default; int outside = 0, notch = 0; @@ -46,6 +48,13 @@ struct path *gnuplot_read(const char *name, double r_tool_default) outside = 1; if (!strcmp(buf, "#%notch\n")) notch = 1; + if (!strncmp(buf, "#%id=", 5)) { + free(id); + id = stralloc(buf+5); + s = strchr(id, '\n'); + if (s) + *s = 0; + } if (*buf == '#') continue; n = sscanf(buf, "%lf %lf %lf\n", &x, &y, &z); @@ -67,7 +76,7 @@ struct path *gnuplot_read(const char *name, double r_tool_default) } if (!path) { - path = path_new(r_tool); + path = path_new(r_tool, id); path->outside = outside; path->notch = notch; *lnk = path; @@ -89,6 +98,9 @@ static int gnuplot_do_write(FILE *file, const struct path *paths) if (path != paths) if (fprintf(file, "\n") < 0) return 0; + if (path->id && + fprintf(file, "#%%id=%s\n", path->id) < 0) + return 0; if (path->r_tool && fprintf(file, "#%%r_tool=%f\n", path->r_tool) < 0) return 0; diff --git a/cameo/ops.c b/cameo/ops.c index 59a7354..3d86df2 100644 --- a/cameo/ops.c +++ b/cameo/ops.c @@ -68,7 +68,7 @@ struct path *try_drill(struct path *path, double d_min, double d_max) return NULL; if (!path->first || path->first != path->last) return NULL; - new = path_new((d_min+d_max)/2); /* @@@ fishy */ + new = path_new((d_min+d_max)/2, path->id); /* @@@ fishy */ path_add(new, path->first->x, path->first->y, path->first->z); return new; } @@ -82,11 +82,11 @@ struct path *try_mill(struct path *path, double diam, double step, int any) return NULL; if (path->first == path->last) return circle(path->first->x, path->first->y, path->first->z, - path->r_tool, diam/2, step); + path->r_tool, diam/2, step, path->id); if (path->first->next == path->last) return slot(path->first->x, path->first->y, path->first->next->x, path->first->next->y, - path->first->z, path->r_tool, diam/2, step); + path->first->z, path->r_tool, diam/2, step, path->id); return NULL; } diff --git a/cameo/path.c b/cameo/path.c index 90a0006..a80965f 100644 --- a/cameo/path.c +++ b/cameo/path.c @@ -43,11 +43,12 @@ static void free_points(struct point *points) void path_free(struct path *path) { free_points(path->first); + free((void *) path->id); free(path); } -struct path *path_new(double r_tool) +struct path *path_new(double r_tool, const char *id) { struct path *path; @@ -55,6 +56,7 @@ struct path *path_new(double r_tool) path->r_tool = r_tool; path->outside = 0; path->notch = 0; + path->id = id ? stralloc(id) : NULL; path->first = path->last = NULL; path->next = NULL; return path; @@ -65,7 +67,7 @@ static struct path *path_from(const struct path *old) { struct path *new; - new = path_new(old->r_tool); + new = path_new(old->r_tool, old->id); new->outside = old->outside; new->notch = old->notch; return new; diff --git a/cameo/path.h b/cameo/path.h index 9751ab9..a25a4fc 100644 --- a/cameo/path.h +++ b/cameo/path.h @@ -25,11 +25,12 @@ struct path { double r_tool; /* mm */ int outside; /* non-zero to mark path as an outside edge */ int notch; /* non-zero to enable dog-boning for path */ + const char *id; /* identifier assigned by generator */ struct path *next; }; -struct path *path_new(double r_tool); +struct path *path_new(double r_tool, const char *id); void path_add(struct path *path, double x, double y, double z); void path_replace(struct path *old, struct path *new); struct path *path_reverse(const struct path *path); diff --git a/cameo/shape.c b/cameo/shape.c index 978980a..f473f01 100644 --- a/cameo/shape.c +++ b/cameo/shape.c @@ -49,7 +49,7 @@ static void half_circle(double cx, double cy, double rx, double ry, double z, struct path *slot(double xa, double ya, double xb, double yb, double z, - double sr, double tr, double step) + double sr, double tr, double step, const char *id) { double dx = xb-xa; double dy = yb-ya; @@ -57,7 +57,7 @@ struct path *slot(double xa, double ya, double xb, double yb, double z, double nx, ny; double f; - path = path_new(tr); + path = path_new(tr, id); if (sr <= tr) { path_add(path, xa, ya, z); path_add(path, xb, yb, z); @@ -75,12 +75,12 @@ struct path *slot(double xa, double ya, double xb, double yb, double z, struct path *circle(double cx, double cy, double cz, double cr, double tr, - double step) + double step, const char *id) { double s = arc2angle(step, cr); double a; - path = path_new(tr); + path = path_new(tr, id); if (cr <= tr) { path_add(path, cx, cy, cz); } else { diff --git a/cameo/shape.h b/cameo/shape.h index 98e280f..59ba6c3 100644 --- a/cameo/shape.h +++ b/cameo/shape.h @@ -1,8 +1,8 @@ /* * shape.h - Toolpaths for basic shapes * - * Written 2010 by Werner Almesberger - * Copyright 2010 Werner Almesberger + * Written 2010-2011 by Werner Almesberger + * Copyright 2010-2011 Werner Almesberger * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,8 +18,8 @@ struct path *slot(double xa, double ya, double xb, double yb, double z, - double sr, double tr, double step); + double sr, double tr, double step, const char *id); struct path *circle(double cx, double cy, double cz, double cr, double tr, - double step); + double step, const char *id); #endif /* !SHAPE_H */