From 1c48d7c31f29c305483ac15ac936308c715853d9 Mon Sep 17 00:00:00 2001 From: Bane Stojkovic Date: Sun, 16 Mar 2025 22:34:57 +0100 Subject: [PATCH] add freeway switch --- .../diylc-core/src/main/resources/update.xml | 4 + .../components/guitar/Freeway3x3_03.java | 82 +++++++++++++++---- ...4_03SwitchPositionPropertyValueSource.java | 48 +++++++++++ .../diylc/components/guitar/LeverSwitch.java | 10 ++- .../components/guitar/SchallerMegaSwitch.java | 23 +++--- 5 files changed, 141 insertions(+), 26 deletions(-) create mode 100644 diylc/diylc-library/src/main/java/org/diylc/components/guitar/Freeway3x4_03SwitchPositionPropertyValueSource.java diff --git a/diylc/diylc-core/src/main/resources/update.xml b/diylc/diylc-core/src/main/resources/update.xml index 2cda6e38..ec5a45f7 100644 --- a/diylc/diylc-core/src/main/resources/update.xml +++ b/diylc/diylc-core/src/main/resources/update.xml @@ -253,6 +253,10 @@ NEW_FEATURE 'Virtual Multimeter' from 'Analyze' menu traces the circuit finding all possible paths of electricity between two points designated by the probe symbol. + + NEW_FEATURE + Added ability to highlight connected switch lugs in selected position in order to illustrate how it works internally. + IMPROVEMENT Upgraded source code structure to modern standards and introduced Maven diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/guitar/Freeway3x3_03.java b/diylc/diylc-library/src/main/java/org/diylc/components/guitar/Freeway3x3_03.java index b8d5b180..c91c7d39 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/guitar/Freeway3x3_03.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/guitar/Freeway3x3_03.java @@ -33,6 +33,9 @@ import java.net.URI; import java.util.ArrayList; import java.util.List; import java.util.Random; +import java.util.Set; +import java.util.stream.IntStream; + import org.apache.log4j.Logger; import org.apache.poi.util.IOUtils; import org.diylc.appframework.miscutils.ConfigurationManager; @@ -47,26 +50,24 @@ import org.diylc.common.ObjectCache; import org.diylc.common.Orientation; import org.diylc.components.AbstractTransparentComponent; import org.diylc.components.transform.Freeway3x3_03Transformer; -import org.diylc.core.ComponentState; -import org.diylc.core.IDIYComponent; -import org.diylc.core.IDrawingObserver; -import org.diylc.core.ISwitch; -import org.diylc.core.Project; -import org.diylc.core.Theme; -import org.diylc.core.VisibilityPolicy; +import org.diylc.core.*; import org.diylc.core.annotations.ComponentDescriptor; +import org.diylc.core.annotations.DynamicEditableProperty; import org.diylc.core.annotations.EditableProperty; import org.diylc.core.annotations.KeywordPolicy; import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; import org.diylc.utils.Constants; +import static org.diylc.utils.SwitchUtils.getConnectedTerminals; + @ComponentDescriptor(name = "Freeway 3X3-03 Toggle", category = "Guitar", author = "Branislav Stojkovic", description = "Freeway 3X3-03 Toggle Switch", zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "SW", keywordPolicy = KeywordPolicy.SHOW_TAG, keywordTag = "Guitar Wiring Diagram", transformer = Freeway3x3_03Transformer.class, enableCache = true) -public class Freeway3x3_03 extends AbstractTransparentComponent implements ISwitch { +public class Freeway3x3_03 extends AbstractTransparentComponent implements ISwitch, + IContinuity { private static final Logger LOG = Logger.getLogger(Freeway3x3_03.class); @@ -91,6 +92,9 @@ public class Freeway3x3_03 extends AbstractTransparentComponent implements private Orientation orientation = Orientation.DEFAULT; + private Integer selectedPosition; + private Boolean highlightConnectedTerminals; + private transient SVGDiagram svgDiagram; private transient List pads; private transient List labels; @@ -180,16 +184,34 @@ public class Freeway3x3_03 extends AbstractTransparentComponent implements g2d.setColor(finalBorderColor); g2d.draw(base); + List> connectedTerminals = getConnectedTerminals(this, controlPoints.length); + drawingObserver.startTrackingContinuityArea(true); - g2d.setColor(PAD_COLOR); - for (Shape pad : pads) { - g2d.fill(pad); + for (int i = 0; i < pads.size(); i++) { + int finalI = i; + int groupIndex = IntStream.range(0, connectedTerminals.size()) + .filter(j -> connectedTerminals.get(j).contains(finalI)) + .findFirst().orElse(-1); + if (groupIndex < 0) { + g2d.setColor(PAD_COLOR); + } else { + g2d.setColor(ISwitch.POLE_COLORS[groupIndex]); + } + g2d.fill(pads.get(i)); } drawingObserver.stopTrackingContinuityArea(); - g2d.setColor(PAD_COLOR.darker()); - for (Shape pad : pads) { - g2d.draw(pad); + for (int i = 0; i < pads.size(); i++) { + int finalI = i; + int groupIndex = IntStream.range(0, connectedTerminals.size()) + .filter(j -> connectedTerminals.get(j).contains(finalI)) + .findFirst().orElse(-1); + if (groupIndex < 0) { + g2d.setColor(PAD_COLOR.darker()); + } else { + g2d.setColor(ISwitch.POLE_COLORS[groupIndex].darker()); + } + g2d.draw(pads.get(i)); } g2d.setColor(LABEL_COLOR); @@ -419,6 +441,30 @@ public class Freeway3x3_03 extends AbstractTransparentComponent implements return Integer.toString(position + 1); } + @DynamicEditableProperty(source = Freeway3x4_03SwitchPositionPropertyValueSource.class) + @EditableProperty(name = "Selected Position") + @Override + public Integer getSelectedPosition() { + return selectedPosition; + } + + public void setSelectedPosition(Integer selectedPosition) { + this.selectedPosition = selectedPosition; + } + + @EditableProperty(name = "Highlight Connected") + @Override + public Boolean getHighlightConnectedTerminals() { + if (highlightConnectedTerminals == null) { + highlightConnectedTerminals = false; + } + return highlightConnectedTerminals; + } + + public void setHighlightConnectedTerminals(Boolean highlightConnectedTerminals) { + this.highlightConnectedTerminals = highlightConnectedTerminals; + } + @Override public boolean arePointsConnected(int index1, int index2, int position) { if (position == 0 && ((index1 == 0 && index2 == 9) || (index1 == 1 && index2 == 7))) { @@ -445,4 +491,12 @@ public class Freeway3x3_03 extends AbstractTransparentComponent implements } return false; } + + @Override + public boolean arePointsConnected(int index1, int index2) { + if (this.selectedPosition == null) { + return false; + } + return arePointsConnected(index1, index2, this.selectedPosition); + } } diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/guitar/Freeway3x4_03SwitchPositionPropertyValueSource.java b/diylc/diylc-library/src/main/java/org/diylc/components/guitar/Freeway3x4_03SwitchPositionPropertyValueSource.java new file mode 100644 index 00000000..5efd2866 --- /dev/null +++ b/diylc/diylc-library/src/main/java/org/diylc/components/guitar/Freeway3x4_03SwitchPositionPropertyValueSource.java @@ -0,0 +1,48 @@ +package org.diylc.components.guitar; + +import org.diylc.common.PropertyWrapper; +import org.diylc.core.IDIYComponent; +import org.diylc.core.IDynamicPropertySource; +import org.diylc.core.ISwitch; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class Freeway3x4_03SwitchPositionPropertyValueSource implements IDynamicPropertySource { + + private List properties; + private IDIYComponent component; + + @Override + public void setProperties(List properties) { + this.properties = properties; + } + + @Override + public void setComponent(IDIYComponent component) { + this.component = component; + } + + @Override + public List getAvailableValues() { + int positionCount = 6; + List res = new ArrayList<>(); + res.add(null); + for (int i = 0; i < positionCount; i++) { + res.add(i); + } + return res; + } + + @Override + public String getDisplayValue(Object value) { + if (value == null) { + return "None"; + } + if (component instanceof ISwitch sw) { + return sw.getPositionName((Integer)value); + } + return "#" + (((Integer)value) + 1); + } +} diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/guitar/LeverSwitch.java b/diylc/diylc-library/src/main/java/org/diylc/components/guitar/LeverSwitch.java index 913a20ba..7458989b 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/guitar/LeverSwitch.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/guitar/LeverSwitch.java @@ -56,7 +56,7 @@ import static org.diylc.utils.SwitchUtils.getConnectedTerminals; description = "Strat-style lever switch", zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "SW", keywordPolicy = KeywordPolicy.SHOW_TAG, keywordTag = "Guitar Wiring Diagram", transformer = AngledComponentTransformer.class) -public class LeverSwitch extends AbstractAngledComponent implements ISwitch { +public class LeverSwitch extends AbstractAngledComponent implements ISwitch, IContinuity { private static final long serialVersionUID = 1L; @@ -443,6 +443,14 @@ public class LeverSwitch extends AbstractAngledComponent implements ISwitch { +public class SchallerMegaSwitch extends AbstractAngledComponent implements ISwitch, + IContinuity { private static final long serialVersionUID = 1L; @@ -167,7 +161,7 @@ public class SchallerMegaSwitch extends AbstractAngledComponent implemen g2d.setColor(ISwitch.POLE_COLORS[i - 3].darker()); g2d.draw(body[i]); } - + g2d.setColor(labelColor); // g2d.setFont(project.getFont().deriveFont(LABEL_FONT_SIZE)); if (type == MegaSwitchType.M) { @@ -266,7 +260,6 @@ public class SchallerMegaSwitch extends AbstractAngledComponent implemen body[2 + i] = new Area(); } - Area terminalArea = new Area(); for (int i = 0; i < controlPoints.length; i++) { Point2D point = controlPoints[i]; Area terminal = new Area(new RoundRectangle2D.Double(point.getX() - terminalSize / 2, @@ -551,6 +544,14 @@ public class SchallerMegaSwitch extends AbstractAngledComponent implemen return false; } + + @Override + public boolean arePointsConnected(int index1, int index2) { + if (this.selectedPosition == null) { + return false; + } + return arePointsConnected(index1, index2, this.selectedPosition); + } @Override public String getControlPointNodeName(int index) {