Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
CityDoctor
CityDoctor2
Commits
3fe565d8
Commit
3fe565d8
authored
Oct 29, 2024
by
Riegel
Browse files
Fix Bugs in parsing and rendering of CompositeSurfaces
parent
c0a82926
Pipeline
#10294
passed with stage
in 1 minute and 23 seconds
Changes
6
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CompositePolygon.java
View file @
3fe565d8
...
@@ -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
;
}
}
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/mapper/citygml3/Citygml3FeatureMapper.java
View file @
3fe565d8
...
@@ -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
())
{
...
...
CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization.properties
View file @
3fe565d8
...
@@ -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 roof
s 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
...
...
CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization_de.properties
View file @
3fe565d8
...
@@ -29,7 +29,7 @@ MainToolBar.writeReports=Schreibe Reports
...
@@ -29,7 +29,7 @@ MainToolBar.writeReports=Schreibe Reports
MainToolBar.executeChecks
=
F
\u
00fchre Pr
\u
00fcfungen aus
MainToolBar.executeChecks
=
F
\u
00fchre Pr
\u
00fcfungen aus
MainToolBar.showWorld
=
Gesamtes Stadtmodell anzeigen
MainToolBar.showWorld
=
Gesamtes Stadtmodell anzeigen
MainToolBar.resetCamera
=
Ansicht zur
\u
00fccksetzen
MainToolBar.resetCamera
=
Ansicht zur
\u
00fccksetzen
MainToolBar.hideRoof
=
Zeige/Verstecke D
\u
00e4cher in Objektansicht
MainToolBar.hideRoof
=
Zeige/Verstecke D
ach 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
...
...
CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/Renderer.java
View file @
3fe565d8
...
@@ -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
());
}
}
}
}
...
...
CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/TriangulatedGeometry.java
View file @
3fe565d8
...
@@ -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
<>();
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment