mirror of
git://projects.qi-hardware.com/eda-tools.git
synced 2024-11-22 20:53:44 +02:00
eeshow/kicad/delta.c: merge adjacent wires going in the same direction
This commit is contained in:
parent
54afbf5b68
commit
ab888e7bdc
@ -368,6 +368,74 @@ static void init_res(struct sheet *res)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int min(int a, int b)
|
||||||
|
{
|
||||||
|
return a < b ? a : b;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int max(int a, int b)
|
||||||
|
{
|
||||||
|
return a > b ? a : b;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void merge_coord(int *sa, int *ea, int sb, int eb)
|
||||||
|
{
|
||||||
|
int tmp;
|
||||||
|
|
||||||
|
tmp = min(min(*sa, *ea), min(sb, eb));
|
||||||
|
*ea = max(max(*sa, *ea), max(sb, eb));
|
||||||
|
*sa = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool merge_wire(struct sch_obj *a, const struct sch_obj *b)
|
||||||
|
{
|
||||||
|
struct sch_wire *wa = &a->u.wire;
|
||||||
|
const struct sch_wire *wb = &b->u.wire;
|
||||||
|
|
||||||
|
if (a->x == b->x && a->x == wa->ex && a->x == wb->ex &&
|
||||||
|
(a->y == b->y || a->y == wb->ey || wa->ey == b->y ||
|
||||||
|
wa->ey == wb->ey)) {
|
||||||
|
merge_coord(&a->y, &wa->ey, b->y, wb->ey);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (a->y == b->y && a->y == wa->ey && a->y == wb->ey &&
|
||||||
|
(a->x == b->x || a->x == wb->ex || wa->ex == b->x ||
|
||||||
|
wa->ex == wb->ex)) {
|
||||||
|
merge_coord(&a->x, &wa->ex, b->x, wb->ex);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void merge_wires(struct sch_obj *a)
|
||||||
|
{
|
||||||
|
struct sch_obj **b, **next;
|
||||||
|
|
||||||
|
for (; a; a = a->next) {
|
||||||
|
if (a->type != sch_obj_wire)
|
||||||
|
continue;
|
||||||
|
for (b = &a->next; *b; b = next) {
|
||||||
|
next = &(*b)->next;
|
||||||
|
if ((*b)->type != sch_obj_wire)
|
||||||
|
continue;
|
||||||
|
if (a->u.wire.fn != (*b)->u.wire.fn)
|
||||||
|
return;
|
||||||
|
if (merge_wire(a, *b)) {
|
||||||
|
struct sch_obj *tmp = *b;
|
||||||
|
|
||||||
|
*b = *next;
|
||||||
|
free(tmp);
|
||||||
|
next = b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void delta(const struct sheet *a, const struct sheet *b,
|
void delta(const struct sheet *a, const struct sheet *b,
|
||||||
struct sheet *res_a, struct sheet *res_b, struct sheet *res_ab)
|
struct sheet *res_a, struct sheet *res_b, struct sheet *res_ab)
|
||||||
{
|
{
|
||||||
@ -389,6 +457,9 @@ void delta(const struct sheet *a, const struct sheet *b,
|
|||||||
objs_a = objs_clone(a->objs);
|
objs_a = objs_clone(a->objs);
|
||||||
objs_b = objs_clone(b->objs);
|
objs_b = objs_clone(b->objs);
|
||||||
|
|
||||||
|
merge_wires(objs_a);
|
||||||
|
merge_wires(objs_b);
|
||||||
|
|
||||||
while (objs_a) {
|
while (objs_a) {
|
||||||
next_a = objs_a->next;
|
next_a = objs_a->next;
|
||||||
for (obj_b = &objs_b; *obj_b; obj_b = &(*obj_b)->next)
|
for (obj_b = &objs_b; *obj_b; obj_b = &(*obj_b)->next)
|
||||||
|
Loading…
Reference in New Issue
Block a user