improved netlist display

minor component updates
This commit is contained in:
Branislav Stojkovic
2019-02-16 20:12:44 +01:00
parent 2091b8a03d
commit 3e67515f69
14 changed files with 131 additions and 54 deletions
@@ -22,12 +22,10 @@
package org.diylc.common;
import java.util.List;
import java.util.Map;
import org.diylc.netlist.Netlist;
import org.diylc.netlist.SwitchSetup;
public interface INetlistProcessor {
Map<Netlist, List<SwitchSetup>> extractNetlists();
List<Netlist> extractNetlists();
}
@@ -21,7 +21,10 @@
*/
package org.diylc.netlist;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
@@ -29,7 +32,7 @@ import java.util.Set;
*
* @author Branislav Stojkovic
*/
public class Group {
public class Group implements Comparable<Group> {
private Set<Node> nodes = new HashSet<Node>();
@@ -41,6 +44,12 @@ public class Group {
public Set<Node> getNodes() {
return nodes;
}
public List<Node> getSortedNodes() {
List<Node> list = new ArrayList<Node>(nodes);
Collections.sort(list);
return list;
}
@Override
public int hashCode() {
@@ -70,11 +79,17 @@ public class Group {
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (Node n : nodes) {
List<Node> list = getSortedNodes();
for (Node n : list) {
if (sb.length() > 0)
sb.append(" <-> ");
sb.append(n);
}
return sb.toString();
}
@Override
public int compareTo(Group o) {
return toString().compareToIgnoreCase(o.toString());
}
}
@@ -21,24 +21,38 @@
*/
package org.diylc.netlist;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Netlist {
public class Netlist implements Comparable<Netlist> {
private Set<Group> groups = new HashSet<Group>();
private List<SwitchSetup> switchSetup = new ArrayList<SwitchSetup>();
public Netlist() {
public Netlist() {
}
public Set<Group> getGroups() {
return groups;
}
public boolean verticesMatch(Netlist other) {
return this.groups.equals(other.groups);
public List<Group> getSortedGroups() {
List<Group> list = new ArrayList<Group>(groups);
Collections.sort(list);
return list;
}
public List<SwitchSetup> getSwitchSetup() {
return switchSetup;
}
public void done() {
Collections.sort(switchSetup);
}
@Override
public int hashCode() {
final int prime = 31;
@@ -67,9 +81,15 @@ public class Netlist {
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (Group v : groups) {
sb.append("\t").append(v).append("\n");
List<Group> list = getSortedGroups();
for (Group g : list) {
sb.append("\t").append(g).append("\n");
}
return sb.toString();
}
@Override
public int compareTo(Netlist o) {
return switchSetup.toString().compareToIgnoreCase(o.switchSetup.toString());
}
}
@@ -28,7 +28,7 @@ import org.diylc.core.IDIYComponent;
*
* @author Branislav Stojkovic
*/
public class Node {
public class Node implements Comparable<Node> {
private IDIYComponent<?> component;
private int pointIndex;
@@ -79,4 +79,9 @@ public class Node {
public String toString() {
return component.getName() + "." + component.getControlPointNodeName(pointIndex) /*+ " @ (" + component.getControlPoint(pointIndex).getX() + ":" + component.getControlPoint(pointIndex).getY() + ")"*/;
}
@Override
public int compareTo(Node o) {
return toString().compareToIgnoreCase(o.toString());
}
}
@@ -29,7 +29,7 @@ import org.diylc.core.ISwitch;
*
* @author Branislav Stojkovic
*/
public class Position {
public class Position implements Comparable<Position> {
private ISwitch theSwitch;
private int position;
@@ -80,4 +80,11 @@ public class Position {
public String toString() {
return (theSwitch instanceof IDIYComponent<?> ? ((IDIYComponent<?>) theSwitch).getName() + "." : "") + theSwitch.getPositionName(position);
}
@Override
public int compareTo(Position o) {
if (theSwitch instanceof IDIYComponent<?> && o.theSwitch instanceof IDIYComponent<?>)
return ((IDIYComponent<?>) theSwitch).getName().compareToIgnoreCase(((IDIYComponent<?>) o.theSwitch).getName());
return 0;
}
}
@@ -21,6 +21,7 @@
*/
package org.diylc.netlist;
import java.util.Collections;
import java.util.List;
/**
@@ -28,13 +29,14 @@ import java.util.List;
*
* @author Branislav Stojkovic
*/
public class SwitchSetup {
public class SwitchSetup implements Comparable<SwitchSetup> {
private List<Position> positions;
public SwitchSetup(List<Position> positions) {
super();
this.positions = positions;
Collections.sort(this.positions);
}
public List<Position> getPositions() {
@@ -77,4 +79,9 @@ public class SwitchSetup {
}
return sb.toString();
}
@Override
public int compareTo(SwitchSetup o) {
return toString().compareToIgnoreCase(o.toString());
}
}
@@ -2687,8 +2687,8 @@ public class Presenter implements IPlugInPort {
@SuppressWarnings("unchecked")
@Override
public Map<Netlist, List<SwitchSetup>> extractNetlists() {
Map<Netlist, List<SwitchSetup>> result = new HashMap<Netlist, List<SwitchSetup>>();
public List<Netlist> extractNetlists() {
Map<Netlist, Netlist> result = new HashMap<Netlist, Netlist>();
List<Node> nodes = new ArrayList<Node>();
List<ISwitch> switches = new ArrayList<ISwitch>();
@@ -2756,11 +2756,10 @@ public class Presenter implements IPlugInPort {
// merge graphs that are effectivelly the same
if (result.containsKey(graph)) {
result.get(graph).add(new SwitchSetup(posList));
} else {
List<SwitchSetup> list = new ArrayList<SwitchSetup>();
list.add(new SwitchSetup(posList));
result.put(graph, list);
result.get(graph).getSwitchSetup().add(new SwitchSetup(posList));
} else {
graph.getSwitchSetup().add(new SwitchSetup(posList));
result.put(graph, graph);
}
// find the next combination if possible
@@ -2777,13 +2776,18 @@ public class Presenter implements IPlugInPort {
}
}
}
return result;
// sort everything alphabetically
List<Netlist> netlists = new ArrayList<Netlist>(result.keySet());
Collections.sort(netlists);
return netlists;
}
private Netlist constructGraph(List<Node> nodes, List<Line2D> connections, List<Area> continuityAreas) {
Netlist graph = new Netlist();
Netlist netlist = new Netlist();
// debugging code
// StringBuilder sb = new StringBuilder();
// sb.append("Nodes:").append("\n");
// for (Node n : nodes) {
@@ -2809,20 +2813,22 @@ public class Presenter implements IPlugInPort {
checkGraphConnection(point2, point1, connections, continuityAreas, new boolean[connections.size()])) {
boolean added = false;
// add to an existing vertex if possible
for (Group v :graph.getGroups())
if (v.getNodes().contains(node1)) {
v.getNodes().add(node2);
for (Group g : netlist.getGroups())
if (g.getNodes().contains(node1)) {
g.getNodes().add(node2);
added = true;
} else if (v.getNodes().contains(node2)) {
v.getNodes().add(node1);
} else if (g.getNodes().contains(node2)) {
g.getNodes().add(node1);
added = true;
}
if (!added)
graph.getGroups().add(new Group(node1, node2));
netlist.getGroups().add(new Group(node1, node2));
}
}
return graph;
netlist.done();
return netlist;
}
private boolean checkGraphConnection(Point2D point1, Point2D point2, List<Line2D> connections,
Binary file not shown.
@@ -350,5 +350,18 @@ public class ClosedJack1_4 extends AbstractMultiPartComponent<String> {
public void setOrientation(Orientation orientation) {
this.orientation = orientation;
updateControlPoints();
}
@Override
public String getControlPointNodeName(int index) {
switch (index) {
case 0:
return "Tip";
case 1:
return "Sleeve";
case 2:
return "Ring";
}
return null;
}
}
@@ -238,7 +238,7 @@ public class SingleCoilPickup extends AbstractTransparentComponent<String> {
// terminal labels
Point[] points = getControlPoints();
g2d.setColor(finalBorderColor);
g2d.setColor(darkerOrLighter(baseColor));
g2d.setFont(project.getFont().deriveFont(TERMINAL_FONT_SIZE * 1f));
int dx = 0;
Binary file not shown.
Binary file not shown.
@@ -18,7 +18,6 @@
package org.diylc.swing;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
@@ -66,7 +65,6 @@ import org.diylc.core.measures.SizeUnit;
import org.diylc.images.IconLoader;
import org.diylc.netlist.Group;
import org.diylc.netlist.Netlist;
import org.diylc.netlist.SwitchSetup;
import org.diylc.presenter.Presenter;
import org.diylc.swing.gui.DialogFactory;
import org.diylc.swing.gui.editor.PropertyEditorDialog;
@@ -77,12 +75,10 @@ import org.diylc.swing.plugins.file.FileFilterEnum;
import org.diylc.swingframework.ButtonDialog;
import org.diylc.swingframework.CheckBoxListDialog;
import org.diylc.swingframework.IDrawingProvider;
import org.diylc.swingframework.TextDialog;
import org.diylc.swingframework.export.DrawingExporter;
import org.diylc.swingframework.text.TextDialog;
import org.diylc.utils.BomEntry;
import sun.java2d.pipe.hw.ExtendedBufferCapabilities.VSyncType;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
@@ -709,14 +705,12 @@ public class ActionFactory {
private static final long serialVersionUID = 1L;
private ISwingUI swingUI;
private IPlugInPort plugInPort;
private Map<String, ComponentType> typeMap = new TreeMap<String, ComponentType>(String.CASE_INSENSITIVE_ORDER);
public ExportVariantsAction(ISwingUI swingUI, IPlugInPort plugInPort) {
super();
this.swingUI = swingUI;
this.plugInPort = plugInPort;
putValue(AbstractAction.NAME, "Export Variants");
Map<String, List<ComponentType>> componentTypes = plugInPort.getComponentTypes();
@@ -1657,24 +1651,34 @@ public class ActionFactory {
super();
this.plugInPort = plugInPort;
this.swingUI = swingUI;
putValue(AbstractAction.NAME, "Create Netlist");
putValue(AbstractAction.NAME, "Create Netlist (beta)");
putValue(AbstractAction.SMALL_ICON, IconLoader.Web.getIcon());
}
@Override
public void actionPerformed(ActionEvent e) {
Map<Netlist, List<SwitchSetup>> g = plugInPort.extractNetlists();
if (g == null)
List<Netlist> res = plugInPort.extractNetlists();
if (res == null) {
swingUI.showMessage("The generated netlist is empty, nothing to show.", "Netlist", ISwingUI.INFORMATION_MESSAGE);
return;
StringBuilder sb = new StringBuilder("<html><p style=\"font-family: " + new JLabel().getFont().getName() + "; font-size: 9px\">");
for (Map.Entry<Netlist, List<SwitchSetup>> en : g.entrySet()) {
sb.append("<b>").append(en.getValue()).append("</b><br>");
for (Group v : en.getKey().getGroups()) {
sb.append(v).append("<br>");
}
sb.append("<br>");
}
sb.append("</p></html>");
StringBuilder sb = new StringBuilder("<html>");
for (Netlist netlist : res) {
sb.append("<p style=\"font-family: " + new JLabel().getFont().getName() + "; font-size: 9px\"><b>Switch configuration: ").append(netlist.getSwitchSetup()).append("</b><br><br>Connected node groups:<br>");
for (Group v : netlist.getSortedGroups()) {
// boolean first = true;
// for (Node n : v.getSortedNodes()) {
// if (!first)
// sb.append(" &lt;-&gt; ");
// first = false;
//
// }
sb.append("&nbsp;&nbsp;").append(v.getSortedNodes()).append("<br>");
}
sb.append("</p><br><hr>");
}
sb.append("</html>");
new TextDialog(swingUI.getOwnerFrame().getRootPane(), sb.toString(), "Netlist", new Dimension(600, 480)).setVisible(true);
}
@@ -47,7 +47,8 @@ public class FileMenuPlugin implements IPlugIn, IDynamicSubmenuHandler {
private static final String FILE_TITLE = "File";
private static final String TRACE_MASK_TITLE = "Trace Mask";
private static final String INTEGRATION_TITLE = "Integration";
private static final String INTEGRATION_TITLE = "Integration";
private static final String ANALYZE_TITLE = "Analyze";
private ProjectDrawingProvider drawingProvider;
private TraceMaskDrawingProvider traceMaskDrawingProvider;
@@ -84,9 +85,10 @@ public class FileMenuPlugin implements IPlugIn, IDynamicSubmenuHandler {
swingUI.injectMenuAction(actionFactory.createExportPNGAction(plugInPort, traceMaskDrawingProvider, swingUI, " (mask)"), TRACE_MASK_TITLE);
swingUI.injectMenuAction(
actionFactory.createPrintAction(traceMaskDrawingProvider, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
| KeyEvent.SHIFT_DOWN_MASK), TRACE_MASK_TITLE);
swingUI.injectMenuAction(actionFactory.createBomAction(plugInPort), FILE_TITLE);
swingUI.injectMenuAction(actionFactory.createGenerateNetlistAction(plugInPort, swingUI), FILE_TITLE);
| KeyEvent.SHIFT_DOWN_MASK), TRACE_MASK_TITLE);
swingUI.injectSubmenu(ANALYZE_TITLE, IconLoader.Node.getIcon(), FILE_TITLE);
swingUI.injectMenuAction(actionFactory.createBomAction(plugInPort), ANALYZE_TITLE);
swingUI.injectMenuAction(actionFactory.createGenerateNetlistAction(plugInPort, swingUI), ANALYZE_TITLE);
swingUI.injectMenuAction(null, FILE_TITLE);
swingUI.injectSubmenu(INTEGRATION_TITLE, IconLoader.Node.getIcon(), FILE_TITLE);
swingUI.injectMenuAction(actionFactory.createImportBlocksAction(swingUI, plugInPort), INTEGRATION_TITLE);