From fbde3f3f54dc1ccb34e8e1f5630fa5577613d8a0 Mon Sep 17 00:00:00 2001 From: Dominic Burger Date: Wed, 17 Jan 2024 12:07:55 +0100 Subject: [PATCH] Add GeometryAttr parameter to Union --- .../extensions/functions/UnionIoxPlugin.java | 21 ++++++++++++++++--- src/model/GeoW_FunctionsExt.ili | 6 +++--- .../MandatoryConstraintMergedInnerRings.ili | 2 +- .../data/Union/MandatoryConstraintThis.ili | 4 ++-- 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/main/java/ch/geowerkstatt/ilivalidator/extensions/functions/UnionIoxPlugin.java b/src/main/java/ch/geowerkstatt/ilivalidator/extensions/functions/UnionIoxPlugin.java index e0b7aec..3aeac17 100644 --- a/src/main/java/ch/geowerkstatt/ilivalidator/extensions/functions/UnionIoxPlugin.java +++ b/src/main/java/ch/geowerkstatt/ilivalidator/extensions/functions/UnionIoxPlugin.java @@ -1,6 +1,8 @@ package ch.geowerkstatt.ilivalidator.extensions.functions; import ch.ehi.basics.types.OutParam; +import ch.interlis.ili2c.metamodel.PathEl; +import ch.interlis.ili2c.metamodel.Viewable; import ch.interlis.iom.IomObject; import ch.interlis.iox.IoxException; import ch.interlis.iox_j.jts.Iox2jtsException; @@ -29,13 +31,26 @@ public String getQualifiedIliName() { @Override protected Value evaluateInternal(String validationKind, String usageScope, IomObject contextObject, Value[] actualArguments) { - Value argGeometries = actualArguments[0]; + Value argObjects = actualArguments[0]; + Value argPath = actualArguments[1]; - if (argGeometries.isUndefined()) { + if (argObjects.isUndefined()) { return Value.createSkipEvaluation(); } - Collection surfaces = argGeometries.getComplexObjects(); + Collection surfaces; + if (argPath.isUndefined()) { + surfaces = argObjects.getComplexObjects(); + } else { + Viewable contextClass = EvaluationHelper.getContextClass(td, contextObject, argObjects); + if (contextClass == null) { + throw new IllegalStateException("unknown class in " + usageScope); + } + + PathEl[] attributePath = EvaluationHelper.getAttributePathEl(validator, contextClass, argPath); + surfaces = EvaluationHelper.evaluateAttributes(validator, argObjects, attributePath); + } + if (surfaces == null) { return Value.createUndefined(); } diff --git a/src/model/GeoW_FunctionsExt.ili b/src/model/GeoW_FunctionsExt.ili index b08f988..8da1390 100644 --- a/src/model/GeoW_FunctionsExt.ili +++ b/src/model/GeoW_FunctionsExt.ili @@ -46,11 +46,11 @@ MODEL GeoW_FunctionsExt !!@ fn.since = "2023-12-21"; FUNCTION IsInside (ReferenceGeometry: MULTIAREA; TestObject: OBJECT OF ANYCLASS; TestObjectgeometry: TEXT): BOOLEAN; - !!@ fn.description = "Fasst die Flächen-Geometrien aus der Eingabemenge zu einer Flächen-Geometrie zusammen. Für 'Geometries' können nur Geometrien angegeben werden."; - !!@ fn.param = "Geometries: Geometrien, die zusammengefasst werden sollen"; + !!@ fn.description = "Fasst die Flächen-Geometrien aus der Eingabemenge zu einer Flächen-Geometrie zusammen. Für 'Objects' können Objekte oder Geometrien angegeben werden. Für 'GeometryAttr' soll der Pfad zur Flächen-Geometrie in INTERLIS 2 Syntax angegeben werden. Falls 'Objects' bereits die Geometrien enthält, soll für 'GeometryAttr' 'UNDEFINED' übergeben werden."; + !!@ fn.param = "Objects: Objekte, deren Geometrien zusammengefasst werden sollen. GeometryAttr: Pfad zum Geometrieattribut oder UNDEFINED"; !!@ fn.return = "Zusammengefasste Flächen-Geometrie"; !!@ fn.since = "2023-12-13"; - FUNCTION Union (Geometries: ANYSTRUCTURE): MULTIAREA; + FUNCTION Union (Objects: ANYSTRUCTURE; GeometryAttr: TEXT): MULTIAREA; !!@ fn.description = "Prüft, ob sich die Linien-Geometrien überlappen oder eine gemeinsame Teilstrecke vorhanden ist (wenn die Schnittmenge der Innenbereiche einer Linie entspricht). Für 'Objects' können Objekte oder Geometrien angegeben werden. Für 'LineAttr' soll der Pfad zur Linien-Geometrie in INTERLIS 2 Syntax angegeben werden. Falls 'Objects' bereits die Geometrien enthält, soll für 'LineAttr' 'UNDEFINED' übergeben werden."; !!@ fn.param = "Objects: Ausgangsobjekte oder Geometrien. LineAttr: Pfad zum Geometrieattribut oder UNDEFINED"; diff --git a/src/test/data/Union/MandatoryConstraintMergedInnerRings.ili b/src/test/data/Union/MandatoryConstraintMergedInnerRings.ili index efd9df3..cc8331b 100644 --- a/src/test/data/Union/MandatoryConstraintMergedInnerRings.ili +++ b/src/test/data/Union/MandatoryConstraintMergedInnerRings.ili @@ -22,7 +22,7 @@ MODEL TestSuite !! Surfaces evaluated as union (inner rings overlap in test data) MANDATORY CONSTRAINT innerRingsUnion: - GeoW_FunctionsExt.GetInnerRingsCount(GeoW_FunctionsExt.Union(THIS->surfaceAttribute), UNDEFINED) == 1; + GeoW_FunctionsExt.GetInnerRingsCount(GeoW_FunctionsExt.Union(THIS, "surfaceAttribute"), UNDEFINED) == 1; END BaseClass; diff --git a/src/test/data/Union/MandatoryConstraintThis.ili b/src/test/data/Union/MandatoryConstraintThis.ili index e2828f4..c3210e9 100644 --- a/src/test/data/Union/MandatoryConstraintThis.ili +++ b/src/test/data/Union/MandatoryConstraintThis.ili @@ -18,10 +18,10 @@ MODEL TestSuite surfaceAttribute : BAG OF Surface; MANDATORY CONSTRAINT falseConstraint: - GeoW_FunctionsExt.GetInnerRingsCount(GeoW_FunctionsExt.Union(THIS->surfaceAttribute), UNDEFINED) > 3; + GeoW_FunctionsExt.GetInnerRingsCount(GeoW_FunctionsExt.Union(THIS->surfaceAttribute, UNDEFINED), UNDEFINED) > 3; MANDATORY CONSTRAINT oneInnerRingConstraint: - GeoW_FunctionsExt.GetInnerRingsCount(GeoW_FunctionsExt.Union(THIS->surfaceAttribute), UNDEFINED) == 1; + GeoW_FunctionsExt.GetInnerRingsCount(GeoW_FunctionsExt.Union(THIS->surfaceAttribute, UNDEFINED), UNDEFINED) == 1; END BaseClass;