diff --git a/java/bundles/org.eclipse.set.feature.table.pt1/src/org/eclipse/set/feature/table/pt1/ssks/SsksTransformator.xtend b/java/bundles/org.eclipse.set.feature.table.pt1/src/org/eclipse/set/feature/table/pt1/ssks/SsksTransformator.xtend index 53be092a2..ac40679e0 100644 --- a/java/bundles/org.eclipse.set.feature.table.pt1/src/org/eclipse/set/feature/table/pt1/ssks/SsksTransformator.xtend +++ b/java/bundles/org.eclipse.set.feature.table.pt1/src/org/eclipse/set/feature/table/pt1/ssks/SsksTransformator.xtend @@ -99,6 +99,7 @@ import static org.eclipse.set.model.planpro.Signale.ENUMSignalArt.* import static org.eclipse.set.model.planpro.Signale.ENUMSignalFunktion.* import static org.eclipse.set.model.planpro.Signale.ENUMTunnelsignal.* +import static extension org.eclipse.set.ppmodel.extensions.AussenelementansteuerungExtensions.* import static extension org.eclipse.set.ppmodel.extensions.BasisAttributExtensions.* import static extension org.eclipse.set.ppmodel.extensions.GeoPunktExtensions.* import static extension org.eclipse.set.ppmodel.extensions.PunktObjektExtensions.* @@ -138,7 +139,7 @@ class SsksTransformator extends AbstractSignalTableTransform { super(cols, enumTranslationService, bankingService, eventAdmin, tableShortCut) } - + override protected fillSpecifyColumns(TableRow row, MultiContainer_AttributeGroup container, Signal signal, boolean isHauptbefestigung, List signalRahmen) { @@ -299,32 +300,35 @@ class SsksTransformator extends AbstractSignalTableTransform { streuscheibeBetriebsstellung?.translate ?: "" ] ) + try { + // X: Ssks.Anschluss.Schaltkasten.Bezeichnung + val energieAea = signal.getControlElement([stellelement?.energie], + #[ENUM_AUSSENELEMENTANSTEUERUNG_ART_OBJEKTCONTROLLER]) + fill( + row, + cols.getColumn(Schaltkasten_Bezeichnung), + signal, + [ + energieAea?.bezeichnung?.bezeichnungAEA?.wert + ] + ) - // X: Ssks.Anschluss.Schaltkasten.Bezeichnung - fillConditional( - row, - cols.getColumn(Schaltkasten_Bezeichnung), - signal, - [ - stellelement?.energie?.AEAAllg?. - aussenelementansteuerungArt?.wert == - ENUM_AUSSENELEMENTANSTEUERUNG_ART_OBJEKTCONTROLLER - ], - [ - stellelement?.energie?.bezeichnung?.bezeichnungAEA?.wert - ] - ) - - // Y: Ssks.Anschluss.Schaltkasten.Entfernung - fillConditional( - row, - cols.getColumn(Schaltkasten_Entfernung), - signal, - [controlBox !== null], - [ - distance(controlBox).toTableIntegerAgateUp - ] - ) + // Y: Ssks.Anschluss.Schaltkasten.Entfernung + fillConditional( + row, + cols.getColumn(Schaltkasten_Entfernung), + signal, + [energieAea?.unterbringung !== null], + [ + distance(energieAea?.unterbringung).toTableIntegerAgateUp + ] + ) + } catch (Exception e) { + handleFillingException(e, row, + cols.getColumn(Schaltkasten_Bezeichnung)) + handleFillingException(e, row, + cols.getColumn(Schaltkasten_Entfernung)) + } // Z: Ssks.Anschluss.Schaltkasten_separat.Bezeichnung fillConditional( @@ -333,7 +337,10 @@ class SsksTransformator extends AbstractSignalTableTransform { signal, [hasSchaltkastenSeparatBezeichnung], [ - stellelement?.information?.bezeichnung?.bezeichnungAEA?.wert + val informationAea = getControlElement([ s | + s?.stellelement?.information + ], #[ENUM_AUSSENELEMENTANSTEUERUNG_ART_OBJEKTCONTROLLER]) + informationAea?.bezeichnung?.bezeichnungAEA?.wert ] ) @@ -621,7 +628,6 @@ class SsksTransformator extends AbstractSignalTableTransform { ) } - private static def boolean isSsksSignal(Signal signal) { if (signal?.signalFiktiv !== null && !signal?.signalFiktiv?.fiktivesSignalFunktion.exists [ @@ -1166,8 +1172,7 @@ class SsksTransformator extends AbstractSignalTableTransform { } return BigDecimal.valueOf(c1.distance(c2)) } - - + override protected getRelevantSignal( MultiContainer_AttributeGroup contanier) { return contanier.signal.filter[isSsksSignal] 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 42b2059b6..16d75c94e 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 @@ -27,6 +27,7 @@ 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; @@ -53,6 +54,7 @@ import org.eclipse.set.model.tablemodel.ColumnDescriptor; import org.eclipse.set.model.tablemodel.Table; import org.eclipse.set.model.tablemodel.TableRow; +import org.eclipse.set.ppmodel.extensions.AussenelementansteuerungExtensions; import org.eclipse.set.ppmodel.extensions.PZBElementExtensions; import org.eclipse.set.ppmodel.extensions.PunktObjektTopKanteExtensions; import org.eclipse.set.ppmodel.extensions.container.MultiContainer_AttributeGroup; @@ -355,7 +357,7 @@ private String getFieldElementDesignation(final Ur_Objekt object) { @SuppressWarnings("nls") private String getPzbDesignation(final PZB_Element pzb) { final PZB_Art_TypeClass pzbArt = getNullableObject(pzb, - ele -> ele.getPZBArt()).orElse(null); + PZB_Element::getPZBArt).orElse(null); if (pzbArt == null) { return ""; } @@ -418,10 +420,12 @@ private List getRelevantFieldElements( final List elements = Streams.stream(getElementFunc.apply(container)) .map(clazz::cast) .toList(); - + final Predicate findRecursiveCondition = aea -> AussenelementansteuerungExtensions + .findRecursiveAEAInformation(aea, + ele -> ele == control) != null; return elements.parallelStream() - .filter(ele -> getControlFromFieldELement(ele) - .contains(control)) + .filter(ele -> getControlFromFieldELement(ele).stream() + .anyMatch(findRecursiveCondition::test)) .toList(); } diff --git a/java/bundles/org.eclipse.set.ppmodel.extensions/src/org/eclipse/set/ppmodel/extensions/AussenelementansteuerungExtensions.xtend b/java/bundles/org.eclipse.set.ppmodel.extensions/src/org/eclipse/set/ppmodel/extensions/AussenelementansteuerungExtensions.xtend index 68df574a5..badc76229 100644 --- a/java/bundles/org.eclipse.set.ppmodel.extensions/src/org/eclipse/set/ppmodel/extensions/AussenelementansteuerungExtensions.xtend +++ b/java/bundles/org.eclipse.set.ppmodel.extensions/src/org/eclipse/set/ppmodel/extensions/AussenelementansteuerungExtensions.xtend @@ -18,6 +18,8 @@ import org.eclipse.set.model.planpro.Ansteuerung_Element.Stellelement import org.eclipse.set.model.planpro.Ansteuerung_Element.Stell_Bereich import static extension org.eclipse.set.ppmodel.extensions.StellBereichExtensions.* +import java.util.function.Predicate +import java.util.LinkedList /** * Extensions for {@link Aussenelementansteuerung}. @@ -136,4 +138,41 @@ class AussenelementansteuerungExtensions extends BasisObjektExtensions { aussenElement.isBelongToControlArea(area) ].toList } + + /** + * Find recursive Aussenelemntansteuerung throught + * Aussenelementansteuerung#IDInformationPrimaer und + * Aussenelementansteuerung#IDInformationSekundaer + * @param aea the Aussenelemntansteuerung + * @param condition the condition + * @param the Aussenelemntansteuerung or null, if it given't matched + */ + def static Aussenelementansteuerung findRecursiveAEAInformation( + Aussenelementansteuerung aea, + Predicate condition) { + if (condition.test(aea)) { + return aea + } + + val LinkedList recursiveList = newLinkedList + val addToListFunc = [ Aussenelementansteuerung ele | + if (!recursiveList.exists[it === ele]) { + recursiveList.add(ele) + } + ] + #[aea.informationPrimaer.filter(Aussenelementansteuerung), + aea.informationSekundaer].flatten.forEach[addToListFunc.apply(it)] + while (!recursiveList.nullOrEmpty) { + val head = recursiveList.pop + if (condition.test(head)) { + return head + } + #[head.informationPrimaer.filter(Aussenelementansteuerung), + head.informationSekundaer].flatten.forEach [ + addToListFunc.apply(it) + ] + } + return null + + } } diff --git a/java/bundles/org.eclipse.set.ppmodel.extensions/src/org/eclipse/set/ppmodel/extensions/SignalExtensions.xtend b/java/bundles/org.eclipse.set.ppmodel.extensions/src/org/eclipse/set/ppmodel/extensions/SignalExtensions.xtend index 0fa8b6d78..6435b47db 100644 --- a/java/bundles/org.eclipse.set.ppmodel.extensions/src/org/eclipse/set/ppmodel/extensions/SignalExtensions.xtend +++ b/java/bundles/org.eclipse.set.ppmodel.extensions/src/org/eclipse/set/ppmodel/extensions/SignalExtensions.xtend @@ -13,13 +13,15 @@ import java.util.Collections import java.util.LinkedList import java.util.List import java.util.Set +import java.util.function.Predicate import org.eclipse.core.runtime.Assert import org.eclipse.set.basis.graph.Digraphs import org.eclipse.set.basis.graph.TopPoint import org.eclipse.set.core.services.graph.TopologicalGraphService +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.Stell_Bereich import org.eclipse.set.model.planpro.Ansteuerung_Element.Stellelement -import org.eclipse.set.model.planpro.Ansteuerung_Element.Unterbringung import org.eclipse.set.model.planpro.Basisobjekte.Punkt_Objekt import org.eclipse.set.model.planpro.Basisobjekte.Punkt_Objekt_TOP_Kante_AttributeGroup import org.eclipse.set.model.planpro.Fahrstrasse.Fstr_Zug_Rangier @@ -42,7 +44,6 @@ import org.eclipse.set.ppmodel.extensions.utils.TopRouting import org.slf4j.Logger import org.slf4j.LoggerFactory -import static org.eclipse.set.model.planpro.Ansteuerung_Element.ENUMAussenelementansteuerungArt.* import static org.eclipse.set.model.planpro.BasisTypen.ENUMWirkrichtung.* import static org.eclipse.set.model.planpro.Signale.ENUMFiktivesSignalFunktion.* import static org.eclipse.set.model.planpro.Signale.ENUMSignalFunktion.* @@ -56,7 +57,6 @@ import static extension org.eclipse.set.ppmodel.extensions.FstrZugRangierExtensi import static extension org.eclipse.set.ppmodel.extensions.PunktObjektTopKanteExtensions.* import static extension org.eclipse.set.ppmodel.extensions.SignalRahmenExtensions.* import static extension org.eclipse.set.ppmodel.extensions.SignalbegriffExtensions.* -import static extension org.eclipse.set.ppmodel.extensions.StellelementExtensions.* import static extension org.eclipse.set.ppmodel.extensions.utils.CollectionExtensions.* import static extension org.eclipse.set.ppmodel.extensions.utils.Debug.* import static extension org.eclipse.set.ppmodel.extensions.utils.IterableExtensions.* @@ -294,17 +294,19 @@ class SignalExtensions extends PunktObjektExtensions { /** * @param signal this signal - * - * @return the Schaltkasten for this Signal; or {@code null}, if this - * signal has no Schaltkasten + * @param getFirstControlFunc the function to get Aussenelemntansteuerung from signal + * @return the relevant Aussenelementansteuerung or null, if no element matched the condition */ - def static Unterbringung getControlBox(Signal signal) { - val energie = signal.realAktivStellelement?.energie - if (energie?.AEAAllg?.aussenelementansteuerungArt?.wert === - ENUM_AUSSENELEMENTANSTEUERUNG_ART_OBJEKTCONTROLLER) { - return energie.unterbringung - } - return null + def static Aussenelementansteuerung getControlElement(Signal signal, + (Signal)=>Aussenelementansteuerung getFirstControlFunc, List requiredType) { + val aea = getFirstControlFunc.apply(signal) + val Predicate isRelevantAea = [ ele | + requiredType.exists [ + it == aea?.AEAAllg?.aussenelementansteuerungArt?.wert + ] + ] + + return isRelevantAea.test(aea) ? aea : null } /** @@ -477,8 +479,9 @@ class SignalExtensions extends PunktObjektExtensions { } return false } - - def static boolean isSskxSignalBelongToArea(Signal signal, Stell_Bereich area) { + + def static boolean isSskxSignalBelongToArea(Signal signal, + Stell_Bereich area) { return area.contains(signal, tolerantDistance) }