mirror of
git://projects.qi-hardware.com/cae-tools.git
synced 2024-12-23 04:13:20 +02:00
cameo/: new command write_gerber, for Gerber output
This commit is contained in:
parent
dddb035255
commit
c7ff028cc9
@ -45,10 +45,11 @@ translation.
|
|||||||
File output:
|
File output:
|
||||||
|
|
||||||
write [<filename>]
|
write [<filename>]
|
||||||
|
write_gerber [<filename>]
|
||||||
append [<filenname>]
|
append [<filenname>]
|
||||||
|
|
||||||
Writes all loaded paths in gnuplot format to the specified file. If the
|
Writes all loaded paths in gnuplot or Gerber format to the specified file.
|
||||||
file name is omitted, "write" writes to standard output.
|
If the file name is omitted, "write" writes to standard output.
|
||||||
|
|
||||||
"append" is like "write", except that it appends to an existing file.
|
"append" is like "write", except that it appends to an existing file.
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* gerber.c - Gerber file input
|
* gerber.c - Gerber file input
|
||||||
*
|
*
|
||||||
* Written 2010, 2013 by Werner Almesberger
|
* Written 2010, 2013, 2015 by Werner Almesberger
|
||||||
* Copyright 2010, 2013 Werner Almesberger
|
* Copyright 2010, 2013, 2015 Werner Almesberger
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -141,3 +141,52 @@ struct path *gerber_read(const char *name, double r_tool_default)
|
|||||||
fclose(file);
|
fclose(file);
|
||||||
return path_connect(paths);
|
return path_connect(paths);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int gerber_do_write(FILE *file, const struct path *paths)
|
||||||
|
{
|
||||||
|
const struct path *path;
|
||||||
|
const struct point *p;
|
||||||
|
|
||||||
|
fprintf(file,
|
||||||
|
"G04 Generated by cameo*\n"
|
||||||
|
"%%MOMM*%%\n" // dimensions are in mm
|
||||||
|
"%%FSLAX33Y33*%%\n" // no leading zeroes; absolute; 3 digits int,
|
||||||
|
// 3 digits fractional
|
||||||
|
"G01*\n" // linear interpolation
|
||||||
|
"%%ADD10C,0.01*%%\n" // aperture D10, 10 um circle
|
||||||
|
"D10*\n"); // select D10
|
||||||
|
|
||||||
|
for (path = paths; path; path = path->next)
|
||||||
|
for (p = path->first; p; p = p->next)
|
||||||
|
fprintf(file, "X%.0fY%.0fD0%u*\n",
|
||||||
|
p->x * 1000.0, p->y * 1000.0,
|
||||||
|
p == path->first ? 2 : 1);
|
||||||
|
|
||||||
|
fprintf(file, "M02**\n");// end of file
|
||||||
|
|
||||||
|
if (file == stdout) {
|
||||||
|
if (fflush(file) == EOF)
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
if (fclose(file) < 0)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void gerber_write(const char *name, const struct path *paths)
|
||||||
|
{
|
||||||
|
FILE *file;
|
||||||
|
|
||||||
|
file = name ? fopen(name, "w") : stdout;
|
||||||
|
if (!file) {
|
||||||
|
perror(name);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (!gerber_do_write(file, paths)) {
|
||||||
|
perror(name ? name : "(stdout)");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* gerber.h - Gerber file input
|
* gerber.h - Gerber file input/output
|
||||||
*
|
*
|
||||||
* Written 2010 by Werner Almesberger
|
* Written 2010, 2015 by Werner Almesberger
|
||||||
* Copyright 2010 Werner Almesberger
|
* Copyright 2010, 2015 Werner Almesberger
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -17,5 +17,6 @@
|
|||||||
|
|
||||||
|
|
||||||
struct path *gerber_read(const char *name, double r_tool_default);
|
struct path *gerber_read(const char *name, double r_tool_default);
|
||||||
|
void gerber_write(const char *name, const struct path *paths);
|
||||||
|
|
||||||
#endif /* !GERBER_H */
|
#endif /* !GERBER_H */
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
/*
|
/*
|
||||||
* lang.l - Toolpath adaptation language
|
* lang.l - Toolpath adaptation language
|
||||||
*
|
*
|
||||||
* Written 2010-2013 by Werner Almesberger
|
* Written 2010-2013, 2015 by Werner Almesberger
|
||||||
* Copyright 2010-2013 by Werner Almesberger
|
* Copyright 2010-2013, 2015 by Werner Almesberger
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -74,6 +74,8 @@ NUM -?[0-9]+\.?[0-9]*
|
|||||||
return TOK_STL; }
|
return TOK_STL; }
|
||||||
<INITIAL>write { BEGIN(FILENAME);
|
<INITIAL>write { BEGIN(FILENAME);
|
||||||
return TOK_WRITE; }
|
return TOK_WRITE; }
|
||||||
|
<INITIAL>write_gerber { BEGIN(FILENAME);
|
||||||
|
return TOK_WRITE_GERBER; }
|
||||||
|
|
||||||
<INITIAL>dog return TOK_DOG;
|
<INITIAL>dog return TOK_DOG;
|
||||||
<INITIAL>inside return TOK_INSIDE;
|
<INITIAL>inside return TOK_INSIDE;
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
/*
|
/*
|
||||||
* lang.y - Toolpath adaptation language
|
* lang.y - Toolpath adaptation language
|
||||||
*
|
*
|
||||||
* Written 2010-2013 by Werner Almesberger
|
* Written 2010-2013, 2015 by Werner Almesberger
|
||||||
* Copyright 2010-2013 by Werner Almesberger
|
* Copyright 2010-2013, 2015 by Werner Almesberger
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -235,6 +235,7 @@ static struct path **classify(struct path **anchor, struct path *path)
|
|||||||
%token TOK_REVERSE TOK_ROTATE TOK_STATS TOK_STL TOK_TRANSLATE
|
%token TOK_REVERSE TOK_ROTATE TOK_STATS TOK_STL TOK_TRANSLATE
|
||||||
%token TOK_X TOK_Y TOK_Z
|
%token TOK_X TOK_Y TOK_Z
|
||||||
%token TOK_APPEND TOK_GERBER TOK_GNUPLOT TOK_EXCELLON TOK_WRITE
|
%token TOK_APPEND TOK_GERBER TOK_GNUPLOT TOK_EXCELLON TOK_WRITE
|
||||||
|
%token TOK_WRITE_GERBER
|
||||||
%token TOK_DOG TOK_INSIDE TOK_ANY
|
%token TOK_DOG TOK_INSIDE TOK_ANY
|
||||||
|
|
||||||
%token <num> NUM_EXP_MIL NUM_EXP_MM NUM_IMP_MIL NUM_IMP_MM REF
|
%token <num> NUM_EXP_MIL NUM_EXP_MM NUM_IMP_MIL NUM_IMP_MM REF
|
||||||
@ -385,6 +386,10 @@ command:
|
|||||||
gnuplot_write($2, paths);
|
gnuplot_write($2, paths);
|
||||||
translate(paths, 0, 0, -zo);
|
translate(paths, 0, 0, -zo);
|
||||||
}
|
}
|
||||||
|
| TOK_WRITE_GERBER opt_filename
|
||||||
|
{
|
||||||
|
gerber_write($2, paths);
|
||||||
|
}
|
||||||
| TOK_APPEND opt_filename
|
| TOK_APPEND opt_filename
|
||||||
{
|
{
|
||||||
translate(paths, 0, 0, zo);
|
translate(paths, 0, 0, zo);
|
||||||
|
@ -41,7 +41,7 @@ struct path *tool_comp_paths(const struct path *paths, int dog_bone,
|
|||||||
/*
|
/*
|
||||||
* We don't have an algorithm (yet) that can detect which paths are
|
* We don't have an algorithm (yet) that can detect which paths are
|
||||||
* inside other paths. Therefore, we fake it by looking for the path
|
* inside other paths. Therefore, we fake it by looking for the path
|
||||||
* that contains lowest x coordinate. This ought to be the outer
|
* that contains the lowest x coordinate. This ought to be the outer
|
||||||
* boundary of the piece.
|
* boundary of the piece.
|
||||||
*
|
*
|
||||||
* Note that this heuristic falls apart when a job consists of
|
* Note that this heuristic falls apart when a job consists of
|
||||||
|
Loading…
Reference in New Issue
Block a user