From bb26d113f7e0bfe2f53c441a730d012a1ff921ff Mon Sep 17 00:00:00 2001
From: Neil Gershenfeld <gersh@cba.mit.edu>
Date: Sun, 10 Sep 2017 11:12:01 -0400
Subject: [PATCH] importing Epilog from fabmodules

---
 js/mods.js                                    |   6 +-
 modules/toolpath/machines/laser cutter/Epilog | 163 +++++++++++++-----
 2 files changed, 125 insertions(+), 44 deletions(-)

diff --git a/js/mods.js b/js/mods.js
index ca5cd97..4af92d0 100644
--- a/js/mods.js
+++ b/js/mods.js
@@ -2,7 +2,7 @@
 // mods.js
 //
 // Neil Gershenfeld
-// (c) Massachusetts Institute of Technology 2015,6
+// (c) Massachusetts Institute of Technology 2015,6,7
 //
 // This work may be reproduced, modified, distributed, performed, and
 // displayed for any purpose, but must acknowledge the mods
@@ -12,6 +12,10 @@
 //
 /*
 todo
+   Epilog output
+   GCC output
+   Trotec output
+   HPGL input
    G-code output
    STL view z pan
    STL up sign flip
diff --git a/modules/toolpath/machines/laser cutter/Epilog b/modules/toolpath/machines/laser cutter/Epilog
index 757e56c..f1e42f9 100644
--- a/modules/toolpath/machines/laser cutter/Epilog	
+++ b/modules/toolpath/machines/laser cutter/Epilog	
@@ -139,59 +139,136 @@ var interface = function(div){
 //
 // local functions
 //
+
 function make_path() {
-   var dx = 25.4*mod.width/mod.dpi
-   var dy = 25.4*mod.height/mod.dpi
-   var nx = mod.width
-   var ny = mod.height
-   var force = parseFloat(mod.force.value)
-   var speed = parseFloat(mod.speed.value)
-   var str = "PA;PA;!ST1;!FS"+force+";VS"+speed+";\n"
-   var scale = 40.0*dx/(nx-1.0) // 40/mm
-   var ox = 0
-   var oy = 0
-   if (mod.botleft.checked) {
-      var xoffset = 40.0*ox
-      var yoffset = 40.0*oy
-      }
-   else if (mod.botright.checked) {
-      var xoffset = 40.0*(ox-dx)
-      var yoffset = 40.0*oy
-      }
-   else if (mod.topleft.checked) {
-      var xoffset = 40.0*ox
-      var yoffset = 40.0*(oy-dy)
-      }
-   else if (mod.topright.checked) {
-      var xoffset = 40.0*(ox-dx)
-      var yoffset = 40.0*(oy-dy)
-      }
+
+var dx = 25.4*mod.width/mod.dpi
+var dy = 25.4*mod.height/mod.dpi
+var nx = mod.width
+var ny = mod.height
+var force = parseFloat(mod.force.value)
+var speed = parseFloat(mod.speed.value)
+var str = "PA;PA;!ST1;!FS"+force+";VS"+speed+";\n"
+var scale = 40.0*dx/(nx-1.0) // 40/mm
+var ox = 0
+var oy = 0
+if (mod.botleft.checked) {
+   var xoffset = 40.0*ox
+   var yoffset = 40.0*oy
+   }
+else if (mod.botright.checked) {
+   var xoffset = 40.0*(ox-dx)
+   var yoffset = 40.0*oy
+   }
+else if (mod.topleft.checked) {
+   var xoffset = 40.0*ox
+   var yoffset = 40.0*(oy-dy)
+   }
+else if (mod.topright.checked) {
+   var xoffset = 40.0*(ox-dx)
+   var yoffset = 40.0*(oy-dy)
+   }
+
+   var dx = globals.width/globals.dpi
+   var dy = globals.height/globals.dpi
+   var nx = globals.width
+   var ny = globals.height
+   var power = parseFloat(findEl("mod_power").value)
+   var speed = parseFloat(findEl("mod_speed").value)
+   var rate = parseFloat(findEl("mod_rate").value)
+   var ox = parseFloat(findEl("mod_x_origin").value)/25.4
+   var oy = parseFloat(findEl("mod_y_origin").value)/25.4
+   var scale = 600.0*dx/(nx-1) // 600 DPI
+   if (findEl("mod_bottom_left").checked) {
+      var xoffset = 600.0*ox
+      var yoffset = 600.0*(oy-dy)
+   } else if (findEl("mod_bottom_right").checked) {
+      var xoffset = 600.0*(ox-dx)
+      var yoffset = 600.0*(oy-dy)
+   } else if (findEl("mod_top_left").checked) {
+      var xoffset = 600.0*ox
+      var yoffset = 600.0*oy
+   } else if (findEl("mod_top_right").checked) {
+      var xoffset = 600.0*(ox-dx)
+      var yoffset = 600.0*oy
+   }
+
+   var str = "%-12345X@PJL JOB NAME=" + globals.input_basename + "\r\n"
+   str += "E@PJL ENTER LANGUAGE=PCL\r\n"
+   if (findEl("mod_autofocus").checked)
    //
-   // loop over segments
+   // init with autofocus on
    //
-   for (var seg = 0; seg < mod.path.length; ++seg) {
-      x = xoffset+scale*mod.path[seg][0][0]
-      y = yoffset+scale*mod.path[seg][0][1]
-      str += "PU"+x.toFixed(0)+","+y.toFixed(0)+";\n" // move up to start point
-      //str += "PU"+x.toFixed(0)+","+y.toFixed(0)+";\n" // hack: repeat in case comm dropped
+      str += "&y1A"
+   else
+   // 
+   // init with autofocus off
+   //
+      str += "&y0A"
+   str += "&l0U&l0Z&u600D*p0X*p0Y*t600R*r0F&y50P&z50S*r6600T*r5100S*r1A*rC%1BIN;"
+   str += "XR"+rate+";YP"+power+";ZS"+speed+";\n"
+
+//
+// loop over segments
+//
+
+for (var seg = 0; seg < mod.path.length; ++seg) {
+   x = xoffset+scale*mod.path[seg][0][0]
+   y = yoffset+scale*mod.path[seg][0][1]
+   str += "PU"+x.toFixed(0)+","+y.toFixed(0)+";\n" // move up to start point
+   //str += "PU"+x.toFixed(0)+","+y.toFixed(0)+";\n" // hack: repeat in case comm dropped
+   str += "PD"+x.toFixed(0)+","+y.toFixed(0)+";\n" // move down
+   //str += "PD"+x.toFixed(0)+","+y.toFixed(0)+";\n" // hack: repeat in case comm dropped
+   //
+   // loop over points
+   //
+   for (var pt = 1; pt < mod.path[seg].length; ++pt) {
+      x = xoffset+scale*mod.path[seg][pt][0]
+      y = yoffset+scale*mod.path[seg][pt][1]
       str += "PD"+x.toFixed(0)+","+y.toFixed(0)+";\n" // move down
       //str += "PD"+x.toFixed(0)+","+y.toFixed(0)+";\n" // hack: repeat in case comm dropped
+      }
+   str += "PU"+x.toFixed(0)+","+y.toFixed(0)+";\n" // move up at last point
+   //str += "PU"+x.toFixed(0)+","+y.toFixed(0)+";\n" // hack: repeat in case comm dropped
+   }
+
+
+   //
+   // loop over segments
+   //
+
+   for (var seg = 0; seg < path.length; ++seg) {
       //
       // loop over points
       //
-      for (var pt = 1; pt < mod.path[seg].length; ++pt) {
-         x = xoffset+scale*mod.path[seg][pt][0]
-         y = yoffset+scale*mod.path[seg][pt][1]
-         str += "PD"+x.toFixed(0)+","+y.toFixed(0)+";\n" // move down
-         //str += "PD"+x.toFixed(0)+","+y.toFixed(0)+";\n" // hack: repeat in case comm dropped
-         }
-      str += "PU"+x.toFixed(0)+","+y.toFixed(0)+";\n" // move up at last point
-      //str += "PU"+x.toFixed(0)+","+y.toFixed(0)+";\n" // hack: repeat in case comm dropped
+      x = xoffset+scale*path[seg][0][0]
+      y = yoffset+scale*(ny-path[seg][0][1])
+      if (x < 0) x = 0
+      if (y < 0) y = 0
+      str += "PU"+x.toFixed(0)+","+y.toFixed(0)+";" // move up to start point
+      for (var pt = 1; pt < path[seg].length; ++pt) {
+         x = xoffset+scale*path[seg][pt][0]
+         y = yoffset+scale*(ny-path[seg][pt][1])
+         if (x < 0) x = 0
+         if (y < 0) y = 0
+         str += "PD"+x.toFixed(0)+","+y.toFixed(0)+";" // move down
       }
-   str += "PU0,0;\n" // pen up to origin
-   //str += "PU0,0;\n" // hack: repeat in case comm dropped
-   outputs.file.event(str)
+      str += "\n"
    }
+   str += "%0B%1BPUE%-12345X@PJL EOJ \r\n"
+
+str += "PU0,0;\n" // pen up to origin
+outputs.file.event(str)
+
+
+   //
+   // end-of-file padding hack from Epilog print driver
+   //
+   for (var i = 0; i < 10000; ++i)
+      str += " "
+
+   return str
+}
 
 //
 // return values
-- 
GitLab