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
43f226db
Commit
43f226db
authored
Sep 23, 2024
by
Riegel
Browse files
Add Rendering support for Furniture and Room objects
parent
fbcd8f92
Changes
7
Hide whitespace changes
Inline
Side-by-side
CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/datastructure/AbstractFurniture.java
View file @
43f226db
package
de.hft.stuttgart.citydoctor2.datastructure
;
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
;
...
...
@@ -28,6 +31,63 @@ public abstract class AbstractFurniture extends CityObject{
private
org
.
citygml4j
.
core
.
model
.
construction
.
AbstractFurniture
af
;
@Override
public
void
accept
(
Check
c
)
{
super
.
accept
(
c
);
if
(
c
.
canExecute
(
this
))
{
c
.
check
(
this
);
}
for
(
BoundarySurface
boundarySurface
:
boundarySurfaceList
)
{
boundarySurface
.
accept
(
c
);
}
}
@Override
public
void
collectContainedErrors
(
List
<
CheckError
>
errors
){
super
.
collectContainedErrors
(
errors
);
for
(
BoundarySurface
boundarySurface
:
boundarySurfaceList
)
{
boundarySurface
.
collectContainedErrors
(
errors
);
}
}
@Override
public
void
clearAllContainedCheckResults
(){
super
.
clearAllContainedCheckResults
();
for
(
BoundarySurface
boundarySurface
:
boundarySurfaceList
)
{
boundarySurface
.
clearAllContainedCheckResults
();
}
}
@Override
public
boolean
containsError
(
CheckId
checkIdentifier
){
boolean
hasError
=
super
.
containsError
(
checkIdentifier
);
if
(
hasError
){
return
true
;
}
for
(
BoundarySurface
boundarySurface
:
boundarySurfaceList
)
{
if
(
boundarySurface
.
containsError
(
checkIdentifier
)){
return
true
;
}
}
return
false
;
}
@Override
public
boolean
containsAnyError
(){
boolean
hasError
=
super
.
containsAnyError
();
if
(
hasError
){
return
true
;
}
for
(
BoundarySurface
boundarySurface
:
boundarySurfaceList
)
{
if
(
boundarySurface
.
containsAnyError
()){
return
true
;
}
}
return
false
;
}
@Override
public
org
.
citygml4j
.
core
.
model
.
construction
.
AbstractFurniture
getGmlObject
(){
return
af
;
...
...
@@ -107,6 +167,23 @@ public abstract class AbstractFurniture extends CityObject{
}
@Override
public
void
prepareForChecking
(){
super
.
prepareForChecking
();
for
(
BoundarySurface
boundarySurface
:
boundarySurfaceList
)
{
boundarySurface
.
prepareForChecking
();
}
}
@Override
public
void
clearMetaInformation
()
{
super
.
clearMetaInformation
();
for
(
BoundarySurface
boundarySurface
:
boundarySurfaceList
)
{
boundarySurface
.
clearMetaInformation
();
}
}
@Override
public
FeatureType
getFeatureType
()
{
return
FeatureType
.
FURNITURE
;
...
...
CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/CityDoctorController.java
View file @
43f226db
...
...
@@ -12,6 +12,8 @@ import java.util.StringJoiner;
import
java.util.concurrent.atomic.AtomicInteger
;
import
java.util.function.Function
;
import
de.hft.stuttgart.citydoctor2.datastructure.*
;
import
de.hft.stuttgart.citydoctor2.gui.tree.*
;
import
org.apache.logging.log4j.LogManager
;
import
org.apache.logging.log4j.Logger
;
import
org.citygml4j.core.model.core.CityModel
;
...
...
@@ -22,52 +24,8 @@ import de.hft.stuttgart.citydoctor2.check.Checker;
import
de.hft.stuttgart.citydoctor2.check.ErrorId
;
import
de.hft.stuttgart.citydoctor2.check.ValidationConfiguration
;
import
de.hft.stuttgart.citydoctor2.check.error.SchematronError
;
import
de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface
;
import
de.hft.stuttgart.citydoctor2.datastructure.BridgeConstructiveElement
;
import
de.hft.stuttgart.citydoctor2.datastructure.BridgeObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.Building
;
import
de.hft.stuttgart.citydoctor2.datastructure.Installation
;
import
de.hft.stuttgart.citydoctor2.datastructure.BuildingPart
;
import
de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel
;
import
de.hft.stuttgart.citydoctor2.datastructure.CityObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.FeatureType
;
import
de.hft.stuttgart.citydoctor2.datastructure.Geometry
;
import
de.hft.stuttgart.citydoctor2.datastructure.LandObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.Opening
;
import
de.hft.stuttgart.citydoctor2.datastructure.ReliefObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.TinObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.TransportationObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.Vegetation
;
import
de.hft.stuttgart.citydoctor2.exceptions.CityDoctorWriteException
;
import
de.hft.stuttgart.citydoctor2.gui.table.ErrorStat
;
import
de.hft.stuttgart.citydoctor2.gui.tree.AllBoundarySurfacesNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.AllBridgeConstructiveElementsNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.AllBridgePartsNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.AllBridgesNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.AllInstallationsNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.AllBuildingPartsNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.AllBuildingsNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.AllOpeningsNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.AllTerrainNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.AllTinNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.AllTransportationNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.AllVegetationNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.AllWaterNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.BoundarySurfaceNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.BridgeConstructiveElementNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.BridgeNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.InstallationNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.BuildingNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.BuildingPartNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.ButtonRenderable
;
import
de.hft.stuttgart.citydoctor2.gui.tree.CityObjectNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.GeometryNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.LandUseNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.OpeningNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.ReliefNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.Renderable
;
import
de.hft.stuttgart.citydoctor2.gui.tree.TinNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.VegetationNode
;
import
de.hft.stuttgart.citydoctor2.mapper.citygml3.GMLValidationHandler
;
import
de.hft.stuttgart.citydoctor2.parser.CityGmlParseException
;
import
de.hft.stuttgart.citydoctor2.parser.CityGmlParser
;
...
...
@@ -441,6 +399,8 @@ public class CityDoctorController {
createGeometryNodes
(
b
,
item
);
createBoundarySurfaceNodes
(
b
.
getBoundarySurfaces
(),
item
);
createBuildingInstallationNodes
(
b
,
item
);
createBuildingRoomNodes
(
b
,
item
);
createBuildingFurnitureNodes
(
b
,
item
);
createBuildingPartNodes
(
b
,
item
);
}
}
...
...
@@ -526,6 +486,51 @@ public class CityDoctorController {
}
}
private
void
createBuildingRoomNodes
(
Building
ab
,
TreeItem
<
Renderable
>
root
)
{
createRoomNodes
(
ab
.
getBuildingRooms
(),
root
);
}
private
void
createRoomNodes
(
List
<?
extends
AbstractRoom
>
rooms
,
TreeItem
<
Renderable
>
root
)
{
if
(
rooms
.
isEmpty
())
{
return
;
}
AllRoomsNode
allRoNode
=
new
AllRoomsNode
(
rooms
);
TreeItem
<
Renderable
>
allRoNodeTextItem
=
new
TreeItem
<>(
allRoNode
);
root
.
getChildren
().
add
(
allRoNodeTextItem
);
for
(
AbstractRoom
room
:
rooms
)
{
RoomNode
roomNode
=
new
RoomNode
(
room
);
TreeItem
<
Renderable
>
roomNodeTextItem
=
new
TreeItem
<>(
roomNode
);
roomNodeTextItem
.
setExpanded
(
true
);
allRoNodeTextItem
.
getChildren
().
add
(
roomNodeTextItem
);
createGeometryNodes
(
room
,
roomNodeTextItem
);
createBoundarySurfaceNodes
(
room
.
getBoundarySurfaceList
(),
roomNodeTextItem
);
}
}
private
void
createBuildingFurnitureNodes
(
Building
ab
,
TreeItem
<
Renderable
>
root
)
{
createFurnitureNodes
(
ab
.
getBuildingRoomFurnitureList
(),
root
);
}
private
void
createFurnitureNodes
(
List
<?
extends
AbstractFurniture
>
furniture
,
TreeItem
<
Renderable
>
root
){
if
(
furniture
.
isEmpty
())
{
return
;
}
AllFurnitureNode
allFnNode
=
new
AllFurnitureNode
(
furniture
);
TreeItem
<
Renderable
>
allFnNodeTextItem
=
new
TreeItem
<>(
allFnNode
);
root
.
getChildren
().
add
(
allFnNodeTextItem
);
for
(
AbstractFurniture
fn
:
furniture
)
{
FurnitureNode
fnNode
=
new
FurnitureNode
(
fn
);
TreeItem
<
Renderable
>
fnNodeTextItem
=
new
TreeItem
<>(
fnNode
);
fnNodeTextItem
.
setExpanded
(
true
);
allFnNodeTextItem
.
getChildren
().
add
(
fnNodeTextItem
);
createGeometryNodes
(
fn
,
fnNodeTextItem
);
createBoundarySurfaceNodes
(
fn
.
getBoundarySurfaceList
(),
fnNodeTextItem
);
}
}
private
void
createBoundarySurfaceNodes
(
List
<
BoundarySurface
>
bsList
,
TreeItem
<
Renderable
>
root
)
{
if
(
bsList
.
isEmpty
())
{
return
;
...
...
CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/Renderer.java
View file @
43f226db
...
...
@@ -7,34 +7,12 @@ import java.util.HashSet;
import
java.util.List
;
import
java.util.Set
;
import
de.hft.stuttgart.citydoctor2.datastructure.*
;
import
org.apache.logging.log4j.LogManager
;
import
org.apache.logging.log4j.Logger
;
import
de.hft.stuttgart.citydoctor2.check.CheckError
;
import
de.hft.stuttgart.citydoctor2.check.Checkable
;
import
de.hft.stuttgart.citydoctor2.datastructure.AbstractBuilding
;
import
de.hft.stuttgart.citydoctor2.datastructure.BoundarySurface
;
import
de.hft.stuttgart.citydoctor2.datastructure.BoundingBox
;
import
de.hft.stuttgart.citydoctor2.datastructure.BridgeConstructiveElement
;
import
de.hft.stuttgart.citydoctor2.datastructure.BridgeObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.Building
;
import
de.hft.stuttgart.citydoctor2.datastructure.Installation
;
import
de.hft.stuttgart.citydoctor2.datastructure.BuildingPart
;
import
de.hft.stuttgart.citydoctor2.datastructure.CityDoctorModel
;
import
de.hft.stuttgart.citydoctor2.datastructure.CityObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.ConcretePolygon
;
import
de.hft.stuttgart.citydoctor2.datastructure.Edge
;
import
de.hft.stuttgart.citydoctor2.datastructure.Geometry
;
import
de.hft.stuttgart.citydoctor2.datastructure.LinearRing
;
import
de.hft.stuttgart.citydoctor2.datastructure.Lod
;
import
de.hft.stuttgart.citydoctor2.datastructure.Opening
;
import
de.hft.stuttgart.citydoctor2.datastructure.Polygon
;
import
de.hft.stuttgart.citydoctor2.datastructure.ReliefObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.TinObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.TransportationObject
;
import
de.hft.stuttgart.citydoctor2.datastructure.Vegetation
;
import
de.hft.stuttgart.citydoctor2.datastructure.Vertex
;
import
de.hft.stuttgart.citydoctor2.datastructure.WaterObject
;
import
de.hft.stuttgart.citydoctor2.gui.filter.ViewFilter
;
import
de.hft.stuttgart.citydoctor2.gui.tree.EdgeNode
;
import
de.hft.stuttgart.citydoctor2.gui.tree.ErrorItemVisitor
;
...
...
@@ -208,6 +186,18 @@ public class Renderer {
}
}
}
for
(
BuildingRoom
br
:
b
.
getBuildingRooms
())
{
addPolygons
(
br
,
polygons
);
for
(
BoundarySurface
bs
:
br
.
getBoundarySurfaceList
()){
addPolygons
(
bs
,
polygons
);
}
}
for
(
BuildingRoomFurniture
brf
:
b
.
getBuildingRoomFurnitureList
()){
addPolygons
(
brf
,
polygons
);
for
(
BoundarySurface
bs
:
brf
.
getBoundarySurfaceList
()){
addPolygons
(
bs
,
polygons
);
}
}
for
(
BuildingPart
bp
:
b
.
getBuildingParts
())
{
polygons
.
addAll
(
setupBuildingPartPolygons
(
bp
));
}
...
...
@@ -247,7 +237,57 @@ public class Renderer {
}
return
polygons
;
}
public
void
render
(
AbstractRoom
room
){
refresher
=
()
->
{
Set
<
ConcretePolygon
>
setupRoomPolygons
=
setupRoomPolygons
(
room
);
mainWindow
.
zoomOutForBoundingBox
(
BoundingBox
.
of
(
setupRoomPolygons
));
render
(
setupRoomPolygons
);
Platform
.
runLater
(()
->
{
errorUpdater
=
()
->
displayErrors
(
room
);
errorUpdater
.
run
();
});
};
refresher
.
run
();
}
public
Set
<
ConcretePolygon
>
setupRoomPolygons
(
AbstractRoom
room
)
{
Set
<
ConcretePolygon
>
polygons
=
new
HashSet
<>();
addPolygons
(
room
,
polygons
);
for
(
BoundarySurface
bs
:
room
.
getBoundarySurfaceList
())
{
addPolygons
(
bs
,
polygons
);
for
(
Opening
op
:
bs
.
getOpenings
())
{
addPolygons
(
op
,
polygons
);
}
}
return
polygons
;
}
public
void
render
(
AbstractFurniture
furniture
){
refresher
=
()
->
{
Set
<
ConcretePolygon
>
setupFurniturePolygons
=
setupFurniturePolygons
(
furniture
);
mainWindow
.
zoomOutForBoundingBox
(
BoundingBox
.
of
(
setupFurniturePolygons
));
render
(
setupFurniturePolygons
);
Platform
.
runLater
(()
->
{
errorUpdater
=
()
->
displayErrors
(
furniture
);
errorUpdater
.
run
();
});
};
refresher
.
run
();
}
public
Set
<
ConcretePolygon
>
setupFurniturePolygons
(
AbstractFurniture
furniture
)
{
Set
<
ConcretePolygon
>
polygons
=
new
HashSet
<>();
addPolygons
(
furniture
,
polygons
);
for
(
BoundarySurface
bs
:
furniture
.
getBoundarySurfaceList
())
{
addPolygons
(
bs
,
polygons
);
for
(
Opening
op
:
bs
.
getOpenings
())
{
addPolygons
(
op
,
polygons
);
}
}
return
polygons
;
}
public
void
render
(
BridgeObject
bridge
)
{
refresher
=
()
->
{
Set
<
ConcretePolygon
>
setupBridgePolygons
=
setupBridgePolygons
(
bridge
);
...
...
@@ -657,6 +697,12 @@ public class Renderer {
}
}
}
for
(
BuildingRoom
br
:
ab
.
getBuildingRooms
())
{
addPolygons
(
br
,
polygons
);
for
(
BoundarySurface
bs
:
br
.
getBoundarySurfaceList
()){
addPolygons
(
bs
,
polygons
);
}
}
for
(
BoundarySurface
bs
:
ab
.
getBoundarySurfaces
())
{
addPolygons
(
bs
,
polygons
);
for
(
Opening
o
:
bs
.
getOpenings
())
{
...
...
CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllFurnitureNode.java
0 → 100644
View file @
43f226db
package
de.hft.stuttgart.citydoctor2.gui.tree
;
import
de.hft.stuttgart.citydoctor2.datastructure.AbstractFurniture
;
import
de.hft.stuttgart.citydoctor2.gui.CheckStatus
;
import
de.hft.stuttgart.citydoctor2.gui.Renderer
;
import
java.util.List
;
public
class
AllFurnitureNode
extends
Renderable
{
private
final
List
<?
extends
AbstractFurniture
>
furniture
;
public
AllFurnitureNode
(
List
<?
extends
AbstractFurniture
>
furniture
)
{
this
.
furniture
=
furniture
;
}
@Override
public
String
getText
()
{
return
"Building Furniture"
;
}
@Override
public
void
visit
(
Renderer
renderer
)
{
renderer
.
clearCurrentRender
();
}
@Override
public
void
refreshTextColor
()
{
boolean
wasChecked
=
false
;
for
(
AbstractFurniture
af
:
furniture
)
{
if
(
af
.
isValidated
())
{
wasChecked
=
true
;
if
(
af
.
containsAnyError
())
{
setStatus
(
CheckStatus
.
ERROR
);
return
;
}
}
}
if
(
wasChecked
)
{
setStatus
(
CheckStatus
.
OK
);
}
else
{
setStatus
(
CheckStatus
.
NOT_CHECKED
);
}
}
}
CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/AllRoomsNode.java
0 → 100644
View file @
43f226db
package
de.hft.stuttgart.citydoctor2.gui.tree
;
import
de.hft.stuttgart.citydoctor2.datastructure.AbstractRoom
;
import
de.hft.stuttgart.citydoctor2.gui.CheckStatus
;
import
de.hft.stuttgart.citydoctor2.gui.Renderer
;
import
java.util.List
;
public
class
AllRoomsNode
extends
Renderable
{
private
final
List
<?
extends
AbstractRoom
>
rooms
;
public
AllRoomsNode
(
List
<?
extends
AbstractRoom
>
rooms
)
{
this
.
rooms
=
rooms
;
}
@Override
public
String
getText
()
{
return
"Building Rooms"
;
}
@Override
public
void
visit
(
Renderer
renderer
)
{
renderer
.
clearCurrentRender
();
}
@Override
public
void
refreshTextColor
()
{
boolean
wasChecked
=
false
;
for
(
AbstractRoom
ar
:
rooms
)
{
if
(
ar
.
isValidated
())
{
wasChecked
=
true
;
if
(
ar
.
containsAnyError
())
{
setStatus
(
CheckStatus
.
ERROR
);
return
;
}
}
}
if
(
wasChecked
)
{
setStatus
(
CheckStatus
.
OK
);
}
else
{
setStatus
(
CheckStatus
.
NOT_CHECKED
);
}
}
}
CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/FurnitureNode.java
0 → 100644
View file @
43f226db
package
de.hft.stuttgart.citydoctor2.gui.tree
;
import
de.hft.stuttgart.citydoctor2.datastructure.AbstractFurniture
;
import
de.hft.stuttgart.citydoctor2.gui.CheckStatus
;
import
de.hft.stuttgart.citydoctor2.gui.Renderer
;
public
class
FurnitureNode
extends
Renderable
{
private
final
AbstractFurniture
furniture
;
public
FurnitureNode
(
AbstractFurniture
furniture
)
{
this
.
furniture
=
furniture
;
}
@Override
public
String
getText
()
{
return
furniture
.
getGmlId
().
getGmlString
();
}
@Override
public
void
visit
(
Renderer
renderer
)
{
renderer
.
render
(
furniture
);
}
@Override
public
void
refreshTextColor
()
{
if
(!
furniture
.
isValidated
())
{
setStatus
(
CheckStatus
.
NOT_CHECKED
);
}
else
if
(
furniture
.
containsAnyError
())
{
setStatus
(
CheckStatus
.
ERROR
);
}
else
{
setStatus
(
CheckStatus
.
OK
);
}
}
}
CityDoctorParent/Extensions/CityDoctorGUI/src/main/java/de/hft/stuttgart/citydoctor2/gui/tree/RoomNode.java
0 → 100644
View file @
43f226db
package
de.hft.stuttgart.citydoctor2.gui.tree
;
import
de.hft.stuttgart.citydoctor2.datastructure.AbstractRoom
;
import
de.hft.stuttgart.citydoctor2.gui.CheckStatus
;
import
de.hft.stuttgart.citydoctor2.gui.Renderer
;
public
class
RoomNode
extends
Renderable
{
private
final
AbstractRoom
room
;
public
RoomNode
(
AbstractRoom
room
)
{
this
.
room
=
room
;
}
@Override
public
String
getText
()
{
return
room
.
getGmlId
().
getGmlString
();
}
@Override
public
void
visit
(
Renderer
renderer
)
{
renderer
.
render
(
room
);
}
@Override
public
void
refreshTextColor
()
{
if
(!
room
.
isValidated
())
{
setStatus
(
CheckStatus
.
NOT_CHECKED
);
}
else
if
(
room
.
containsAnyError
())
{
setStatus
(
CheckStatus
.
ERROR
);
}
else
{
setStatus
(
CheckStatus
.
OK
);
}
}
}
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