From 53599b81a0e8f66dc09b88f790aabdca283a4f5c Mon Sep 17 00:00:00 2001 From: Riegel Date: Wed, 12 Mar 2025 15:25:19 +0100 Subject: [PATCH] Refactor: Make PolygonPatch collection typesafe --- .../datastructure/ConcretePolygon.java | 13 ++++++++ .../datastructure/PatchCollection.java | 33 +++++++++++++++++++ .../citygml3/Citygml3GeometryMapper.java | 26 ++++++++------- 3 files changed, 60 insertions(+), 12 deletions(-) create mode 100644 CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/PatchCollection.java diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ConcretePolygon.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ConcretePolygon.java index a654fd4c..d0c3ea97 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ConcretePolygon.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/ConcretePolygon.java @@ -50,6 +50,7 @@ public class ConcretePolygon extends Polygon { private BoundarySurface partOfSurface; private Installation partfOfInstallation; private CompositeCollection partOfComposite = null; + private PatchCollection partOfPatch = null; private Geometry parent; private LinkedPolygon linkedFromPolygon; @@ -141,6 +142,18 @@ public class ConcretePolygon extends Polygon { this.partOfComposite = comp; } + protected void setPartOfPatch(PatchCollection pc) { + this.partOfPatch = pc; + } + + public PatchCollection getPartOfPatch(PatchCollection pc) { + return partOfPatch; + } + + public boolean isPatchMember() { + return partOfPatch != null; + } + public CompositeCollection getPartOfComposite() { return partOfComposite; } diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/PatchCollection.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/PatchCollection.java new file mode 100644 index 00000000..5416b33e --- /dev/null +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/PatchCollection.java @@ -0,0 +1,33 @@ +package de.hft.stuttgart.citydoctor2.datastructure; + +import java.io.Serial; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + + +public final class PatchCollection implements Serializable { + + @Serial + private static final long serialVersionUID = -1748657379840997228L; + private GmlId gmlId; + + private List patchMembers = new ArrayList<>(); + + public void addPatchMember(ConcretePolygon patchMember) { + patchMembers.add(patchMember); + patchMember.setPartOfPatch(this); + } + + public List getPatchMembers() { + return new ArrayList<>(patchMembers); + } + + public void setGmlId(GmlId gmlId) { + this.gmlId = gmlId; + } + + public GmlId getGmlId() { + return gmlId; + } +} diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3GeometryMapper.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3GeometryMapper.java index 4b99f27e..369a82d3 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3GeometryMapper.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3GeometryMapper.java @@ -65,24 +65,26 @@ public class Citygml3GeometryMapper extends GeometryWalker { @Override public void visit(Surface surface) { - - // TODO: Implement like CompositeSurfaces, just with PolygonPatches if (surface.getPatches() != null && !surface.getPatches().isSetObjects()) { logger.warn("Surface {} has no PolygonPatches.", surface.getId()); return; } - CompositeCollection comp = new CompositeCollection(); - List polygonPatches = (List) surface.getPatches().getObjects(); - Citygml3GeometryMapper recursiveMapper = new Citygml3GeometryMapper(config, vertexMap); + List polygonPatches = new ArrayList<>(); + GeometryWalker patchCollector = new GeometryWalker() { + @Override + public void visit(PolygonPatch pp) { + polygonPatches.add(pp); + } + }; + surface.getPatches().getObjects().forEach(abstractSurfacePatch -> abstractSurfacePatch.accept(patchCollector)); + PatchCollection patchCollection = new PatchCollection(); + Citygml3GeometryMapper patchMapper = new Citygml3GeometryMapper(config, vertexMap); for (PolygonPatch patch : polygonPatches) { - recursiveMapper.parsePolygonPatch(patch.getExterior(), patch.getInterior()); + patchMapper.parsePolygonPatch(patch.getExterior(), patch.getInterior()); } - - List compPolys = recursiveMapper.getPolygons(); - compPolys.forEach(comp::addCompositeMember); - comp.addAllChildComposites(recursiveMapper.getComposites()); - composites.add(comp); - polygons.addAll(compPolys); + List patchPolys = patchMapper.getPolygons(); + patchPolys.forEach(patchCollection::addPatchMember); + polygons.addAll(patchPolys); } -- GitLab