mirror of
git://projects.qi-hardware.com/fped.git
synced 2024-11-22 01:36:14 +02:00
fped/: added gnuplot output for line/rect/circle with -g (experimental)
This commit is contained in:
parent
6ca5c22ea4
commit
e5d8fd87c3
2
Makefile
2
Makefile
@ -15,7 +15,7 @@ PREFIX ?= /usr/local
|
|||||||
UPLOAD = www-data@downloads.qi-hardware.com:werner/fped/
|
UPLOAD = www-data@downloads.qi-hardware.com:werner/fped/
|
||||||
|
|
||||||
OBJS = fped.o expr.o coord.o obj.o delete.o inst.o util.o error.o \
|
OBJS = fped.o expr.o coord.o obj.o delete.o inst.o util.o error.o \
|
||||||
unparse.o file.o dump.o kicad.o postscript.o meas.o \
|
unparse.o file.o dump.o kicad.o postscript.o gnuplot.o meas.o \
|
||||||
layer.o overlap.o hole.o tsort.o bitset.o \
|
layer.o overlap.o hole.o tsort.o bitset.o \
|
||||||
cpp.o lex.yy.o y.tab.o \
|
cpp.o lex.yy.o y.tab.o \
|
||||||
gui.o gui_util.o gui_style.o gui_inst.o gui_status.o gui_canvas.o \
|
gui.o gui_util.o gui_style.o gui_inst.o gui_status.o gui_canvas.o \
|
||||||
|
16
file.c
16
file.c
@ -20,6 +20,7 @@
|
|||||||
#include "dump.h"
|
#include "dump.h"
|
||||||
#include "kicad.h"
|
#include "kicad.h"
|
||||||
#include "postscript.h"
|
#include "postscript.h"
|
||||||
|
#include "gnuplot.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
#include "fped.h"
|
#include "fped.h"
|
||||||
@ -197,3 +198,18 @@ void write_ps_fullpage(const char *one)
|
|||||||
{
|
{
|
||||||
do_write_ps(postscript_fullpage, one);
|
do_write_ps(postscript_fullpage, one);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void write_gnuplot(const char *one)
|
||||||
|
{
|
||||||
|
char *name;
|
||||||
|
|
||||||
|
if (save_file_name) {
|
||||||
|
name = set_extension(save_file_name, "gp");
|
||||||
|
save_to(name, gnuplot, one);
|
||||||
|
free(name);
|
||||||
|
} else {
|
||||||
|
if (!gnuplot(stdout, one))
|
||||||
|
perror("stdout");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
1
file.h
1
file.h
@ -32,5 +32,6 @@ void save_fpd(void);
|
|||||||
void write_kicad(void);
|
void write_kicad(void);
|
||||||
void write_ps(const char *one);
|
void write_ps(const char *one);
|
||||||
void write_ps_fullpage(const char *one);
|
void write_ps_fullpage(const char *one);
|
||||||
|
void write_gnuplot(const char *one);
|
||||||
|
|
||||||
#endif /* !FILE_H */
|
#endif /* !FILE_H */
|
||||||
|
20
fped.c
20
fped.c
@ -69,15 +69,17 @@ static void usage(const char *name)
|
|||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"usage: %s [batch_mode] [cpp_option ...] [in_file [out_file]]\n\n"
|
"usage: %s [batch_mode] [cpp_option ...] [in_file [out_file]]\n\n"
|
||||||
"Batch mode options:\n"
|
"Batch mode options:\n"
|
||||||
|
" -g [-1 package]\n"
|
||||||
|
" write gnuplot output, then exit\n"
|
||||||
" -k write KiCad output, then exit\n"
|
" -k write KiCad output, then exit\n"
|
||||||
" -p write Postscript output, then exit\n"
|
" -p write Postscript output, then exit\n"
|
||||||
" -P [-s scale] [-1 package]\n"
|
" -P [-s scale] [-1 package]\n"
|
||||||
" write Postscript output (full page), then exit\n"
|
" write Postscript output (full page), then exit\n"
|
||||||
" -1 name output only the specified package\n"
|
|
||||||
" -s scale scale factor for -P (default: auto-scale)\n"
|
|
||||||
" -T test mode. Load file, then exit\n"
|
" -T test mode. Load file, then exit\n"
|
||||||
" -T -T test mode. Load file, dump to stdout, then exit\n\n"
|
" -T -T test mode. Load file, dump to stdout, then exit\n\n"
|
||||||
"Common options:\n"
|
"Common options:\n"
|
||||||
|
" -1 name output only the specified package\n"
|
||||||
|
" -s scale scale factor for -P (default: auto-scale)\n"
|
||||||
" cpp_option -Idir, -Dname[=value], or -Uname\n"
|
" cpp_option -Idir, -Dname[=value], or -Uname\n"
|
||||||
, name);
|
, name);
|
||||||
exit(1);
|
exit(1);
|
||||||
@ -91,6 +93,7 @@ int main(int argc, char **argv)
|
|||||||
batch_kicad,
|
batch_kicad,
|
||||||
batch_ps,
|
batch_ps,
|
||||||
batch_ps_fullpage,
|
batch_ps_fullpage,
|
||||||
|
batch_gnuplot,
|
||||||
batch_test
|
batch_test
|
||||||
} batch = batch_none;
|
} batch = batch_none;
|
||||||
char *name = *argv;
|
char *name = *argv;
|
||||||
@ -104,11 +107,16 @@ int main(int argc, char **argv)
|
|||||||
const char *one = NULL;
|
const char *one = NULL;
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
while ((c = getopt(argc, argv, "1:kps:D:I:PTU:")) != EOF)
|
while ((c = getopt(argc, argv, "1:gkps:D:I:PTU:")) != EOF)
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case '1':
|
case '1':
|
||||||
one = optarg;
|
one = optarg;
|
||||||
break;
|
break;
|
||||||
|
case 'g':
|
||||||
|
if (batch)
|
||||||
|
usage(*argv);
|
||||||
|
batch = batch_gnuplot;
|
||||||
|
break;
|
||||||
case 'k':
|
case 'k':
|
||||||
if (batch)
|
if (batch)
|
||||||
usage(*argv);
|
usage(*argv);
|
||||||
@ -146,7 +154,8 @@ int main(int argc, char **argv)
|
|||||||
usage(name);
|
usage(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (one && batch != batch_ps && batch != batch_ps_fullpage)
|
if (one && batch != batch_ps && batch != batch_ps_fullpage &&
|
||||||
|
batch != batch_gnuplot)
|
||||||
usage(name);
|
usage(name);
|
||||||
|
|
||||||
if (!batch) {
|
if (!batch) {
|
||||||
@ -200,6 +209,9 @@ int main(int argc, char **argv)
|
|||||||
case batch_ps_fullpage:
|
case batch_ps_fullpage:
|
||||||
write_ps_fullpage(one);
|
write_ps_fullpage(one);
|
||||||
break;
|
break;
|
||||||
|
case batch_gnuplot:
|
||||||
|
write_gnuplot(one);
|
||||||
|
break;
|
||||||
case batch_test:
|
case batch_test:
|
||||||
dump(stdout, NULL);
|
dump(stdout, NULL);
|
||||||
break;
|
break;
|
||||||
|
199
gnuplot.c
Normal file
199
gnuplot.c
Normal file
@ -0,0 +1,199 @@
|
|||||||
|
/*
|
||||||
|
* gnuplot.c - Dump objects in gnuplot 2D format
|
||||||
|
*
|
||||||
|
* Written 2011 by Werner Almesberger
|
||||||
|
* Copyright 2011 by 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
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "coord.h"
|
||||||
|
#include "inst.h"
|
||||||
|
#include "gnuplot.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define ARC_STEP 0.1 /* @@@ make configurable */
|
||||||
|
|
||||||
|
|
||||||
|
static void recurse_id(FILE *file, const struct inst *inst)
|
||||||
|
{
|
||||||
|
if (inst->obj->frame->name) {
|
||||||
|
recurse_id(file, inst->outer);
|
||||||
|
fprintf(file, "/%s", inst->obj->frame->name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void identify(FILE *file, const struct inst *inst)
|
||||||
|
{
|
||||||
|
fprintf(file, "#%%id=");
|
||||||
|
recurse_id(file, inst);
|
||||||
|
fprintf(file, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void gnuplot_line(FILE *file, const struct inst *inst)
|
||||||
|
{
|
||||||
|
double xa, ya, xb, yb;
|
||||||
|
|
||||||
|
xa = units_to_mm(inst->base.x);
|
||||||
|
ya = units_to_mm(inst->base.y);
|
||||||
|
xb = units_to_mm(inst->u.rect.end.x);
|
||||||
|
yb = units_to_mm(inst->u.rect.end.y);
|
||||||
|
|
||||||
|
identify(file, inst);
|
||||||
|
fprintf(file, "#%%r=%f\n%f %f\n%f %f\n\n",
|
||||||
|
units_to_mm(inst->u.rect.width), xa, ya, xb, yb);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void gnuplot_rect(FILE *file, const struct inst *inst)
|
||||||
|
{
|
||||||
|
double xa, ya, xb, yb;
|
||||||
|
|
||||||
|
xa = units_to_mm(inst->base.x);
|
||||||
|
ya = units_to_mm(inst->base.y);
|
||||||
|
xb = units_to_mm(inst->u.rect.end.x);
|
||||||
|
yb = units_to_mm(inst->u.rect.end.y);
|
||||||
|
|
||||||
|
identify(file, inst);
|
||||||
|
fprintf(file, "#%%r=%f\n", units_to_mm(inst->u.rect.width));
|
||||||
|
fprintf(file, "%f %f\n", xa, ya);
|
||||||
|
fprintf(file, "%f %f\n", xa, yb);
|
||||||
|
fprintf(file, "%f %f\n", xb, yb);
|
||||||
|
fprintf(file, "%f %f\n", xb, ya);
|
||||||
|
fprintf(file, "%f %f\n\n", xa, ya);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void gnuplot_circ(FILE *file, const struct inst *inst)
|
||||||
|
{
|
||||||
|
double cx, cy, r;
|
||||||
|
double a;
|
||||||
|
int n, i;
|
||||||
|
|
||||||
|
cx = units_to_mm(inst->base.x);
|
||||||
|
cy = units_to_mm(inst->base.y);
|
||||||
|
r = units_to_mm(inst->u.arc.r);
|
||||||
|
|
||||||
|
identify(file, inst);
|
||||||
|
fprintf(file, "#%%r=%f\n", units_to_mm(inst->u.arc.width));
|
||||||
|
|
||||||
|
n = ceil(2*r*M_PI/ARC_STEP);
|
||||||
|
if (n < 2)
|
||||||
|
n = 2;
|
||||||
|
|
||||||
|
for (i = 0; i <= n; i++) {
|
||||||
|
a = 2*M_PI/n*i;
|
||||||
|
fprintf(file, "%f %f\n", cx+r*sin(a), cy+r*cos(a));
|
||||||
|
}
|
||||||
|
fprintf(file, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void gnuplot_arc(FILE *file, const struct inst *inst)
|
||||||
|
{
|
||||||
|
abort();
|
||||||
|
#if 0
|
||||||
|
struct coord p;
|
||||||
|
double a;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The documentation says:
|
||||||
|
* Xstart, Ystart, Xend, Yend, Angle, Width, Layer
|
||||||
|
*
|
||||||
|
* But it's really:
|
||||||
|
* Xcenter, Ycenter, Xend, Yend, ...
|
||||||
|
*/
|
||||||
|
p = rotate_r(inst->base, inst->u.arc.r, inst->u.arc.a2);
|
||||||
|
a = inst->u.arc.a2-inst->u.arc.a1;
|
||||||
|
while (a <= 0)
|
||||||
|
a += 360;
|
||||||
|
while (a > 360)
|
||||||
|
a -= 360;
|
||||||
|
fprintf(file, "DA %d %d %d %d %d %d %d\n",
|
||||||
|
units_to_kicad(inst->base.x),
|
||||||
|
-units_to_kicad(inst->base.y),
|
||||||
|
units_to_kicad(p.x),
|
||||||
|
-units_to_kicad(p.y),
|
||||||
|
(int) (a*10.0),
|
||||||
|
units_to_kicad(inst->u.arc.width),
|
||||||
|
layer_silk_top);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void gnuplot_inst(FILE *file, enum inst_prio prio,
|
||||||
|
const struct inst *inst)
|
||||||
|
{
|
||||||
|
switch (prio) {
|
||||||
|
case ip_pad_copper:
|
||||||
|
case ip_pad_special:
|
||||||
|
/* complain ? */
|
||||||
|
break;
|
||||||
|
case ip_hole:
|
||||||
|
/* complain ? */
|
||||||
|
break;
|
||||||
|
case ip_line:
|
||||||
|
gnuplot_line(file, inst);
|
||||||
|
break;
|
||||||
|
case ip_rect:
|
||||||
|
gnuplot_rect(file, inst);
|
||||||
|
break;
|
||||||
|
case ip_circ:
|
||||||
|
gnuplot_circ(file, inst);
|
||||||
|
break;
|
||||||
|
case ip_arc:
|
||||||
|
gnuplot_arc(file, inst);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/*
|
||||||
|
* Don't try to export vectors, frame references, or
|
||||||
|
* measurements.
|
||||||
|
*/
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void gnuplot_package(FILE *file, const struct pkg *pkg)
|
||||||
|
{
|
||||||
|
enum inst_prio prio;
|
||||||
|
const struct inst *inst;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Package name
|
||||||
|
*/
|
||||||
|
fprintf(file, "# %s\n", pkg->name);
|
||||||
|
|
||||||
|
FOR_INST_PRIOS_UP(prio) {
|
||||||
|
for (inst = pkgs->insts[prio]; inst; inst = inst->next)
|
||||||
|
gnuplot_inst(file, prio, inst);
|
||||||
|
for (inst = pkg->insts[prio]; inst; inst = inst->next)
|
||||||
|
gnuplot_inst(file, prio, inst);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(file, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int gnuplot(FILE *file, const char *one)
|
||||||
|
{
|
||||||
|
const struct pkg *pkg;
|
||||||
|
|
||||||
|
for (pkg = pkgs; pkg; pkg = pkg->next)
|
||||||
|
if (pkg->name)
|
||||||
|
if (!one || !strcmp(pkg->name, one))
|
||||||
|
gnuplot_package(file, pkg);
|
||||||
|
|
||||||
|
fflush(file);
|
||||||
|
return !ferror(file);
|
||||||
|
}
|
22
gnuplot.h
Normal file
22
gnuplot.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* gnuplot.h - Dump objects in gnuplot 2D format
|
||||||
|
*
|
||||||
|
* Written 2011 by Werner Almesberger
|
||||||
|
* Copyright 2011 by 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
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef GNUPLOT_H
|
||||||
|
#define GNUPLOT_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
int gnuplot(FILE *file, const char *one);
|
||||||
|
|
||||||
|
#endif /* !GNUPLOT_H */
|
Loading…
Reference in New Issue
Block a user