Commit 3fe565d8 authored by Riegel's avatar Riegel
Browse files

Fix Bugs in parsing and rendering of CompositeSurfaces

2 merge requests!11CityDoctor Release Version 3.16.0,!10CityGML 3.0. Support
Pipeline #10294 passed with stage
in 1 minute and 23 seconds
Showing with 22 additions and 105 deletions
+22 -105
...@@ -14,9 +14,9 @@ import java.io.Serial; ...@@ -14,9 +14,9 @@ import java.io.Serial;
import java.util.*; import java.util.*;
/** /**
* * Dataholding class for parsing and resolving of CompositeSurfaces.
*/ */
public class CompositePolygon extends ConcretePolygon{ public final class CompositePolygon extends ConcretePolygon{
@Serial @Serial
private static final long serialVersionUID = -1867197873443341287L; private static final long serialVersionUID = -1867197873443341287L;
...@@ -25,20 +25,14 @@ public class CompositePolygon extends ConcretePolygon{ ...@@ -25,20 +25,14 @@ public class CompositePolygon extends ConcretePolygon{
private BoundarySurface partOfSurface; private BoundarySurface partOfSurface;
private Installation partOfInstallation; private Installation partOfInstallation;
private List<ConcretePolygon> compositeMembers = new ArrayList<>(); private List<ConcretePolygon> compositeMembers = new ArrayList<>();
private LinearRing exterior = null;
@Override @Override
public Vector3d calculateNormalNormalized() { public Vector3d calculateNormalNormalized() {
return this.calculateNormal().normalize(); return null;
} }
@Override @Override
public void accept(Check c){ public void accept(Check c){}
for (Polygon p : compositeMembers){
p.accept(c);
}
setValidated(true);
}
@Override @Override
public Class<? extends Checkable> getCheckClass() { public Class<? extends Checkable> getCheckClass() {
...@@ -47,33 +41,17 @@ public class CompositePolygon extends ConcretePolygon{ ...@@ -47,33 +41,17 @@ public class CompositePolygon extends ConcretePolygon{
@Override @Override
public boolean containsAnyError(){ public boolean containsAnyError(){
if (super.containsAnyError()){
return true;
}
for (Polygon p : compositeMembers){
if (p.containsAnyError()){
return true;
}
}
return false; return false;
} }
@Override @Override
public void collectContainedErrors(List<CheckError> errors) { public void collectContainedErrors(List<CheckError> errors) {}
super.collectContainedErrors(errors);
for (Polygon p : compositeMembers){
p.collectContainedErrors(errors);
}
}
@Override @Override
public void clearAllContainedCheckResults() { public void clearAllContainedCheckResults() {
super.clearCheckResults();
for (Polygon p : compositeMembers){
p.clearAllContainedCheckResults();
}
} }
public void addCompositeMember(ConcretePolygon p){ public void addCompositeMember(ConcretePolygon p){
compositeMembers.add(p); compositeMembers.add(p);
} }
...@@ -84,15 +62,6 @@ public class CompositePolygon extends ConcretePolygon{ ...@@ -84,15 +62,6 @@ public class CompositePolygon extends ConcretePolygon{
@Override @Override
public boolean containsError(CheckId checkIdentifier) { 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; return false;
} }
...@@ -100,59 +69,27 @@ public class CompositePolygon extends ConcretePolygon{ ...@@ -100,59 +69,27 @@ public class CompositePolygon extends ConcretePolygon{
@Override @Override
public Vector3d calculateNormal() { public Vector3d calculateNormal() {
return this.getExteriorRing().calculateNormal(); return compositeMembers.get(0).calculateNormal();
} }
@Override @Override
public TesselatedPolygon tesselate() { public TesselatedPolygon tesselate() {
List<Triangle3d> tessPolys = new ArrayList<>(); List<Triangle3d> tessPolys = new ArrayList<>();
for (Polygon p : compositeMembers){
TesselatedPolygon t = p.tesselate();
tessPolys.addAll(t.getTriangles());
}
return new TesselatedPolygon(tessPolys,this ); return new TesselatedPolygon(tessPolys,this );
} }
@Override @Override
public LinearRing getExteriorRing() { public LinearRing getExteriorRing() {
if( exterior != null ){ return new LinearRing(LinearRing.LinearRingType.EXTERIOR);
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;
} }
@Override @Override
public List<LinearRing> getInnerRings() { public List<LinearRing> getInnerRings() {
List<LinearRing> innerRings = new ArrayList<>(); return Collections.emptyList();
for (Polygon p : compositeMembers){
innerRings.addAll(p.getInnerRings());
}
return innerRings;
} }
@Override @Override
public boolean isPointInsideExteriorRing(Vector3d v) { public boolean isPointInsideExteriorRing(Vector3d v) {
for (Polygon p : compositeMembers) {
if (p.isPointInsideExteriorRing(v)) {
return true;
}
}
return false; return false;
} }
...@@ -173,11 +110,6 @@ public class CompositePolygon extends ConcretePolygon{ ...@@ -173,11 +110,6 @@ public class CompositePolygon extends ConcretePolygon{
@Override @Override
public boolean isPolygonConnectedViaPoint(Polygon other) { public boolean isPolygonConnectedViaPoint(Polygon other) {
for (Polygon p : compositeMembers) {
if (p.isPolygonConnectedViaPoint(other)) {
return true;
}
}
return false; return false;
} }
...@@ -198,9 +130,6 @@ public class CompositePolygon extends ConcretePolygon{ ...@@ -198,9 +130,6 @@ public class CompositePolygon extends ConcretePolygon{
@Override @Override
public void removeInnerRing(LinearRing ring) { public void removeInnerRing(LinearRing ring) {
for (Polygon p : compositeMembers) {
p.removeInnerRing(ring);
}
} }
@Override @Override
...@@ -215,11 +144,6 @@ public class CompositePolygon extends ConcretePolygon{ ...@@ -215,11 +144,6 @@ public class CompositePolygon extends ConcretePolygon{
@Override @Override
public boolean hasPointAsCorner(Vertex v) { public boolean hasPointAsCorner(Vertex v) {
for (Polygon p : compositeMembers){
if (p.hasPointAsCorner(v)) {
return true;
}
}
return false; return false;
} }
......
...@@ -239,9 +239,6 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -239,9 +239,6 @@ public class Citygml3FeatureMapper extends ObjectWalker {
parseAndAddMultiSurface(as.getLod0MultiSurface(), Lod.LOD0, co); parseAndAddMultiSurface(as.getLod0MultiSurface(), Lod.LOD0, co);
parseAndAddMultiSurface(as.getLod2MultiSurface(), Lod.LOD2, co); parseAndAddMultiSurface(as.getLod2MultiSurface(), Lod.LOD2, co);
parseAndAddMultiSurface(as.getLod3MultiSurface(), Lod.LOD3, 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.getLod1Solid(), Lod.LOD1, co);
parseAndAddSolid(as.getLod2Solid(), Lod.LOD2, co); parseAndAddSolid(as.getLod2Solid(), Lod.LOD2, co);
parseAndAddSolid(as.getLod3Solid(), Lod.LOD3, co); parseAndAddSolid(as.getLod3Solid(), Lod.LOD3, co);
...@@ -718,9 +715,6 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -718,9 +715,6 @@ public class Citygml3FeatureMapper extends ObjectWalker {
parseAndAddMultiSurface(as.getLod0MultiSurface(), Lod.LOD0, co); parseAndAddMultiSurface(as.getLod0MultiSurface(), Lod.LOD0, co);
parseAndAddMultiSurface(as.getLod2MultiSurface(), Lod.LOD2, co); parseAndAddMultiSurface(as.getLod2MultiSurface(), Lod.LOD2, co);
parseAndAddMultiSurface(as.getLod3MultiSurface(), Lod.LOD3, 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.getLod1Solid(), Lod.LOD1, co);
parseAndAddSolid(as.getLod2Solid(), Lod.LOD2, co); parseAndAddSolid(as.getLod2Solid(), Lod.LOD2, co);
parseAndAddSolid(as.getLod3Solid(), Lod.LOD3, co); parseAndAddSolid(as.getLod3Solid(), Lod.LOD3, co);
...@@ -826,7 +820,6 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -826,7 +820,6 @@ public class Citygml3FeatureMapper extends ObjectWalker {
} }
continue; continue;
} }
// TODO: Insert handling of compPoly dummy objects
if (concPoly instanceof CompositePolygon comp) { if (concPoly instanceof CompositePolygon comp) {
resolveCompositePolygon(comp).forEach(geom::addPolygon); resolveCompositePolygon(comp).forEach(geom::addPolygon);
} else { } else {
...@@ -1201,6 +1194,9 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -1201,6 +1194,9 @@ public class Citygml3FeatureMapper extends ObjectWalker {
for (Geometry geom : co.getGeometries()) { for (Geometry geom : co.getGeometries()) {
KDTree tree = new KDTree(); KDTree tree = new KDTree();
for (Polygon poly : geom.getPolygons()) { for (Polygon poly : geom.getPolygons()) {
if (poly instanceof CompositePolygon){
continue;
}
LinearRing lr = poly.getExteriorRing(); LinearRing lr = poly.getExteriorRing();
updateRing(tree, lr); updateRing(tree, lr);
for (LinearRing innerRing : poly.getInnerRings()) { for (LinearRing innerRing : poly.getInnerRings()) {
......
...@@ -31,7 +31,7 @@ MainToolBar.writeReports=Write Reports ...@@ -31,7 +31,7 @@ MainToolBar.writeReports=Write Reports
MainToolBar.executeChecks=Execute Checks MainToolBar.executeChecks=Execute Checks
MainToolBar.showWorld=Show entire city model MainToolBar.showWorld=Show entire city model
MainToolBar.resetCamera=Reset view 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.missingConfig=Could not find configuration file.
MainWindow.loadGivenFile=Loading given file, please wait MainWindow.loadGivenFile=Loading given file, please wait
MainWindow.finishedLoading=Finished loading MainWindow.finishedLoading=Finished loading
......
...@@ -29,7 +29,7 @@ MainToolBar.writeReports=Schreibe Reports ...@@ -29,7 +29,7 @@ MainToolBar.writeReports=Schreibe Reports
MainToolBar.executeChecks=F\u00fchre Pr\u00fcfungen aus MainToolBar.executeChecks=F\u00fchre Pr\u00fcfungen aus
MainToolBar.showWorld=Gesamtes Stadtmodell anzeigen MainToolBar.showWorld=Gesamtes Stadtmodell anzeigen
MainToolBar.resetCamera=Ansicht zur\u00fccksetzen 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.missingConfig=Konnte Konfigurationsdatei nicht finden.
MainWindow.loadGivenFile=Lade vorhandene Datei, bitte warten MainWindow.loadGivenFile=Lade vorhandene Datei, bitte warten
MainWindow.finishedLoading=Fertig geladen MainWindow.finishedLoading=Fertig geladen
......
...@@ -669,6 +669,9 @@ public class Renderer { ...@@ -669,6 +669,9 @@ public class Renderer {
private void addGeometryDataToView(Geometry geom) { private void addGeometryDataToView(Geometry geom) {
for (Polygon p : geom.getPolygons()) { for (Polygon p : geom.getPolygons()) {
if (p instanceof CompositePolygon){
continue;
}
addPolygonToView(p); addPolygonToView(p);
} }
for (Edge e : geom.getEdges()) { for (Edge e : geom.getEdges()) {
...@@ -979,6 +982,7 @@ public class Renderer { ...@@ -979,6 +982,7 @@ public class Renderer {
for (Polygon p : geom.getPolygons()) { for (Polygon p : geom.getPolygons()) {
if (p.getOriginal().getPartOfSurface() != null && if (p.getOriginal().getPartOfSurface() != null &&
!roofFilter.allowedToUse(p.getOriginal().getPartOfSurface(), p.getParent())) continue; !roofFilter.allowedToUse(p.getOriginal().getPartOfSurface(), p.getParent())) continue;
if (p instanceof CompositePolygon) continue;
polygons.add(p.getOriginal()); polygons.add(p.getOriginal());
} }
} }
......
...@@ -6,17 +6,7 @@ import java.util.HashMap; ...@@ -6,17 +6,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface; import de.hft.stuttgart.citydoctor2.datastructure.*;
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.gui.filter.ViewFilter; import de.hft.stuttgart.citydoctor2.gui.filter.ViewFilter;
import de.hft.stuttgart.citydoctor2.math.Triangle3d; import de.hft.stuttgart.citydoctor2.math.Triangle3d;
import de.hft.stuttgart.citydoctor2.math.UnitVector3d; import de.hft.stuttgart.citydoctor2.math.UnitVector3d;
...@@ -62,6 +52,9 @@ public class TriangulatedGeometry { ...@@ -62,6 +52,9 @@ public class TriangulatedGeometry {
private static void addPolygonDataToTriGeom(Collection<? extends Polygon> polygons, Color basePolygonColor, private static void addPolygonDataToTriGeom(Collection<? extends Polygon> polygons, Color basePolygonColor,
TriangulatedGeometry triGeom) { TriangulatedGeometry triGeom) {
for (Polygon p : polygons) { for (Polygon p : polygons) {
if (p instanceof CompositePolygon){
continue;
}
TesselatedPolygon tp = p.tesselate(); TesselatedPolygon tp = p.tesselate();
TriangleMesh triMesh = new TriangleMesh(VertexFormat.POINT_TEXCOORD); TriangleMesh triMesh = new TriangleMesh(VertexFormat.POINT_TEXCOORD);
Map<Vector3d, Integer> indexMap = new HashMap<>(); Map<Vector3d, Integer> indexMap = new HashMap<>();
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment