1
0
mirror of git://projects.qi-hardware.com/eda-tools.git synced 2024-11-26 23:31:53 +02:00

sch2fig/: support hierarchical labels (with new geometry approach)

This commit is contained in:
Werner Almesberger 2016-07-29 19:29:59 -03:00
parent ab59b4f952
commit d63d183198
4 changed files with 158 additions and 2 deletions

View File

@ -14,6 +14,7 @@
#include <stdbool.h> #include <stdbool.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <math.h>
#include <assert.h> #include <assert.h>
#include "util.h" #include "util.h"
@ -231,6 +232,155 @@ void dwg_glabel(int x, int y, const char *s, int dir, int dim,
} }
static int make_box(enum box_type box, int h, int *vx, int *vy)
{
int r = h / 2;
switch (box) {
case box_simple:
vx[0] = 0;
vy[0] = -r;
vx[1] = 2 * r;
vy[1] = -r;
vx[2] = 2 * r;
vy[2] = r;
vx[3] = 0;
vy[3] = r;
return 4;
case box_right:
vx[0] = 0;
vy[0] = -r;
vx[1] = r;
vy[1] = -r;
vx[2] = 2 * r;
vy[2] = 0;
vx[3] = r;
vy[3] = r;
vx[4] = 0;
vy[4] = r;
return 5;
case box_left:
vx[0] = r;
vy[0] = -r;
vx[1] = 2 * r;
vy[1] = -r;
vx[2] = 2 * r;
vy[2] = r;
vx[3] = r;
vy[3] = r;
vx[4] = 0;
vy[4] = 0;
return 5;
case box_both:
vx[0] = 0;
vy[0] = 0;
vx[1] = r;
vy[1] = -r;
vx[2] = 2 * r;
vy[2] = 0;
vx[3] = r;
vy[3] = r;
return 4;
default:
assert(0);
}
}
/* @@@ rx, ry are from text.c; should go to misc.h or misc.c */
static int rx(int x, int y, int rot)
{
float a = rot / 180.0 * M_PI;
return cos(a) * x + sin(a) * y;
}
static int ry(int x, int y, int rot)
{
float a = rot / 180.0 * M_PI;
return -sin(a) * x + cos(a) * y;
}
void dwg_hlabel(int x, int y, const char *s, int dir, int dim,
enum fig_shape shape)
{
struct text txt = {
.s = s,
.size = dim,
.x = x,
.y = y,
.rot = 0,
.hor = 0,
.vert = text_mid,
};
int vx[6], vy[6];
int rot;
int n, i;
switch (shape) {
case fig_unspec:
n = make_box(box_simple, dim, vx, vy);
break;
case fig_in:
n = make_box(box_left, dim, vx, vy);
break;
case fig_out:
n = make_box(box_right, dim, vx, vy);
break;
case fig_bidir:
n = make_box(box_both, dim, vx, vy);
break;
default:
assert(0);
}
switch (dir) {
case 0: /* right */
rot = 180;
txt.hor = text_max;
break;
case 1: /* up */
rot = 90;
txt.hor = text_min;
break;
case 2: /* left */
rot = 0;
txt.hor = text_min;
break;
case 3: /* down */
rot = 270;
txt.hor = text_max;
break;
default:
assert(0);
}
txt.x += rx((1 + HLABEL_OFFSET_F) * dim, 0, rot);
txt.y += ry((1 + HLABEL_OFFSET_F) * dim, 0, rot);
for (i = 0; i != n; i++) {
int tmp;
tmp = x + rx(vx[i], vy[i], rot);
vy[i] = y + ry(vx[i], vy[i], rot);
vx[i] = tmp;
}
vx[n] = vx[0];
vy[n] = vy[0];
txt.rot = rot % 180;
text_fig(&txt, COLOR_HLABEL, LAYER_HLABEL);
fig_poly(n + 1, vx, vy, COLOR_HLABEL, COLOR_NONE, LAYER_HLABEL);
}
void dwg_junction(int x, int y) void dwg_junction(int x, int y)
{ {
fig_circ(x, y, JUNCTION_R, COLOR_NONE, COLOR_WIRE, LAYER_WIRES); fig_circ(x, y, JUNCTION_R, COLOR_NONE, COLOR_WIRE, LAYER_WIRES);

View File

@ -19,6 +19,8 @@
void dwg_label(int x, int y, const char *s, int dir, int dim, void dwg_label(int x, int y, const char *s, int dir, int dim,
enum fig_shape shape); enum fig_shape shape);
void dwg_hlabel(int x, int y, const char *s, int dir, int dim,
enum fig_shape shape);
void dwg_glabel(int x, int y, const char *s, int dir, int dim, void dwg_glabel(int x, int y, const char *s, int dir, int dim,
enum fig_shape shape); enum fig_shape shape);

View File

@ -297,8 +297,8 @@ bool sch_parse(struct sch_ctx *ctx, const char *line)
if (sscanf(line, "Text HLabel %d %d %d %d %ms", if (sscanf(line, "Text HLabel %d %d %d %d %ms",
&ctx->x, &ctx->y, &ctx->dir, &ctx->dim, &s) == 5) { &ctx->x, &ctx->y, &ctx->dir, &ctx->dim, &s) == 5) {
ctx->state = sch_text; ctx->state = sch_text;
unsupported("Text HLabel"); ctx->shape = decode_shape(s);
ctx->text = NULL; ctx->text = dwg_hlabel;
return 1; return 1;
} }
if (sscanf(line, "Text Label %d %d %d %d", if (sscanf(line, "Text Label %d %d %d %d",

View File

@ -22,6 +22,7 @@
#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_BROWN2 26
#define COLOR_COMP_DWG COLOR_RED4 #define COLOR_COMP_DWG COLOR_RED4
#define COLOR_COMP_DWG_BG COLOR_YELLOW #define COLOR_COMP_DWG_BG COLOR_YELLOW
@ -30,6 +31,7 @@
#define COLOR_WIRE COLOR_GREEN4 #define COLOR_WIRE COLOR_GREEN4
#define COLOR_NOCONN COLOR_BLUE #define COLOR_NOCONN COLOR_BLUE
#define COLOR_GLABEL COLOR_RED4 #define COLOR_GLABEL COLOR_RED4
#define COLOR_HLABEL COLOR_BROWN2 /* @@@ */
#define COLOR_LABEL COLOR_BLACK #define COLOR_LABEL COLOR_BLACK
#define COLOR_FIELD COLOR_CYAN4 #define COLOR_FIELD COLOR_CYAN4
#define COLOR_PIN_NAME COLOR_FIELD #define COLOR_PIN_NAME COLOR_FIELD
@ -38,6 +40,7 @@
#define FONT_HELVETICA_BOLD 18 #define FONT_HELVETICA_BOLD 18
#define LAYER_GLABEL 20 #define LAYER_GLABEL 20
#define LAYER_HLABEL LAYER_GLABEL
#define LAYER_LABEL LAYER_GLABEL #define LAYER_LABEL LAYER_GLABEL
#define LAYER_TEXT 30 #define LAYER_TEXT 30
#define LAYER_NOCONN 40 #define LAYER_NOCONN 40
@ -59,6 +62,7 @@
#define LABEL_OFFSET 15 // eeschema has more like 10 #define LABEL_OFFSET 15 // eeschema has more like 10
#define GLABEL_OFFSET 20 #define GLABEL_OFFSET 20
#define HLABEL_OFFSET_F 0.4 // * text size
#define PIN_NUM_OFFSET 15 // eeschema has more like 10 #define PIN_NUM_OFFSET 15 // eeschema has more like 10
#endif /* !STYLE_H */ #endif /* !STYLE_H */