1
0
mirror of git://projects.qi-hardware.com/eda-tools.git synced 2024-12-24 01:03:20 +02:00

sch2fig/: add filling of boxes and polygons

This commit is contained in:
Werner Almesberger 2016-07-24 22:57:52 -03:00
parent 1aaf1f8fb2
commit d6b73479ad
4 changed files with 93 additions and 53 deletions

View File

@ -48,41 +48,6 @@ static inline float pt(int x)
} }
/* ----- Library items ----------------------------------------------------- */
void fig_rect(int sx, int sy, int ex, int ey)
{
// Type Thick Depth StyleV Rad
// SubTy Color Pen Join FwdAr
// Style FillCol AreaFil Cap BwdAr
printf("2 2 0 %d %d 7 %d -1 -1 0.0 1 1 -1 0 0 5\n",
WIDTH_COMP_DWG, COLOR_COMP_DWG, LAYER_COMP_DWG);
printf("\t%d %d %d %d %d %d %d %d %d %d\n",
cx(sx), cy(sy), cx(ex), cy(sy), cx(ex), cy(ey), cx(sx), cy(ey),
cx(sx), cy(sy));
}
void fig_poly(int points, int x[points], int y[points],
unsigned color, unsigned layer)
{
int i;
char ch = '\t';
// Type Thick Depth StyleV Rad
// SubTy Color Pen Join FwdAr
// Style FillCol AreaFil Cap BwdAr
printf("2 1 0 %d %d 7 %d -1 -1 0.0 1 1 -1 0 0 %d\n",
WIDTH_COMP_DWG, color, layer, points);
for (i = 0; i != points; i++) {
printf("%c%d %d", ch, cx(x[i]), cy(y[i]));
ch = ' ';
}
printf("\n");
}
/* ----- Schematics items -------------------------------------------------- */ /* ----- Schematics items -------------------------------------------------- */
@ -218,7 +183,7 @@ void fig_glabel(int x, int y, const char *s, int dir, int dim,
vx[0] = vx[n - 1]; vx[0] = vx[n - 1];
vy[0] = vy[n - 1]; vy[0] = vy[n - 1];
fig_poly(n, vx, vy, COLOR_GLABEL, LAYER_GLABEL); fig_poly(n, vx, vy, COLOR_GLABEL, COLOR_NONE, LAYER_GLABEL);
} }
@ -238,9 +203,9 @@ void fig_noconn(int x, int y)
int vx[2] = { x - NOCONN_LEN, x + NOCONN_LEN }; int vx[2] = { x - NOCONN_LEN, x + NOCONN_LEN };
int vy[2] = { y - NOCONN_LEN, y + NOCONN_LEN }; int vy[2] = { y - NOCONN_LEN, y + NOCONN_LEN };
fig_poly(2, vx, vy, COLOR_NOCONN, LAYER_NOCONN); fig_poly(2, vx, vy, COLOR_NOCONN, COLOR_NONE, LAYER_NOCONN);
swap(vy[0], vy[1]); swap(vy[0], vy[1]);
fig_poly(2, vx, vy, COLOR_NOCONN, LAYER_NOCONN); fig_poly(2, vx, vy, COLOR_NOCONN, COLOR_NONE, LAYER_NOCONN);
} }
@ -269,6 +234,41 @@ void fig_line(int sx, int sy, int ex, int ey)
/* ----- General items ----------------------------------------------------- */ /* ----- General items ----------------------------------------------------- */
void fig_rect(int sx, int sy, int ex, int ey,
int color, int fill_color, unsigned layer)
{
// Type Thick Depth StyleV Rad
// SubTy Color Pen Join FwdAr
// Style FillCol AreaFil Cap BwdAr
printf("2 2 0 %d %d %d %d -1 %d 0.0 1 1 -1 0 0 5\n",
color == -1 ? 0 : WIDTH_COMP_DWG, color, fill_color, layer,
fill_color == -1 ? -1 : 20);
printf("\t%d %d %d %d %d %d %d %d %d %d\n",
cx(sx), cy(sy), cx(ex), cy(sy), cx(ex), cy(ey), cx(sx), cy(ey),
cx(sx), cy(sy));
}
void fig_poly(int points, int x[points], int y[points],
int color, int fill_color, unsigned layer)
{
int i;
char ch = '\t';
// Type Thick Depth StyleV Rad
// SubTy Color Pen Join FwdAr
// Style FillCol AreaFil Cap BwdAr
printf("2 1 0 %d %d %d %d -1 %d 0.0 1 1 -1 0 0 %d\n",
color == -1 ? 0 : WIDTH_COMP_DWG, color, fill_color, layer,
fill_color == -1 ? -1 : 20, points);
for (i = 0; i != points; i++) {
printf("%c%d %d", ch, cx(x[i]), cy(y[i]));
ch = ' ';
}
printf("\n");
}
void fig_text(int x, int y, const char *s, unsigned size, void fig_text(int x, int y, const char *s, unsigned size,
enum text_align align, int rot, unsigned color, unsigned layer) enum text_align align, int rot, unsigned color, unsigned layer)
{ {

View File

@ -26,10 +26,6 @@ enum fig_shape {
}; };
/* libraries */
void fig_rect(int sx, int sy, int ex, int ey);
/* schematics */ /* schematics */
void fig_glabel(int x, int y, const char *s, int dir, int dim, void fig_glabel(int x, int y, const char *s, int dir, int dim,
@ -43,8 +39,10 @@ void fig_line(int sx, int sy, int ex, int ey);
/* general */ /* general */
void fig_rect(int sx, int sy, int ex, int ey,
int color, int fill_color, unsigned layer);
void fig_poly(int points, int x[points], int y[points], void fig_poly(int points, int x[points], int y[points],
unsigned color, unsigned layer); int color, int fill_color, unsigned layer);
void fig_text(int x, int y, const char *s, unsigned size, void fig_text(int x, int y, const char *s, unsigned size,
enum text_align align, int rot, unsigned color, unsigned layer); enum text_align align, int rot, unsigned color, unsigned layer);

View File

@ -40,14 +40,14 @@ struct obj {
unsigned unit; unsigned unit;
unsigned convert; unsigned convert;
union { union {
struct poly { struct poly_obj {
int thick; int thick;
char fill; char fill;
int points; int points;
int *x; int *x;
int *y; int *y;
} poly; } poly;
struct { struct rect_obj {
int thick; int thick;
char fill; char fill;
int sx, sy; int sx, sy;
@ -106,7 +106,7 @@ static struct comp **next_comp = &comps;
static struct obj **next_obj; static struct obj **next_obj;
static void draw_poly(const struct poly *poly, int m[6]) static void draw_poly(const struct poly_obj *poly, int m[6])
{ {
int n = poly->points; int n = poly->points;
int x[n]; int x[n];
@ -117,7 +117,49 @@ static void draw_poly(const struct poly *poly, int m[6])
x[i] = mx(poly->x[i], poly->y[i], m); x[i] = mx(poly->x[i], poly->y[i], m);
y[i] = my(poly->x[i], poly->y[i], m); y[i] = my(poly->x[i], poly->y[i], m);
} }
fig_poly(n, x, y, COLOR_COMP_DWG, LAYER_COMP_DWG);
fig_poly(n, x, y, COLOR_COMP_DWG, COLOR_NONE, LAYER_COMP_DWG);
switch (poly->fill) {
case 'N':
break;
case 'F':
fig_poly(n, x, y, COLOR_NONE, COLOR_COMP_DWG,
LAYER_COMP_DWG_BG);
break;
case 'f':
fig_poly(n, x, y, COLOR_NONE, COLOR_COMP_DWG_BG,
LAYER_COMP_DWG_BG);
break;
default:
abort();
}
}
static void draw_rect(const struct rect_obj *rect, int m[6])
{
int sx = mx(rect->sx, rect->sy, m);
int sy = my(rect->sx, rect->sy, m);
int ex = mx(rect->ex, rect->ey, m);
int ey = my(rect->ex, rect->ey, m);
fig_rect(sx, sy, ex, ey, COLOR_COMP_DWG, COLOR_NONE, LAYER_COMP_DWG);
switch (rect->fill) {
case 'N':
break;
case 'F':
fig_rect(sx, sy, ex, ey, COLOR_NONE, COLOR_COMP_DWG,
LAYER_COMP_DWG_BG);
break;
case 'f':
fig_rect(sx, sy, ex, ey, COLOR_NONE, COLOR_COMP_DWG_BG,
LAYER_COMP_DWG_BG);
break;
default:
abort();
}
} }
@ -157,7 +199,7 @@ static void draw_pin(const struct comp *comp, const struct pin_obj *pin,
y[0] = my(pin->x, pin->y, m); y[0] = my(pin->x, pin->y, m);
x[1] = mx(pin->x + dx * pin->length, pin->y + dy * pin->length, m); x[1] = mx(pin->x + dx * pin->length, pin->y + dy * pin->length, m);
y[1] = my(pin->x + dx * pin->length, pin->y + dy * pin->length, m); y[1] = my(pin->x + dx * pin->length, pin->y + dy * pin->length, m);
fig_poly(2, x, y, COLOR_COMP_DWG, LAYER_COMP_DWG); fig_poly(2, x, y, COLOR_COMP_DWG, COLOR_NONE, LAYER_COMP_DWG);
dx *= pin->length + comp->name_offset; dx *= pin->length + comp->name_offset;
dy *= pin->length + comp->name_offset; dy *= pin->length + comp->name_offset;
@ -201,11 +243,7 @@ static void draw(const struct comp *comp, const struct obj *obj, int m[6])
draw_poly(&obj->u.poly, m); draw_poly(&obj->u.poly, m);
break; break;
case obj_rect: case obj_rect:
fig_rect(mx(obj->u.rect.sx, obj->u.rect.sy, m), draw_rect(&obj->u.rect, m);
my(obj->u.rect.sx, obj->u.rect.sy, m),
mx(obj->u.rect.ex, obj->u.rect.ey, m),
my(obj->u.rect.ex, obj->u.rect.ey, m));
// @@@
break; break;
case obj_circ: case obj_circ:
unsupported("circle"); unsupported("circle");

View File

@ -13,14 +13,17 @@
#ifndef STYLE_H #ifndef STYLE_H
#define STYLE_H #define STYLE_H
#define COLOR_NONE -1
#define COLOR_BLACK 0 #define COLOR_BLACK 0
#define COLOR_BLUE 1 #define COLOR_BLUE 1
#define COLOR_YELLOW 6
#define COLOR_GREEN4 12 #define COLOR_GREEN4 12
#define COLOR_CYAN3 16 #define COLOR_CYAN3 16
#define COLOR_RED4 18 #define COLOR_RED4 18
#define COLOR_RED3 19 #define COLOR_RED3 19
#define COLOR_COMP_DWG COLOR_RED4 #define COLOR_COMP_DWG COLOR_RED4
#define COLOR_COMP_DWG_BG COLOR_YELLOW
#define COLOR_SHEET_DWG COLOR_BLUE #define COLOR_SHEET_DWG COLOR_BLUE
#define COLOR_TEXT COLOR_BLUE #define COLOR_TEXT COLOR_BLUE
#define COLOR_WIRE COLOR_GREEN4 #define COLOR_WIRE COLOR_GREEN4
@ -41,6 +44,7 @@
#define LAYER_PIN_NUMBER LAYER_FIELD #define LAYER_PIN_NUMBER LAYER_FIELD
#define LAYER_LINES 100 #define LAYER_LINES 100
#define LAYER_COMP_DWG 120 #define LAYER_COMP_DWG 120
#define LAYER_COMP_DWG_BG 200
#define WIDTH_WIRE 2 #define WIDTH_WIRE 2
#define WIDTH_LINE 2 #define WIDTH_LINE 2