This is an automated email from the ASF dual-hosted git repository. asf-gitbox-commits pushed a commit to branch geoapi-4.0 in repository https://gitbox.apache.org/repos/asf/sis.git
commit 1fdc5e17639421f677d67491fdb511999f0c4402 Author: jsorel <[email protected]> AuthorDate: Mon Nov 2 12:10:57 2026 +0100 feat(Mesh): make MultiMeshPrimitive extend DefaultGeometryCollection --- .../apache/sis/geometries/GeometryCollection.java | 1 - .../internal/shared/DefaultGeometryCollection.java | 51 ++++++- .../sis/geometries/mesh/MultiMeshPrimitive.java | 147 ++------------------- .../sis/geometries/operation/TransformTest.java | 2 +- 4 files changed, 55 insertions(+), 146 deletions(-) diff --git a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/GeometryCollection.java b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/GeometryCollection.java index 8e3ddf3a56..5ba33a22d1 100644 --- a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/GeometryCollection.java +++ b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/GeometryCollection.java @@ -82,7 +82,6 @@ public sealed interface GeometryCollection<T extends Geometry> extends Geometry permits ProductCurve, DefaultMultiPoint, DefaultGeometryCollection, - MultiMeshPrimitive, MeshPrimitive.Abs.Points, MeshPrimitive.Abs.Lines { diff --git a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultGeometryCollection.java b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultGeometryCollection.java index 79f35bb6bf..77448dff30 100644 --- a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultGeometryCollection.java +++ b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/internal/shared/DefaultGeometryCollection.java @@ -16,6 +16,10 @@ */ package org.apache.sis.geometries.internal.shared; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Objects; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.apache.sis.geometries.Geometry; import org.apache.sis.geometries.GeometryCollection; @@ -23,6 +27,7 @@ import org.apache.sis.geometries.GeometryFactory; import org.apache.sis.geometries.GeometryType; import org.apache.sis.geometries.Point; import org.apache.sis.geometries.Geometries; +import org.apache.sis.referencing.CRS; import org.apache.sis.util.ArgumentChecks; @@ -33,7 +38,7 @@ import org.apache.sis.util.ArgumentChecks; public non-sealed class DefaultGeometryCollection<T extends Geometry> extends AbstractGeometry implements GeometryCollection<T> { private final GeometryType elementType; - private final T[] geometries; + protected final List<T> geometries = new ArrayList<>(); /** * The coordinate reference system to report when this collection is empty. @@ -52,7 +57,7 @@ public non-sealed class DefaultGeometryCollection<T extends Geometry> extends Ab */ public DefaultGeometryCollection(GeometryType elementType, CoordinateReferenceSystem fallbackCRS, T[] geometries) { this.elementType = elementType; - this.geometries = geometries; + if (geometries != null) this.geometries.addAll(List.of(geometries)); this.fallbackCRS = (fallbackCRS != null) ? fallbackCRS : Geometries.getUndefinedCRS(2); } @@ -63,7 +68,7 @@ public non-sealed class DefaultGeometryCollection<T extends Geometry> extends Ab @Override public CoordinateReferenceSystem getCoordinateReferenceSystem() { - return (geometries.length != 0) ? geometries[0].getCoordinateReferenceSystem() : fallbackCRS; + return (!geometries.isEmpty()) ? geometries.get(0).getCoordinateReferenceSystem() : fallbackCRS; } @Override @@ -77,12 +82,12 @@ public non-sealed class DefaultGeometryCollection<T extends Geometry> extends Ab @Override public int getNumGeometries() { - return geometries.length; + return geometries.size(); } @Override public T getGeometryN(int n) { - return geometries[n]; + return geometries.get(n); } @Override @@ -127,4 +132,40 @@ public non-sealed class DefaultGeometryCollection<T extends Geometry> extends Ab return asJTS().isValid(); } + /** + * Add primitives. + * + * @param other Primitives to merge in. + */ + public void append(Collection<? extends Geometry> other) { + for (Geometry p : other) { + if (!CRS.equivalent(fallbackCRS, p.getCoordinateReferenceSystem())) { + throw new IllegalArgumentException("Primitives must have the same CRS as the MultiPrimitive."); + } + } + geometries.addAll((Collection) other); + } + + @Override + public int hashCode() { + return 23 * Objects.hashCode(this.geometries); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final DefaultGeometryCollection other = (DefaultGeometryCollection) obj; + if (!Objects.equals(this.geometries, other.geometries)) { + return false; + } + return Objects.equals(this.getCoordinateReferenceSystem(), other.getCoordinateReferenceSystem()); + } } diff --git a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/mesh/MultiMeshPrimitive.java b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/mesh/MultiMeshPrimitive.java index 176ae005d5..ac99004fa9 100644 --- a/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/mesh/MultiMeshPrimitive.java +++ b/incubator/src/org.apache.sis.geometry/main/org/apache/sis/geometries/mesh/MultiMeshPrimitive.java @@ -16,26 +16,13 @@ */ package org.apache.sis.geometries.mesh; -import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.Objects; import org.opengis.referencing.crs.CoordinateReferenceSystem; -import org.opengis.referencing.operation.TransformException; -import org.apache.sis.geometries.DataPoints; import org.apache.sis.geometries.Geometries; -import org.apache.sis.geometries.Geometry; -import org.apache.sis.geometries.GeometryCollection; import org.apache.sis.geometries.GeometryType; -import org.apache.sis.geometries.internal.shared.AbstractGeometry; -import org.apache.sis.geometries.internal.shared.ConcatenatedDataPoints; -import org.apache.sis.geometries.internal.shared.EmptyDataPoints; -import org.apache.sis.referencing.CRS; -import org.apache.sis.util.ArgumentChecks; +import org.apache.sis.geometries.internal.shared.DefaultGeometryCollection; /** @@ -44,12 +31,7 @@ import org.apache.sis.util.ArgumentChecks; * * @author Johann Sorel (Geomatys) */ -public final class MultiMeshPrimitive<T extends MeshPrimitive> extends AbstractGeometry implements GeometryCollection<T> { - - protected final List<T> primitives = new ArrayList<>(); - - private CoordinateReferenceSystem crs; - private Map<String, Object> userProperties; +public final class MultiMeshPrimitive<T extends MeshPrimitive> extends DefaultGeometryCollection<T> { /** * Create a geometry with right hand 3D CRS. @@ -59,8 +41,7 @@ public final class MultiMeshPrimitive<T extends MeshPrimitive> extends AbstractG } public MultiMeshPrimitive(CoordinateReferenceSystem crs) { - ArgumentChecks.ensureNonNull("crs", crs); - this.crs = crs; + super(GeometryType.GEOMETRY, crs, null); } public MultiMeshPrimitive(MeshPrimitive ... primitives) { @@ -68,35 +49,8 @@ public final class MultiMeshPrimitive<T extends MeshPrimitive> extends AbstractG append(Arrays.asList(primitives)); } - @Override - public GeometryType getElementType() { - return GeometryType.GEOMETRY; - } - - @Override - public CoordinateReferenceSystem getCoordinateReferenceSystem() { - for (MeshPrimitive p : primitives) { - return p.getCoordinateReferenceSystem(); - } - return crs; - } - - @Override - public Geometry getBoundary() { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public void setCoordinateReferenceSystem(CoordinateReferenceSystem crs) { - ArgumentChecks.ensureNonNull("crs", crs); - for (MeshPrimitive p : primitives) { - p.setCoordinateReferenceSystem(crs); - } - this.crs = crs; - } - public boolean isEmpty() { - for (MeshPrimitive p : primitives) { + for (MeshPrimitive p : geometries) { if (!p.isEmpty()) { return false; } @@ -105,57 +59,18 @@ public final class MultiMeshPrimitive<T extends MeshPrimitive> extends AbstractG } public List<T> getComponents() { - return Collections.unmodifiableList(primitives); - } - - @Override - public int getNumGeometries() { - return primitives.size(); - } - - @Override - public T getGeometryN(int n) { - return primitives.get(n); + return Collections.unmodifiableList(geometries); } /** * Check geometry definition. */ public void validate() { - for (MeshPrimitive p : primitives) { + for (MeshPrimitive p : geometries) { p.validate(); } } - /** - * Add primitives. - * - * @param other Primitives to merge in. - */ - public void append(Collection<? extends MeshPrimitive> other) { - for (MeshPrimitive p : other) { - if (!CRS.equivalent(crs, p.getCoordinateReferenceSystem())) { - throw new IllegalArgumentException("Primitives must have the same CRS as the MultiPrimitive."); - } - } - primitives.addAll((Collection<? extends T>) other); - } - - /** - * Make a deep copy of this multi-primitive. - * - * Note : this method will clone all attributes. - * - * @return copied MultiPrimitive - */ - public MultiMeshPrimitive deepCopy() throws TransformException { - final MultiMeshPrimitive copy = new MultiMeshPrimitive(getCoordinateReferenceSystem()); - for (MeshPrimitive p : primitives) { - copy.primitives.add(p.deepCopy()); - } - return copy; - } - /** * Set each vertex normal by computing the normal of the triangle * where it is used. @@ -163,7 +78,7 @@ public final class MultiMeshPrimitive<T extends MeshPrimitive> extends AbstractG * triangles or it will cause visual glitches. */ public void computeFaceNormals() { - for (MeshPrimitive p : primitives) { + for (MeshPrimitive p : geometries) { p.computeFaceNormals(); } } @@ -173,55 +88,9 @@ public final class MultiMeshPrimitive<T extends MeshPrimitive> extends AbstractG * where it is used. */ public void computeSmoothNormals() { - for (MeshPrimitive p : primitives) { + for (MeshPrimitive p : geometries) { p.computeSmoothNormals(); } } - @Override - public synchronized Map<String, Object> userProperties() { - if (userProperties == null) { - userProperties = new HashMap<>(); - } - return userProperties; - } - - @Override - public int hashCode() { - int hash = 7; - hash = 23 * hash + Objects.hashCode(this.primitives); - return hash; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final MultiMeshPrimitive other = (MultiMeshPrimitive) obj; - if (!Objects.equals(this.primitives, other.primitives)) { - return false; - } - return Objects.equals(this.getCoordinateReferenceSystem(), other.getCoordinateReferenceSystem()); - } - - - /** - * Returns the positions of the primitives of this set, in the order this set holds them. - */ - @Override - public DataPoints getDataPoints() { - final List<T> components = getComponents(); - if (components.isEmpty()) { - return new EmptyDataPoints(getCoordinateReferenceSystem()); - } - return ConcatenatedDataPoints.of(components.toArray(Geometry[]::new)); - } - } diff --git a/incubator/src/org.apache.sis.geometry/test/org/apache/sis/geometries/operation/TransformTest.java b/incubator/src/org.apache.sis.geometry/test/org/apache/sis/geometries/operation/TransformTest.java index a0dda07ca2..b1655ccc17 100644 --- a/incubator/src/org.apache.sis.geometry/test/org/apache/sis/geometries/operation/TransformTest.java +++ b/incubator/src/org.apache.sis.geometry/test/org/apache/sis/geometries/operation/TransformTest.java @@ -125,7 +125,7 @@ public class TransformTest extends AbstractD9IMTest { final MultiMeshPrimitive mp = new MultiMeshPrimitive(createPrimitive()); final MultiMeshPrimitive result = (MultiMeshPrimitive) new GeometryProcessor().transform(mp, CRS_TARGET, TRANSFORM); assertEquals(1, result.getNumGeometries()); - testPrimitive(result.getGeometryN(0)); + testPrimitive((MeshPrimitive) result.getGeometryN(0)); } /**
