diff --git a/diylc/diylc-core/src/org/diylc/common/ComponentType.java b/diylc/diylc-core/src/org/diylc/common/ComponentType.java index 8d66ade9..fdc42d8b 100644 --- a/diylc/diylc-core/src/org/diylc/common/ComponentType.java +++ b/diylc/diylc-core/src/org/diylc/common/ComponentType.java @@ -49,12 +49,11 @@ public class ComponentType { private IComponentTransformer transformer; private KeywordPolicy keywordPolicy; private String keywordTag; - private boolean continuity; public ComponentType(String name, String description, CreationMethod creationMethod, String category, String namePrefix, String author, Icon icon, Class> instanceClass, double zOrder, boolean flexibleZOrder, boolean stretchable, BomPolicy bomPolicy, boolean autoEdit, - IComponentTransformer transformer, KeywordPolicy keywordPolicy, String keywordTag, boolean continuity) { + IComponentTransformer transformer, KeywordPolicy keywordPolicy, String keywordTag) { super(); this.name = name; this.description = description; @@ -72,7 +71,6 @@ public class ComponentType { this.transformer = transformer; this.keywordPolicy = keywordPolicy; this.keywordTag = keywordTag; - this.continuity = continuity; } public String getName() { @@ -139,10 +137,6 @@ public class ComponentType { return keywordTag; } - public boolean isContinuity() { - return continuity; - } - @Override public String toString() { return name; diff --git a/diylc/diylc-core/src/org/diylc/core/IContinuity.java b/diylc/diylc-core/src/org/diylc/core/IContinuity.java new file mode 100644 index 00000000..e8a80f21 --- /dev/null +++ b/diylc/diylc-core/src/org/diylc/core/IContinuity.java @@ -0,0 +1,34 @@ +/* + + DIY Layout Creator (DIYLC). + Copyright (c) 2009-2018 held jointly by the individual authors. + + This file is part of DIYLC. + + DIYLC is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DIYLC is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DIYLC. If not, see . + +*/ +package org.diylc.core; + +public interface IContinuity { + + /** + * Tests control point connectivity. + * + * @param index1 + * @param index2 + * @return true if the two points are connected, false otherwise. + */ + boolean arePointsConnected(int index1, int index2); +} diff --git a/diylc/diylc-core/src/org/diylc/core/annotations/ComponentDescriptor.java b/diylc/diylc-core/src/org/diylc/core/annotations/ComponentDescriptor.java index 53b0b567..f9021ca9 100644 --- a/diylc/diylc-core/src/org/diylc/core/annotations/ComponentDescriptor.java +++ b/diylc/diylc-core/src/org/diylc/core/annotations/ComponentDescriptor.java @@ -116,13 +116,5 @@ public @interface ComponentDescriptor { * * @return */ - String keywordTag() default ""; - - /** - * For components that show continuity between the two ending points, e.d. wires, jumpers, etc. - * - * @return - */ - boolean continuity() default false; - + String keywordTag() default ""; } diff --git a/diylc/diylc-core/src/org/diylc/netlist/SwitchSetup.java b/diylc/diylc-core/src/org/diylc/netlist/SwitchSetup.java index b75f8657..055e30b7 100644 --- a/diylc/diylc-core/src/org/diylc/netlist/SwitchSetup.java +++ b/diylc/diylc-core/src/org/diylc/netlist/SwitchSetup.java @@ -72,9 +72,9 @@ public class SwitchSetup implements Comparable { public String toString() { StringBuilder sb = new StringBuilder(); for (Position s : positions) - { + { if (sb.length() > 0) - sb.append(":"); + sb.append(":"); sb.append(s.toString()); } return sb.toString(); diff --git a/diylc/diylc-core/src/org/diylc/presenter/ComponentProcessor.java b/diylc/diylc-core/src/org/diylc/presenter/ComponentProcessor.java index a279c84d..11b0bab0 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/ComponentProcessor.java +++ b/diylc/diylc-core/src/org/diylc/presenter/ComponentProcessor.java @@ -97,8 +97,7 @@ public class ComponentProcessor { boolean autoEdit; IComponentTransformer transformer; KeywordPolicy keywordPolicy; - String keywordTag; - boolean continuity; + String keywordTag; if (clazz.isAnnotationPresent(ComponentDescriptor.class)) { ComponentDescriptor annotation = clazz.getAnnotation(ComponentDescriptor.class); name = annotation.name(); @@ -114,8 +113,7 @@ public class ComponentProcessor { autoEdit = annotation.autoEdit(); transformer = getComponentTransformer(annotation.transformer()); keywordPolicy = annotation.keywordPolicy(); - keywordTag = annotation.keywordTag(); - continuity = annotation.continuity(); + keywordTag = annotation.keywordTag(); } else { // default return null; } @@ -137,7 +135,7 @@ public class ComponentProcessor { } ComponentType componentType = new ComponentType(name, description, creationMethod, category, namePrefix, author, icon, clazz, zOrder, - flexibleZOrder, stretchable, bomPolicy, autoEdit, transformer, keywordPolicy, keywordTag, continuity); + flexibleZOrder, stretchable, bomPolicy, autoEdit, transformer, keywordPolicy, keywordTag); componentTypeMap.put(clazz.getName(), componentType); return componentType; } diff --git a/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java b/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java index 0a6bea7e..f9045881 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java +++ b/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java @@ -43,7 +43,6 @@ import java.util.Set; import org.apache.log4j.Logger; import org.diylc.appframework.miscutils.ConfigurationManager; import org.diylc.appframework.simplemq.MessageDispatcher; -import org.diylc.common.ComponentType; import org.diylc.common.DrawOption; import org.diylc.common.EventType; import org.diylc.common.GridType; @@ -51,6 +50,7 @@ import org.diylc.common.IComponentFiler; import org.diylc.common.IPlugInPort; import org.diylc.common.ObjectCache; import org.diylc.core.ComponentState; +import org.diylc.core.IContinuity; import org.diylc.core.IDIYComponent; import org.diylc.core.Project; import org.diylc.core.Theme; @@ -505,7 +505,6 @@ public class DrawingManager { continuityArea = null; } - @SuppressWarnings("unchecked") public List getContinuityAreas(Project project) { // Find all individual continuity areas for all components List preliminaryAreas = new ArrayList(); @@ -513,11 +512,12 @@ public class DrawingManager { Set connections = new HashSet(); for (IDIYComponent c : project.getComponents()) { ComponentArea a = getComponentArea(c); - - ComponentType type = - ComponentProcessor.getInstance().extractComponentTypeFrom((Class>) c.getClass()); - if (type.isContinuity()) { - connections.add(new Connection(c.getControlPoint(0), c.getControlPoint(c.getControlPointCount() - 1))); + + if (c instanceof IContinuity) { + for (int i = 0; i < c.getControlPointCount() - 1; i++) + for (int j = i + 1; j < c.getControlPointCount(); j++) + if (((IContinuity)c).arePointsConnected(i, j)) + connections.add(new Connection(c.getControlPoint(i), c.getControlPoint(j))); } if (a == null || a.getOutlineArea() == null) diff --git a/diylc/diylc-core/src/org/diylc/presenter/InstantiationManager.java b/diylc/diylc-core/src/org/diylc/presenter/InstantiationManager.java index 6a25a3bc..bc4a1120 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/InstantiationManager.java +++ b/diylc/diylc-core/src/org/diylc/presenter/InstantiationManager.java @@ -63,10 +63,10 @@ public class InstantiationManager { public static final ComponentType clipboardType = new ComponentType("Clipboard contents", "Components from the clipboard", CreationMethod.SINGLE_CLICK, "Multi", "", "", null, null, 0, false, false, null, - false, null, KeywordPolicy.NEVER_SHOW, null, false); + false, null, KeywordPolicy.NEVER_SHOW, null); public static final ComponentType blockType = new ComponentType("Building block", "Components from the building block", CreationMethod.SINGLE_CLICK, "Multi", "", "", null, null, 0, false, false, null, - false, null, KeywordPolicy.NEVER_SHOW, null, false); + false, null, KeywordPolicy.NEVER_SHOW, null); public InstantiationManager() {} diff --git a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java index 17fa3baa..f906f6af 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java +++ b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java @@ -24,7 +24,6 @@ import java.awt.Point; import java.awt.Rectangle; import java.awt.dnd.DnDConstants; import java.awt.geom.Area; -import java.awt.geom.Line2D; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.io.BufferedInputStream; @@ -68,6 +67,7 @@ import org.diylc.common.IPlugInPort; import org.diylc.common.PropertyWrapper; import org.diylc.common.VariantPackage; import org.diylc.core.ExpansionMode; +import org.diylc.core.IContinuity; import org.diylc.core.IDIYComponent; import org.diylc.core.ISwitch; import org.diylc.core.IView; @@ -2712,8 +2712,9 @@ public class Presenter implements IPlugInPort { for (IDIYComponent c : currentProject.getComponents()) { ComponentType type = ComponentProcessor.getInstance().extractComponentTypeFrom((Class>) c.getClass()); + // extract nodes - if (!type.isContinuity()) { + if (!(c instanceof IContinuity)) { for (int i = 0; i < c.getControlPointCount(); i++) { String nodeName = c.getControlPointNodeName(i); if (nodeName != null) { @@ -2768,7 +2769,7 @@ public class Presenter implements IPlugInPort { switchPositions.put(switches.get(j), positions[j]); posList.add(new Position(switches.get(j), positions[j])); } - List connections = getConnections(switchPositions); + List connections = getConnections(switchPositions); Netlist graph = constructNetlist(nodes, connections, continuity); // merge graphs that are effectively the same @@ -2801,7 +2802,7 @@ public class Presenter implements IPlugInPort { return netlists; } - private Netlist constructNetlist(List nodes, List connections, List continuityAreas) { + private Netlist constructNetlist(List nodes, List connections, List continuityAreas) { Netlist netlist = new Netlist(); // debugging code @@ -2875,7 +2876,7 @@ public class Presenter implements IPlugInPort { return netlist; } - private boolean checkGraphConnection(Point2D point1, Point2D point2, List connections, + private boolean checkGraphConnection(Point2D point1, Point2D point2, List connections, List continuityAreas, boolean[] visited) { double t = DrawingManager.CONTROL_POINT_SIZE; @@ -2891,7 +2892,7 @@ public class Presenter implements IPlugInPort { if (visited[i]) continue; - Line2D c = connections.get(i); + Connection c = connections.get(i); if (point1.distance(c.getP1()) < t) { visited[i] = true; if (checkGraphConnection(c.getP2(), point2, connections, continuityAreas, visited)) @@ -2908,14 +2909,17 @@ public class Presenter implements IPlugInPort { } @SuppressWarnings("unchecked") - private List getConnections(Map switchPositions) { - List connections = new ArrayList(); + private List getConnections(Map switchPositions) { + List connections = new ArrayList(); for (IDIYComponent c : currentProject.getComponents()) { ComponentType type = ComponentProcessor.getInstance().extractComponentTypeFrom((Class>) c.getClass()); // handle direct connections - if (type.isContinuity()) { - connections.add(new Line2D.Double(c.getControlPoint(0), c.getControlPoint(c.getControlPointCount() - 1))); + if (c instanceof IContinuity) { + for (int i = 0; i < c.getControlPointCount() - 1; i++) + for (int j = i + 1; j < c.getControlPointCount(); j++) + if (((IContinuity)c).arePointsConnected(i, j)) + connections.add(new Connection(c.getControlPoint(i), c.getControlPoint(j))); } // handle switches if (ISwitch.class.isAssignableFrom(type.getInstanceClass()) && switchPositions.containsKey(c)) { @@ -2924,7 +2928,7 @@ public class Presenter implements IPlugInPort { for (int i = 0; i < c.getControlPointCount() - 1; i++) for (int j = i + 1; j < c.getControlPointCount(); j++) if (s.arePointsConnected(i, j, position)) - connections.add(new Line2D.Double(c.getControlPoint(i), c.getControlPoint(j))); + connections.add(new Connection(c.getControlPoint(i), c.getControlPoint(j))); } } diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index f4b9dd04..240578cb 100644 Binary files a/diylc/diylc-library/lib/diylc-core.jar and b/diylc/diylc-library/lib/diylc-core.jar differ diff --git a/diylc/diylc-library/src/org/diylc/components/boards/TerminalStrip.java b/diylc/diylc-library/src/org/diylc/components/boards/TerminalStrip.java index a9b972fb..75db4377 100644 --- a/diylc/diylc-library/src/org/diylc/components/boards/TerminalStrip.java +++ b/diylc/diylc-library/src/org/diylc/components/boards/TerminalStrip.java @@ -37,6 +37,7 @@ import org.diylc.common.Orientation; import org.diylc.components.AbstractTransparentComponent; import org.diylc.components.transform.TerminalStripTransformer; import org.diylc.core.ComponentState; +import org.diylc.core.IContinuity; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; import org.diylc.core.Project; @@ -53,7 +54,7 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Terminal Strip", author = "Branislav Stojkovic", category = "Boards", instanceNamePrefix = "TS", description = "Row of terminals for point-to-point construction", stretchable = false, zOrder = IDIYComponent.BOARD, keywordPolicy = KeywordPolicy.SHOW_TYPE_NAME, transformer = TerminalStripTransformer.class) -public class TerminalStrip extends AbstractTransparentComponent { +public class TerminalStrip extends AbstractTransparentComponent implements IContinuity { private static final long serialVersionUID = 1L; @@ -454,5 +455,10 @@ public class TerminalStrip extends AbstractTransparentComponent { @Override public String getControlPointNodeName(int index) { return "TerminalStrip" + index; + } + + @Override + public boolean arePointsConnected(int index1, int index2) { + return Math.abs(index1 - index2) == getTerminalCount(); } } diff --git a/diylc/diylc-library/src/org/diylc/components/connectivity/CopperTrace.java b/diylc/diylc-library/src/org/diylc/components/connectivity/CopperTrace.java index d1c6b67f..0195c6b2 100644 --- a/diylc/diylc-library/src/org/diylc/components/connectivity/CopperTrace.java +++ b/diylc/diylc-library/src/org/diylc/components/connectivity/CopperTrace.java @@ -27,6 +27,7 @@ import org.diylc.common.SimpleComponentTransformer; import org.diylc.components.AbstractLeadedComponent; import org.diylc.core.ComponentState; import org.diylc.core.CreationMethod; +import org.diylc.core.IContinuity; import org.diylc.core.IDIYComponent; import org.diylc.core.VisibilityPolicy; import org.diylc.core.annotations.BomPolicy; @@ -41,7 +42,7 @@ import org.diylc.core.measures.SizeUnit; description = "Straight copper trace", zOrder = IDIYComponent.TRACE, bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false, keywordPolicy = KeywordPolicy.SHOW_TAG, keywordTag = "PCB", transformer = SimpleComponentTransformer.class) -public class CopperTrace extends AbstractLeadedComponent { +public class CopperTrace extends AbstractLeadedComponent implements IContinuity { private static final long serialVersionUID = 1L; @@ -167,4 +168,9 @@ public class CopperTrace extends AbstractLeadedComponent { public String getControlPointNodeName(int index) { return null; } + + @Override + public boolean arePointsConnected(int index1, int index2) { + return Math.abs(index1 - index2) == getControlPointCount() - 1; + } } diff --git a/diylc/diylc-library/src/org/diylc/components/connectivity/CurvedTrace.java b/diylc/diylc-library/src/org/diylc/components/connectivity/CurvedTrace.java index 8394aaad..65664db2 100644 --- a/diylc/diylc-library/src/org/diylc/components/connectivity/CurvedTrace.java +++ b/diylc/diylc-library/src/org/diylc/components/connectivity/CurvedTrace.java @@ -27,6 +27,7 @@ import org.diylc.common.PCBLayer; import org.diylc.common.SimpleComponentTransformer; import org.diylc.components.AbstractCurvedComponent; import org.diylc.core.ComponentState; +import org.diylc.core.IContinuity; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; import org.diylc.core.annotations.BomPolicy; @@ -40,7 +41,7 @@ import org.diylc.core.measures.SizeUnit; instanceNamePrefix = "Trace", description = "Curved copper trace with two control points", zOrder = IDIYComponent.TRACE, bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false, keywordPolicy = KeywordPolicy.SHOW_TAG, keywordTag = "PCB", transformer = SimpleComponentTransformer.class) -public class CurvedTrace extends AbstractCurvedComponent { +public class CurvedTrace extends AbstractCurvedComponent implements IContinuity { private static final long serialVersionUID = 1L; @@ -116,4 +117,9 @@ public class CurvedTrace extends AbstractCurvedComponent { public String getControlPointNodeName(int index) { return null; } + + @Override + public boolean arePointsConnected(int index1, int index2) { + return Math.abs(index1 - index2) == getControlPointCount() - 1; + } } diff --git a/diylc/diylc-library/src/org/diylc/components/connectivity/HookupWire.java b/diylc/diylc-library/src/org/diylc/components/connectivity/HookupWire.java index ef29eedd..0c92c859 100644 --- a/diylc/diylc-library/src/org/diylc/components/connectivity/HookupWire.java +++ b/diylc/diylc-library/src/org/diylc/components/connectivity/HookupWire.java @@ -28,6 +28,7 @@ import org.diylc.common.ObjectCache; import org.diylc.common.SimpleComponentTransformer; import org.diylc.components.AbstractCurvedComponent; import org.diylc.core.ComponentState; +import org.diylc.core.IContinuity; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; import org.diylc.core.annotations.BomPolicy; @@ -38,8 +39,8 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Hookup Wire", author = "Branislav Stojkovic", category = "Connectivity", instanceNamePrefix = "W", description = "Flexible wire with two control points", zOrder = IDIYComponent.COMPONENT, flexibleZOrder = true, bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false, - transformer = SimpleComponentTransformer.class, continuity = true) -public class HookupWire extends AbstractCurvedComponent { + transformer = SimpleComponentTransformer.class) +public class HookupWire extends AbstractCurvedComponent implements IContinuity { private static final long serialVersionUID = 1L; @@ -131,5 +132,10 @@ public class HookupWire extends AbstractCurvedComponent { public void setStripeColor(Color stripeColor) { this.stripeColor = stripeColor; + } + + @Override + public boolean arePointsConnected(int index1, int index2) { + return Math.abs(index1 - index2) == getControlPointCount() - 1; } } diff --git a/diylc/diylc-library/src/org/diylc/components/connectivity/Jumper.java b/diylc/diylc-library/src/org/diylc/components/connectivity/Jumper.java index 42d34352..643be812 100644 --- a/diylc/diylc-library/src/org/diylc/components/connectivity/Jumper.java +++ b/diylc/diylc-library/src/org/diylc/components/connectivity/Jumper.java @@ -32,6 +32,7 @@ import org.diylc.common.SimpleComponentTransformer; import org.diylc.components.AbstractLeadedComponent; import org.diylc.core.ComponentState; import org.diylc.core.CreationMethod; +import org.diylc.core.IContinuity; import org.diylc.core.IDIYComponent; import org.diylc.core.annotations.BomPolicy; import org.diylc.core.annotations.ComponentDescriptor; @@ -41,8 +42,8 @@ import org.diylc.core.measures.Size; @ComponentDescriptor(name = "Jumper", author = "Branislav Stojkovic", category = "Connectivity", creationMethod = CreationMethod.POINT_BY_POINT, instanceNamePrefix = "J", description = "", zOrder = IDIYComponent.COMPONENT, bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false, - transformer = SimpleComponentTransformer.class, continuity = true) -public class Jumper extends AbstractLeadedComponent { + transformer = SimpleComponentTransformer.class) +public class Jumper extends AbstractLeadedComponent implements IContinuity { private static final long serialVersionUID = 1L; @@ -156,5 +157,10 @@ public class Jumper extends AbstractLeadedComponent { @Override public Display getDisplay() { return super.getDisplay(); - } + } + + @Override + public boolean arePointsConnected(int index1, int index2) { + return true; + } } diff --git a/diylc/diylc-library/src/org/diylc/components/connectivity/TwistedWire.java b/diylc/diylc-library/src/org/diylc/components/connectivity/TwistedWire.java index 4ce28806..4265caa7 100644 --- a/diylc/diylc-library/src/org/diylc/components/connectivity/TwistedWire.java +++ b/diylc/diylc-library/src/org/diylc/components/connectivity/TwistedWire.java @@ -37,6 +37,7 @@ import org.diylc.common.ObjectCache; import org.diylc.common.SimpleComponentTransformer; import org.diylc.components.AbstractCurvedComponent; import org.diylc.core.ComponentState; +import org.diylc.core.IContinuity; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; import org.diylc.core.annotations.BomPolicy; @@ -47,8 +48,8 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Twisted Leads", author = "Branislav Stojkovic", category = "Connectivity", instanceNamePrefix = "W", description = "A pair of flexible leads twisted tighly together", zOrder = IDIYComponent.COMPONENT, flexibleZOrder = true, bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false, - transformer = SimpleComponentTransformer.class, continuity = true) -public class TwistedWire extends AbstractCurvedComponent { + transformer = SimpleComponentTransformer.class) +public class TwistedWire extends AbstractCurvedComponent implements IContinuity { private static final long serialVersionUID = 1L; @@ -432,4 +433,9 @@ public class TwistedWire extends AbstractCurvedComponent { return calculateLength(left, precision) + calculateLength(right, precision); } + + @Override + public boolean arePointsConnected(int index1, int index2) { + return Math.abs(index1 - index2) == getControlPointCount() - 1; + } } diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index f4b9dd04..240578cb 100644 Binary files a/diylc/diylc-swing/lib/diylc-core.jar and b/diylc/diylc-swing/lib/diylc-core.jar differ diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index cbb836f9..9ca90b8f 100644 Binary files a/diylc/diylc-swing/library/main.jar and b/diylc/diylc-swing/library/main.jar differ diff --git a/diylc/diylc-swing/update.xml b/diylc/diylc-swing/update.xml index dbaccca2..ddd79844 100644 --- a/diylc/diylc-swing/update.xml +++ b/diylc/diylc-swing/update.xml @@ -2633,6 +2633,10 @@ IMPROVEMENT Output SPICE node names in the "Nxxx" format + + + IMPROVEMENT + Honor "Terminal Strip" connectivity when creating a netlist https://github.com/bancika/diy-layout-creator/releases