CaptainSpaceCat

eBeam - ElectronCutout

Jul 13th, 2016
98
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import java.awt.event.*;
  2. import javax.swing.filechooser.*;
  3. import javax.swing.*;
  4. import javax.swing.event.*;
  5. import java.io.*;
  6. import javax.imageio.*;
  7. import java.awt.image.*;
  8. import java.awt.Graphics;
  9. import java.awt.Dimension;
  10.  
  11. /*
  12.  * This class handles the UI and allows
  13.  * the user to input an image and control
  14.  * the rest of the algorithm.
  15.  * */
  16.  
  17. public class ElectronCutout extends JFrame implements ActionListener, ChangeListener {
  18.  
  19.   public String stl;
  20.  
  21.   private boolean DEBUG = false;
  22.  
  23.   ImageEditor imgEdit;
  24.   STLConverter stlConv;
  25.  
  26.   JButton openButton, saveButton, thresholdButton, rodButton, chunkButton, thickenButton, stlButton;
  27.   JTextField percentField;
  28.   JFileChooser fc;
  29.   JFrame f;
  30.   JPanel panel;
  31.   JLabel pic, sliderLabel, logLabel;
  32.   JSlider scaleSlider;
  33.   File currentFile;
  34.   boolean fileOpen = false;
  35.   BufferedImage img;
  36.   float pxcm;
  37.   FileNameExtensionFilter iFilter = new FileNameExtensionFilter("Image files", "png", "jpg", "jpeg", "bmp");
  38.   FileNameExtensionFilter oFilter = new FileNameExtensionFilter(".stl (STL Files)", "stl");
  39.    
  40.  
  41.   public ElectronCutout() {
  42.     fc = new JFileChooser();
  43.     initializeGUI();
  44.     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  45.     repaint();
  46.   }
  47.  
  48.   public BufferedImage loadImage(File f) {
  49.     BufferedImage i = null;
  50.     try {
  51.       i = ImageIO.read(f);
  52.     } catch (IOException e) {
  53.     }
  54.     if (imgEdit.calibrateImg(i)) {
  55.       float[] info = imgEdit.getImgInfo();
  56.       center = new int[] {(int)info[0], (int)info[1]};
  57.       pxcm = info[2];
  58.     }
  59.     return i;
  60.   }
  61.  
  62.   public void initializeGUI() {
  63.     panel = new JPanel() {
  64.       public void paintComponent(Graphics g) {
  65.         super.paintComponent(g);
  66.       }
  67.     };
  68.    
  69.     this.setSize(new Dimension(900, 700));
  70.     panel.setLayout(null);
  71.     panel.setPreferredSize(new Dimension(900, 700));
  72.    
  73.     openButton = new JButton("Open");
  74.     openButton.addActionListener(this);
  75.     panel.add(openButton);
  76.     openButton.setBounds(20, 10, 100, 30);
  77.    
  78.     saveButton = new JButton("Save");
  79.     saveButton.addActionListener(this);
  80.     panel.add(saveButton);
  81.     saveButton.setBounds(120, 10, 100, 30);
  82.     saveButton.setEnabled(false);
  83.    
  84.     if (DEBUG) {
  85.       rodButton = new JButton("Clear Crosshairs");
  86.       rodButton.addActionListener(this);
  87.       panel.add(rodButton);
  88.       rodButton.setBounds(740, 50, 130, 30);
  89.       rodButton.setEnabled(false);
  90.      
  91.       chunkButton = new JButton("Clear Chunks");
  92.       chunkButton.addActionListener(this);
  93.       panel.add(chunkButton);
  94.       chunkButton.setBounds(740, 90, 130, 30);
  95.       chunkButton.setEnabled(false);
  96.      
  97.       thresholdButton = new JButton("Set Threshold");
  98.       thresholdButton.addActionListener(this);
  99.       panel.add(thresholdButton);
  100.       thresholdButton.setBounds(740, 130, 130, 30);
  101.       thresholdButton.setEnabled(false);
  102.      
  103.       thickenButton = new JButton("Thicken Margin");
  104.       thickenButton.addActionListener(this);
  105.       panel.add(thickenButton);
  106.       thickenButton.setBounds(740, 170, 130, 30);
  107.       thickenButton.setEnabled(false);
  108.     }
  109.    
  110.     stlButton = new JButton("Convert to STL");
  111.     stlButton.addActionListener(this);
  112.     panel.add(stlButton);
  113.     if (DEBUG) {
  114.       stlButton.setBounds(740, 210, 130, 30);
  115.     } else {
  116.       stlButton.setBounds(740, 50, 130, 30);
  117.     }
  118.     stlButton.setEnabled(false);
  119.    
  120.     scaleSlider = new JSlider(JSlider.HORIZONTAL, 75, 100, 95);
  121.     scaleSlider.addChangeListener(this);
  122.     panel.add(scaleSlider);
  123.     if (DEBUG) {
  124.       scaleSlider.setBounds(740, 270, 130, 30);
  125.     } else {
  126.       scaleSlider.setBounds(740, 110, 130, 30);
  127.     }
  128.     scaleSlider.setVisible(false);
  129.    
  130.     sliderLabel = new JLabel("Scale down to:          %", JLabel.CENTER);
  131.     panel.add(sliderLabel);
  132.     if (DEBUG) {
  133.       sliderLabel.setBounds(740, 250, 130, 20);
  134.     } else {
  135.       sliderLabel.setBounds(740, 90, 130, 20);
  136.     }
  137.     sliderLabel.setVisible(false);
  138.    
  139.     percentField = new JTextField("95");
  140.     percentField.addActionListener(this);
  141.     panel.add(percentField);
  142.     if (DEBUG) {
  143.       percentField.setBounds(830, 250, 25, 20);
  144.     } else {
  145.       percentField.setBounds(830, 90, 25, 20);
  146.     }
  147.     percentField.setVisible(false);
  148.    
  149.     logLabel = new JLabel("");
  150.     panel.add(logLabel);
  151.     logLabel.setBounds(20, 670, 800, 20);
  152.    
  153.     BufferedImage bi = new BufferedImage(500, 500, BufferedImage.TYPE_BYTE_BINARY);
  154.     pic = new JLabel(new ImageIcon(bi));
  155.     panel.add(pic);
  156.     pic.setBounds(20, 50, 500, 500);
  157.    
  158.     /*pic = new JLabel(new ImageIcon(Toolkit.getDefaultToolkit().getImage(getClass().getResource("/imgBasic.png"))));
  159.      panel.add(pic);
  160.      pic.setBounds(20, 50, w, h);*/
  161.    
  162.     formatPanel(500, 500);
  163.    
  164.     pack();
  165.     getContentPane().add(panel);
  166.     getRootPane().setDefaultButton(openButton);
  167.     panel.setVisible(true);
  168.   }
  169.  
  170.   public void stateChanged(ChangeEvent e) {
  171.     if (e.getSource() == scaleSlider) {
  172.       percentField.setText("" + scaleSlider.getValue());
  173.       repaint();
  174.     }
  175.   }
  176.  
  177.   void log(String str) {
  178.     logLabel.setText(str);
  179.   }
  180.  
  181.   private int[] center;
  182.   private int[][] crossPoints;
  183.  
  184.   public String fileType;
  185.   public String filePath;
  186.   public String fileName;
  187.   public String filePathConst;
  188.   public void actionPerformed(ActionEvent e) {
  189.    
  190.     if (e.getSource() == openButton) {
  191.       fc.setFileFilter(iFilter);
  192.       int returnVal = fc.showOpenDialog(this);
  193.       if (returnVal == JFileChooser.APPROVE_OPTION) {
  194.         currentFile = fc.getSelectedFile();
  195.        
  196.         filePath = currentFile.getPath().substring(0, currentFile.getPath().lastIndexOf("."));
  197.         filePathConst = currentFile.getPath().substring(0, currentFile.getPath().lastIndexOf("."));
  198.         fileType = currentFile.getPath().substring(currentFile.getPath().lastIndexOf("."));
  199.         fileName = currentFile.getName();
  200.         System.out.println(filePath + " " + fileType);
  201.        
  202.         img = loadImage(currentFile);
  203.         if (img != null) {
  204.           if (pic != null) {
  205.             panel.remove(pic);
  206.           }
  207.           pic = new JLabel(new ImageIcon(img));
  208.           panel.add(pic);
  209.           pic.setBounds(20, 50, imgEdit.w, imgEdit.h);
  210.           formatPanel(imgEdit.w, imgEdit.h);
  211.           fileOpen = true;
  212.           saveButton.setEnabled(false);
  213.           if (DEBUG) {
  214.             chunkButton.setEnabled(false);
  215.             thresholdButton.setEnabled(false);
  216.             thickenButton.setEnabled(false);
  217.             stlButton.setEnabled(false);
  218.             scaleSlider.setVisible(false);
  219.             sliderLabel.setVisible(false);
  220.             percentField.setVisible(false);
  221.             rodButton.setEnabled(true);
  222.           } else {
  223.             stlButton.setEnabled(true);
  224.             scaleSlider.setVisible(true);
  225.             sliderLabel.setVisible(true);
  226.             percentField.setVisible(true);
  227.           }
  228.           repaint(fileName + " loaded.");
  229.         } else {
  230.           repaint("Failed to load image file.");
  231.         }
  232.       } else {
  233.       }
  234.      
  235.     } else if (e.getSource() == saveButton) {
  236.       fc.setFileFilter(oFilter);
  237.       fc.setSelectedFile(new File(filePathConst + "_model.stl"));
  238.       int returnVal = fc.showSaveDialog(this);
  239.       if (returnVal == JFileChooser.APPROVE_OPTION) {
  240.         currentFile = fc.getSelectedFile();
  241.         filePath = currentFile.getPath();
  242.         if (filePath.lastIndexOf(".") != -1) {
  243.           filePath = currentFile.getPath().substring(0, filePath.lastIndexOf("."));
  244.         }
  245.         filePath = filePath + ".stl";
  246.         BufferedWriter output = null;
  247.         try {
  248.           File f = new File(filePath);
  249.           fileName = f.getName();
  250.           output = new BufferedWriter(new FileWriter(f));
  251.           output.write(stl);
  252.         } catch (IOException i) {
  253.           i.printStackTrace();
  254.         } finally {
  255.           if (output != null) {
  256.             try {
  257.               repaint("STL file saved as " + fileName + " to " + filePath.substring(0, filePath.lastIndexOf("\\")));
  258.               output.close();
  259.             } catch(IOException i) {
  260.             }
  261.           }
  262.         }
  263.       }
  264.     } else if (e.getSource() == thresholdButton) {
  265.       if (fileOpen) {
  266.         try {
  267.           imgEdit.threshold();
  268.           thickenButton.setEnabled(true);
  269.           repaint("Threshold set.");
  270.         } catch(Exception ex) {
  271.           repaint("Failed.");
  272.         }
  273.       }
  274.     } else if (e.getSource() == rodButton) {
  275.       if (fileOpen) {
  276.         try {
  277.           imgEdit.removeRods();
  278.           chunkButton.setEnabled(true);
  279.           repaint("Crosshairs cleared.");
  280.         } catch(Exception ex) {
  281.           repaint("Failed.");
  282.         }
  283.       }
  284.     } else if (e.getSource() == chunkButton) {
  285.       if (fileOpen) {
  286.         try {
  287.           imgEdit.clearChunks();
  288.           thresholdButton.setEnabled(true);
  289.           repaint("Excess pixels removed.");
  290.         } catch(Exception ex) {
  291.           repaint("Failed.");
  292.         }
  293.       }
  294.     } else if (e.getSource() == thickenButton) {
  295.       if (fileOpen) {
  296.         try {
  297.           imgEdit.thickenMargin(10);
  298.           imgEdit.thickenMargin(10);
  299.           crossPoints = imgEdit.getCrossPoints();
  300.           //imgEdit.thickenCrosshairs();
  301.           stlButton.setEnabled(true);
  302.           scaleSlider.setVisible(true);
  303.           sliderLabel.setVisible(true);
  304.           percentField.setVisible(true);
  305.           repaint("Margins thickened.");
  306.         } catch(Exception ex) {
  307.           repaint("Failed.");
  308.         }
  309.       }
  310.     } else if (e.getSource() == stlButton) {
  311.       if (fileOpen) {
  312.         if (!DEBUG) {
  313.           try {
  314.             imgEdit.removeRods();
  315.             chunkButton.setEnabled(true);
  316.             repaint("Crosshairs cleared.");
  317.           } catch(Exception ex) {
  318.             repaint("Failed to clear crosshairs.");
  319.           }
  320.           try {
  321.             imgEdit.clearChunks();
  322.             thresholdButton.setEnabled(true);
  323.             repaint("Excess pixels removed.");
  324.           } catch(Exception ex) {
  325.             repaint("Failed to remove excess pixels.");
  326.           }
  327.           try {
  328.             imgEdit.threshold();
  329.             thickenButton.setEnabled(true);
  330.             repaint("Threshold set.");
  331.           } catch(Exception ex) {
  332.             repaint("Failed to set threshold.");
  333.           }
  334.           try {
  335.             imgEdit.thickenMargin(10);
  336.             imgEdit.thickenMargin(10);
  337.             crossPoints = imgEdit.getCrossPoints();
  338.             //imgEdit.thickenCrosshairs();
  339.             stlButton.setEnabled(true);
  340.             scaleSlider.setVisible(true);
  341.             sliderLabel.setVisible(true);
  342.             percentField.setVisible(true);
  343.             repaint("Margins thickened.");
  344.           } catch(Exception ex) {
  345.             repaint("Failed to thicken margins.");
  346.           }
  347.         }
  348.         try {
  349.           stlConv.setImageTemplate(copyImage(img));
  350.           stlConv.setCenterInfo(center, crossPoints);
  351.           stl = stlConv.convertImage(img, (scaleSlider.getValue()/100f) * (.94f/.95f), pxcm);
  352.           saveButton.setEnabled(true);
  353.           stlButton.setEnabled(false);
  354.           scaleSlider.setVisible(false);
  355.           sliderLabel.setVisible(false);
  356.           percentField.setVisible(false);
  357.           repaint("STL file generated.");
  358.         } catch(Exception ex) {
  359.           repaint("STL file conversion failed.");
  360.         }
  361.       }
  362.     } else if (e.getSource() == percentField) {
  363.       scaleSlider.setValue(Integer.parseInt(percentField.getText()));
  364.     } else {
  365.     }
  366.   }
  367.  
  368.   public BufferedImage copyImage(BufferedImage i) {
  369.     BufferedImage o = new BufferedImage(i.getWidth(), i.getHeight(), i.getType());
  370.     for (int y = 0; y < i.getHeight(); y++) {
  371.       for (int x = 0; x < i.getWidth(); x++) {
  372.         o.setRGB(x, y, i.getRGB(x, y));
  373.       }
  374.     }
  375.     return o;
  376.   }
  377.  
  378.   public void formatPanel(int w, int h) {
  379.     int minX = 200; //290
  380.     int minY = 230; //320
  381.    
  382.     int dimX = w < minX ? minX : w;
  383.     int dimY = h < minY ? minY : h;
  384.    
  385.     this.setSize(new Dimension(dimX + 190, dimY + 80));
  386.     panel.setPreferredSize(new Dimension(dimX + 190, dimY + 80));
  387.    
  388.     if (DEBUG) {
  389.       rodButton.setBounds(dimX + 40, 50, 130, 30);
  390.       chunkButton.setBounds(dimX + 40, 90, 130, 30);
  391.       thresholdButton.setBounds(dimX + 40, 130, 130, 30);
  392.       thickenButton.setBounds(dimX + 40, 170, 130, 30);
  393.       stlButton.setBounds(dimX + 40, 210, 130, 30);
  394.       scaleSlider.setBounds(dimX + 40, 270, 130, 30);
  395.       sliderLabel.setBounds(dimX + 40, 250, 130, 20);
  396.       percentField.setBounds(dimX + 130, 250, 25, 20);
  397.     } else {
  398.       stlButton.setBounds(dimX + 40, 50, 130, 30);
  399.       scaleSlider.setBounds(dimX + 40, 110, 130, 30);
  400.       sliderLabel.setBounds(dimX + 40, 90, 130, 20);
  401.       percentField.setBounds(dimX + 130, 90, 25, 20);
  402.     }
  403.     logLabel.setBounds(20, dimY + 50, 800, 20);
  404.   }
  405.  
  406.   public void repaint() {
  407.     pack();
  408.     panel.repaint();
  409.   }
  410.  
  411.   public void repaint(String str) {
  412.     log(str);
  413.     pack();
  414.     panel.repaint();
  415.   }
  416.  
  417.   public void init() {
  418.     imgEdit = new ImageEditor();
  419.     stlConv = new STLConverter();
  420.    
  421.     SwingUtilities.invokeLater(new Runnable() {
  422.       public void run() {
  423.         setVisible(true);
  424.       }
  425.     });
  426.   }
  427.  
  428. }
RAW Paste Data Copied