<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -17,8 +17,8 @@
 # along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.
 # ### BOILERPLATE ###
 
-from Tuke.geometry import Polygon
-from Tuke.units import IN
+from Tuke.geometry import Hole,centerof
+from Tuke.units import IN,MIL
 
 import shapely.geometry
 
@@ -30,6 +30,9 @@ def to_gerber(elem):
 
     layers = {}
 
+    # key is size, value is list of vertexes
+    drill_hits = {}
+
     for g in elem.iterlayout():
         def s(n):
             &quot;&quot;&quot;Convert float n meters to gerber 3.5 format, (inches) leading zeros removed&quot;&quot;&quot;
@@ -39,36 +42,44 @@ def to_gerber(elem):
             # The int() effectively removes tailing decimals and leading zeros.
             return str(int(n))
 
-        if not hasattr(g,'render'):
-            continue
-
-        (coords,ext_coords) = g.render()
+        if hasattr(g,'render'):
+            (coords,ext_coords) = g.render()
 
-        l = str(g.layer)
+            l = str(g.layer)
 
-        # convert coords to mm
-        def t(v):
-            return (s(v[0,0]),s(v[0,1]))
-        coords = [t(v) for v in coords]
+            # convert coords to mm
+            def t(v):
+                return (s(v[0,0]),s(v[0,1]))
+            coords = [t(v) for v in coords]
 
-        # Create gerber layers for each element layer.
-        if not layers.has_key(l):
-            layers[l] = ''
+            # Create gerber layers for each element layer.
+            if not layers.has_key(l):
+                layers[l] = ''
 
-        # Comment for debugging
-        layers[l] += 'G04 id: %s *\n' % str(g.id)
+            # Comment for debugging
+            layers[l] += 'G04 id: %s *\n' % str(g.id)
 
-        # start Polygon Area Fill code
-        layers[l] += 'G36*\n'
+            # start Polygon Area Fill code
+            layers[l] += 'G36*\n'
 
-        # first vertex gets repeated to close the polygon
-        layers[l] += 'X%sY%sD02\n' % (str(coords[0][1]),str(coords[0][1]))
+            # first vertex gets repeated to close the polygon
+            layers[l] += 'X%sY%sD02\n' % (str(coords[0][1]),str(coords[0][1]))
 
-        # rest of the vertexes are handled normally
-        for (x,y) in coords:
-            layers[l] += 'X%sY%sD01*\n' % (str(x),str(y))
+            # rest of the vertexes are handled normally
+            for (x,y) in coords:
+                layers[l] += 'X%sY%sD01*\n' % (str(x),str(y))
 
-        layers[l] += 'G37*\n'
+            layers[l] += 'G37*\n'
+        elif isinstance(g,Hole):
+            l = None
+            # dia is expressed as 0.000 in inches
+            dia = str(round(g.dia / IN,3))
+            try:
+                l = drill_hits[dia]
+            except KeyError:
+                l = []
+                drill_hits[dia] = l
+            l.append(centerof(g))
 
     # add program end markers to all layers
     for l in layers.keys():
@@ -84,4 +95,30 @@ def to_gerber(elem):
 %ADD11C,0.0200*%
 &quot;&quot;&quot; + layers[l]
 
+    # Create drill layer
+    drill = []
+    drill.append('M48')
+    drill.append('INCH,TZ')
+    for n,dia in enumerate(sorted(drill_hits.keys())):
+        drill.append('T%dC%s' % (n + 11,dia))
+    drill.append('%')
+
+    for n,dia in enumerate(sorted(drill_hits.keys())):
+        drill.append('T%d' % (n + 11))
+        for v in drill_hits[dia]:
+            # Gerber drill file stores drill locations in to 4 decimal points
+            # in inches, but with the decimal point dropped.
+            #
+            # 12.3456 in -&gt; 123456
+            #
+            # Note that there must be exactly six digits, padding with leading
+            # zeros.
+            def s(x):
+                return '%0.6d' % ((x / IN) * 10000)
+            x = s(v[0,0])
+            y = s(v[0,1])
+            drill.append('X%sY%s' % (x,y))
+    drill.append('M30')
+    layers['drill'] = '\n'.join(drill)
+
     return layers </diff>
      <filename>Tuke/export/gerber.py</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>e7e21fa664b239e2bcc4f272f18d159d39963aea</id>
    </parent>
  </parents>
  <author>
    <name>Peter Todd</name>
    <email>pete@petertodd.org</email>
  </author>
  <url>http://github.com/retep/tuke/commit/794fd16409a8a719e5c1ea5b90e8d1d99488088f</url>
  <id>794fd16409a8a719e5c1ea5b90e8d1d99488088f</id>
  <committed-date>2008-04-28T19:37:02-07:00</committed-date>
  <authored-date>2008-04-28T19:37:02-07:00</authored-date>
  <message>export.to_gerber() now handles drill hits.</message>
  <tree>0cc18a7a815376cc9fabca69fb5740fcd4cca0e6</tree>
  <committer>
    <name>Peter Todd</name>
    <email>pete@petertodd.org</email>
  </committer>
</commit>
