[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: gEDA-user: Regression in autorouter and/or trace optimiser from pcb20081128 to pcb20091103 ?



I've logged this issue on the soureforge bug tracker, issue #2946254

I've also diagnosed the problem - the autorouter often makes small
"overhangs" where a line segment slightly "overshoots" the
intersection with another segment. These overhangs are tiny -
typically 0.01 thou. Unfortunately these overhangs are enough to
prevent mitering.

Workaround
The following patch against the head of the repository extends the trace
optimiser "simple" optimization function to remove the overhangs. This
means that mitering becomes possible by performing "trace optimiser ->
simple optimisations" after autorouting operations.

Any feedback on the patch would be welcome.

Cheers,
Stephen

diff --git a/src/djopt.c b/src/djopt.c
index 68b3641..8422a20 100644
--- a/src/djopt.c
+++ b/src/djopt.c
@@ -75,6 +75,10 @@ RCSID ("$Id$");
#define ORIENT(x) ((x) & 0xf0)
#define DIRECT(x) ((x) & 0x0f)

+/* square of the length of the longest "freckle" */
+#define LONGEST_FRECKLE 3
+#define SQ(x) ((x) * (x))
+
struct line_s;

typedef struct corner_s
@@ -1230,6 +1234,18 @@ simple_optimize_corner (corner_s * c)
}
}
check (c, 0);
+ if (c->n_lines == 1 && !c->via)
+ {
+ /* see if it is a "freckle" */
+ corner_s *c0 = other_corner (c->lines[0], c);
+ if (SQ(c->x - c0->x) + SQ(c->y - c0->y) < LONGEST_FRECKLE)
+ {
+ dprintf ("freckle %d,%d to %d,%d\n",
+ c->x, c->y, c0->x, c0->y);
+ move_corner (c, c0->x, c0->y);
+ }
+ }
+ check (c, 0);
return rv;
}


_______________________________________________
geda-user mailing list
geda-user@xxxxxxxxxxxxxx
http://www.seul.org/cgi-bin/mailman/listinfo/geda-user