package org.reprap.machines; import java.io.IOException; import javax.swing.JCheckBoxMenuItem; import javax.swing.JFrame; import javax.media.j3d.*; import org.reprap.Attributes; import org.reprap.CartesianPrinter; import org.reprap.Preferences; import org.reprap.Extruder; import org.reprap.ReprapException; import org.reprap.gui.*; import org.reprap.devices.NullExtruder; /** * */ public class NullCartesianMachine implements CartesianPrinter { /** * */ private StatusMessage statusWindow; /** * */ private JCheckBoxMenuItem layerPauseCheckbox = null, segmentPauseCheckbox = null; /** * */ private Previewer previewer = null; /** * */ double totalDistanceMoved = 0.0; /** * */ double totalDistanceExtruded = 0.0; //double extrusionSize, extrusionHeight, infillWidth; /** * */ double currentX, currentY, currentZ; /** * */ private double overRun; /** * */ private long delay; /** * */ private long startTime; /** * */ private Extruder extruders[]; /** * */ private int extruder; /** * */ private int extruderCount; /** * @param config */ public NullCartesianMachine(Preferences config) { statusWindow = new StatusMessage(new JFrame()); startTime = System.currentTimeMillis(); extruderCount = config.loadInt("NumberOfExtruders"); extruders = new NullExtruder[extruderCount]; for(int i = 0; i < extruderCount; i++) { String prefix = "Extruder" + i + "_"; extruders[i] = new NullExtruder(config, i); } extruder = 1; currentX = 0; currentY = 0; currentZ = 0; } /* (non-Javadoc) * @see org.reprap.Printer#calibrate() */ public void calibrate() { } /** * @param startX * @param startY * @param startZ * @param endX * @param endY * @param endZ * @throws ReprapException * @throws IOException */ public void printSegment(double startX, double startY, double startZ, double endX, double endY, double endZ, boolean turnOff) throws ReprapException, IOException { moveTo(startX, startY, startZ, true, true); printTo(endX, endY, endZ, turnOff); } /* (non-Javadoc) * @see org.reprap.Printer#moveTo(double, double, double, boolean, boolean) */ public void moveTo(double x, double y, double z, boolean startUp, boolean endUp) throws ReprapException, IOException { if (isCancelled()) return; totalDistanceMoved += segmentLength(x - currentX, y - currentY); //TODO - next bit needs to take account of startUp and endUp if (z != currentZ) totalDistanceMoved += Math.abs(currentZ - z); currentX = x; currentY = y; currentZ = z; } /* (non-Javadoc) * @see org.reprap.Printer#printTo(double, double, double) */ public void printTo(double x, double y, double z, boolean turnOff) throws ReprapException, IOException { if (segmentPauseCheckbox != null) if(segmentPauseCheckbox.isSelected()) segmentPause(); if (previewer != null) previewer.addSegment(currentX, currentY, currentZ, x, y, z); if (isCancelled()) return; double distance = segmentLength(x - currentX, y - currentY); if (z != currentZ) distance += Math.abs(currentZ - z); totalDistanceExtruded += distance; totalDistanceMoved += distance; currentX = x; currentY = y; currentZ = z; } /* (non-Javadoc) * @see org.reprap.Printer#selectMaterial(int) */ public void selectExtruder(int materialIndex) { if (isCancelled()) return; if(materialIndex < 0 || materialIndex >= extruderCount) System.err.println("Selected material (" + materialIndex + ") is out of range."); else extruder = materialIndex; // if (previewer != null) // previewer.setExtruder(extruders[extruder]); } /* (non-Javadoc) * @see org.reprap.Printer#selectMaterial(int) */ public void selectExtruder(Attributes att) { for(int i = 0; i < extruderCount; i++) { if(att.getMaterial().equals(extruders[i].toString())) { selectExtruder(i); return; } } System.err.println("selectExtruder() - extruder not found for: " + att.getMaterial()); } /* (non-Javadoc) * @see org.reprap.Printer#terminate() */ public void terminate() throws IOException { } public void stopExtruding() {} public void stopValve() {} /** * @return speed of the extruder */ public int getSpeed() { return 200; } /* (non-Javadoc) * @see org.reprap.Printer#getFastSpeed() */ public int getFastSpeed() { return getSpeed(); } /** * @return angle speedup length */ public double getAngleSpeedUpLength() { return 1; } /** * @return angle speed factor */ public double getAngleSpeedFactor() { return 0; } /* (non-Javadoc) * @see org.reprap.Printer#setSpeed(int) */ public void setSpeed(int speed) { } /* (non-Javadoc) * @see org.reprap.Printer#setFastSpeed(int) */ public void setFastSpeed(int speed) { } /* (non-Javadoc) * @see org.reprap.Printer#getSpeedZ() */ public int getSpeedZ() { return 200; } /* (non-Javadoc) * @see org.reprap.Printer#setSpeedZ(int) */ public void setSpeedZ(int speed) { } /** * @return the extruder speeds */ public int getExtruderSpeed() { return 200; } /** * @param speed */ public void setExtruderSpeed(int speed) { } /* (non-Javadoc) * @see org.reprap.Printer#setPreviewer(org.reprap.gui.Previewer) */ public void setPreviewer(Previewer previewer) { this.previewer = previewer; } /** * @param temperature */ public void setTemperature(int temperature) { } /** * outline speed and the infill speed */ public double getOutlineSpeed() { return 1.0; } /** * @return the infill speed */ public double getInfillSpeed() { return 1.0; } /* (non-Javadoc) * @see org.reprap.Printer#dispose() */ public void dispose() { } /* (non-Javadoc) * @see org.reprap.Printer#isCancelled() */ // public boolean isCancelled() { // if (previewer != null) // return previewer.isCancelled(); // return false; // } /* (non-Javadoc) * @see org.reprap.Printer#initialise() */ public void initialise() { if (previewer != null) previewer.reset(); } /* (non-Javadoc) * @see org.reprap.Printer#getX() */ public double getX() { return currentX; } /* (non-Javadoc) * @see org.reprap.Printer#getY() */ public double getY() { return currentY; } /* (non-Javadoc) * @see org.reprap.Printer#getZ() */ public double getZ() { return currentZ; } /* (non-Javadoc) * @see org.reprap.Printer#getTotalDistanceMoved() */ public double getTotalDistanceMoved() { return totalDistanceMoved; } /* (non-Javadoc) * @see org.reprap.Printer#getTotalDistanceExtruded() */ public double getTotalDistanceExtruded() { return totalDistanceExtruded; } /** * @param x * @param y * @return segment length in millimeters */ public double segmentLength(double x, double y) { return Math.sqrt(x*x + y*y); } /* (non-Javadoc) * @see org.reprap.Printer#getExtrusionSize() */ // public double getExtrusionSize() { // return extrusionSize; // } // // public double getExtrusionHeight() { // return extrusionHeight; // } // // public double getInfillWidth() { // return infillWidth; // } /* (non-Javadoc) * @see org.reprap.Printer#setCooling(boolean) */ public void setCooling(boolean enable) { } /** * Get the length before the end of a track to turn the extruder off * to allow for the delay in the stream stopping. * @return overrun in millimeters */ public double getOverRun() { return overRun; }; /** * Get the number of milliseconds to wait between turning an * extruder on and starting to move it. * @return delay in milliseconds */ public long getDelay() { return delay; }; /* (non-Javadoc) * @see org.reprap.Printer#getTotalElapsedTime() */ public double getTotalElapsedTime() { long now = System.currentTimeMillis(); return (now - startTime) / 1000.0; } /* (non-Javadoc) * @see org.reprap.Printer#printStartDelay(boolean) */ public void printStartDelay(boolean firstInLayer) { // This would extrude for the given interval to ensure polymer flow. } /* (non-Javadoc) * @see org.reprap.Printer#setLowerShell(javax.media.j3d.Shape3D) */ public void setLowerShell(BranchGroup ls) { if(previewer != null) previewer.setLowerShell(ls); } /* (non-Javadoc) * @see org.reprap.Printer#setZManual() */ public void setZManual() { setZManual(0.0); } /* (non-Javadoc) * @see org.reprap.Printer#setZManual(double) */ public void setZManual(double zeroPoint) { } /* (non-Javadoc) * @see org.reprap.Printer#homeToZeroX() */ public void homeToZeroX() throws ReprapException, IOException { // TODO Auto-generated method stub } /* (non-Javadoc) * @see org.reprap.Printer#homeToZeroY() */ public void homeToZeroY() throws ReprapException, IOException { // TODO Auto-generated method stub } /* (non-Javadoc) * @see org.reprap.Printer#getExtruder() */ public Extruder getExtruder() { return extruders[extruder]; } /* (non-Javadoc) * @see org.reprap.Printer#getExtruder(String) */ public Extruder getExtruder(String name) { for(int i = 0; i < extruderCount; i++) if(name.equals(extruders[i].toString())) return extruders[i]; return null; } /* (non-Javadoc) * @see org.reprap.Printer#getExtruder(String) */ public Extruder[] getExtruders() { return extruders; } // /** // * Moves nozzle back and forth over wiper // */ // public void wipeNozzle() throws ReprapException, IOException { // } /** * Just finished a layer * @param layerNumber */ public void finishedLayer(int layerNumber) throws Exception { } /** * Deals with all the actions that need to be done between one layer * and the next. */ public void betweenLayers(int layerNumber) throws Exception { } /** * Just about to start the next layer * @param layerNumber */ public void startingLayer(int layerNumber) throws Exception { if (layerPauseCheckbox != null && layerPauseCheckbox.isSelected()) layerPause(); } /** * Display a message indicating a segment is about to be * printed and wait for the user to acknowledge */ private void segmentPause() { ContinuationMesage msg = new ContinuationMesage(null, "A new segment is about to be produced"); //,segmentPauseCheckbox, layerPauseCheckbox); msg.setVisible(true); try { synchronized(msg) { msg.wait(); } } catch (Exception ex) { } if (msg.getResult() == false) setCancelled(true); msg.dispose(); } /** * Display a message indicating a layer is about to be * printed and wait for the user to acknowledge */ private void layerPause() { ContinuationMesage msg = new ContinuationMesage(null, "A new layer is about to be produced"); //,segmentPauseCheckbox, layerPauseCheckbox); msg.setVisible(true); try { synchronized(msg) { msg.wait(); } } catch (Exception ex) { } if (msg.getResult() == false) setCancelled(true); msg.dispose(); } /** * Set the source checkbox used to determine if there should * be a pause between segments. * * @param segmentPause The source checkbox used to determine * if there should be a pause. This is a checkbox rather than * a boolean so it can be changed on the fly. */ public void setSegmentPause(JCheckBoxMenuItem segmentPause) { segmentPauseCheckbox = segmentPause; } /** * Set the source checkbox used to determine if there should * be a pause between layers. * * @param layerPause The source checkbox used to determine * if there should be a pause. This is a checkbox rather than * a boolean so it can be changed on the fly. */ public void setLayerPause(JCheckBoxMenuItem layerPause) { layerPauseCheckbox = layerPause; } public void setMessage(String message) { if (message == null) statusWindow.setVisible(false); else { statusWindow.setMessage(message); statusWindow.setVisible(true); } } public boolean isCancelled() { return statusWindow.isCancelled(); } public void setCancelled(boolean isCancelled) { statusWindow.setCancelled(isCancelled); } }