From 19280c6303df64171a4261bd755af11ea171b568 Mon Sep 17 00:00:00 2001 From: Thomas ADAM Date: Thu, 14 Mar 2024 10:34:08 +0100 Subject: [PATCH 1/3] Display Network as ZoneGraph Signed-off-by: Thomas ADAM --- .../powsybl/diagram/viewer/DiagramViewer.java | 8 ++++ .../sld/SingleLineDiagramController.java | 38 ++++++++++++------- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/diagram-viewer/src/main/java/com/powsybl/diagram/viewer/DiagramViewer.java b/diagram-viewer/src/main/java/com/powsybl/diagram/viewer/DiagramViewer.java index 6f5aa92..1b3a38a 100644 --- a/diagram-viewer/src/main/java/com/powsybl/diagram/viewer/DiagramViewer.java +++ b/diagram-viewer/src/main/java/com/powsybl/diagram/viewer/DiagramViewer.java @@ -22,7 +22,11 @@ */ public class DiagramViewer extends Application { + private static Stage primaryStage; + public void start(Stage primaryStage) throws IOException { + DiagramViewer.primaryStage = primaryStage; + FXMLLoader loader = new FXMLLoader(); loader.setLocation(Objects.requireNonNull(getClass().getResource("/mainView.fxml"))); BorderPane root = loader.load(); @@ -35,4 +39,8 @@ public void start(Stage primaryStage) throws IOException { public static void main(String[] args) { Application.launch(DiagramViewer.class); } + + public static Stage getPrimaryStage() { + return DiagramViewer.primaryStage; + } } diff --git a/diagram-viewer/src/main/java/com/powsybl/diagram/viewer/sld/SingleLineDiagramController.java b/diagram-viewer/src/main/java/com/powsybl/diagram/viewer/sld/SingleLineDiagramController.java index 1faf5ee..33ba3a9 100644 --- a/diagram-viewer/src/main/java/com/powsybl/diagram/viewer/sld/SingleLineDiagramController.java +++ b/diagram-viewer/src/main/java/com/powsybl/diagram/viewer/sld/SingleLineDiagramController.java @@ -7,19 +7,20 @@ */ package com.powsybl.diagram.viewer.sld; +import com.powsybl.diagram.viewer.*; import com.powsybl.diagram.viewer.common.AbstractDiagramController; import com.powsybl.diagram.viewer.common.ContainerResult; -import com.powsybl.iidm.network.Container; -import com.powsybl.iidm.network.Network; -import com.powsybl.iidm.network.Switch; +import com.powsybl.iidm.network.*; import com.powsybl.sld.SingleLineDiagram; import com.powsybl.sld.SldParameters; import com.powsybl.sld.layout.VoltageLevelLayoutFactoryCreator; import com.powsybl.sld.svg.styles.StyleProvider; -import javafx.beans.property.StringProperty; +import javafx.beans.binding.*; +import javafx.beans.property.*; import javafx.concurrent.Service; import javafx.concurrent.Task; import javafx.fxml.FXML; +import javafx.scene.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -78,10 +79,6 @@ public static void updateDiagram(Network network, Container container, // PositionVoltageLevelLayoutFactory VoltageLevelLayoutFactoryCreator voltageLevelLayoutFactoryCreator) { - - if (container instanceof Network) { - return; - } Service sldService = new Service<>() { @Override protected Task createTask() { @@ -100,12 +97,17 @@ protected ContainerResult call() throws IOException { .setSubstationLayoutFactory(model.getSubstationLayoutFactory()) .setStyleProviderFactory(model::getStyleProvider) .setVoltageLevelLayoutFactoryCreator(voltageLevelLayoutFactoryCreator); - - SingleLineDiagram.draw(network, container.getId(), - svgWriter, - metadataWriter, - sldParameters); - + if (container instanceof Network network) { + SingleLineDiagram.drawMultiSubstations(network, ((Network) container).getSubstationStream().map(Identifiable::getId).toList(), + svgWriter, + metadataWriter, + sldParameters); + } else { + SingleLineDiagram.draw(network, container.getId(), + svgWriter, + metadataWriter, + sldParameters); + } svgWriter.flush(); metadataWriter.flush(); result.svgContentProperty().set(svgWriter.toString()); @@ -117,6 +119,14 @@ protected ContainerResult call() throws IOException { }; } }; + // Show waiting cursor during task execution + DiagramViewer.getPrimaryStage().getScene() + .getRoot() + .cursorProperty() + .bind(Bindings.when(sldService.runningProperty()) + .then(Cursor.WAIT) + .otherwise(Cursor.DEFAULT) + ); sldService.setOnSucceeded(event -> containerResult.setValue((ContainerResult) event.getSource().getValue())); sldService.setOnFailed(event -> { From d69b1265e88f51c8b98d89e5651cfc37b0df0867 Mon Sep 17 00:00:00 2001 From: Thomas ADAM Date: Fri, 5 Apr 2024 15:40:20 +0200 Subject: [PATCH 2/3] Add Horizontal & Vertical Zone layout choice Signed-off-by: Thomas ADAM --- .../sld/SingleLineDiagramController.java | 26 ++++++++++--- .../viewer/sld/SingleLineDiagramModel.java | 37 +++++++++++++++++++ .../sld/SingleLineDiagramViewController.java | 9 +++++ .../src/main/resources/sld/view.fxml | 2 + 4 files changed, 69 insertions(+), 5 deletions(-) diff --git a/diagram-viewer/src/main/java/com/powsybl/diagram/viewer/sld/SingleLineDiagramController.java b/diagram-viewer/src/main/java/com/powsybl/diagram/viewer/sld/SingleLineDiagramController.java index 33ba3a9..d0b5615 100644 --- a/diagram-viewer/src/main/java/com/powsybl/diagram/viewer/sld/SingleLineDiagramController.java +++ b/diagram-viewer/src/main/java/com/powsybl/diagram/viewer/sld/SingleLineDiagramController.java @@ -17,12 +17,12 @@ import com.powsybl.sld.svg.styles.StyleProvider; import javafx.beans.binding.*; import javafx.beans.property.*; -import javafx.concurrent.Service; -import javafx.concurrent.Task; +import javafx.concurrent.*; import javafx.fxml.FXML; import javafx.scene.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.w3c.dom.*; import java.io.IOException; import java.io.StringWriter; @@ -34,6 +34,7 @@ public class SingleLineDiagramController extends AbstractDiagramController { private static final Logger LOGGER = LoggerFactory.getLogger(SingleLineDiagramController.class); + private static Service sldService; private StringProperty metadataContent; private StringProperty graphContent; @@ -64,6 +65,17 @@ public void createDiagram(SingleLineDiagramJsHandler jsHandler, } }); setUpListenerOnWebViewChanges(jsHandler); + // Manage cursor look above WebView + DiagramViewer.getPrimaryStage().getScene().getRoot().cursorProperty().addListener((observable, oldValue, newValue) -> { + if (Worker.State.SUCCEEDED == diagramWebView.getEngine().getLoadWorker().stateProperty().get()) { + Document doc = diagramWebView.getEngine().getDocument(); + Element body = (Element) + doc.getElementsByTagName("body").item(0); + String style = body.getAttribute("style"); + body.setAttribute("style", "cursor: " + ((newValue == Cursor.WAIT) ? "wait" : "default") + ";" + style); + } + }); + containerResult.metadataContentProperty().addListener((obs, oldV, newV) -> jsHandler.setMetadata(containerResult.metadataContentProperty().get())); // Metadata & Graph binding @@ -79,7 +91,10 @@ public static void updateDiagram(Network network, Container container, // PositionVoltageLevelLayoutFactory VoltageLevelLayoutFactoryCreator voltageLevelLayoutFactoryCreator) { - Service sldService = new Service<>() { + if (sldService != null && sldService.isRunning()) { + sldService.cancel(); + } + sldService = new Service<>() { @Override protected Task createTask() { return new Task<>() { @@ -96,7 +111,8 @@ protected ContainerResult call() throws IOException { .setComponentLibrary(model.getComponentLibrary()) .setSubstationLayoutFactory(model.getSubstationLayoutFactory()) .setStyleProviderFactory(model::getStyleProvider) - .setVoltageLevelLayoutFactoryCreator(voltageLevelLayoutFactoryCreator); + .setVoltageLevelLayoutFactoryCreator(voltageLevelLayoutFactoryCreator) + .setZoneLayoutFactory(model.getZoneLayoutFactory()); if (container instanceof Network network) { SingleLineDiagram.drawMultiSubstations(network, ((Network) container).getSubstationStream().map(Identifiable::getId).toList(), svgWriter, @@ -127,7 +143,7 @@ protected ContainerResult call() throws IOException { .then(Cursor.WAIT) .otherwise(Cursor.DEFAULT) ); - + sldService.setOnCancelled(event -> DiagramViewer.getPrimaryStage().getScene().getRoot().setCursor(Cursor.DEFAULT)); sldService.setOnSucceeded(event -> containerResult.setValue((ContainerResult) event.getSource().getValue())); sldService.setOnFailed(event -> { Throwable exception = event.getSource().getException(); diff --git a/diagram-viewer/src/main/java/com/powsybl/diagram/viewer/sld/SingleLineDiagramModel.java b/diagram-viewer/src/main/java/com/powsybl/diagram/viewer/sld/SingleLineDiagramModel.java index 35def98..7993ec2 100644 --- a/diagram-viewer/src/main/java/com/powsybl/diagram/viewer/sld/SingleLineDiagramModel.java +++ b/diagram-viewer/src/main/java/com/powsybl/diagram/viewer/sld/SingleLineDiagramModel.java @@ -73,6 +73,13 @@ public String toString() { private final Map nameToSubstationLayoutFactoryMap = new TreeMap<>(); // ordered private final ObservableList substationLayouts = FXCollections.observableArrayList(); private final ObjectProperty currentSubstationLayoutFactory = new SimpleObjectProperty<>(); + // Zone layout provider + private static final String HORIZONTAL_ZONE_LAYOUT = "Horizontal"; + private static final String VERTICAL_ZONE_LAYOUT = "Vertical"; + private static final String MATRIX_ZONE_LAYOUT = "Matrix"; + private final Map nameToZoneLayoutFactoryMap = new TreeMap<>(); // ordered + private final ObservableList zoneLayouts = FXCollections.observableArrayList(); + private final ObjectProperty currentZoneLayoutFactory = new SimpleObjectProperty<>(); // CGMES-DL names private final ObservableList cgmesDLDiagramNames = FXCollections.observableArrayList(); @@ -81,6 +88,7 @@ public String toString() { public SingleLineDiagramModel(// Providers ReadOnlyObjectProperty componentLibrary, ReadOnlyObjectProperty substationLayoutFactory, + ReadOnlyObjectProperty zoneLayoutFactory, ReadOnlyObjectProperty cgmesDLDiagramName, // Styles BooleanProperty basicStyleProvider, @@ -129,6 +137,7 @@ public SingleLineDiagramModel(// Providers // Providers this.currentComponentLibrary.bind(componentLibrary); this.currentSubstationLayoutFactory.bind(substationLayoutFactory); + this.currentZoneLayoutFactory.bind(zoneLayoutFactory); this.currentCgmesDLDiagramName.bind(cgmesDLDiagramName); // Styles @@ -175,6 +184,10 @@ public SingleLineDiagramModel(// Providers } public void initProviders() { + // zoneLayouts + nameToZoneLayoutFactoryMap.put(HORIZONTAL_ZONE_LAYOUT, new HorizontalZoneLayoutFactory()); + nameToZoneLayoutFactoryMap.put(VERTICAL_ZONE_LAYOUT, new VerticalZoneLayoutFactory()); + // SubstationLayouts nameToSubstationLayoutFactoryMap.put(HORIZONTAL_SUBSTATION_LAYOUT, new HorizontalSubstationLayoutFactory()); nameToSubstationLayoutFactoryMap.put(VERTICAL_SUBSTATION_LAYOUT, new VerticalSubstationLayoutFactory()); @@ -182,6 +195,7 @@ public void initProviders() { // Set all providers list componentLibraries.setAll(ComponentLibrary.findAll()); substationLayouts.setAll(nameToSubstationLayoutFactoryMap.values()); + zoneLayouts.setAll(nameToZoneLayoutFactoryMap.values()); } public void updateFrom(Network network) { @@ -248,6 +262,10 @@ public SubstationLayoutFactory getSubstationLayoutFactory() { return currentSubstationLayoutFactory.get(); } + public ZoneLayoutFactory getZoneLayoutFactory() { + return currentZoneLayoutFactory.get(); + } + public ObservableList getComponentLibraries() { return componentLibraries; } @@ -256,6 +274,10 @@ public ObservableList getSubstationLayouts() { return substationLayouts; } + public ObservableList getZoneLayouts() { + return zoneLayouts; + } + public ObservableList getCgmesDLDiagramNames() { return cgmesDLDiagramNames; } @@ -288,4 +310,19 @@ public SubstationLayoutFactory fromString(String item) { } }; } + + public StringConverter getZoneLayoutStringConverter() { + return new StringConverter<>() { + @Override + public String toString(ZoneLayoutFactory object) { + Optional label = nameToZoneLayoutFactoryMap.keySet().stream().filter(name -> nameToZoneLayoutFactoryMap.get(name) == object).findFirst(); + return label.orElse(UNKNOWN_ITEM); + } + + @Override + public ZoneLayoutFactory fromString(String item) { + return nameToZoneLayoutFactoryMap.get(item); + } + }; + } } diff --git a/diagram-viewer/src/main/java/com/powsybl/diagram/viewer/sld/SingleLineDiagramViewController.java b/diagram-viewer/src/main/java/com/powsybl/diagram/viewer/sld/SingleLineDiagramViewController.java index e3cc917..1556088 100644 --- a/diagram-viewer/src/main/java/com/powsybl/diagram/viewer/sld/SingleLineDiagramViewController.java +++ b/diagram-viewer/src/main/java/com/powsybl/diagram/viewer/sld/SingleLineDiagramViewController.java @@ -69,6 +69,9 @@ public class SingleLineDiagramViewController extends AbstractDiagramViewControll @FXML public ComboBox substationLayoutComboBox; + @FXML + public ComboBox zoneLayoutComboBox; + @FXML public ChoiceBox voltageLevelLayoutComboBox; @@ -197,6 +200,7 @@ private void initialize() { // Providers componentLibraryComboBox.valueProperty(), substationLayoutComboBox.valueProperty(), + zoneLayoutComboBox.valueProperty(), cgmesDLDiagramsComboBox.valueProperty(), // - Styles basicStyleProviderCheckBox.selectedProperty(), @@ -253,6 +257,10 @@ private void initialize() { substationLayoutComboBox.itemsProperty().bind(Bindings.createObjectBinding(() -> model.getSubstationLayouts())); substationLayoutComboBox.setConverter(model.getSubstationLayoutStringConverter()); substationLayoutComboBox.getSelectionModel().selectFirst(); // Default selection without Network + // Zone layout + zoneLayoutComboBox.itemsProperty().bind(Bindings.createObjectBinding(() -> model.getZoneLayouts())); + zoneLayoutComboBox.setConverter(model.getZoneLayoutStringConverter()); + zoneLayoutComboBox.getSelectionModel().selectFirst(); // Default selection without Network // CGMES-DL Diagrams cgmesDLDiagramsComboBox.itemsProperty().bind(Bindings.createObjectBinding(() -> model.getCgmesDLDiagramNames())); @@ -273,6 +281,7 @@ private boolean voltageLevelLayoutFactoryParametersEnabled(SingleLineDiagramMode public void addListener(ChangeListener changeListener) { componentLibraryComboBox.valueProperty().addListener(changeListener); substationLayoutComboBox.valueProperty().addListener(changeListener); + zoneLayoutComboBox.valueProperty().addListener(changeListener); cgmesDLDiagramsComboBox.valueProperty().addListener(changeListener); basicStyleProviderCheckBox.selectedProperty().addListener(changeListener); diff --git a/diagram-viewer/src/main/resources/sld/view.fxml b/diagram-viewer/src/main/resources/sld/view.fxml index de5ec4a..055731c 100644 --- a/diagram-viewer/src/main/resources/sld/view.fxml +++ b/diagram-viewer/src/main/resources/sld/view.fxml @@ -61,6 +61,8 @@ +