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;
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
;
}
...
...
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 {
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
())
{
...
...
CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization.properties
View file @
3fe565d8
...
...
@@ -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 roof
s 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
...
...
CityDoctorParent/CityDoctorModel/src/main/resources/CityDoctorLocalization_de.properties
View file @
3fe565d8
...
...
@@ -29,7 +29,7 @@ MainToolBar.writeReports=Schreibe Reports
MainToolBar.executeChecks
=
F
\u
00fchre Pr
\u
00fcfungen aus
MainToolBar.showWorld
=
Gesamtes Stadtmodell anzeigen
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.loadGivenFile
=
Lade vorhandene Datei, bitte warten
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 {
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
());
}
}
...
...
CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/TriangulatedGeometry.java
View file @
3fe565d8
...
...
@@ -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
<>();
...
...
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