Skip to content

Commit 96f4388

Browse files
committed
Visulation siteplan cross
1 parent e424092 commit 96f4388

File tree

17 files changed

+714
-51
lines changed

17 files changed

+714
-51
lines changed

java/bundles/org.eclipse.set.application.test/META-INF/MANIFEST.MF

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,9 @@ Bundle-Version: 2.5.0.qualifier
66
Fragment-Host: org.eclipse.set.application
77
Bundle-RequiredExecutionEnvironment: JavaSE-21
88
Bundle-Vendor: Eclipse Signalling Engineering Toolbox
9-
Import-Package: org.junit,
10-
org.junit.jupiter.api
9+
Import-Package: org.apache.commons.lang3.reflect;version="[3.13.0,4.0.0)",
10+
org.eclipse.set.unittest.utils,
11+
org.junit,
12+
org.junit.jupiter.api,
13+
org.junit.jupiter.params,
14+
org.junit.jupiter.params.provider

java/bundles/org.eclipse.set.basis/src/org/eclipse/set/basis/geometry/Geometries.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,10 @@ public BigDecimal segmentLength() {
4242
}
4343

4444
public boolean contains(final BigDecimal distance) {
45-
return startDistance.compareTo(distance) <= 0
46-
&& endDistance().compareTo(distance) >= 0;
45+
return startDistance.subtract(BigDecimal.valueOf(ACCURACY))
46+
.compareTo(distance) <= 0
47+
&& endDistance().add(BigDecimal.valueOf(ACCURACY))
48+
.compareTo(distance) >= 0;
4749
}
4850
}
4951

@@ -234,7 +236,9 @@ private static SegmentPosition getSegmentPosition(
234236
int right = segments.size();
235237
while (left <= right) {
236238
final int mid = left + (right - left) / 2;
237-
final SegmentWithDistance midSegment = segments.get(mid);
239+
final SegmentWithDistance midSegment = mid == segments.size()
240+
? segments.getLast()
241+
: segments.get(mid);
238242

239243
if (midSegment.contains(distance)) {
240244
return new SegmentPosition(midSegment.segment,

java/bundles/org.eclipse.set.feature.siteplan/src/org/eclipse/set/feature/siteplan/TrackSwitchMetadata.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,7 @@ public static TrackSwitchMetadata fromCSVLine(final String line) {
5858
}
5959

6060
switch (entry.type) {
61-
case ENUMW_KR_ART_DKW:
62-
case ENUMW_KR_ART_EKW:
61+
case ENUMW_KR_ART_DKW, ENUMW_KR_ART_EKW:
6362
// Crossing lengths are required
6463
entry.rightCrossing = new CrossingSide(
6564
Double.parseDouble(
@@ -101,6 +100,14 @@ public static TrackSwitchMetadata fromCSVLine(final String line) {
101100
Double.parseDouble(columns[COLUMN_LENGTH_MAIN]),
102101
Double.parseDouble(columns[COLUMN_LENGTH_SIDE]));
103102
break;
103+
case ENUMW_KR_ART_KR:
104+
entry.leftCrossing = new CrossingSide(
105+
columns[COLUMN_CROSSING_LEFT_MAIN],
106+
columns[COLUMN_CROSSING_LEFT_SIDE]);
107+
entry.rightCrossing = new CrossingSide(
108+
columns[COLUMN_CROSSING_RIGHT_MAIN],
109+
columns[COLUMN_CROSSING_RIGHT_SIDE]);
110+
break;
104111
default:
105112
// Other types are not handled
106113
return null;
@@ -144,6 +151,10 @@ private CrossingSide(final double mainLeg, final double sideLeg) {
144151
crossing = new LegLength(mainLeg, sideLeg);
145152
}
146153

154+
private CrossingSide(final String mainLeg, final String sideLeg) {
155+
this(Double.parseDouble(mainLeg), Double.parseDouble(sideLeg));
156+
}
157+
147158
/**
148159
* Lengths of the crossing triangle May be null if not definied
149160
*/

java/bundles/org.eclipse.set.feature.siteplan/src/org/eclipse/set/feature/siteplan/transform/TrackSwitchLeg.xtend

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,15 @@ import org.eclipse.set.model.planpro.BasisTypen.ENUMWirkrichtung
2020
import org.eclipse.set.model.planpro.Geodaten.ENUMTOPAnschluss
2121
import org.eclipse.set.model.planpro.Geodaten.TOP_Kante
2222
import org.eclipse.set.model.planpro.Geodaten.TOP_Knoten
23+
import org.eclipse.set.model.planpro.Weichen_und_Gleissperren.ENUMWKrArt
2324
import org.eclipse.set.model.planpro.Weichen_und_Gleissperren.W_Kr_Gsp_Komponente
2425
import org.eclipse.set.model.siteplan.Coordinate
2526
import org.eclipse.set.model.siteplan.Position
2627

2728
import static org.eclipse.set.model.planpro.Geodaten.ENUMTOPAnschluss.*
2829

2930
import static extension org.eclipse.set.ppmodel.extensions.PunktObjektExtensions.*
31+
import static extension org.eclipse.set.ppmodel.extensions.PunktObjektTopKanteExtensions.*
3032
import static extension org.eclipse.set.ppmodel.extensions.TopKanteExtensions.*
3133
import static extension org.eclipse.set.ppmodel.extensions.TopKnotenExtensions.*
3234
import static extension org.eclipse.set.ppmodel.extensions.WKrAnlageExtensions.*
@@ -152,8 +154,9 @@ class TrackSwitchLeg {
152154
if (components.length == 1) {
153155
val component = components.head
154156
leg.topKnoten = component.topKnoten
155-
if (leg.topKnoten === null ||
156-
leg.topKnoten.getTrackSwitchLegs.length - 1 < legIndex) {
157+
if ((leg.topKnoten === null ||
158+
leg.topKnoten.getTrackSwitchLegs.length - 1 < legIndex) &&
159+
!isCrossType(component)) {
157160
return null;
158161
}
159162
leg.determineLegLength(component, metadata, legIndex)
@@ -174,8 +177,11 @@ class TrackSwitchLeg {
174177
val trackSwitch = component.WKrGspElement.WKrAnlage
175178
val switchType = trackSwitch.WKrAnlageAllg.WKrArt.wert
176179
switch (switchType) {
177-
case ENUMW_KR_ART_DKW,
178-
case ENUMW_KR_ART_KR: {
180+
case ENUMW_KR_ART_KR,
181+
case ENUMW_KR_ART_FLACHKREUZUNG: {
182+
determineCrossSwitchLegLength(component, metadata, legIndex)
183+
}
184+
case ENUMW_KR_ART_DKW: {
179185
topKante = component.crossingLeg
180186
if (metadata !== null) {
181187
length = BigDecimal.valueOf(
@@ -210,9 +216,7 @@ class TrackSwitchLeg {
210216
topKnoten = anotherGspComponent.topKnoten
211217
length = anotherGspComponent.getEKWLegLength(metadata)
212218
topKante = anotherGspComponent.crossingLeg
213-
214219
}
215-
216220
}
217221
default: {
218222
topKante = topKnoten.getTrackSwitchLegs.get(legIndex)
@@ -234,6 +238,35 @@ class TrackSwitchLeg {
234238
}
235239
}
236240

241+
private static def boolean isCrossType(W_Kr_Gsp_Komponente component) {
242+
val anlage = component?.WKrGspElement?.WKrAnlage
243+
val type = anlage?.WKrAnlageAllg?.WKrArt?.wert
244+
return type === ENUMWKrArt.ENUMW_KR_ART_KR ||
245+
type === ENUMWKrArt.ENUMW_KR_ART_FLACHKREUZUNG
246+
}
247+
248+
private def determineCrossSwitchLegLength(W_Kr_Gsp_Komponente component,
249+
TrackSwitchMetadata metadata, int index) {
250+
val singlePoint = component.singlePoints.get(index)
251+
if (singlePoint.wirkrichtung.wert === ENUMWirkrichtung.ENUM_WIRKRICHTUNG_GEGEN) {
252+
topKnoten = singlePoint.topKante.TOPKnotenB
253+
start = singlePoint.topKante.laenge - singlePoint.abstand.wert
254+
} else {
255+
start = singlePoint?.abstand?.wert
256+
topKnoten = singlePoint?.topKante.TOPKnotenA
257+
}
258+
259+
topKante = singlePoint?.IDTOPKante?.value
260+
if (metadata !== null) {
261+
val crossingSide = singlePoint.wirkrichtung.wert ==
262+
ENUMWirkrichtung.ENUM_WIRKRICHTUNG_GEGEN ? metadata.
263+
rightCrossing : metadata.leftCrossing
264+
if (crossingSide !== null) {
265+
length = BigDecimal.valueOf(crossingSide.crossing.mainLeg)
266+
}
267+
}
268+
}
269+
237270
// The leg of a EKW switch is only to cross point between to switch
238271
private def BigDecimal getEKWLegLength(W_Kr_Gsp_Komponente component,
239272
TrackSwitchMetadata metadata) {

java/bundles/org.eclipse.set.feature.siteplan/src/org/eclipse/set/feature/siteplan/transform/TrackSwitchTransformator.xtend

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ import static extension org.eclipse.set.ppmodel.extensions.WKrAnlageExtensions.*
4444
import static extension org.eclipse.set.ppmodel.extensions.WKrGspElementExtensions.*
4545
import org.eclipse.set.basis.constants.ToolboxConstants
4646
import java.math.RoundingMode
47+
import org.eclipse.set.model.siteplan.SwitchType
48+
import org.eclipse.set.model.planpro.BasisTypen.ENUMWirkrichtung
4749

4850
/**
4951
* Transforms a track switch from the PlanPro model to a siteplan TrackSwitch
@@ -75,13 +77,14 @@ class TrackSwitchTransformator extends BaseTransformator<W_Kr_Anlage> {
7577
val result = SiteplanFactory.eINSTANCE.createTrackSwitch
7678
result.guid = trackswitch.identitaet.wert
7779
result.design = '''«trackswitch.WKrAnlageAllg.WKrArt.wert» «trackswitch.WKrAnlageAllg.WKrGrundform.wert»'''
80+
val switchType = trackswitch.WKrAnlageAllg.WKrArt.wert
7881
val metadata = trackSwitchMetadataProvider.getTrackSwitchMetadata(
79-
trackswitch.WKrAnlageAllg.WKrArt.wert,
82+
switchType,
8083
trackswitch.WKrAnlageAllg.WKrGrundform.wert
8184
)
8285

86+
result.switchType = switchType.transform
8387
val elements = trackswitch.WKrGspElemente
84-
8588
// Find the legs of the first element
8689
val firstElement = elements.head
8790
val components = firstElement.WKrGspKomponenten
@@ -104,7 +107,9 @@ class TrackSwitchTransformator extends BaseTransformator<W_Kr_Anlage> {
104107
val secondComponents = secondElement.WKrGspKomponenten
105108
var legC = getLeg(secondComponents, metadata, 0)
106109
var legD = getLeg(secondComponents, metadata, 1)
107-
if (legC.TOPKante === legA.TOPKante) {
110+
if (legC.TOPKante === legA.TOPKante &&
111+
switchType !== ENUMWKrArt.ENUMW_KR_ART_KR &&
112+
switchType !== ENUMWKrArt.ENUMW_KR_ART_FLACHKREUZUNG) {
108113
val temp = legC
109114
legC = legD
110115
legD = temp
@@ -118,16 +123,14 @@ class TrackSwitchTransformator extends BaseTransformator<W_Kr_Anlage> {
118123
result.components.add(
119124
transformElement(trackswitch, secondElement, legC, legD))
120125

121-
// Add continuous segments:
122-
if (trackswitch.WKrAnlageAllg.WKrArt.wert ==
123-
ENUMWKrArt.ENUMW_KR_ART_DKW) {
126+
// Add continuous segments
127+
if (switchType == ENUMWKrArt.ENUMW_KR_ART_DKW) {
124128
// DKW:
125129
// - start of legA <-> start of legC
126130
// - start of legB <-> start of legD
127131
result.continuousSegments.add(getContinousSegment(legA, legC))
128132
result.continuousSegments.add(getContinousSegment(legB, legD))
129-
} else if (trackswitch.WKrAnlageAllg.WKrArt.wert ==
130-
ENUMWKrArt.ENUMW_KR_ART_EKW) {
133+
} else if (switchType == ENUMWKrArt.ENUMW_KR_ART_EKW) {
131134
// EKW: (legA and legB / legC and legD start at the same point)
132135
// - start of legA <-> start of legC
133136
result.continuousSegments.add(getContinousSegment(legA, legC))
@@ -139,11 +142,11 @@ class TrackSwitchTransformator extends BaseTransformator<W_Kr_Anlage> {
139142
// Position the error somewhere on the first leg.
140143
recordError(trackswitch.identitaet?.wert,
141144
String.format(ERROR_NO_TRACK_SWITCH_METADATA,
142-
trackswitch.WKrAnlageAllg?.WKrArt?.wert?.toString() ?:
143-
"Keine W_Kr_Art",
145+
switchType?.toString() ?: "Keine W_Kr_Art",
144146
trackswitch.WKrAnlageAllg?.WKrGrundform?.wert ?:
145147
"Keine W_Kr_Grundform"),
146-
legA.getCoordinate(BigDecimal.ZERO, BigDecimal.TWO, geometryService, positionService))
148+
legA.getCoordinate(BigDecimal.ZERO, BigDecimal.TWO,
149+
geometryService, positionService))
147150
}
148151

149152
result.addSiteplanElement(
@@ -178,7 +181,6 @@ class TrackSwitchTransformator extends BaseTransformator<W_Kr_Anlage> {
178181
sideLeg.length.divide(BigDecimal.TWO,
179182
ToolboxConstants.ROUNDING_TO_PLACE, RoundingMode.HALF_UP),
180183
BigDecimal.ZERO, geometryService, positionService)
181-
182184
val pointDetector = components.get(0)?.zungenpaar?.
183185
zungenpruefkontaktAnzahl?.wert
184186
if (pointDetector !== null)
@@ -187,8 +189,9 @@ class TrackSwitchTransformator extends BaseTransformator<W_Kr_Anlage> {
187189
result.operatingMode = transform(
188190
element.WKrGspElementAllg?.WKrGspStellart?.wert)
189191
result.preferredLocation = element.weicheElement?.weicheVorzugslage?.
190-
wert === ENUMLinksRechts.ENUM_LINKS_RECHTS_LINKS ? LeftRight.
191-
LEFT : LeftRight.RIGHT
192+
wert === ENUMLinksRechts.ENUM_LINKS_RECHTS_LINKS
193+
? LeftRight.LEFT
194+
: LeftRight.RIGHT
192195

193196
return result
194197
}
@@ -308,4 +311,19 @@ class TrackSwitchTransformator extends BaseTransformator<W_Kr_Anlage> {
308311
return TurnoutOperatingMode.UNDEFINED
309312
}
310313
}
314+
315+
private def SwitchType transform(ENUMWKrArt type) {
316+
return switch (type) {
317+
case ENUMW_KR_ART_ABW,
318+
case ENUMW_KR_ART_EW,
319+
case ENUMW_KR_ART_IBW,
320+
case ENUMW_KR_ART_KLOTHOIDENWEICHE,
321+
case ENUMW_KR_ART_DW: SwitchType.SIMPLE
322+
case ENUMW_KR_ART_DKW: SwitchType.DOPPLE_CROSS_SWITCH
323+
case ENUMW_KR_ART_EKW: SwitchType.CROSS_SWITCH
324+
case ENUMW_KR_ART_KR: SwitchType.SIMPLE_CROSS
325+
case ENUMW_KR_ART_FLACHKREUZUNG: SwitchType.FLAT_CROSS
326+
default: SwitchType.OTHER
327+
}
328+
}
311329
}

java/bundles/org.eclipse.set.model.siteplan/META-INF/MANIFEST.MF

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ Bundle-Version: 2.5.0.qualifier
77
Bundle-ClassPath: .
88
Bundle-Vendor: %providerName
99
Bundle-Localization: plugin
10-
Bundle-RequiredExecutionEnvironment: JavaSE-21
10+
Bundle-RequiredExecutionEnvironment: JavaSE-17
1111
Export-Package: org.eclipse.set.model.siteplan,
1212
org.eclipse.set.model.siteplan.impl,
1313
org.eclipse.set.model.siteplan.util

java/bundles/org.eclipse.set.model.siteplan/model/siteplan.ecore

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@
147147
eType="#//TrackSwitchComponent" containment="true"/>
148148
<eStructuralFeatures xsi:type="ecore:EReference" name="continuousSegments" upperBound="2"
149149
eType="#//ContinuousTrackSegment" containment="true"/>
150+
<eStructuralFeatures xsi:type="ecore:EAttribute" name="switchType" eType="#//SwitchType"/>
150151
</eClassifiers>
151152
<eClassifiers xsi:type="ecore:EClass" name="TrackSwitchComponent" eSuperTypes="#//RouteObject">
152153
<eStructuralFeatures xsi:type="ecore:EAttribute" name="preferredLocation" eType="#//LeftRight"/>
@@ -422,4 +423,12 @@
422423
<eClassifiers xsi:type="ecore:EClass" name="UnknownPositionedObject" eSuperTypes="#//PositionedObject">
423424
<eStructuralFeatures xsi:type="ecore:EAttribute" name="objectType" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
424425
</eClassifiers>
426+
<eClassifiers xsi:type="ecore:EEnum" name="SwitchType">
427+
<eLiterals name="Simple" literal="Simple"/>
428+
<eLiterals name="CrossSwitch" value="1" literal="CrossSwitch"/>
429+
<eLiterals name="DoppleCrossSwitch" value="2" literal="DoppleCrossSwitch"/>
430+
<eLiterals name="SimpleCross" value="3" literal="SimpleCross"/>
431+
<eLiterals name="FlatCross" value="4" literal="FlatCross"/>
432+
<eLiterals name="Other" value="5" literal="Other"/>
433+
</eClassifiers>
425434
</ecore:EPackage>

java/bundles/org.eclipse.set.model.siteplan/model/siteplan.genmodel

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,14 @@
152152
<genEnumLiterals ecoreEnumLiteral="siteplan.ecore#//LockKeyType/inside"/>
153153
<genEnumLiterals ecoreEnumLiteral="siteplan.ecore#//LockKeyType/outside"/>
154154
</genEnums>
155+
<genEnums typeSafeEnumCompatible="false" ecoreEnum="siteplan.ecore#//SwitchType">
156+
<genEnumLiterals ecoreEnumLiteral="siteplan.ecore#//SwitchType/Simple"/>
157+
<genEnumLiterals ecoreEnumLiteral="siteplan.ecore#//SwitchType/CrossSwitch"/>
158+
<genEnumLiterals ecoreEnumLiteral="siteplan.ecore#//SwitchType/DoppleCrossSwitch"/>
159+
<genEnumLiterals ecoreEnumLiteral="siteplan.ecore#//SwitchType/SimpleCross"/>
160+
<genEnumLiterals ecoreEnumLiteral="siteplan.ecore#//SwitchType/FlatCross"/>
161+
<genEnumLiterals ecoreEnumLiteral="siteplan.ecore#//SwitchType/Other"/>
162+
</genEnums>
155163
<genClasses ecoreClass="siteplan.ecore#//Siteplan">
156164
<genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference siteplan.ecore#//Siteplan/initialState"/>
157165
<genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference siteplan.ecore#//Siteplan/changedInitialState"/>
@@ -226,6 +234,7 @@
226234
<genFeatures createChild="false" ecoreFeature="ecore:EAttribute siteplan.ecore#//TrackSwitch/design"/>
227235
<genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference siteplan.ecore#//TrackSwitch/components"/>
228236
<genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference siteplan.ecore#//TrackSwitch/continuousSegments"/>
237+
<genFeatures createChild="false" ecoreFeature="ecore:EAttribute siteplan.ecore#//TrackSwitch/switchType"/>
229238
</genClasses>
230239
<genClasses ecoreClass="siteplan.ecore#//TrackSwitchComponent">
231240
<genFeatures createChild="false" ecoreFeature="ecore:EAttribute siteplan.ecore#//TrackSwitchComponent/preferredLocation"/>

0 commit comments

Comments
 (0)