From 9e8c1f4ca856a1a246bcb6714f6795616e9b1f6a Mon Sep 17 00:00:00 2001
From: Neil Gershenfeld <gersh@cba.mit.edu>
Date: Thu, 11 Nov 2021 16:54:14 -0500
Subject: [PATCH] start Excellon

---
 modules/path/formats/gerber | 66 +++++++++++++++++++++++++++++++++++--
 1 file changed, 64 insertions(+), 2 deletions(-)

diff --git a/modules/path/formats/gerber b/modules/path/formats/gerber
index cdea4b1..13dd048 100644
--- a/modules/path/formats/gerber
+++ b/modules/path/formats/gerber
@@ -1,8 +1,7 @@
 //
 // path to Gerber
 //
-// Neil Gershenfeld 
-// (c) Massachusetts Institute of Technology 2021
+// Neil Gershenfeld 11/11/21
 // 
 // This work may be reproduced, modified, distributed, performed, and 
 // displayed for any purpose, but must acknowledge the mods
@@ -157,6 +156,69 @@ function plot() {
       obj.contents = str
       outputs.Gerber.event(obj)
       }
+   else if (mod.drill.checked == true) {
+      var ds = []
+      var xs = []
+      var ys = []
+      var sx,sy,sd,x0,y0,d0
+      for (var seg = 0; seg < mod.path.length; ++seg) {
+         //
+         // find center
+         //
+         sx = sy = 0
+         for (var pt = 0; pt < mod.path[seg].length; ++pt) {
+            sx += imgwidth*mod.path[seg][pt][0]V/(mod.imageInfo.width-1)
+            sy += imgheight*mod.path[seg][pt][1]/(mod.imageInfo.height-1)
+            }
+         x0 = sx/mod.path[seg].length
+         y0 = sy/mod.path[seg].length
+         sd = 0
+         //
+         // find diameter
+         //
+         for (var pt = 0; pt < mod.path[seg].length; ++pt) {
+            x = imgwidth*mod.path[seg][pt][0]V/(mod.imageInfo.width-1)
+            y = imgheight*mod.path[seg][pt][1]/(mod.imageInfo.height-1)
+            sd += 2*Math.sqrt((x-x0)*(x-x0)+(y-y0)*(y-y0))
+            }
+         d0 = sd/mod.path[seg].length
+         xs.push(x0)
+         ys.push(y0)
+         ds.push(d0)
+         }
+      //
+      // sort diameters
+      //
+      var drills = {}
+      for (var hole = 0; hole < ds.length; ++hole) {
+         key = str(ds[hole].toFixed(2)
+         if (key in drills)
+            drills[key].push(hole)
+         else
+            drills[key] = [hole]
+         }
+      //
+      // write file
+      //
+      str += "M48\n"
+      str += "INCH,LZ\n"
+      str += "T01C0.02\n"
+      str += "M95\n"
+      str += "G05\n"
+      str += "T01\n"
+      str += "X6500Y4500\n"
+      for (var key in drills) {
+         for (var hole in drills[key].length) {
+            str += key+' '+hole+'\n'
+            }
+         }
+      str += "M30\n"
+      var obj = {}
+      obj.type = 'file'
+      obj.name = mod.imageInfo.name+'-drill.gbr'
+      obj.contents = str
+      outputs.Gerber.event(obj)
+      }
    }
 //
 // return values
-- 
GitLab