diff --git a/java/bundles/org.eclipse.set.application/META-INF/MANIFEST.MF b/java/bundles/org.eclipse.set.application/META-INF/MANIFEST.MF index a851f49ac4..46a87ad8dd 100644 --- a/java/bundles/org.eclipse.set.application/META-INF/MANIFEST.MF +++ b/java/bundles/org.eclipse.set.application/META-INF/MANIFEST.MF @@ -122,6 +122,7 @@ Import-Package: ch.qos.logback.classic;version="1.0.7", org.eclipse.set.core.services.name, org.eclipse.set.core.services.part, org.eclipse.set.core.services.pdf, + org.eclipse.set.core.services.planningaccess, org.eclipse.set.core.services.rename, org.eclipse.set.core.services.session, org.eclipse.set.core.services.siteplan, diff --git a/java/bundles/org.eclipse.set.application/src/org/eclipse/set/application/subwork/SubworkSelectionControl.java b/java/bundles/org.eclipse.set.application/src/org/eclipse/set/application/subwork/SubworkSelectionControl.java new file mode 100644 index 0000000000..aa382db921 --- /dev/null +++ b/java/bundles/org.eclipse.set.application/src/org/eclipse/set/application/subwork/SubworkSelectionControl.java @@ -0,0 +1,216 @@ +/** + * Copyright (c) 2016 DB Netz AG and others. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v20.html + */ +package org.eclipse.set.application.subwork; + +import static org.eclipse.set.ppmodel.extensions.EObjectExtensions.getNullableObject; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.eclipse.e4.core.contexts.IEclipseContext; +import org.eclipse.e4.core.contexts.RunAndTrack; +import org.eclipse.e4.core.services.events.IEventBroker; +import org.eclipse.e4.core.services.nls.Translation; +import org.eclipse.e4.ui.model.application.MApplication; +import org.eclipse.emf.common.util.BasicEList; +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.ComboViewer; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.set.application.Messages; +import org.eclipse.set.application.toolcontrol.ServiceProvider; +import org.eclipse.set.basis.IModelSession; +import org.eclipse.set.basis.constants.Events; +import org.eclipse.set.core.services.part.ToolboxPartService; +import org.eclipse.set.core.services.planningaccess.PlanningAccessService; +import org.eclipse.set.model.planpro.PlanPro.ENUMUntergewerkArt; +import org.eclipse.swt.widgets.Composite; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Selects the subwork type for title box generation. + * + * @author Brombacher + */ +public class SubworkSelectionControl { + + static final Logger LOGGER = LoggerFactory + .getLogger(SubworkSelectionControl.class); + + private final MApplication application; + + @Translation + private final Messages messages; + + private IModelSession oldSession; + + ToolboxPartService partService; + + private ComboViewer comboViewer; + + PlanningAccessService planningAccessService; + + private final IEventBroker broker; + + /** + * @param parent + * the parent + * @param serviceProvider + * the {@link ServiceProvider} + */ + public SubworkSelectionControl(final Composite parent, + final ServiceProvider serviceProvider) { + application = serviceProvider.application; + broker = serviceProvider.broker; + messages = serviceProvider.messages; + partService = serviceProvider.partService; + planningAccessService = serviceProvider.planningAccessService; + createTableCombo(parent); + } + + private void createTableCombo(final Composite parent) { + comboViewer = new ComboViewer(parent); + comboViewer.setContentProvider(ArrayContentProvider.getInstance()); + initCombo(); + comboViewer.addSelectionChangedListener(event -> { + if (event + .getSelection() instanceof final IStructuredSelection selection) { + final Object first = selection.getFirstElement(); + if (first instanceof final String selectedString) { + final ENUMUntergewerkArt selectedEnum = ENUMUntergewerkArt + .get(selectedString); + planningAccessService + .setCurrentUntergewerkArt(selectedEnum); + broker.send(Events.SUBWORK_CHANGED, null); + } + } + }); + + setCombo(getSession()); + + // register for session changes + application.getContext().runAndTrack(new RunAndTrack() { + @Override + public boolean changed(final IEclipseContext context) { + setCombo(context.get(IModelSession.class)); + return true; + } + }); + + } + + private IModelSession getSession() { + return application.getContext().get(IModelSession.class); + } + + // correct size for combo + private void initCombo() { + clearCombo(); + comboViewer.add(messages.TableTypeSelectionControl_noSession); + comboViewer.getCombo().select(0); + comboViewer.getCombo().setEnabled(false); + } + + private static List getSubworkTypes(final IModelSession session) { + + final var projectListOpt = getNullableObject(session, + s -> s.getPlanProSchnittstelle() + .getLSTPlanung() + .getObjektmanagement() + .getLSTPlanungProjekt()); + + if (projectListOpt.isEmpty()) { + return List.of(); + } + + final var projects = projectListOpt.get(); + final Set subworkTypes = new HashSet<>(); + + for (final var project : projects) { + + final var projectGroupsOpt = getNullableObject(project, + p -> p.getLSTPlanungGruppe()).orElse(new BasicEList<>()); + + for (final var group : projectGroupsOpt) { + + final var subworkTypeOpt = getNullableObject(group, + g -> g.getPlanungGAllg().getUntergewerkArt().getWert()) + .orElse(null); + + if (subworkTypeOpt != null) { + subworkTypes.add(subworkTypeOpt.getLiteral()); + } + } + } + + return new ArrayList<>(subworkTypes); + } + + private void setCombo(final IModelSession session) { + if (session == oldSession) { + return; + } + oldSession = session; + if (session == null) { + initCombo(); + } else { + clearCombo(); + final List subworkTypes = getSubworkTypes(session); + final List sortedSubworkTypes = sortSubworkTypes( + subworkTypes); + comboViewer.setInput(sortedSubworkTypes.toArray()); + comboViewer.getCombo().select(0); + comboViewer.getCombo().setEnabled(true); + planningAccessService.setCurrentUntergewerkArt( + ENUMUntergewerkArt.get(sortedSubworkTypes.getFirst())); + } + } + + private static final List SUBWORK_TYPE_ORDER = Arrays.asList( + ENUMUntergewerkArt.ENUM_UNTERGEWERK_ART_ATO.getLiteral(), + ENUMUntergewerkArt.ENUM_UNTERGEWERK_ART_ETCS.getLiteral(), + ENUMUntergewerkArt.ENUM_UNTERGEWERK_ART_ESTW.getLiteral(), + ENUMUntergewerkArt.ENUM_UNTERGEWERK_ART_GEO.getLiteral()); + + private static List sortSubworkTypes( + final List subworkTypes) { + final List sortedSubworkTypes = new ArrayList<>(subworkTypes); + sortedSubworkTypes.sort((a, b) -> { + final int indexOfA = SUBWORK_TYPE_ORDER.indexOf(a); + final int indexOfB = SUBWORK_TYPE_ORDER.indexOf(b); + if (indexOfA == -1 && indexOfB == -1) { + return a.compareTo(b); + } + if (indexOfA == -1) { + return 1; + } + if (indexOfB == -1) { + return -1; + } + + final int indexCompare = Integer.compare(indexOfA, indexOfB); + if (indexCompare != 0) { + return indexCompare; + } + return a.compareTo(b); + }); + + return sortedSubworkTypes.isEmpty() ? List.of( + ENUMUntergewerkArt.ENUM_UNTERGEWERK_ART_SONSTIGE.getLiteral()) + : sortedSubworkTypes; + } + + private void clearCombo() { + comboViewer.getCombo().removeAll(); + comboViewer.getCombo().clearSelection(); + } +} diff --git a/java/bundles/org.eclipse.set.application/src/org/eclipse/set/application/toolcontrol/ServiceProvider.java b/java/bundles/org.eclipse.set.application/src/org/eclipse/set/application/toolcontrol/ServiceProvider.java index f2823b5ce2..c9e4bd3acf 100644 --- a/java/bundles/org.eclipse.set.application/src/org/eclipse/set/application/toolcontrol/ServiceProvider.java +++ b/java/bundles/org.eclipse.set.application/src/org/eclipse/set/application/toolcontrol/ServiceProvider.java @@ -17,6 +17,7 @@ import org.eclipse.set.core.services.dialog.DialogService; import org.eclipse.set.core.services.enumtranslation.EnumTranslationService; import org.eclipse.set.core.services.part.ToolboxPartService; +import org.eclipse.set.core.services.planningaccess.PlanningAccessService; import jakarta.inject.Inject; @@ -44,4 +45,7 @@ public class ServiceProvider { @Inject public DialogService dialogService; + + @Inject + public PlanningAccessService planningAccessService; } diff --git a/java/bundles/org.eclipse.set.application/src/org/eclipse/set/application/toolcontrol/ToolbarRightControlGroup.java b/java/bundles/org.eclipse.set.application/src/org/eclipse/set/application/toolcontrol/ToolbarRightControlGroup.java index fa7e9ffca8..c81bc3906b 100644 --- a/java/bundles/org.eclipse.set.application/src/org/eclipse/set/application/toolcontrol/ToolbarRightControlGroup.java +++ b/java/bundles/org.eclipse.set.application/src/org/eclipse/set/application/toolcontrol/ToolbarRightControlGroup.java @@ -13,6 +13,7 @@ import org.eclipse.e4.core.contexts.ContextInjectionFactory; import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.set.application.controlarea.ControlAreaSelectionControl; +import org.eclipse.set.application.subwork.SubworkSelectionControl; import org.eclipse.set.application.tabletype.TableTypeSelectionControl; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; @@ -38,7 +39,7 @@ private void postConstruct(final Composite parent, serviceProvider = ContextInjectionFactory.make(ServiceProvider.class, context); composite = new Composite(parent, SWT.NONE); - final GridLayout gridLayout = new GridLayout(3, false); + final GridLayout gridLayout = new GridLayout(4, false); composite.setLayout(gridLayout); composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); initControl(shell); @@ -48,6 +49,8 @@ private void postConstruct(final Composite parent, private void initControl(final Shell shell) { final LoadedFileStatusControl validIconControl = new LoadedFileStatusControl( composite, serviceProvider, shell); + final SubworkSelectionControl subworkSelectionControl = new SubworkSelectionControl( + composite, serviceProvider); final TableTypeSelectionControl tableTypeSelectionControl = new TableTypeSelectionControl( composite, serviceProvider); final ControlAreaSelectionControl controlAreaSelectionControlcontrolArea = new ControlAreaSelectionControl( diff --git a/java/bundles/org.eclipse.set.basis/src/org/eclipse/set/basis/constants/Events.java b/java/bundles/org.eclipse.set.basis/src/org/eclipse/set/basis/constants/Events.java index e4628fe41f..fdfbd6a3b4 100644 --- a/java/bundles/org.eclipse.set.basis/src/org/eclipse/set/basis/constants/Events.java +++ b/java/bundles/org.eclipse.set.basis/src/org/eclipse/set/basis/constants/Events.java @@ -105,4 +105,9 @@ public interface Events { * The find GEO_Kante geometry process is done */ String FIND_GEOMETRY_PROCESS_DONE = "geometryService/done"; + + /** + * When a subwork is selected + */ + String SUBWORK_CHANGED = "subwork/change"; } diff --git a/java/bundles/org.eclipse.set.core.services/src/org/eclipse/set/core/services/planningaccess/PlanningAccessService.java b/java/bundles/org.eclipse.set.core.services/src/org/eclipse/set/core/services/planningaccess/PlanningAccessService.java index c170bad45a..a562375e57 100644 --- a/java/bundles/org.eclipse.set.core.services/src/org/eclipse/set/core/services/planningaccess/PlanningAccessService.java +++ b/java/bundles/org.eclipse.set.core.services/src/org/eclipse/set/core/services/planningaccess/PlanningAccessService.java @@ -24,6 +24,17 @@ */ public interface PlanningAccessService { + /** + * @return the selected Subwork type + */ + public ENUMUntergewerkArt getCurrentUntergewerkArt(); + + /** + * @param untergewerkArt + * the selected Subwork type + */ + public void setCurrentUntergewerkArt(ENUMUntergewerkArt untergewerkArt); + /** * @param planProIterface * the PlanPro Schnittstelle diff --git a/java/bundles/org.eclipse.set.core/src/org/eclipse/set/core/modelservice/PlanningAccessServiceImpl.java b/java/bundles/org.eclipse.set.core/src/org/eclipse/set/core/modelservice/PlanningAccessServiceImpl.java index a1f408a1ce..b46c492fd5 100644 --- a/java/bundles/org.eclipse.set.core/src/org/eclipse/set/core/modelservice/PlanningAccessServiceImpl.java +++ b/java/bundles/org.eclipse.set.core/src/org/eclipse/set/core/modelservice/PlanningAccessServiceImpl.java @@ -9,7 +9,6 @@ package org.eclipse.set.core.modelservice; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Optional; @@ -33,14 +32,8 @@ */ @Component public class PlanningAccessServiceImpl implements PlanningAccessService { - private static LinkedList subworkByPriority = new LinkedList<>() { - { - add(ENUMUntergewerkArt.ENUM_UNTERGEWERK_ART_ATO); - add(ENUMUntergewerkArt.ENUM_UNTERGEWERK_ART_ETCS); - add(ENUMUntergewerkArt.ENUM_UNTERGEWERK_ART_ESTW); - add(ENUMUntergewerkArt.ENUM_UNTERGEWERK_ART_GEO); - } - }; + + private ENUMUntergewerkArt currentUntergewerkArt = null; private static void createPrerequisiteElements( final PlanPro_Schnittstelle planProIterface) { @@ -119,21 +112,34 @@ public Planung_Projekt getLSTPlanungProjekt( @Override public Planung_Gruppe getLeadingPlanungGruppe( final Planung_Projekt project) { + final List planingGroups = project .getLSTPlanungGruppe(); + if (planingGroups.isEmpty()) { return null; } final Map> groupsBySubWork = planingGroups .stream() - .filter(group -> getUntergewerkArt(group) != null) + .filter(group -> { + final var groupArt = getUntergewerkArt(group); + final var currentArt = getCurrentUntergewerkArt(); + if (groupArt == null && currentArt == null) { + return true; + } + + if (groupArt == null || currentArt == null) { + return false; + } + + return groupArt.equals(currentArt); + }) .collect(Collectors .groupingBy(group -> getUntergewerkArt(group))); - for (final ENUMUntergewerkArt subWork : subworkByPriority) { - if (groupsBySubWork.containsKey(subWork)) { - return groupsBySubWork.get(subWork).getFirst(); - } + if (groupsBySubWork.containsKey(getCurrentUntergewerkArt())) { + return groupsBySubWork.get(getCurrentUntergewerkArt()).getFirst(); } + return planingGroups.getFirst(); } @@ -185,4 +191,15 @@ public void setPlanungGruppe(final Planung_Projekt project, } } } + + @Override + public ENUMUntergewerkArt getCurrentUntergewerkArt() { + return currentUntergewerkArt; + } + + @Override + public void setCurrentUntergewerkArt( + final ENUMUntergewerkArt untergewerkArt) { + currentUntergewerkArt = untergewerkArt; + } } diff --git a/java/bundles/org.eclipse.set.feature.export/META-INF/MANIFEST.MF b/java/bundles/org.eclipse.set.feature.export/META-INF/MANIFEST.MF index 0024bc51ea..dae2694847 100644 --- a/java/bundles/org.eclipse.set.feature.export/META-INF/MANIFEST.MF +++ b/java/bundles/org.eclipse.set.feature.export/META-INF/MANIFEST.MF @@ -17,6 +17,7 @@ Bundle-RequiredExecutionEnvironment: JavaSE-21 Import-Package: com.fasterxml.jackson.core, com.fasterxml.jackson.databind, com.fasterxml.jackson.databind.module, + jakarta.annotation;version="[2.1.0,3.0.0)", jakarta.inject;version="1.0.0", org.apache.commons.io;version="2.2.0", org.apache.fop.apps, @@ -37,6 +38,7 @@ Import-Package: com.fasterxml.jackson.core, org.eclipse.e4.core.contexts;version="1.7.0", org.eclipse.e4.core.di, org.eclipse.e4.core.di.annotations;version="1.6.0", + org.eclipse.e4.core.services.events, org.eclipse.e4.core.services.nls, org.eclipse.e4.ui.di, org.eclipse.e4.ui.model.application, @@ -82,6 +84,7 @@ Import-Package: com.fasterxml.jackson.core, org.eclipse.set.utils.table, org.eclipse.set.utils.viewgroups, org.osgi.service.component.annotations;version="1.2.0", + org.osgi.service.event;version="[1.4.0,2.0.0)", org.slf4j;version="1.7.2" Bundle-ActivationPolicy: lazy Bundle-ClassPath: hyph/, diff --git a/java/bundles/org.eclipse.set.feature.export/src/org/eclipse/set/feature/export/parts/TitleBoxPdfPart.java b/java/bundles/org.eclipse.set.feature.export/src/org/eclipse/set/feature/export/parts/TitleBoxPdfPart.java index fdf704dffd..c1e11a60c5 100644 --- a/java/bundles/org.eclipse.set.feature.export/src/org/eclipse/set/feature/export/parts/TitleBoxPdfPart.java +++ b/java/bundles/org.eclipse.set.feature.export/src/org/eclipse/set/feature/export/parts/TitleBoxPdfPart.java @@ -20,6 +20,7 @@ import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.set.basis.OverwriteHandling; +import org.eclipse.set.basis.constants.Events; import org.eclipse.set.basis.extensions.PathExtensions; import org.eclipse.set.basis.guid.Guid; import org.eclipse.set.core.services.pdf.PdfRendererService; @@ -37,7 +38,10 @@ import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Shell; +import org.osgi.service.event.EventHandler; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; import jakarta.inject.Inject; /** @@ -61,6 +65,24 @@ public class TitleBoxPdfPart extends BasePart implements SaveListener { @Translation Messages messages; + private EventHandler subworkChangedHandler; + + @PostConstruct + private void postConstruct() { + subworkChangedHandler = event -> { + if (!event.getTopic().equalsIgnoreCase(Events.SUBWORK_CHANGED)) { + return; + } + updatePdfView(); + }; + getBroker().subscribe(Events.SUBWORK_CHANGED, subworkChangedHandler); + } + + @PreDestroy + private void preDestroy() { + getBroker().unsubscribe(subworkChangedHandler); + } + /** * Create the part. */ diff --git a/java/bundles/org.eclipse.set.feature.table.pt1/src/org/eclipse/set/feature/table/pt1/sszw/SszwTransformator.xtend b/java/bundles/org.eclipse.set.feature.table.pt1/src/org/eclipse/set/feature/table/pt1/sszw/SszwTransformator.xtend index 4f6ea8867c..cfd5edaba9 100644 --- a/java/bundles/org.eclipse.set.feature.table.pt1/src/org/eclipse/set/feature/table/pt1/sszw/SszwTransformator.xtend +++ b/java/bundles/org.eclipse.set.feature.table.pt1/src/org/eclipse/set/feature/table/pt1/sszw/SszwTransformator.xtend @@ -4,7 +4,7 @@ * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v2.0 which is available at * https://www.eclipse.org/legal/epl-2.0. - * + * * SPDX-License-Identifier: EPL-2.0 * */ @@ -37,6 +37,7 @@ import org.eclipse.set.ppmodel.extensions.container.MultiContainer_AttributeGrou import org.eclipse.set.ppmodel.extensions.utils.Case import org.eclipse.set.utils.math.AgateRounding import org.eclipse.set.utils.table.TMFactory +import org.eclipse.set.utils.table.TableError import org.osgi.service.event.EventAdmin import static org.eclipse.set.feature.table.pt1.sszw.SszwColumns.* @@ -44,6 +45,7 @@ import static org.eclipse.set.model.planpro.BasisTypen.ENUMLinksRechts.* import static org.eclipse.set.model.planpro.Weichen_und_Gleissperren.ENUMWKrArt.* import static org.eclipse.set.ppmodel.extensions.geometry.GEOKanteGeometryExtensions.* +import static extension org.eclipse.set.model.tablemodel.extensions.TableRowExtensions.* 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.ESTW_ZentraleinheitExtensions.* @@ -124,31 +126,41 @@ class SszwTransformator extends AbstractPlanPro2TableModelTransformator { ) // D: Sszw.W_Kr.Standort.Strecke - val streckeInfos = etcsWkr.streckeInfo - fillIterable( - row, - cols.getColumn(Strecke), - etcsWkr, - [streckeInfos.map[key]], - null - ) + try { + + val streckeInfos = etcsWkr.streckeInfo + fillIterable( + row, + cols.getColumn(Strecke), + etcsWkr, + [streckeInfos.map[key]], + null + ) - // E: Sszw.W_Kr.Standort.Km - fillIterableSingleCellWhenAllowed( - row, - cols.getColumn(km), - etcsWkr, - [isFindGeometryComplete || streckeInfos.map[value].exists[isPresent]], - [ - val kmValues = streckeInfos.map[value].filter[isPresent].map [ - get - ].toList - return kmValues - ], - null, - ITERABLE_FILLING_SEPARATOR, - tableShortcut - ) + // E: Sszw.W_Kr.Standort.Km + fillIterableSingleCellWhenAllowed( + row, + cols.getColumn(km), + etcsWkr, + [ + isFindGeometryComplete || streckeInfos.map[value].exists [ + isPresent + ] + ], + [ + val kmValues = streckeInfos.map[value].filter[isPresent].map [ + get + ].toList + return kmValues + ], + null, + ITERABLE_FILLING_SEPARATOR, + tableShortcut + ) + } catch (Exception e) { + handleFillingException(e, row, cols.getColumn(Strecke)) + handleFillingException(e, row, cols.getColumn(km)) + } val wKomponentEW_L = refWKrAnlage.getGspKomponente( wKrGspElement, @@ -424,8 +436,9 @@ class SszwTransformator extends AbstractPlanPro2TableModelTransformator { val distance = gspKomponente.map[new TopPoint(it)].map [ gspPoint | topGraphService.findShortestDistance(signalTopPoint, gspPoint) ].map[orElse(null)].filterNull - return distance.nullOrEmpty ? "" : AgateRounding.roundDown( - distance.min.doubleValue).toString + return distance.nullOrEmpty + ? "" + : AgateRounding.roundDown(distance.min.doubleValue).toString } private def String getWKrGeschwindigkeit( @@ -461,7 +474,8 @@ class SszwTransformator extends AbstractPlanPro2TableModelTransformator { val gspKomponent = gspElement.WKrGspKomponenten.firstOrNull return allowSpeed.apply(gspKomponent)?.toString ?: "" } - default: "" + default: + "" } } diff --git a/java/bundles/org.eclipse.set.ppmodel.extensions/src/org/eclipse/set/ppmodel/extensions/PunktObjektTopKanteExtensions.xtend b/java/bundles/org.eclipse.set.ppmodel.extensions/src/org/eclipse/set/ppmodel/extensions/PunktObjektTopKanteExtensions.xtend index da9c9c414a..508c9e00d4 100644 --- a/java/bundles/org.eclipse.set.ppmodel.extensions/src/org/eclipse/set/ppmodel/extensions/PunktObjektTopKanteExtensions.xtend +++ b/java/bundles/org.eclipse.set.ppmodel.extensions/src/org/eclipse/set/ppmodel/extensions/PunktObjektTopKanteExtensions.xtend @@ -248,7 +248,9 @@ class PunktObjektTopKanteExtensions extends BasisObjektExtensions { getProjectionCoordinateOnStrecke(coordinate, strecke) val nearestRoutePoint = strecke.streckenPunkte.map [ it -> streckePunktTopDistance - ].minBy[(projectionPointAndDistance.second - it.value).abs] + ] + .filter[it.value != null] + .minBy[(projectionPointAndDistance.second - it.value).abs] val nearestRoutePointMeter = nearestRoutePoint.key.streckeMeter.wert val distance = nearestRoutePoint.value - diff --git a/java/bundles/org.eclipse.set.ppmodel.extensions/src/org/eclipse/set/ppmodel/extensions/StreckePunktExtensions.xtend b/java/bundles/org.eclipse.set.ppmodel.extensions/src/org/eclipse/set/ppmodel/extensions/StreckePunktExtensions.xtend index 4dd9d2d072..bc6cfcd36d 100644 --- a/java/bundles/org.eclipse.set.ppmodel.extensions/src/org/eclipse/set/ppmodel/extensions/StreckePunktExtensions.xtend +++ b/java/bundles/org.eclipse.set.ppmodel.extensions/src/org/eclipse/set/ppmodel/extensions/StreckePunktExtensions.xtend @@ -39,13 +39,18 @@ class StreckePunktExtensions extends BasisObjektExtensions { static def BigDecimal getStreckePunktTopDistance(Strecke_Punkt routePoint) { val geoKnoten = routePoint.geoKnoten + if (geoKnoten == null) { + return null + } val geoKanten = routePoint.container.GEOKante.filter [ parentKante instanceof Strecke && parentKante === routePoint.IDStrecke.value ].filter[geoKnotenA === geoKnoten || geoKnotenB === geoKnoten]. firstOrNull if (geoKanten === null) { - return null + throw new IllegalArgumentException( + "Route point isn't reference to GEO_Kante" + ) } val metadata = Services.geometryService.getGeoKanteMetaData(geoKanten) if (geoKanten.geoKnotenA === geoKnoten) {