From e2a16fb84943c935eeae82749921ee293f895d97 Mon Sep 17 00:00:00 2001
From: Neil Gershenfeld <gersh@cba.mit.edu>
Date: Thu, 11 Nov 2021 21:14:11 -0500
Subject: [PATCH] Excellon working?

---
 modules/path/formats/gerber | 73 +++++++++++++++++++++++--------------
 1 file changed, 45 insertions(+), 28 deletions(-)

diff --git a/modules/path/formats/gerber b/modules/path/formats/gerber
index 13dd048..baf68f1 100644
--- a/modules/path/formats/gerber
+++ b/modules/path/formats/gerber
@@ -84,7 +84,6 @@ var interface = function(div){
       input.type = 'radio'
       input.name = mod.div.id+'format'
       input.id = mod.div.id+'outline'
-      input.disabled = true
       formats.appendChild(input)
    mod.drill = input
    formats.appendChild(document.createTextNode('drill'))
@@ -93,37 +92,44 @@ var interface = function(div){
 //
 // local functions
 //
-function format(x) {
+function gformat(x) {
+   // 6.6 omit leading
    var s = x.toFixed(6)
    s = s.substr(0,s.length-7)+s.substr(-6,6)
    return s
    }
 //
+function eformat(x) {
+   // 2.4 omit trailing
+   var s = (x/100).toFixed(6).substr(2)
+   return s
+   }
+//
 function plot() {
    var imgwidth = mod.imageInfo.width/parseFloat(mod.imageInfo.dpi)
    var imgheight = mod.imageInfo.height/parseFloat(mod.imageInfo.dpi)
    var x,y
    //
    str = ''
-   str += "%MOIN*%\n" // inch units
-   str += "%LPD*%\n" // layer dark
-   str += "%FSLAX66Y66*%\n" // format absolute 6.6
-   str += "G01*\n" // linear interpolation
    //
    if (mod.fill.checked == true) {
+      str += "%MOIN*%\n" // inch units
+      str += "%LPD*%\n" // layer dark
+      str += "%FSLAX66Y66*%\n" // format absolute 6.6
+      str += "G01*\n" // linear interpolation
       for (var seg = 0; seg < mod.path.length; ++seg) {
          str += "G36*\n"
          x = imgwidth*mod.path[seg][0][0]/(mod.imageInfo.width-1)
          y = imgheight*mod.path[seg][0][1]/(mod.imageInfo.height-1)
-         str += 'X'+format(x)+'Y'+format(y)+'D02*\n'
+         str += 'X'+gformat(x)+'Y'+gformat(y)+'D02*\n'
          for (var pt = 1; pt < mod.path[seg].length; ++pt) {
             var x = imgwidth*mod.path[seg][pt][0]/(mod.imageInfo.width-1)
             var y = imgheight*mod.path[seg][pt][1]/(mod.imageInfo.height-1)
-            str += 'X'+format(x)+'Y'+format(y)+'D01*\n'
+            str += 'X'+gformat(x)+'Y'+gformat(y)+'D01*\n'
             }
          x = imgwidth*mod.path[seg][0][0]/(mod.imageInfo.width-1)
          y = imgheight*mod.path[seg][0][1]/(mod.imageInfo.height-1)
-         str += 'X'+format(x)+'Y'+format(y)+'D01*\n'
+         str += 'X'+gformat(x)+'Y'+gformat(y)+'D01*\n'
          str += "G37*\n"
          }
       str += "M02*\n"
@@ -134,20 +140,24 @@ function plot() {
       outputs.Gerber.event(obj)
       }
    else if (mod.outline.checked == true) {
+      str += "%MOIN*%\n" // inch units
+      str += "%LPD*%\n" // layer dark
+      str += "%FSLAX66Y66*%\n" // format absolute 6.6
+      str += "G01*\n" // linear interpolation
       str += "%ADD10C,0.001*%\n"
       str += "D10*\n"
       for (var seg = 0; seg < mod.path.length; ++seg) {
          x = imgwidth*mod.path[seg][0][0]/(mod.imageInfo.width-1)
          y = imgheight*mod.path[seg][0][1]/(mod.imageInfo.height-1)
-         str += 'X'+format(x)+'Y'+format(y)+'D02*\n'
+         str += 'X'+gformat(x)+'Y'+gformat(y)+'D02*\n'
          for (var pt = 1; pt < mod.path[seg].length; ++pt) {
             var x = imgwidth*mod.path[seg][pt][0]/(mod.imageInfo.width-1)
             var y = imgheight*mod.path[seg][pt][1]/(mod.imageInfo.height-1)
-            str += 'X'+format(x)+'Y'+format(y)+'D01*\n'
+            str += 'X'+gformat(x)+'Y'+gformat(y)+'D01*\n'
             }
          x = imgwidth*mod.path[seg][0][0]/(mod.imageInfo.width-1)
          y = imgheight*mod.path[seg][0][1]/(mod.imageInfo.height-1)
-         str += 'X'+format(x)+'Y'+format(y)+'D01*\n'
+         str += 'X'+gformat(x)+'Y'+gformat(y)+'D01*\n'
          }
       str += "M02*\n"
       var obj = {}
@@ -167,7 +177,7 @@ function plot() {
          //
          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)
+            sx += imgwidth*mod.path[seg][pt][0]/(mod.imageInfo.width-1)
             sy += imgheight*mod.path[seg][pt][1]/(mod.imageInfo.height-1)
             }
          x0 = sx/mod.path[seg].length
@@ -177,7 +187,7 @@ function plot() {
          // find diameter
          //
          for (var pt = 0; pt < mod.path[seg].length; ++pt) {
-            x = imgwidth*mod.path[seg][pt][0]V/(mod.imageInfo.width-1)
+            x = imgwidth*mod.path[seg][pt][0]/(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))
             }
@@ -190,32 +200,39 @@ function plot() {
       // sort diameters
       //
       var drills = {}
+      var tool = 0
       for (var hole = 0; hole < ds.length; ++hole) {
-         key = str(ds[hole].toFixed(2)
+         key = ds[hole].toFixed(3).toString()
          if (key in drills)
             drills[key].push(hole)
-         else
-            drills[key] = [hole]
+         else {
+            tool += 1
+            drills[key] = [tool,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"
+      str += "M48\n" // start of header
+      str += "INCH,LZ\n" // inch units with leading zeros
+      str += "VER,1\n" // version 1
+      str += "FMAT,2\n" // format 2
+      for (var key in drills) {
+         str += 'T'+drills[key][0]+'C'+key+"\n" // define tools
+         }
+      str += "M95\n" // end of header
+      str += "G05\n" // drill mode
       for (var key in drills) {
-         for (var hole in drills[key].length) {
-            str += key+' '+hole+'\n'
+         str += 'T'+drills[key][0]+'\n' // tool selection
+         for (var i = 1; i < drills[key].length; ++i) {
+            var hole = drills[key][i]
+            str += 'X'+eformat(xs[hole])+'Y'+eformat(ys[hole])+'\n'
             }
          }
-      str += "M30\n"
+      str += "M30\n" // end of program
       var obj = {}
       obj.type = 'file'
-      obj.name = mod.imageInfo.name+'-drill.gbr'
+      obj.name = mod.imageInfo.name+'-drill.xln'
       obj.contents = str
       outputs.Gerber.event(obj)
       }
-- 
GitLab