From 69e961b296b7943d13e959cac695b1d8afa2b9cf Mon Sep 17 00:00:00 2001 From: bancika Date: Wed, 19 Jan 2011 18:24:13 +0000 Subject: [PATCH] refactored file management out of presenter --- .../DIYLC/.classpath | 1 + .../DIYLC/library/main.jar | Bin 521327 -> 521326 bytes .../diylc/components/AbstractComponent.java | 2 +- .../org/diylc/core/measures/Capacitance.java | 10 + .../org/diylc/core/measures/Inductance.java | 10 + .../org/diylc/core/measures/Resistance.java | 10 + .../src/org/diylc/core/measures/Size.java | 10 + .../src/org/diylc/presenter/FileManager.java | 0 .../src/org/diylc/presenter/Presenter.java | 58 ++-- .../diylc/presenter/ProjectFileManager.java | 291 ++++++++++++++++++ 10 files changed, 351 insertions(+), 41 deletions(-) delete mode 100644 diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/FileManager.java create mode 100644 diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ProjectFileManager.java diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/.classpath b/ diy-layout-creator --username bancika@gmail.com/DIYLC/.classpath index e90d9199..a620e108 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/.classpath +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/.classpath @@ -13,5 +13,6 @@ + diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/library/main.jar b/ diy-layout-creator --username bancika@gmail.com/DIYLC/library/main.jar index 46525bc2a01bbf7b4c791c3618685443be331022..16d4375d90076e405dd391ef2d3af7093abb473a 100644 GIT binary patch delta 6299 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 implements IDIYComponent { private static final long serialVersionUID = 1L; - protected String name; + protected String name = ""; @EditableProperty(defaultable = false) @Override diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Capacitance.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Capacitance.java index 6c1a12ac..4e2e79c3 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Capacitance.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Capacitance.java @@ -18,4 +18,14 @@ public class Capacitance extends AbstractMeasure { public Capacitance clone() throws CloneNotSupportedException { return new Capacitance(value, unit); } + + public static Capacitance parseCapacitance(String value) { + for (CapacitanceUnit unit : CapacitanceUnit.values()) { + if (value.toLowerCase().endsWith(unit.toString().toLowerCase())) { + value = value.substring(0, value.length() - unit.toString().length() - 1).trim(); + return new Capacitance(Double.parseDouble(value), unit); + } + } + throw new IllegalArgumentException("Could not parse capacitance: " + value); + } } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Inductance.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Inductance.java index a805feab..af598a2a 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Inductance.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Inductance.java @@ -18,4 +18,14 @@ public class Inductance extends AbstractMeasure { public Inductance clone() throws CloneNotSupportedException { return new Inductance(value, unit); } + + public static Inductance parseCapacitance(String value) { + for (InductanceUnit unit : InductanceUnit.values()) { + if (value.toLowerCase().endsWith(unit.toString().toLowerCase())) { + value = value.substring(0, value.length() - unit.toString().length() - 1).trim(); + return new Inductance(Double.parseDouble(value), unit); + } + } + throw new IllegalArgumentException("Could not parse inductance: " + value); + } } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Resistance.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Resistance.java index 89161c7f..b897ace8 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Resistance.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Resistance.java @@ -18,4 +18,14 @@ public class Resistance extends AbstractMeasure { public Resistance clone() throws CloneNotSupportedException { return new Resistance(value, unit); } + + public static Resistance parseResistance(String value) { + for (ResistanceUnit unit : ResistanceUnit.values()) { + if (value.toLowerCase().endsWith(unit.toString().toLowerCase())) { + value = value.substring(0, value.length() - unit.toString().length() - 1).trim(); + return new Resistance(Double.parseDouble(value), unit); + } + } + throw new IllegalArgumentException("Could not parse resistance: " + value); + } } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Size.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Size.java index 3be1be08..ec3b06a3 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Size.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Size.java @@ -29,4 +29,14 @@ public class Size extends AbstractMeasure { public Size clone() throws CloneNotSupportedException { return new Size(value, unit); } + + public static Size parseSize(String value) { + for (SizeUnit unit : SizeUnit.values()) { + if (value.toLowerCase().endsWith(unit.toString().toLowerCase())) { + value = value.substring(0, value.length() - unit.toString().length() - 1).trim(); + return new Size(Double.parseDouble(value), unit); + } + } + throw new IllegalArgumentException("Could not parse size: " + value); + } } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/FileManager.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/FileManager.java deleted file mode 100644 index e69de29b..00000000 diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java index 3dcb91d6..24ec4e7d 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java @@ -7,10 +7,6 @@ import java.awt.Point; import java.awt.Rectangle; import java.awt.geom.Area; import java.awt.geom.Point2D; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Modifier; import java.util.ArrayList; @@ -51,8 +47,6 @@ import com.diyfever.gui.miscutils.Utils; import com.diyfever.gui.simplemq.MessageDispatcher; import com.diyfever.gui.update.VersionNumber; import com.rits.cloning.Cloner; -import com.thoughtworks.xstream.XStream; -import com.thoughtworks.xstream.io.xml.DomDriver; /** * The main presenter class, contains core app logic and drawing routines. @@ -72,8 +66,6 @@ public class Presenter implements IPlugInPort { private double zoomLevel = ConfigurationManager.getInstance().readDouble(ZOOM_KEY, 1d); private Project currentProject; - private String currentFileName = null; - private boolean modified = false; private Map> componentTypes; // Maps component class names to ComponentType objects. private Map componentTypeMap; @@ -86,8 +78,8 @@ public class Presenter implements IPlugInPort { // Utilities private Cloner cloner; - private XStream xStream = new XStream(new DomDriver()); private ProjectPainter projectPainter; + private ProjectFileManager projectFileManager; private Rectangle selectionRect; @@ -121,6 +113,7 @@ public class Presenter implements IPlugInPort { currentProject = new Project(); cloner = new Cloner(); projectPainter = new ProjectPainter(); + projectFileManager = new ProjectFileManager(); // lockedLayers = EnumSet.noneOf(ComponentLayer.class); // visibleLayers = EnumSet.allOf(ComponentLayer.class); @@ -203,8 +196,6 @@ public class Presenter implements IPlugInPort { Project project = new Project(); setDefaultProperties(project); loadProject(project, true); - this.currentFileName = null; - this.modified = false; fireFileStatusChanged(); } catch (Exception e) { LOG.error("Could not create new file", e); @@ -217,18 +208,10 @@ public class Presenter implements IPlugInPort { public void loadProjectFromFile(String fileName) { LOG.info(String.format("loadProjectFromFile(%s)", fileName)); try { - FileInputStream fis = new FileInputStream(fileName); - Project project = (Project) xStream.fromXML(fis); + Project project = (Project) projectFileManager.deserializeProjectFromFile(fileName); loadProject(project, true); - fis.close(); - this.currentFileName = fileName; - this.modified = false; fireFileStatusChanged(); - } catch (FileNotFoundException ex) { - LOG.error("Could not load file", ex); - view.showMessage("Could not open file, " + fileName + " does not exist.", "Error", - JOptionPane.ERROR_MESSAGE); - } catch (IOException ex) { + } catch (Exception ex) { LOG.error("Could not load file", ex); view.showMessage("Could not open file " + fileName + ". Check the log for details.", "Error", JOptionPane.ERROR_MESSAGE); @@ -237,7 +220,7 @@ public class Presenter implements IPlugInPort { @Override public boolean allowFileAction() { - if (this.modified) { + if (projectFileManager.isModified()) { int response = view.showConfirmDialog( "There are unsaved changes. Are you sure you want to abandon these changes?", "Warning", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); @@ -249,13 +232,8 @@ public class Presenter implements IPlugInPort { @Override public void saveProjectToFile(String fileName) { LOG.info(String.format("saveProjectToFile(%s)", fileName)); - FileOutputStream fos; try { - fos = new FileOutputStream(fileName); - xStream.toXML(currentProject, fos); - fos.close(); - this.currentFileName = fileName; - this.modified = false; + projectFileManager.serializeProjectToFile(currentProject, fileName); fireFileStatusChanged(); } catch (Exception ex) { LOG.error("Could not save file", ex); @@ -266,12 +244,12 @@ public class Presenter implements IPlugInPort { @Override public String getCurrentFileName() { - return this.currentFileName; + return projectFileManager.getCurrentFileName(); } @Override public boolean isProjectModified() { - return this.modified; + return projectFileManager.isModified(); } @SuppressWarnings("unchecked") @@ -749,7 +727,7 @@ public class Presenter implements IPlugInPort { if (!preDragProject.equals(currentProject)) { messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, preDragProject, cloner .deepClone(currentProject), "Drag"); - this.modified = true; + projectFileManager.notifyFileChange(); fireFileStatusChanged(); } fireSelectionChanged(); @@ -774,7 +752,7 @@ public class Presenter implements IPlugInPort { selectedComponents.addAll(components); messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner .deepClone(currentProject), "Add"); - this.modified = true; + projectFileManager.notifyFileChange(); fireFileStatusChanged(); fireSelectionChanged(); messageDispatcher.dispatchMessage(EventType.REPAINT); @@ -794,7 +772,7 @@ public class Presenter implements IPlugInPort { this.selectedComponents.clear(); messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner .deepClone(currentProject), "Delete"); - this.modified = true; + projectFileManager.notifyFileChange(); fireFileStatusChanged(); fireSelectionChanged(); messageDispatcher.dispatchMessage(EventType.REPAINT); @@ -839,7 +817,7 @@ public class Presenter implements IPlugInPort { if (!oldProject.equals(currentProject)) { messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner .deepClone(currentProject), "Group"); - this.modified = true; + projectFileManager.notifyFileChange(); fireFileStatusChanged(); } } @@ -854,7 +832,7 @@ public class Presenter implements IPlugInPort { if (!oldProject.equals(currentProject)) { messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner .deepClone(currentProject), "Group"); - this.modified = true; + projectFileManager.notifyFileChange(); fireFileStatusChanged(); } } @@ -876,8 +854,8 @@ public class Presenter implements IPlugInPort { } private void fireFileStatusChanged() { - messageDispatcher.dispatchMessage(EventType.FILE_STATUS_CHANGED, this.currentFileName, - this.modified); + messageDispatcher.dispatchMessage(EventType.FILE_STATUS_CHANGED, getCurrentFileName(), + isProjectModified()); } /** @@ -1025,7 +1003,7 @@ public class Presenter implements IPlugInPort { if (!oldProject.equals(currentProject)) { messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner .deepClone(currentProject), "Add " + componentType.getName()); - this.modified = true; + projectFileManager.notifyFileChange(); fireFileStatusChanged(); } @@ -1096,7 +1074,7 @@ public class Presenter implements IPlugInPort { if (!oldProject.equals(currentProject)) { messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner .deepClone(currentProject), "Edit Selection"); - this.modified = true; + projectFileManager.notifyFileChange(); fireFileStatusChanged(); } messageDispatcher.dispatchMessage(EventType.REPAINT); @@ -1138,7 +1116,7 @@ public class Presenter implements IPlugInPort { if (!oldProject.equals(currentProject)) { messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner .deepClone(currentProject), "Edit Project"); - this.modified = true; + projectFileManager.notifyFileChange(); fireFileStatusChanged(); } messageDispatcher.dispatchMessage(EventType.REPAINT); diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ProjectFileManager.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ProjectFileManager.java new file mode 100644 index 00000000..bb9ba4c7 --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/ProjectFileManager.java @@ -0,0 +1,291 @@ +package org.diylc.presenter; + +import java.awt.Color; +import java.awt.Point; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.apache.log4j.Logger; +import org.diylc.common.Orientation; +import org.diylc.components.boards.AbstractBoard; +import org.diylc.components.boards.BlankBoard; +import org.diylc.components.boards.PerfBoard; +import org.diylc.components.boards.VeroBoard; +import org.diylc.components.connectivity.CopperTrace; +import org.diylc.components.connectivity.Jumper; +import org.diylc.components.connectivity.SolderPad; +import org.diylc.components.passive.RadialFilmCapacitor; +import org.diylc.components.passive.Resistor; +import org.diylc.components.semiconductors.DIL_IC; +import org.diylc.core.IDIYComponent; +import org.diylc.core.Project; +import org.diylc.core.measures.Capacitance; +import org.diylc.core.measures.Resistance; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; +import org.diylc.utils.Constants; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.io.xml.DomDriver; + +public class ProjectFileManager { + + private static final Logger LOG = Logger.getLogger(ProjectFileManager.class); + + private static final int V1_PIXELS_PER_INCH = 200; + private static final Size V1_GRID_SPACING = new Size(0.1d, SizeUnit.in); + + private XStream xStream = new XStream(new DomDriver()); + + private String currentFileName = null; + private boolean modified = false; + + public void serializeProjectToFile(Project project, String fileName) throws IOException { + LOG.info(String.format("saveProjectToFile(%s)", fileName)); + FileOutputStream fos; + fos = new FileOutputStream(fileName); + xStream.toXML(project, fos); + fos.close(); + this.currentFileName = fileName; + this.modified = false; + // fireFileStatusChanged(); + } + + public Project deserializeProjectFromFile(String fileName) throws SAXException, IOException, + ParserConfigurationException { + LOG.info(String.format("loadProjectFromFile(%s)", fileName)); + Project project; + File file = new File(fileName); + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + Document doc = db.parse(file); + doc.getDocumentElement().normalize(); + if (doc.getDocumentElement().getNodeName().equalsIgnoreCase(Project.class.getName())) { + project = parseV3File(fileName); + } else { + if (!doc.getDocumentElement().getNodeName().equalsIgnoreCase("layout")) { + throw new IllegalArgumentException( + "Could not open DIY file. Root node is not named 'Layout'."); + } + String formatVersion = doc.getDocumentElement().getAttribute("formatVersion"); + if (formatVersion == null || formatVersion.trim().isEmpty()) { + LOG.debug("Detected v1 file."); + project = parseV1File(doc.getDocumentElement()); + } else if (formatVersion.equals("2.0")) { + LOG.debug("Detected v2 file."); + project = parseV2File(doc.getDocumentElement()); + } else { + throw new IllegalArgumentException("Unknown file format version: " + formatVersion); + } + } + this.currentFileName = fileName; + this.modified = false; + return project; + } + + public void notifyFileChange() { + this.modified = true; + } + + public String getCurrentFileName() { + return currentFileName; + } + + public boolean isModified() { + return modified; + } + + private Project parseV1File(Element root) { + Project project = new Project(); + project.setTitle(root.getAttribute("Project")); + project.setAuthor(root.getAttribute("Credits")); + project.setGridSpacing(V1_GRID_SPACING); + String type = root.getAttribute("Type"); + + // Create the board. + int width = Integer.parseInt(root.getAttribute("Width")) + 1; + int height = Integer.parseInt(root.getAttribute("Height")) + 1; + int boardWidth = (int) (width * Constants.PIXELS_PER_INCH * V1_GRID_SPACING.getValue()); + int boardHeight = (int) (height * Constants.PIXELS_PER_INCH * V1_GRID_SPACING.getValue()); + int projectWidth = project.getWidth().convertToPixels(); + int projectHeight = project.getHeight().convertToPixels(); + int x = (projectWidth - boardWidth) / 2; + int y = (projectHeight - boardHeight) / 2; + AbstractBoard board; + if (type.equalsIgnoreCase("pcb")) { + board = new BlankBoard(); + board.setBoardColor(Color.white); + board.setBorderColor(Color.black); + } else if (type.equalsIgnoreCase("perfboard")) { + board = new PerfBoard(); + } else if (type.equalsIgnoreCase("stripboard")) { + board = new VeroBoard(); + } else { + throw new IllegalArgumentException("Unrecognized board type: " + type); + } + board.setName("Main board"); + Point referencePoint = new Point(roundToGrid(x, V1_GRID_SPACING), roundToGrid(y, + V1_GRID_SPACING)); + board.setControlPoint(referencePoint, 0); + board.setControlPoint(new Point(roundToGrid(x + boardWidth, V1_GRID_SPACING), roundToGrid(y + + boardHeight, V1_GRID_SPACING)), 1); + project.getComponents().add(board); + + NodeList childNodes = root.getChildNodes(); + for (int i = 0; i < childNodes.getLength(); i++) { + Node node = childNodes.item(i); + if (node.getNodeType() == Node.ELEMENT_NODE) { + String nodeName = node.getNodeName(); + String nameAttr = node.getAttributes().getNamedItem("Name").getNodeValue(); + Node valueNode = node.getAttributes().getNamedItem("Value"); + String valueAttr = valueNode == null ? null : valueNode.getNodeValue(); + int x1Attr = Integer.parseInt(node.getAttributes().getNamedItem("X1") + .getNodeValue()); + int y1Attr = Integer.parseInt(node.getAttributes().getNamedItem("Y1") + .getNodeValue()); + Point point1 = convertV1CoordinatesToV3Point(referencePoint, x1Attr, y1Attr); + Point point2 = null; + Integer x2Attr = null; + Integer y2Attr = null; + if (node.getAttributes().getNamedItem("X2") != null + && node.getAttributes().getNamedItem("Y2") != null) { + x2Attr = Integer.parseInt(node.getAttributes().getNamedItem("X2") + .getNodeValue()); + y2Attr = Integer.parseInt(node.getAttributes().getNamedItem("Y2") + .getNodeValue()); + point2 = convertV1CoordinatesToV3Point(referencePoint, x2Attr, y2Attr); + } + IDIYComponent component = null; + if (nodeName.equalsIgnoreCase("pad")) { + LOG.debug("Recognized " + nodeName); + String colorAttr = node.getAttributes().getNamedItem("Color").getNodeValue(); + SolderPad pad = new SolderPad(); + pad.setName(nameAttr); + // pad.setColor(Color.getColor(colorAttr)); + pad.setControlPoint(convertV1CoordinatesToV3Point(referencePoint, x1Attr, + y1Attr), 0); + component = pad; + } else if (nodeName.equalsIgnoreCase("trace")) { + LOG.debug("Recognized " + nodeName); + String colorAttr = node.getAttributes().getNamedItem("Color").getNodeValue(); + CopperTrace trace = new CopperTrace(); + trace.setName(nameAttr); + trace.setControlPoint(point1, 0); + trace.setControlPoint(point2, 1); + component = trace; + } else if (nodeName.equalsIgnoreCase("jumper")) { + LOG.debug("Recognized " + nodeName); + Jumper jumper = new Jumper(); + jumper.setName(nameAttr); + jumper.setControlPoint(point1, 0); + jumper.setControlPoint(point2, 1); + component = jumper; + } else if (nodeName.equalsIgnoreCase("resistor")) { + LOG.debug("Recognized " + nodeName); + Resistor resistor = new Resistor(); + resistor.setName(nameAttr); + try { + resistor.setValue(Resistance.parseResistance(valueAttr)); + } catch (Exception e) { + LOG.debug("Could not set value of " + nameAttr); + } + resistor.setWidth(new Size(6d, SizeUnit.mm)); + resistor.setHeight(new Size(2d, SizeUnit.mm)); + resistor.setControlPoint(point1, 0); + resistor.setControlPoint(point2, 1); + component = resistor; + } else if (nodeName.equalsIgnoreCase("capacitor")) { + LOG.debug("Recognized " + nodeName); + RadialFilmCapacitor capacitor = new RadialFilmCapacitor(); + capacitor.setName(nameAttr); + try { + capacitor.setValue(Capacitance.parseCapacitance(valueAttr)); + } catch (Exception e) { + LOG.debug("Could not set value of " + nameAttr); + } + capacitor.setWidth(new Size(6d, SizeUnit.mm)); + capacitor.setHeight(new Size(2d, SizeUnit.mm)); + capacitor.setControlPoint(point1, 0); + capacitor.setControlPoint(point2, 1); + component = capacitor; + } else if (nodeName.equalsIgnoreCase("ic")) { + LOG.debug("Recognized " + nodeName); + DIL_IC ic = new DIL_IC(); + if (x1Attr + 3 == x2Attr) { + if (y1Attr < y2Attr) { + ic + .setPinCount(DIL_IC.PinCount.valueOf("_" + 2 + * (y2Attr - y1Attr + 1))); + } else { + ic.setOrientation(Orientation._180); + ic + .setPinCount(DIL_IC.PinCount.valueOf("_" + 2 + * (y1Attr - y2Attr + 1))); + } + } + ic.setName(nameAttr); + ic.setControlPoint(point1, 0); + ic.setValue(valueAttr); + component = ic; + } else { + LOG.debug("Could not recognize component type " + nodeName); + } + if (component != null) { + project.getComponents().add(component); + } + } + } + return project; + } + + private Point convertV1CoordinatesToV3Point(Point reference, int x, int y) { + Point point = new Point(reference); + point.translate((int) (x * Constants.PIXELS_PER_INCH * V1_GRID_SPACING.getValue()), + (int) (y * Constants.PIXELS_PER_INCH * V1_GRID_SPACING.getValue())); + return point; + } + + private Project parseV2File(Element root) { + Project project = new Project(); + String projectName = root.getAttribute("projectName"); + String credits = root.getAttribute("credits"); + String width = root.getAttribute("width"); + String height = root.getAttribute("height"); + NodeList childNodes = root.getChildNodes(); + for (int i = 0; i < childNodes.getLength(); i++) { + Node node = childNodes.item(i); + if (node.getNodeType() == Node.ELEMENT_NODE) { + if (node.getNodeName().equalsIgnoreCase("component")) { + LOG.debug(node.getAttributes().getNamedItem("name").getNodeValue()); + } else { + LOG.debug("Unrecognized node name found: " + node.getNodeName()); + } + } + } + return project; + } + + private Project parseV3File(String fileName) throws IOException { + Project project; + FileInputStream fis = new FileInputStream(fileName); + project = (Project) xStream.fromXML(fis); + fis.close(); + return project; + } + + public int roundToGrid(int x, Size gridSpacing) { + int grid = gridSpacing.convertToPixels(); + return (Math.round(1f * x / grid) * grid); + } +} \ No newline at end of file