mirror of
git://projects.qi-hardware.com/eda-tools.git
synced 2024-11-05 16:50:17 +02:00
sch2fig/: support arcs
This commit is contained in:
parent
e37765fd12
commit
b903f53c3f
@ -352,6 +352,41 @@ void fig_circ(int x, int y, int r, int color, int fill_color, unsigned layer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int ax(int x, int y, int r, int angle)
|
||||||
|
{
|
||||||
|
float a = angle / 180.0 * M_PI;
|
||||||
|
|
||||||
|
return cx(x + r * cos(a));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int ay(int x, int y, int r, int angle)
|
||||||
|
{
|
||||||
|
float a = angle / 180.0 * M_PI;
|
||||||
|
|
||||||
|
return cy(y - r * sin(a));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void fig_arc(int x, int y, int r, int sa, int ea,
|
||||||
|
int color, int fill_color, unsigned layer)
|
||||||
|
{
|
||||||
|
int ma = (sa + ea) / 2;
|
||||||
|
|
||||||
|
// Type Thick Depth StyleV FwdAr
|
||||||
|
// SubTy Color Pen Cap BwdAr
|
||||||
|
// Style FillCol AreaFil Dir points
|
||||||
|
printf("5 1 0 %d %d %d %d -1 %d 0.0 1 0 0 0 %d %d %d %d %d %d %d %d\n",
|
||||||
|
color == -1 ? 0 : WIDTH_COMP_DWG, color, fill_color, layer,
|
||||||
|
fill_color == -1 ? -1 : 20,
|
||||||
|
cx(x), cy(y),
|
||||||
|
ax(x, y, r, sa), ay(x, y, r, sa),
|
||||||
|
ax(x, y, r, ma), ay(x, y, r, ma),
|
||||||
|
ax(x, y, r, ea), ay(x, y, r, ea));
|
||||||
|
/* @@@ Note: with y flipped, we counter-clockwise becomes clockwise */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
@ -46,6 +46,8 @@ void fig_rect(int sx, int sy, int ex, int ey,
|
|||||||
void fig_poly(int points, int x[points], int y[points],
|
void fig_poly(int points, int x[points], int y[points],
|
||||||
int color, int fill_color, unsigned layer);
|
int color, int fill_color, unsigned layer);
|
||||||
void fig_circ(int x, int y, int r, int color, int fill_color, unsigned layer);
|
void fig_circ(int x, int y, int r, int color, int fill_color, unsigned layer);
|
||||||
|
void fig_arc(int x, int y, int r, int sa, int ea,
|
||||||
|
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);
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
@ -59,6 +60,13 @@ struct obj {
|
|||||||
int thick;
|
int thick;
|
||||||
char fill;
|
char fill;
|
||||||
} circ;
|
} circ;
|
||||||
|
struct arc_obj {
|
||||||
|
int x, y;
|
||||||
|
int r;
|
||||||
|
int start_a, end_a;
|
||||||
|
int thick;
|
||||||
|
char fill;
|
||||||
|
} arc;
|
||||||
struct text_obj {
|
struct text_obj {
|
||||||
int orient;
|
int orient;
|
||||||
int x, y;
|
int x, y;
|
||||||
@ -188,6 +196,21 @@ static void draw_circ(const struct circ_obj *circ, int m[6])
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void draw_arc(const struct arc_obj *arc, int m[6])
|
||||||
|
{
|
||||||
|
int a = matrix_to_angle(m);
|
||||||
|
int x = mx(arc->x, arc->y, m);
|
||||||
|
int y = my(arc->x, arc->y, m);
|
||||||
|
int sa = angle_add(arc->start_a, a);
|
||||||
|
int ea = angle_add(arc->end_a, a);
|
||||||
|
|
||||||
|
fig_arc(x, y, arc->r, sa, ea,
|
||||||
|
COLOR_COMP_DWG, COLOR_NONE, LAYER_COMP_DWG);
|
||||||
|
|
||||||
|
assert(arc->fill == 'N');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void draw_pin(const struct comp *comp, const struct pin_obj *pin,
|
static void draw_pin(const struct comp *comp, const struct pin_obj *pin,
|
||||||
int m[6])
|
int m[6])
|
||||||
{
|
{
|
||||||
@ -314,7 +337,7 @@ static void draw(const struct comp *comp, const struct obj *obj, int m[6])
|
|||||||
draw_circ(&obj->u.circ, m);
|
draw_circ(&obj->u.circ, m);
|
||||||
break;
|
break;
|
||||||
case obj_arc:
|
case obj_arc:
|
||||||
unsupported("arc");
|
draw_arc(&obj->u.arc, m);
|
||||||
break;
|
break;
|
||||||
case obj_text:
|
case obj_text:
|
||||||
draw_text(&obj->u.text, m);
|
draw_text(&obj->u.text, m);
|
||||||
@ -372,20 +395,20 @@ static enum text_style decode_style(const char *s)
|
|||||||
/* ----- Polygons ---------------------------------------------------------- */
|
/* ----- Polygons ---------------------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
static bool parse_poly(struct obj *obj, const char *line, int points)
|
static bool parse_poly(struct poly_obj *poly, const char *line, int points)
|
||||||
{
|
{
|
||||||
int i, n;
|
int i, n;
|
||||||
|
|
||||||
obj->u.poly.points = points;
|
poly->points = points;
|
||||||
obj->u.poly.x = alloc_size(sizeof(int) * points);
|
poly->x = alloc_size(sizeof(int) * points);
|
||||||
obj->u.poly.y = alloc_size(sizeof(int) * points);
|
poly->y = alloc_size(sizeof(int) * points);
|
||||||
for (i = 0; i != points; i++) {
|
for (i = 0; i != points; i++) {
|
||||||
if (sscanf(line, "%d %d %n",
|
if (sscanf(line, "%d %d %n",
|
||||||
obj->u.poly.x + i, obj->u.poly.y + i, &n) != 2)
|
poly->x + i, poly->y + i, &n) != 2)
|
||||||
return 0;
|
return 0;
|
||||||
line += n;
|
line += n;
|
||||||
}
|
}
|
||||||
if (sscanf(line, "%c", &obj->u.poly.fill) != 1)
|
if (sscanf(line, "%c", &poly->fill) != 1)
|
||||||
return 0;
|
return 0;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -425,6 +448,25 @@ static bool parse_def(const char *line)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ----- Arcs -------------------------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
|
static bool parse_arc(struct obj *obj, const char *line)
|
||||||
|
{
|
||||||
|
struct arc_obj *arc = &obj->u.arc;
|
||||||
|
int a1, a2;
|
||||||
|
|
||||||
|
if (sscanf(line, "A %d %d %d %d %d %u %u %u %c",
|
||||||
|
&arc->x, &arc->y, &arc->r, &a1, &a2, &obj->unit, &obj->convert,
|
||||||
|
&arc->thick, &arc->fill) != 9)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
arc->start_a = a1 / 10;
|
||||||
|
arc->end_a = a2 / 10;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ----- Library parser ---------------------------------------------------- */
|
/* ----- Library parser ---------------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
@ -475,7 +517,7 @@ bool lib_parse(struct lib_ctx *ctx, const char *line)
|
|||||||
&points, &obj->unit, &obj->convert, &obj->u.poly.thick,
|
&points, &obj->unit, &obj->convert, &obj->u.poly.thick,
|
||||||
&n) == 4) {
|
&n) == 4) {
|
||||||
obj->type = obj_poly;
|
obj->type = obj_poly;
|
||||||
if (parse_poly(obj, line + n, points))
|
if (parse_poly(&obj->u.poly, line + n, points))
|
||||||
return 1;
|
return 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -493,9 +535,9 @@ bool lib_parse(struct lib_ctx *ctx, const char *line)
|
|||||||
obj->type = obj_circ;
|
obj->type = obj_circ;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (sscanf(line, "A %n", &n) == 0 && n) {
|
if (parse_arc(obj, line)) {
|
||||||
obj->type = obj_arc;
|
obj->type = obj_arc;
|
||||||
return 1; // @@@
|
return 1;
|
||||||
}
|
}
|
||||||
n = sscanf(line,
|
n = sscanf(line,
|
||||||
"T %d %d %d %d %u %u %u \"%m[^\"]\" %ms %u %c %c",
|
"T %d %d %d %d %u %u %u \"%m[^\"]\" %ms %u %c %c",
|
||||||
|
Loading…
Reference in New Issue
Block a user