pcb

Comment 2 for bug 699312

Revision history for this message
eschabor (eschabor) wrote :

Better diagnosis:
I've checked further and found that the problem is not that the autorouter makes tiny gaps, it is actually the opposite 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.

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;
 }