From 77cebc39117ea235bb5cfa458d491903d12d66dc Mon Sep 17 00:00:00 2001 From: Bane Stojkovic Date: Wed, 26 Mar 2025 18:04:47 +0100 Subject: [PATCH] netlist analyzer enhancements --- .../org/diylc/common/INetlistAnalyzer.java | 6 ++++ .../diylc/common/NetlistSwitchPreference.java | 5 +++ .../org/diylc/netlist/NetlistBuilder.java | 8 +++-- .../diylc/netlist/GuitarDiagramAnalyzer.java | 13 ++++--- .../org/diylc/netlist/MultimeterAnalyzer.java | 6 ++++ .../java/org/diylc/netlist/SpiceAnalyzer.java | 34 +++++++++++++++++-- .../java/org/diylc/swing/ActionFactory.java | 4 +-- .../swing/actions/SummarizeNetlistAction.java | 15 +++++--- .../swing/plugins/file/FileMenuPlugin.java | 22 +++++++----- 9 files changed, 89 insertions(+), 24 deletions(-) create mode 100644 diylc/diylc-core/src/main/java/org/diylc/common/NetlistSwitchPreference.java diff --git a/diylc/diylc-core/src/main/java/org/diylc/common/INetlistAnalyzer.java b/diylc/diylc-core/src/main/java/org/diylc/common/INetlistAnalyzer.java index aa5fda5c..3b2fb13a 100644 --- a/diylc/diylc-core/src/main/java/org/diylc/common/INetlistAnalyzer.java +++ b/diylc/diylc-core/src/main/java/org/diylc/common/INetlistAnalyzer.java @@ -22,6 +22,7 @@ package org.diylc.common; import java.util.List; +import java.util.Set; import org.diylc.netlist.Netlist; import org.diylc.netlist.Node; @@ -59,4 +60,9 @@ public interface INetlistAnalyzer { * @return name of the font to be used for display. */ String getFontName(); + + /** + * @return ability to process netlists with or without switches included. + */ + Set getSwitchPreference(); } diff --git a/diylc/diylc-core/src/main/java/org/diylc/common/NetlistSwitchPreference.java b/diylc/diylc-core/src/main/java/org/diylc/common/NetlistSwitchPreference.java new file mode 100644 index 00000000..314a36e3 --- /dev/null +++ b/diylc/diylc-core/src/main/java/org/diylc/common/NetlistSwitchPreference.java @@ -0,0 +1,5 @@ +package org.diylc.common; + +public enum NetlistSwitchPreference { + WITH, WITHOUT; +} diff --git a/diylc/diylc-core/src/main/java/org/diylc/netlist/NetlistBuilder.java b/diylc/diylc-core/src/main/java/org/diylc/netlist/NetlistBuilder.java index 47aa6066..25963e26 100644 --- a/diylc/diylc-core/src/main/java/org/diylc/netlist/NetlistBuilder.java +++ b/diylc/diylc-core/src/main/java/org/diylc/netlist/NetlistBuilder.java @@ -69,7 +69,7 @@ public class NetlistBuilder { .extractComponentTypeFrom((Class>) c.getClass()); // extract nodes - if (!(c instanceof IContinuity) && !(c instanceof ICommonNode)) { + if (!(c instanceof IContinuity && !(c instanceof ISwitch)) && !(c instanceof ICommonNode)) { // regular components, create a node per control point for (int i = 0; i < c.getControlPointCount(); i++) { String nodeName = c.getControlPointNodeName(i); @@ -415,8 +415,10 @@ public class NetlistBuilder { IDIYComponent c = project.getComponents().get(z); ComponentType type = ComponentProcessor.getInstance() .extractComponentTypeFrom((Class>) c.getClass()); - // handle direct connections - if (c instanceof IContinuity) { + // handle direct connections or connections through a switch + // when not using "includeSwitches" flag + if (c instanceof IContinuity && + (!(c instanceof ISwitch) || switchPositions.isEmpty())) { for (int i = 0; i < c.getControlPointCount() - 1; i++) for (int j = i + 1; j < c.getControlPointCount(); j++) if (((IContinuity) c).arePointsConnected(i, j)) diff --git a/diylc/diylc-library/src/main/java/org/diylc/netlist/GuitarDiagramAnalyzer.java b/diylc/diylc-library/src/main/java/org/diylc/netlist/GuitarDiagramAnalyzer.java index f8047716..1239c7e1 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/netlist/GuitarDiagramAnalyzer.java +++ b/diylc/diylc-library/src/main/java/org/diylc/netlist/GuitarDiagramAnalyzer.java @@ -30,6 +30,7 @@ import java.util.stream.Collectors; import javax.swing.JLabel; import org.diylc.common.INetlistAnalyzer; +import org.diylc.common.NetlistSwitchPreference; import org.diylc.components.electromechanical.ClosedJack1_4; import org.diylc.components.electromechanical.OpenJack1_4; import org.diylc.components.guitar.AbstractGuitarPickup; @@ -89,6 +90,10 @@ public class GuitarDiagramAnalyzer extends AbstractNetlistAnalyzer implements IN RC_TYPES.addAll(RESISTOR_TYPES); } + private int positiveCount; + private int negativeCount; + private int noiseCount; + @Override public String getName() { return "Analyze Guitar Diagrams"; @@ -109,10 +114,10 @@ public class GuitarDiagramAnalyzer extends AbstractNetlistAnalyzer implements IN return new JLabel().getFont().getName(); } - - private int positiveCount; - private int negativeCount; - private int noiseCount; + @Override + public Set getSwitchPreference() { + return Set.of(NetlistSwitchPreference.WITH); + } protected Summary summarize(Netlist netlist, Node preferredOutput) throws TreeException { List notes = new ArrayList(); diff --git a/diylc/diylc-library/src/main/java/org/diylc/netlist/MultimeterAnalyzer.java b/diylc/diylc-library/src/main/java/org/diylc/netlist/MultimeterAnalyzer.java index fa90ab8c..445c2ab8 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/netlist/MultimeterAnalyzer.java +++ b/diylc/diylc-library/src/main/java/org/diylc/netlist/MultimeterAnalyzer.java @@ -21,6 +21,7 @@ package org.diylc.netlist; import java.util.*; import javax.swing.JLabel; import org.diylc.common.INetlistAnalyzer; +import org.diylc.common.NetlistSwitchPreference; import org.diylc.components.connectivity.MultimeterProbe; public class MultimeterAnalyzer extends AbstractNetlistAnalyzer implements INetlistAnalyzer { @@ -45,6 +46,11 @@ public class MultimeterAnalyzer extends AbstractNetlistAnalyzer implements INetl return new JLabel().getFont().getName(); } + @Override + public Set getSwitchPreference() { + return EnumSet.allOf(NetlistSwitchPreference.class); + } + protected Summary summarize(Netlist netlist, Node preferredOutput) throws TreeException { Tree tree = constructTree(netlist); diff --git a/diylc/diylc-library/src/main/java/org/diylc/netlist/SpiceAnalyzer.java b/diylc/diylc-library/src/main/java/org/diylc/netlist/SpiceAnalyzer.java index af46a9a2..0db6676d 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/netlist/SpiceAnalyzer.java +++ b/diylc/diylc-library/src/main/java/org/diylc/netlist/SpiceAnalyzer.java @@ -21,11 +21,15 @@ */ package org.diylc.netlist; +import java.lang.reflect.ParameterizedType; import java.util.ArrayList; +import java.util.EnumSet; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; import org.diylc.common.INetlistAnalyzer; +import org.diylc.common.NetlistSwitchPreference; import org.diylc.core.IDIYComponent; import org.diylc.netlist.Group; import org.diylc.netlist.Netlist; @@ -33,6 +37,7 @@ import org.diylc.netlist.NetlistAnalyzer; import org.diylc.netlist.Node; import org.diylc.netlist.Summary; import org.diylc.netlist.TreeException; +import org.diylc.presenter.ComponentProcessor; public class SpiceAnalyzer extends AbstractNetlistAnalyzer implements INetlistAnalyzer { @@ -58,6 +63,11 @@ public class SpiceAnalyzer extends AbstractNetlistAnalyzer implements INetlistAn public String getFontName() { return "Courier New"; } + + @Override + public Set getSwitchPreference() { + return EnumSet.allOf(NetlistSwitchPreference.class); + } protected Summary summarize(Netlist netlist, Node preferredOutput) throws TreeException { // grab all components that are in the netlist @@ -121,7 +131,7 @@ public class SpiceAnalyzer extends AbstractNetlistAnalyzer implements INetlistAn sb.append(" "); } - sb.append(c.getValue()); + sb.append(formatValue(c)); if (c instanceof ISpiceMapper) { String comment = ((ISpiceMapper)c).getComment(); @@ -137,7 +147,27 @@ public class SpiceAnalyzer extends AbstractNetlistAnalyzer implements INetlistAn .sorted() .collect(Collectors.joining("\n"))); } - + + private static Object formatValue(IDIYComponent c) { + if (c.getValue() == null || c.getValue().toString().trim().isEmpty()) { + String typeName = ComponentProcessor.getInstance() + .extractComponentTypeFrom((Class>) c.getClass()).getName(); +// if ( +// Void.class.equals(((ParameterizedType) c.getClass() +// .getGenericSuperclass()).getActualTypeArguments()[0])) { +// return typeName; +// } + if (typeName.contains(" ")) { + return "\"" + typeName + "\""; + } + return typeName; + } + if (c.getValue().toString().contains(" ")) { + return "\"" + c.getValue() + "\""; + } + return c.getValue(); + } + private static String formatSpiceNode(int i) { return String.format("N%03d" , i); } diff --git a/diylc/diylc-swing/src/main/java/org/diylc/swing/ActionFactory.java b/diylc/diylc-swing/src/main/java/org/diylc/swing/ActionFactory.java index 3a2bd1f5..da13435c 100644 --- a/diylc/diylc-swing/src/main/java/org/diylc/swing/ActionFactory.java +++ b/diylc/diylc-swing/src/main/java/org/diylc/swing/ActionFactory.java @@ -280,8 +280,8 @@ public class ActionFactory { } public SummarizeNetlistAction createSummarizeNetlistAction(IPlugInPort plugInPort, - ISwingUI swingUI, INetlistAnalyzer summarizer) { - return new SummarizeNetlistAction(plugInPort, swingUI, summarizer); + ISwingUI swingUI, INetlistAnalyzer summarizer, boolean includeSwitches) { + return new SummarizeNetlistAction(plugInPort, swingUI, summarizer, includeSwitches); } public CheckProximityAction createCheckProximityAction(IPlugInPort plugInPort, ISwingUI swingUI) { diff --git a/diylc/diylc-swing/src/main/java/org/diylc/swing/actions/SummarizeNetlistAction.java b/diylc/diylc-swing/src/main/java/org/diylc/swing/actions/SummarizeNetlistAction.java index 9d509cb0..ff651f6f 100644 --- a/diylc/diylc-swing/src/main/java/org/diylc/swing/actions/SummarizeNetlistAction.java +++ b/diylc/diylc-swing/src/main/java/org/diylc/swing/actions/SummarizeNetlistAction.java @@ -22,14 +22,21 @@ public class SummarizeNetlistAction extends AbstractAction { private IPlugInPort plugInPort; private ISwingUI swingUI; private INetlistAnalyzer summarizer; + private final boolean includeSwitches; public SummarizeNetlistAction(IPlugInPort plugInPort, ISwingUI swingUI, - INetlistAnalyzer summarizer) { + INetlistAnalyzer summarizer, boolean includeSwitches) { super(); this.plugInPort = plugInPort; this.swingUI = swingUI; this.summarizer = summarizer; - putValue(AbstractAction.NAME, summarizer.getName()); + this.includeSwitches = includeSwitches; + String name = summarizer.getName(); + if (summarizer.getSwitchPreference().size() > 1) { + name += includeSwitches ? + " (incl. Switches)" : " (excl. Switches)"; + } + putValue(AbstractAction.NAME, name); putValue(AbstractAction.SMALL_ICON, Enum.valueOf(IconLoader.class, summarizer.getIconName()).getIcon()); } @@ -41,7 +48,7 @@ public class SummarizeNetlistAction extends AbstractAction { @Override public List doInBackground() throws Exception { - List netlists = plugInPort.extractNetlists(true); + List netlists = plugInPort.extractNetlists(includeSwitches); if (netlists == null || netlists.isEmpty()) { throw new Exception("The generated netlist is empty, nothing to show."); } @@ -84,4 +91,4 @@ public class SummarizeNetlistAction extends AbstractAction { } }, true); } -} \ No newline at end of file +} diff --git a/diylc/diylc-swing/src/main/java/org/diylc/swing/plugins/file/FileMenuPlugin.java b/diylc/diylc-swing/src/main/java/org/diylc/swing/plugins/file/FileMenuPlugin.java index 9c2047c2..c845f1bf 100644 --- a/diylc/diylc-swing/src/main/java/org/diylc/swing/plugins/file/FileMenuPlugin.java +++ b/diylc/diylc-swing/src/main/java/org/diylc/swing/plugins/file/FileMenuPlugin.java @@ -24,13 +24,9 @@ import java.util.EnumSet; import java.util.List; import org.apache.log4j.Logger; import org.diylc.appframework.miscutils.ConfigurationManager; +import org.diylc.common.*; import org.diylc.swing.IDynamicSubmenuHandler; -import org.diylc.common.EventType; -import org.diylc.common.INetlistAnalyzer; -import org.diylc.common.IPlugIn; -import org.diylc.common.IPlugInPort; -import org.diylc.common.ITask; import org.diylc.swing.ActionFactory; import org.diylc.swing.ISwingUI; import org.diylc.utils.IconLoader; @@ -108,10 +104,18 @@ public class FileMenuPlugin implements IPlugIn, IDynamicSubmenuHandler { List summarizers = plugInPort.getNetlistAnalyzers(); if (summarizers != null) { - for (INetlistAnalyzer summarizer : summarizers) - swingUI.injectMenuAction( - actionFactory.createSummarizeNetlistAction(plugInPort, swingUI, summarizer), - ANALYZE_TITLE); + for (INetlistAnalyzer summarizer : summarizers) { + if (summarizer.getSwitchPreference().contains(NetlistSwitchPreference.WITH)) { + swingUI.injectMenuAction( + actionFactory.createSummarizeNetlistAction(plugInPort, swingUI, summarizer, true), + ANALYZE_TITLE); + } + if (summarizer.getSwitchPreference().contains(NetlistSwitchPreference.WITHOUT)) { + swingUI.injectMenuAction( + actionFactory.createSummarizeNetlistAction(plugInPort, swingUI, summarizer, false), + ANALYZE_TITLE); + } + } } swingUI.injectMenuAction(null, FILE_TITLE);