From 9353883f437b1120c1c2bd5737af17330dfe390d Mon Sep 17 00:00:00 2001 From: enocholumide Date: Tue, 10 Oct 2017 11:49:08 +0200 Subject: [PATCH] v.1.0.1 basic --- Laserscan-to-dxf_v1.0.1_basic.jar | Bin 0 -> 61134 bytes bin/.gitignore | 4 + bin/core/MemoryTextField.class | Bin 1841 -> 2495 bytes bin/core/Point3D.class | Bin 1110 -> 1167 bytes bin/core/RadioButton.class | Bin 542 -> 717 bytes src/ACI_RGB.csv | 1 + src/ACI_RGB_v2.csv | 1 + src/core/ACIColor.java | 64 +++++++ src/core/ACIColorList.java | 97 ++++++++++ src/core/MemoryTextField.java | 22 +++ src/core/Point3D.java | 2 +- src/core/RadioButton.java | 8 + src/tester/Converter.java | 305 ++++++++++++++++++++++++------ src/toolkit/Toolset.java | 14 ++ 14 files changed, 464 insertions(+), 54 deletions(-) create mode 100644 Laserscan-to-dxf_v1.0.1_basic.jar create mode 100644 src/ACI_RGB.csv create mode 100644 src/ACI_RGB_v2.csv create mode 100644 src/core/ACIColor.java create mode 100644 src/core/ACIColorList.java diff --git a/Laserscan-to-dxf_v1.0.1_basic.jar b/Laserscan-to-dxf_v1.0.1_basic.jar new file mode 100644 index 0000000000000000000000000000000000000000..3d661ab50da774d2950ef183e13d8079b98a661a GIT binary patch literal 61134 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 Sip^awM|^0Zj{~KR!+!yHT)!p& literal 1841 zcmah|T~8ZF6g}gQxHvWmA29?%0x1b*AvkU5rztHsMG7)WC0wfVw%8+Qlf_%D#|^yo zu|K8{tyF~CO8o)-QB}{KU2J2F`mnomXXl=K&b?>;`S;Ji0jy&ugM`9lJqUGaPag;2 zX-%J)9Z&m>3{nb(H|~$_NvZwLYc)%|-G2(V+dA}I|3HUrFKB)H;<VPxNHwp`N*wZh`S?~N$-U2@nr zA*qx%nKI$ExBO7Mjnj(j*E_yzbb~Ao6*4AhHhmo`Oxe_~fXZuKf4d!=F#E=a*YeD! z!fNp<{54t22MVc5(9l^VQOIE&QwquA@<9f7$)_i3D-7LJQI^Ft3L{XsmqQjeWpzJ? zQQXR4Ug6HA?p~0~;z5-2eh#-WCbb^r@EA)J*49Rbz|xko;` zIbIFw9F)s(F^)G==C#-6c&o!E&+ep+XQE^)s=xIda#NegEYUc}i_1|9`v>~?%H}m= z%u`c8+C;3Z2PV3f26u;|$;rZHy{A81Xy%~kjY*apVw+U)P?EEhR=Y6I-B`jf`($Mj z7YAn|a#zm@E+;48Bwt?O8>Bjjo%r5KnnVACuvJ z&SYe|wstPU zifb#Zp~QMoU!Gd^C7zIaY3Fy${>nuHB23x|-bN7+fuy@2AK=3-$TJJ_4daAlIV)_O zP)k~rtlfP=f@>D35S@yVq)IfX^==i}$y-XJ_=sN_P(Q`FU%1gvaeXMokMT*IyvfrM zwONj{*R_aRnbbC}p(dV@-h7JBh7fr;*sJZKL_SCP3K90G&q5KA7bLQK4G}Sk5ZS;| vjI|ew8k3=|{DChL_|Dq1r*G7{ZjbliC0+Ka4|=TI{xMXn6BVA@u73R=LONVp diff --git a/bin/core/Point3D.class b/bin/core/Point3D.class index 2aa53a3d465266b277b44e6137bf242fec5b7e86..ff8b9cb9ce0d46f03de26bc6fdea033ed8ed64ef 100644 GIT binary patch literal 1167 zcmZ{iU2hUm5Qg6a%R=c|TB?*%>KAHvx7yX{g+_xHB{fZ`nplbTZoy662HAvCzi#|V zY9eW(i9f&}WqjxCCL%77vomvM&YWjv&adC!e*(CJn|WjutX?z>yr)q(7~O8=VJIvf z`EPx%?+*^WC*7l2v^M#bG2qv|?i z)ZA)rjQUrdp3DRGfl@@r@$r8R*P(1uKc`--O; z35-W*iORX(Q2k6L1G&!Bn+=^>xEX*rwZau#O%6AiRuY?<`!8&fSp+GEO`V~lZ8OOr z*`;56s<@U4Qkw?3l?t+v4pN&2xy$SB%>a?!2#B2uQlAESm79?bxe z(Flmkp2hFP({?|tax{CXAlGptIoxEl48e3a`L3orvQLobGeG3Y3doke(fb1+ C=ZH7} literal 1110 zcmZ{i%Wl(95QhJgI8K|Iv?Wa_rCdrWwH*ly!2$#di$-M=E)pf8-8sf8uF_a?U2ZQ0 zNJL01cmN&>@z1dZk>xDTnTzN0%^Cmx^Ya&g`{>qDQLutI3B8wbG)eFE>o62nPW<=2 zH})sT-iy&m7^Dj7BTt{_6VGRbS`d%pgrNf+>wieSJ@GtJFds*gDD6?P`~AK%R5149 zw_yWSEL&K@ibBXdEw2b%8g6sxW?Max~UP0{|Q(=PGuuqbeu?GaI;YVLQeexXu}KoHFR}_j<(HzZ~`G66t0(ow2B~iOF?dwgS3hu57_SE91wXM0of`AX%|7Bl!DwW z2bo!2_9FWPc{&F~RwE$WxW!xk3QybFYIeTTF}s>)r69Yo^W+|*WeKL+onoi>A_oL{ OJqJX7PyumtNB1wqk9(^C diff --git a/bin/core/RadioButton.class b/bin/core/RadioButton.class index de46430c50ece1657ab6447e1b121f371964ba7c..ec90e69e5d1dbb5c8c7389896ce0fba0715a10c6 100644 GIT binary patch delta 415 zcmZWk%Syvg5Ir|-Y#VQ_#7gMt!p z;RlHRik~1(QpJUfd*{r|nKNhZ%OA4x_Vw}#pbsZi&U>|i2!lu@V#J{CUwGG^8+x(t z9wwt8_P5h`XKR{+V}_w**~eAPGBC3Sh9-xCNd+aeIp&}8eHQ zm}4a@Vflp8d|-uEvI4CVk_fM1{b#jHG4ILF6SM~c5-FhY40H=cJ|^Uf)M2m+mi-Nk COgt} z+{C<;$tM^!>lqoO7+4wD7=Q)=tz%-~0J0c?HgN+<9-v4hP>dN!^J{Hq;MLOJ&LE(r zvz colorList = new ArrayList(); + private int[] redChannel, blueChannel, greenChannel; + + /** + * @param colorList + */ + public ACIColorList(List colorList) { + super(); + this.colorList = colorList; + setChannels(this.colorList); + } + + /** + * @return the colorList + */ + public List getColorList() { + return colorList; + } + + /** + * @param colorList the colorList to set + */ + public void setColorList(List colorList) { + this.colorList = colorList; + } + + public void sortByRedChannel() { + //Collections.sort(colorList); + } + + /** + * @param redChannels the redChannels to set + */ + private void setChannels(List colorList) { + int n = colorList.size(); + redChannel = new int[n]; + greenChannel = new int[n]; + blueChannel = new int[n]; + int i = 0; + for(ACIColor item : colorList) { + redChannel[i] = item.getRGB().getRed(); + greenChannel[i] = item.getRGB().getGreen(); + blueChannel[i] = item.getRGB().getBlue(); + i++; + } + Arrays.sort(redChannel); + Arrays.sort(greenChannel); + Arrays.sort(blueChannel); + } + + /** + * @return the redChannel + */ + public int[] getRedChannel() { + return redChannel; + } + + /** + * @return the blueChannel + */ + public int[] getBlueChannel() { + return blueChannel; + } + + /** + * @return the greenChannel + */ + public int[] getGreenChannel() { + return greenChannel; + } + + public int getClosestToColorSum(int value) { + + int sumList[] = new int[colorList.size()]; + + int i = 0; + for(ACIColor item : colorList) { + sumList[i] = item.getSum(); + i++; + } + + return Toolset.closestNumber(sumList, value); + + + } +} diff --git a/src/core/MemoryTextField.java b/src/core/MemoryTextField.java index ec0bb84..55c7445 100644 --- a/src/core/MemoryTextField.java +++ b/src/core/MemoryTextField.java @@ -22,14 +22,24 @@ public class MemoryTextField extends JTextField { private List memoryList = new ArrayList(); private boolean isAlreadyCalculated = false; private JCheckBox toggler = new JCheckBox(); + private String originalText = ""; public MemoryTextField(String title, JCheckBox toggler) { super.setText(title); this.toggler = toggler; } + public MemoryTextField(String text) { + super.setText(text); + setOriginalText(text); + } + public MemoryTextField() { } + + public void setOriginalText(String originalText) { + this.originalText = originalText; + } /** * @return the memoryList @@ -78,5 +88,17 @@ public void addToList(String item) { super.setText(item); } + public String getOriginalText() { + return this.originalText; + } + + public void setToOriginalText() { + super.setText(originalText); + } + + public boolean isOriginalTextField() { + return super.getText().equals(this.originalText); + } + } diff --git a/src/core/Point3D.java b/src/core/Point3D.java index 53b640a..f96b04f 100644 --- a/src/core/Point3D.java +++ b/src/core/Point3D.java @@ -12,7 +12,7 @@ public class Point3D { private double x,y,z; - private Color color; + private Color color = new Color(0,0,0); diff --git a/src/core/RadioButton.java b/src/core/RadioButton.java index cfb89e4..3485717 100644 --- a/src/core/RadioButton.java +++ b/src/core/RadioButton.java @@ -15,10 +15,18 @@ public class RadioButton extends JRadioButton { * */ private static final long serialVersionUID = -3602197499836281853L; + private String delimeter = " "; public RadioButton(String title, String actionCommand) { + super.setName(title); super.setText(title); super.setActionCommand(actionCommand); } + /** + * @return the delimeter + */ + public String getDelimeter() { + return delimeter; + } } diff --git a/src/tester/Converter.java b/src/tester/Converter.java index 458aa8d..73a5113 100644 --- a/src/tester/Converter.java +++ b/src/tester/Converter.java @@ -17,6 +17,8 @@ import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; @@ -25,6 +27,8 @@ import javax.swing.JFrame; import javax.swing.filechooser.FileNameExtensionFilter; +import core.ACIColor; +import core.ACIColorList; import core.CheckBoxWithText; import core.MemoryTextField; import core.Point3D; @@ -73,7 +77,7 @@ * * @author Olumdie Igbiloba (https://github.com/enocholumide/Laserscan-to-dxf) * - * @version 1.0 basic + * @version 1.0.1 basic */ public class Converter extends JFrame { @@ -82,10 +86,10 @@ public class Converter extends JFrame { */ private static final long serialVersionUID = 6645624735229012592L; private JFrame frame; - private JTextField textField; - private JTextField textOutputDir; + private MemoryTextField textField; + private MemoryTextField textOutputDir; - File ptsFile, scrFile, dxfFile; + private File ptsFile, scrFile, dxfFile; BufferedWriter dxf = null; private JTextField otherDelimeter; @@ -107,7 +111,10 @@ public class Converter extends JFrame { private MemoryTextField maxY; private BufferedReader reader = null; - + private ACIColorList ACIColors; + + private JButton btnConvert; + private String inputExtension = "pts"; /** * Launch the application. @@ -144,6 +151,17 @@ public void windowClosing(WindowEvent e) { } }); + ItemListener radioButtonItemListener = new ItemListener() { + + @Override + public void itemStateChanged(ItemEvent e) { + handleRadioButtonItemStateChanged(e); + } + + }; + + setUpRGB_ACI(); + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension appDim = new Dimension(638, 552); @@ -185,29 +203,45 @@ public void windowClosing(WindowEvent e) { inputFileFormatPanel.setBorder(new TitledBorder(null, "Input File Format", TitledBorder.LEADING, TitledBorder.TOP, null, null)); inputFileFormatPanel.setLayout(null); - RadioButton rdbtnPTS = new RadioButton("PTS", "pts"); + RadioButton rdbtnPTS = new RadioButton("PTS", "pts/ "); rdbtnPTS.setSelected(true); - rdbtnPTS.setBounds(6, 28, 65, 23); + rdbtnPTS.setBounds(6, 28, 52, 23); + rdbtnPTS.addItemListener(radioButtonItemListener); fileFormatButtonGroup.add(rdbtnPTS); inputFileFormatPanel.add(rdbtnPTS); + - RadioButton rdbtnXYZ = new RadioButton("XYZ", "xyz"); + RadioButton rdbtnXYZ = new RadioButton("XYZ", "xyz/ "); rdbtnXYZ.setBounds(6, 54, 65, 23); + rdbtnXYZ.addItemListener(radioButtonItemListener); fileFormatButtonGroup.add(rdbtnXYZ); inputFileFormatPanel.add(rdbtnXYZ); - RadioButton rdbtnLAZ = new RadioButton("LAZ", "laz"); + RadioButton rdbtnLAZ = new RadioButton("LAZ", "laz/ "); rdbtnLAZ.setBounds(6, 80, 65, 23); + rdbtnLAZ.addItemListener(radioButtonItemListener); fileFormatButtonGroup.add(rdbtnLAZ); inputFileFormatPanel.add(rdbtnLAZ); + RadioButton rdbtnSVY = new RadioButton("SVY", "svy/,"); + rdbtnSVY.setBounds(73, 54, 52, 23); + rdbtnSVY.addItemListener(radioButtonItemListener); + fileFormatButtonGroup.add(rdbtnSVY); + inputFileFormatPanel.add(rdbtnSVY); + + RadioButton rdbtnPTX = new RadioButton("PTX", "ptx/ "); + rdbtnPTX.setBounds(73, 28, 52, 23); + rdbtnPTX.addItemListener(radioButtonItemListener); + fileFormatButtonGroup.add(rdbtnPTX); + inputFileFormatPanel.add(rdbtnPTX); + JPanel fileInputAndOutputPanel = new JPanel(); fileInputAndOutputPanel.setBorder(new TitledBorder(null, "Select file and output directory", TitledBorder.LEADING, TitledBorder.TOP, null, null)); fileInputAndOutputPanel.setBounds(178, 23, 433, 110); panel_2.add(fileInputAndOutputPanel); fileInputAndOutputPanel.setLayout(null); - textField = new JTextField("Upload pts file..."); + textField = new MemoryTextField("Upload pts file..."); textField.setBounds(10, 23, 305, 33); fileInputAndOutputPanel.add(textField); textField.setEditable(false); @@ -219,7 +253,7 @@ public void windowClosing(WindowEvent e) { btnUpload.setBackground(Color.BLACK); btnUpload.setForeground(Color.WHITE); - textOutputDir = new JTextField("Select output directory..."); + textOutputDir = new MemoryTextField("Select output directory..."); textOutputDir.setEnabled(false); textOutputDir.setBounds(10, 67, 305, 33); fileInputAndOutputPanel.add(textOutputDir); @@ -238,10 +272,10 @@ public void windowClosing(WindowEvent e) { endSeparator.setBounds(10, 305, 594, 2); panel_2.add(endSeparator); - JButton btnDownload = new JButton("Convert"); - btnDownload.setBounds(501, 318, 103, 33); - panel_2.add(btnDownload); - btnDownload.setEnabled(false); + btnConvert = new JButton("Convert"); + btnConvert.setBounds(501, 318, 103, 33); + panel_2.add(btnConvert); + btnConvert.setEnabled(false); JButton btnCancel = new JButton("Cancel"); btnCancel.setForeground(SystemColor.textHighlightText); @@ -270,11 +304,11 @@ public void actionPerformed(ActionEvent arg0) { delimeterButtonGroup.add(rdbtnComma); delimeterAndSeparatorPanel.add(rdbtnComma); - RadioButton rdbtnSpace = new RadioButton("Space", " "); - rdbtnSpace.setSelected(true); - rdbtnSpace.setBounds(79, 24, 69, 23); - delimeterButtonGroup.add(rdbtnSpace); - delimeterAndSeparatorPanel.add(rdbtnSpace); + RadioButton rdbtnDefault = new RadioButton("Default", "Default"); + rdbtnDefault.setSelected(true); + rdbtnDefault.setBounds(79, 24, 69, 23); + delimeterButtonGroup.add(rdbtnDefault); + delimeterAndSeparatorPanel.add(rdbtnDefault); RadioButton rdbtnOther = new RadioButton("Other", " "); rdbtnOther.setBounds(6, 50, 60, 23); @@ -501,12 +535,17 @@ public void itemStateChanged(ItemEvent e) { lblNewLabel_2.setBounds(426, 11, 85, 128); frame.getContentPane().add(lblNewLabel_2); - btnDownload.addActionListener(new ActionListener() { + btnConvert.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - - generateDXF(ptsFile); + + if(!(textField.isOriginalTextField() && textOutputDir.isOriginalTextField())) { + generateDXF(ptsFile); + } else { + JOptionPane.showMessageDialog(null, "Error: Check input and output files", "Error", JOptionPane.ERROR_MESSAGE); + } + } @@ -524,11 +563,17 @@ public void actionPerformed(ActionEvent e) { }); + + btnUpload.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { - + + String fileFormat = inputExtension; + FileNameExtensionFilter filter = new FileNameExtensionFilter(fileFormat + " files Only", fileFormat); + fileChooser.setFileFilter(filter); + int returnVal = fileChooser.showOpenDialog(Converter.this); if (returnVal == JFileChooser.APPROVE_OPTION) { @@ -542,25 +587,136 @@ public void actionPerformed(ActionEvent arg0) { textOutputDir.setEnabled(true); textOutputDir.setText(textField.getText()+".dxf"); - btnDownload.setEnabled(true); - btnDownload.setForeground(SystemColor.textHighlightText); - btnDownload.setBackground(SystemColor.infoText); + btnConvert.setEnabled(true); + btnConvert.setForeground(SystemColor.textHighlightText); + btnConvert.setBackground(SystemColor.infoText); } catch (Exception e) { e.printStackTrace(); - } - - + } } - } - + } }); - String fileFormat = fileFormatButtonGroup.getSelection().getActionCommand(); - FileNameExtensionFilter filter = new FileNameExtensionFilter(fileFormat + " files Only", fileFormat); - fileChooser.setFileFilter(filter); + + } + + protected void handleRadioButtonItemStateChanged(ItemEvent e) { + + if(e.getStateChange() == ItemEvent.SELECTED) { + + RadioButton button = (RadioButton) e.getSource(); + System.out.println(button.getActionCommand().split("/")[0]); + this.inputExtension = button.getActionCommand().split("/")[0]; + + textField.setToOriginalText(); + textOutputDir.setToOriginalText(); + btnConvert.setEnabled(false); + + String buttonName = button.getName(); + if(buttonName.equals("SVY")||buttonName.equals("XYZ")||buttonName.equals("LAZ")||buttonName.equals("PTX")) { + exportDxfColorCheckBox.setSelected(false); + exportDxfColorCheckBox.setEnabled(false); + } else if(buttonName.equals("PTS")) { + exportDxfColorCheckBox.setEnabled(true); + } + } + } + + /** + * Sets up ACI-RGB color map + * To be depreciated in further version release. + */ + private void setUpRGB_ACI() { + + BufferedReader reader = null; + String line = ""; + + List colorsList = new ArrayList(); + + try { + + reader = new BufferedReader(new FileReader("src/ACI_RGB_v2.csv")); + + while ((line = reader.readLine()) != null) { + + String[] currentLine = line.split(","); + Color color = new Color(Integer.parseInt(currentLine[0]), Integer.parseInt(currentLine[1]),Integer.parseInt(currentLine[2])); + int aciIndex = Integer.parseInt(currentLine[3]); + + colorsList.add(new ACIColor(color, aciIndex)); + } + + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (reader != null) { + try { + reader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + ACIColors = new ACIColorList(colorsList); } + /** + * Calculates AutoCAD index color from RGB. + * To be depreciated in further version release. + * @param color + * @return AutoCAD index color from RGB + * + */ + private int findClosestACIIndex(Color color) { + + int cRed = Toolset.closestNumber(ACIColors.getRedChannel(), color.getRed()); + int cGreen = Toolset.closestNumber(ACIColors.getGreenChannel(), color.getGreen()); + int cBlue = Toolset.closestNumber(ACIColors.getBlueChannel(), color.getBlue()); + + int colorSum = cRed + cGreen + cBlue; + + /*System.out.println("Red "+ cRed); + System.out.println("Green "+ cGreen); + System.out.println("Blue "+ cBlue);*/ + + List redSums = new ArrayList(); + List greenSums = new ArrayList(); + List blueSums = new ArrayList(); + + for(ACIColor item : ACIColors.getColorList()) { + //Red + if(item.getRGB().getRed() == cRed) { + redSums.add(item); + } + //Green + if(item.getRGB().getGreen() == cGreen) { + greenSums.add(item); + } + //Blue + if(item.getRGB().getBlue() == cBlue) { + blueSums.add(item); + } + } + + cRed = new ACIColorList(redSums).getClosestToColorSum(colorSum); + cGreen = new ACIColorList(greenSums).getClosestToColorSum(colorSum); + cBlue = new ACIColorList(blueSums).getClosestToColorSum(colorSum); + + int[] cArrays = {cRed, cGreen, cBlue}; + int finalCloseValue = Toolset.closestNumber(cArrays, colorSum); + + for(ACIColor item : ACIColors.getColorList()) { + if(finalCloseValue == item.getSum()) { + //item.print(); + return item.getACI(); + } + } + return 0; + } + /** * Computes the statistics of the data, mean, average etc * Method not yet completed for the v1.0 basic. Therefore data statistics not yet available. @@ -616,8 +772,8 @@ private void getDataStatistics() { } - System.out.println(xValues.get(Toolset.findMinIndex(xValues))); - System.out.println(yValues.get(Toolset.findMinIndex(yValues))); + //System.out.println(xValues.get(Toolset.findMinIndex(xValues))); + //System.out.println(yValues.get(Toolset.findMinIndex(yValues))); /*this.minX.addToList(String.valueOf(minX)); this.minY.addToList(String.valueOf(minY)); @@ -678,6 +834,8 @@ private void generateDXF(File inputFIle) { int start = Integer.parseInt(startNumberChkbox.getTextField().getText()); int nextProcessedNumber = 0; int intervalFactor = 0; + int dataLength = 3; // Basic X Y Z + int startCoord = 0; boolean endIsSelected = endNumberChkbox.isSelected(); boolean intervalIsSelected = useIntervalChkBox.isSelected(); @@ -689,16 +847,30 @@ private void generateDXF(File inputFIle) { if(useIntervalChkBox.isSelected()){ intervalFactor = Integer.parseInt(useIntervalChkBox.getTextField().getText()); } - - + if(fileFormatButtonGroup.getSelection().getActionCommand().equals("svy")) { + startCoord = 1; + exportDxfColorCheckBox.setSelected(false); + } + if(exportDxfColorCheckBox.isSelected()){ + dataLength = 7; + } + + String delimeter = " "; + if(delimeterButtonGroup.getSelection().getActionCommand().equals("Default")) { + // Delimeter is after char /, will find better solution later + delimeter = fileFormatButtonGroup.getSelection().getActionCommand().split("/")[1]; + } else if(!delimeterButtonGroup.getSelection().getActionCommand().equals("Default")) { + delimeter = delimeterButtonGroup.getSelection().getActionCommand(); + } + while (true) { line = inputFileBufferedReader.readLine(); if( start <= count) { if(count == nextProcessedNumber) { if(line!=null) { - String[] currentLine = line.split(delimeterButtonGroup.getSelection().getActionCommand()); - if(currentLine.length > 6) { + String[] currentLine = line.split(delimeter); + if(currentLine.length > dataLength - 1) { /*for(int j = 0 ; j <= 2; j++) { if(j<2) { writer.write(currentLine[j] + ","); @@ -708,15 +880,18 @@ private void generateDXF(File inputFIle) { } writer.newLine();*/ Point3D point = new Point3D( - Double.parseDouble(currentLine[0]), - Double.parseDouble(currentLine[1]), - Double.parseDouble(currentLine[2]) + Double.parseDouble(currentLine[startCoord]), + Double.parseDouble(currentLine[startCoord+1]), + Double.parseDouble(currentLine[startCoord+2]) ); - point.setColor(new Color( - Integer.parseInt(currentLine[4]), - Integer.parseInt(currentLine[5]), - Integer.parseInt(currentLine[6]) - )); + + if(exportDxfColorCheckBox.isSelected()) { + point.setColor(new Color( + Integer.parseInt(currentLine[startCoord+4]), + Integer.parseInt(currentLine[startCoord+5]), + Integer.parseInt(currentLine[startCoord+6]) + )); + } writeDXFPoint(point); //System.out.println(nextProcessedNumber); @@ -751,7 +926,6 @@ private void generateDXF(File inputFIle) { } catch (IOException e) { success = false; - //String[] error = e.getMessage().split("("); System.err.println("Fata Error"); JOptionPane.showMessageDialog(null, "An error has occured.\nError: " + e.getMessage(), "System Error", JOptionPane.ERROR_MESSAGE); @@ -795,12 +969,13 @@ private void generateDXF(File inputFIle) { } } else { - JOptionPane.showMessageDialog(null, "Something NOT Successful", "Error", JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(null, "File reading error", "Error", JOptionPane.ERROR_MESSAGE); } } /** * Writes the header of the d.xf file. To be called once in the writing process. + * To be improved in further release */ private void writeDXFHeader() { @@ -847,7 +1022,8 @@ private void writeDXFHeader() { /** - * Writes an instance of point to a dxf file + * Writes an instance of point to a .dxf file + * To be improved in further release to take the RGB color value instead if the closest ACI color index * @param point */ private void writeDXFPoint(Point3D point) { @@ -869,10 +1045,33 @@ private void writeDXFPoint(Point3D point) { dxf.write("\n"+String.valueOf(point.getZ())); //Color + + /*int r = point.getColor().getRed(); + int g = point.getColor().getGreen(); + int b = point.getColor().getBlue();*/ + /*int rgb = point.getColor().getRGB(); + int rgbINT = ((r&0x0ff)<<16)|((g&0x0ff)<<8)|(b&0x0ff); + + int red = (rgb>>16)&0x0ff; + int green=(rgb>>8) &0x0ff; + int blue= (rgb) &0x0ff;*/ + + + + if(exportDxfColorCheckBox.isSelected()) { dxf.write("\n62"); - dxf.write("\n"+point.getColor().getRed()+","+point.getColor().getGreen()+","+point.getColor().getBlue()); + dxf.write("\n"+findClosestACIIndex(point.getColor())); + //dxf.write("\n"+rgbINT); } + + + /*var r = red & 0xFF; + var g = green & 0xFF; + var b = blue & 0xFF; + var a = alpha & 0xFF; + + var rgb = (r << 24) + (g << 16) + (b << 8) + (a);*/ } catch (IOException e) { // TODO Auto-generated catch block diff --git a/src/toolkit/Toolset.java b/src/toolkit/Toolset.java index 121f7f2..b39d264 100644 --- a/src/toolkit/Toolset.java +++ b/src/toolkit/Toolset.java @@ -34,4 +34,18 @@ public static > int findMinIndex(final List xs) { return minIndex; } + public static int closestNumber(int[]numbers , int number) { + + int distance = Math.abs(numbers[0] - number); + int idx = 0; + for(int c = 1; c < numbers.length; c++){ + int cdistance = Math.abs(numbers[c] - number); + if(cdistance < distance){ + idx = c; + distance = cdistance; + } + } + return numbers[idx]; + } + }