diff --git a/diylc/diylc-core/src/org/diylc/netlist/Tree.java b/diylc/diylc-core/src/org/diylc/netlist/Tree.java index b970a7c8..e10fd484 100644 --- a/diylc/diylc-core/src/org/diylc/netlist/Tree.java +++ b/diylc/diylc-core/src/org/diylc/netlist/Tree.java @@ -24,9 +24,12 @@ package org.diylc.netlist; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.HashSet; import java.util.List; import java.util.Set; +import org.diylc.core.IDIYComponent; + public class Tree { private List children; @@ -193,6 +196,72 @@ public class Tree { } } + public Set> extractComponents(Set types) { + Set> res = new HashSet>(); + if (leaf != null && types.contains(leaf.getComponent().getClass().getCanonicalName())) { + res.add(leaf.getComponent()); + } else if (children != null) { + for (Tree t : children) { + Set> childRes = t.extractComponents(types); + if (childRes != null) + res.addAll(childRes); + } + } + return res; + } + + public Tree locate(TreeLeaf l, boolean forceDirection) { + if (leaf != null && leaf.equals(l, forceDirection)) + return this; + if (children != null) { + for (Tree t : children) { + Tree childL = t.locate(l, forceDirection); + if (childL != null) { +// if (t.getLeaf() != null) +// return this; + return childL; + } + } + } + return null; + } + + public Tree findCommonParent(Tree t1, Tree t2) { + if (children == null) + return null; + + Tree p1 = null; + Tree p2 = null; + for (Tree c : children) { + if (c.contains(t1)) + p1 = c; + if (c.contains(t2)) + p2 = c; + } + + if (p1 == null || p2 == null) + return null; + + if (p1 != p2) + return this; + + return p1.findCommonParent(t1, t2); + } + + public boolean contains(Tree t) { + if (this == t) + return true; + + if (children == null) + return false; + if (children.contains(t)) + return true; + for (Tree c : children) + if (c.contains(t)) + return true; + return false; + } + public interface ITreeWalker { void visit(Tree t); diff --git a/diylc/diylc-core/src/org/diylc/netlist/TreeLeaf.java b/diylc/diylc-core/src/org/diylc/netlist/TreeLeaf.java index c2308e31..04eb3064 100644 --- a/diylc/diylc-core/src/org/diylc/netlist/TreeLeaf.java +++ b/diylc/diylc-core/src/org/diylc/netlist/TreeLeaf.java @@ -89,6 +89,15 @@ public class TreeLeaf implements ITree { return false; return true; } + + public boolean equals(TreeLeaf other, boolean forceDirection) { + if (component == null) { + if (other.component != null) + return false; + } else if (!component.equals(other.component)) + return false; + return (pointIndex1 == other.pointIndex1 && pointIndex2 == other.pointIndex2) || (!forceDirection && (pointIndex1 == other.pointIndex2 && pointIndex2 == other.pointIndex1)); + } @Override public String toString() { diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index 2d05ea05..7cf26f21 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/guitar/AbstractGuitarPickup.java b/diylc/diylc-library/src/org/diylc/components/guitar/AbstractGuitarPickup.java index 105a07a6..3bdbfa98 100644 --- a/diylc/diylc-library/src/org/diylc/components/guitar/AbstractGuitarPickup.java +++ b/diylc/diylc-library/src/org/diylc/components/guitar/AbstractGuitarPickup.java @@ -127,6 +127,8 @@ public abstract class AbstractGuitarPickup extends AbstractTransparentComponent< protected abstract Shape[] getBody(); + public abstract boolean isHumbucker(); + protected int getMainLabelYOffset() { return 0; } diff --git a/diylc/diylc-library/src/org/diylc/components/guitar/AbstractSingleOrHumbuckerPickup.java b/diylc/diylc-library/src/org/diylc/components/guitar/AbstractSingleOrHumbuckerPickup.java index 2e434aa1..1bbeedec 100644 --- a/diylc/diylc-library/src/org/diylc/components/guitar/AbstractSingleOrHumbuckerPickup.java +++ b/diylc/diylc-library/src/org/diylc/components/guitar/AbstractSingleOrHumbuckerPickup.java @@ -132,4 +132,8 @@ public abstract class AbstractSingleOrHumbuckerPickup extends AbstractGuitarPick return null; } + + public boolean isHumbucker() { + return getPolarity() == Polarity.Humbucking; + } } diff --git a/diylc/diylc-library/src/org/diylc/components/guitar/HumbuckerPickup.java b/diylc/diylc-library/src/org/diylc/components/guitar/HumbuckerPickup.java index cf9e0671..0457510c 100644 --- a/diylc/diylc-library/src/org/diylc/components/guitar/HumbuckerPickup.java +++ b/diylc/diylc-library/src/org/diylc/components/guitar/HumbuckerPickup.java @@ -371,6 +371,11 @@ public class HumbuckerPickup extends AbstractGuitarPickup { protected int getMainLabelYOffset() { return (int) (getType().getWidth().convertToPixels() / 2 - 20); } + + @Override + public boolean isHumbucker() { + return true; + } @Override public void drawIcon(Graphics2D g2d, int width, int height) { diff --git a/diylc/diylc-library/src/org/diylc/netlist/GuitarDiagramAnalyzer.java b/diylc/diylc-library/src/org/diylc/netlist/GuitarDiagramAnalyzer.java index 0062c42d..83cf1d3f 100644 --- a/diylc/diylc-library/src/org/diylc/netlist/GuitarDiagramAnalyzer.java +++ b/diylc/diylc-library/src/org/diylc/netlist/GuitarDiagramAnalyzer.java @@ -29,12 +29,14 @@ import java.util.Set; import org.diylc.common.INetlistAnalyzer; import org.diylc.components.electromechanical.ClosedJack1_4; import org.diylc.components.electromechanical.OpenJack1_4; +import org.diylc.components.guitar.AbstractGuitarPickup; import org.diylc.components.guitar.HumbuckerPickup; import org.diylc.components.guitar.JazzBassPickup; 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; import org.diylc.netlist.Tree.ITreeWalker; public class GuitarDiagramAnalyzer extends NetlistAnalyzer implements INetlistAnalyzer { @@ -111,6 +113,25 @@ public class GuitarDiagramAnalyzer extends NetlistAnalyzer implements INetlistAn negativeCount++; } }); + + Set> pickups = tree.extractComponents(PICKUP_TYPES); + for (IDIYComponent c : pickups) { + if (c instanceof AbstractGuitarPickup) { + AbstractGuitarPickup pickup = (AbstractGuitarPickup)c; + if (((AbstractGuitarPickup) c).isHumbucker()) { + TreeLeaf nLeaf = new TreeLeaf(pickup, 0, 1); + TreeLeaf sLeaf = new TreeLeaf(pickup, 2, 3); + Tree nTree = tree.locate(nLeaf, false); + Tree sTree = tree.locate(sLeaf, false); + Tree parent = tree.findCommonParent(nTree, sTree); + if (nTree != null && sTree != null && parent != null) { + notes.add(pickup.getName() + " pickup engaged in humbucking mode with coils wired in " + parent.getConnectionType().name().toLowerCase()); + } else if ((nTree == null && sTree != null) || (nTree != null && sTree == null)) { + notes.add(pickup.getName() + " pickup engaged in coil-split mode"); + } + } + } + } boolean humCancelling = noiseCount == 0; diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index 2d05ea05..7cf26f21 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 0bb9725a..8b6c01cb 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 9e2278a2..8210bed6 100644 --- a/diylc/diylc-swing/update.xml +++ b/diylc/diylc-swing/update.xml @@ -2528,7 +2528,7 @@ NEW_FEATURE - "Analyze Guitar Wiring" can figure out if wiring is hum-cancelling and in or out of phase for each position + "Analyze Guitar Wiring" can figure out if wiring is hum-cancelling and in or out of phase for each position, can detect split-coil wiring and series/parallel humbucking mode IMPROVEMENT