1
0
mirror of git://projects.qi-hardware.com/cae-tools.git synced 2024-12-23 13:24:15 +02:00

drl2gp: drilling and circle milling work, various fixes (more to come)

This commit is contained in:
Werner Almesberger 2010-12-08 05:26:42 -03:00
parent 1ab262247f
commit 49a42cb500

View File

@ -11,10 +11,9 @@
*/ */
/* /*
* KiCad drill files are in the Excellon format. The format is described * KiCad drill files are in the Excellon format. The format is described here:
* here:
* *
* http://web.archive.org/web/20071030075236/http://www.excellon.com/manuals/program.htm * http://www.excellon.com/manuals/program.htm
* *
* Note that drl2gp currently only implements the subset necessary to process * Note that drl2gp currently only implements the subset necessary to process
* the KiCad drill files encountered in a few projects, may not work correctly * the KiCad drill files encountered in a few projects, may not work correctly
@ -26,18 +25,21 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <ctype.h> #include <ctype.h>
#include <math.h>
#include <assert.h> #include <assert.h>
#define MAX_ARGS 3 #define MAX_ARGS 3
#define MAX_TOOL 10 #define MAX_TOOL 10
#define MAX_STEP 0.01 /* max arc step, in mm */
static double tool_d[MAX_TOOL+1]; static double tool_d[MAX_TOOL+1];
static FILE *out = NULL; static FILE *out = NULL;
static int lineno = 1; static int lineno = 1;
static int mill; static int mill = 0;
static double depth, d0, d1; static double depth, d0, d1;
@ -59,6 +61,7 @@ static void header(void)
} state = ts_nl; } state = ts_nl;
int c, tool; int c, tool;
double f = 1; double f = 1;
double tmp;
while ((c = getchar()) != EOF) { while ((c = getchar()) != EOF) {
if (out) { if (out) {
@ -104,10 +107,13 @@ static void header(void)
break; break;
case ts_tc: case ts_tc:
if (isdigit(c)) { if (isdigit(c)) {
tmp = c-'0';
tmp = IN2MM(tmp);
if (f == 1) if (f == 1)
tool_d[tool] = tool_d[tool]*10+c-'0'; tool_d[tool] =
tool_d[tool]*10+tmp;
else { else {
tool_d[tool] += f*(c-'0'); tool_d[tool] += f*tmp;
f /= 10; f /= 10;
} }
} else if (c == '.') { } else if (c == '.') {
@ -139,12 +145,22 @@ static void slot(double xa, double ya, double xb, double yb, double d)
static void circle(double cx, double cy, double d) static void circle(double cx, double cy, double d)
{ {
double cr = d/2;
double tr = d0/2;
double s = acos(1-MAX_STEP*MAX_STEP/(cr*cr)/2);
double a;
assert(mill); assert(mill);
for (a = 0; a < 2*M_PI; a += s)
printf("%f %f %f\n",
cx+(cr-tr)*cos(a), cy+(cr-tr)*sin(a), -depth);
printf("%f %f %f\n\n", cx+(cr-tr), cy, -depth);
} }
static void drill(double x, double y) static void drill(double x, double y)
{ {
printf("%f %f %f\n\n", x, y, -depth);
} }
@ -153,7 +169,7 @@ static void do_cmd(char cmd, double v, int nl)
static int active = 0; static int active = 0;
static int metric = 1; static int metric = 1;
static int slotting = 0; static int slotting = 0;
double x = 0, y = 0, x0 = 0, d = 0; static double x = 0, y = 0, x0 = 0, d = 0;
int n = v; int n = v;
switch (cmd) { switch (cmd) {
@ -202,10 +218,12 @@ static void do_cmd(char cmd, double v, int nl)
exit(1); exit(1);
} }
d = tool_d[n]; d = tool_d[n];
fprintf(stderr, "T%d -> %f\n", n, d);
if (mill) if (mill)
active = d <= d0; active = d >= d0;
else else
active = d >= d0 && d <= d1; active = d >= d0 && d <= d1;
fprintf(stderr, "%g %g %g -> %d\n", d, d0, d1, active);
break; break;
case 'X': case 'X':
x = metric ? v : IN2MM(v); x = metric ? v : IN2MM(v);
@ -215,6 +233,8 @@ static void do_cmd(char cmd, double v, int nl)
slotting = 0; slotting = 0;
break; break;
} }
if (!metric)
v = IN2MM(v);
if (slotting) { if (slotting) {
slot(x0, y, x, v, d); slot(x0, y, x, v, d);
slotting = 0; slotting = 0;
@ -228,7 +248,7 @@ static void do_cmd(char cmd, double v, int nl)
drill(x, v); drill(x, v);
break; break;
} }
y = metric ? v : IN2MM(v); y = v;
break; break;
default: default:
fprintf(stderr, "unrecognized command \"%c\" at line %d\n", fprintf(stderr, "unrecognized command \"%c\" at line %d\n",
@ -344,10 +364,10 @@ int main(int argc, char **argv)
switch (n_arg) { switch (n_arg) {
case 2: case 2:
d1 = d0; d1 = d0;
mill = 0; mill = 1;
break; break;
case 3: case 3:
mill = 1; mill = 0;
break; break;
default: default:
usage(*argv); usage(*argv);