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;
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;
}
......
......@@ -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()) {
......
......@@ -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
......
......@@ -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
......
......@@ -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());
}
}
......
......@@ -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<>();
......
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