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
02de0a22
Commit
02de0a22
authored
Oct 30, 2024
by
Riegel
Browse files
Reformat code
parent
ad3589e8
Pipeline
#10297
passed with stage
in 1 minute and 5 seconds
Changes
61
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractBuilding.java
View file @
02de0a22
/*-
* Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart
*
*
* This file is part of CityDoctor2.
*
* CityDoctor2 is free software: you can redistribute it and/or modify
...
...
@@ -18,10 +18,13 @@
*/
package
de.hft.stuttgart.citydoctor2.datastructure
;
import
java.io.Serial
;
import
java.util.ArrayList
;
import
java.util.List
;
import
de.hft.stuttgart.citydoctor2.check.Check
;
import
de.hft.stuttgart.citydoctor2.check.CheckError
;
import
de.hft.stuttgart.citydoctor2.check.CheckId
;
import
de.hft.stuttgart.citydoctor2.parser.ParserConfiguration
;
import
de.hft.stuttgart.citydoctor2.utils.CityGmlUtils
;
import
de.hft.stuttgart.citydoctor2.utils.CopyHandler
;
import
de.hft.stuttgart.citydoctor2.utils.Copyable
;
import
org.apache.logging.log4j.LogManager
;
import
org.apache.logging.log4j.Logger
;
import
org.citygml4j.core.model.core.AbstractSpaceBoundaryProperty
;
...
...
@@ -31,461 +34,456 @@ import org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty;
import
org.xmlobjects.gml.model.geometry.primitives.Solid
;
import
org.xmlobjects.gml.model.geometry.primitives.SolidProperty
;
import
de.hft.stuttgart.citydoctor2.check.Check
;
import
de.hft.stuttgart.citydoctor2.check.CheckError
;
import
de.hft.stuttgart.citydoctor2.check.CheckId
;
import
de.hft.stuttgart.citydoctor2.parser.ParserConfiguration
;
import
de.hft.stuttgart.citydoctor2.utils.CityGmlUtils
;
import
de.hft.stuttgart.citydoctor2.utils.CopyHandler
;
import
de.hft.stuttgart.citydoctor2.utils.Copyable
;
import
java.io.Serial
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* Container for attributes of an abstract building. It can be a Building or
* BuildingPart.
*
* @author Matthias Betz
*
* @author Matthias Betz
*/
public
abstract
class
AbstractBuilding
extends
CityObject
{
@Serial
private
static
final
long
serialVersionUID
=
-
2196414503088741206L
;
private
static
final
Logger
logger
=
LogManager
.
getLogger
(
AbstractBuilding
.
class
);
private
final
List
<
Installation
>
buildingInstallations
=
new
ArrayList
<>(
2
);
private
final
List
<
BoundarySurface
>
boundarySurfaceList
=
new
ArrayList
<>();
private
final
List
<
BuildingRoom
>
buildingRooms
=
new
ArrayList
<>();
private
final
List
<
Storey
>
buildingStoreys
=
new
ArrayList
<>();
private
final
List
<
BuildingUnit
>
buildingUnits
=
new
ArrayList
<>();
private
final
List
<
BuildingRoomFurniture
>
buildingRoomFurnitureList
=
new
ArrayList
<>();
private
org
.
citygml4j
.
core
.
model
.
building
.
AbstractBuilding
ab
;
/**
* Getter for all boundary surfaces contained in this building.
*
* @return the boundary surfaces
*/
public
List
<
BoundarySurface
>
getBoundarySurfaces
()
{
return
boundarySurfaceList
;
}
@Override
public
org
.
citygml4j
.
core
.
model
.
building
.
AbstractBuilding
getGmlObject
()
{
return
ab
;
}
@Override
public
FeatureType
getFeatureType
()
{
return
FeatureType
.
BUILDING
;
}
@Override
public
void
unsetGmlGeometries
()
{
ab
.
setLod1Solid
(
null
);
ab
.
setLod2Solid
(
null
);
ab
.
setLod3Solid
(
null
);
ab
.
setLod2MultiSurface
(
null
);
ab
.
setLod3MultiSurface
(
null
);
ab
.
getDeprecatedProperties
().
setLod1MultiSurface
(
null
);
ab
.
getDeprecatedProperties
().
setLod4MultiSurface
(
null
);
ab
.
getDeprecatedProperties
().
setLod4Solid
(
null
);
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
bs
.
unsetGmlGeometries
();
}
for
(
Installation
bi
:
buildingInstallations
)
{
bi
.
unsetGmlGeometries
();
}
for
(
BuildingRoom
br
:
buildingRooms
)
{
br
.
unsetGmlGeometries
();
}
for
(
BuildingRoomFurniture
bfr
:
buildingRoomFurnitureList
)
{
bfr
.
unsetGmlGeometries
();
}
for
(
Storey
storey
:
buildingStoreys
)
{
storey
.
unsetGmlGeometries
();
}
for
(
BuildingUnit
bu
:
buildingUnits
)
{
bu
.
unsetGmlGeometries
();
}
}
@Override
public
void
reCreateGeometries
(
GeometryFactory
factory
,
ParserConfiguration
config
)
{
for
(
Geometry
geom
:
getGeometries
())
{
if
(
geom
instanceof
ImplicitGeometryHolder
){
continue
;
}
if
(
geom
.
getType
()
==
GeometryType
.
MULTI_SURFACE
)
{
MultiSurface
ms
=
CityGmlUtils
.
createMultiSurface
(
geom
,
factory
,
config
);
setMultiSurfaceAccordingToLod
(
geom
,
ms
);
}
else
{
Solid
solid
=
CityGmlUtils
.
createSolid
(
geom
,
factory
,
config
);
setSolidAccordingToLod
(
geom
,
solid
);
}
}
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
reCreateBoundarySurface
(
factory
,
config
,
bs
);
}
for
(
Installation
bi
:
buildingInstallations
)
{
bi
.
reCreateGeometries
(
factory
,
config
);
}
for
(
BuildingRoom
br
:
buildingRooms
)
{
br
.
reCreateGeometries
(
factory
,
config
);
}
for
(
BuildingRoomFurniture
bfr
:
buildingRoomFurnitureList
)
{
bfr
.
reCreateGeometries
(
factory
,
config
);
}
for
(
Storey
storey
:
buildingStoreys
)
{
storey
.
reCreateGeometries
(
factory
,
config
);
}
for
(
BuildingUnit
bu
:
buildingUnits
)
{
bu
.
reCreateGeometries
(
factory
,
config
);
}
}
private
void
reCreateBoundarySurface
(
GeometryFactory
factory
,
ParserConfiguration
config
,
BoundarySurface
bs
)
{
if
(
bs
.
getGeometries
().
isEmpty
())
{
for
(
AbstractSpaceBoundaryProperty
bsp
:
ab
.
getBoundaries
())
{
if
(
bsp
.
getObject
()
!=
null
&&
bsp
.
getObject
()
==
bs
.
getGmlObject
())
{
logger
.
warn
(
"Found empty boundary surface: {}, removing from building"
,
bs
.
getGmlId
());
ab
.
getBoundaries
().
remove
(
bsp
);
break
;
}
}
return
;
}
bs
.
reCreateGeometries
(
factory
,
config
);
}
private
void
setMultiSurfaceAccordingToLod
(
Geometry
geom
,
MultiSurface
ms
)
{
switch
(
geom
.
getLod
())
{
case
LOD0:
ab
.
setLod0MultiSurface
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD1:
ab
.
getDeprecatedProperties
().
setLod1MultiSurface
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD2:
ab
.
setLod2MultiSurface
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD3:
ab
.
setLod3MultiSurface
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD4:
ab
.
getDeprecatedProperties
().
setLod4MultiSurface
(
new
MultiSurfaceProperty
(
ms
));
break
;
default
:
throw
new
IllegalStateException
(
"Cannot add "
+
geom
.
getLod
()
+
" multi surface to buildings"
);
}
}
private
void
setSolidAccordingToLod
(
Geometry
geom
,
Solid
solid
)
{
switch
(
geom
.
getLod
())
{
case
LOD1:
ab
.
setLod1Solid
(
new
SolidProperty
(
solid
));
break
;
case
LOD2:
ab
.
setLod2Solid
(
new
SolidProperty
(
solid
));
break
;
case
LOD3:
ab
.
setLod3Solid
(
new
SolidProperty
(
solid
));
break
;
case
LOD4:
ab
.
getDeprecatedProperties
().
setLod4Solid
(
new
SolidProperty
(
solid
));
break
;
default
:
throw
new
IllegalStateException
(
"Cannot add "
+
geom
.
getLod
()
+
" solid to buildings"
);
}
}
@Override
public
void
accept
(
Check
c
)
{
super
.
accept
(
c
);
if
(
c
.
canExecute
(
this
))
{
c
.
check
(
this
);
}
for
(
Installation
bi
:
buildingInstallations
)
{
bi
.
accept
(
c
);
}
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
bs
.
accept
(
c
);
}
for
(
BuildingRoom
br
:
buildingRooms
)
{
br
.
accept
(
c
);
}
for
(
BuildingRoomFurniture
bfr
:
buildingRoomFurnitureList
)
{
bfr
.
accept
(
c
);
}
for
(
Storey
storey
:
buildingStoreys
)
{
storey
.
accept
(
c
);
}
for
(
BuildingUnit
bu
:
buildingUnits
)
{
bu
.
accept
(
c
);
}
}
@Override
public
void
collectContainedErrors
(
List
<
CheckError
>
errors
)
{
super
.
collectContainedErrors
(
errors
);
for
(
Installation
bi
:
buildingInstallations
)
{
bi
.
collectContainedErrors
(
errors
);
}
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
bs
.
collectContainedErrors
(
errors
);
}
for
(
BuildingRoom
br
:
buildingRooms
)
{
br
.
collectContainedErrors
(
errors
);
}
for
(
BuildingRoomFurniture
bfr
:
buildingRoomFurnitureList
)
{
bfr
.
collectContainedErrors
(
errors
);
}
for
(
Storey
storey
:
buildingStoreys
)
{
storey
.
collectContainedErrors
(
errors
);
}
for
(
BuildingUnit
bu
:
buildingUnits
)
{
bu
.
collectContainedErrors
(
errors
);
}
}
@Override
public
void
clearAllContainedCheckResults
()
{
super
.
clearAllContainedCheckResults
();
for
(
Installation
bi
:
buildingInstallations
)
{
bi
.
clearAllContainedCheckResults
();
}
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
bs
.
clearAllContainedCheckResults
();
}
for
(
BuildingRoom
br
:
buildingRooms
)
{
br
.
clearAllContainedCheckResults
();
}
for
(
BuildingRoomFurniture
bfr
:
buildingRoomFurnitureList
)
{
bfr
.
clearAllContainedCheckResults
();
}
for
(
Storey
storey
:
buildingStoreys
)
{
storey
.
clearAllContainedCheckResults
();
}
for
(
BuildingUnit
bu
:
buildingUnits
)
{
bu
.
clearAllContainedCheckResults
();
}
}
@Override
public
boolean
containsError
(
CheckId
checkIdentifier
)
{
boolean
hasError
=
super
.
containsError
(
checkIdentifier
);
if
(
hasError
)
{
return
true
;
}
for
(
Installation
bi
:
buildingInstallations
)
{
if
(
bi
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
if
(
bs
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
for
(
BuildingRoom
br
:
buildingRooms
)
{
if
(
br
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
for
(
BuildingRoomFurniture
bfr
:
buildingRoomFurnitureList
)
{
if
(
bfr
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
for
(
Storey
storey
:
buildingStoreys
)
{
if
(
storey
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
for
(
BuildingUnit
bu
:
buildingUnits
)
{
if
(
bu
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
return
false
;
}
@Override
public
boolean
containsAnyError
()
{
boolean
hasError
=
super
.
containsAnyError
();
if
(
hasError
)
{
return
true
;
}
for
(
Installation
bi
:
buildingInstallations
)
{
if
(
bi
.
containsAnyError
())
{
return
true
;
}
}
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
if
(
bs
.
containsAnyError
())
{
return
true
;
}
}
for
(
BuildingRoom
br
:
buildingRooms
)
{
if
(
br
.
containsAnyError
())
{
return
true
;
}
}
for
(
BuildingRoomFurniture
bfr
:
buildingRoomFurnitureList
)
{
if
(
bfr
.
containsAnyError
())
{
return
true
;
}
}
for
(
Storey
storey
:
buildingStoreys
)
{
if
(
storey
.
containsAnyError
())
{
return
true
;
}
}
for
(
BuildingUnit
bu
:
buildingUnits
)
{
if
(
bu
.
containsAnyError
())
{
return
true
;
}
}
return
false
;
}
void
setCityGmlBuilding
(
org
.
citygml4j
.
core
.
model
.
building
.
AbstractBuilding
ab
)
{
this
.
ab
=
ab
;
}
public
void
addBoundarySurface
(
BoundarySurface
bs
)
{
boundarySurfaceList
.
add
(
bs
);
bs
.
setParent
(
this
);
}
public
void
addBuildingInstallation
(
Installation
coBi
)
{
buildingInstallations
.
add
(
coBi
);
coBi
.
setParent
(
this
);
}
public
void
addBuildingRoom
(
BuildingRoom
room
)
{
buildingRooms
.
add
(
room
);
room
.
setParent
(
this
);
}
public
void
addBuildingRoomFurniture
(
BuildingRoomFurniture
roomFurniture
)
{
buildingRoomFurnitureList
.
add
(
roomFurniture
);
roomFurniture
.
setParent
(
this
);
}
public
void
addStorey
(
Storey
storey
)
{
buildingStoreys
.
add
(
storey
);
}
public
void
addBuildingUnit
(
BuildingUnit
buildingUnit
)
{
buildingUnits
.
add
(
buildingUnit
);
}
public
void
setGmlObject
(
org
.
citygml4j
.
core
.
model
.
building
.
AbstractBuilding
ab
)
{
this
.
ab
=
ab
;
}
public
List
<
Installation
>
getBuildingInstallations
()
{
return
buildingInstallations
;
}
public
List
<
BuildingRoom
>
getBuildingRooms
()
{
return
buildingRooms
;
}
public
List
<
BuildingRoomFurniture
>
getBuildingRoomFurnitureList
()
{
return
buildingRoomFurnitureList
;
}
public
List
<
Storey
>
getBuildingStoreys
()
{
return
buildingStoreys
;
}
public
List
<
BuildingUnit
>
getBuildingUnits
()
{
return
buildingUnits
;
}
@Override
public
void
prepareForChecking
()
{
super
.
prepareForChecking
();
for
(
Installation
bi
:
buildingInstallations
)
{
bi
.
prepareForChecking
();
}
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
bs
.
prepareForChecking
();
}
for
(
BuildingRoom
br
:
buildingRooms
)
{
br
.
prepareForChecking
();
}
for
(
BuildingRoomFurniture
bfr
:
buildingRoomFurnitureList
)
{
bfr
.
prepareForChecking
();
}
for
(
Storey
storey
:
buildingStoreys
)
{
storey
.
prepareForChecking
();
}
for
(
BuildingUnit
bu
:
buildingUnits
)
{
bu
.
prepareForChecking
();
}
}
@Override
public
void
clearMetaInformation
()
{
super
.
clearMetaInformation
();
for
(
Installation
bi
:
buildingInstallations
)
{
bi
.
clearMetaInformation
();
}
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
bs
.
clearMetaInformation
();
}
for
(
BuildingRoom
br
:
buildingRooms
)
{
br
.
clearMetaInformation
();
}
for
(
BuildingRoomFurniture
bfr
:
buildingRoomFurnitureList
)
{
bfr
.
clearMetaInformation
();
}
for
(
Storey
storey
:
buildingStoreys
)
{
storey
.
clearMetaInformation
();
}
for
(
BuildingUnit
bu
:
buildingUnits
)
{
bu
.
clearMetaInformation
();
}
}
@Override
public
void
collectInstances
(
CopyHandler
handler
)
{
super
.
collectInstances
(
handler
);
handler
.
addInstance
(
boundarySurfaceList
);
handler
.
addInstance
(
buildingInstallations
);
handler
.
addInstance
(
buildingRooms
);
handler
.
addInstance
(
buildingRoomFurnitureList
);
handler
.
addInstance
(
buildingStoreys
);
handler
.
addInstance
(
buildingUnits
);
}
@Override
public
void
fillValues
(
Copyable
original
,
CopyHandler
handler
)
{
super
.
fillValues
(
original
,
handler
);
AbstractBuilding
originalAb
=
(
AbstractBuilding
)
original
;
for
(
BoundarySurface
originalBs
:
originalAb
.
boundarySurfaceList
)
{
boundarySurfaceList
.
add
(
handler
.
getCopyInstance
(
originalBs
));
}
for
(
Installation
originalBi
:
originalAb
.
buildingInstallations
)
{
buildingInstallations
.
add
(
handler
.
getCopyInstance
(
originalBi
));
}
for
(
BuildingRoom
originalBr
:
originalAb
.
buildingRooms
)
{
buildingRooms
.
add
(
handler
.
getCopyInstance
(
originalBr
));
}
for
(
BuildingRoomFurniture
originalBFR
:
originalAb
.
buildingRoomFurnitureList
)
{
buildingRoomFurnitureList
.
add
(
handler
.
getCopyInstance
(
originalBFR
));
}
for
(
Storey
originalBStoreys
:
originalAb
.
buildingStoreys
)
{
buildingStoreys
.
add
(
handler
.
getCopyInstance
(
originalBStoreys
));
}
for
(
BuildingUnit
originalBun
:
originalAb
.
buildingUnits
)
{
buildingUnits
.
add
(
handler
.
getCopyInstance
(
originalBun
));
}
ab
=
originalAb
.
ab
;
}
@Serial
private
static
final
long
serialVersionUID
=
-
2196414503088741206L
;
private
static
final
Logger
logger
=
LogManager
.
getLogger
(
AbstractBuilding
.
class
);
private
final
List
<
Installation
>
buildingInstallations
=
new
ArrayList
<>(
2
);
private
final
List
<
BoundarySurface
>
boundarySurfaceList
=
new
ArrayList
<>();
private
final
List
<
BuildingRoom
>
buildingRooms
=
new
ArrayList
<>();
private
final
List
<
Storey
>
buildingStoreys
=
new
ArrayList
<>();
private
final
List
<
BuildingUnit
>
buildingUnits
=
new
ArrayList
<>();
private
final
List
<
BuildingRoomFurniture
>
buildingRoomFurnitureList
=
new
ArrayList
<>();
private
org
.
citygml4j
.
core
.
model
.
building
.
AbstractBuilding
ab
;
/**
* Getter for all boundary surfaces contained in this building.
*
* @return the boundary surfaces
*/
public
List
<
BoundarySurface
>
getBoundarySurfaces
()
{
return
boundarySurfaceList
;
}
@Override
public
org
.
citygml4j
.
core
.
model
.
building
.
AbstractBuilding
getGmlObject
()
{
return
ab
;
}
@Override
public
FeatureType
getFeatureType
()
{
return
FeatureType
.
BUILDING
;
}
@Override
public
void
unsetGmlGeometries
()
{
ab
.
setLod1Solid
(
null
);
ab
.
setLod2Solid
(
null
);
ab
.
setLod3Solid
(
null
);
ab
.
setLod2MultiSurface
(
null
);
ab
.
setLod3MultiSurface
(
null
);
ab
.
getDeprecatedProperties
().
setLod1MultiSurface
(
null
);
ab
.
getDeprecatedProperties
().
setLod4MultiSurface
(
null
);
ab
.
getDeprecatedProperties
().
setLod4Solid
(
null
);
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
bs
.
unsetGmlGeometries
();
}
for
(
Installation
bi
:
buildingInstallations
)
{
bi
.
unsetGmlGeometries
();
}
for
(
BuildingRoom
br
:
buildingRooms
)
{
br
.
unsetGmlGeometries
();
}
for
(
BuildingRoomFurniture
bfr
:
buildingRoomFurnitureList
)
{
bfr
.
unsetGmlGeometries
();
}
for
(
Storey
storey
:
buildingStoreys
)
{
storey
.
unsetGmlGeometries
();
}
for
(
BuildingUnit
bu
:
buildingUnits
)
{
bu
.
unsetGmlGeometries
();
}
}
@Override
public
void
reCreateGeometries
(
GeometryFactory
factory
,
ParserConfiguration
config
)
{
for
(
Geometry
geom
:
getGeometries
())
{
if
(
geom
instanceof
ImplicitGeometryHolder
)
{
continue
;
}
if
(
geom
.
getType
()
==
GeometryType
.
MULTI_SURFACE
)
{
MultiSurface
ms
=
CityGmlUtils
.
createMultiSurface
(
geom
,
factory
,
config
);
setMultiSurfaceAccordingToLod
(
geom
,
ms
);
}
else
{
Solid
solid
=
CityGmlUtils
.
createSolid
(
geom
,
factory
,
config
);
setSolidAccordingToLod
(
geom
,
solid
);
}
}
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
reCreateBoundarySurface
(
factory
,
config
,
bs
);
}
for
(
Installation
bi
:
buildingInstallations
)
{
bi
.
reCreateGeometries
(
factory
,
config
);
}
for
(
BuildingRoom
br
:
buildingRooms
)
{
br
.
reCreateGeometries
(
factory
,
config
);
}
for
(
BuildingRoomFurniture
bfr
:
buildingRoomFurnitureList
)
{
bfr
.
reCreateGeometries
(
factory
,
config
);
}
for
(
Storey
storey
:
buildingStoreys
)
{
storey
.
reCreateGeometries
(
factory
,
config
);
}
for
(
BuildingUnit
bu
:
buildingUnits
)
{
bu
.
reCreateGeometries
(
factory
,
config
);
}
}
private
void
reCreateBoundarySurface
(
GeometryFactory
factory
,
ParserConfiguration
config
,
BoundarySurface
bs
)
{
if
(
bs
.
getGeometries
().
isEmpty
())
{
for
(
AbstractSpaceBoundaryProperty
bsp
:
ab
.
getBoundaries
())
{
if
(
bsp
.
getObject
()
!=
null
&&
bsp
.
getObject
()
==
bs
.
getGmlObject
())
{
logger
.
warn
(
"Found empty boundary surface: {}, removing from building"
,
bs
.
getGmlId
());
ab
.
getBoundaries
().
remove
(
bsp
);
break
;
}
}
return
;
}
bs
.
reCreateGeometries
(
factory
,
config
);
}
private
void
setMultiSurfaceAccordingToLod
(
Geometry
geom
,
MultiSurface
ms
)
{
switch
(
geom
.
getLod
())
{
case
LOD0:
ab
.
setLod0MultiSurface
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD1:
ab
.
getDeprecatedProperties
().
setLod1MultiSurface
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD2:
ab
.
setLod2MultiSurface
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD3:
ab
.
setLod3MultiSurface
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD4:
ab
.
getDeprecatedProperties
().
setLod4MultiSurface
(
new
MultiSurfaceProperty
(
ms
));
break
;
default
:
throw
new
IllegalStateException
(
"Cannot add "
+
geom
.
getLod
()
+
" multi surface to buildings"
);
}
}
private
void
setSolidAccordingToLod
(
Geometry
geom
,
Solid
solid
)
{
switch
(
geom
.
getLod
())
{
case
LOD1:
ab
.
setLod1Solid
(
new
SolidProperty
(
solid
));
break
;
case
LOD2:
ab
.
setLod2Solid
(
new
SolidProperty
(
solid
));
break
;
case
LOD3:
ab
.
setLod3Solid
(
new
SolidProperty
(
solid
));
break
;
case
LOD4:
ab
.
getDeprecatedProperties
().
setLod4Solid
(
new
SolidProperty
(
solid
));
break
;
default
:
throw
new
IllegalStateException
(
"Cannot add "
+
geom
.
getLod
()
+
" solid to buildings"
);
}
}
@Override
public
void
accept
(
Check
c
)
{
super
.
accept
(
c
);
if
(
c
.
canExecute
(
this
))
{
c
.
check
(
this
);
}
for
(
Installation
bi
:
buildingInstallations
)
{
bi
.
accept
(
c
);
}
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
bs
.
accept
(
c
);
}
for
(
BuildingRoom
br
:
buildingRooms
)
{
br
.
accept
(
c
);
}
for
(
BuildingRoomFurniture
bfr
:
buildingRoomFurnitureList
)
{
bfr
.
accept
(
c
);
}
for
(
Storey
storey
:
buildingStoreys
)
{
storey
.
accept
(
c
);
}
for
(
BuildingUnit
bu
:
buildingUnits
)
{
bu
.
accept
(
c
);
}
}
@Override
public
void
collectContainedErrors
(
List
<
CheckError
>
errors
)
{
super
.
collectContainedErrors
(
errors
);
for
(
Installation
bi
:
buildingInstallations
)
{
bi
.
collectContainedErrors
(
errors
);
}
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
bs
.
collectContainedErrors
(
errors
);
}
for
(
BuildingRoom
br
:
buildingRooms
)
{
br
.
collectContainedErrors
(
errors
);
}
for
(
BuildingRoomFurniture
bfr
:
buildingRoomFurnitureList
)
{
bfr
.
collectContainedErrors
(
errors
);
}
for
(
Storey
storey
:
buildingStoreys
)
{
storey
.
collectContainedErrors
(
errors
);
}
for
(
BuildingUnit
bu
:
buildingUnits
)
{
bu
.
collectContainedErrors
(
errors
);
}
}
@Override
public
void
clearAllContainedCheckResults
()
{
super
.
clearAllContainedCheckResults
();
for
(
Installation
bi
:
buildingInstallations
)
{
bi
.
clearAllContainedCheckResults
();
}
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
bs
.
clearAllContainedCheckResults
();
}
for
(
BuildingRoom
br
:
buildingRooms
)
{
br
.
clearAllContainedCheckResults
();
}
for
(
BuildingRoomFurniture
bfr
:
buildingRoomFurnitureList
)
{
bfr
.
clearAllContainedCheckResults
();
}
for
(
Storey
storey
:
buildingStoreys
)
{
storey
.
clearAllContainedCheckResults
();
}
for
(
BuildingUnit
bu
:
buildingUnits
)
{
bu
.
clearAllContainedCheckResults
();
}
}
@Override
public
boolean
containsError
(
CheckId
checkIdentifier
)
{
boolean
hasError
=
super
.
containsError
(
checkIdentifier
);
if
(
hasError
)
{
return
true
;
}
for
(
Installation
bi
:
buildingInstallations
)
{
if
(
bi
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
if
(
bs
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
for
(
BuildingRoom
br
:
buildingRooms
)
{
if
(
br
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
for
(
BuildingRoomFurniture
bfr
:
buildingRoomFurnitureList
)
{
if
(
bfr
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
for
(
Storey
storey
:
buildingStoreys
)
{
if
(
storey
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
for
(
BuildingUnit
bu
:
buildingUnits
)
{
if
(
bu
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
return
false
;
}
@Override
public
boolean
containsAnyError
()
{
boolean
hasError
=
super
.
containsAnyError
();
if
(
hasError
)
{
return
true
;
}
for
(
Installation
bi
:
buildingInstallations
)
{
if
(
bi
.
containsAnyError
())
{
return
true
;
}
}
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
if
(
bs
.
containsAnyError
())
{
return
true
;
}
}
for
(
BuildingRoom
br
:
buildingRooms
)
{
if
(
br
.
containsAnyError
())
{
return
true
;
}
}
for
(
BuildingRoomFurniture
bfr
:
buildingRoomFurnitureList
)
{
if
(
bfr
.
containsAnyError
())
{
return
true
;
}
}
for
(
Storey
storey
:
buildingStoreys
)
{
if
(
storey
.
containsAnyError
())
{
return
true
;
}
}
for
(
BuildingUnit
bu
:
buildingUnits
)
{
if
(
bu
.
containsAnyError
())
{
return
true
;
}
}
return
false
;
}
void
setCityGmlBuilding
(
org
.
citygml4j
.
core
.
model
.
building
.
AbstractBuilding
ab
)
{
this
.
ab
=
ab
;
}
public
void
addBoundarySurface
(
BoundarySurface
bs
)
{
boundarySurfaceList
.
add
(
bs
);
bs
.
setParent
(
this
);
}
public
void
addBuildingInstallation
(
Installation
coBi
)
{
buildingInstallations
.
add
(
coBi
);
coBi
.
setParent
(
this
);
}
public
void
addBuildingRoom
(
BuildingRoom
room
)
{
buildingRooms
.
add
(
room
);
room
.
setParent
(
this
);
}
public
void
addBuildingRoomFurniture
(
BuildingRoomFurniture
roomFurniture
)
{
buildingRoomFurnitureList
.
add
(
roomFurniture
);
roomFurniture
.
setParent
(
this
);
}
public
void
addStorey
(
Storey
storey
)
{
buildingStoreys
.
add
(
storey
);
}
public
void
addBuildingUnit
(
BuildingUnit
buildingUnit
)
{
buildingUnits
.
add
(
buildingUnit
);
}
public
void
setGmlObject
(
org
.
citygml4j
.
core
.
model
.
building
.
AbstractBuilding
ab
)
{
this
.
ab
=
ab
;
}
public
List
<
Installation
>
getBuildingInstallations
()
{
return
buildingInstallations
;
}
public
List
<
BuildingRoom
>
getBuildingRooms
()
{
return
buildingRooms
;
}
public
List
<
BuildingRoomFurniture
>
getBuildingRoomFurnitureList
()
{
return
buildingRoomFurnitureList
;
}
public
List
<
Storey
>
getBuildingStoreys
()
{
return
buildingStoreys
;
}
public
List
<
BuildingUnit
>
getBuildingUnits
()
{
return
buildingUnits
;
}
@Override
public
void
prepareForChecking
()
{
super
.
prepareForChecking
();
for
(
Installation
bi
:
buildingInstallations
)
{
bi
.
prepareForChecking
();
}
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
bs
.
prepareForChecking
();
}
for
(
BuildingRoom
br
:
buildingRooms
)
{
br
.
prepareForChecking
();
}
for
(
BuildingRoomFurniture
bfr
:
buildingRoomFurnitureList
)
{
bfr
.
prepareForChecking
();
}
for
(
Storey
storey
:
buildingStoreys
)
{
storey
.
prepareForChecking
();
}
for
(
BuildingUnit
bu
:
buildingUnits
)
{
bu
.
prepareForChecking
();
}
}
@Override
public
void
clearMetaInformation
()
{
super
.
clearMetaInformation
();
for
(
Installation
bi
:
buildingInstallations
)
{
bi
.
clearMetaInformation
();
}
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
bs
.
clearMetaInformation
();
}
for
(
BuildingRoom
br
:
buildingRooms
)
{
br
.
clearMetaInformation
();
}
for
(
BuildingRoomFurniture
bfr
:
buildingRoomFurnitureList
)
{
bfr
.
clearMetaInformation
();
}
for
(
Storey
storey
:
buildingStoreys
)
{
storey
.
clearMetaInformation
();
}
for
(
BuildingUnit
bu
:
buildingUnits
)
{
bu
.
clearMetaInformation
();
}
}
@Override
public
void
collectInstances
(
CopyHandler
handler
)
{
super
.
collectInstances
(
handler
);
handler
.
addInstance
(
boundarySurfaceList
);
handler
.
addInstance
(
buildingInstallations
);
handler
.
addInstance
(
buildingRooms
);
handler
.
addInstance
(
buildingRoomFurnitureList
);
handler
.
addInstance
(
buildingStoreys
);
handler
.
addInstance
(
buildingUnits
);
}
@Override
public
void
fillValues
(
Copyable
original
,
CopyHandler
handler
)
{
super
.
fillValues
(
original
,
handler
);
AbstractBuilding
originalAb
=
(
AbstractBuilding
)
original
;
for
(
BoundarySurface
originalBs
:
originalAb
.
boundarySurfaceList
)
{
boundarySurfaceList
.
add
(
handler
.
getCopyInstance
(
originalBs
));
}
for
(
Installation
originalBi
:
originalAb
.
buildingInstallations
)
{
buildingInstallations
.
add
(
handler
.
getCopyInstance
(
originalBi
));
}
for
(
BuildingRoom
originalBr
:
originalAb
.
buildingRooms
)
{
buildingRooms
.
add
(
handler
.
getCopyInstance
(
originalBr
));
}
for
(
BuildingRoomFurniture
originalBFR
:
originalAb
.
buildingRoomFurnitureList
)
{
buildingRoomFurnitureList
.
add
(
handler
.
getCopyInstance
(
originalBFR
));
}
for
(
Storey
originalBStoreys
:
originalAb
.
buildingStoreys
)
{
buildingStoreys
.
add
(
handler
.
getCopyInstance
(
originalBStoreys
));
}
for
(
BuildingUnit
originalBun
:
originalAb
.
buildingUnits
)
{
buildingUnits
.
add
(
handler
.
getCopyInstance
(
originalBun
));
}
ab
=
originalAb
.
ab
;
}
}
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractBuildingSubdivision.java
View file @
02de0a22
...
...
@@ -20,7 +20,7 @@ import java.io.Serial;
import
java.util.ArrayList
;
import
java.util.List
;
public
abstract
class
AbstractBuildingSubdivision
extends
CityObject
{
public
abstract
class
AbstractBuildingSubdivision
extends
CityObject
{
@Serial
private
static
final
long
serialVersionUID
=
7033994252340571002L
;
...
...
@@ -77,7 +77,7 @@ public abstract class AbstractBuildingSubdivision extends CityObject{
@Override
public
void
reCreateGeometries
(
GeometryFactory
factory
,
ParserConfiguration
config
)
{
for
(
Geometry
geom
:
getGeometries
())
{
if
(
geom
instanceof
ImplicitGeometryHolder
){
if
(
geom
instanceof
ImplicitGeometryHolder
)
{
continue
;
}
if
(
geom
.
getType
()
==
GeometryType
.
MULTI_SURFACE
)
{
...
...
@@ -285,7 +285,6 @@ public abstract class AbstractBuildingSubdivision extends CityObject{
}
public
void
setGmlObject
(
org
.
citygml4j
.
core
.
model
.
building
.
AbstractBuildingSubdivision
abs
)
{
this
.
abs
=
abs
;
}
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractFurniture.java
View file @
02de0a22
...
...
@@ -20,7 +20,7 @@ import java.util.List;
/**
* Represents all types of furniture used inside Buildings.
*/
public
abstract
class
AbstractFurniture
extends
CityObject
{
public
abstract
class
AbstractFurniture
extends
CityObject
{
@Serial
private
static
final
long
serialVersionUID
=
-
9050689238027190674L
;
...
...
@@ -43,7 +43,7 @@ public abstract class AbstractFurniture extends CityObject{
}
@Override
public
void
collectContainedErrors
(
List
<
CheckError
>
errors
){
public
void
collectContainedErrors
(
List
<
CheckError
>
errors
)
{
super
.
collectContainedErrors
(
errors
);
for
(
BoundarySurface
boundarySurface
:
boundarySurfaceList
)
{
boundarySurface
.
collectContainedErrors
(
errors
);
...
...
@@ -51,7 +51,7 @@ public abstract class AbstractFurniture extends CityObject{
}
@Override
public
void
clearAllContainedCheckResults
(){
public
void
clearAllContainedCheckResults
()
{
super
.
clearAllContainedCheckResults
();
for
(
BoundarySurface
boundarySurface
:
boundarySurfaceList
)
{
boundarySurface
.
clearAllContainedCheckResults
();
...
...
@@ -59,13 +59,13 @@ public abstract class AbstractFurniture extends CityObject{
}
@Override
public
boolean
containsError
(
CheckId
checkIdentifier
){
public
boolean
containsError
(
CheckId
checkIdentifier
)
{
boolean
hasError
=
super
.
containsError
(
checkIdentifier
);
if
(
hasError
){
if
(
hasError
)
{
return
true
;
}
for
(
BoundarySurface
boundarySurface
:
boundarySurfaceList
)
{
if
(
boundarySurface
.
containsError
(
checkIdentifier
)){
if
(
boundarySurface
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
...
...
@@ -73,13 +73,13 @@ public abstract class AbstractFurniture extends CityObject{
}
@Override
public
boolean
containsAnyError
(){
public
boolean
containsAnyError
()
{
boolean
hasError
=
super
.
containsAnyError
();
if
(
hasError
){
if
(
hasError
)
{
return
true
;
}
for
(
BoundarySurface
boundarySurface
:
boundarySurfaceList
)
{
if
(
boundarySurface
.
containsAnyError
()){
if
(
boundarySurface
.
containsAnyError
())
{
return
true
;
}
}
...
...
@@ -87,9 +87,8 @@ public abstract class AbstractFurniture extends CityObject{
}
@Override
public
org
.
citygml4j
.
core
.
model
.
construction
.
AbstractFurniture
getGmlObject
(){
public
org
.
citygml4j
.
core
.
model
.
construction
.
AbstractFurniture
getGmlObject
()
{
return
af
;
}
...
...
@@ -105,7 +104,7 @@ public abstract class AbstractFurniture extends CityObject{
@Override
public
void
reCreateGeometries
(
GeometryFactory
factory
,
ParserConfiguration
config
)
{
for
(
Geometry
geom
:
getGeometries
())
{
if
(
geom
instanceof
ImplicitGeometryHolder
){
if
(
geom
instanceof
ImplicitGeometryHolder
)
{
continue
;
}
if
(
geom
.
getType
()
==
GeometryType
.
MULTI_SURFACE
)
{
...
...
@@ -118,7 +117,7 @@ public abstract class AbstractFurniture extends CityObject{
}
}
protected
void
setGmlObject
(
org
.
citygml4j
.
core
.
model
.
construction
.
AbstractFurniture
af
){
protected
void
setGmlObject
(
org
.
citygml4j
.
core
.
model
.
construction
.
AbstractFurniture
af
)
{
this
.
af
=
af
;
}
...
...
@@ -171,7 +170,7 @@ public abstract class AbstractFurniture extends CityObject{
@Override
public
void
prepareForChecking
(){
public
void
prepareForChecking
()
{
super
.
prepareForChecking
();
for
(
BoundarySurface
boundarySurface
:
boundarySurfaceList
)
{
boundarySurface
.
prepareForChecking
();
...
...
@@ -193,7 +192,7 @@ public abstract class AbstractFurniture extends CityObject{
}
@Override
public
void
fillValues
(
Copyable
original
,
CopyHandler
handler
){
public
void
fillValues
(
Copyable
original
,
CopyHandler
handler
)
{
super
.
fillValues
(
original
,
handler
);
AbstractFurniture
originalAf
=
(
AbstractFurniture
)
original
;
af
=
originalAf
.
af
;
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractRoom.java
View file @
02de0a22
...
...
@@ -21,7 +21,7 @@ import java.util.List;
/**
* Abstract base class for rooms inside CityGML 3.0 construction objects.
*/
public
abstract
class
AbstractRoom
extends
CityObject
{
public
abstract
class
AbstractRoom
extends
CityObject
{
@Serial
private
static
final
long
serialVersionUID
=
-
1730625513988944329L
;
...
...
@@ -33,9 +33,8 @@ public abstract class AbstractRoom extends CityObject{
protected
org
.
citygml4j
.
core
.
model
.
core
.
AbstractUnoccupiedSpace
cgmlRoom
;
@Override
public
void
accept
(
Check
c
)
{
super
.
accept
(
c
);
...
...
@@ -51,7 +50,7 @@ public abstract class AbstractRoom extends CityObject{
}
@Override
public
void
collectContainedErrors
(
List
<
CheckError
>
errors
){
public
void
collectContainedErrors
(
List
<
CheckError
>
errors
)
{
super
.
collectContainedErrors
(
errors
);
for
(
Installation
roomInstallation
:
roomInstallations
)
{
roomInstallation
.
collectContainedErrors
(
errors
);
...
...
@@ -62,7 +61,7 @@ public abstract class AbstractRoom extends CityObject{
}
@Override
public
void
clearAllContainedCheckResults
(){
public
void
clearAllContainedCheckResults
()
{
super
.
clearAllContainedCheckResults
();
for
(
Installation
roomInstallation
:
roomInstallations
)
{
roomInstallation
.
clearAllContainedCheckResults
();
...
...
@@ -73,18 +72,18 @@ public abstract class AbstractRoom extends CityObject{
}
@Override
public
boolean
containsError
(
CheckId
checkIdentifier
){
public
boolean
containsError
(
CheckId
checkIdentifier
)
{
boolean
hasError
=
super
.
containsError
(
checkIdentifier
);
if
(
hasError
){
if
(
hasError
)
{
return
true
;
}
for
(
Installation
roomInstallation
:
roomInstallations
)
{
if
(
roomInstallation
.
containsError
(
checkIdentifier
)){
if
(
roomInstallation
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
for
(
BoundarySurface
boundarySurface
:
boundarySurfaceList
)
{
if
(
boundarySurface
.
containsError
(
checkIdentifier
)){
if
(
boundarySurface
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
...
...
@@ -92,18 +91,18 @@ public abstract class AbstractRoom extends CityObject{
}
@Override
public
boolean
containsAnyError
(){
public
boolean
containsAnyError
()
{
boolean
hasError
=
super
.
containsAnyError
();
if
(
hasError
){
if
(
hasError
)
{
return
true
;
}
for
(
Installation
roomInstallation
:
roomInstallations
)
{
if
(
roomInstallation
.
containsAnyError
()){
if
(
roomInstallation
.
containsAnyError
())
{
return
true
;
}
}
for
(
BoundarySurface
boundarySurface
:
boundarySurfaceList
)
{
if
(
boundarySurface
.
containsAnyError
()){
if
(
boundarySurface
.
containsAnyError
())
{
return
true
;
}
}
...
...
@@ -113,7 +112,7 @@ public abstract class AbstractRoom extends CityObject{
@Override
public
void
reCreateGeometries
(
GeometryFactory
factory
,
ParserConfiguration
config
)
{
for
(
Geometry
geom
:
getGeometries
())
{
if
(
geom
instanceof
ImplicitGeometryHolder
){
if
(
geom
instanceof
ImplicitGeometryHolder
)
{
continue
;
}
if
(
geom
.
getType
()
==
GeometryType
.
MULTI_SURFACE
)
{
...
...
@@ -183,7 +182,7 @@ public abstract class AbstractRoom extends CityObject{
}
@Override
public
void
prepareForChecking
(){
public
void
prepareForChecking
()
{
super
.
prepareForChecking
();
for
(
Installation
roomInstallation
:
roomInstallations
)
{
roomInstallation
.
prepareForChecking
();
...
...
@@ -205,7 +204,6 @@ public abstract class AbstractRoom extends CityObject{
}
@Override
public
AbstractCityObject
getGmlObject
()
{
return
cgmlRoom
;
...
...
@@ -232,21 +230,20 @@ public abstract class AbstractRoom extends CityObject{
}
@Override
public
FeatureType
getFeatureType
()
{
return
FeatureType
.
ROOM
;
}
@Override
public
void
collectInstances
(
CopyHandler
handler
){
public
void
collectInstances
(
CopyHandler
handler
)
{
super
.
collectInstances
(
handler
);
handler
.
addInstance
(
roomInstallations
);
handler
.
addInstance
(
boundarySurfaceList
);
}
@Override
public
void
fillValues
(
Copyable
original
,
CopyHandler
handler
){
public
void
fillValues
(
Copyable
original
,
CopyHandler
handler
)
{
super
.
fillValues
(
original
,
handler
);
AbstractRoom
originalAr
=
(
AbstractRoom
)
original
;
for
(
BoundarySurface
originalBs
:
originalAr
.
boundarySurfaceList
)
{
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractTunnel.java
View file @
02de0a22
...
...
@@ -20,7 +20,7 @@ import java.io.Serial;
import
java.util.ArrayList
;
import
java.util.List
;
public
abstract
class
AbstractTunnel
extends
CityObject
{
public
abstract
class
AbstractTunnel
extends
CityObject
{
@Serial
private
static
final
long
serialVersionUID
=
-
2196414503088741206L
;
...
...
@@ -84,7 +84,7 @@ public abstract class AbstractTunnel extends CityObject{
@Override
public
void
reCreateGeometries
(
GeometryFactory
factory
,
ParserConfiguration
config
)
{
for
(
Geometry
geom
:
getGeometries
())
{
if
(
geom
instanceof
ImplicitGeometryHolder
){
if
(
geom
instanceof
ImplicitGeometryHolder
)
{
continue
;
}
if
(
geom
.
getType
()
==
GeometryType
.
MULTI_SURFACE
)
{
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BoundarySurface.java
View file @
02de0a22
/*-
* Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart
*
*
* This file is part of CityDoctor2.
*
* CityDoctor2 is free software: you can redistribute it and/or modify
...
...
@@ -18,15 +18,6 @@
*/
package
de.hft.stuttgart.citydoctor2.datastructure
;
import
java.io.Serial
;
import
java.util.ArrayList
;
import
java.util.List
;
import
org.citygml4j.core.model.core.AbstractThematicSurface
;
import
org.citygml4j.core.util.geometry.GeometryFactory
;
import
org.xmlobjects.gml.model.geometry.aggregates.MultiSurface
;
import
org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty
;
import
de.hft.stuttgart.citydoctor2.check.Check
;
import
de.hft.stuttgart.citydoctor2.check.CheckError
;
import
de.hft.stuttgart.citydoctor2.check.CheckId
;
...
...
@@ -34,255 +25,262 @@ import de.hft.stuttgart.citydoctor2.parser.ParserConfiguration;
import
de.hft.stuttgart.citydoctor2.utils.CityGmlUtils
;
import
de.hft.stuttgart.citydoctor2.utils.CopyHandler
;
import
de.hft.stuttgart.citydoctor2.utils.Copyable
;
import
org.citygml4j.core.model.core.AbstractThematicSurface
;
import
org.citygml4j.core.util.geometry.GeometryFactory
;
import
org.xmlobjects.gml.model.geometry.aggregates.MultiSurface
;
import
org.xmlobjects.gml.model.geometry.aggregates.MultiSurfaceProperty
;
import
java.io.Serial
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* Representing a boundary surface in CityGML
*
* @author Matthias Betz
*
* @author Matthias Betz
*/
public
class
BoundarySurface
extends
CityObject
{
@Serial
private
static
final
long
serialVersionUID
=
8793865135393496408L
;
private
SurfaceFeatureType
featureType
;
private
BoundarySurfaceType
type
;
private
final
List
<
Opening
>
openings
=
new
ArrayList
<>(
2
);
private
CityObject
parent
;
private
AbstractThematicSurface
gmlObject
;
public
BoundarySurface
(
AbstractThematicSurface
aco
)
{
this
(
SurfaceFeatureType
.
BUILDING
,
BoundarySurfaceType
.
UNDEFINED
,
aco
);
}
public
BoundarySurface
(
SurfaceFeatureType
featureType
,
BoundarySurfaceType
type
,
AbstractThematicSurface
aco
)
{
this
.
featureType
=
featureType
;
this
.
type
=
type
;
gmlObject
=
aco
;
}
public
void
setFeatureType
(
SurfaceFeatureType
featureType
)
{
this
.
featureType
=
featureType
;
}
public
void
setType
(
BoundarySurfaceType
type
)
{
this
.
type
=
type
;
}
public
void
setGmlObject
(
AbstractThematicSurface
gmlObject
)
{
this
.
gmlObject
=
gmlObject
;
}
public
SurfaceFeatureType
getSurfaceFeatureType
()
{
return
featureType
;
}
public
BoundarySurfaceType
getType
()
{
return
type
;
}
public
List
<
Opening
>
getOpenings
()
{
return
openings
;
}
@Override
public
void
reCreateGeometries
(
GeometryFactory
factory
,
ParserConfiguration
config
)
{
if
(
gmlObject
.
getId
()
==
null
)
{
gmlObject
.
setId
(
getGmlId
().
getGmlString
());
}
for
(
Geometry
geom
:
getGeometries
())
{
if
(
geom
instanceof
ImplicitGeometryHolder
){
continue
;
}
if
(
geom
.
getType
()
==
GeometryType
.
MULTI_SURFACE
)
{
MultiSurface
ms
=
CityGmlUtils
.
createMultiSurface
(
geom
,
factory
,
config
);
if
(
ms
!=
null
)
{
setGeometryAccordingToLod
(
geom
.
getLod
(),
new
MultiSurfaceProperty
(
ms
));
}
}
else
{
throw
new
IllegalStateException
(
"BoundarySurfaces can only have MultiSurface geometries"
);
}
}
for
(
Opening
o
:
openings
)
{
o
.
reCreateGeometries
(
factory
,
config
);
}
}
private
void
setGeometryAccordingToLod
(
Lod
lod
,
MultiSurfaceProperty
ms
)
{
switch
(
lod
)
{
case
LOD0:
gmlObject
.
setLod0MultiSurface
(
ms
);
break
;
case
LOD1:
gmlObject
.
setLod1MultiSurface
(
ms
);
break
;
case
LOD2:
gmlObject
.
setLod2MultiSurface
(
ms
);
break
;
case
LOD3:
gmlObject
.
setLod3MultiSurface
(
ms
);
break
;
case
LOD4:
gmlObject
.
getDeprecatedProperties
().
setLod4MultiSurface
(
ms
);
break
;
default
:
throw
new
IllegalStateException
(
"Found geometry with LOD other than LOD1-4, which is illegal for BoundarySurfaces: "
+
lod
);
}
}
@Override
public
void
clearAllContainedCheckResults
()
{
super
.
clearAllContainedCheckResults
();
for
(
Opening
o
:
openings
)
{
o
.
clearAllContainedCheckResults
();
}
}
@Override
public
void
collectContainedErrors
(
List
<
CheckError
>
errors
)
{
super
.
collectContainedErrors
(
errors
);
for
(
Opening
o
:
openings
)
{
o
.
collectContainedErrors
(
errors
);
}
}
@Override
public
boolean
containsAnyError
()
{
boolean
hasError
=
super
.
containsAnyError
();
if
(
hasError
)
{
return
true
;
}
for
(
Opening
o
:
openings
)
{
if
(
o
.
containsAnyError
())
{
return
true
;
}
}
return
false
;
}
@Override
public
boolean
containsError
(
CheckId
checkIdentifier
)
{
boolean
hasError
=
super
.
containsError
(
checkIdentifier
);
if
(
hasError
)
{
return
true
;
}
for
(
Opening
o
:
openings
)
{
if
(
o
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
return
false
;
}
@Override
public
void
accept
(
Check
c
)
{
super
.
accept
(
c
);
if
(
c
.
canExecute
(
this
))
{
c
.
check
(
this
);
}
for
(
Opening
o
:
openings
)
{
o
.
accept
(
c
);
}
}
public
void
setParent
(
CityObject
parent
)
{
this
.
parent
=
parent
;
}
public
CityObject
getParent
()
{
return
parent
;
}
@Override
public
void
unsetGmlGeometries
()
{
gmlObject
.
setLod0MultiSurface
(
null
);
gmlObject
.
setLod1MultiSurface
(
null
);
gmlObject
.
setLod2MultiSurface
(
null
);
gmlObject
.
setLod3MultiSurface
(
null
);
gmlObject
.
getDeprecatedProperties
().
setLod4MultiSurface
(
null
);
for
(
Opening
o
:
openings
)
{
o
.
unsetGmlGeometries
();
}
}
@Override
public
String
toString
()
{
return
"BoundarySurface [type="
+
type
+
", id="
+
getGmlId
()
+
"]"
;
}
void
anonymize
()
{
gmlObject
.
setAppearances
(
null
);
gmlObject
.
setBoundedBy
(
null
);
gmlObject
.
setCreationDate
(
null
);
gmlObject
.
setDescription
(
null
);
gmlObject
.
setExternalReferences
(
null
);
gmlObject
.
setGeneralizesTo
(
null
);
gmlObject
.
setADEProperties
(
null
);
gmlObject
.
setGenericAttributes
(
null
);
setGmlId
(
GmlId
.
generateId
());
gmlObject
.
setId
(
getGmlId
().
getGmlString
());
}
@Override
public
AbstractThematicSurface
getGmlObject
()
{
return
gmlObject
;
}
@Override
public
FeatureType
getFeatureType
()
{
return
FeatureType
.
BOUNDARY_SURFACE
;
}
public
void
addOpening
(
Opening
opening
)
{
openings
.
add
(
opening
);
opening
.
setPartOfSurface
(
this
);
}
@Override
public
void
prepareForChecking
()
{
super
.
prepareForChecking
();
for
(
Opening
o
:
openings
)
{
o
.
prepareForChecking
();
}
}
@Override
public
void
clearMetaInformation
()
{
super
.
clearMetaInformation
();
for
(
Opening
o
:
openings
)
{
o
.
clearMetaInformation
();
}
}
@Override
public
Copyable
createCopyInstance
()
{
return
new
BoundarySurface
(
gmlObject
);
}
@Override
public
void
collectInstances
(
CopyHandler
handler
)
{
super
.
collectInstances
(
handler
);
for
(
Opening
o
:
openings
)
{
handler
.
addInstance
(
o
);
}
handler
.
addInstance
(
parent
);
}
@Override
public
void
fillValues
(
Copyable
original
,
CopyHandler
handler
)
{
super
.
fillValues
(
original
,
handler
);
BoundarySurface
originalBs
=
(
BoundarySurface
)
original
;
featureType
=
originalBs
.
featureType
;
type
=
originalBs
.
type
;
for
(
Opening
originalOpening
:
originalBs
.
openings
)
{
openings
.
add
(
handler
.
getCopyInstance
(
originalOpening
));
}
parent
=
handler
.
getCopyInstance
(
originalBs
.
parent
);
gmlObject
=
originalBs
.
gmlObject
;
}
@Serial
private
static
final
long
serialVersionUID
=
8793865135393496408L
;
private
SurfaceFeatureType
featureType
;
private
BoundarySurfaceType
type
;
private
final
List
<
Opening
>
openings
=
new
ArrayList
<>(
2
);
private
CityObject
parent
;
private
AbstractThematicSurface
gmlObject
;
public
BoundarySurface
(
AbstractThematicSurface
aco
)
{
this
(
SurfaceFeatureType
.
BUILDING
,
BoundarySurfaceType
.
UNDEFINED
,
aco
);
}
public
BoundarySurface
(
SurfaceFeatureType
featureType
,
BoundarySurfaceType
type
,
AbstractThematicSurface
aco
)
{
this
.
featureType
=
featureType
;
this
.
type
=
type
;
gmlObject
=
aco
;
}
public
void
setFeatureType
(
SurfaceFeatureType
featureType
)
{
this
.
featureType
=
featureType
;
}
public
void
setType
(
BoundarySurfaceType
type
)
{
this
.
type
=
type
;
}
public
void
setGmlObject
(
AbstractThematicSurface
gmlObject
)
{
this
.
gmlObject
=
gmlObject
;
}
public
SurfaceFeatureType
getSurfaceFeatureType
()
{
return
featureType
;
}
public
BoundarySurfaceType
getType
()
{
return
type
;
}
public
List
<
Opening
>
getOpenings
()
{
return
openings
;
}
@Override
public
void
reCreateGeometries
(
GeometryFactory
factory
,
ParserConfiguration
config
)
{
if
(
gmlObject
.
getId
()
==
null
)
{
gmlObject
.
setId
(
getGmlId
().
getGmlString
());
}
for
(
Geometry
geom
:
getGeometries
())
{
if
(
geom
instanceof
ImplicitGeometryHolder
)
{
continue
;
}
if
(
geom
.
getType
()
==
GeometryType
.
MULTI_SURFACE
)
{
MultiSurface
ms
=
CityGmlUtils
.
createMultiSurface
(
geom
,
factory
,
config
);
if
(
ms
!=
null
)
{
setGeometryAccordingToLod
(
geom
.
getLod
(),
new
MultiSurfaceProperty
(
ms
));
}
}
else
{
throw
new
IllegalStateException
(
"BoundarySurfaces can only have MultiSurface geometries"
);
}
}
for
(
Opening
o
:
openings
)
{
o
.
reCreateGeometries
(
factory
,
config
);
}
}
private
void
setGeometryAccordingToLod
(
Lod
lod
,
MultiSurfaceProperty
ms
)
{
switch
(
lod
)
{
case
LOD0:
gmlObject
.
setLod0MultiSurface
(
ms
);
break
;
case
LOD1:
gmlObject
.
setLod1MultiSurface
(
ms
);
break
;
case
LOD2:
gmlObject
.
setLod2MultiSurface
(
ms
);
break
;
case
LOD3:
gmlObject
.
setLod3MultiSurface
(
ms
);
break
;
case
LOD4:
gmlObject
.
getDeprecatedProperties
().
setLod4MultiSurface
(
ms
);
break
;
default
:
throw
new
IllegalStateException
(
"Found geometry with LOD other than LOD1-4, which is illegal for BoundarySurfaces: "
+
lod
);
}
}
@Override
public
void
clearAllContainedCheckResults
()
{
super
.
clearAllContainedCheckResults
();
for
(
Opening
o
:
openings
)
{
o
.
clearAllContainedCheckResults
();
}
}
@Override
public
void
collectContainedErrors
(
List
<
CheckError
>
errors
)
{
super
.
collectContainedErrors
(
errors
);
for
(
Opening
o
:
openings
)
{
o
.
collectContainedErrors
(
errors
);
}
}
@Override
public
boolean
containsAnyError
()
{
boolean
hasError
=
super
.
containsAnyError
();
if
(
hasError
)
{
return
true
;
}
for
(
Opening
o
:
openings
)
{
if
(
o
.
containsAnyError
())
{
return
true
;
}
}
return
false
;
}
@Override
public
boolean
containsError
(
CheckId
checkIdentifier
)
{
boolean
hasError
=
super
.
containsError
(
checkIdentifier
);
if
(
hasError
)
{
return
true
;
}
for
(
Opening
o
:
openings
)
{
if
(
o
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
return
false
;
}
@Override
public
void
accept
(
Check
c
)
{
super
.
accept
(
c
);
if
(
c
.
canExecute
(
this
))
{
c
.
check
(
this
);
}
for
(
Opening
o
:
openings
)
{
o
.
accept
(
c
);
}
}
public
void
setParent
(
CityObject
parent
)
{
this
.
parent
=
parent
;
}
public
CityObject
getParent
()
{
return
parent
;
}
@Override
public
void
unsetGmlGeometries
()
{
gmlObject
.
setLod0MultiSurface
(
null
);
gmlObject
.
setLod1MultiSurface
(
null
);
gmlObject
.
setLod2MultiSurface
(
null
);
gmlObject
.
setLod3MultiSurface
(
null
);
gmlObject
.
getDeprecatedProperties
().
setLod4MultiSurface
(
null
);
for
(
Opening
o
:
openings
)
{
o
.
unsetGmlGeometries
();
}
}
@Override
public
String
toString
()
{
return
"BoundarySurface [type="
+
type
+
", id="
+
getGmlId
()
+
"]"
;
}
void
anonymize
()
{
gmlObject
.
setAppearances
(
null
);
gmlObject
.
setBoundedBy
(
null
);
gmlObject
.
setCreationDate
(
null
);
gmlObject
.
setDescription
(
null
);
gmlObject
.
setExternalReferences
(
null
);
gmlObject
.
setGeneralizesTo
(
null
);
gmlObject
.
setADEProperties
(
null
);
gmlObject
.
setGenericAttributes
(
null
);
setGmlId
(
GmlId
.
generateId
());
gmlObject
.
setId
(
getGmlId
().
getGmlString
());
}
@Override
public
AbstractThematicSurface
getGmlObject
()
{
return
gmlObject
;
}
@Override
public
FeatureType
getFeatureType
()
{
return
FeatureType
.
BOUNDARY_SURFACE
;
}
public
void
addOpening
(
Opening
opening
)
{
openings
.
add
(
opening
);
opening
.
setPartOfSurface
(
this
);
}
@Override
public
void
prepareForChecking
()
{
super
.
prepareForChecking
();
for
(
Opening
o
:
openings
)
{
o
.
prepareForChecking
();
}
}
@Override
public
void
clearMetaInformation
()
{
super
.
clearMetaInformation
();
for
(
Opening
o
:
openings
)
{
o
.
clearMetaInformation
();
}
}
@Override
public
Copyable
createCopyInstance
()
{
return
new
BoundarySurface
(
gmlObject
);
}
@Override
public
void
collectInstances
(
CopyHandler
handler
)
{
super
.
collectInstances
(
handler
);
for
(
Opening
o
:
openings
)
{
handler
.
addInstance
(
o
);
}
handler
.
addInstance
(
parent
);
}
@Override
public
void
fillValues
(
Copyable
original
,
CopyHandler
handler
)
{
super
.
fillValues
(
original
,
handler
);
BoundarySurface
originalBs
=
(
BoundarySurface
)
original
;
featureType
=
originalBs
.
featureType
;
type
=
originalBs
.
type
;
for
(
Opening
originalOpening
:
originalBs
.
openings
)
{
openings
.
add
(
handler
.
getCopyInstance
(
originalOpening
));
}
parent
=
handler
.
getCopyInstance
(
originalBs
.
parent
);
gmlObject
=
originalBs
.
gmlObject
;
}
}
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BoundarySurfaceType.java
View file @
02de0a22
/*-
* Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart
*
*
* This file is part of CityDoctor2.
*
* CityDoctor2 is free software: you can redistribute it and/or modify
...
...
@@ -20,12 +20,11 @@ package de.hft.stuttgart.citydoctor2.datastructure;
/**
* Types of boundary surfaces used in city doctor
*
* @author Matthias Betz
*
* @author Matthias Betz
*/
public
enum
BoundarySurfaceType
{
UNDEFINED
,
ROOF
,
WALL
,
GROUND
,
CLOSURE
,
OUTER_FLOOR
,
OUTER_CEILING
,
CEILING
,
INTERIOR_WALL
,
FLOOR
UNDEFINED
,
ROOF
,
WALL
,
GROUND
,
CLOSURE
,
OUTER_FLOOR
,
OUTER_CEILING
,
CEILING
,
INTERIOR_WALL
,
FLOOR
}
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BoundingBox.java
View file @
02de0a22
/*-
* Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart
*
*
* This file is part of CityDoctor2.
*
* CityDoctor2 is free software: you can redistribute it and/or modify
...
...
@@ -18,148 +18,147 @@
*/
package
de.hft.stuttgart.citydoctor2.datastructure
;
import
java.util.Collection
;
import
java.util.List
;
import
de.hft.stuttgart.citydoctor2.math.Vector3d
;
import
de.hft.stuttgart.citydoctor2.utils.BoundingBoxCalculator
;
import
java.util.Collection
;
import
java.util.List
;
/**
* An axis aligned bounding box represented by its two corners
*
* @author Matthias Betz
*
* @author Matthias Betz
*/
public
class
BoundingBox
{
private
final
Vector3d
[]
bbox
;
/**
* Creates an axis aligned bounding box containing all points of all polygons
*
* @param polygons containing the points from which the box will be created
* @return the bounding box around all points
*/
public
static
BoundingBox
of
(
Collection
<?
extends
Polygon
>
polygons
)
{
return
BoundingBoxCalculator
.
calculateBoundingBox
(
polygons
);
}
public
static
BoundingBox
ofPoints
(
List
<?
extends
Vector3d
>
points
)
{
return
BoundingBoxCalculator
.
calculateBoundingBoxFromPoints
(
points
);
}
/**
* Creates an axis aligned bounding box of the whole model.
*
* @param model the model containing the features with geometries used for the
* bounding box
* @return the bounding box around all features
*/
public
static
BoundingBox
of
(
CityDoctorModel
model
)
{
return
BoundingBoxCalculator
.
calculateBoundingBox
(
model
);
}
/**
* Creates a new bounding box with two vectors as corner points.
*
* @param box the array of length 2 containing both corners
* @return the new bounding box
*/
public
static
BoundingBox
of
(
Vector3d
[]
box
)
{
return
new
BoundingBox
(
box
);
}
private
BoundingBox
(
Vector3d
[]
bbox
)
{
if
(
bbox
==
null
||
bbox
.
length
!=
2
)
{
throw
new
IllegalArgumentException
(
"BoundingBox must be an array of the length 2"
);
}
this
.
bbox
=
bbox
;
}
/**
* Calculates the volume of the box
*
* @return the volume of the box
*/
public
double
getVolume
()
{
double
length
=
getDepth
();
double
width
=
getWidth
();
double
height
=
getHeight
();
return
height
*
width
*
length
;
}
/**
* Calculates the center of the bounding box
*
* @return the center of the bounding box
*/
public
Vector3d
getCenter
()
{
return
bbox
[
0
].
plus
(
bbox
[
1
].
minus
(
bbox
[
0
]).
mult
(
0.5
));
}
/**
* Getter for the corner array
*
* @return the array containing the corner points
*/
public
Vector3d
[]
getBox
()
{
return
bbox
;
}
/**
* Calculates the width of the bounding box
*
* @return the width of the bounding box
*/
public
double
getWidth
()
{
return
bbox
[
1
].
getY
()
-
bbox
[
0
].
getY
();
}
/**
* Calculates the height of the bounding box
*
* @return the height of the bounding box
*/
public
double
getHeight
()
{
return
bbox
[
1
].
getZ
()
-
bbox
[
0
].
getZ
();
}
/**
* Calculates the depth of the bounding box
*
* @return the depth of the bounding box
*/
public
double
getDepth
()
{
return
bbox
[
1
].
getX
()
-
bbox
[
0
].
getX
();
}
/**
* Returns the length of the longest side of the bounding box, ignoring the
* height. Only X and Y axis are considered
*
* @return the length of the longest side in X or Y direction
*/
public
double
getLongestSide
()
{
double
width
=
getWidth
();
double
depth
=
getDepth
();
private
final
Vector3d
[]
bbox
;
/**
* Creates an axis aligned bounding box containing all points of all polygons
*
* @param polygons containing the points from which the box will be created
* @return the bounding box around all points
*/
public
static
BoundingBox
of
(
Collection
<?
extends
Polygon
>
polygons
)
{
return
BoundingBoxCalculator
.
calculateBoundingBox
(
polygons
);
}
public
static
BoundingBox
ofPoints
(
List
<?
extends
Vector3d
>
points
)
{
return
BoundingBoxCalculator
.
calculateBoundingBoxFromPoints
(
points
);
}
/**
* Creates an axis aligned bounding box of the whole model.
*
* @param model the model containing the features with geometries used for the
* bounding box
* @return the bounding box around all features
*/
public
static
BoundingBox
of
(
CityDoctorModel
model
)
{
return
BoundingBoxCalculator
.
calculateBoundingBox
(
model
);
}
/**
* Creates a new bounding box with two vectors as corner points.
*
* @param box the array of length 2 containing both corners
* @return the new bounding box
*/
public
static
BoundingBox
of
(
Vector3d
[]
box
)
{
return
new
BoundingBox
(
box
);
}
private
BoundingBox
(
Vector3d
[]
bbox
)
{
if
(
bbox
==
null
||
bbox
.
length
!=
2
)
{
throw
new
IllegalArgumentException
(
"BoundingBox must be an array of the length 2"
);
}
this
.
bbox
=
bbox
;
}
/**
* Calculates the volume of the box
*
* @return the volume of the box
*/
public
double
getVolume
()
{
double
length
=
getDepth
();
double
width
=
getWidth
();
double
height
=
getHeight
();
return
height
*
width
*
length
;
}
/**
* Calculates the center of the bounding box
*
* @return the center of the bounding box
*/
public
Vector3d
getCenter
()
{
return
bbox
[
0
].
plus
(
bbox
[
1
].
minus
(
bbox
[
0
]).
mult
(
0.5
));
}
/**
* Getter for the corner array
*
* @return the array containing the corner points
*/
public
Vector3d
[]
getBox
()
{
return
bbox
;
}
/**
* Calculates the width of the bounding box
*
* @return the width of the bounding box
*/
public
double
getWidth
()
{
return
bbox
[
1
].
getY
()
-
bbox
[
0
].
getY
();
}
/**
* Calculates the height of the bounding box
*
* @return the height of the bounding box
*/
public
double
getHeight
()
{
return
bbox
[
1
].
getZ
()
-
bbox
[
0
].
getZ
();
}
/**
* Calculates the depth of the bounding box
*
* @return the depth of the bounding box
*/
public
double
getDepth
()
{
return
bbox
[
1
].
getX
()
-
bbox
[
0
].
getX
();
}
/**
* Returns the length of the longest side of the bounding box, ignoring the
* height. Only X and Y axis are considered
*
* @return the length of the longest side in X or Y direction
*/
public
double
getLongestSide
()
{
double
width
=
getWidth
();
double
depth
=
getDepth
();
return
Math
.
max
(
width
,
depth
);
}
/**
* Calculates the direction vector from the lower corner to the upper corner
*
* @return the direction vector from the lower corner to the upper corner
*/
public
Vector3d
getDiagonal
()
{
return
bbox
[
1
].
minus
(
bbox
[
0
]);
}
/**
* Calculates the distance between the corner points
*
* @return the distance between the corner points
*/
public
double
getDiagonalLength
()
{
return
bbox
[
1
].
getDistance
(
bbox
[
0
]);
}
}
/**
* Calculates the direction vector from the lower corner to the upper corner
*
* @return the direction vector from the lower corner to the upper corner
*/
public
Vector3d
getDiagonal
()
{
return
bbox
[
1
].
minus
(
bbox
[
0
]);
}
/**
* Calculates the distance between the corner points
*
* @return the distance between the corner points
*/
public
double
getDiagonalLength
()
{
return
bbox
[
1
].
getDistance
(
bbox
[
0
]);
}
}
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BridgeConstructiveElement.java
View file @
02de0a22
/*-
* Copyright 2022 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart
*
*
* This file is part of CityDoctor2.
*
* CityDoctor2 is free software: you can redistribute it and/or modify
...
...
@@ -18,10 +18,13 @@
*/
package
de.hft.stuttgart.citydoctor2.datastructure
;
import
java.io.Serial
;
import
java.util.ArrayList
;
import
java.util.List
;
import
de.hft.stuttgart.citydoctor2.check.Check
;
import
de.hft.stuttgart.citydoctor2.check.CheckError
;
import
de.hft.stuttgart.citydoctor2.check.CheckId
;
import
de.hft.stuttgart.citydoctor2.parser.ParserConfiguration
;
import
de.hft.stuttgart.citydoctor2.utils.CityGmlUtils
;
import
de.hft.stuttgart.citydoctor2.utils.CopyHandler
;
import
de.hft.stuttgart.citydoctor2.utils.Copyable
;
import
org.apache.logging.log4j.LogManager
;
import
org.apache.logging.log4j.Logger
;
import
org.citygml4j.core.model.core.AbstractSpaceBoundaryProperty
;
...
...
@@ -34,260 +37,256 @@ import org.xmlobjects.gml.model.geometry.complexes.CompositeSurface;
import
org.xmlobjects.gml.model.geometry.primitives.Solid
;
import
org.xmlobjects.gml.model.geometry.primitives.SolidProperty
;
import
de.hft.stuttgart.citydoctor2.check.Check
;
import
de.hft.stuttgart.citydoctor2.check.CheckError
;
import
de.hft.stuttgart.citydoctor2.check.CheckId
;
import
de.hft.stuttgart.citydoctor2.parser.ParserConfiguration
;
import
de.hft.stuttgart.citydoctor2.utils.CityGmlUtils
;
import
de.hft.stuttgart.citydoctor2.utils.CopyHandler
;
import
de.hft.stuttgart.citydoctor2.utils.Copyable
;
import
java.io.Serial
;
import
java.util.ArrayList
;
import
java.util.List
;
public
class
BridgeConstructiveElement
extends
CityObject
{
private
static
final
Logger
logger
=
LogManager
.
getLogger
(
BridgeConstructiveElement
.
class
);
private
static
final
String
CANNOT_ADD
=
"Cannot add "
;
private
static
final
Logger
logger
=
LogManager
.
getLogger
(
BridgeConstructiveElement
.
class
);
private
static
final
String
CANNOT_ADD
=
"Cannot add "
;
@Serial
private
static
final
long
serialVersionUID
=
7353233899458901155L
;
private
final
org
.
citygml4j
.
core
.
model
.
bridge
.
BridgeConstructiveElement
gmlBridgeElement
;
private
final
List
<
BoundarySurface
>
boundarySurfaceList
=
new
ArrayList
<>();
public
BridgeConstructiveElement
(
org
.
citygml4j
.
core
.
model
.
bridge
.
BridgeConstructiveElement
gmlObject
)
{
this
.
gmlBridgeElement
=
gmlObject
;
}
@Override
public
Copyable
createCopyInstance
()
{
return
new
BridgeConstructiveElement
(
gmlBridgeElement
);
}
@Override
public
void
reCreateGeometries
(
GeometryFactory
factory
,
ParserConfiguration
config
)
{
// only handles CityGML2 for now
// unknown which CityGML is handled here
// need context information to decide
for
(
Geometry
geom
:
getGeometries
())
{
if
(
geom
instanceof
ImplicitGeometryHolder
)
{
continue
;
}
switch
(
geom
.
getType
())
{
case
SOLID:
Solid
solid
=
CityGmlUtils
.
createSolid
(
geom
,
factory
,
config
);
setSolidAccordingToLod
(
geom
,
solid
);
break
;
case
MULTI_SURFACE:
MultiSurface
ms
=
CityGmlUtils
.
createMultiSurface
(
geom
,
factory
,
config
);
setMultiSurfaceAccordingToLod
(
geom
,
ms
);
break
;
case
COMPOSITE_SURFACE:
CompositeSurface
cs
=
CityGmlUtils
.
createCompositeSurface
(
geom
,
factory
,
config
);
setCompositeSurfaceAccordingToLod
(
geom
,
cs
);
break
;
}
}
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
reCreateBoundarySurface
(
factory
,
config
,
bs
);
}
}
@Override
public
void
accept
(
Check
c
)
{
super
.
accept
(
c
);
if
(
c
.
canExecute
(
this
))
{
c
.
check
(
this
);
}
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
bs
.
accept
(
c
);
}
}
@Override
public
void
collectContainedErrors
(
List
<
CheckError
>
errors
)
{
super
.
collectContainedErrors
(
errors
);
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
bs
.
collectContainedErrors
(
errors
);
}
}
@Override
public
void
clearAllContainedCheckResults
()
{
super
.
clearAllContainedCheckResults
();
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
bs
.
clearAllContainedCheckResults
();
}
}
@Override
public
boolean
containsError
(
CheckId
checkIdentifier
)
{
boolean
hasError
=
super
.
containsError
(
checkIdentifier
);
if
(
hasError
)
{
return
true
;
}
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
if
(
bs
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
return
false
;
}
@Override
public
boolean
containsAnyError
()
{
boolean
hasError
=
super
.
containsAnyError
();
if
(
hasError
)
{
return
true
;
}
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
if
(
bs
.
containsAnyError
())
{
return
true
;
}
}
return
false
;
}
private
void
reCreateBoundarySurface
(
GeometryFactory
factory
,
ParserConfiguration
config
,
BoundarySurface
bs
)
{
if
(
bs
.
getGeometries
().
isEmpty
())
{
for
(
AbstractSpaceBoundaryProperty
bsp
:
gmlBridgeElement
.
getBoundaries
())
{
if
(
bsp
.
getObject
()
!=
null
&&
bsp
.
getObject
()
==
bs
.
getGmlObject
())
{
logger
.
warn
(
"Found empty boundary surface: {}, removing from BridgeConstructiveElement"
,
bs
.
getGmlId
());
gmlBridgeElement
.
getBoundaries
().
remove
(
bsp
);
break
;
}
}
return
;
}
bs
.
reCreateGeometries
(
factory
,
config
);
}
@Serial
private
static
final
long
serialVersionUID
=
7353233899458901155L
;
private
void
setCompositeSurfaceAccordingToLod
(
Geometry
geom
,
CompositeSurface
cs
)
{
switch
(
geom
.
getLod
())
{
case
LOD1:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod1Geometry
(
new
GeometryProperty
<>(
cs
));
break
;
case
LOD2:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod2Geometry
(
new
GeometryProperty
<>(
cs
));
break
;
case
LOD3:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod3Geometry
(
new
GeometryProperty
<>(
cs
));
break
;
case
LOD4:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod4Geometry
(
new
GeometryProperty
<>(
cs
));
break
;
default
:
throw
new
IllegalStateException
(
CANNOT_ADD
+
geom
.
getLod
()
+
" composite surface to buildings"
);
}
}
private
final
org
.
citygml4j
.
core
.
model
.
bridge
.
BridgeConstructiveElement
gmlBridgeElement
;
private
final
List
<
BoundarySurface
>
boundarySurfaceList
=
new
ArrayList
<>();
private
void
setSolidAccordingToLod
(
Geometry
geom
,
Solid
solid
)
{
switch
(
geom
.
getLod
())
{
case
LOD1:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod1Geometry
(
new
SolidProperty
(
solid
));
break
;
case
LOD2:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod2Geometry
(
new
SolidProperty
(
solid
));
break
;
case
LOD3:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod3Geometry
(
new
SolidProperty
(
solid
));
break
;
case
LOD4:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod4Geometry
(
new
SolidProperty
(
solid
));
break
;
default
:
throw
new
IllegalStateException
(
CANNOT_ADD
+
geom
.
getLod
()
+
" solid to buildings"
);
}
}
private
void
setMultiSurfaceAccordingToLod
(
Geometry
geom
,
MultiSurface
ms
)
{
switch
(
geom
.
getLod
())
{
case
LOD0:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod1Geometry
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD1:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod1Geometry
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD2:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod1Geometry
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD3:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod1Geometry
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD4:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod1Geometry
(
new
MultiSurfaceProperty
(
ms
));
break
;
default
:
throw
new
IllegalStateException
(
CANNOT_ADD
+
geom
.
getLod
()
+
" multi surface to buildings"
);
}
}
public
BridgeConstructiveElement
(
org
.
citygml4j
.
core
.
model
.
bridge
.
BridgeConstructiveElement
gmlObject
)
{
this
.
gmlBridgeElement
=
gmlObject
;
}
@Override
public
org
.
citygml4j
.
core
.
model
.
bridge
.
BridgeConstructiveElement
getGmlObject
()
{
return
gmlBridgeElement
;
}
@Override
public
Copyable
createCopyInstance
()
{
return
new
BridgeConstructiveElement
(
gmlBridgeElement
);
}
@Override
public
void
unsetGmlGeometries
()
{
gmlBridgeElement
.
setLod0MultiSurface
(
null
);
gmlBridgeElement
.
setLod2MultiSurface
(
null
);
gmlBridgeElement
.
setLod3MultiSurface
(
null
);
DeprecatedPropertiesOfBridgeConstructiveElement
depProps
=
gmlBridgeElement
.
getDeprecatedProperties
();
depProps
.
setLod1Geometry
(
null
);
depProps
.
setLod2Geometry
(
null
);
depProps
.
setLod3Geometry
(
null
);
depProps
.
setLod4Geometry
(
null
);
gmlBridgeElement
.
setLod1Solid
(
null
);
gmlBridgeElement
.
setLod2Solid
(
null
);
gmlBridgeElement
.
setLod3Solid
(
null
);
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
bs
.
unsetGmlGeometries
();
}
}
@Override
public
void
reCreateGeometries
(
GeometryFactory
factory
,
ParserConfiguration
config
)
{
// only handles CityGML2 for now
// unknown which CityGML is handled here
// need context information to decide
for
(
Geometry
geom
:
getGeometries
())
{
if
(
geom
instanceof
ImplicitGeometryHolder
){
continue
;
}
switch
(
geom
.
getType
())
{
case
SOLID:
Solid
solid
=
CityGmlUtils
.
createSolid
(
geom
,
factory
,
config
);
setSolidAccordingToLod
(
geom
,
solid
);
break
;
case
MULTI_SURFACE:
MultiSurface
ms
=
CityGmlUtils
.
createMultiSurface
(
geom
,
factory
,
config
);
setMultiSurfaceAccordingToLod
(
geom
,
ms
);
break
;
case
COMPOSITE_SURFACE:
CompositeSurface
cs
=
CityGmlUtils
.
createCompositeSurface
(
geom
,
factory
,
config
);
setCompositeSurfaceAccordingToLod
(
geom
,
cs
);
break
;
}
}
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
reCreateBoundarySurface
(
factory
,
config
,
bs
);
}
}
@Override
public
void
accept
(
Check
c
)
{
super
.
accept
(
c
);
if
(
c
.
canExecute
(
this
))
{
c
.
check
(
this
);
}
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
bs
.
accept
(
c
);
}
}
@Override
public
void
collectContainedErrors
(
List
<
CheckError
>
errors
)
{
super
.
collectContainedErrors
(
errors
);
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
bs
.
collectContainedErrors
(
errors
);
}
}
@Override
public
void
clearAllContainedCheckResults
()
{
super
.
clearAllContainedCheckResults
();
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
bs
.
clearAllContainedCheckResults
();
}
}
@Override
public
boolean
containsError
(
CheckId
checkIdentifier
)
{
boolean
hasError
=
super
.
containsError
(
checkIdentifier
);
if
(
hasError
)
{
return
true
;
}
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
if
(
bs
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
return
false
;
}
@Override
public
boolean
containsAnyError
()
{
boolean
hasError
=
super
.
containsAnyError
();
if
(
hasError
)
{
return
true
;
}
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
if
(
bs
.
containsAnyError
())
{
return
true
;
}
}
return
false
;
}
private
void
reCreateBoundarySurface
(
GeometryFactory
factory
,
ParserConfiguration
config
,
BoundarySurface
bs
)
{
if
(
bs
.
getGeometries
().
isEmpty
())
{
for
(
AbstractSpaceBoundaryProperty
bsp
:
gmlBridgeElement
.
getBoundaries
())
{
if
(
bsp
.
getObject
()
!=
null
&&
bsp
.
getObject
()
==
bs
.
getGmlObject
())
{
logger
.
warn
(
"Found empty boundary surface: {}, removing from BridgeConstructiveElement"
,
bs
.
getGmlId
());
gmlBridgeElement
.
getBoundaries
().
remove
(
bsp
);
break
;
}
}
return
;
}
bs
.
reCreateGeometries
(
factory
,
config
);
}
@Override
public
FeatureType
getFeatureType
()
{
return
FeatureType
.
BRIDGE_CONSTRUCTION_ELEMENT
;
}
private
void
setCompositeSurfaceAccordingToLod
(
Geometry
geom
,
CompositeSurface
cs
)
{
switch
(
geom
.
getLod
())
{
case
LOD1:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod1Geometry
(
new
GeometryProperty
<>(
cs
));
break
;
case
LOD2:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod2Geometry
(
new
GeometryProperty
<>(
cs
));
break
;
case
LOD3:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod3Geometry
(
new
GeometryProperty
<>(
cs
));
break
;
case
LOD4:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod4Geometry
(
new
GeometryProperty
<>(
cs
));
break
;
default
:
throw
new
IllegalStateException
(
CANNOT_ADD
+
geom
.
getLod
()
+
" composite surface to buildings"
);
}
}
public
void
addBoundarySurface
(
BoundarySurface
bs
)
{
boundarySurfaceList
.
add
(
bs
);
bs
.
setParent
(
this
);
}
private
void
setSolidAccordingToLod
(
Geometry
geom
,
Solid
solid
)
{
switch
(
geom
.
getLod
())
{
case
LOD1:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod1Geometry
(
new
SolidProperty
(
solid
));
break
;
case
LOD2:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod2Geometry
(
new
SolidProperty
(
solid
));
break
;
case
LOD3:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod3Geometry
(
new
SolidProperty
(
solid
));
break
;
case
LOD4:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod4Geometry
(
new
SolidProperty
(
solid
));
break
;
default
:
throw
new
IllegalStateException
(
CANNOT_ADD
+
geom
.
getLod
()
+
" solid to buildings"
);
}
}
private
void
setMultiSurfaceAccordingToLod
(
Geometry
geom
,
MultiSurface
ms
)
{
switch
(
geom
.
getLod
())
{
case
LOD0:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod1Geometry
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD1:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod1Geometry
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD2:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod1Geometry
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD3:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod1Geometry
(
new
MultiSurfaceProperty
(
ms
));
break
;
case
LOD4:
gmlBridgeElement
.
getDeprecatedProperties
().
setLod1Geometry
(
new
MultiSurfaceProperty
(
ms
));
break
;
default
:
throw
new
IllegalStateException
(
CANNOT_ADD
+
geom
.
getLod
()
+
" multi surface to buildings"
);
}
}
public
List
<
BoundarySurface
>
getBoundarySurfaces
()
{
return
boundarySurfaceList
;
}
@Override
public
org
.
citygml4j
.
core
.
model
.
bridge
.
BridgeConstructiveElement
getGmlObject
()
{
return
gmlBridgeElement
;
}
@Override
public
void
prepareForChecking
()
{
super
.
prepareForChecking
();
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
bs
.
prepareForChecking
();
}
}
@Override
public
void
unsetGmlGeometries
()
{
gmlBridgeElement
.
setLod0MultiSurface
(
null
);
gmlBridgeElement
.
setLod2MultiSurface
(
null
);
gmlBridgeElement
.
setLod3MultiSurface
(
null
);
DeprecatedPropertiesOfBridgeConstructiveElement
depProps
=
gmlBridgeElement
.
getDeprecatedProperties
();
depProps
.
setLod1Geometry
(
null
);
depProps
.
setLod2Geometry
(
null
);
depProps
.
setLod3Geometry
(
null
);
depProps
.
setLod4Geometry
(
null
);
gmlBridgeElement
.
setLod1Solid
(
null
);
gmlBridgeElement
.
setLod2Solid
(
null
);
gmlBridgeElement
.
setLod3Solid
(
null
);
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
bs
.
unsetGmlGeometries
();
}
}
@Override
public
void
clearMetaInformation
()
{
super
.
clearMetaInformation
();
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
bs
.
clearMetaInformation
();
}
}
@Override
public
FeatureType
getFeatureType
()
{
return
FeatureType
.
BRIDGE_CONSTRUCTION_ELEMENT
;
}
@Override
public
void
collectInstances
(
CopyHandler
handler
)
{
super
.
collectInstances
(
handler
);
handler
.
addInstance
(
boundarySurfaceList
);
}
public
void
addBoundarySurface
(
BoundarySurface
bs
)
{
boundarySurfaceList
.
add
(
bs
);
bs
.
setParent
(
this
);
}
public
List
<
BoundarySurface
>
getBoundarySurfaces
()
{
return
boundarySurfaceList
;
}
@Override
public
void
prepareForChecking
()
{
super
.
prepareForChecking
();
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
bs
.
prepareForChecking
();
}
}
@Override
public
void
clearMetaInformation
()
{
super
.
clearMetaInformation
();
for
(
BoundarySurface
bs
:
boundarySurfaceList
)
{
bs
.
clearMetaInformation
();
}
}
@Override
public
void
collectInstances
(
CopyHandler
handler
)
{
super
.
collectInstances
(
handler
);
handler
.
addInstance
(
boundarySurfaceList
);
}
@Override
public
void
fillValues
(
Copyable
original
,
CopyHandler
handler
)
{
super
.
fillValues
(
original
,
handler
);
BridgeConstructiveElement
originalBce
=
(
BridgeConstructiveElement
)
original
;
for
(
BoundarySurface
originalBs
:
originalBce
.
boundarySurfaceList
)
{
boundarySurfaceList
.
add
(
handler
.
getCopyInstance
(
originalBs
));
}
}
@Override
public
void
fillValues
(
Copyable
original
,
CopyHandler
handler
)
{
super
.
fillValues
(
original
,
handler
);
BridgeConstructiveElement
originalBce
=
(
BridgeConstructiveElement
)
original
;
for
(
BoundarySurface
originalBs
:
originalBce
.
boundarySurfaceList
)
{
boundarySurfaceList
.
add
(
handler
.
getCopyInstance
(
originalBs
));
}
}
}
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BridgeObject.java
View file @
02de0a22
...
...
@@ -55,6 +55,7 @@ public class BridgeObject extends CityObject {
private
final
List
<
BridgeRoom
>
bridgeRooms
=
new
ArrayList
<>(
2
);
private
AbstractBridge
ab
;
private
BridgeType
type
;
public
BridgeObject
(
BridgeType
type
,
AbstractBridge
ab
)
{
this
.
ab
=
ab
;
this
.
type
=
type
;
...
...
@@ -80,7 +81,7 @@ public class BridgeObject extends CityObject {
@Override
public
void
reCreateGeometries
(
GeometryFactory
factory
,
ParserConfiguration
config
)
{
for
(
Geometry
geom
:
getGeometries
())
{
if
(
geom
instanceof
ImplicitGeometryHolder
){
if
(
geom
instanceof
ImplicitGeometryHolder
)
{
continue
;
}
if
(
geom
.
getType
()
==
GeometryType
.
MULTI_SURFACE
)
{
...
...
@@ -146,6 +147,7 @@ public class BridgeObject extends CityObject {
throw
new
IllegalStateException
(
"Cannot add "
+
geom
.
getLod
()
+
" solid to bridges"
);
}
}
public
void
addBridgeInstallation
(
Installation
coBi
)
{
bridgeInstallations
.
add
(
coBi
);
coBi
.
setParent
(
this
);
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BridgeRoom.java
View file @
02de0a22
...
...
@@ -12,7 +12,8 @@ public class BridgeRoom extends AbstractRoom {
private
BridgeObject
parent
;
private
BridgeRoom
(){}
private
BridgeRoom
()
{
}
public
BridgeRoom
(
BridgeObject
parent
)
{
this
.
parent
=
parent
;
...
...
@@ -20,7 +21,7 @@ public class BridgeRoom extends AbstractRoom {
}
public
void
setGmlObject
(
org
.
citygml4j
.
core
.
model
.
bridge
.
BridgeRoom
cgmlRoom
){
public
void
setGmlObject
(
org
.
citygml4j
.
core
.
model
.
bridge
.
BridgeRoom
cgmlRoom
)
{
super
.
cgmlRoom
=
cgmlRoom
;
}
...
...
@@ -30,14 +31,14 @@ public class BridgeRoom extends AbstractRoom {
}
@Override
public
void
fillValues
(
Copyable
original
,
CopyHandler
handler
){
public
void
fillValues
(
Copyable
original
,
CopyHandler
handler
)
{
super
.
fillValues
(
original
,
handler
);
BridgeRoom
oRoom
=
(
BridgeRoom
)
original
;
parent
=
handler
.
getCopyInstance
(
oRoom
.
getParent
());
}
@Override
public
void
collectInstances
(
CopyHandler
handler
){
public
void
collectInstances
(
CopyHandler
handler
)
{
super
.
collectInstances
(
handler
);
handler
.
addInstance
(
parent
);
}
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BridgeRoomFurniture.java
View file @
02de0a22
...
...
@@ -15,7 +15,7 @@ public class BridgeRoomFurniture extends AbstractFurniture {
}
@Override
public
Copyable
createCopyInstance
(){
public
Copyable
createCopyInstance
()
{
return
new
BridgeRoomFurniture
();
}
}
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/Building.java
View file @
02de0a22
/*-
* Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart
*
*
* This file is part of CityDoctor2.
*
* CityDoctor2 is free software: you can redistribute it and/or modify
...
...
@@ -18,158 +18,157 @@
*/
package
de.hft.stuttgart.citydoctor2.datastructure
;
import
java.io.Serial
;
import
java.util.ArrayList
;
import
java.util.List
;
import
org.citygml4j.core.model.building.BuildingInstallation
;
import
org.citygml4j.core.model.building.BuildingInstallationProperty
;
import
org.citygml4j.core.model.core.AbstractSpaceBoundaryProperty
;
import
org.citygml4j.core.util.geometry.GeometryFactory
;
import
de.hft.stuttgart.citydoctor2.check.Check
;
import
de.hft.stuttgart.citydoctor2.check.CheckError
;
import
de.hft.stuttgart.citydoctor2.check.CheckId
;
import
de.hft.stuttgart.citydoctor2.parser.ParserConfiguration
;
import
de.hft.stuttgart.citydoctor2.utils.CopyHandler
;
import
de.hft.stuttgart.citydoctor2.utils.Copyable
;
import
org.citygml4j.core.model.building.BuildingInstallation
;
import
org.citygml4j.core.model.building.BuildingInstallationProperty
;
import
org.citygml4j.core.model.core.AbstractSpaceBoundaryProperty
;
import
org.citygml4j.core.util.geometry.GeometryFactory
;
import
java.io.Serial
;
import
java.util.ArrayList
;
import
java.util.List
;
public
class
Building
extends
AbstractBuilding
{
@Serial
private
static
final
long
serialVersionUID
=
588480113268630052L
;
private
final
List
<
BuildingPart
>
buildingParts
=
new
ArrayList
<>(
2
);
public
List
<
BuildingPart
>
getBuildingParts
()
{
return
buildingParts
;
}
@Override
public
void
reCreateGeometries
(
GeometryFactory
factory
,
ParserConfiguration
config
)
{
super
.
reCreateGeometries
(
factory
,
config
);
for
(
BuildingPart
bp
:
buildingParts
)
{
bp
.
reCreateGeometries
(
factory
,
config
);
}
}
@Override
public
void
accept
(
Check
c
)
{
super
.
accept
(
c
);
if
(
c
.
canExecute
(
this
))
{
c
.
check
(
this
);
}
for
(
BuildingPart
bp
:
buildingParts
)
{
bp
.
accept
(
c
);
}
}
@Override
public
void
clearAllContainedCheckResults
()
{
super
.
clearAllContainedCheckResults
();
for
(
BuildingPart
bp
:
buildingParts
)
{
bp
.
clearAllContainedCheckResults
();
}
}
@Override
public
void
collectContainedErrors
(
List
<
CheckError
>
errors
)
{
super
.
collectContainedErrors
(
errors
);
for
(
BuildingPart
bp
:
buildingParts
)
{
bp
.
collectContainedErrors
(
errors
);
}
}
@Override
public
boolean
containsAnyError
()
{
boolean
hasError
=
super
.
containsAnyError
();
if
(
hasError
)
{
return
true
;
}
for
(
BuildingPart
bp
:
buildingParts
)
{
if
(
bp
.
containsAnyError
())
{
return
true
;
}
}
return
false
;
}
@Override
public
boolean
containsError
(
CheckId
checkIdentifier
)
{
boolean
hasError
=
super
.
containsError
(
checkIdentifier
);
if
(
hasError
)
{
return
true
;
}
for
(
BuildingPart
bp
:
buildingParts
)
{
if
(
bp
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
return
false
;
}
public
void
addBuildingPart
(
BuildingPart
buildingPart
)
{
buildingParts
.
add
(
buildingPart
);
}
@Override
public
String
toString
()
{
return
"Building [id="
+
getGmlId
()
+
"]"
;
}
public
void
anonymize
()
{
for
(
Geometry
geom
:
getGeometries
())
{
geom
.
anonymize
();
}
org
.
citygml4j
.
core
.
model
.
building
.
Building
gmlB
=
new
org
.
citygml4j
.
core
.
model
.
building
.
Building
();
gmlB
.
setId
(
GmlId
.
generateId
().
getGmlString
());
for
(
Installation
bi
:
getBuildingInstallations
())
{
bi
.
anonymize
();
gmlB
.
getBuildingInstallations
().
add
(
new
BuildingInstallationProperty
((
BuildingInstallation
)
bi
.
getGmlObject
()));
}
for
(
BoundarySurface
bs
:
getBoundarySurfaces
())
{
bs
.
anonymize
();
gmlB
.
addBoundary
(
new
AbstractSpaceBoundaryProperty
(
bs
.
getGmlObject
()));
}
setCityGmlBuilding
(
gmlB
);
}
@Override
public
void
clearMetaInformation
()
{
super
.
clearMetaInformation
();
for
(
BuildingPart
part
:
buildingParts
)
{
part
.
clearMetaInformation
();
}
}
@Override
public
void
prepareForChecking
()
{
super
.
prepareForChecking
();
for
(
BuildingPart
part
:
buildingParts
)
{
part
.
prepareForChecking
();
}
}
@Override
public
void
fillValues
(
Copyable
original
,
CopyHandler
handler
)
{
super
.
fillValues
(
original
,
handler
);
Building
originalBuilding
=
(
Building
)
original
;
for
(
BuildingPart
originalBp
:
originalBuilding
.
buildingParts
)
{
buildingParts
.
add
(
handler
.
getCopyInstance
(
originalBp
));
}
}
@Override
public
void
collectInstances
(
CopyHandler
handler
)
{
super
.
collectInstances
(
handler
);
for
(
BuildingPart
bp
:
buildingParts
)
{
handler
.
addInstance
(
bp
);
}
}
@Override
public
Copyable
createCopyInstance
()
{
return
new
Building
();
}
@Serial
private
static
final
long
serialVersionUID
=
588480113268630052L
;
private
final
List
<
BuildingPart
>
buildingParts
=
new
ArrayList
<>(
2
);
public
List
<
BuildingPart
>
getBuildingParts
()
{
return
buildingParts
;
}
@Override
public
void
reCreateGeometries
(
GeometryFactory
factory
,
ParserConfiguration
config
)
{
super
.
reCreateGeometries
(
factory
,
config
);
for
(
BuildingPart
bp
:
buildingParts
)
{
bp
.
reCreateGeometries
(
factory
,
config
);
}
}
@Override
public
void
accept
(
Check
c
)
{
super
.
accept
(
c
);
if
(
c
.
canExecute
(
this
))
{
c
.
check
(
this
);
}
for
(
BuildingPart
bp
:
buildingParts
)
{
bp
.
accept
(
c
);
}
}
@Override
public
void
clearAllContainedCheckResults
()
{
super
.
clearAllContainedCheckResults
();
for
(
BuildingPart
bp
:
buildingParts
)
{
bp
.
clearAllContainedCheckResults
();
}
}
@Override
public
void
collectContainedErrors
(
List
<
CheckError
>
errors
)
{
super
.
collectContainedErrors
(
errors
);
for
(
BuildingPart
bp
:
buildingParts
)
{
bp
.
collectContainedErrors
(
errors
);
}
}
@Override
public
boolean
containsAnyError
()
{
boolean
hasError
=
super
.
containsAnyError
();
if
(
hasError
)
{
return
true
;
}
for
(
BuildingPart
bp
:
buildingParts
)
{
if
(
bp
.
containsAnyError
())
{
return
true
;
}
}
return
false
;
}
@Override
public
boolean
containsError
(
CheckId
checkIdentifier
)
{
boolean
hasError
=
super
.
containsError
(
checkIdentifier
);
if
(
hasError
)
{
return
true
;
}
for
(
BuildingPart
bp
:
buildingParts
)
{
if
(
bp
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
return
false
;
}
public
void
addBuildingPart
(
BuildingPart
buildingPart
)
{
buildingParts
.
add
(
buildingPart
);
}
@Override
public
String
toString
()
{
return
"Building [id="
+
getGmlId
()
+
"]"
;
}
public
void
anonymize
()
{
for
(
Geometry
geom
:
getGeometries
())
{
geom
.
anonymize
();
}
org
.
citygml4j
.
core
.
model
.
building
.
Building
gmlB
=
new
org
.
citygml4j
.
core
.
model
.
building
.
Building
();
gmlB
.
setId
(
GmlId
.
generateId
().
getGmlString
());
for
(
Installation
bi
:
getBuildingInstallations
())
{
bi
.
anonymize
();
gmlB
.
getBuildingInstallations
().
add
(
new
BuildingInstallationProperty
((
BuildingInstallation
)
bi
.
getGmlObject
()));
}
for
(
BoundarySurface
bs
:
getBoundarySurfaces
())
{
bs
.
anonymize
();
gmlB
.
addBoundary
(
new
AbstractSpaceBoundaryProperty
(
bs
.
getGmlObject
()));
}
setCityGmlBuilding
(
gmlB
);
}
@Override
public
void
clearMetaInformation
()
{
super
.
clearMetaInformation
();
for
(
BuildingPart
part
:
buildingParts
)
{
part
.
clearMetaInformation
();
}
}
@Override
public
void
prepareForChecking
()
{
super
.
prepareForChecking
();
for
(
BuildingPart
part
:
buildingParts
)
{
part
.
prepareForChecking
();
}
}
@Override
public
void
fillValues
(
Copyable
original
,
CopyHandler
handler
)
{
super
.
fillValues
(
original
,
handler
);
Building
originalBuilding
=
(
Building
)
original
;
for
(
BuildingPart
originalBp
:
originalBuilding
.
buildingParts
)
{
buildingParts
.
add
(
handler
.
getCopyInstance
(
originalBp
));
}
}
@Override
public
void
collectInstances
(
CopyHandler
handler
)
{
super
.
collectInstances
(
handler
);
for
(
BuildingPart
bp
:
buildingParts
)
{
handler
.
addInstance
(
bp
);
}
}
@Override
public
Copyable
createCopyInstance
()
{
return
new
Building
();
}
}
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BuildingPart.java
View file @
02de0a22
/*-
* Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart
*
*
* This file is part of CityDoctor2.
*
* CityDoctor2 is free software: you can redistribute it and/or modify
...
...
@@ -24,50 +24,50 @@ import de.hft.stuttgart.citydoctor2.utils.Copyable;
import
java.io.Serial
;
public
class
BuildingPart
extends
AbstractBuilding
{
@Serial
private
static
final
long
serialVersionUID
=
8200322261958679163L
;
private
Building
parent
;
private
BuildingPart
()
{
}
public
BuildingPart
(
Building
parent
)
{
this
.
parent
=
parent
;
parent
.
addBuildingPart
(
this
);
}
public
Building
getParent
()
{
return
parent
;
}
@Override
public
FeatureType
getFeatureType
()
{
return
FeatureType
.
BUILDING_PART
;
}
@Override
public
String
toString
()
{
return
"BuildingPart [id="
+
getGmlId
()
+
"]"
;
}
@Override
public
void
fillValues
(
Copyable
original
,
CopyHandler
handler
)
{
super
.
fillValues
(
original
,
handler
);
BuildingPart
originalPart
=
(
BuildingPart
)
original
;
parent
=
handler
.
getCopyInstance
(
originalPart
.
parent
);
}
@Override
public
void
collectInstances
(
CopyHandler
handler
)
{
super
.
collectInstances
(
handler
);
handler
.
addInstance
(
parent
);
}
@Serial
private
static
final
long
serialVersionUID
=
8200322261958679163L
;
private
Building
parent
;
private
BuildingPart
()
{
}
public
BuildingPart
(
Building
parent
)
{
this
.
parent
=
parent
;
parent
.
addBuildingPart
(
this
);
}
public
Building
getParent
()
{
return
parent
;
}
@Override
public
FeatureType
getFeatureType
()
{
return
FeatureType
.
BUILDING_PART
;
}
@Override
public
String
toString
()
{
return
"BuildingPart [id="
+
getGmlId
()
+
"]"
;
}
@Override
public
void
fillValues
(
Copyable
original
,
CopyHandler
handler
)
{
super
.
fillValues
(
original
,
handler
);
BuildingPart
originalPart
=
(
BuildingPart
)
original
;
parent
=
handler
.
getCopyInstance
(
originalPart
.
parent
);
}
@Override
public
void
collectInstances
(
CopyHandler
handler
)
{
super
.
collectInstances
(
handler
);
handler
.
addInstance
(
parent
);
}
@Override
public
Copyable
createCopyInstance
()
{
return
new
BuildingPart
();
}
@Override
public
Copyable
createCopyInstance
()
{
return
new
BuildingPart
();
}
}
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BuildingRoom.java
View file @
02de0a22
...
...
@@ -8,19 +8,19 @@ import java.io.Serial;
import
java.util.ArrayList
;
import
java.util.List
;
public
class
BuildingRoom
extends
AbstractRoom
{
public
class
BuildingRoom
extends
AbstractRoom
{
@Serial
private
static
final
long
serialVersionUID
=
-
276088332165299253L
;
private
final
List
<
BuildingFurnitureProperty
>
furnitureRefs
=
new
ArrayList
<>(
2
);
private
CityObject
parent
;
public
void
setGmlObject
(
org
.
citygml4j
.
core
.
model
.
building
.
BuildingRoom
cgmlRoom
){
public
void
setGmlObject
(
org
.
citygml4j
.
core
.
model
.
building
.
BuildingRoom
cgmlRoom
)
{
super
.
cgmlRoom
=
cgmlRoom
;
}
public
void
setParent
(
CityObject
parent
){
public
void
setParent
(
CityObject
parent
)
{
this
.
parent
=
parent
;
}
...
...
@@ -31,6 +31,7 @@ public class BuildingRoom extends AbstractRoom{
/**
* Returns the list of citygml3 furniture objects registered to this room.
* The reference objects only hold a HRef to the actual furniture object.
*
* @return
*/
public
List
<
BuildingFurnitureProperty
>
getFurnitureRefs
()
{
...
...
@@ -42,7 +43,7 @@ public class BuildingRoom extends AbstractRoom{
}
@Override
public
void
fillValues
(
Copyable
original
,
CopyHandler
handler
){
public
void
fillValues
(
Copyable
original
,
CopyHandler
handler
)
{
super
.
fillValues
(
original
,
handler
);
BuildingRoom
oRoom
=
(
BuildingRoom
)
original
;
...
...
@@ -50,7 +51,7 @@ public class BuildingRoom extends AbstractRoom{
}
@Override
public
void
collectInstances
(
CopyHandler
handler
){
public
void
collectInstances
(
CopyHandler
handler
)
{
super
.
collectInstances
(
handler
);
handler
.
addInstance
(
parent
);
}
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BuildingRoomFurniture.java
View file @
02de0a22
...
...
@@ -16,7 +16,7 @@ public class BuildingRoomFurniture extends AbstractFurniture {
}
@Override
public
Copyable
createCopyInstance
(){
public
Copyable
createCopyInstance
()
{
return
new
BuildingRoomFurniture
();
}
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/BuildingUnit.java
View file @
02de0a22
...
...
@@ -12,7 +12,7 @@ import java.io.Serial;
import
java.util.ArrayList
;
import
java.util.List
;
public
class
BuildingUnit
extends
AbstractBuildingSubdivision
{
public
class
BuildingUnit
extends
AbstractBuildingSubdivision
{
@Serial
private
static
final
long
serialVersionUID
=
-
2931788311665810322L
;
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CityDoctorModel.java
View file @
02de0a22
/*-
* Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart
*
*
* This file is part of CityDoctor2.
*
* CityDoctor2 is free software: you can redistribute it and/or modify
...
...
@@ -18,24 +18,6 @@
*/
package
de.hft.stuttgart.citydoctor2.datastructure
;
import
java.io.BufferedWriter
;
import
java.io.File
;
import
java.io.IOException
;
import
java.io.UncheckedIOException
;
import
java.nio.file.Files
;
import
java.util.ArrayList
;
import
java.util.EnumMap
;
import
java.util.HashSet
;
import
java.util.LinkedHashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Set
;
import
java.util.concurrent.atomic.AtomicInteger
;
import
java.util.stream.Stream
;
import
org.citygml4j.core.model.CityGMLVersion
;
import
org.citygml4j.core.model.core.CityModel
;
import
de.hft.stuttgart.citydoctor2.check.AbstractCheck
;
import
de.hft.stuttgart.citydoctor2.check.Check
;
import
de.hft.stuttgart.citydoctor2.check.CheckError
;
...
...
@@ -43,431 +25,441 @@ import de.hft.stuttgart.citydoctor2.exceptions.CityDoctorWriteException;
import
de.hft.stuttgart.citydoctor2.parser.ParserConfiguration
;
import
de.hft.stuttgart.citydoctor2.writer.CityGMLWriterUtils
;
import
de.hft.stuttgart.quality.model.types.ValidationPlan
;
import
org.citygml4j.core.model.CityGMLVersion
;
import
org.citygml4j.core.model.core.CityModel
;
import
java.io.BufferedWriter
;
import
java.io.File
;
import
java.io.IOException
;
import
java.io.UncheckedIOException
;
import
java.nio.file.Files
;
import
java.util.*
;
import
java.util.concurrent.atomic.AtomicInteger
;
import
java.util.stream.Stream
;
/**
* The complete CityGML model containing all features that are used in
* CityDoctor
*
* @author Matthias Betz
*
* @author Matthias Betz
*/
public
class
CityDoctorModel
{
private
static
final
String
COULD_NOT_FIND_FEATURE
=
"Could not find feature: "
;
private
final
List
<
Building
>
buildings
;
private
final
List
<
Vegetation
>
vegetation
;
private
final
List
<
BridgeObject
>
bridges
;
private
final
List
<
CityFurniture
>
cityfurniture
;
private
final
List
<
GenericCityObject
>
genericObjects
;
private
final
List
<
CityObject
>
land
;
private
final
List
<
TransportationObject
>
roads
;
private
final
List
<
Tunnel
>
tunnels
;
private
final
List
<
WaterObject
>
water
;
private
CityModel
cModel
;
private
final
ParserConfiguration
config
;
private
final
String
fileName
;
private
final
File
file
;
private
final
List
<
CheckError
>
globalErrors
;
private
boolean
isValidated
=
false
;
private
ValidationPlan
plan
;
private
CityGMLVersion
cityGMLVersion
;
public
CityDoctorModel
(
ParserConfiguration
config
,
File
file
)
{
if
(
config
==
null
)
{
throw
new
IllegalArgumentException
(
"Parser configuration may not be null"
);
}
this
.
fileName
=
file
.
getName
();
this
.
config
=
config
;
this
.
file
=
file
;
buildings
=
new
ArrayList
<>();
vegetation
=
new
ArrayList
<>();
bridges
=
new
ArrayList
<>();
land
=
new
ArrayList
<>();
roads
=
new
ArrayList
<>();
tunnels
=
new
ArrayList
<>();
water
=
new
ArrayList
<>();
cityfurniture
=
new
ArrayList
<>();
genericObjects
=
new
ArrayList
<>();
globalErrors
=
new
ArrayList
<>();
}
public
boolean
isValidated
()
{
return
isValidated
;
}
public
void
setValidated
(
ValidationPlan
plan
)
{
if
(
plan
==
null
)
{
this
.
plan
=
null
;
this
.
isValidated
=
false
;
return
;
}
this
.
plan
=
plan
;
this
.
isValidated
=
true
;
}
public
ValidationPlan
getValidationPlan
()
{
return
plan
;
}
public
void
addGlobalError
(
CheckError
err
)
{
globalErrors
.
add
(
err
);
}
public
void
addGlobalErrors
(
List
<?
extends
CheckError
>
generalErrors
)
{
globalErrors
.
addAll
(
generalErrors
);
}
public
List
<
CheckError
>
getGlobalErrors
()
{
return
globalErrors
;
}
public
File
getFile
()
{
return
file
;
}
public
Stream
<
CityObject
>
createFeatureStream
()
{
return
Stream
.
of
(
buildings
.
stream
(),
vegetation
.
stream
(),
bridges
.
stream
(),
land
.
stream
(),
roads
.
stream
(),
tunnels
.
stream
()
,
water
.
stream
(),
cityfurniture
.
stream
(),
genericObjects
.
stream
()).
flatMap
(
co
->
co
);
}
public
void
saveAs
(
String
file
,
boolean
saveQualityAde
)
throws
CityDoctorWriteException
{
if
(
file
.
endsWith
(
".off"
))
{
exportAsOff
(
file
);
}
else
{
ValidationPlan
tempPlan
=
plan
;
if
(!
saveQualityAde
)
{
setValidated
(
null
);
}
exportAsGML
(
file
);
if
(!
saveQualityAde
)
{
setValidated
(
tempPlan
);
}
}
}
private
void
exportAsGML
(
String
file
)
throws
CityDoctorWriteException
{
CityGMLWriterUtils
.
writeCityModel
(
file
,
this
);
}
private
void
exportAsOff
(
String
file
)
{
file
=
file
.
substring
(
0
,
file
.
lastIndexOf
(
'.'
));
File
folder
=
new
File
(
file
);
folder
.
mkdirs
();
createFeatureStream
().
forEach
(
co
->
{
Map
<
Lod
,
Set
<
Polygon
>>
polygonMap
=
new
EnumMap
<>(
Lod
.
class
);
Check
c
=
new
AbstractCheck
()
{
@Override
public
void
check
(
Geometry
geom
)
{
polygonMap
.
compute
(
geom
.
getLod
(),
(
lod
,
polys
)
->
{
if
(
polys
==
null
)
{
polys
=
new
HashSet
<>();
}
for
(
Polygon
poly
:
geom
.
getPolygons
())
{
polys
.
add
(
poly
.
getOriginal
());
}
return
polys
;
});
}
};
co
.
accept
(
c
);
Set
<
Polygon
>
highestLod
=
polygonMap
.
get
(
Lod
.
LOD2
);
if
(
highestLod
==
null
)
{
highestLod
=
polygonMap
.
get
(
Lod
.
LOD1
);
}
if
(
highestLod
==
null
)
{
return
;
}
Map
<
Vertex
,
Integer
>
idMap
=
new
LinkedHashMap
<>();
AtomicInteger
counter
=
new
AtomicInteger
(
0
);
for
(
Polygon
poly
:
highestLod
)
{
addRing
(
poly
.
getExteriorRing
(),
idMap
,
counter
);
}
try
(
BufferedWriter
writer
=
Files
.
newBufferedWriter
(
folder
.
toPath
().
resolve
(
co
.
getGmlId
()
+
".off"
)))
{
writer
.
write
(
"OFF\n"
);
writer
.
write
(
Integer
.
toString
(
idMap
.
size
()));
writer
.
write
(
' '
);
writer
.
write
(
Integer
.
toString
(
highestLod
.
size
()));
writer
.
write
(
" 0\n"
);
for
(
Vertex
v
:
idMap
.
keySet
())
{
writer
.
write
(
Double
.
toString
(
v
.
getX
()));
writer
.
write
(
' '
);
writer
.
write
(
Double
.
toString
(
v
.
getY
()));
writer
.
write
(
' '
);
writer
.
write
(
Double
.
toString
(
v
.
getZ
()));
writer
.
write
(
'\n'
);
}
for
(
Polygon
poly
:
highestLod
)
{
writer
.
write
(
Integer
.
toString
(
poly
.
getExteriorRing
().
getVertices
().
size
()
-
1
));
writer
.
write
(
' '
);
for
(
int
i
=
0
;
i
<
poly
.
getExteriorRing
().
getVertices
().
size
()
-
1
;
i
++)
{
Vertex
v
=
poly
.
getExteriorRing
().
getVertices
().
get
(
i
);
writer
.
write
(
Integer
.
toString
(
idMap
.
get
(
v
)));
writer
.
write
(
' '
);
}
writer
.
write
(
'\n'
);
}
}
catch
(
IOException
e
)
{
throw
new
UncheckedIOException
(
e
);
}
});
}
private
void
addRing
(
LinearRing
ring
,
Map
<
Vertex
,
Integer
>
idMap
,
AtomicInteger
counter
)
{
for
(
Vertex
v
:
ring
.
getVertices
())
{
idMap
.
computeIfAbsent
(
v
,
k
->
counter
.
getAndIncrement
());
}
}
public
Set
<
CheckError
>
collectErrors
()
{
List
<
CheckError
>
errors
=
new
ArrayList
<>();
collectErrorsFromList
(
errors
,
buildings
);
collectErrorsFromList
(
errors
,
vegetation
);
collectErrorsFromList
(
errors
,
bridges
);
collectErrorsFromList
(
errors
,
land
);
collectErrorsFromList
(
errors
,
roads
);
collectErrorsFromList
(
errors
,
tunnels
);
collectErrorsFromList
(
errors
,
water
);
collectErrorsFromList
(
errors
,
cityfurniture
);
collectErrorsFromList
(
errors
,
genericObjects
);
return
new
HashSet
<>(
errors
);
}
private
void
collectErrorsFromList
(
List
<
CheckError
>
errors
,
List
<?
extends
CityObject
>
cos
)
{
for
(
CityObject
co
:
cos
)
{
co
.
collectContainedErrors
(
errors
);
}
}
public
String
getFileName
()
{
return
fileName
;
}
public
void
addBridge
(
BridgeObject
coBridge
)
{
bridges
.
add
(
coBridge
);
}
public
void
addBuilding
(
Building
coBuilding
)
{
buildings
.
add
(
coBuilding
);
}
public
List
<
Building
>
getBuildings
()
{
return
buildings
;
}
public
List
<
BridgeObject
>
getBridges
()
{
return
bridges
;
}
public
List
<
CityFurniture
>
getCityFurniture
()
{
return
cityfurniture
;
}
public
void
addCityFurniture
(
CityFurniture
coFurniture
)
{
cityfurniture
.
add
(
coFurniture
);
}
public
List
<
GenericCityObject
>
getGenericCityObjects
(){
return
genericObjects
;
}
public
void
addGenericCityObject
(
GenericCityObject
coGenericCityObject
){
genericObjects
.
add
(
coGenericCityObject
);
}
public
void
setCityModel
(
CityModel
cModel
)
{
this
.
cModel
=
cModel
;
}
public
CityModel
getCityModel
()
{
return
cModel
;
}
public
List
<
TransportationObject
>
getTransportation
()
{
return
roads
;
}
public
List
<
Tunnel
>
getTunnels
()
{
return
tunnels
;
}
public
List
<
WaterObject
>
getWater
()
{
return
water
;
}
public
List
<
CityObject
>
getLand
()
{
return
land
;
}
public
List
<
Vegetation
>
getVegetation
()
{
return
vegetation
;
}
public
void
addWater
(
WaterObject
wo
)
{
water
.
add
(
wo
);
}
public
void
addLand
(
LandObject
lo
)
{
land
.
add
(
lo
);
}
public
void
addVegetation
(
Vegetation
veg
)
{
vegetation
.
add
(
veg
);
}
public
void
addTransportation
(
TransportationObject
to
)
{
roads
.
add
(
to
);
}
public
void
addTunnel
(
Tunnel
tunnel
)
{
tunnels
.
add
(
tunnel
);
}
public
int
getNumberOfFeatures
()
{
return
buildings
.
size
()
+
vegetation
.
size
()
+
bridges
.
size
()
+
land
.
size
()
+
tunnels
.
size
()
+
roads
.
size
()
+
water
.
size
()
+
cityfurniture
.
size
()
+
genericObjects
.
size
();
}
public
ParserConfiguration
getParserConfig
()
{
return
config
;
}
public
void
replaceFeature
(
CityObject
currentFeature
,
CityObject
nextFeature
)
{
if
(
nextFeature
instanceof
Building
)
{
replaceBuilding
(
currentFeature
,
nextFeature
);
}
else
if
(
nextFeature
instanceof
BridgeObject
)
{
replaceBridge
(
currentFeature
,
nextFeature
);
}
else
if
(
nextFeature
instanceof
TransportationObject
)
{
replaceTransportationObject
(
currentFeature
,
nextFeature
);
}
else
if
(
nextFeature
instanceof
Tunnel
)
{
replaceTunnel
(
currentFeature
,
nextFeature
);
}
else
if
(
nextFeature
instanceof
Vegetation
)
{
replaceVegetation
(
currentFeature
,
nextFeature
);
}
else
if
(
nextFeature
instanceof
LandObject
)
{
replaceLandObject
(
currentFeature
,
nextFeature
);
}
else
if
(
nextFeature
instanceof
WaterObject
)
{
replaceWaterObject
(
currentFeature
,
nextFeature
);
}
else
if
(
nextFeature
instanceof
CityFurniture
)
{
replaceCityFurniture
(
currentFeature
,
nextFeature
);
}
else
if
(
nextFeature
instanceof
GenericCityObject
)
{
replaceGenericCityObject
(
currentFeature
,
nextFeature
);
}
}
private
void
replaceWaterObject
(
CityObject
currentFeature
,
CityObject
nextFeature
)
{
int
index
=
water
.
indexOf
(
currentFeature
);
if
(
index
==
-
1
)
{
throw
new
IllegalStateException
(
COULD_NOT_FIND_FEATURE
+
currentFeature
+
" in water objects"
);
}
water
.
set
(
index
,
(
WaterObject
)
nextFeature
);
}
private
void
replaceLandObject
(
CityObject
currentFeature
,
CityObject
nextFeature
)
{
int
index
=
land
.
indexOf
(
currentFeature
);
if
(
index
==
-
1
)
{
throw
new
IllegalStateException
(
COULD_NOT_FIND_FEATURE
+
currentFeature
+
" in land objects"
);
}
land
.
set
(
index
,
nextFeature
);
}
private
void
replaceVegetation
(
CityObject
currentFeature
,
CityObject
nextFeature
)
{
int
index
=
vegetation
.
indexOf
(
currentFeature
);
if
(
index
==
-
1
)
{
throw
new
IllegalStateException
(
COULD_NOT_FIND_FEATURE
+
currentFeature
+
" in vegetation"
);
}
vegetation
.
set
(
index
,
(
Vegetation
)
nextFeature
);
}
private
void
replaceCityFurniture
(
CityObject
currentFeature
,
CityObject
nextFeature
)
{
int
index
=
cityfurniture
.
indexOf
(
currentFeature
);
if
(
index
==
-
1
)
{
throw
new
IllegalStateException
(
COULD_NOT_FIND_FEATURE
+
currentFeature
+
" in vegetation"
);
}
cityfurniture
.
set
(
index
,
(
CityFurniture
)
nextFeature
);
}
private
void
replaceGenericCityObject
(
CityObject
currentFeature
,
CityObject
nextFeature
)
{
int
index
=
genericObjects
.
indexOf
(
currentFeature
);
if
(
index
==
-
1
)
{
throw
new
IllegalStateException
(
COULD_NOT_FIND_FEATURE
+
currentFeature
+
" in generic city objects"
);
}
genericObjects
.
set
(
index
,
(
GenericCityObject
)
nextFeature
);
}
private
void
replaceTransportationObject
(
CityObject
currentFeature
,
CityObject
nextFeature
)
{
int
index
=
roads
.
indexOf
(
currentFeature
);
if
(
index
==
-
1
)
{
throw
new
IllegalStateException
(
COULD_NOT_FIND_FEATURE
+
currentFeature
+
" in transportation objects"
);
}
roads
.
set
(
index
,
(
TransportationObject
)
nextFeature
);
}
private
void
replaceTunnel
(
CityObject
currentFeature
,
CityObject
nextFeature
){
int
index
=
tunnels
.
indexOf
(
currentFeature
);
if
(
index
==
-
1
)
{
throw
new
IllegalStateException
(
COULD_NOT_FIND_FEATURE
+
currentFeature
+
" in tunnels"
);
}
tunnels
.
set
(
index
,
(
Tunnel
)
nextFeature
);
}
private
void
replaceBridge
(
CityObject
currentFeature
,
CityObject
nextFeature
)
{
int
index
=
bridges
.
indexOf
(
currentFeature
);
if
(
index
==
-
1
)
{
throw
new
IllegalStateException
(
COULD_NOT_FIND_FEATURE
+
currentFeature
+
" in bridges"
);
}
bridges
.
set
(
index
,
(
BridgeObject
)
nextFeature
);
}
private
void
replaceBuilding
(
CityObject
currentFeature
,
CityObject
nextFeature
)
{
int
index
=
buildings
.
indexOf
(
currentFeature
);
if
(
index
==
-
1
)
{
throw
new
IllegalStateException
(
COULD_NOT_FIND_FEATURE
+
currentFeature
+
" in buildings"
);
}
buildings
.
set
(
index
,
(
Building
)
nextFeature
);
}
public
void
addCityObject
(
CityObject
co
)
{
if
(
co
instanceof
Building
b
)
{
buildings
.
add
(
b
);
}
else
if
(
co
instanceof
BridgeObject
bo
)
{
bridges
.
add
(
bo
);
}
else
if
(
co
instanceof
TransportationObject
to
)
{
roads
.
add
(
to
);
}
else
if
(
co
instanceof
Tunnel
tu
)
{
tunnels
.
add
(
tu
);
}
else
if
(
co
instanceof
Vegetation
veg
)
{
vegetation
.
add
(
veg
);
}
else
if
(
co
instanceof
LandObject
lo
)
{
land
.
add
(
lo
);
}
else
if
(
co
instanceof
WaterObject
wo
)
{
water
.
add
(
wo
);
}
else
if
(
co
instanceof
ReliefObject
)
{
land
.
add
(
co
);
}
else
if
(
co
instanceof
TinObject
)
{
land
.
add
(
co
);
}
else
if
(
co
instanceof
CityFurniture
cf
)
{
cityfurniture
.
add
(
cf
);
}
else
if
(
co
instanceof
GenericCityObject
gco
)
{
genericObjects
.
add
(
gco
);
}
}
public
void
setParsedCityGMLVersion
(
CityGMLVersion
cityGMLVersion
)
{
this
.
cityGMLVersion
=
cityGMLVersion
;
}
public
CityGMLVersion
getCityGMLVersion
()
{
return
cityGMLVersion
;
}
public
void
addRelief
(
ReliefObject
relief
)
{
addCityObject
(
relief
);
}
public
void
addTin
(
TinObject
tin
)
{
addCityObject
(
tin
);
}
private
static
final
String
COULD_NOT_FIND_FEATURE
=
"Could not find feature: "
;
private
final
List
<
Building
>
buildings
;
private
final
List
<
Vegetation
>
vegetation
;
private
final
List
<
BridgeObject
>
bridges
;
private
final
List
<
CityFurniture
>
cityfurniture
;
private
final
List
<
GenericCityObject
>
genericObjects
;
private
final
List
<
CityObject
>
land
;
private
final
List
<
TransportationObject
>
roads
;
private
final
List
<
Tunnel
>
tunnels
;
private
final
List
<
WaterObject
>
water
;
private
CityModel
cModel
;
private
final
ParserConfiguration
config
;
private
final
String
fileName
;
private
final
File
file
;
private
final
List
<
CheckError
>
globalErrors
;
private
boolean
isValidated
=
false
;
private
ValidationPlan
plan
;
private
CityGMLVersion
cityGMLVersion
;
public
CityDoctorModel
(
ParserConfiguration
config
,
File
file
)
{
if
(
config
==
null
)
{
throw
new
IllegalArgumentException
(
"Parser configuration may not be null"
);
}
this
.
fileName
=
file
.
getName
();
this
.
config
=
config
;
this
.
file
=
file
;
buildings
=
new
ArrayList
<>();
vegetation
=
new
ArrayList
<>();
bridges
=
new
ArrayList
<>();
land
=
new
ArrayList
<>();
roads
=
new
ArrayList
<>();
tunnels
=
new
ArrayList
<>();
water
=
new
ArrayList
<>();
cityfurniture
=
new
ArrayList
<>();
genericObjects
=
new
ArrayList
<>();
globalErrors
=
new
ArrayList
<>();
}
public
boolean
isValidated
()
{
return
isValidated
;
}
public
void
setValidated
(
ValidationPlan
plan
)
{
if
(
plan
==
null
)
{
this
.
plan
=
null
;
this
.
isValidated
=
false
;
return
;
}
this
.
plan
=
plan
;
this
.
isValidated
=
true
;
}
public
ValidationPlan
getValidationPlan
()
{
return
plan
;
}
public
void
addGlobalError
(
CheckError
err
)
{
globalErrors
.
add
(
err
);
}
public
void
addGlobalErrors
(
List
<?
extends
CheckError
>
generalErrors
)
{
globalErrors
.
addAll
(
generalErrors
);
}
public
List
<
CheckError
>
getGlobalErrors
()
{
return
globalErrors
;
}
public
File
getFile
()
{
return
file
;
}
public
Stream
<
CityObject
>
createFeatureStream
()
{
return
Stream
.
of
(
buildings
.
stream
(),
vegetation
.
stream
(),
bridges
.
stream
(),
land
.
stream
(),
roads
.
stream
(),
tunnels
.
stream
(),
water
.
stream
(),
cityfurniture
.
stream
(),
genericObjects
.
stream
()).
flatMap
(
co
->
co
);
}
public
void
saveAs
(
String
file
,
boolean
saveQualityAde
)
throws
CityDoctorWriteException
{
if
(
file
.
endsWith
(
".off"
))
{
exportAsOff
(
file
);
}
else
{
ValidationPlan
tempPlan
=
plan
;
if
(!
saveQualityAde
)
{
setValidated
(
null
);
}
exportAsGML
(
file
);
if
(!
saveQualityAde
)
{
setValidated
(
tempPlan
);
}
}
}
private
void
exportAsGML
(
String
file
)
throws
CityDoctorWriteException
{
CityGMLWriterUtils
.
writeCityModel
(
file
,
this
);
}
private
void
exportAsOff
(
String
file
)
{
file
=
file
.
substring
(
0
,
file
.
lastIndexOf
(
'.'
));
File
folder
=
new
File
(
file
);
folder
.
mkdirs
();
createFeatureStream
().
forEach
(
co
->
{
Map
<
Lod
,
Set
<
Polygon
>>
polygonMap
=
new
EnumMap
<>(
Lod
.
class
);
Check
c
=
new
AbstractCheck
()
{
@Override
public
void
check
(
Geometry
geom
)
{
polygonMap
.
compute
(
geom
.
getLod
(),
(
lod
,
polys
)
->
{
if
(
polys
==
null
)
{
polys
=
new
HashSet
<>();
}
for
(
Polygon
poly
:
geom
.
getPolygons
())
{
polys
.
add
(
poly
.
getOriginal
());
}
return
polys
;
});
}
};
co
.
accept
(
c
);
Set
<
Polygon
>
highestLod
=
polygonMap
.
get
(
Lod
.
LOD2
);
if
(
highestLod
==
null
)
{
highestLod
=
polygonMap
.
get
(
Lod
.
LOD1
);
}
if
(
highestLod
==
null
)
{
return
;
}
Map
<
Vertex
,
Integer
>
idMap
=
new
LinkedHashMap
<>();
AtomicInteger
counter
=
new
AtomicInteger
(
0
);
for
(
Polygon
poly
:
highestLod
)
{
addRing
(
poly
.
getExteriorRing
(),
idMap
,
counter
);
}
try
(
BufferedWriter
writer
=
Files
.
newBufferedWriter
(
folder
.
toPath
().
resolve
(
co
.
getGmlId
()
+
".off"
)))
{
writer
.
write
(
"OFF\n"
);
writer
.
write
(
Integer
.
toString
(
idMap
.
size
()));
writer
.
write
(
' '
);
writer
.
write
(
Integer
.
toString
(
highestLod
.
size
()));
writer
.
write
(
" 0\n"
);
for
(
Vertex
v
:
idMap
.
keySet
())
{
writer
.
write
(
Double
.
toString
(
v
.
getX
()));
writer
.
write
(
' '
);
writer
.
write
(
Double
.
toString
(
v
.
getY
()));
writer
.
write
(
' '
);
writer
.
write
(
Double
.
toString
(
v
.
getZ
()));
writer
.
write
(
'\n'
);
}
for
(
Polygon
poly
:
highestLod
)
{
writer
.
write
(
Integer
.
toString
(
poly
.
getExteriorRing
().
getVertices
().
size
()
-
1
));
writer
.
write
(
' '
);
for
(
int
i
=
0
;
i
<
poly
.
getExteriorRing
().
getVertices
().
size
()
-
1
;
i
++)
{
Vertex
v
=
poly
.
getExteriorRing
().
getVertices
().
get
(
i
);
writer
.
write
(
Integer
.
toString
(
idMap
.
get
(
v
)));
writer
.
write
(
' '
);
}
writer
.
write
(
'\n'
);
}
}
catch
(
IOException
e
)
{
throw
new
UncheckedIOException
(
e
);
}
});
}
private
void
addRing
(
LinearRing
ring
,
Map
<
Vertex
,
Integer
>
idMap
,
AtomicInteger
counter
)
{
for
(
Vertex
v
:
ring
.
getVertices
())
{
idMap
.
computeIfAbsent
(
v
,
k
->
counter
.
getAndIncrement
());
}
}
public
Set
<
CheckError
>
collectErrors
()
{
List
<
CheckError
>
errors
=
new
ArrayList
<>();
collectErrorsFromList
(
errors
,
buildings
);
collectErrorsFromList
(
errors
,
vegetation
);
collectErrorsFromList
(
errors
,
bridges
);
collectErrorsFromList
(
errors
,
land
);
collectErrorsFromList
(
errors
,
roads
);
collectErrorsFromList
(
errors
,
tunnels
);
collectErrorsFromList
(
errors
,
water
);
collectErrorsFromList
(
errors
,
cityfurniture
);
collectErrorsFromList
(
errors
,
genericObjects
);
return
new
HashSet
<>(
errors
);
}
private
void
collectErrorsFromList
(
List
<
CheckError
>
errors
,
List
<?
extends
CityObject
>
cos
)
{
for
(
CityObject
co
:
cos
)
{
co
.
collectContainedErrors
(
errors
);
}
}
public
String
getFileName
()
{
return
fileName
;
}
public
void
addBridge
(
BridgeObject
coBridge
)
{
bridges
.
add
(
coBridge
);
}
public
void
addBuilding
(
Building
coBuilding
)
{
buildings
.
add
(
coBuilding
);
}
public
List
<
Building
>
getBuildings
()
{
return
buildings
;
}
public
List
<
BridgeObject
>
getBridges
()
{
return
bridges
;
}
public
List
<
CityFurniture
>
getCityFurniture
()
{
return
cityfurniture
;
}
public
void
addCityFurniture
(
CityFurniture
coFurniture
)
{
cityfurniture
.
add
(
coFurniture
);
}
public
List
<
GenericCityObject
>
getGenericCityObjects
()
{
return
genericObjects
;
}
public
void
addGenericCityObject
(
GenericCityObject
coGenericCityObject
)
{
genericObjects
.
add
(
coGenericCityObject
);
}
public
void
setCityModel
(
CityModel
cModel
)
{
this
.
cModel
=
cModel
;
}
public
CityModel
getCityModel
()
{
return
cModel
;
}
public
List
<
TransportationObject
>
getTransportation
()
{
return
roads
;
}
public
List
<
Tunnel
>
getTunnels
()
{
return
tunnels
;
}
public
List
<
WaterObject
>
getWater
()
{
return
water
;
}
public
List
<
CityObject
>
getLand
()
{
return
land
;
}
public
List
<
Vegetation
>
getVegetation
()
{
return
vegetation
;
}
public
void
addWater
(
WaterObject
wo
)
{
water
.
add
(
wo
);
}
public
void
addLand
(
LandObject
lo
)
{
land
.
add
(
lo
);
}
public
void
addVegetation
(
Vegetation
veg
)
{
vegetation
.
add
(
veg
);
}
public
void
addTransportation
(
TransportationObject
to
)
{
roads
.
add
(
to
);
}
public
void
addTunnel
(
Tunnel
tunnel
)
{
tunnels
.
add
(
tunnel
);
}
public
int
getNumberOfFeatures
()
{
return
buildings
.
size
()
+
vegetation
.
size
()
+
bridges
.
size
()
+
land
.
size
()
+
tunnels
.
size
()
+
roads
.
size
()
+
water
.
size
()
+
cityfurniture
.
size
()
+
genericObjects
.
size
();
}
public
ParserConfiguration
getParserConfig
()
{
return
config
;
}
public
void
replaceFeature
(
CityObject
currentFeature
,
CityObject
nextFeature
)
{
if
(
nextFeature
instanceof
Building
)
{
replaceBuilding
(
currentFeature
,
nextFeature
);
}
else
if
(
nextFeature
instanceof
BridgeObject
)
{
replaceBridge
(
currentFeature
,
nextFeature
);
}
else
if
(
nextFeature
instanceof
TransportationObject
)
{
replaceTransportationObject
(
currentFeature
,
nextFeature
);
}
else
if
(
nextFeature
instanceof
Tunnel
)
{
replaceTunnel
(
currentFeature
,
nextFeature
);
}
else
if
(
nextFeature
instanceof
Vegetation
)
{
replaceVegetation
(
currentFeature
,
nextFeature
);
}
else
if
(
nextFeature
instanceof
LandObject
)
{
replaceLandObject
(
currentFeature
,
nextFeature
);
}
else
if
(
nextFeature
instanceof
WaterObject
)
{
replaceWaterObject
(
currentFeature
,
nextFeature
);
}
else
if
(
nextFeature
instanceof
CityFurniture
)
{
replaceCityFurniture
(
currentFeature
,
nextFeature
);
}
else
if
(
nextFeature
instanceof
GenericCityObject
)
{
replaceGenericCityObject
(
currentFeature
,
nextFeature
);
}
}
private
void
replaceWaterObject
(
CityObject
currentFeature
,
CityObject
nextFeature
)
{
int
index
=
water
.
indexOf
(
currentFeature
);
if
(
index
==
-
1
)
{
throw
new
IllegalStateException
(
COULD_NOT_FIND_FEATURE
+
currentFeature
+
" in water objects"
);
}
water
.
set
(
index
,
(
WaterObject
)
nextFeature
);
}
private
void
replaceLandObject
(
CityObject
currentFeature
,
CityObject
nextFeature
)
{
int
index
=
land
.
indexOf
(
currentFeature
);
if
(
index
==
-
1
)
{
throw
new
IllegalStateException
(
COULD_NOT_FIND_FEATURE
+
currentFeature
+
" in land objects"
);
}
land
.
set
(
index
,
nextFeature
);
}
private
void
replaceVegetation
(
CityObject
currentFeature
,
CityObject
nextFeature
)
{
int
index
=
vegetation
.
indexOf
(
currentFeature
);
if
(
index
==
-
1
)
{
throw
new
IllegalStateException
(
COULD_NOT_FIND_FEATURE
+
currentFeature
+
" in vegetation"
);
}
vegetation
.
set
(
index
,
(
Vegetation
)
nextFeature
);
}
private
void
replaceCityFurniture
(
CityObject
currentFeature
,
CityObject
nextFeature
)
{
int
index
=
cityfurniture
.
indexOf
(
currentFeature
);
if
(
index
==
-
1
)
{
throw
new
IllegalStateException
(
COULD_NOT_FIND_FEATURE
+
currentFeature
+
" in vegetation"
);
}
cityfurniture
.
set
(
index
,
(
CityFurniture
)
nextFeature
);
}
private
void
replaceGenericCityObject
(
CityObject
currentFeature
,
CityObject
nextFeature
)
{
int
index
=
genericObjects
.
indexOf
(
currentFeature
);
if
(
index
==
-
1
)
{
throw
new
IllegalStateException
(
COULD_NOT_FIND_FEATURE
+
currentFeature
+
" in generic city objects"
);
}
genericObjects
.
set
(
index
,
(
GenericCityObject
)
nextFeature
);
}
private
void
replaceTransportationObject
(
CityObject
currentFeature
,
CityObject
nextFeature
)
{
int
index
=
roads
.
indexOf
(
currentFeature
);
if
(
index
==
-
1
)
{
throw
new
IllegalStateException
(
COULD_NOT_FIND_FEATURE
+
currentFeature
+
" in transportation objects"
);
}
roads
.
set
(
index
,
(
TransportationObject
)
nextFeature
);
}
private
void
replaceTunnel
(
CityObject
currentFeature
,
CityObject
nextFeature
)
{
int
index
=
tunnels
.
indexOf
(
currentFeature
);
if
(
index
==
-
1
)
{
throw
new
IllegalStateException
(
COULD_NOT_FIND_FEATURE
+
currentFeature
+
" in tunnels"
);
}
tunnels
.
set
(
index
,
(
Tunnel
)
nextFeature
);
}
private
void
replaceBridge
(
CityObject
currentFeature
,
CityObject
nextFeature
)
{
int
index
=
bridges
.
indexOf
(
currentFeature
);
if
(
index
==
-
1
)
{
throw
new
IllegalStateException
(
COULD_NOT_FIND_FEATURE
+
currentFeature
+
" in bridges"
);
}
bridges
.
set
(
index
,
(
BridgeObject
)
nextFeature
);
}
private
void
replaceBuilding
(
CityObject
currentFeature
,
CityObject
nextFeature
)
{
int
index
=
buildings
.
indexOf
(
currentFeature
);
if
(
index
==
-
1
)
{
throw
new
IllegalStateException
(
COULD_NOT_FIND_FEATURE
+
currentFeature
+
" in buildings"
);
}
buildings
.
set
(
index
,
(
Building
)
nextFeature
);
}
public
void
addCityObject
(
CityObject
co
)
{
if
(
co
instanceof
Building
b
)
{
buildings
.
add
(
b
);
}
else
if
(
co
instanceof
BridgeObject
bo
)
{
bridges
.
add
(
bo
);
}
else
if
(
co
instanceof
TransportationObject
to
)
{
roads
.
add
(
to
);
}
else
if
(
co
instanceof
Tunnel
tu
)
{
tunnels
.
add
(
tu
);
}
else
if
(
co
instanceof
Vegetation
veg
)
{
vegetation
.
add
(
veg
);
}
else
if
(
co
instanceof
LandObject
lo
)
{
land
.
add
(
lo
);
}
else
if
(
co
instanceof
WaterObject
wo
)
{
water
.
add
(
wo
);
}
else
if
(
co
instanceof
ReliefObject
)
{
land
.
add
(
co
);
}
else
if
(
co
instanceof
TinObject
)
{
land
.
add
(
co
);
}
else
if
(
co
instanceof
CityFurniture
cf
)
{
cityfurniture
.
add
(
cf
);
}
else
if
(
co
instanceof
GenericCityObject
gco
)
{
genericObjects
.
add
(
gco
);
}
}
public
void
setParsedCityGMLVersion
(
CityGMLVersion
cityGMLVersion
)
{
this
.
cityGMLVersion
=
cityGMLVersion
;
}
public
CityGMLVersion
getCityGMLVersion
()
{
return
cityGMLVersion
;
}
public
void
addRelief
(
ReliefObject
relief
)
{
addCityObject
(
relief
);
}
public
void
addTin
(
TinObject
tin
)
{
addCityObject
(
tin
);
}
}
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CityFurniture.java
View file @
02de0a22
...
...
@@ -14,7 +14,7 @@ import org.xmlobjects.gml.model.geometry.primitives.SolidProperty;
import
java.io.Serial
;
public
class
CityFurniture
extends
CityObject
{
public
class
CityFurniture
extends
CityObject
{
@Serial
private
static
final
long
serialVersionUID
=
3325661061543962473L
;
...
...
@@ -53,7 +53,7 @@ public class CityFurniture extends CityObject{
@Override
public
void
reCreateGeometries
(
GeometryFactory
factory
,
ParserConfiguration
config
)
{
for
(
Geometry
geom
:
getGeometries
())
{
if
(
geom
instanceof
ImplicitGeometryHolder
){
if
(
geom
instanceof
ImplicitGeometryHolder
)
{
continue
;
}
if
(
geom
.
getType
()
==
GeometryType
.
MULTI_SURFACE
)
{
...
...
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/CityObject.java
View file @
02de0a22
/*-
* Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart
*
*
* This file is part of CityDoctor2.
*
* CityDoctor2 is free software: you can redistribute it and/or modify
...
...
@@ -18,184 +18,182 @@
*/
package
de.hft.stuttgart.citydoctor2.datastructure
;
import
java.io.Serial
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Objects
;
import
org.citygml4j.core.model.core.AbstractCityObject
;
import
org.citygml4j.core.util.geometry.GeometryFactory
;
import
de.hft.stuttgart.citydoctor2.check.Check
;
import
de.hft.stuttgart.citydoctor2.check.CheckError
;
import
de.hft.stuttgart.citydoctor2.check.CheckId
;
import
de.hft.stuttgart.citydoctor2.parser.ParserConfiguration
;
import
de.hft.stuttgart.citydoctor2.utils.CopyHandler
;
import
de.hft.stuttgart.citydoctor2.utils.Copyable
;
import
org.citygml4j.core.model.core.AbstractCityObject
;
import
org.citygml4j.core.util.geometry.GeometryFactory
;
import
java.io.Serial
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Objects
;
/**
* Abstract class for general features such as Buildings, Water objects, ...
* <br>
* Contains the geometries
*
* @author Matthias Betz
*
* @author Matthias Betz
*/
public
abstract
class
CityObject
extends
GmlElement
{
@Serial
private
static
final
long
serialVersionUID
=
651712070755024188L
;
private
final
List
<
Geometry
>
geometryList
=
new
ArrayList
<>();
/**
* Recreates the CityGML4j geometry in this object. The CityGML4j geometry is
* deleted from the data structure as was mapped to the city doctor data
* structure. For writing CityGML files the geometry has to be restored. Also
* maps changes to geometry back to CityGML4j
*
* @param factory needed to create CityGML4j data structures
* @param config contains information whether a city doctor point was
* transformed to a different coordinate system. It would need to
* be transformed to the original coordinate system
*/
public
abstract
void
reCreateGeometries
(
GeometryFactory
factory
,
ParserConfiguration
config
);
/**
* Getter for the CityGML4j data object
*
* @return the CityGML4j data object
*/
public
abstract
AbstractCityObject
getGmlObject
();
/**
* Remove the CityGML4j geometries from the data structure to save memory.
*/
public
abstract
void
unsetGmlGeometries
();
public
void
addGeometry
(
Geometry
geom
)
{
Objects
.
requireNonNull
(
geom
);
geometryList
.
add
(
geom
);
geom
.
setParent
(
this
);
}
public
List
<
Geometry
>
getGeometries
()
{
return
geometryList
;
}
public
void
removeGeometry
(
Lod
lod
)
{
@Serial
private
static
final
long
serialVersionUID
=
651712070755024188L
;
private
final
List
<
Geometry
>
geometryList
=
new
ArrayList
<>();
/**
* Recreates the CityGML4j geometry in this object. The CityGML4j geometry is
* deleted from the data structure as was mapped to the city doctor data
* structure. For writing CityGML files the geometry has to be restored. Also
* maps changes to geometry back to CityGML4j
*
* @param factory needed to create CityGML4j data structures
* @param config contains information whether a city doctor point was
* transformed to a different coordinate system. It would need to
* be transformed to the original coordinate system
*/
public
abstract
void
reCreateGeometries
(
GeometryFactory
factory
,
ParserConfiguration
config
);
/**
* Getter for the CityGML4j data object
*
* @return the CityGML4j data object
*/
public
abstract
AbstractCityObject
getGmlObject
();
/**
* Remove the CityGML4j geometries from the data structure to save memory.
*/
public
abstract
void
unsetGmlGeometries
();
public
void
addGeometry
(
Geometry
geom
)
{
Objects
.
requireNonNull
(
geom
);
geometryList
.
add
(
geom
);
geom
.
setParent
(
this
);
}
public
List
<
Geometry
>
getGeometries
()
{
return
geometryList
;
}
public
void
removeGeometry
(
Lod
lod
)
{
geometryList
.
removeIf
(
geom
->
geom
.
getLod
()
==
lod
);
}
public
void
removeGeometry
(
Lod
lod
,
GeometryType
type
)
{
}
public
void
removeGeometry
(
Lod
lod
,
GeometryType
type
)
{
geometryList
.
removeIf
(
geom
->
geom
.
getLod
()
==
lod
&&
geom
.
getType
()
==
type
);
}
public
Geometry
getHighestLodGeometry
()
{
Geometry
highestLodGeometry
=
null
;
Lod
highestLod
=
null
;
for
(
Geometry
geom
:
geometryList
)
{
if
(
highestLod
==
null
||
geom
.
getLod
().
isHigher
(
highestLod
))
{
highestLodGeometry
=
geom
;
highestLod
=
geom
.
getLod
();
}
}
return
highestLodGeometry
;
}
public
abstract
FeatureType
getFeatureType
();
@Override
public
void
accept
(
Check
c
)
{
super
.
accept
(
c
);
if
(
c
.
canExecute
(
this
))
{
c
.
check
(
this
);
}
for
(
Geometry
geom
:
geometryList
)
{
geom
.
accept
(
c
);
}
}
@Override
public
boolean
containsError
(
CheckId
checkIdentifier
)
{
boolean
hasError
=
super
.
containsError
(
checkIdentifier
);
if
(
hasError
)
{
return
true
;
}
for
(
Geometry
geom
:
geometryList
)
{
if
(
geom
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
return
false
;
}
@Override
public
void
clearAllContainedCheckResults
()
{
super
.
clearCheckResults
();
for
(
Geometry
geom
:
geometryList
)
{
geom
.
clearAllContainedCheckResults
();
}
}
@Override
public
void
collectContainedErrors
(
List
<
CheckError
>
errors
)
{
super
.
collectContainedErrors
(
errors
);
for
(
Geometry
geom
:
geometryList
)
{
geom
.
collectContainedErrors
(
errors
);
}
}
@Override
public
boolean
containsAnyError
()
{
boolean
hasError
=
super
.
containsAnyError
();
if
(
hasError
)
{
return
true
;
}
for
(
Geometry
geom
:
geometryList
)
{
if
(
geom
.
containsAnyError
())
{
return
true
;
}
}
return
false
;
}
public
Geometry
getGeometry
(
GeometryType
type
,
Lod
lod
)
{
for
(
Geometry
geom
:
geometryList
)
{
if
(
geom
.
getType
()
==
type
&&
geom
.
getLod
()
==
lod
)
{
return
geom
;
}
}
return
null
;
}
@Override
public
void
prepareForChecking
()
{
for
(
Geometry
geom
:
geometryList
)
{
geom
.
prepareForChecking
();
}
}
@Override
public
void
clearMetaInformation
()
{
for
(
Geometry
geom
:
geometryList
)
{
geom
.
clearMetaInformation
();
}
}
@Override
public
void
collectInstances
(
CopyHandler
handler
)
{
for
(
Geometry
geom
:
geometryList
)
{
handler
.
addInstance
(
geom
);
}
}
@Override
public
void
fillValues
(
Copyable
original
,
CopyHandler
handler
)
{
super
.
fillValues
(
original
,
handler
);
CityObject
originalCo
=
(
CityObject
)
original
;
for
(
Geometry
geom
:
originalCo
.
geometryList
)
{
geometryList
.
add
(
handler
.
getCopyInstance
(
geom
));
}
}
}
public
Geometry
getHighestLodGeometry
()
{
Geometry
highestLodGeometry
=
null
;
Lod
highestLod
=
null
;
for
(
Geometry
geom
:
geometryList
)
{
if
(
highestLod
==
null
||
geom
.
getLod
().
isHigher
(
highestLod
))
{
highestLodGeometry
=
geom
;
highestLod
=
geom
.
getLod
();
}
}
return
highestLodGeometry
;
}
public
abstract
FeatureType
getFeatureType
();
@Override
public
void
accept
(
Check
c
)
{
super
.
accept
(
c
);
if
(
c
.
canExecute
(
this
))
{
c
.
check
(
this
);
}
for
(
Geometry
geom
:
geometryList
)
{
geom
.
accept
(
c
);
}
}
@Override
public
boolean
containsError
(
CheckId
checkIdentifier
)
{
boolean
hasError
=
super
.
containsError
(
checkIdentifier
);
if
(
hasError
)
{
return
true
;
}
for
(
Geometry
geom
:
geometryList
)
{
if
(
geom
.
containsError
(
checkIdentifier
))
{
return
true
;
}
}
return
false
;
}
@Override
public
void
clearAllContainedCheckResults
()
{
super
.
clearCheckResults
();
for
(
Geometry
geom
:
geometryList
)
{
geom
.
clearAllContainedCheckResults
();
}
}
@Override
public
void
collectContainedErrors
(
List
<
CheckError
>
errors
)
{
super
.
collectContainedErrors
(
errors
);
for
(
Geometry
geom
:
geometryList
)
{
geom
.
collectContainedErrors
(
errors
);
}
}
@Override
public
boolean
containsAnyError
()
{
boolean
hasError
=
super
.
containsAnyError
();
if
(
hasError
)
{
return
true
;
}
for
(
Geometry
geom
:
geometryList
)
{
if
(
geom
.
containsAnyError
())
{
return
true
;
}
}
return
false
;
}
public
Geometry
getGeometry
(
GeometryType
type
,
Lod
lod
)
{
for
(
Geometry
geom
:
geometryList
)
{
if
(
geom
.
getType
()
==
type
&&
geom
.
getLod
()
==
lod
)
{
return
geom
;
}
}
return
null
;
}
@Override
public
void
prepareForChecking
()
{
for
(
Geometry
geom
:
geometryList
)
{
geom
.
prepareForChecking
();
}
}
@Override
public
void
clearMetaInformation
()
{
for
(
Geometry
geom
:
geometryList
)
{
geom
.
clearMetaInformation
();
}
}
@Override
public
void
collectInstances
(
CopyHandler
handler
)
{
for
(
Geometry
geom
:
geometryList
)
{
handler
.
addInstance
(
geom
);
}
}
@Override
public
void
fillValues
(
Copyable
original
,
CopyHandler
handler
)
{
super
.
fillValues
(
original
,
handler
);
CityObject
originalCo
=
(
CityObject
)
original
;
for
(
Geometry
geom
:
originalCo
.
geometryList
)
{
geometryList
.
add
(
handler
.
getCopyInstance
(
geom
));
}
}
}
Prev
1
2
3
4
Next
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