diff --git a/diylc/diylc-core/src/org/diylc/netlist/Group.java b/diylc/diylc-core/src/org/diylc/netlist/Group.java index 5843691a..5cb3f844 100644 --- a/diylc/diylc-core/src/org/diylc/netlist/Group.java +++ b/diylc/diylc-core/src/org/diylc/netlist/Group.java @@ -96,4 +96,11 @@ public class Group implements Comparable { public int compareTo(Group o) { return toString().compareToIgnoreCase(o.toString()); } + + @Override + public Group clone() { + Group g = new Group(); + g.nodes.addAll(nodes); + return g; + } } diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index 7a98c1fc..cf84282b 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/netlist/AbstractNetlistSummarizer.java b/diylc/diylc-library/src/org/diylc/netlist/AbstractNetlistSummarizer.java index 42034bd7..6bf2dd15 100644 --- a/diylc/diylc-library/src/org/diylc/netlist/AbstractNetlistSummarizer.java +++ b/diylc/diylc-library/src/org/diylc/netlist/AbstractNetlistSummarizer.java @@ -22,9 +22,14 @@ package org.diylc.netlist; import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Set; +import org.diylc.core.IDIYComponent; + public abstract class AbstractNetlistSummarizer { public AbstractNetlistSummarizer() { @@ -44,6 +49,19 @@ public abstract class AbstractNetlistSummarizer { return res; } + protected List find(Set typeNames, String nodeName, Netlist netlist) { + List res = new ArrayList(); + for (Group g : netlist.getGroups()) { + for (Node n : g.getNodes()) { + if (typeNames.contains(n.getComponent().getClass().getCanonicalName()) && + (nodeName == null || n.getDisplayName().equalsIgnoreCase(nodeName))) { + res.add(n); + } + } + } + return res; + } + protected List find(Set typeNames, String nodeName, Netlist netlist, List inGroupWith) { List res = new ArrayList(); for (Group g : netlist.getGroups()) { @@ -70,15 +88,58 @@ public abstract class AbstractNetlistSummarizer { return res; } - protected Netlist eliminate(Netlist netlist, Set nodes) { + protected List find(Set typeNames, String nodeName, Netlist netlist, Collection> belongTo) { + List res = new ArrayList(); + for (Group g : netlist.getGroups()) { + + for (Node n : g.getNodes()) { + if ((belongTo == null || belongTo.contains(n.getComponent())) && typeNames.contains(n.getComponent().getClass().getCanonicalName()) && + (nodeName == null || n.getDisplayName().equalsIgnoreCase(nodeName))) { + res.add(n); + } + } + } + return res; + } + + protected boolean allMatch(Collection nodes, String name) { + for (Node n : nodes) + if (!n.getDisplayName().equalsIgnoreCase(name)) + return false; + + return true; + } + + protected boolean allComponentsMatch(Collection nodes, Set> components) { + Set> extracted = extractComponents(nodes); + return extracted.containsAll(components); + } + + protected Set> extractComponents(Collection nodes) { + Set> components = new HashSet>(); + for (Node n : nodes) + components.add(n.getComponent()); + return components; + } + + protected List extractNames(Collection> components) { + List names = new ArrayList(); + for (IDIYComponent c : components) + names.add(c.getName() + " " + c.getValueForDisplay()); + Collections.sort(names); + return names; + } + + protected Netlist simplify(Netlist netlist, Set nodesToMerge, Collection nodesToPurge) { Netlist res = new Netlist(); res.getSwitchSetup().addAll(netlist.getSwitchSetup()); - + Group merged = new Group(); + // merge for (Group g : netlist.getGroups()) { boolean needsMerging = false; - for (Node n : nodes) { + for (Node n : nodesToMerge) { if (g.getNodes().contains(n)) { needsMerging = true; break; @@ -86,17 +147,25 @@ public abstract class AbstractNetlistSummarizer { } if (needsMerging) { for (Node n : g.getNodes()) { - if (!nodes.contains(n)) + if (!nodesToMerge.contains(n)) merged.getNodes().add(n); } } else { - res.getGroups().add(g); + res.getGroups().add(g.clone()); } } if (!merged.getNodes().isEmpty()) res.getGroups().add(merged); + // purge + for (Group g : res.getGroups()) { + g.getNodes().removeAll(nodesToPurge); + } + + System.out.println("Before:\n" + netlist); + System.out.println("After:\n" + res); + return res; } diff --git a/diylc/diylc-library/src/org/diylc/netlist/GuitarDiagramSummarizer.java b/diylc/diylc-library/src/org/diylc/netlist/GuitarDiagramSummarizer.java index 95e22b23..15c23e18 100644 --- a/diylc/diylc-library/src/org/diylc/netlist/GuitarDiagramSummarizer.java +++ b/diylc/diylc-library/src/org/diylc/netlist/GuitarDiagramSummarizer.java @@ -35,6 +35,7 @@ import org.diylc.components.guitar.P90Pickup; import org.diylc.components.guitar.PBassPickup; import org.diylc.components.guitar.SingleCoilPickup; import org.diylc.components.passive.PotentiometerPanel; +import org.diylc.core.IDIYComponent; public class GuitarDiagramSummarizer extends AbstractNetlistSummarizer implements INetlistSummarizer { @@ -74,32 +75,35 @@ public class GuitarDiagramSummarizer extends AbstractNetlistSummarizer implement private Summary summarize(Netlist netlist, Node preferredOutput) { List notes = new ArrayList(); - List jackTipNodes = find(JACK_TYPES, "Tip", netlist, null); - List jackSleeveNodes = find(JACK_TYPES, "Sleeve", netlist, null); + List jackTipNodes = find(JACK_TYPES, "Tip", netlist); + List jackSleeveNodes = find(JACK_TYPES, "Sleeve", netlist); - netlist = findAndEliminateVolumePot(netlist, jackTipNodes, jackSleeveNodes, notes); + netlist = findAndEliminateVolumeControls(netlist, jackTipNodes, jackSleeveNodes, notes); return new Summary(netlist, notes); } - private Netlist findAndEliminateVolumePot(Netlist netlist, List jackTipGroups, List jackSleeveGroups, List notes) { + private Netlist findAndEliminateVolumeControls(Netlist netlist, List jackTipGroups, List jackSleeveGroups, List notes) { List potTipNodes = find(POT_TYPES, null, netlist, jackTipGroups); List potSleeveNodes = find(POT_TYPES, null, netlist, jackSleeveGroups); - if (!potTipNodes.isEmpty() && !potSleeveNodes.isEmpty()) { - if (potTipNodes.size() == 1 && potTipNodes.get(0).getDisplayName().equals("2") && - potSleeveNodes.size() == 1 && potSleeveNodes.get(0).getDisplayName().equals("3")) { - notes.add("Volume pot detected: " + potTipNodes.get(0).getComponent().getName()); + if (!potTipNodes.isEmpty() && !potSleeveNodes.isEmpty()) { + Set> pots = extractComponents(potTipNodes); + List potInputNodes = find(POT_TYPES, "1", netlist, pots); + + if (allMatch(potTipNodes, "2") && allMatch(potSleeveNodes, "3") && allComponentsMatch(potInputNodes, pots)) { + List potNames = extractNames(pots); + notes.add("Detected volume control(s): " + potNames); - Set toEliminate = new HashSet(potTipNodes); - toEliminate.addAll(potSleeveNodes); - return eliminate(netlist, toEliminate); - } else if (potTipNodes.size() > 1 || potSleeveNodes.size() > 1) { - notes.add("Detected multiple volume pots, test inconclusive."); + Set toMerge = new HashSet(potTipNodes); + toMerge.addAll(potInputNodes); + return simplify(netlist, toMerge, potSleeveNodes); + } else { + notes.add("Detected incorrectly wired volume control(s)."); return netlist; } } - notes.add("No volume pot detected."); + notes.add("No volume controls detected."); return netlist; } } diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index 7a98c1fc..cf84282b 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 c4618835..103891b7 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/src/org/diylc/swing/ActionFactory.java b/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java index 18307302..dc9268a6 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java +++ b/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java @@ -1695,7 +1695,7 @@ public class ActionFactory { this.plugInPort = plugInPort; this.swingUI = swingUI; this.summarizer = summarizer; - putValue(AbstractAction.NAME, "Analyze " + summarizer.getName()); + putValue(AbstractAction.NAME, "Analyze " + summarizer.getName() + " (beta)"); putValue(AbstractAction.SMALL_ICON, Enum.valueOf(IconLoader.class, summarizer.getIconName()).getIcon()); } @@ -1703,26 +1703,26 @@ public class ActionFactory { public void actionPerformed(ActionEvent e) { List netlists = plugInPort.extractNetlists(); if (netlists == null || netlists.isEmpty()) { - swingUI.showMessage("The generated netlist is empty, nothing to show.", "Netlist", ISwingUI.INFORMATION_MESSAGE); + swingUI.showMessage("The generated netlist is empty, nothing to show.", "Analyze " + summarizer.getName(), ISwingUI.INFORMATION_MESSAGE); return; } List res = summarizer.summarize(netlists, null); if (res == null) { - swingUI.showMessage("The generated summary is empty, nothing to show.", "Analyze", ISwingUI.INFORMATION_MESSAGE); + swingUI.showMessage("The generated summary is empty, nothing to show.", "Analyze " + summarizer.getName(), ISwingUI.INFORMATION_MESSAGE); return; } StringBuilder sb = new StringBuilder(""); for (Summary summary : res) { - sb.append("

Switch configuration: ").append(summary.getNetlist().getSwitchSetup()).append("

Notes:

"); + sb.append("

Switch configuration: ").append(summary.getNetlist().getSwitchSetup()).append("

"); for (String v : summary.getNotes()) { sb.append("  ").append(v).append("
"); } sb.append("



"); } sb.append(""); - new TextDialog(swingUI.getOwnerFrame().getRootPane(), sb.toString(), "Netlist", new Dimension(600, 480)).setVisible(true); + new TextDialog(swingUI.getOwnerFrame().getRootPane(), sb.toString(), "Analyze " + summarizer.getName(), new Dimension(600, 480)).setVisible(true); } } }