Commit c949352d authored by Riegel's avatar Riegel
Browse files

Add rendering of Storeys and BuildingUnits

parent 7d24a81b
...@@ -56,7 +56,8 @@ public abstract class AbstractBuilding extends CityObject { ...@@ -56,7 +56,8 @@ public abstract class AbstractBuilding extends CityObject {
private final List<Installation> buildingInstallations = new ArrayList<>(2); private final List<Installation> buildingInstallations = new ArrayList<>(2);
private final List<BoundarySurface> boundarySurfaceList = new ArrayList<>(); private final List<BoundarySurface> boundarySurfaceList = new ArrayList<>();
private final List<BuildingRoom> buildingRooms = new ArrayList<>(); private final List<BuildingRoom> buildingRooms = new ArrayList<>();
private final List<AbstractBuildingSubdivision> buildingSubdivisions = new ArrayList<>(); private final List<Storey> buildingStoreys = new ArrayList<>();
private final List<BuildingUnit> buildingUnits = new ArrayList<>();
private final List<BuildingRoomFurniture> buildingRoomFurnitureList = new ArrayList<>(); private final List<BuildingRoomFurniture> buildingRoomFurnitureList = new ArrayList<>();
private org.citygml4j.core.model.building.AbstractBuilding ab; private org.citygml4j.core.model.building.AbstractBuilding ab;
...@@ -102,8 +103,11 @@ public abstract class AbstractBuilding extends CityObject { ...@@ -102,8 +103,11 @@ public abstract class AbstractBuilding extends CityObject {
for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) { for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) {
bfr.unsetGmlGeometries(); bfr.unsetGmlGeometries();
} }
for (AbstractBuildingSubdivision abs : buildingSubdivisions) { for (Storey storey : buildingStoreys) {
abs.unsetGmlGeometries(); storey.unsetGmlGeometries();
}
for (BuildingUnit bu : buildingUnits) {
bu.unsetGmlGeometries();
} }
} }
...@@ -130,8 +134,11 @@ public abstract class AbstractBuilding extends CityObject { ...@@ -130,8 +134,11 @@ public abstract class AbstractBuilding extends CityObject {
for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) { for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) {
bfr.reCreateGeometries(factory, config); bfr.reCreateGeometries(factory, config);
} }
for (AbstractBuildingSubdivision abs : buildingSubdivisions) { for (Storey storey : buildingStoreys) {
abs.reCreateGeometries(factory, config); storey.reCreateGeometries(factory, config);
}
for (BuildingUnit bu : buildingUnits) {
bu.reCreateGeometries(factory, config);
} }
} }
...@@ -208,8 +215,11 @@ public abstract class AbstractBuilding extends CityObject { ...@@ -208,8 +215,11 @@ public abstract class AbstractBuilding extends CityObject {
for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) { for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) {
bfr.accept(c); bfr.accept(c);
} }
for (AbstractBuildingSubdivision abs : buildingSubdivisions) { for (Storey storey : buildingStoreys) {
abs.accept(c); storey.accept(c);
}
for (BuildingUnit bu : buildingUnits) {
bu.accept(c);
} }
} }
...@@ -228,8 +238,11 @@ public abstract class AbstractBuilding extends CityObject { ...@@ -228,8 +238,11 @@ public abstract class AbstractBuilding extends CityObject {
for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) { for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) {
bfr.collectContainedErrors(errors); bfr.collectContainedErrors(errors);
} }
for (AbstractBuildingSubdivision abs : buildingSubdivisions) { for (Storey storey : buildingStoreys) {
abs.collectContainedErrors(errors); storey.collectContainedErrors(errors);
}
for (BuildingUnit bu : buildingUnits) {
bu.collectContainedErrors(errors);
} }
} }
...@@ -248,8 +261,11 @@ public abstract class AbstractBuilding extends CityObject { ...@@ -248,8 +261,11 @@ public abstract class AbstractBuilding extends CityObject {
for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) { for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) {
bfr.clearAllContainedCheckResults(); bfr.clearAllContainedCheckResults();
} }
for (AbstractBuildingSubdivision abs : buildingSubdivisions) { for (Storey storey : buildingStoreys) {
abs.clearAllContainedCheckResults(); storey.clearAllContainedCheckResults();
}
for (BuildingUnit bu : buildingUnits) {
bu.clearAllContainedCheckResults();
} }
} }
...@@ -279,8 +295,13 @@ public abstract class AbstractBuilding extends CityObject { ...@@ -279,8 +295,13 @@ public abstract class AbstractBuilding extends CityObject {
return true; return true;
} }
} }
for (AbstractBuildingSubdivision abs : buildingSubdivisions) { for (Storey storey : buildingStoreys) {
if (abs.containsError(checkIdentifier)) { if (storey.containsError(checkIdentifier)) {
return true;
}
}
for (BuildingUnit bu : buildingUnits) {
if (bu.containsError(checkIdentifier)) {
return true; return true;
} }
} }
...@@ -313,8 +334,13 @@ public abstract class AbstractBuilding extends CityObject { ...@@ -313,8 +334,13 @@ public abstract class AbstractBuilding extends CityObject {
return true; return true;
} }
} }
for (AbstractBuildingSubdivision abs : buildingSubdivisions) { for (Storey storey : buildingStoreys) {
if (abs.containsAnyError()) { if (storey.containsAnyError()) {
return true;
}
}
for (BuildingUnit bu : buildingUnits) {
if (bu.containsAnyError()) {
return true; return true;
} }
} }
...@@ -345,8 +371,12 @@ public abstract class AbstractBuilding extends CityObject { ...@@ -345,8 +371,12 @@ public abstract class AbstractBuilding extends CityObject {
roomFurniture.setParent(this); roomFurniture.setParent(this);
} }
public void addAbstractBuildingSubdivision(AbstractBuildingSubdivision abs) { public void addStorey(Storey storey) {
buildingSubdivisions.add(abs); buildingStoreys.add(storey);
}
public void addBuildingUnit(BuildingUnit buildingUnit) {
buildingUnits.add(buildingUnit);
} }
public void setGmlObject(org.citygml4j.core.model.building.AbstractBuilding ab) { public void setGmlObject(org.citygml4j.core.model.building.AbstractBuilding ab) {
...@@ -365,8 +395,12 @@ public abstract class AbstractBuilding extends CityObject { ...@@ -365,8 +395,12 @@ public abstract class AbstractBuilding extends CityObject {
return buildingRoomFurnitureList; return buildingRoomFurnitureList;
} }
public List<AbstractBuildingSubdivision> getBuildingSubdivisions() { public List<Storey> getBuildingStoreys() {
return buildingSubdivisions; return buildingStoreys;
}
public List<BuildingUnit> getBuildingUnits() {
return buildingUnits;
} }
@Override @Override
...@@ -384,8 +418,11 @@ public abstract class AbstractBuilding extends CityObject { ...@@ -384,8 +418,11 @@ public abstract class AbstractBuilding extends CityObject {
for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) { for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) {
bfr.prepareForChecking(); bfr.prepareForChecking();
} }
for (AbstractBuildingSubdivision abs : buildingSubdivisions) { for (Storey storey : buildingStoreys) {
abs.prepareForChecking(); storey.prepareForChecking();
}
for (BuildingUnit bu : buildingUnits) {
bu.prepareForChecking();
} }
} }
...@@ -404,8 +441,11 @@ public abstract class AbstractBuilding extends CityObject { ...@@ -404,8 +441,11 @@ public abstract class AbstractBuilding extends CityObject {
for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) { for (BuildingRoomFurniture bfr : buildingRoomFurnitureList) {
bfr.clearMetaInformation(); bfr.clearMetaInformation();
} }
for (AbstractBuildingSubdivision abs : buildingSubdivisions) { for (Storey storey : buildingStoreys) {
abs.clearMetaInformation(); storey.clearMetaInformation();
}
for (BuildingUnit bu : buildingUnits) {
bu.clearMetaInformation();
} }
} }
...@@ -416,7 +456,8 @@ public abstract class AbstractBuilding extends CityObject { ...@@ -416,7 +456,8 @@ public abstract class AbstractBuilding extends CityObject {
handler.addInstance(buildingInstallations); handler.addInstance(buildingInstallations);
handler.addInstance(buildingRooms); handler.addInstance(buildingRooms);
handler.addInstance(buildingRoomFurnitureList); handler.addInstance(buildingRoomFurnitureList);
handler.addInstance(buildingSubdivisions); handler.addInstance(buildingStoreys);
handler.addInstance(buildingUnits);
} }
@Override @Override
...@@ -435,8 +476,11 @@ public abstract class AbstractBuilding extends CityObject { ...@@ -435,8 +476,11 @@ public abstract class AbstractBuilding extends CityObject {
for (BuildingRoomFurniture originalBFR : originalAb.buildingRoomFurnitureList) { for (BuildingRoomFurniture originalBFR : originalAb.buildingRoomFurnitureList) {
buildingRoomFurnitureList.add(handler.getCopyInstance(originalBFR)); buildingRoomFurnitureList.add(handler.getCopyInstance(originalBFR));
} }
for (AbstractBuildingSubdivision originalBSub : originalAb.buildingSubdivisions) { for (Storey originalBStoreys : originalAb.buildingStoreys) {
buildingSubdivisions.add(handler.getCopyInstance(originalBSub)); buildingStoreys.add(handler.getCopyInstance(originalBStoreys));
}
for (BuildingUnit originalBun : originalAb.buildingUnits) {
buildingUnits.add(handler.getCopyInstance(originalBun));
} }
ab = originalAb.ab; ab = originalAb.ab;
} }
......
...@@ -41,6 +41,8 @@ import org.citygml4j.core.model.bridge.BridgePart; ...@@ -41,6 +41,8 @@ import org.citygml4j.core.model.bridge.BridgePart;
import org.citygml4j.core.model.bridge.BridgePartProperty; import org.citygml4j.core.model.bridge.BridgePartProperty;
import org.citygml4j.core.model.building.*; import org.citygml4j.core.model.building.*;
import org.citygml4j.core.model.building.BuildingFurniture; import org.citygml4j.core.model.building.BuildingFurniture;
import org.citygml4j.core.model.building.BuildingUnit;
import org.citygml4j.core.model.building.Storey;
import org.citygml4j.core.model.construction.AbstractConstruction; import org.citygml4j.core.model.construction.AbstractConstruction;
import org.citygml4j.core.model.core.AbstractCityObject; import org.citygml4j.core.model.core.AbstractCityObject;
import org.citygml4j.core.model.core.AbstractFeatureWithLifespan; import org.citygml4j.core.model.core.AbstractFeatureWithLifespan;
...@@ -605,6 +607,22 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -605,6 +607,22 @@ public class Citygml3FeatureMapper extends ObjectWalker {
cdBuilding.addBuildingRoom(br); cdBuilding.addBuildingRoom(br);
} }
for(AbstractBuildingSubdivisionProperty abs : gmlAb.getBuildingSubdivisions()) {
var gmlABS = abs.getObject();
if (gmlABS == null) {
continue;
}
if (gmlABS instanceof Storey gmlStorey) {
de.hft.stuttgart.citydoctor2.datastructure.Storey storey = mapBuildingStorey(gmlStorey);
cdBuilding.addStorey(storey);
}
else if (gmlABS instanceof BuildingUnit gmlBU){
de.hft.stuttgart.citydoctor2.datastructure.BuildingUnit bu = mapBuildingUnit(gmlBU);
cdBuilding.addBuildingUnit(bu);
}
}
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, vertexMap, config); SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, vertexMap, config);
for (AbstractSpaceBoundaryProperty surfaceProp : gmlAb.getBoundaries()) { for (AbstractSpaceBoundaryProperty surfaceProp : gmlAb.getBoundaries()) {
if (!surfaceProp.isSetObject()) { if (!surfaceProp.isSetObject()) {
...@@ -711,6 +729,54 @@ public class Citygml3FeatureMapper extends ObjectWalker { ...@@ -711,6 +729,54 @@ public class Citygml3FeatureMapper extends ObjectWalker {
} }
private de.hft.stuttgart.citydoctor2.datastructure.Storey mapBuildingStorey(Storey gmlStorey){
de.hft.stuttgart.citydoctor2.datastructure.Storey storey = new de.hft.stuttgart.citydoctor2.datastructure.Storey();
storey.setGmlObject(gmlStorey);
mapAbstractSpace(gmlStorey, storey);
storey.unsetGmlGeometries();
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, vertexMap, config);
for (AbstractSpaceBoundaryProperty surfaceProp : gmlStorey.getBoundaries()) {
if (!surfaceProp.isSetObject()) {
continue;
}
AbstractSpaceBoundary surface = surfaceProp.getObject();
surface.accept(surfaceMapper);
}
for (BoundarySurface bs : surfaceMapper.getSurfaces()) {
storey.addBoundarySurface(bs);
for (Geometry geom : bs.getGeometries()) {
for (Polygon p : geom.getPolygons()) {
p.setPartOfSurface(bs);
}
}
}
return storey;
}
private de.hft.stuttgart.citydoctor2.datastructure.BuildingUnit mapBuildingUnit(BuildingUnit gmlBU){
de.hft.stuttgart.citydoctor2.datastructure.BuildingUnit bu = new de.hft.stuttgart.citydoctor2.datastructure.BuildingUnit();
bu.setGmlObject(gmlBU);
mapAbstractSpace(gmlBU, bu);
bu.unsetGmlGeometries();
SurfaceMapper surfaceMapper = new SurfaceMapper(polygonMap, references, vertexMap, config);
for (AbstractSpaceBoundaryProperty surfaceProp : gmlBU.getBoundaries()) {
if (!surfaceProp.isSetObject()) {
continue;
}
AbstractSpaceBoundary surface = surfaceProp.getObject();
surface.accept(surfaceMapper);
}
for (BoundarySurface bs : surfaceMapper.getSurfaces()) {
bu.addBoundarySurface(bs);
for (Geometry geom : bs.getGeometries()) {
for (Polygon p : geom.getPolygons()) {
p.setPartOfSurface(bs);
}
}
}
return bu;
}
private void updatePartOfSurface(AbstractBuilding cdBuilding, SurfaceMapper surfaceMapper) { private void updatePartOfSurface(AbstractBuilding cdBuilding, SurfaceMapper surfaceMapper) {
for (BoundarySurface bs : surfaceMapper.getSurfaces()) { for (BoundarySurface bs : surfaceMapper.getSurfaces()) {
cdBuilding.addBoundarySurface(bs); cdBuilding.addBoundarySurface(bs);
......
...@@ -433,6 +433,8 @@ public class CityDoctorController { ...@@ -433,6 +433,8 @@ public class CityDoctorController {
createBuildingInstallationNodes(b, item); createBuildingInstallationNodes(b, item);
createBuildingRoomNodes(b, item); createBuildingRoomNodes(b, item);
createBuildingFurnitureNodes(b, item); createBuildingFurnitureNodes(b, item);
createBuildingStoreyNodes(b, item);
createBuildingUnitNodes(b, item);
createBuildingPartNodes(b, item); createBuildingPartNodes(b, item);
} }
} }
...@@ -541,6 +543,43 @@ public class CityDoctorController { ...@@ -541,6 +543,43 @@ public class CityDoctorController {
} }
private void createBuildingStoreyNodes(Building ab, TreeItem<Renderable> root){
List<Storey> storeys = ab.getBuildingStoreys();
if (storeys.isEmpty()) {
return;
}
AllStoreysNode allSNode = new AllStoreysNode(storeys);
TreeItem<Renderable> allSNodeTextItem = new TreeItem<>(allSNode);
root.getChildren().add(allSNodeTextItem);
for (Storey storey : storeys) {
StoreyNode storeyNode = new StoreyNode(storey);
TreeItem<Renderable> storeyNodeTextItem = new TreeItem<>(storeyNode);
storeyNodeTextItem.setExpanded(true);
allSNodeTextItem.getChildren().add(storeyNodeTextItem);
createGeometryNodes(storey, storeyNodeTextItem);
createBoundarySurfaceNodes(storey.getBoundarySurfaces(), storeyNodeTextItem);
}
}
public void createBuildingUnitNodes(Building ab, TreeItem<Renderable> root) {
List<BuildingUnit> buildingUnits = ab.getBuildingUnits();
if (buildingUnits.isEmpty()) {
return;
}
AllBuildingUnitsNode allSNode = new AllBuildingUnitsNode(buildingUnits);
TreeItem<Renderable> allSNodeTextItem = new TreeItem<>(allSNode);
root.getChildren().add(allSNodeTextItem);
for (BuildingUnit buildingUnit : buildingUnits) {
BuildingUnitNode buildingUnitNode = new BuildingUnitNode(buildingUnit);
TreeItem<Renderable> storeyNodeTextItem = new TreeItem<>(buildingUnitNode);
storeyNodeTextItem.setExpanded(true);
allSNodeTextItem.getChildren().add(storeyNodeTextItem);
createGeometryNodes(buildingUnit, storeyNodeTextItem);
createBoundarySurfaceNodes(buildingUnit.getBoundarySurfaces(), storeyNodeTextItem);
}
}
private void createBuildingFurnitureNodes(Building ab, TreeItem<Renderable> root) { private void createBuildingFurnitureNodes(Building ab, TreeItem<Renderable> root) {
createFurnitureNodes(ab.getBuildingRoomFurnitureList(), root); createFurnitureNodes(ab.getBuildingRoomFurnitureList(), root);
} }
......
...@@ -288,6 +288,56 @@ public class Renderer { ...@@ -288,6 +288,56 @@ public class Renderer {
return polygons; return polygons;
} }
public void render(Storey storey){
refresher = () -> {
Set<ConcretePolygon> setupStoreyPolygons = setupStoreyPolygons(storey);
mainWindow.zoomOutForBoundingBox(BoundingBox.of(setupStoreyPolygons));
render(setupStoreyPolygons);
Platform.runLater(() -> {
errorUpdater = () -> displayErrors(storey);
errorUpdater.run();
});
};
refresher.run();
}
public Set<ConcretePolygon> setupStoreyPolygons(Storey storey) {
Set<ConcretePolygon> polygons = new HashSet<>();
addPolygons(storey, polygons);
for (BoundarySurface bs : storey.getBoundarySurfaces()) {
addPolygons(bs, polygons);
for (Opening op : bs.getOpenings()) {
addPolygons(op, polygons);
}
}
return polygons;
}
public void render(BuildingUnit buildingUnit){
refresher = () -> {
Set<ConcretePolygon> setupBuildingUnitPolgons = setupBuildingUnitPolygons(buildingUnit);
mainWindow.zoomOutForBoundingBox(BoundingBox.of(setupBuildingUnitPolgons));
render(setupBuildingUnitPolgons);
Platform.runLater(() -> {
errorUpdater = () -> displayErrors(buildingUnit);
errorUpdater.run();
});
};
refresher.run();
}
public Set<ConcretePolygon> setupBuildingUnitPolygons(BuildingUnit buildingUnit) {
Set<ConcretePolygon> polygons = new HashSet<>();
addPolygons(buildingUnit, polygons);
for (BoundarySurface bs : buildingUnit.getBoundarySurfaces()) {
addPolygons(bs, polygons);
for (Opening op : bs.getOpenings()) {
addPolygons(op, polygons);
}
}
return polygons;
}
public void render(BridgeObject bridge) { public void render(BridgeObject bridge) {
refresher = () -> { refresher = () -> {
Set<ConcretePolygon> setupBridgePolygons = setupBridgePolygons(bridge); Set<ConcretePolygon> setupBridgePolygons = setupBridgePolygons(bridge);
......
package de.hft.stuttgart.citydoctor2.gui.tree;
import de.hft.stuttgart.citydoctor2.datastructure.BuildingUnit;
import de.hft.stuttgart.citydoctor2.gui.CheckStatus;
import de.hft.stuttgart.citydoctor2.gui.Renderer;
import java.util.List;
public class AllBuildingUnitsNode extends Renderable{
private final List<BuildingUnit> buildingUnits;
public AllBuildingUnitsNode(List<BuildingUnit> buildingUnits) {
this.buildingUnits = buildingUnits;
}
@Override
public String getText() {
return "Building Units";
}
@Override
public void visit(Renderer renderer) {
renderer.clearCurrentRender();
}
@Override
public void refreshTextColor() {
boolean wasChecked = false;
for (BuildingUnit buildingUnit : buildingUnits) {
if (buildingUnit.isValidated()) {
wasChecked = true;
if (buildingUnit.containsAnyError()) {
setStatus(CheckStatus.ERROR);
return;
}
}
}
if (wasChecked) {
setStatus(CheckStatus.OK);
} else {
setStatus(CheckStatus.NOT_CHECKED);
}
}
}
package de.hft.stuttgart.citydoctor2.gui.tree;
import de.hft.stuttgart.citydoctor2.datastructure.Storey;
import de.hft.stuttgart.citydoctor2.gui.CheckStatus;
import de.hft.stuttgart.citydoctor2.gui.Renderer;
import java.util.List;
public class AllStoreysNode extends Renderable{
private final List<Storey> storeys;
public AllStoreysNode(List<Storey> storeys) {
this.storeys = storeys;
}
@Override
public String getText() {
return "Building Storeys";
}
@Override
public void visit(Renderer renderer) {
renderer.clearCurrentRender();
}
@Override
public void refreshTextColor() {
boolean wasChecked = false;
for (Storey storey : storeys) {
if (storey.isValidated()) {
wasChecked = true;
if (storey.containsAnyError()) {
setStatus(CheckStatus.ERROR);
return;
}
}
}
if (wasChecked) {
setStatus(CheckStatus.OK);
} else {
setStatus(CheckStatus.NOT_CHECKED);
}
}
}
package de.hft.stuttgart.citydoctor2.gui.tree;
import de.hft.stuttgart.citydoctor2.datastructure.BuildingUnit;
import de.hft.stuttgart.citydoctor2.gui.CheckStatus;
import de.hft.stuttgart.citydoctor2.gui.Renderer;
public class BuildingUnitNode extends Renderable{
private final BuildingUnit buildingUnit;
public BuildingUnitNode(BuildingUnit buildingUnit) {
this.buildingUnit = buildingUnit;
}
@Override
public String getText() {
return buildingUnit.getGmlId().getGmlString();
}
@Override
public void visit(Renderer renderer) {
renderer.render(buildingUnit);
}
@Override
public void refreshTextColor() {
if (!buildingUnit.isValidated()) {
setStatus(CheckStatus.NOT_CHECKED);
} else if (buildingUnit.containsAnyError()) {
setStatus(CheckStatus.ERROR);
} else {
setStatus(CheckStatus.OK);
}
}
}
package de.hft.stuttgart.citydoctor2.gui.tree;
import de.hft.stuttgart.citydoctor2.datastructure.Storey;
import de.hft.stuttgart.citydoctor2.gui.CheckStatus;
import de.hft.stuttgart.citydoctor2.gui.Renderer;
public class StoreyNode extends Renderable{
private final Storey storey;
public StoreyNode(Storey storey) {
this.storey = storey;
}
@Override
public String getText() {
return storey.getGmlId().getGmlString();
}
@Override
public void visit(Renderer renderer) {
renderer.render(storey);
}
@Override
public void refreshTextColor() {
if (!storey.isValidated()) {
setStatus(CheckStatus.NOT_CHECKED);
} else if (storey.containsAnyError()) {
setStatus(CheckStatus.ERROR);
} else {
setStatus(CheckStatus.OK);
}
}
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment