From 47ee146ac729df0437b06574af8018d72b87b217 Mon Sep 17 00:00:00 2001 From: Quang Truong Date: Tue, 21 Jul 2026 11:46:01 +0200 Subject: [PATCH 1/2] Signal Tabelle: update side distance determine --- .../ssks/AbstractSignalTableTransform.java | 2 +- .../table/pt1/ssks/SignalSideDistance.java | 187 ++++++++++++------ .../table/pt1/sskz/SskzTransformator.java | 35 ++-- 3 files changed, 139 insertions(+), 85 deletions(-) diff --git a/java/bundles/org.eclipse.set.feature.table.pt1/src/org/eclipse/set/feature/table/pt1/ssks/AbstractSignalTableTransform.java b/java/bundles/org.eclipse.set.feature.table.pt1/src/org/eclipse/set/feature/table/pt1/ssks/AbstractSignalTableTransform.java index 73889f77a2..cb6575debe 100644 --- a/java/bundles/org.eclipse.set.feature.table.pt1/src/org/eclipse/set/feature/table/pt1/ssks/AbstractSignalTableTransform.java +++ b/java/bundles/org.eclipse.set.feature.table.pt1/src/org/eclipse/set/feature/table/pt1/ssks/AbstractSignalTableTransform.java @@ -339,7 +339,7 @@ protected void fillAbstandMastMitte(final TableRow row, final Signal signal, if (distances.stream() .anyMatch(v -> v - .getDistanceToNeighborTrack() > 0)) { + .getDistanceToNeighborTrack() != null)) { addTopologicalCell(row, column); } return distances.stream() diff --git a/java/bundles/org.eclipse.set.feature.table.pt1/src/org/eclipse/set/feature/table/pt1/ssks/SignalSideDistance.java b/java/bundles/org.eclipse.set.feature.table.pt1/src/org/eclipse/set/feature/table/pt1/ssks/SignalSideDistance.java index 6fe3b9520f..6f38190409 100644 --- a/java/bundles/org.eclipse.set.feature.table.pt1/src/org/eclipse/set/feature/table/pt1/ssks/SignalSideDistance.java +++ b/java/bundles/org.eclipse.set.feature.table.pt1/src/org/eclipse/set/feature/table/pt1/ssks/SignalSideDistance.java @@ -19,11 +19,12 @@ import java.util.Iterator; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; -import org.eclipse.set.basis.Pair; import org.eclipse.set.basis.geometry.GeoPosition; +import org.eclipse.set.model.planpro.BasisTypen.ENUMLinksRechts; import org.eclipse.set.model.planpro.BasisTypen.ENUMWirkrichtung; import org.eclipse.set.model.planpro.Basisobjekte.Punkt_Objekt_TOP_Kante_AttributeGroup; import org.eclipse.set.model.planpro.Signale.ENUMBefestigungArt; @@ -34,6 +35,7 @@ import org.eclipse.set.ppmodel.extensions.PunktObjektTopKanteExtensions; import org.eclipse.set.ppmodel.extensions.SignalRahmenExtensions; import org.eclipse.set.ppmodel.extensions.geometry.GEOKanteGeometryExtensions; +import org.eclipse.set.utils.math.DoubleExtensions; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; @@ -51,51 +53,71 @@ public class SignalSideDistance { * Helper class for determine side distance */ public static class SideDistance { - long distanceToMainTrack; + Optional distanceToMainTrack; + Optional distanceToNeighborTrack; + Optional position; /** * @return the distance from signal to main track */ - public double getDistanceToMainTrack() { - return distanceToMainTrack; + public Double getDistanceToMainTrack() { + if (distanceToMainTrack.isPresent()) { + return Double.valueOf( + Math.abs(distanceToMainTrack.get().doubleValue())); + } + return null; } /** * @return the distance from signal to neighbor track */ - public double getDistanceToNeighborTrack() { - return distanceToNeighborTrack; + public Double getDistanceToNeighborTrack() { + if (distanceToNeighborTrack.isEmpty()) { + return null; + } + return Double.valueOf(distanceToNeighborTrack.get().doubleValue()); } - long distanceToNeighborTrack; - /** * @param distanceToMainTrack * the distance from signal to main track * @param distanceToNeighborTrack * the distance from main track to neighbor track + * @param position + * the position of signal */ - public SideDistance(final long distanceToMainTrack, - final long distanceToNeighborTrack) { + public SideDistance(final Optional distanceToMainTrack, + final Optional distanceToNeighborTrack, + final Optional position) { this.distanceToMainTrack = distanceToMainTrack; this.distanceToNeighborTrack = distanceToNeighborTrack; + this.position = position; } + @SuppressWarnings({ "nls", "boxing" }) @Override public String toString() { - if (distanceToNeighborTrack > 0) { - return String.format("%s (%s)", //$NON-NLS-1$ - String.valueOf(distanceToMainTrack), - String.valueOf(distanceToNeighborTrack)); + if (distanceToMainTrack.isEmpty() && position.isEmpty()) { + return ""; + } + final StringBuilder builder = new StringBuilder(); + builder.append(distanceToMainTrack.isPresent() + ? DoubleExtensions.toTableDecimal( + Math.abs(distanceToMainTrack.get().doubleValue())) + : "x"); + if (distanceToNeighborTrack.isPresent() + && distanceToNeighborTrack.get().doubleValue() > 0) { + builder.append(" ("); + builder.append(DoubleExtensions.toTableDecimal( + distanceToNeighborTrack.get().doubleValue())); + builder.append(")"); } - return String.valueOf(distanceToMainTrack); + return builder.toString(); } } final Signal signal; - private final Set sideDistancesRight = new HashSet<>(); - - private final Set sideDistancesLeft = new HashSet<>(); + private final Set sideDistances = new HashSet<>(); private final List relevantMastType; /** @@ -120,14 +142,20 @@ public SignalSideDistance(final Signal signal, * @return distances of the signal to tracks on right side */ public Set getSideDistancesRight() { - return sideDistancesRight; + return sideDistances.stream() + .filter(e -> e.position.isPresent() && e.position + .get() == ENUMLinksRechts.ENUM_LINKS_RECHTS_RECHTS) + .collect(Collectors.toSet()); } /** * @return distances of the signal to tracks on left side */ public Set getSideDistancesLeft() { - return sideDistancesLeft; + return sideDistances.stream() + .filter(e -> e.position.isPresent() && e.position + .get() == ENUMLinksRechts.ENUM_LINKS_RECHTS_LINKS) + .collect(Collectors.toSet()); } /** @@ -141,7 +169,6 @@ public Set getSideDistancesLeft() { * the {@link RuntimeException} * */ - @SuppressWarnings("boxing") private void getSideDistance() throws IllegalArgumentException, NullPointerException, RuntimeException { final Set signalBefestigung = getSignalBefestigung(); @@ -158,13 +185,13 @@ private void getSideDistance() throws IllegalArgumentException, .getWert(); final double signalRotation = PunktObjektExtensions .rotation(signal); - final Pair result = getSideDistance(potk, direction, - signalRotation); + final SideDistance result = determinSideDistanceValue(potk, + direction, signalRotation); if (result == null) { return; } - setSideDistances(result.getFirst(), direction, result.getSecond()); + dertermineSignalPosition(result, direction); }); } @@ -181,39 +208,43 @@ private void getSideDistance() throws IllegalArgumentException, * @return */ @SuppressWarnings("boxing") - public static Pair getSideDistance( + public static SideDistance determinSideDistanceValue( final Punkt_Objekt_TOP_Kante_AttributeGroup potk, final ENUMWirkrichtung direction, final double rotation) { - final Long sideDistance = getNullableObject(potk, p -> Math - .round(p.getSeitlicherAbstand().getWert().doubleValue() * 1000)) - .orElse(null); - if (sideDistance == null) { - return null; + final Optional sideDistance = getNullableObject(potk, + p -> Math.round(p.getSeitlicherAbstand().getWert().doubleValue() + * 1000)); + final Optional position = getNullableObject(potk, + p -> p.getSeitlicheLage().getWert()); + if (sideDistance.isEmpty() && position.isEmpty()) { + return new SideDistance(Optional.empty(), Optional.empty(), + Optional.empty()); } - final long distanceFromPoint = MAX_DISTANCE_TO_NEIGHBOR - - Math.abs(sideDistance); + - Math.abs(sideDistance.orElse((long) 0)); final int perpendicularRotation = getPerpendicularRotation(sideDistance, - direction); + direction, position); if (distanceFromPoint <= 0) { - return new Pair<>(sideDistance, (long) 0); + return new SideDistance(sideDistance, Optional.empty(), position); } double opposideDistance = 0.0; - final GeoPosition position = PunktObjektTopKanteExtensions + final GeoPosition geoPosition = PunktObjektTopKanteExtensions .getCoordinate(potk); try { - opposideDistance = getOpposideDistance(potk, position, + opposideDistance = getOpposideDistance(potk, geoPosition, rotation + perpendicularRotation, distanceFromPoint / 1000.0f); } catch (final Exception e) { throw new RuntimeException(e); } final long distanceBetweenTrack = opposideDistance > 0 - ? Math.abs(sideDistance) + Math.round(opposideDistance * 1000) + ? Math.abs(sideDistance.orElse((long) 0)) + + Math.round(opposideDistance * 1000) : 0; - return new Pair<>(sideDistance, distanceBetweenTrack); + return new SideDistance(sideDistance, Optional.of(distanceBetweenTrack), + position); } private Set getSignalBefestigung() { @@ -235,14 +266,36 @@ private Set getSignalBefestigung() { }).filter(Objects::nonNull).collect(Collectors.toSet()); } - private static int getPerpendicularRotation(final long sideDistance, - final ENUMWirkrichtung direction) throws IllegalArgumentException { - final boolean isPositiveSideDistance = sideDistance >= 0; + private static int getPerpendicularRotation( + final Optional sideDistance, final ENUMWirkrichtung direction, + final Optional position) + throws IllegalArgumentException { + final Optional isPositiveSideDistance = sideDistance + .isPresent() + ? Optional.of(Boolean + .valueOf(sideDistance.get().doubleValue() >= 0)) + : Optional.empty(); + if (isPositiveSideDistance.isEmpty() && position.isEmpty()) { + throw new IllegalArgumentException( + "The Punkt_Objekt haven't either side distcane or side position"); //$NON-NLS-1$ + } switch (direction) { case ENUM_WIRKRICHTUNG_IN: - return isPositiveSideDistance ? 90 : -90; + if (isPositiveSideDistance.isPresent() + && isPositiveSideDistance.get().booleanValue() + || position.isPresent() && position + .get() == ENUMLinksRechts.ENUM_LINKS_RECHTS_RECHTS) { + return 90; + } + return -90; case ENUM_WIRKRICHTUNG_GEGEN: - return isPositiveSideDistance ? -90 : 90; + if (isPositiveSideDistance.isPresent() + && isPositiveSideDistance.get().booleanValue() + || position.isPresent() && position + .get() == ENUMLinksRechts.ENUM_LINKS_RECHTS_LINKS) { + return -90; + } + return 90; default: { throw new IllegalArgumentException( "The Punkt_Objekt have Illegal Wirkrichtung: " //$NON-NLS-1$ @@ -311,36 +364,42 @@ private static double getOpposideDistance( .orElse(Double.valueOf(0)); } - private void setSideDistances(final long sideDistance, - final ENUMWirkrichtung direction, final long distanceBetweenTracks) - throws IllegalArgumentException { - final boolean isPositiveSideDistance = sideDistance >= 0; - final long positiveSideDistance = Math.abs(sideDistance); - switch (direction) { + private void dertermineSignalPosition(final SideDistance sideDistance, + final ENUMWirkrichtung direction) throws IllegalArgumentException { + final Optional isPositiveSideDistance = sideDistance.distanceToMainTrack + .isPresent() + ? Optional.of(Boolean + .valueOf(sideDistance.distanceToMainTrack.get() + .doubleValue() >= 0)) + : Optional.empty(); + final ENUMLinksRechts signalPosition = switch (direction) { case ENUM_WIRKRICHTUNG_IN: { - if (isPositiveSideDistance) { - sideDistancesLeft.add(new SideDistance(positiveSideDistance, - distanceBetweenTracks)); - } else { - sideDistancesRight.add(new SideDistance( - positiveSideDistance, distanceBetweenTracks)); + if (isPositiveSideDistance.isPresent() + && isPositiveSideDistance.get().booleanValue() + || sideDistance.position.isPresent() + && sideDistance.position + .get() == ENUMLinksRechts.ENUM_LINKS_RECHTS_RECHTS) { + yield ENUMLinksRechts.ENUM_LINKS_RECHTS_LINKS; } - break; + yield ENUMLinksRechts.ENUM_LINKS_RECHTS_RECHTS; } case ENUM_WIRKRICHTUNG_GEGEN: { - if (!isPositiveSideDistance) { - sideDistancesLeft.add(new SideDistance(positiveSideDistance, - distanceBetweenTracks)); - } else { - sideDistancesRight.add(new SideDistance( - positiveSideDistance, distanceBetweenTracks)); + if (isPositiveSideDistance.isPresent() + && isPositiveSideDistance.get().booleanValue() + || sideDistance.position.isPresent() + && sideDistance.position + .get() == ENUMLinksRechts.ENUM_LINKS_RECHTS_LINKS) { + yield ENUMLinksRechts.ENUM_LINKS_RECHTS_RECHTS; } - break; + yield ENUMLinksRechts.ENUM_LINKS_RECHTS_LINKS; } default: throw new IllegalArgumentException( "The Signal_Befestigung have Illegal Wirkrichtung: " //$NON-NLS-1$ + direction); - } + }; + sideDistances.add(new SideDistance(sideDistance.distanceToMainTrack, + sideDistance.distanceToNeighborTrack, + Optional.of(signalPosition))); } } diff --git a/java/bundles/org.eclipse.set.feature.table.pt1/src/org/eclipse/set/feature/table/pt1/sskz/SskzTransformator.java b/java/bundles/org.eclipse.set.feature.table.pt1/src/org/eclipse/set/feature/table/pt1/sskz/SskzTransformator.java index a8d84fa4e7..52955d5e15 100644 --- a/java/bundles/org.eclipse.set.feature.table.pt1/src/org/eclipse/set/feature/table/pt1/sskz/SskzTransformator.java +++ b/java/bundles/org.eclipse.set.feature.table.pt1/src/org/eclipse/set/feature/table/pt1/sskz/SskzTransformator.java @@ -24,18 +24,17 @@ import java.util.LinkedList; import java.util.List; import java.util.Objects; -import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Stream; -import org.eclipse.set.basis.Pair; import org.eclipse.set.basis.graph.TopPoint; import org.eclipse.set.core.services.enumtranslation.EnumTranslationService; import org.eclipse.set.core.services.graph.BankService; import org.eclipse.set.feature.table.pt1.AbstractPlanPro2TableModelTransformator; import org.eclipse.set.feature.table.pt1.ssks.SignalSideDistance; +import org.eclipse.set.feature.table.pt1.ssks.SignalSideDistance.SideDistance; import org.eclipse.set.model.planpro.Ansteuerung_Element.Aussenelementansteuerung; import org.eclipse.set.model.planpro.Ansteuerung_Element.ENUMAussenelementansteuerungArt; import org.eclipse.set.model.planpro.Ansteuerung_Element.Stellelement; @@ -253,19 +252,13 @@ private void fillTrackMitteDistance(final TableRow row, fillIterableMultiCellWhenAllowed(row, getColumn(cols, Abstand_FEAx_Gleismitte), control, () -> isFindGeometryComplete(schnittStelle), ele -> { - final Pair sideDistance = getSideDistance(potk); - if (sideDistance != null) { - final String trackDistance = sideDistance.getSecond() - .longValue() > 0 ? String.format("(%d)", //$NON-NLS-1$ - sideDistance.getSecond()) : ""; //$NON-NLS-1$ - if (!trackDistance.isEmpty()) { + final SideDistance sideDistance = getSideDistance(potk); + if (sideDistance.getDistanceToMainTrack() != null) { + if (sideDistance.getDistanceToNeighborTrack() != null) { addTopologicalCell(row, getColumn(cols, SskzColumns.Abstand_FEAx_Gleismitte)); } - return String.format("%s%s", //$NON-NLS-1$ - Math.abs(sideDistance.getFirst()), - trackDistance.isEmpty() ? "" //$NON-NLS-1$ - : " " + trackDistance); //$NON-NLS-1$ + return sideDistance.toString(); } return ""; //$NON-NLS-1$ }); @@ -433,7 +426,7 @@ private List getRelevantFieldElements( .toList(); } - private static Pair getSideDistance( + private static SideDistance getSideDistance( final Punkt_Objekt_TOP_Kante_AttributeGroup potk) { final double rotation = PunktObjektTopKanteExtensions .getCoordinate(potk) @@ -443,14 +436,16 @@ private static Pair getSideDistance( // Find neighbor track in two side if (direction == null || direction == ENUMWirkrichtung.ENUM_WIRKRICHTUNG_BEIDE) { - return Optional - .ofNullable(SignalSideDistance.getSideDistance(potk, - ENUMWirkrichtung.ENUM_WIRKRICHTUNG_IN, rotation)) - .orElse(SignalSideDistance.getSideDistance(potk, - ENUMWirkrichtung.ENUM_WIRKRICHTUNG_GEGEN, - rotation)); + final SideDistance sideDistanceInDirection = SignalSideDistance + .determinSideDistanceValue(potk, + ENUMWirkrichtung.ENUM_WIRKRICHTUNG_IN, rotation); + if (sideDistanceInDirection.getDistanceToNeighborTrack() != null) { + return sideDistanceInDirection; + } + return SignalSideDistance.determinSideDistanceValue(potk, + ENUMWirkrichtung.ENUM_WIRKRICHTUNG_GEGEN, rotation); } - return SignalSideDistance.getSideDistance(potk, + return SignalSideDistance.determinSideDistanceValue(potk, potk.getWirkrichtung().getWert(), rotation); } From 1601a8d5151e0903b26215e3f55a3c271339a130 Mon Sep 17 00:00:00 2001 From: Quang Truong Date: Tue, 21 Jul 2026 11:57:45 +0200 Subject: [PATCH 2/2] Update excel template --- .../data/export/excel/ssks_vorlage.xlsx | Bin 24611 -> 24866 bytes .../data/export/excel/sskx_vorlage.xlsx | Bin 23820 -> 24106 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/java/bundles/org.eclipse.set.feature/rootdir/data/export/excel/ssks_vorlage.xlsx b/java/bundles/org.eclipse.set.feature/rootdir/data/export/excel/ssks_vorlage.xlsx index 2e3894e3fad34c63b0e2a7aff385b269eb9f55aa..e7a75e09880a78433601d1e8742264c316e92829 100644 GIT binary patch delta 8251 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 delta 5934 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 Rqru53wH51Wl+iKb{{jpoI_&@e