From b0290c5e5075802819628a2a9bd958bf2ee37ccc Mon Sep 17 00:00:00 2001 From: Jan-Erik Voigt Date: Mon, 17 Nov 2025 13:49:10 +0100 Subject: [PATCH 01/39] original meaning of getMountType --- .../feature/siteplan/transform/SignalTransformator.xtend | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/java/bundles/org.eclipse.set.feature.siteplan/src/org/eclipse/set/feature/siteplan/transform/SignalTransformator.xtend b/java/bundles/org.eclipse.set.feature.siteplan/src/org/eclipse/set/feature/siteplan/transform/SignalTransformator.xtend index d3c61f85e2..6dbbea24a2 100644 --- a/java/bundles/org.eclipse.set.feature.siteplan/src/org/eclipse/set/feature/siteplan/transform/SignalTransformator.xtend +++ b/java/bundles/org.eclipse.set.feature.siteplan/src/org/eclipse/set/feature/siteplan/transform/SignalTransformator.xtend @@ -190,6 +190,15 @@ class SignalTransformator extends BaseTransformator { } } + /** + * - if there is one mount != Sonderkonstruktion, return that mounts BefestigungsArt. + * - if there is more then one mount != Sonderkonstruktion, take the mount with the lowest GUID: + * - then: if mount is mast and there are more then 1 signals attached to this assembly, return MehrereMasten + * - if there are only Sonderkonstruktionen as mounts, return SONDERKONSTRUKTION + * - if there are no mounts: + * - take the signal with the lowest guid, and take the befestigungsArt from the signalReal + * - if signal/signalReal/signalReal.signalBefestigungsart null: return null + */ def SignalMountType getMountType(SignalInfo info) { var mounts = info.mounts.sortBy[identitaet.wert].map [ signalBefestigungAllg.befestigungArt.wert From 89383a806f7876377eb575c4df1ba9ef4b4c7001 Mon Sep 17 00:00:00 2001 From: Jan-Erik Voigt Date: Mon, 17 Nov 2025 14:32:19 +0100 Subject: [PATCH 02/39] add new, more refined condition for getMountType(SignalInfo) --- .../transform/SignalTransformator.xtend | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/java/bundles/org.eclipse.set.feature.siteplan/src/org/eclipse/set/feature/siteplan/transform/SignalTransformator.xtend b/java/bundles/org.eclipse.set.feature.siteplan/src/org/eclipse/set/feature/siteplan/transform/SignalTransformator.xtend index 6dbbea24a2..504713802e 100644 --- a/java/bundles/org.eclipse.set.feature.siteplan/src/org/eclipse/set/feature/siteplan/transform/SignalTransformator.xtend +++ b/java/bundles/org.eclipse.set.feature.siteplan/src/org/eclipse/set/feature/siteplan/transform/SignalTransformator.xtend @@ -92,6 +92,7 @@ class SignalTransformator extends BaseTransformator { mergeWith.mounts += si.mounts } } catch (Exception exc) { + System.out.println("Failed transformation: "+exc); recordError(si.signals.head?.identitaet?.wert, ERROR_FAILED_TRANSFORM) } @@ -191,13 +192,18 @@ class SignalTransformator extends BaseTransformator { } /** + * Original Definition: + * - if there are only Sonderkonstruktionen as mounts, return SONDERKONSTRUKTION * - if there is one mount != Sonderkonstruktion, return that mounts BefestigungsArt. * - if there is more then one mount != Sonderkonstruktion, take the mount with the lowest GUID: * - then: if mount is mast and there are more then 1 signals attached to this assembly, return MehrereMasten - * - if there are only Sonderkonstruktionen as mounts, return SONDERKONSTRUKTION * - if there are no mounts: * - take the signal with the lowest guid, and take the befestigungsArt from the signalReal * - if signal/signalReal/signalReal.signalBefestigungsart null: return null + * + * New Definition: + * (ASSUMPTION: no Arbeitsbuehne without a Bridge / Ausleger (see changes in mapToSiteplanMountType)) + * - if any specific mount is an SignalAuslegerLinks, return SignalAuslegerLinks. */ def SignalMountType getMountType(SignalInfo info) { var mounts = info.mounts.sortBy[identitaet.wert].map [ @@ -210,7 +216,27 @@ class SignalTransformator extends BaseTransformator { it != SignalMountType.SONDERKONSTRUKTION ] - if (specificMounts.length != 0) { + if (specificMounts.length == 1) { + return specificMounts.head; + } + + if (specificMounts.length > 1) { + // there might be many different combinations, obviously. + // I attempt to keep behaviour as before (even if not correct) and only change behaviour for SignalAusleger + + // SignalAusleger -> ... anything => should be SignalAusleger + // Fundament -> SignalAusleger => should be SignalAusleger + // Fundament -> Mast + + // new logic for any assembly containing a SignalAusleger. Same for all other cases + if (!specificMounts.filter[it === SignalMountType.SIGNALAUSLEGER_LINKS].isEmpty) { + return SignalMountType.SIGNALAUSLEGER_LINKS; + } + if (!specificMounts.filter[it === SignalMountType.SIGNALBRUECKE].isEmpty) { + return SignalMountType.SIGNALBRUECKE; + } + + var mount = specificMounts.head // If multiple signals are attached to a MAST, convert into MEHRERE_MASTEN if (mount === SignalMountType.MAST && info.signals.length > 1) { @@ -235,6 +261,7 @@ class SignalTransformator extends BaseTransformator { case ENUM_BEFESTIGUNG_ART_ANDERE_SONDERKONSTRUKTION, case ENUM_BEFESTIGUNG_ART_BAHNSTEIG, case ENUM_BEFESTIGUNG_ART_FUNDAMENT, + case ENUM_BEFESTIGUNG_ART_ARBEITSBUEHNE, case ENUM_BEFESTIGUNG_ART_KONSTRUKTIONSTEIL: return SignalMountType.SONDERKONSTRUKTION case ENUM_BEFESTIGUNG_ART_PRELLBOCK: @@ -249,7 +276,6 @@ class SignalTransformator extends BaseTransformator { case ENUM_BEFESTIGUNG_ART_PFOSTEN_NIEDRIG: return SignalMountType.PFOSTEN case ENUM_BEFESTIGUNG_ART_SONSTIGE, - case ENUM_BEFESTIGUNG_ART_ARBEITSBUEHNE, case ENUM_BEFESTIGUNG_ART_PFAHL, case ENUM_BEFESTIGUNG_ART_OL_KETTENWERK, case ENUM_BEFESTIGUNG_ART_OL_MAST, From 3942e35f8f3e8a1fc3dc98823a726df235fd5795 Mon Sep 17 00:00:00 2001 From: Jan-Erik Voigt Date: Mon, 17 Nov 2025 14:58:32 +0100 Subject: [PATCH 03/39] add Flash to getFeatureName --- web/siteplan/src/feature/FeatureInfo.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/web/siteplan/src/feature/FeatureInfo.ts b/web/siteplan/src/feature/FeatureInfo.ts index 1dc5d89806..2ffeb910ac 100644 --- a/web/siteplan/src/feature/FeatureInfo.ts +++ b/web/siteplan/src/feature/FeatureInfo.ts @@ -106,6 +106,8 @@ export function getFeatureLayerByType (type: FeatureType): FeatureLayerType { return FeatureLayerType.Unknown case FeatureType.TrackDirectionArrow: return FeatureLayerType.TrackDirection + case FeatureType.Flash: + return FeatureLayerType.Flash default: throw new Error('Missing layer for type: ' + type) } } @@ -194,6 +196,8 @@ export function getFeatureName (type: FeatureType): string { return 'Unbekannt' case FeatureType.TrackDirectionArrow: return 'GleisausrichtungsPfeil' + case FeatureType.Flash: + return 'Flash' // TODO default: console.error('Missing name for type: ' + type) return 'Unbenanntes Objekt' From f076b5de75de545e86fbfbf7526827dd3afc8c7a Mon Sep 17 00:00:00 2001 From: Jan-Erik Voigt Date: Mon, 1 Dec 2025 16:15:45 +0100 Subject: [PATCH 04/39] add anchors to HV Vr1 --- web/siteplan/public/SvgKatalog/HV-System.svg | 2 ++ 1 file changed, 2 insertions(+) diff --git a/web/siteplan/public/SvgKatalog/HV-System.svg b/web/siteplan/public/SvgKatalog/HV-System.svg index addd69bc1b..c338862444 100644 --- a/web/siteplan/public/SvgKatalog/HV-System.svg +++ b/web/siteplan/public/SvgKatalog/HV-System.svg @@ -33,6 +33,8 @@ + + From 8b29a88bf10b2b23a3913b29360f93aa04802d3c Mon Sep 17 00:00:00 2001 From: Jan-Erik Voigt Date: Mon, 1 Dec 2025 16:27:10 +0100 Subject: [PATCH 05/39] remove debugging text --- .../set/feature/siteplan/transform/SignalTransformator.xtend | 1 - 1 file changed, 1 deletion(-) diff --git a/java/bundles/org.eclipse.set.feature.siteplan/src/org/eclipse/set/feature/siteplan/transform/SignalTransformator.xtend b/java/bundles/org.eclipse.set.feature.siteplan/src/org/eclipse/set/feature/siteplan/transform/SignalTransformator.xtend index 504713802e..74a6a31d0f 100644 --- a/java/bundles/org.eclipse.set.feature.siteplan/src/org/eclipse/set/feature/siteplan/transform/SignalTransformator.xtend +++ b/java/bundles/org.eclipse.set.feature.siteplan/src/org/eclipse/set/feature/siteplan/transform/SignalTransformator.xtend @@ -92,7 +92,6 @@ class SignalTransformator extends BaseTransformator { mergeWith.mounts += si.mounts } } catch (Exception exc) { - System.out.println("Failed transformation: "+exc); recordError(si.signals.head?.identitaet?.wert, ERROR_FAILED_TRANSFORM) } From 1d440a9f14d2ca32feda95a73b77f06d277c1404 Mon Sep 17 00:00:00 2001 From: Jan-Erik Voigt Date: Mon, 8 Dec 2025 11:36:45 +0100 Subject: [PATCH 06/39] use exists instead of !filter.isEmpty --- .../set/feature/siteplan/transform/SignalTransformator.xtend | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/bundles/org.eclipse.set.feature.siteplan/src/org/eclipse/set/feature/siteplan/transform/SignalTransformator.xtend b/java/bundles/org.eclipse.set.feature.siteplan/src/org/eclipse/set/feature/siteplan/transform/SignalTransformator.xtend index 74a6a31d0f..e946a55175 100644 --- a/java/bundles/org.eclipse.set.feature.siteplan/src/org/eclipse/set/feature/siteplan/transform/SignalTransformator.xtend +++ b/java/bundles/org.eclipse.set.feature.siteplan/src/org/eclipse/set/feature/siteplan/transform/SignalTransformator.xtend @@ -228,10 +228,10 @@ class SignalTransformator extends BaseTransformator { // Fundament -> Mast // new logic for any assembly containing a SignalAusleger. Same for all other cases - if (!specificMounts.filter[it === SignalMountType.SIGNALAUSLEGER_LINKS].isEmpty) { + if (specificMounts.exists[it === SignalMountType.SIGNALAUSLEGER_LINKS]) { return SignalMountType.SIGNALAUSLEGER_LINKS; } - if (!specificMounts.filter[it === SignalMountType.SIGNALBRUECKE].isEmpty) { + if (specificMounts.exists[it === SignalMountType.SIGNALBRUECKE]) { return SignalMountType.SIGNALBRUECKE; } From 2f3e744ad8e9367ae09f003ac5c3c7ac558f090b Mon Sep 17 00:00:00 2001 From: Jan-Erik Voigt Date: Mon, 8 Dec 2025 12:57:46 +0100 Subject: [PATCH 07/39] Ne2 is alleinstehend --- .../src/util/SVG/SVGCatalog/Signals/AdditiveSignalScreen.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/siteplan/src/util/SVG/SVGCatalog/Signals/AdditiveSignalScreen.ts b/web/siteplan/src/util/SVG/SVGCatalog/Signals/AdditiveSignalScreen.ts index 99907f4b1a..acdebad9ca 100644 --- a/web/siteplan/src/util/SVG/SVGCatalog/Signals/AdditiveSignalScreen.ts +++ b/web/siteplan/src/util/SVG/SVGCatalog/Signals/AdditiveSignalScreen.ts @@ -13,7 +13,7 @@ import { AndereSignalGroup } from '../../SvgEnum' import SignalSVGCatalog from '../SignalSVGCatalog' export default class AdditiveSignalScreen extends SignalSVGCatalog { - private readonly alleinstehendeScreens = ['Zs2', 'Zs2v', 'Zs3', 'Zs3v', 'Zs6', 'Zp9', 'Zp9Ls', 'Zp10', 'Zp10Ls'] + private readonly alleinstehendeScreens = ['Zs2', 'Zs2v', 'Zs3', 'Zs3v', 'Zs6', 'Zp9', 'Zp9Ls', 'Zp10', 'Zp10Ls', 'Ne2'] public getSignalScreen (signal: Signal): ISvgElement | null { return this.getStandingAloneAdditiveSignal(signal) From 07024d63ba3e40e42b939aa0cc0a48d089e4cfdf Mon Sep 17 00:00:00 2001 From: Jan-Erik Voigt Date: Thu, 15 Jan 2026 11:08:35 +0100 Subject: [PATCH 08/39] reorder imports --- web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts b/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts index 2911abddbf..dc3a7779b4 100644 --- a/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts +++ b/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts @@ -7,15 +7,15 @@ * http://www.eclipse.org/legal/epl-v20.html */ -import { ISvgElement, SvgBridgeSignal, SvgElement, SvgPoint } from '@/model/SvgElement' -import { AnchorPoint } from '../SvgEnum' -import '@/util/ElementExtensions' import { MountDirection, SignalPart } from '@/model/Signal' -import SvgDraw from './SvgDraw' -import SvgDrawSingleSignal from './SvgDrawSingleSignal' import { SignalMountType } from '@/model/SignalMount' +import { ISvgElement, SvgBridgeSignal, SvgElement, SvgPoint } from '@/model/SvgElement' +import '@/util/ElementExtensions' import { fromCenterPointAndMasure, fromHTMLElement, toHTMLElement } from '@/util/ExtentExtension' import { getCenter, getHeight, getWidth, isEmpty } from 'ol/extent' +import { AnchorPoint } from '../SvgEnum' +import SvgDraw from './SvgDraw' +import SvgDrawSingleSignal from './SvgDrawSingleSignal' /** * Draws a signal bridge or a signal boom * @author Stuecker From aae5f125c7946586e9e6647fe6267be3a801d1e2 Mon Sep 17 00:00:00 2001 From: Jan-Erik Voigt Date: Thu, 15 Jan 2026 11:09:27 +0100 Subject: [PATCH 09/39] formatting --- .../siteplan/transform/SignalTransformator.xtend | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/java/bundles/org.eclipse.set.feature.siteplan/src/org/eclipse/set/feature/siteplan/transform/SignalTransformator.xtend b/java/bundles/org.eclipse.set.feature.siteplan/src/org/eclipse/set/feature/siteplan/transform/SignalTransformator.xtend index e946a55175..db0f0c00bd 100644 --- a/java/bundles/org.eclipse.set.feature.siteplan/src/org/eclipse/set/feature/siteplan/transform/SignalTransformator.xtend +++ b/java/bundles/org.eclipse.set.feature.siteplan/src/org/eclipse/set/feature/siteplan/transform/SignalTransformator.xtend @@ -69,7 +69,7 @@ class SignalTransformator extends BaseTransformator { val mountsWithParents = si.mounts.map [ mount | mount?.signalBefestigungen].flatten si.mounts = newHashSet(mountsWithParents); - + signalinfo.add(si) } @@ -81,7 +81,7 @@ class SignalTransformator extends BaseTransformator { signalinfo.forEach [ si | try { val baseMount = si.getBaseMount() - + val mergeWith = mergedSignalInfo.findFirst [ msi | msi.mounts.contains(baseMount) ] @@ -222,20 +222,20 @@ class SignalTransformator extends BaseTransformator { if (specificMounts.length > 1) { // there might be many different combinations, obviously. // I attempt to keep behaviour as before (even if not correct) and only change behaviour for SignalAusleger - // SignalAusleger -> ... anything => should be SignalAusleger // Fundament -> SignalAusleger => should be SignalAusleger // Fundament -> Mast - // new logic for any assembly containing a SignalAusleger. Same for all other cases - if (specificMounts.exists[it === SignalMountType.SIGNALAUSLEGER_LINKS]) { + if (specificMounts.exists [ + it === SignalMountType.SIGNALAUSLEGER_LINKS + ]) { return SignalMountType.SIGNALAUSLEGER_LINKS; } - if (specificMounts.exists[it === SignalMountType.SIGNALBRUECKE]) { + if (specificMounts. + exists[it === SignalMountType.SIGNALBRUECKE]) { return SignalMountType.SIGNALBRUECKE; } - - + var mount = specificMounts.head // If multiple signals are attached to a MAST, convert into MEHRERE_MASTEN if (mount === SignalMountType.MAST && info.signals.length > 1) { From bf16bc66331553331a6ddfe249a2fdc140ed3bc9 Mon Sep 17 00:00:00 2001 From: Jan-Erik Voigt Date: Thu, 15 Jan 2026 13:25:55 +0100 Subject: [PATCH 10/39] rename SvgDrawBridge.draw --- web/siteplan/src/components/SVG/SignalBruecke.vue | 4 ++-- web/siteplan/src/model/SvgElement.ts | 10 +++++----- web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts | 3 ++- web/siteplan/src/util/SVG/Draw/SvgDrawSignal.ts | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/web/siteplan/src/components/SVG/SignalBruecke.vue b/web/siteplan/src/components/SVG/SignalBruecke.vue index 703a841cea..9476f9d60c 100644 --- a/web/siteplan/src/components/SVG/SignalBruecke.vue +++ b/web/siteplan/src/components/SVG/SignalBruecke.vue @@ -33,7 +33,7 @@ import { HauptVorSignalGroup, SignalBrueckeudAusleger } from '@/util/SVG/SvgEnum' -import { Vue, Options } from 'vue-class-component' +import { Options, Vue } from 'vue-class-component' @Options({ props: { @@ -88,7 +88,7 @@ export default class SignalBruecke extends Vue { ) }) }) - const result = SvgDrawBridge.draw(bridgeScreen, this.selectedMast) + const result = SvgDrawBridge.drawParts('',bridgeScreen, this.selectedMast) return result.content.outerHTML } } diff --git a/web/siteplan/src/model/SvgElement.ts b/web/siteplan/src/model/SvgElement.ts index 23ae9a8e13..e1374f5587 100644 --- a/web/siteplan/src/model/SvgElement.ts +++ b/web/siteplan/src/model/SvgElement.ts @@ -6,9 +6,9 @@ * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v20.html */ -import { MountDirection } from './Signal' -import { Label } from './Label' import { Extent } from 'ol/extent' +import { Label } from './Label' +import { MountDirection } from './Signal' export interface ISvgPoint { id: string @@ -82,7 +82,7 @@ export const MAX_BRIDGE_DIRECTION_OFFSET = 15.0 export class SvgBridgeSignal extends SvgElement { mountOffset: number mountDirection: MountDirection - label?: Label + label: Label | null constructor ( id: string, @@ -91,7 +91,7 @@ export class SvgBridgeSignal extends SvgElement { nullpunkt: ISvgPoint | null, mountOffset: number, mountDirection: MountDirection, - signalLabel: Label | undefined, + signalLabel: Label | null, boundingBox: Extent[] ) { super(id, element, anchor, nullpunkt, boundingBox) @@ -104,7 +104,7 @@ export class SvgBridgeSignal extends SvgElement { element: ISvgElement, mountOffset: number, mountDirection: MountDirection, - signalLabel?: Label + signalLabel: Label | null ): SvgBridgeSignal { return new SvgBridgeSignal( element.id, diff --git a/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts b/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts index dc3a7779b4..32bb5c9cf1 100644 --- a/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts +++ b/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts @@ -34,11 +34,12 @@ export default class SvgDrawBridge { /** * Connect Signals to Signal -bruecke, -ausleger + * @param guid GUID of the signalpart * @param parts the Signal * @param art bruecke or ausleger * @returns svg */ - public static draw (guid: string, parts: SignalBridgePart[], signalMountType: SignalMountType): ISvgElement { + public static drawParts (guid: string, parts: SignalBridgePart[], signalMountType: SignalMountType): ISvgElement { // Calculate the final bridge/boom width by finding the screens // with the largest absolute offset from the mount const signalOffsets = parts.map(ele => ele.signal.mountOffset * SvgDraw.SVG_OFFSET_SCALE_METER_TO_PIXEL_FACTOR) diff --git a/web/siteplan/src/util/SVG/Draw/SvgDrawSignal.ts b/web/siteplan/src/util/SVG/Draw/SvgDrawSignal.ts index 04c06a8ae3..62cd274c3d 100644 --- a/web/siteplan/src/util/SVG/Draw/SvgDrawSignal.ts +++ b/web/siteplan/src/util/SVG/Draw/SvgDrawSignal.ts @@ -122,7 +122,7 @@ export default class SvgDrawSignal extends AbstractDrawSVG { } } }) - return SvgDrawBridge.draw(signalMount.guid, bridgeParts, signalMount.mountType) + return SvgDrawBridge.drawParts(signalMount.guid, bridgeParts, signalMount.mountType) } public isMultiSignal (signalMount: SignalMount): boolean { From c3fba1e6e6c96f72b15ab2612ea84118b509bb7a Mon Sep 17 00:00:00 2001 From: Jan-Erik Voigt Date: Thu, 15 Jan 2026 13:53:02 +0100 Subject: [PATCH 11/39] make drawSVG return null, if can't draw that. make SvgDrawBridge an DrawSVG --- web/siteplan/src/service/SvgService.ts | 2 + .../src/util/SVG/Draw/AbstractDrawSVG.ts | 4 +- .../src/util/SVG/Draw/SvgDrawBridge.ts | 66 +++++++++++++++++-- web/siteplan/src/util/SVG/Draw/SvgDrawCant.ts | 2 +- .../SVG/Draw/SvgDrawExternalElementControl.ts | 2 +- .../src/util/SVG/Draw/SvgDrawFMAComponent.ts | 10 +-- .../src/util/SVG/Draw/SvgDrawLockKey.ts | 2 +- .../src/util/SVG/Draw/SvgDrawOthers.ts | 2 +- web/siteplan/src/util/SVG/Draw/SvgDrawPZB.ts | 4 +- .../src/util/SVG/Draw/SvgDrawSignal.ts | 37 ++--------- .../src/util/SVG/Draw/SvgDrawTrackClose.ts | 2 +- .../src/util/SVG/Draw/SvgDrawTrackSwitch.ts | 2 +- .../src/util/SVG/Draw/SvgDrawTracklock.ts | 2 +- 13 files changed, 84 insertions(+), 53 deletions(-) diff --git a/web/siteplan/src/service/SvgService.ts b/web/siteplan/src/service/SvgService.ts index e18e00e035..732dbce6b5 100644 --- a/web/siteplan/src/service/SvgService.ts +++ b/web/siteplan/src/service/SvgService.ts @@ -14,6 +14,7 @@ import { store } from '@/store' import Configuration from '@/util/Configuration' import { getFirstValue } from '@/util/ObjectExtension' import SvgDraw from '@/util/SVG/Draw/SvgDraw' +import SvgDrawBridge from '@/util/SVG/Draw/SvgDrawBridge' import SvgDrawCant from '@/util/SVG/Draw/SvgDrawCant' import SvgDrawExternalElementControl from '@/util/SVG/Draw/SvgDrawExternalElementControl' import SvgDrawFMAComponent from '@/util/SVG/Draw/SvgDrawFMAComponent' @@ -55,6 +56,7 @@ export default class SvgService { } public registerDrawFeatureSvg () { + this.drawFeatureClass.push(new SvgDrawBridge(this.catalogService)) this.drawFeatureClass.push(new SvgDrawSignal(this.catalogService)) this.drawFeatureClass.push(new SvgDrawFMAComponent(this.catalogService)) this.drawFeatureClass.push(new SvgDrawPZB(this.catalogService)) diff --git a/web/siteplan/src/util/SVG/Draw/AbstractDrawSVG.ts b/web/siteplan/src/util/SVG/Draw/AbstractDrawSVG.ts index cbd5c5ab78..d1480480b0 100644 --- a/web/siteplan/src/util/SVG/Draw/AbstractDrawSVG.ts +++ b/web/siteplan/src/util/SVG/Draw/AbstractDrawSVG.ts @@ -26,11 +26,11 @@ export default abstract class AbstractDrawSVG { } /** - * Create a Svg for a feature + * Create a Svg for a feature. Return null, if this Drawer cannot draw that feature. * @param data feature data * @param label {@link Label} */ - public abstract drawSVG(data: T, label?: Label): ISvgElement + public abstract drawSVG(data: T, label?: Label): ISvgElement | null public getSvgFromCatalog (data: T): ISvgElement | null { return this.catalogService.getObjSvg(data, this.getFeatureType()) diff --git a/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts b/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts index 32bb5c9cf1..55fe5b803c 100644 --- a/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts +++ b/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts @@ -7,15 +7,19 @@ * http://www.eclipse.org/legal/epl-v20.html */ -import { MountDirection, SignalPart } from '@/model/Signal' -import { SignalMountType } from '@/model/SignalMount' -import { ISvgElement, SvgBridgeSignal, SvgElement, SvgPoint } from '@/model/SvgElement' +import { Label } from '@/model/Label' +import { MountDirection, SignalPart, SignalRole } from '@/model/Signal' +import { SignalMount, SignalMountType } from '@/model/SignalMount' +import { ISvgElement, MAX_BRIDGE_DIRECTION_OFFSET, SvgBridgeSignal, SvgElement, SvgPoint } from '@/model/SvgElement' import '@/util/ElementExtensions' import { fromCenterPointAndMasure, fromHTMLElement, toHTMLElement } from '@/util/ExtentExtension' +import { distance } from '@/util/Math' import { getCenter, getHeight, getWidth, isEmpty } from 'ol/extent' import { AnchorPoint } from '../SvgEnum' import SvgDraw from './SvgDraw' +import SvgDrawSignal from './SvgDrawSignal' import SvgDrawSingleSignal from './SvgDrawSingleSignal' + /** * Draws a signal bridge or a signal boom * @author Stuecker @@ -26,12 +30,66 @@ export interface SignalBridgePart { signal: SvgBridgeSignal } -export default class SvgDrawBridge { +export default class SvgDrawBridge extends SvgDrawSignal { // Extra width for signal bridges/signal booms after the final signal static SVG_BRIDGE_EXTRA_END_WIDTH = 10 // Extra width for signal bridges/signal booms before the mounting point static SVG_BRIDGE_EXTRA_START_WIDTH = 5 + /** + * Create a Svg for a feature + * @param data feature data + * @param label {@link Label} + */ + public drawSVG (data: T, label?: Label): ISvgElement | null { + const signalMount = data as SignalMount + const isValidate = this.validateSignal(signalMount) + if (!isValidate) { + return SvgDraw.getErrorSVG() + } + + if (this.isMultiSignal(signalMount)) { + return this.getMultiSignalScreen(signalMount) + } else { + return null + } + } + + private getMultiSignalScreen (signalMount: SignalMount) { + const bridgeParts: SignalBridgePart[] = [] + signalMount.attachedSignals.forEach(signal => { + if (signal.label?.text === '7707') { + console.log(' ') + } + + for (const catalog of this.catalogService.getSignalSVGCatalog()) { + const screen = signal.role === SignalRole.None + ? SvgDraw.getErrorSVG() + : catalog.getSignalScreen(signal) + if (screen !== null) { + /* if (screen?. === 'Ne14') { + console.log('...') + } */ + + const offset = distance( + [signalMount.position.x, signalMount.position.y], + [signal.mountPosition.x, signal.mountPosition.y] + ) + const direction = Math.abs( + signalMount.position.rotation - signal.mountPosition.rotation + ) < MAX_BRIDGE_DIRECTION_OFFSET + ? MountDirection.Up + : MountDirection.Down + bridgeParts.push({ + guid: signal.guid, + signal: SvgBridgeSignal.fromSvgElement(screen, offset, direction, signal.label ?? null) + }) + } + } + }) + return SvgDrawBridge.drawParts(signalMount.guid, bridgeParts, signalMount.mountType) + } + /** * Connect Signals to Signal -bruecke, -ausleger * @param guid GUID of the signalpart diff --git a/web/siteplan/src/util/SVG/Draw/SvgDrawCant.ts b/web/siteplan/src/util/SVG/Draw/SvgDrawCant.ts index 663daf2bf3..9935543baf 100644 --- a/web/siteplan/src/util/SVG/Draw/SvgDrawCant.ts +++ b/web/siteplan/src/util/SVG/Draw/SvgDrawCant.ts @@ -21,7 +21,7 @@ export default class SvgDrawCant extends AbstractDrawSVG{ } // eslint-disable-next-line @typescript-eslint/no-unused-vars - public drawSVG (data: T, _label?: Label | undefined): ISvgElement { + public drawSVG (data: T, _label?: Label | undefined): ISvgElement | null { const svgImage = this.getSvgFromCatalog(data) if (svgImage === null) { console.warn('Unsupported object') diff --git a/web/siteplan/src/util/SVG/Draw/SvgDrawExternalElementControl.ts b/web/siteplan/src/util/SVG/Draw/SvgDrawExternalElementControl.ts index a2f94078fa..2b5a52d413 100644 --- a/web/siteplan/src/util/SVG/Draw/SvgDrawExternalElementControl.ts +++ b/web/siteplan/src/util/SVG/Draw/SvgDrawExternalElementControl.ts @@ -20,7 +20,7 @@ export default class SvgDrawExternalElementControl extends AbstractDrawSVG { SVG_DRAWAREA = 500 LABEL_FONT_SIZE = 16 - public drawSVG (data: T, label?: Label | undefined): ISvgElement { + public drawSVG (data: T, label?: Label): ISvgElement | null { const eec = data as ExternalElementControl const svg = this.getSvgFromCatalog(eec) if (svg === null) { diff --git a/web/siteplan/src/util/SVG/Draw/SvgDrawFMAComponent.ts b/web/siteplan/src/util/SVG/Draw/SvgDrawFMAComponent.ts index 7d5f1e6df7..13a85271e6 100644 --- a/web/siteplan/src/util/SVG/Draw/SvgDrawFMAComponent.ts +++ b/web/siteplan/src/util/SVG/Draw/SvgDrawFMAComponent.ts @@ -7,13 +7,13 @@ * http://www.eclipse.org/legal/epl-v20.html */ -import '@/util/ElementExtensions' +import { FeatureType } from '@/feature/FeatureInfo' +import { FMAComponent } from '@/model/FMAComponent' import { Label } from '@/model/Label' import { ISvgElement, ISvgPoint, SvgElement } from '@/model/SvgElement' -import SvgDraw from './SvgDraw' +import '@/util/ElementExtensions' import AbstractDrawSVG from '@/util/SVG/Draw/AbstractDrawSVG' -import { FMAComponent } from '@/model/FMAComponent' -import { FeatureType } from '@/feature/FeatureInfo' +import SvgDraw from './SvgDraw' /** * Draw SVGs for FMA Components @@ -42,7 +42,7 @@ export default class SvgDrawFMAComponent extends AbstractDrawSVG { SVG_INVERTED_LABEL_OFFSET_Y = 18 // eslint-disable-next-line @typescript-eslint/no-unused-vars - public drawSVG (data: T, label?: Label | undefined): ISvgElement { + public drawSVG (data: T, label?: Label): ISvgElement | null { const fma = data as FMAComponent const svg = this.getSvgFromCatalog(data) if (svg === null) { diff --git a/web/siteplan/src/util/SVG/Draw/SvgDrawLockKey.ts b/web/siteplan/src/util/SVG/Draw/SvgDrawLockKey.ts index ca7f96513c..9df8f6ac24 100644 --- a/web/siteplan/src/util/SVG/Draw/SvgDrawLockKey.ts +++ b/web/siteplan/src/util/SVG/Draw/SvgDrawLockKey.ts @@ -19,7 +19,7 @@ export default class SvgDrawLockKey extends AbstractDrawSVG{ SVG_DRAWAREA = 500 LABEL_FONT_SIZE = 14 - public drawSVG (data: T, label?: Label | undefined): ISvgElement { + public drawSVG (data: T, label?: Label | undefined): ISvgElement | null { const lockkey = data as LockKey const svg = this.getSvgFromCatalog(data) if (svg === null) { diff --git a/web/siteplan/src/util/SVG/Draw/SvgDrawOthers.ts b/web/siteplan/src/util/SVG/Draw/SvgDrawOthers.ts index e709cec042..712f0adf78 100644 --- a/web/siteplan/src/util/SVG/Draw/SvgDrawOthers.ts +++ b/web/siteplan/src/util/SVG/Draw/SvgDrawOthers.ts @@ -21,7 +21,7 @@ export default class SvgDrawOthers extends AbstractDrawSVG{ return FeatureType.Unknown } - public drawSVG (data: T, label?: Label | undefined): ISvgElement { + public drawSVG (data: T, label?: Label | undefined): ISvgElement | null { const svgImage = this.getSvgFromCatalog(data) if (svgImage === null) { console.warn('Unsupported object') diff --git a/web/siteplan/src/util/SVG/Draw/SvgDrawPZB.ts b/web/siteplan/src/util/SVG/Draw/SvgDrawPZB.ts index 0361125915..53b9b9ae86 100644 --- a/web/siteplan/src/util/SVG/Draw/SvgDrawPZB.ts +++ b/web/siteplan/src/util/SVG/Draw/SvgDrawPZB.ts @@ -11,8 +11,8 @@ import { FeatureType } from '@/feature/FeatureInfo' import { Label } from '@/model/Label' import { PZB, PZBEffectivity } from '@/model/PZB' import { ISvgElement, SvgElement } from '@/model/SvgElement' -import AbstractDrawSVG from '@/util/SVG/Draw/AbstractDrawSVG' import '@/util/ElementExtensions' +import AbstractDrawSVG from '@/util/SVG/Draw/AbstractDrawSVG' import SvgDraw from './SvgDraw' /** @@ -36,7 +36,7 @@ export default class SvgDrawPZB extends AbstractDrawSVG { // Label font size LABEL_FONT_SIZE = 14 - public drawSVG (data: T, label?: Label | undefined): ISvgElement { + public drawSVG (data: T, label?: Label | undefined): ISvgElement | null { const pzb = data as PZB const svg = this.getSvgFromCatalog(data) if (svg === null) { diff --git a/web/siteplan/src/util/SVG/Draw/SvgDrawSignal.ts b/web/siteplan/src/util/SVG/Draw/SvgDrawSignal.ts index 62cd274c3d..87913526d6 100644 --- a/web/siteplan/src/util/SVG/Draw/SvgDrawSignal.ts +++ b/web/siteplan/src/util/SVG/Draw/SvgDrawSignal.ts @@ -9,12 +9,10 @@ import { FeatureType } from '@/feature/FeatureInfo' import { Label } from '@/model/Label' -import { MountDirection, SignalRole } from '@/model/Signal' +import { SignalRole } from '@/model/Signal' import { SignalMount, SignalMountType } from '@/model/SignalMount' -import { ISvgElement, MAX_BRIDGE_DIRECTION_OFFSET, SvgBridgeSignal, ZusatzSignal } from '@/model/SvgElement' -import { distance } from '@/util/Math' +import { ISvgElement, ZusatzSignal } from '@/model/SvgElement' import SvgDraw from '@/util/SVG/Draw/SvgDraw' -import SvgDrawBridge, { SignalBridgePart } from '@/util/SVG/Draw/SvgDrawBridge' import SvgDrawSingleSignal from '@/util/SVG/Draw/SvgDrawSingleSignal' import AbstractDrawSVG from './AbstractDrawSVG' @@ -25,7 +23,7 @@ import AbstractDrawSVG from './AbstractDrawSVG' */ export default class SvgDrawSignal extends AbstractDrawSVG { // eslint-disable-next-line @typescript-eslint/no-unused-vars - public drawSVG (data: T, label?: Label | undefined): ISvgElement { + public drawSVG (data: T, label?: Label | undefined): ISvgElement | null { const signalMount = data as SignalMount const isValidate = this.validateSignal(signalMount) if (!isValidate) { @@ -33,7 +31,7 @@ export default class SvgDrawSignal extends AbstractDrawSVG { } if (this.isMultiSignal(signalMount)) { - return this.getMultiSignalScreen(signalMount) + return null } const signal = signalMount.attachedSignals[0] @@ -98,33 +96,6 @@ export default class SvgDrawSignal extends AbstractDrawSVG { return true } - private getMultiSignalScreen (signalMount: SignalMount) { - const bridgeParts: SignalBridgePart[] = [] - signalMount.attachedSignals.forEach(signal => { - for (const catalog of this.catalogService.getSignalSVGCatalog()) { - const screen = signal.role === SignalRole.None - ? SvgDraw.getErrorSVG() - : catalog.getSignalScreen(signal) - if (screen !== null) { - const offset = distance( - [signalMount.position.x, signalMount.position.y], - [signal.mountPosition.x, signal.mountPosition.y] - ) - const direction = Math.abs( - signalMount.position.rotation - signal.mountPosition.rotation - ) < MAX_BRIDGE_DIRECTION_OFFSET - ? MountDirection.Up - : MountDirection.Down - bridgeParts.push({ - guid: signal.guid, - signal: SvgBridgeSignal.fromSvgElement(screen, offset, direction, signal.label ?? null) - }) - } - } - }) - return SvgDrawBridge.drawParts(signalMount.guid, bridgeParts, signalMount.mountType) - } - public isMultiSignal (signalMount: SignalMount): boolean { return signalMount.mountType === SignalMountType.SignalauslegerLinks || signalMount.mountType === SignalMountType.SignalauslegerMitte || diff --git a/web/siteplan/src/util/SVG/Draw/SvgDrawTrackClose.ts b/web/siteplan/src/util/SVG/Draw/SvgDrawTrackClose.ts index d67e62e8b1..e237a8fd7d 100644 --- a/web/siteplan/src/util/SVG/Draw/SvgDrawTrackClose.ts +++ b/web/siteplan/src/util/SVG/Draw/SvgDrawTrackClose.ts @@ -25,7 +25,7 @@ export default class SvgDrawTrackClose extends AbstractDrawSVG { SVG_LABEL_OFFSET_X = 20 LABEL_FONT_SIZE = 14 - public drawSVG (data: T, label?: Label | undefined): ISvgElement { + public drawSVG (data: T, label?: Label | undefined): ISvgElement | null { const trackclose = data as TrackClose const svg = this.getSvgFromCatalog(data) if (svg === null) { diff --git a/web/siteplan/src/util/SVG/Draw/SvgDrawTrackSwitch.ts b/web/siteplan/src/util/SVG/Draw/SvgDrawTrackSwitch.ts index bc2688e4c4..ec87d7bde8 100644 --- a/web/siteplan/src/util/SVG/Draw/SvgDrawTrackSwitch.ts +++ b/web/siteplan/src/util/SVG/Draw/SvgDrawTrackSwitch.ts @@ -45,7 +45,7 @@ export default class SvgDrawTrackSwitch extends AbstractDrawSVG { LABEL_FONT_SIZE = 25 // eslint-disable-next-line @typescript-eslint/no-unused-vars - public drawSVG (data: T, label?: Label | undefined): ISvgElement { + public drawSVG (data: T, label?: Label | undefined): ISvgElement | null { const drawData = data as {featureData: TrackSwitchFeatureData, drawPart: TrackSwitchPart,} switch (drawData.drawPart) { case TrackSwitchPart.Main: diff --git a/web/siteplan/src/util/SVG/Draw/SvgDrawTracklock.ts b/web/siteplan/src/util/SVG/Draw/SvgDrawTracklock.ts index 1d34240250..01713bb83d 100644 --- a/web/siteplan/src/util/SVG/Draw/SvgDrawTracklock.ts +++ b/web/siteplan/src/util/SVG/Draw/SvgDrawTracklock.ts @@ -37,7 +37,7 @@ export default class SvgDrawTracklock extends AbstractDrawSVG { SVG_LABEL_OFFSET_Y = -60 // eslint-disable-next-line @typescript-eslint/no-unused-vars - public drawSVG (data: T, label?: Label | undefined): ISvgElement { + public drawSVG (data: T, label?: Label | undefined): ISvgElement | null { const tracklock = data as TrackLock const svg = this.getSvgFromCatalog(data) if (svg === null) { From 71c0a586ce01f3cf1b62108c8e4dc65a4e797d14 Mon Sep 17 00:00:00 2001 From: Jan-Erik Voigt Date: Thu, 15 Jan 2026 13:53:18 +0100 Subject: [PATCH 12/39] getSignalScreen only returns screens which should actually be drawn --- .../util/SVG/SVGCatalog/SignalSVGCatalog.ts | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/web/siteplan/src/util/SVG/SVGCatalog/SignalSVGCatalog.ts b/web/siteplan/src/util/SVG/SVGCatalog/SignalSVGCatalog.ts index 4c50f9d5c2..63cc81a8e9 100644 --- a/web/siteplan/src/util/SVG/SVGCatalog/SignalSVGCatalog.ts +++ b/web/siteplan/src/util/SVG/SVGCatalog/SignalSVGCatalog.ts @@ -11,6 +11,9 @@ import { Signal } from '@/model/Signal' import { ISvgElement } from '@/model/SvgElement' import AbstractSVGCatalog from './AbstractSVGCatalog' +const notDrawnScreens: string[] = ['Zs1','Zs8'] +const onlyDrawnAlleinstehend: string[] = ['Ne14', 'Zs2', 'Zs3', 'Zs3v', 'Zs6'] + export default abstract class SignalSVGCatalog extends AbstractSVGCatalog { /** * Find Screen of the Signal @@ -18,7 +21,23 @@ export default abstract class SignalSVGCatalog extends AbstractSVGCatalog { * @returns first screen of this signal */ public getSignalScreen (signal: Signal): ISvgElement | null { - for (const screen of signal.screen) { + // console.log('screens:',signal.screen) + if (signal.guid === '167D036D-6B63-4694-BD66-3141EAD98743') { + console.log('7707') + } + + let drawnSignals = signal.screen.filter(s => !notDrawnScreens.includes(s.screen)) + + if (drawnSignals.length > 1) { + // don't draw alleinstehende screens + drawnSignals = drawnSignals.filter(s => !onlyDrawnAlleinstehend.includes(s.screen)) + } + + for (const screen of drawnSignals) { + if (screen?.screen === 'Ne14') { + console.log('...') + } + const result = this.getSVGFromCatalog(screen.screen) if (result !== null) { return result @@ -29,3 +48,4 @@ export default abstract class SignalSVGCatalog extends AbstractSVGCatalog { public abstract catalogName (): string } + From 3b1e15c40b857484a6a147290d0cbb62f76ab6e1 Mon Sep 17 00:00:00 2001 From: Jan-Erik Voigt Date: Thu, 15 Jan 2026 14:04:32 +0100 Subject: [PATCH 13/39] edit DrawBridge --- .../src/util/SVG/Draw/AbstractDrawSVG.ts | 4 +++- .../src/util/SVG/Draw/SvgDrawBridge.ts | 13 ++++--------- .../src/util/SVG/Draw/SvgDrawSignal.ts | 18 +++++++----------- 3 files changed, 14 insertions(+), 21 deletions(-) diff --git a/web/siteplan/src/util/SVG/Draw/AbstractDrawSVG.ts b/web/siteplan/src/util/SVG/Draw/AbstractDrawSVG.ts index d1480480b0..c62d6dce10 100644 --- a/web/siteplan/src/util/SVG/Draw/AbstractDrawSVG.ts +++ b/web/siteplan/src/util/SVG/Draw/AbstractDrawSVG.ts @@ -26,7 +26,9 @@ export default abstract class AbstractDrawSVG { } /** - * Create a Svg for a feature. Return null, if this Drawer cannot draw that feature. + * Create a Svg for a feature. Return null, if + * this Drawer cannot draw that feature or if it is faulty. + * If all DrawSVGs return null, an error is displayed. * @param data feature data * @param label {@link Label} */ diff --git a/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts b/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts index 55fe5b803c..3ffedd9f84 100644 --- a/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts +++ b/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts @@ -43,16 +43,11 @@ export default class SvgDrawBridge extends SvgDrawSignal { */ public drawSVG (data: T, label?: Label): ISvgElement | null { const signalMount = data as SignalMount - const isValidate = this.validateSignal(signalMount) - if (!isValidate) { - return SvgDraw.getErrorSVG() - } + if (!this.validateSignal(signalMount)) return null - if (this.isMultiSignal(signalMount)) { - return this.getMultiSignalScreen(signalMount) - } else { - return null - } + if (!this.isMultiSignal(signalMount)) return null + + return this.getMultiSignalScreen(signalMount) } private getMultiSignalScreen (signalMount: SignalMount) { diff --git a/web/siteplan/src/util/SVG/Draw/SvgDrawSignal.ts b/web/siteplan/src/util/SVG/Draw/SvgDrawSignal.ts index 87913526d6..7fe081f83b 100644 --- a/web/siteplan/src/util/SVG/Draw/SvgDrawSignal.ts +++ b/web/siteplan/src/util/SVG/Draw/SvgDrawSignal.ts @@ -25,21 +25,17 @@ export default class SvgDrawSignal extends AbstractDrawSVG { // eslint-disable-next-line @typescript-eslint/no-unused-vars public drawSVG (data: T, label?: Label | undefined): ISvgElement | null { const signalMount = data as SignalMount - const isValidate = this.validateSignal(signalMount) - if (!isValidate) { - return SvgDraw.getErrorSVG() - } - if (this.isMultiSignal(signalMount)) { - return null - } + // return null => draw error, if all other drawers also return null. + if (!this.validateSignal(signalMount)) return null + + if (this.isMultiSignal(signalMount)) return null const signal = signalMount.attachedSignals[0] - const mount = this.catalogService.getSignalMountSVGCatalog() + const mount : ISvgElement | null = this.catalogService.getSignalMountSVGCatalog() .getSignalMountSVG(this.getMountType(signalMount)) - if (mount === null) { - return SvgDraw.getErrorSVG() - } + + if (mount === null) return null const extra = this.getDirectionScreens(signalMount).map(screen => { const directionBoard = this.catalogService.getDirectionBoardSVGCatalog() From 8d5e6938381e113d5a7fe0da22e2c5f4de3a12b7 Mon Sep 17 00:00:00 2001 From: Jan-Erik Voigt Date: Thu, 15 Jan 2026 14:43:27 +0100 Subject: [PATCH 14/39] cleanup --- .../src/util/SVG/Draw/SvgDrawBridge.ts | 66 ++++++++++--------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts b/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts index 3ffedd9f84..ccf106fe20 100644 --- a/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts +++ b/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts @@ -8,7 +8,8 @@ */ import { Label } from '@/model/Label' -import { MountDirection, SignalPart, SignalRole } from '@/model/Signal' +import { Position } from '@/model/Position' +import { MountDirection, Signal, SignalPart, SignalRole } from '@/model/Signal' import { SignalMount, SignalMountType } from '@/model/SignalMount' import { ISvgElement, MAX_BRIDGE_DIRECTION_OFFSET, SvgBridgeSignal, SvgElement, SvgPoint } from '@/model/SvgElement' import '@/util/ElementExtensions' @@ -22,7 +23,7 @@ import SvgDrawSingleSignal from './SvgDrawSingleSignal' /** * Draws a signal bridge or a signal boom - * @author Stuecker + * @author Stuecker, Voigt */ export interface SignalBridgePart { @@ -50,38 +51,43 @@ export default class SvgDrawBridge extends SvgDrawSignal { return this.getMultiSignalScreen(signalMount) } - private getMultiSignalScreen (signalMount: SignalMount) { - const bridgeParts: SignalBridgePart[] = [] - signalMount.attachedSignals.forEach(signal => { - if (signal.label?.text === '7707') { - console.log(' ') + private drawAttachedSignal (signal: Signal, signalMountPosition: Position): SignalBridgePart | null { + const offset = distance( + [signalMountPosition.x, signalMountPosition.y], + [signal.mountPosition.x, signal.mountPosition.y] + ) + + const direction = Math.abs( + signalMountPosition.rotation - signal.mountPosition.rotation + ) < MAX_BRIDGE_DIRECTION_OFFSET + ? MountDirection.Up + : MountDirection.Down + + if (signal.role === SignalRole.None) { + return { + guid: signal.guid, + signal: SvgBridgeSignal.fromSvgElement(SvgDraw.getErrorSVG(), offset, direction, signal.label ?? null) } + } - for (const catalog of this.catalogService.getSignalSVGCatalog()) { - const screen = signal.role === SignalRole.None - ? SvgDraw.getErrorSVG() - : catalog.getSignalScreen(signal) - if (screen !== null) { - /* if (screen?. === 'Ne14') { - console.log('...') - } */ - - const offset = distance( - [signalMount.position.x, signalMount.position.y], - [signal.mountPosition.x, signal.mountPosition.y] - ) - const direction = Math.abs( - signalMount.position.rotation - signal.mountPosition.rotation - ) < MAX_BRIDGE_DIRECTION_OFFSET - ? MountDirection.Up - : MountDirection.Down - bridgeParts.push({ - guid: signal.guid, - signal: SvgBridgeSignal.fromSvgElement(screen, offset, direction, signal.label ?? null) - }) + for (const catalog of this.catalogService.getSignalSVGCatalog()) { + const screen = catalog.getSignalScreen(signal) + if (screen !== null) { + return { + guid: signal.guid, + signal: SvgBridgeSignal.fromSvgElement(screen, offset, direction, signal.label ?? null) } } - }) + } + return null + } + + private getMultiSignalScreen (signalMount: SignalMount): ISvgElement | null { + const bridgeParts: SignalBridgePart[] = + signalMount.attachedSignals + .map(signal => this.drawAttachedSignal(signal, signalMount.position)) + .filter(e => e !== null) + return SvgDrawBridge.drawParts(signalMount.guid, bridgeParts, signalMount.mountType) } From eaffc6ed857c9d9df8a6bdb79c284d47695979dc Mon Sep 17 00:00:00 2001 From: Jan-Erik Voigt Date: Thu, 15 Jan 2026 14:49:10 +0100 Subject: [PATCH 15/39] inline draw attached signals --- web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts b/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts index ccf106fe20..b9aa6e39d1 100644 --- a/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts +++ b/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts @@ -48,7 +48,12 @@ export default class SvgDrawBridge extends SvgDrawSignal { if (!this.isMultiSignal(signalMount)) return null - return this.getMultiSignalScreen(signalMount) + const bridgeParts: SignalBridgePart[] = + signalMount.attachedSignals + .map(signal => this.drawAttachedSignal(signal, signalMount.position)) + .filter(e => e !== null) + + return SvgDrawBridge.drawParts(signalMount.guid, bridgeParts, signalMount.mountType) } private drawAttachedSignal (signal: Signal, signalMountPosition: Position): SignalBridgePart | null { From 3e673f22d1387271eb274ef21673527d54c548b6 Mon Sep 17 00:00:00 2001 From: Jan-Erik Voigt Date: Thu, 15 Jan 2026 14:49:24 +0100 Subject: [PATCH 16/39] continue previous --- web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts | 9 --------- 1 file changed, 9 deletions(-) diff --git a/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts b/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts index b9aa6e39d1..2e6d364c19 100644 --- a/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts +++ b/web/siteplan/src/util/SVG/Draw/SvgDrawBridge.ts @@ -87,15 +87,6 @@ export default class SvgDrawBridge extends SvgDrawSignal { return null } - private getMultiSignalScreen (signalMount: SignalMount): ISvgElement | null { - const bridgeParts: SignalBridgePart[] = - signalMount.attachedSignals - .map(signal => this.drawAttachedSignal(signal, signalMount.position)) - .filter(e => e !== null) - - return SvgDrawBridge.drawParts(signalMount.guid, bridgeParts, signalMount.mountType) - } - /** * Connect Signals to Signal -bruecke, -ausleger * @param guid GUID of the signalpart From 4cfcfe2b271f527111f911b16502ba32090274e2 Mon Sep 17 00:00:00 2001 From: Jan-Erik Voigt Date: Thu, 15 Jan 2026 14:55:34 +0100 Subject: [PATCH 17/39] remove console logs --- .../src/util/SVG/SVGCatalog/SignalSVGCatalog.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/web/siteplan/src/util/SVG/SVGCatalog/SignalSVGCatalog.ts b/web/siteplan/src/util/SVG/SVGCatalog/SignalSVGCatalog.ts index 63cc81a8e9..e9dd47274e 100644 --- a/web/siteplan/src/util/SVG/SVGCatalog/SignalSVGCatalog.ts +++ b/web/siteplan/src/util/SVG/SVGCatalog/SignalSVGCatalog.ts @@ -21,11 +21,6 @@ export default abstract class SignalSVGCatalog extends AbstractSVGCatalog { * @returns first screen of this signal */ public getSignalScreen (signal: Signal): ISvgElement | null { - // console.log('screens:',signal.screen) - if (signal.guid === '167D036D-6B63-4694-BD66-3141EAD98743') { - console.log('7707') - } - let drawnSignals = signal.screen.filter(s => !notDrawnScreens.includes(s.screen)) if (drawnSignals.length > 1) { @@ -34,10 +29,6 @@ export default abstract class SignalSVGCatalog extends AbstractSVGCatalog { } for (const screen of drawnSignals) { - if (screen?.screen === 'Ne14') { - console.log('...') - } - const result = this.getSVGFromCatalog(screen.screen) if (result !== null) { return result @@ -48,4 +39,3 @@ export default abstract class SignalSVGCatalog extends AbstractSVGCatalog { public abstract catalogName (): string } - From b313a6371934ac332b0ad139badcd3df074a9104 Mon Sep 17 00:00:00 2001 From: Jan-Erik Voigt Date: Thu, 15 Jan 2026 15:08:09 +0100 Subject: [PATCH 18/39] fix signal bruecke in catalog --- web/siteplan/src/components/SVG/SignalBruecke.vue | 2 +- web/siteplan/src/components/SVG/Svg.vue | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/web/siteplan/src/components/SVG/SignalBruecke.vue b/web/siteplan/src/components/SVG/SignalBruecke.vue index 9476f9d60c..7b6ae574d8 100644 --- a/web/siteplan/src/components/SVG/SignalBruecke.vue +++ b/web/siteplan/src/components/SVG/SignalBruecke.vue @@ -20,7 +20,7 @@ - {{ draw() }} +