From 2a5e7a78cace15f38aa53bb30df446b2bc7feeda Mon Sep 17 00:00:00 2001
From: Thomas Oster <thomas.oster@rwth-aachen.de>
Date: Wed, 27 Mar 2013 20:29:18 +0100
Subject: [PATCH] Raster3d

---
 .../liblasercut/drivers/IModelaMill.java      | 50 ++++++++++++++++++-
 1 file changed, 48 insertions(+), 2 deletions(-)

diff --git a/src/com/t_oster/liblasercut/drivers/IModelaMill.java b/src/com/t_oster/liblasercut/drivers/IModelaMill.java
index ba3937c..db41baf 100644
--- a/src/com/t_oster/liblasercut/drivers/IModelaMill.java
+++ b/src/com/t_oster/liblasercut/drivers/IModelaMill.java
@@ -25,6 +25,7 @@ import com.t_oster.liblasercut.LaserCutter;
 import com.t_oster.liblasercut.LaserJob;
 import com.t_oster.liblasercut.LaserProperty;
 import com.t_oster.liblasercut.ProgressListener;
+import com.t_oster.liblasercut.Raster3dPart;
 import com.t_oster.liblasercut.RasterPart;
 import com.t_oster.liblasercut.VectorCommand;
 import com.t_oster.liblasercut.VectorPart;
@@ -191,6 +192,22 @@ public class IModelaMill extends LaserCutter
     return black/count;
   }
   
+  private double getAverageGrey(Raster3dPart p, int cx, int cy, int toolDiameter)
+  {
+    double count = toolDiameter*toolDiameter;
+    double value = 0;
+    for (int y = Math.max(cy-toolDiameter/2, 0); y < Math.min(cy+toolDiameter/2, p.getRasterHeight()); y++)
+    {
+      List<Byte> line = p.getRasterLine(y);
+      for (int x = Math.max(cx-toolDiameter/2, 0); x < Math.min(cx+toolDiameter/2, p.getRasterWidth()); x++)
+      {
+      
+        value += line.get(x);
+      }
+    }
+    return (value/count)/255;
+  }
+  
   private void writeRasterCode(RasterPart p, PrintStream out)
   {
     double dpi = p.getDPI();
@@ -232,6 +249,35 @@ public class IModelaMill extends LaserCutter
     }
   }
   
+  private void writeRaster3dCode(Raster3dPart p, PrintStream out)
+  {
+    double dpi = p.getDPI();
+    IModelaProperty prop = (IModelaProperty) p.getLaserProperty();
+    int toolDiameterInPx = (int) Util.mm2px(prop.getToolDiameter(), dpi);
+    applyProperty(out, prop);
+    boolean leftToRight = true;
+    Point offset = p.getRasterStart();
+    move(out, Util.mm2px(offset.x, dpi), Util.mm2px(offset.y, dpi));
+    for (int y = 0; y < p.getRasterHeight(); y+= toolDiameterInPx/2)
+    {
+      for (int x = leftToRight ? 0 : p.getRasterWidth() - 1; 
+        (leftToRight && x < p.getRasterWidth()) || (!leftToRight && x >= 0); 
+        x += leftToRight ? 1 : -1)
+      {
+        //scale the depth according to the average grey value
+        linedepth = getAverageGrey(p, x, y, toolDiameterInPx)*prop.getDepth();
+        //skip intermediate line commands
+        while((leftToRight && x+1 < p.getRasterWidth()) || (!leftToRight && x-1 >= 0) && getAverageGrey(p, leftToRight ? x+1 : x-1, y, toolDiameterInPx) == linedepth)
+        {
+          x+= leftToRight ? 1 : -1;
+        }
+        line(out, Util.mm2px(offset.x+x, dpi), Util.mm2px(offset.y+y, dpi));
+      }
+      //invert direction
+      leftToRight = !leftToRight;
+    }
+  }
+  
   private void writeVectorCode(VectorPart p, PrintStream out)
   {
     double dpi = p.getDPI();
@@ -297,9 +343,9 @@ public class IModelaMill extends LaserCutter
       {
         writeRasterCode((RasterPart) p, out);
       }
-      else
+      else if (p instanceof Raster3dPart)
       {
-        throw new IllegalJobException("Raster3d is not yet supported by iModela driver");
+        writeRaster3dCode((Raster3dPart) p, out);
       }
       pl.progressChanged(this, (int) (20+30*i++/all));
     }
-- 
GitLab