diff --git a/cpp/powsybl-cpp/powsybl-api.h b/cpp/powsybl-cpp/powsybl-api.h index aa86e00a62..3996773224 100644 --- a/cpp/powsybl-cpp/powsybl-api.h +++ b/cpp/powsybl-cpp/powsybl-api.h @@ -342,6 +342,9 @@ typedef struct sld_parameters_struct { unsigned char topological_coloring; char* component_library; unsigned char display_current_feeder_info; + char* active_power_unit; + char* reactive_power_unit; + char* current_unit; } sld_parameters; typedef struct nad_parameters_struct { diff --git a/cpp/powsybl-cpp/powsybl-cpp.cpp b/cpp/powsybl-cpp/powsybl-cpp.cpp index f1bc033254..4930eba5d9 100644 --- a/cpp/powsybl-cpp/powsybl-cpp.cpp +++ b/cpp/powsybl-cpp/powsybl-cpp.cpp @@ -1200,6 +1200,9 @@ SldParameters::SldParameters(sld_parameters* src) { topological_coloring = (bool) src->topological_coloring; component_library = toString(src->component_library); display_current_feeder_info = (bool) src->display_current_feeder_info; + active_power_unit = toString(src->active_power_unit); + reactive_power_unit = toString(src->reactive_power_unit); + current_unit = toString(src->current_unit); } NadParameters::NadParameters(nad_parameters* src) { @@ -1227,6 +1230,9 @@ void SldParameters::sld_to_c_struct(sld_parameters& res) const { res.topological_coloring = (unsigned char) topological_coloring; res.component_library = copyStringToCharPtr(component_library); res.display_current_feeder_info = (unsigned char) display_current_feeder_info; + res.active_power_unit = copyStringToCharPtr(active_power_unit); + res.reactive_power_unit = copyStringToCharPtr(reactive_power_unit); + res.current_unit = copyStringToCharPtr(current_unit); } void NadParameters::nad_to_c_struct(nad_parameters& res) const { diff --git a/cpp/powsybl-cpp/powsybl-cpp.h b/cpp/powsybl-cpp/powsybl-cpp.h index 8fdcc2b3d2..2e6e930204 100644 --- a/cpp/powsybl-cpp/powsybl-cpp.h +++ b/cpp/powsybl-cpp/powsybl-cpp.h @@ -394,6 +394,9 @@ class SldParameters { bool topological_coloring; std::string component_library; bool display_current_feeder_info; + std::string active_power_unit; + std::string reactive_power_unit; + std::string current_unit; }; enum class NadLayoutType { diff --git a/cpp/pypowsybl-cpp/bindings.cpp b/cpp/pypowsybl-cpp/bindings.cpp index ee7034447d..3a6219c701 100644 --- a/cpp/pypowsybl-cpp/bindings.cpp +++ b/cpp/pypowsybl-cpp/bindings.cpp @@ -548,7 +548,10 @@ PYBIND11_MODULE(_pypowsybl, m) { .def_readwrite("tooltip_enabled", &pypowsybl::SldParameters::tooltip_enabled) .def_readwrite("topological_coloring", &pypowsybl::SldParameters::topological_coloring) .def_readwrite("component_library", &pypowsybl::SldParameters::component_library) - .def_readwrite("display_current_feeder_info", &pypowsybl::SldParameters::display_current_feeder_info); + .def_readwrite("display_current_feeder_info", &pypowsybl::SldParameters::display_current_feeder_info) + .def_readwrite("active_power_unit", &pypowsybl::SldParameters::active_power_unit) + .def_readwrite("reactive_power_unit", &pypowsybl::SldParameters::reactive_power_unit) + .def_readwrite("current_unit", &pypowsybl::SldParameters::current_unit); py::enum_(m, "NadLayoutType") .value("FORCE_LAYOUT", pypowsybl::NadLayoutType::FORCE_LAYOUT) diff --git a/docs/_static/images/ieee14_SldParam_activepowerunit.svg b/docs/_static/images/ieee14_SldParam_activepowerunit.svg new file mode 100644 index 0000000000..bba4031294 --- /dev/null +++ b/docs/_static/images/ieee14_SldParam_activepowerunit.svg @@ -0,0 +1,364 @@ + + + + + + + + B4 + + + + + + + + + + + + + + + 48 MW + + + + + -4 + + + + + + + + + + + + + + + B4-L + + + + + + + + + + + + + + + + 3 + + + + + -54 MW + + + + + + + + + + + + L2-4-1 + + + + + + + + + + + + + + + + 24 MW + + + + + -5 + + + + + + + + + + + + L3-4-1 + + + + + + + + + + + + + + + + 16 + + + + + -61 MW + + + + + + + + + + + + L4-5-1 + + + + + + + + + + + + + + + + 28 MW + + + + + -10 + + + + + + + + + + + + + + T4-7-1 + + + + + + + + + + + + + + + + -0 + + + + + 16 MW + + + + + + + + + + + + + + T4-9-1 + + + + diff --git a/docs/_static/images/ieee14_SldParam_currentunit.svg b/docs/_static/images/ieee14_SldParam_currentunit.svg new file mode 100644 index 0000000000..f26f7c180c --- /dev/null +++ b/docs/_static/images/ieee14_SldParam_currentunit.svg @@ -0,0 +1,394 @@ + + + + + + + + B4 + + + + + + + + + + + + + + + 48 + + + + + -4 + + + + + 202 A + + + + + + + + + + + + + + + B4-L + + + + + + + + + + + + + + + + 229 A + + + + + 3 + + + + + -54 + + + + + + + + + + + + L2-4-1 + + + + + + + + + + + + + + + + 24 + + + + + -5 + + + + + 101 A + + + + + + + + + + + + L3-4-1 + + + + + + + + + + + + + + + + 265 A + + + + + 16 + + + + + -61 + + + + + + + + + + + + L4-5-1 + + + + + + + + + + + + + + + + 28 + + + + + -10 + + + + + 125 A + + + + + + + + + + + + + + T4-7-1 + + + + + + + + + + + + + + + + 68 A + + + + + -0 + + + + + 16 + + + + + + + + + + + + + + T4-9-1 + + + + diff --git a/docs/_static/images/ieee14_SldParam_reactivepowerunit.svg b/docs/_static/images/ieee14_SldParam_reactivepowerunit.svg new file mode 100644 index 0000000000..4bb7792314 --- /dev/null +++ b/docs/_static/images/ieee14_SldParam_reactivepowerunit.svg @@ -0,0 +1,364 @@ + + + + + + + + B4 + + + + + + + + + + + + + + + 48 + + + + + -4 MVAR + + + + + + + + + + + + + + + B4-L + + + + + + + + + + + + + + + + 3 MVAR + + + + + -54 + + + + + + + + + + + + L2-4-1 + + + + + + + + + + + + + + + + 24 + + + + + -5 MVAR + + + + + + + + + + + + L3-4-1 + + + + + + + + + + + + + + + + 16 MVAR + + + + + -61 + + + + + + + + + + + + L4-5-1 + + + + + + + + + + + + + + + + 28 + + + + + -10 MVAR + + + + + + + + + + + + + + T4-7-1 + + + + + + + + + + + + + + + + -0 MVAR + + + + + 16 + + + + + + + + + + + + + + T4-9-1 + + + + diff --git a/docs/user_guide/network_visualization.rst b/docs/user_guide/network_visualization.rst index 0bfa25182d..44b7760ae6 100644 --- a/docs/user_guide/network_visualization.rst +++ b/docs/user_guide/network_visualization.rst @@ -34,8 +34,7 @@ Single-line diagrams can be customized through SldParameters: >>> network = pp.network.create_ieee14() >>> result = pp.loadflow.run_ac(network) - >>> network.get_single_line_diagram('VL4',parameters = pp.network.SldParameters(use_name = False, center_name = False, diagonal_label = False, nodes_infos = False, tooltip_enabled = False, topological_coloring = True, component_library = 'Convergence', display_current_feeder_info = False)) - + >>> network.get_single_line_diagram('VL4',parameters = pp.network.SldParameters(use_name = False, center_name = False, diagonal_label = False, nodes_infos = False, tooltip_enabled = False, topological_coloring = True, component_library = 'Convergence')) - use_name: if true, display components names instead of their id (default value false) - center_name: if true, center the names of feeders (default value false) @@ -44,6 +43,9 @@ Single-line diagrams can be customized through SldParameters: - tooltip_enabled: if true, display the name of the component pointed by the cursor (default value false) - topological_coloring: if true, set each electrical nodes with a different colour (default value true) - component_library: choose component library (default value 'Convergence') +- active_power_unit: display unit of active power (default value "") +- reactive_power_unit: display unit of reactive power (default value "") +- current_unit: display unit of current (default value "") - display_current_feeder_info: if true, display current feeder value (default value False) @@ -60,7 +62,7 @@ Let's see some examples down below: .. image:: ../_static/images/ieee14_SldParam_default.svg :class: forced-white-background -- with use_name = true +- with use_name = True .. code-block:: python @@ -70,7 +72,7 @@ Let's see some examples down below: .. image:: ../_static/images/ieee14_SldParam_usename.svg :class: forced-white-background -- with center_name = true +- with center_name = True .. code-block:: python @@ -80,7 +82,7 @@ Let's see some examples down below: .. image:: ../_static/images/ieee14_SldParam_centername.svg :class: forced-white-background -- with diagonal_label = true +- with diagonal_label = True .. code-block:: python @@ -90,7 +92,7 @@ Let's see some examples down below: .. image:: ../_static/images/ieee14_SldParam_diagonallabel.svg :class: forced-white-background -- with nodes_infos = true +- with nodes_infos = True .. code-block:: python @@ -100,7 +102,7 @@ Let's see some examples down below: .. image:: ../_static/images/ieee14_SldParam_nodesinfos.svg :class: forced-white-background -- with tooltip enabled +- with tooltip_enabled = True .. code-block:: python @@ -110,7 +112,7 @@ Let's see some examples down below: .. image:: ../_static/images/ieee14_SldParam_tooltipenabledtrue.png :class: forced-white-background -- with topological coloring = true +- with topological_coloring = True .. code-block:: python @@ -122,7 +124,7 @@ Let's see some examples down below: .. image:: ../_static/images/SldParam_topologicalcoloringtrue.svg :class: forced-white-background -- with topological coloring = false +- with topological_coloring = False .. code-block:: python @@ -143,7 +145,7 @@ Let's see some examples down below: .. image:: ../_static/images/ieee14_SldParam_complib_flatdesign.svg :class: forced-white-background -- with display current feeder info +- with display_current_feeder_info = True .. code-block:: python @@ -153,6 +155,36 @@ Let's see some examples down below: .. image:: ../_static/images/ieee14_SldParam_displaycurrentfeederinfo.svg :class: forced-white-background +- with active_power_unit = "MW" + +.. code-block:: python + + >>> param = pn.SldParameters(active_power_unit = "MW") + >>> network.get_single_line_diagram('VL4', parameters = param) + +.. image:: ../_static/images/ieee14_SldParam_activepowerunit.svg + :class: forced-white-background + +- with reactive_power_unit = "MVAR" + +.. code-block:: python + + >>> param = pn.SldParameters(reactive_power_unit = "MVAR") + >>> network.get_single_line_diagram('VL4', parameters = param) + +.. image:: ../_static/images/ieee14_SldParam_reactivepowerunit.svg + :class: forced-white-background + + +- with current_unit = "A" + +.. code-block:: python + + >>> param = pn.SldParameters(display_current_feeder_info = True, current_unit = "A") + >>> network.get_single_line_diagram('VL4', parameters = param) + +.. image:: ../_static/images/ieee14_SldParam_currentunit.svg + :class: forced-white-background It is also possible to display a multi-substation single line diagram (currently a beta feature): diff --git a/java/src/main/java/com/powsybl/python/commons/PyPowsyblApiHeader.java b/java/src/main/java/com/powsybl/python/commons/PyPowsyblApiHeader.java index 372d32b1e0..0b4b72f950 100644 --- a/java/src/main/java/com/powsybl/python/commons/PyPowsyblApiHeader.java +++ b/java/src/main/java/com/powsybl/python/commons/PyPowsyblApiHeader.java @@ -1074,6 +1074,25 @@ public interface SldParametersPointer extends PointerBase { @CField("display_current_feeder_info") void setDisplayCurrentFeederInfo(boolean displayCurrentInfo); + + @CField("active_power_unit") + CCharPointer getActivePowerUnit(); + + @CField("active_power_unit") + void setActivePowerUnit(CCharPointer activePowerUnit); + + @CField("reactive_power_unit") + CCharPointer getReactivePowerUnit(); + + @CField("reactive_power_unit") + void setReactivePowerUnit(CCharPointer reactivePowerUnit); + + @CField("current_unit") + CCharPointer getCurrentUnit(); + + @CField("current_unit") + void setCurrentUnit(CCharPointer currentUnit); + } @CStruct("nad_parameters") diff --git a/java/src/main/java/com/powsybl/python/network/NetworkCFunctions.java b/java/src/main/java/com/powsybl/python/network/NetworkCFunctions.java index 0acdd1c98b..d37b946c63 100644 --- a/java/src/main/java/com/powsybl/python/network/NetworkCFunctions.java +++ b/java/src/main/java/com/powsybl/python/network/NetworkCFunctions.java @@ -879,6 +879,9 @@ public static void copyToCSldParameters(SldParameters parameters, SldParametersP cParameters.setTooltipEnabled(parameters.getSvgParameters().isTooltipEnabled()); cParameters.setComponentLibrary(CTypeUtil.toCharPtr(parameters.getComponentLibrary().getName())); cParameters.setDisplayCurrentFeederInfo(parameters.getSvgParameters().isDisplayCurrentFeederInfo()); + cParameters.setActivePowerUnit(CTypeUtil.toCharPtr(parameters.getSvgParameters().getActivePowerUnit())); + cParameters.setReactivePowerUnit(CTypeUtil.toCharPtr(parameters.getSvgParameters().getReactivePowerUnit())); + cParameters.setCurrentUnit(CTypeUtil.toCharPtr(parameters.getSvgParameters().getCurrentUnit())); } public static SldParametersPointer convertToSldParametersPointer(SldParameters parameters) { @@ -954,7 +957,11 @@ public static SldParameters convertSldParameters(SldParametersPointer sldParamet .setLabelDiagonal(sldParametersPtr.isDiagonalLabel()) .setAddNodesInfos(sldParametersPtr.isAddNodesInfos()) .setTooltipEnabled(sldParametersPtr.getTooltipEnabled()) - .setDisplayCurrentFeederInfo(sldParametersPtr.isDisplayCurrentFeederInfo()); + .setDisplayCurrentFeederInfo(sldParametersPtr.isDisplayCurrentFeederInfo()) + .setTooltipEnabled(sldParametersPtr.getTooltipEnabled()) + .setActivePowerUnit(CTypeUtil.toString(sldParametersPtr.getActivePowerUnit())) + .setReactivePowerUnit(CTypeUtil.toString(sldParametersPtr.getReactivePowerUnit())) + .setCurrentUnit(CTypeUtil.toString(sldParametersPtr.getCurrentUnit())); return sldParameters; } diff --git a/pypowsybl/_pypowsybl.pyi b/pypowsybl/_pypowsybl.pyi index 2f0a1e7e9d..b3ed28dd7d 100644 --- a/pypowsybl/_pypowsybl.pyi +++ b/pypowsybl/_pypowsybl.pyi @@ -267,6 +267,9 @@ class SldParameters: topological_coloring: bool component_library: str display_current_feeder_info: bool + active_power_unit: str + reactive_power_unit: str + current_unit: str def __init__(self) -> None: ... class NadLayoutType: diff --git a/pypowsybl/network/impl/sld_parameters.py b/pypowsybl/network/impl/sld_parameters.py index 1083d5837a..6a4283ce69 100644 --- a/pypowsybl/network/impl/sld_parameters.py +++ b/pypowsybl/network/impl/sld_parameters.py @@ -13,7 +13,8 @@ class SldParameters: def __init__(self, use_name: bool = False, center_name: bool = False, diagonal_label: bool = False, nodes_infos: bool = False, tooltip_enabled: bool = False, topological_coloring: bool = True, - component_library: str = 'Convergence', display_current_feeder_info: bool = False): + component_library: str = 'Convergence', display_current_feeder_info: bool = False, + active_power_unit: str = "", reactive_power_unit: str = "", current_unit: str = ""): self._use_name = use_name self._center_name = center_name self._diagonal_label = diagonal_label @@ -22,6 +23,9 @@ def __init__(self, use_name: bool = False, center_name: bool = False, diagonal_l self._topological_coloring = topological_coloring self._component_library = component_library self._display_current_feeder_info = display_current_feeder_info + self._active_power_unit = active_power_unit + self._reactive_power_unit = reactive_power_unit + self._current_unit = current_unit @property def use_name(self) -> bool: @@ -63,6 +67,21 @@ def display_current_feeder_info(self) -> bool: """when True display current feeder info""" return self._display_current_feeder_info + @property + def active_power_unit(self) -> str: + """unit of active power""" + return self._active_power_unit + + @property + def reactive_power_unit(self) -> str: + """unit of reactive power""" + return self._reactive_power_unit + + @property + def current_unit(self) -> str: + """unit of current""" + return self._current_unit + def _to_c_parameters(self) -> _pp.SldParameters: c_parameters = _pp.SldParameters() c_parameters.use_name = self._use_name @@ -73,4 +92,7 @@ def _to_c_parameters(self) -> _pp.SldParameters: c_parameters.tooltip_enabled = self._tooltip_enabled c_parameters.component_library = self._component_library c_parameters.display_current_feeder_info = self._display_current_feeder_info + c_parameters.active_power_unit = self._active_power_unit + c_parameters.reactive_power_unit = self._reactive_power_unit + c_parameters.current_unit = self._current_unit return c_parameters diff --git a/tests/test_network.py b/tests/test_network.py index a829ef23cd..fcec7ccfb4 100644 --- a/tests/test_network.py +++ b/tests/test_network.py @@ -785,10 +785,14 @@ def test_sld_parameters(): assert not parameters.display_current_feeder_info assert parameters.topological_coloring assert parameters.component_library == 'Convergence' + assert parameters.active_power_unit == "" + assert parameters.reactive_power_unit == "" + assert parameters.current_unit == "" parameters = SldParameters(use_name=True, center_name=True, diagonal_label=True, nodes_infos=True, tooltip_enabled=True, topological_coloring=False, - component_library='FlatDesign', display_current_feeder_info=True) + component_library='FlatDesign', display_current_feeder_info=True, + active_power_unit='a', reactive_power_unit='b', current_unit='c') assert parameters.use_name assert parameters.center_name assert parameters.diagonal_label @@ -797,6 +801,9 @@ def test_sld_parameters(): assert parameters.display_current_feeder_info assert not parameters.topological_coloring assert parameters.component_library == 'FlatDesign' + assert parameters.active_power_unit == 'a' + assert parameters.reactive_power_unit == 'b' + assert parameters.current_unit == 'c' def test_layout_parameters():