diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CompositePolygon.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CompositePolygon.java index f1d1463c55cf65843dc6a6403f320053980e04ff..20614c43f70d0f8d07857dee6e2267e619d889f1 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CompositePolygon.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CompositePolygon.java @@ -14,9 +14,9 @@ import java.io.Serial; import java.util.*; /** - * + * Dataholding class for parsing and resolving of CompositeSurfaces. */ -public class CompositePolygon extends ConcretePolygon{ +public final class CompositePolygon extends ConcretePolygon{ @Serial private static final long serialVersionUID = -1867197873443341287L; @@ -25,20 +25,14 @@ public class CompositePolygon extends ConcretePolygon{ private BoundarySurface partOfSurface; private Installation partOfInstallation; private List<ConcretePolygon> compositeMembers = new ArrayList<>(); - private LinearRing exterior = null; @Override public Vector3d calculateNormalNormalized() { - return this.calculateNormal().normalize(); + return null; } @Override - public void accept(Check c){ - for (Polygon p : compositeMembers){ - p.accept(c); - } - setValidated(true); - } + public void accept(Check c){} @Override public Class<? extends Checkable> getCheckClass() { @@ -47,33 +41,17 @@ public class CompositePolygon extends ConcretePolygon{ @Override public boolean containsAnyError(){ - if (super.containsAnyError()){ - return true; - } - for (Polygon p : compositeMembers){ - if (p.containsAnyError()){ - return true; - } - } return false; } @Override - public void collectContainedErrors(List<CheckError> errors) { - super.collectContainedErrors(errors); - for (Polygon p : compositeMembers){ - p.collectContainedErrors(errors); - } - } + public void collectContainedErrors(List<CheckError> errors) {} @Override public void clearAllContainedCheckResults() { - super.clearCheckResults(); - for (Polygon p : compositeMembers){ - p.clearAllContainedCheckResults(); - } } + public void addCompositeMember(ConcretePolygon p){ compositeMembers.add(p); } @@ -84,15 +62,6 @@ public class CompositePolygon extends ConcretePolygon{ @Override public boolean containsError(CheckId checkIdentifier) { - boolean hasError = super.containsError(checkIdentifier); - if (hasError) { - return true; - } - for (Polygon p : compositeMembers){ - if (p.containsError(checkIdentifier)) { - return true; - } - } return false; } @@ -100,59 +69,27 @@ public class CompositePolygon extends ConcretePolygon{ @Override public Vector3d calculateNormal() { - return this.getExteriorRing().calculateNormal(); + return compositeMembers.get(0).calculateNormal(); } @Override public TesselatedPolygon tesselate() { List<Triangle3d> tessPolys = new ArrayList<>(); - for (Polygon p : compositeMembers){ - TesselatedPolygon t = p.tesselate(); - tessPolys.addAll(t.getTriangles()); - } return new TesselatedPolygon(tessPolys,this ); } @Override public LinearRing getExteriorRing() { - if( exterior != null ){ - return exterior; - } - Map<Vertex, Integer> outerVertices = new HashMap<>(); - for (Polygon p : compositeMembers){ - for (Vertex v: p.getExteriorRing().getVertices()){ - outerVertices.merge(v, 1, Integer::sum); - } - } - List<Vertex> vertices = new ArrayList<>(); - for (Vertex v : outerVertices.keySet()){ - if (outerVertices.get(v) <= 3){ - vertices.add(v); - } - } - LinearRing ext = new LinearRing(LinearRing.LinearRingType.EXTERIOR); - ext.setParent(this); - ext.addAllVertices(vertices); - exterior = ext; - return ext; + return new LinearRing(LinearRing.LinearRingType.EXTERIOR); } @Override public List<LinearRing> getInnerRings() { - List<LinearRing> innerRings = new ArrayList<>(); - for (Polygon p : compositeMembers){ - innerRings.addAll(p.getInnerRings()); - } - return innerRings; + return Collections.emptyList(); } @Override public boolean isPointInsideExteriorRing(Vector3d v) { - for (Polygon p : compositeMembers) { - if (p.isPointInsideExteriorRing(v)) { - return true; - } - } return false; } @@ -173,11 +110,6 @@ public class CompositePolygon extends ConcretePolygon{ @Override public boolean isPolygonConnectedViaPoint(Polygon other) { - for (Polygon p : compositeMembers) { - if (p.isPolygonConnectedViaPoint(other)) { - return true; - } - } return false; } @@ -198,9 +130,6 @@ public class CompositePolygon extends ConcretePolygon{ @Override public void removeInnerRing(LinearRing ring) { - for (Polygon p : compositeMembers) { - p.removeInnerRing(ring); - } } @Override @@ -215,11 +144,6 @@ public class CompositePolygon extends ConcretePolygon{ @Override public boolean hasPointAsCorner(Vertex v) { - for (Polygon p : compositeMembers){ - if (p.hasPointAsCorner(v)) { - return true; - } - } return false; } diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3FeatureMapper.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3FeatureMapper.java index 7d76985ab9da78da2348750f096ddf4803ca32ac..c4121b0d50ac0168eb22d3642bd624840d42ae3d 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3FeatureMapper.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3FeatureMapper.java @@ -239,9 +239,6 @@ public class Citygml3FeatureMapper extends ObjectWalker { parseAndAddMultiSurface(as.getLod0MultiSurface(), Lod.LOD0, co); parseAndAddMultiSurface(as.getLod2MultiSurface(), Lod.LOD2, co); parseAndAddMultiSurface(as.getLod3MultiSurface(), Lod.LOD3, co); - parseAndAddCompositeSurface(as.getLod0MultiSurface(), Lod.LOD0, co); - parseAndAddCompositeSurface(as.getLod2MultiSurface(), Lod.LOD2, co); - parseAndAddCompositeSurface(as.getLod3MultiSurface(), Lod.LOD3, co); parseAndAddSolid(as.getLod1Solid(), Lod.LOD1, co); parseAndAddSolid(as.getLod2Solid(), Lod.LOD2, co); parseAndAddSolid(as.getLod3Solid(), Lod.LOD3, co); @@ -718,9 +715,6 @@ public class Citygml3FeatureMapper extends ObjectWalker { parseAndAddMultiSurface(as.getLod0MultiSurface(), Lod.LOD0, co); parseAndAddMultiSurface(as.getLod2MultiSurface(), Lod.LOD2, co); parseAndAddMultiSurface(as.getLod3MultiSurface(), Lod.LOD3, co); - parseAndAddCompositeSurface(as.getLod0MultiSurface(), Lod.LOD0, co); - parseAndAddCompositeSurface(as.getLod2MultiSurface(), Lod.LOD2, co); - parseAndAddCompositeSurface(as.getLod3MultiSurface(), Lod.LOD3, co); parseAndAddSolid(as.getLod1Solid(), Lod.LOD1, co); parseAndAddSolid(as.getLod2Solid(), Lod.LOD2, co); parseAndAddSolid(as.getLod3Solid(), Lod.LOD3, co); @@ -826,7 +820,6 @@ public class Citygml3FeatureMapper extends ObjectWalker { } continue; } - // TODO: Insert handling of compPoly dummy objects if (concPoly instanceof CompositePolygon comp) { resolveCompositePolygon(comp).forEach(geom::addPolygon); } else { @@ -1201,6 +1194,9 @@ public class Citygml3FeatureMapper extends ObjectWalker { for (Geometry geom : co.getGeometries()) { KDTree tree = new KDTree(); for (Polygon poly : geom.getPolygons()) { + if (poly instanceof CompositePolygon){ + continue; + } LinearRing lr = poly.getExteriorRing(); updateRing(tree, lr); for (LinearRing innerRing : poly.getInnerRings()) { diff --git a/CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization.properties b/CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization.properties index 410abe030fd6d8f298f591e358034415891c7f68..4b663e44f962d95ca47ec8470104bf76b109c35b 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization.properties +++ b/CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization.properties @@ -31,7 +31,7 @@ MainToolBar.writeReports=Write Reports MainToolBar.executeChecks=Execute Checks MainToolBar.showWorld=Show entire city model MainToolBar.resetCamera=Reset view -MainToolBar.hideRoof=Show/Hide roofs in object view +MainToolBar.hideRoof=Show/Hide roof BoundarySurfaces MainWindow.missingConfig=Could not find configuration file. MainWindow.loadGivenFile=Loading given file, please wait MainWindow.finishedLoading=Finished loading diff --git a/CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization_de.properties b/CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization_de.properties index 7e1ce1bc3e9b8429d79b1ecbc8bd54a46e2ddeb7..f804aec0a29f95f1506d13ebf6d9545afff011c6 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization_de.properties +++ b/CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization_de.properties @@ -29,7 +29,7 @@ MainToolBar.writeReports=Schreibe Reports MainToolBar.executeChecks=F\u00fchre Pr\u00fcfungen aus MainToolBar.showWorld=Gesamtes Stadtmodell anzeigen MainToolBar.resetCamera=Ansicht zur\u00fccksetzen -MainToolBar.hideRoof=Zeige/Verstecke D\u00e4cher in Objektansicht +MainToolBar.hideRoof=Zeige/Verstecke Dach BoundarySurfaces MainWindow.missingConfig=Konnte Konfigurationsdatei nicht finden. MainWindow.loadGivenFile=Lade vorhandene Datei, bitte warten MainWindow.finishedLoading=Fertig geladen diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/Renderer.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/Renderer.java index 752d7bda1f65a89c1322edbac3e9b62dfb066b63..7181255ae8df1d301062a4d587ade87d5534ef25 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/Renderer.java +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/Renderer.java @@ -669,6 +669,9 @@ public class Renderer { private void addGeometryDataToView(Geometry geom) { for (Polygon p : geom.getPolygons()) { + if (p instanceof CompositePolygon){ + continue; + } addPolygonToView(p); } for (Edge e : geom.getEdges()) { @@ -979,6 +982,7 @@ public class Renderer { for (Polygon p : geom.getPolygons()) { if (p.getOriginal().getPartOfSurface() != null && !roofFilter.allowedToUse(p.getOriginal().getPartOfSurface(), p.getParent())) continue; + if (p instanceof CompositePolygon) continue; polygons.add(p.getOriginal()); } } diff --git a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/TriangulatedGeometry.java b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/TriangulatedGeometry.java index ec6788fe2051cb77bc8afed28650d9450644cada..e519d980af9f01a1ab5b459b99fac49f82d2bea7 100644 --- a/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/TriangulatedGeometry.java +++ b/CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/TriangulatedGeometry.java @@ -6,17 +6,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface; -import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurfaceType; -import de.hft.stuttgart.citydoctor2.datastructure.Building; -import de.hft.stuttgart.citydoctor2.datastructure.Installation; -import de.hft.stuttgart.citydoctor2.datastructure.BuildingPart; -import de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel; -import de.hft.stuttgart.citydoctor2.datastructure.CityObject; -import de.hft.stuttgart.citydoctor2.datastructure.Geometry; -import de.hft.stuttgart.citydoctor2.datastructure.Opening; -import de.hft.stuttgart.citydoctor2.datastructure.OpeningType; -import de.hft.stuttgart.citydoctor2.datastructure.Polygon; +import de.hft.stuttgart.citydoctor2.datastructure.*; import de.hft.stuttgart.citydoctor2.gui.filter.ViewFilter; import de.hft.stuttgart.citydoctor2.math.Triangle3d; import de.hft.stuttgart.citydoctor2.math.UnitVector3d; @@ -62,6 +52,9 @@ public class TriangulatedGeometry { private static void addPolygonDataToTriGeom(Collection<? extends Polygon> polygons, Color basePolygonColor, TriangulatedGeometry triGeom) { for (Polygon p : polygons) { + if (p instanceof CompositePolygon){ + continue; + } TesselatedPolygon tp = p.tesselate(); TriangleMesh triMesh = new TriangleMesh(VertexFormat.POINT_TEXCOORD); Map<Vector3d, Integer> indexMap = new HashMap<>();