From 3b2dfb075f4aa4a31939cd5a877e91e50394041a Mon Sep 17 00:00:00 2001 From: Bane Stojkovic Date: Thu, 27 Mar 2025 22:55:22 +0100 Subject: [PATCH] show markers for rotary switch --- .../src/main/java/org/diylc/core/ISwitch.java | 2 - .../java/org/diylc/utils/SwitchUtils.java | 52 ++++++++--- .../electromechanical/RotarySwitchOpen.java | 88 +++---------------- 3 files changed, 48 insertions(+), 94 deletions(-) diff --git a/diylc/diylc-core/src/main/java/org/diylc/core/ISwitch.java b/diylc/diylc-core/src/main/java/org/diylc/core/ISwitch.java index 9a04acf2..0611f8f0 100644 --- a/diylc/diylc-core/src/main/java/org/diylc/core/ISwitch.java +++ b/diylc/diylc-core/src/main/java/org/diylc/core/ISwitch.java @@ -83,6 +83,4 @@ public interface ISwitch extends IContinuity { } return arePointsConnected(index1, index2, getSelectedPosition()); } - - List getCommonPoints(); } diff --git a/diylc/diylc-core/src/main/java/org/diylc/utils/SwitchUtils.java b/diylc/diylc-core/src/main/java/org/diylc/utils/SwitchUtils.java index 66e29668..33dc583f 100644 --- a/diylc/diylc-core/src/main/java/org/diylc/utils/SwitchUtils.java +++ b/diylc/diylc-core/src/main/java/org/diylc/utils/SwitchUtils.java @@ -27,24 +27,48 @@ import java.util.*; public class SwitchUtils { - public static Map>> getSwitchingMatrix(ISwitch switchComponent, int numPoints) { - Map>> result = new HashMap<>(); - - for (Integer commonPoint : switchComponent.getCommonPoints()) { - List> connectedPoints = new ArrayList<>(); - result.put(commonPoint, connectedPoints); - for (int i = 0; i < switchComponent.getPositionCount(); i++) { - List positionPoints = new ArrayList<>(); - for (int j = 0; j < numPoints; j++) { - if (commonPoint != j && switchComponent.arePointsConnected(commonPoint, j, i)) { - positionPoints.add(j); + public static String[] getSwitchingMarkers(ISwitch switchComponent, int numPoints, boolean verbose) { + String[] markers = new String[numPoints]; + List>> switchingMatrix = new ArrayList<>(); + for (int p = 0; p < switchComponent.getPositionCount(); p++) { + List> connectedPoints = new ArrayList<>(); + switchingMatrix.add(connectedPoints); + for (int i = 0; i < numPoints - 1; i++) { + for (int j = i + 1; j < numPoints; j++) { + if (switchComponent.arePointsConnected(i, j, p)) { + connectedPoints.add(Set.of(i, j)); } } - connectedPoints.add(positionPoints); } } - - return result; + List commonPoints = new ArrayList<>(); + for (int i = 0; i < numPoints; i++) { + final int finalI = i; + if (switchingMatrix.stream().allMatch( + l -> l.stream().anyMatch( + s -> s.contains(finalI)))) { + markers[i] = String.valueOf((char)((int)'A' + commonPoints.size())); + commonPoints.add(i); + } + } + for (int p = 0; p < switchComponent.getPositionCount(); p++) { + for (int c : commonPoints) { + for (int i = 0; i < numPoints; i++) { + if (commonPoints.contains(i)) { + continue; + } + if (switchComponent.arePointsConnected(Math.min(c, i), Math.max(c, i), p)) { + String marker = verbose ? markers[c] + (p + 1) : Integer.toString(p + 1); + if (markers[i] == null) { + markers[i] = marker; + } else { + markers[i] += "," + marker; + } + } + } + } + } + return markers; } public static List> getConnectedTerminals(ISwitch switchComponent, int numPoints) { diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/electromechanical/RotarySwitchOpen.java b/diylc/diylc-library/src/main/java/org/diylc/components/electromechanical/RotarySwitchOpen.java index d3d5d842..40c0da54 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/electromechanical/RotarySwitchOpen.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/electromechanical/RotarySwitchOpen.java @@ -63,6 +63,7 @@ import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; import org.diylc.presenter.AreaUtils; import org.diylc.utils.Constants; +import org.diylc.utils.SwitchUtils; import static org.diylc.utils.SwitchUtils.getConnectedTerminals; @@ -358,21 +359,11 @@ public class RotarySwitchOpen extends AbstractAngledComponent> connectedTerminals = getConnectedTerminals(this, controlPoints.length); - // Draw outer pins if (configuration.getNeedsSecondLevel()) { drawingObserver.startTrackingContinuityArea(true); for (int i = secondLevelStart; i < body.length; 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(outlineMode ? Constants.TRANSPARENT_COLOR : pinColor); - } else { - g2d.setColor(ISwitch.POLE_COLORS[groupIndex]); - } + g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : pinColor); g2d.fill(body[i]); g2d.setColor(outlineMode ? finalBorderColor : pinColor.darker()); g2d.draw(body[i]); @@ -394,15 +385,7 @@ public class RotarySwitchOpen extends AbstractAngledComponent connectedTerminals.get(j).contains(finalI)) - .findFirst().orElse(-1); - if (groupIndex < 0) { - g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : pinColor); - } else { - g2d.setColor(ISwitch.POLE_COLORS[groupIndex]); - } + g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : pinColor); g2d.fill(body[i]); drawingObserver.stopTrackingContinuityArea(); if (!outlineMode) { @@ -417,6 +400,9 @@ public class RotarySwitchOpen extends AbstractAngledComponent