Commit 72588314 authored by Riegel's avatar Riegel
Browse files

Add button to hide roofs in Object view

parent bcff1333
Pipeline #10284 failed with stage
in 34 seconds
......@@ -31,6 +31,7 @@ MainToolBar.writeReports=Write Reports
MainToolBar.executeChecks=Execute Checks
MainToolBar.showWorld=Show entire city model
MainToolBar.resetCamera=Reset view
MainToolBar.hideRoof=Show/Hide roofs in object view
MainWindow.missingConfig=Could not find configuration file.
MainWindow.loadGivenFile=Loading given file, please wait
MainWindow.finishedLoading=Finished loading
......
......@@ -29,6 +29,7 @@ MainToolBar.writeReports=Schreibe Reports
MainToolBar.executeChecks=F\u00fchre Pr\u00fcfungen aus
MainToolBar.showWorld=Gesamtes Stadtmodell anzeigen
MainToolBar.resetCamera=Ansicht zur\u00fccksetzen
MainToolBar.hideRoof=Zeige/Verstecke D\u00e4cher in Objektansicht
MainWindow.missingConfig=Konnte Konfigurationsdatei nicht finden.
MainWindow.loadGivenFile=Lade vorhandene Datei, bitte warten
MainWindow.finishedLoading=Fertig geladen
......
......@@ -139,6 +139,7 @@ public class CityDoctorController {
mainWindow.getWorldBtn().setDisable(false);
mainWindow.getSaveBtn().setDisable(false);
mainWindow.getResetCameraBtn().setDisable(false);
mainWindow.getHideRoofBtn().setDisable(false);
mainWindow.getNorthArrow().setVisible(true);
mainWindow.alignNorthArrow();
setupFeatureTabs();
......
......@@ -49,6 +49,12 @@ public class MainToolBar {
@FXML
private ImageView showWorldImageView;
@FXML
private ToggleButton hideRoofBtn;
@FXML
private ImageView hideRoofView;
@FXML
private Button resetCameraBtn;
......@@ -146,6 +152,7 @@ public class MainToolBar {
setupAboutButton();
setupReportButton();
setupResetCameraButton();
setupHideRoofButton();
loadImages();
gridButton.setOnAction(ae -> renderer.showWireFrame(gridButton.isSelected()));
......@@ -219,6 +226,10 @@ public class MainToolBar {
Image img = new Image(inStream);
resetCameraView.setImage(img);
}
try (InputStream inStream = MainWindow.class.getResourceAsStream("icons/hide_roof.png")) {
Image img = new Image(inStream);
hideRoofView.setImage(img);
}
} catch (IOException e) {
// ignore close exception
}
......@@ -316,6 +327,19 @@ public class MainToolBar {
}
private void setupHideRoofButton() {
hideRoofBtn.setDisable(true);
hideRoofBtn.setSelected(false);
hideRoofBtn.setTooltip(new Tooltip(Localization.getText("MainToolBar.hideRoof")));
hideRoofBtn.setOnAction(ae -> {
if (hideRoofBtn.isSelected()) {
renderer.hideRoofs();
} else {
renderer.showRoofs();
}});
}
public Button getCheckButton() {
return checkBtn;
}
......@@ -352,6 +376,10 @@ public class MainToolBar {
return lod4Btn;
}
public ToggleButton getHideRoofBtn(){
return hideRoofBtn;
}
public Button getWorldBtn() {
return showWorldBtn;
}
......
......@@ -1096,6 +1096,10 @@ public class MainWindow extends Application {
return mainToolBar.getResetCameraBtn();
}
public ToggleButton getHideRoofBtn(){
return mainToolBar.getHideRoofBtn();
}
public ImageView getNorthArrow(){
return northArrow;
}
......
......@@ -45,7 +45,7 @@ public class Renderer {
private LoadingInfoDialog loadingDialog;
private List<ViewFilter> lodFilters = new ArrayList<>();
private ViewFilter roofFilter;
private Runnable refresher;
private Runnable errorUpdater;
......@@ -97,6 +97,25 @@ public class Renderer {
return geom.getLod() == Lod.LOD4;
}
});
roofFilter = new ViewFilter() {
@Override
public boolean allowedToUse(CityObject co, Geometry geom){
if (!this.isEnabled()){
return true;
}
return this.useGeometry(co, geom);
}
@Override
public boolean useGeometry(CityObject co, Geometry geom) {
if (co instanceof BoundarySurface bs){
return bs.getType() != BoundarySurfaceType.ROOF;
}
return true;
}
};
roofFilter.setEnable(false);
}
public void enableLod1() {
......@@ -155,6 +174,20 @@ public class Renderer {
}
}
public void hideRoofs(){
roofFilter.setEnable(true);
if (refresher != null) {
refresher.run();
}
}
public void showRoofs(){
roofFilter.setEnable(false);
if (refresher != null) {
refresher.run();
}
}
public void render(Building building) {
refresher = () -> {
Set<ConcretePolygon> setupBuildingPolygons = setupBuildingPolygons(building);
......@@ -581,7 +614,9 @@ public class Renderer {
}
}
if (used) {
addConcretePolygons(polygons, geom);
if (roofFilter.allowedToUse(co, geom)) {
addConcretePolygons(polygons, geom);
}
}
}
}
......@@ -942,6 +977,8 @@ public class Renderer {
private void addConcretePolygons(Set<ConcretePolygon> polygons, Geometry geom) {
for (Polygon p : geom.getPolygons()) {
if (p.getOriginal().getPartOfSurface() != null &&
!roofFilter.allowedToUse(p.getOriginal().getPartOfSurface(), p.getParent())) continue;
polygons.add(p.getOriginal());
}
}
......
......@@ -36,6 +36,11 @@
<ImageView fx:id="cullingImageView" fitHeight="32.0" fitWidth="32.0" pickOnBounds="true" preserveRatio="true" />
</graphic>
</ToggleButton>
<ToggleButton fx:id="hideRoofBtn" disable="true" layoutX="222.0" layoutY="10.0" mnemonicParsing="false" selected="true">
<graphic>
<ImageView fx:id="hideRoofView" fitHeight="32.0" fitWidth="32.0" pickOnBounds="true" preserveRatio="true" />
</graphic>
</ToggleButton>
<Separator orientation="VERTICAL" />
<Button id="loadBtn" fx:id="showWorldBtn" disable="true" mnemonicParsing="false">
<graphic>
......
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