Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,7 @@ public static TrackSwitchMetadata fromCSVLine(final String line) {
}

switch (entry.type) {
case ENUMW_KR_ART_DKW:
case ENUMW_KR_ART_EKW:
case ENUMW_KR_ART_DKW, ENUMW_KR_ART_EKW:
// Crossing lengths are required
entry.rightCrossing = new CrossingSide(
Double.parseDouble(
Expand Down Expand Up @@ -101,6 +100,14 @@ public static TrackSwitchMetadata fromCSVLine(final String line) {
Double.parseDouble(columns[COLUMN_LENGTH_MAIN]),
Double.parseDouble(columns[COLUMN_LENGTH_SIDE]));
break;
case ENUMW_KR_ART_KR:
entry.leftCrossing = new CrossingSide(
columns[COLUMN_CROSSING_LEFT_MAIN],
columns[COLUMN_CROSSING_LEFT_SIDE]);
entry.rightCrossing = new CrossingSide(
columns[COLUMN_CROSSING_RIGHT_MAIN],
columns[COLUMN_CROSSING_RIGHT_SIDE]);
break;
default:
// Other types are not handled
return null;
Expand Down Expand Up @@ -144,6 +151,10 @@ private CrossingSide(final double mainLeg, final double sideLeg) {
crossing = new LegLength(mainLeg, sideLeg);
}

private CrossingSide(final String mainLeg, final String sideLeg) {
this(Double.parseDouble(mainLeg), Double.parseDouble(sideLeg));
}

/**
* Lengths of the crossing triangle May be null if not definied
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,15 @@ import org.eclipse.set.model.planpro.BasisTypen.ENUMWirkrichtung
import org.eclipse.set.model.planpro.Geodaten.ENUMTOPAnschluss
import org.eclipse.set.model.planpro.Geodaten.TOP_Kante
import org.eclipse.set.model.planpro.Geodaten.TOP_Knoten
import org.eclipse.set.model.planpro.Weichen_und_Gleissperren.ENUMWKrArt
import org.eclipse.set.model.planpro.Weichen_und_Gleissperren.W_Kr_Gsp_Komponente
import org.eclipse.set.model.siteplan.Coordinate
import org.eclipse.set.model.siteplan.Position

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

import static extension org.eclipse.set.ppmodel.extensions.PunktObjektExtensions.*
import static extension org.eclipse.set.ppmodel.extensions.PunktObjektTopKanteExtensions.*
import static extension org.eclipse.set.ppmodel.extensions.TopKanteExtensions.*
import static extension org.eclipse.set.ppmodel.extensions.TopKnotenExtensions.*
import static extension org.eclipse.set.ppmodel.extensions.WKrAnlageExtensions.*
Expand Down Expand Up @@ -152,8 +154,9 @@ class TrackSwitchLeg {
if (components.length == 1) {
val component = components.head
leg.topKnoten = component.topKnoten
if (leg.topKnoten === null ||
leg.topKnoten.getTrackSwitchLegs.length - 1 < legIndex) {
if ((leg.topKnoten === null ||
leg.topKnoten.getTrackSwitchLegs.length - 1 < legIndex) &&
!isCrossType(component)) {
return null;
}
leg.determineLegLength(component, metadata, legIndex)
Expand All @@ -174,8 +177,11 @@ class TrackSwitchLeg {
val trackSwitch = component.WKrGspElement.WKrAnlage
val switchType = trackSwitch.WKrAnlageAllg.WKrArt.wert
switch (switchType) {
case ENUMW_KR_ART_DKW,
case ENUMW_KR_ART_KR: {
case ENUMW_KR_ART_KR,
case ENUMW_KR_ART_FLACHKREUZUNG: {
determineCrossSwitchLegLength(component, metadata, legIndex)
}
case ENUMW_KR_ART_DKW: {
topKante = component.crossingLeg
if (metadata !== null) {
length = BigDecimal.valueOf(
Expand Down Expand Up @@ -210,9 +216,7 @@ class TrackSwitchLeg {
topKnoten = anotherGspComponent.topKnoten
length = anotherGspComponent.getEKWLegLength(metadata)
topKante = anotherGspComponent.crossingLeg

}

}
default: {
topKante = topKnoten.getTrackSwitchLegs.get(legIndex)
Expand All @@ -234,6 +238,35 @@ class TrackSwitchLeg {
}
}

private static def boolean isCrossType(W_Kr_Gsp_Komponente component) {
val anlage = component?.WKrGspElement?.WKrAnlage
val type = anlage?.WKrAnlageAllg?.WKrArt?.wert
return type === ENUMWKrArt.ENUMW_KR_ART_KR ||
type === ENUMWKrArt.ENUMW_KR_ART_FLACHKREUZUNG
}

private def determineCrossSwitchLegLength(W_Kr_Gsp_Komponente component,
TrackSwitchMetadata metadata, int index) {
val singlePoint = component.singlePoints.get(index)
if (singlePoint.wirkrichtung.wert === ENUMWirkrichtung.ENUM_WIRKRICHTUNG_GEGEN) {
topKnoten = singlePoint.topKante.TOPKnotenB
start = singlePoint.topKante.laenge - singlePoint.abstand.wert
} else {
start = singlePoint?.abstand?.wert
topKnoten = singlePoint?.topKante.TOPKnotenA
}

topKante = singlePoint?.IDTOPKante?.value
if (metadata !== null) {
val crossingSide = singlePoint.wirkrichtung.wert ==
ENUMWirkrichtung.ENUM_WIRKRICHTUNG_GEGEN ? metadata.
rightCrossing : metadata.leftCrossing
if (crossingSide !== null) {
length = BigDecimal.valueOf(crossingSide.crossing.mainLeg)
}
}
}

// The leg of a EKW switch is only to cross point between to switch
private def BigDecimal getEKWLegLength(W_Kr_Gsp_Komponente component,
TrackSwitchMetadata metadata) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ import static extension org.eclipse.set.ppmodel.extensions.WKrAnlageExtensions.*
import static extension org.eclipse.set.ppmodel.extensions.WKrGspElementExtensions.*
import org.eclipse.set.basis.constants.ToolboxConstants
import java.math.RoundingMode
import org.eclipse.set.model.siteplan.SwitchType
import org.eclipse.set.model.planpro.BasisTypen.ENUMWirkrichtung

/**
* Transforms a track switch from the PlanPro model to a siteplan TrackSwitch
Expand Down Expand Up @@ -75,13 +77,14 @@ class TrackSwitchTransformator extends BaseTransformator<W_Kr_Anlage> {
val result = SiteplanFactory.eINSTANCE.createTrackSwitch
result.guid = trackswitch.identitaet.wert
result.design = '''«trackswitch.WKrAnlageAllg.WKrArt.wert» «trackswitch.WKrAnlageAllg.WKrGrundform.wert»'''
val switchType = trackswitch.WKrAnlageAllg.WKrArt.wert
val metadata = trackSwitchMetadataProvider.getTrackSwitchMetadata(
trackswitch.WKrAnlageAllg.WKrArt.wert,
switchType,
trackswitch.WKrAnlageAllg.WKrGrundform.wert
)

result.switchType = switchType.transform
val elements = trackswitch.WKrGspElemente

// Find the legs of the first element
val firstElement = elements.head
val components = firstElement.WKrGspKomponenten
Expand All @@ -104,7 +107,9 @@ class TrackSwitchTransformator extends BaseTransformator<W_Kr_Anlage> {
val secondComponents = secondElement.WKrGspKomponenten
var legC = getLeg(secondComponents, metadata, 0)
var legD = getLeg(secondComponents, metadata, 1)
if (legC.TOPKante === legA.TOPKante) {
if (legC.TOPKante === legA.TOPKante &&
switchType !== ENUMWKrArt.ENUMW_KR_ART_KR &&
switchType !== ENUMWKrArt.ENUMW_KR_ART_FLACHKREUZUNG) {
val temp = legC
legC = legD
legD = temp
Expand All @@ -118,16 +123,14 @@ class TrackSwitchTransformator extends BaseTransformator<W_Kr_Anlage> {
result.components.add(
transformElement(trackswitch, secondElement, legC, legD))

// Add continuous segments:
if (trackswitch.WKrAnlageAllg.WKrArt.wert ==
ENUMWKrArt.ENUMW_KR_ART_DKW) {
// Add continuous segments
if (switchType == ENUMWKrArt.ENUMW_KR_ART_DKW) {
// DKW:
// - start of legA <-> start of legC
// - start of legB <-> start of legD
result.continuousSegments.add(getContinousSegment(legA, legC))
result.continuousSegments.add(getContinousSegment(legB, legD))
} else if (trackswitch.WKrAnlageAllg.WKrArt.wert ==
ENUMWKrArt.ENUMW_KR_ART_EKW) {
} else if (switchType == ENUMWKrArt.ENUMW_KR_ART_EKW) {
// EKW: (legA and legB / legC and legD start at the same point)
// - start of legA <-> start of legC
result.continuousSegments.add(getContinousSegment(legA, legC))
Expand All @@ -139,11 +142,11 @@ class TrackSwitchTransformator extends BaseTransformator<W_Kr_Anlage> {
// Position the error somewhere on the first leg.
recordError(trackswitch.identitaet?.wert,
String.format(ERROR_NO_TRACK_SWITCH_METADATA,
trackswitch.WKrAnlageAllg?.WKrArt?.wert?.toString() ?:
"Keine W_Kr_Art",
switchType?.toString() ?: "Keine W_Kr_Art",
trackswitch.WKrAnlageAllg?.WKrGrundform?.wert ?:
"Keine W_Kr_Grundform"),
legA.getCoordinate(BigDecimal.ZERO, BigDecimal.TWO, geometryService, positionService))
legA.getCoordinate(BigDecimal.ZERO, BigDecimal.TWO,
geometryService, positionService))
}

result.addSiteplanElement(
Expand Down Expand Up @@ -178,7 +181,6 @@ class TrackSwitchTransformator extends BaseTransformator<W_Kr_Anlage> {
sideLeg.length.divide(BigDecimal.TWO,
ToolboxConstants.ROUNDING_TO_PLACE, RoundingMode.HALF_UP),
BigDecimal.ZERO, geometryService, positionService)

val pointDetector = components.get(0)?.zungenpaar?.
zungenpruefkontaktAnzahl?.wert
if (pointDetector !== null)
Expand All @@ -187,8 +189,9 @@ class TrackSwitchTransformator extends BaseTransformator<W_Kr_Anlage> {
result.operatingMode = transform(
element.WKrGspElementAllg?.WKrGspStellart?.wert)
result.preferredLocation = element.weicheElement?.weicheVorzugslage?.
wert === ENUMLinksRechts.ENUM_LINKS_RECHTS_LINKS ? LeftRight.
LEFT : LeftRight.RIGHT
wert === ENUMLinksRechts.ENUM_LINKS_RECHTS_LINKS
? LeftRight.LEFT
: LeftRight.RIGHT

return result
}
Expand Down Expand Up @@ -308,4 +311,19 @@ class TrackSwitchTransformator extends BaseTransformator<W_Kr_Anlage> {
return TurnoutOperatingMode.UNDEFINED
}
}

private def SwitchType transform(ENUMWKrArt type) {
return switch (type) {
case ENUMW_KR_ART_ABW,
case ENUMW_KR_ART_EW,
case ENUMW_KR_ART_IBW,
case ENUMW_KR_ART_KLOTHOIDENWEICHE,
case ENUMW_KR_ART_DW: SwitchType.SIMPLE
case ENUMW_KR_ART_DKW: SwitchType.DOPPLE_CROSS_SWITCH
case ENUMW_KR_ART_EKW: SwitchType.CROSS_SWITCH
case ENUMW_KR_ART_KR: SwitchType.SIMPLE_CROSS
case ENUMW_KR_ART_FLACHKREUZUNG: SwitchType.FLAT_CROSS
default: SwitchType.OTHER
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ Bundle-Version: 2.5.0.qualifier
Bundle-ClassPath: .
Bundle-Vendor: %providerName
Bundle-Localization: plugin
Bundle-RequiredExecutionEnvironment: JavaSE-21
Bundle-RequiredExecutionEnvironment: JavaSE-17
Export-Package: org.eclipse.set.model.siteplan,
org.eclipse.set.model.siteplan.impl,
org.eclipse.set.model.siteplan.util
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@
eType="#//TrackSwitchComponent" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="continuousSegments" upperBound="2"
eType="#//ContinuousTrackSegment" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="switchType" eType="#//SwitchType"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="TrackSwitchComponent" eSuperTypes="#//RouteObject">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="preferredLocation" eType="#//LeftRight"/>
Expand Down Expand Up @@ -422,4 +423,12 @@
<eClassifiers xsi:type="ecore:EClass" name="UnknownPositionedObject" eSuperTypes="#//PositionedObject">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="objectType" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EEnum" name="SwitchType">
<eLiterals name="Simple" literal="Simple"/>
<eLiterals name="CrossSwitch" value="1" literal="CrossSwitch"/>
<eLiterals name="DoppleCrossSwitch" value="2" literal="DoppleCrossSwitch"/>
<eLiterals name="SimpleCross" value="3" literal="SimpleCross"/>
<eLiterals name="FlatCross" value="4" literal="FlatCross"/>
<eLiterals name="Other" value="5" literal="Other"/>
</eClassifiers>
</ecore:EPackage>
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,14 @@
<genEnumLiterals ecoreEnumLiteral="siteplan.ecore#//LockKeyType/inside"/>
<genEnumLiterals ecoreEnumLiteral="siteplan.ecore#//LockKeyType/outside"/>
</genEnums>
<genEnums typeSafeEnumCompatible="false" ecoreEnum="siteplan.ecore#//SwitchType">
<genEnumLiterals ecoreEnumLiteral="siteplan.ecore#//SwitchType/Simple"/>
<genEnumLiterals ecoreEnumLiteral="siteplan.ecore#//SwitchType/CrossSwitch"/>
<genEnumLiterals ecoreEnumLiteral="siteplan.ecore#//SwitchType/DoppleCrossSwitch"/>
<genEnumLiterals ecoreEnumLiteral="siteplan.ecore#//SwitchType/SimpleCross"/>
<genEnumLiterals ecoreEnumLiteral="siteplan.ecore#//SwitchType/FlatCross"/>
<genEnumLiterals ecoreEnumLiteral="siteplan.ecore#//SwitchType/Other"/>
</genEnums>
<genClasses ecoreClass="siteplan.ecore#//Siteplan">
<genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference siteplan.ecore#//Siteplan/initialState"/>
<genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference siteplan.ecore#//Siteplan/changedInitialState"/>
Expand Down Expand Up @@ -226,6 +234,7 @@
<genFeatures createChild="false" ecoreFeature="ecore:EAttribute siteplan.ecore#//TrackSwitch/design"/>
<genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference siteplan.ecore#//TrackSwitch/components"/>
<genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference siteplan.ecore#//TrackSwitch/continuousSegments"/>
<genFeatures createChild="false" ecoreFeature="ecore:EAttribute siteplan.ecore#//TrackSwitch/switchType"/>
</genClasses>
<genClasses ecoreClass="siteplan.ecore#//TrackSwitchComponent">
<genFeatures createChild="false" ecoreFeature="ecore:EAttribute siteplan.ecore#//TrackSwitchComponent/preferredLocation"/>
Expand Down
Loading
Loading