Skip to content

Commit

Permalink
refactor network area diagram parameters (#675)
Browse files Browse the repository at this point in the history
* refactor network area diagram parameters

Signed-off-by: Etienne LESOT <etienne.lesot@rte-france.com>
  • Loading branch information
EtienneLt committed Nov 22, 2023
1 parent 8740261 commit ebf2708
Show file tree
Hide file tree
Showing 14 changed files with 191 additions and 39 deletions.
8 changes: 6 additions & 2 deletions cpp/src/bindings.cpp
Expand Up @@ -472,6 +472,10 @@ PYBIND11_MODULE(_pypowsybl, m) {
.def_readwrite("topological_coloring", &pypowsybl::SldParameters::topological_coloring)
.def_readwrite("component_library", &pypowsybl::SldParameters::component_library);

py::class_<pypowsybl::NadParameters>(m, "NadParameters")
.def(py::init(&pypowsybl::createNadParameters))
.def_readwrite("edge_name_displayed", &pypowsybl::NadParameters::edge_name_displayed);

m.def("write_single_line_diagram_svg", &pypowsybl::writeSingleLineDiagramSvg, "Write single line diagram SVG",
py::arg("network"), py::arg("container_id"), py::arg("svg_file"), py::arg("metadata_file"), py::arg("sld_parameters"));

Expand All @@ -484,10 +488,10 @@ PYBIND11_MODULE(_pypowsybl, m) {
m.def("get_single_line_diagram_component_library_names", &pypowsybl::getSingleLineDiagramComponentLibraryNames, "Get supported component library providers for single line diagram");

m.def("write_network_area_diagram_svg", &pypowsybl::writeNetworkAreaDiagramSvg, "Write network area diagram SVG",
py::arg("network"), py::arg("svg_file"), py::arg("voltage_level_ids"), py::arg("depth"), py::arg("high_nominal_voltage_bound"), py::arg("low_nominal_voltage_bound"), py::arg("edge_name_displayed"));
py::arg("network"), py::arg("svg_file"), py::arg("voltage_level_ids"), py::arg("depth"), py::arg("high_nominal_voltage_bound"), py::arg("low_nominal_voltage_bound"), py::arg("nad_parameters"));

m.def("get_network_area_diagram_svg", &pypowsybl::getNetworkAreaDiagramSvg, "Get network area diagram SVG as a string",
py::arg("network"), py::arg("voltage_level_ids"), py::arg("depth"), py::arg("high_nominal_voltage_bound"), py::arg("low_nominal_voltage_bound"), py::arg("edge_name_displayed"));
py::arg("network"), py::arg("voltage_level_ids"), py::arg("depth"), py::arg("high_nominal_voltage_bound"), py::arg("low_nominal_voltage_bound"), py::arg("nad_parameters"));

m.def("get_network_area_diagram_displayed_voltage_levels", &pypowsybl::getNetworkAreaDiagramDisplayedVoltageLevels, "Get network area diagram displayed voltage level",
py::arg("network"), py::arg("voltage_level_ids"), py::arg("depth"));
Expand Down
4 changes: 4 additions & 0 deletions cpp/src/pypowsybl-api.h
Expand Up @@ -308,6 +308,10 @@ typedef struct sld_parameters_struct {
char* component_library;
} sld_parameters;

typedef struct nad_parameters_struct {
unsigned char edge_name_displayed;
} nad_parameters;

typedef enum {
ALPHA_BETA_LOAD = 0,
ONE_TRANSFORMER_LOAD,
Expand Down
36 changes: 32 additions & 4 deletions cpp/src/pypowsybl.cpp
Expand Up @@ -804,14 +804,16 @@ std::vector<std::string> getSingleLineDiagramSvgAndMetadata(const JavaHandle& ne
return svgAndMetadata.get();
}

void writeNetworkAreaDiagramSvg(const JavaHandle& network, const std::string& svgFile, const std::vector<std::string>& voltageLevelIds, int depth, double highNominalVoltageBound, double lowNominalVoltageBound, bool edgeNameDisplayed) {
void writeNetworkAreaDiagramSvg(const JavaHandle& network, const std::string& svgFile, const std::vector<std::string>& voltageLevelIds, int depth, double highNominalVoltageBound, double lowNominalVoltageBound, const NadParameters& parameters) {
auto c_parameters = parameters.to_c_struct();
ToCharPtrPtr voltageLevelIdPtr(voltageLevelIds);
callJava(::writeNetworkAreaDiagramSvg, network, (char*) svgFile.data(), voltageLevelIdPtr.get(), voltageLevelIds.size(), depth, highNominalVoltageBound, lowNominalVoltageBound, edgeNameDisplayed);
callJava(::writeNetworkAreaDiagramSvg, network, (char*) svgFile.data(), voltageLevelIdPtr.get(), voltageLevelIds.size(), depth, highNominalVoltageBound, lowNominalVoltageBound, c_parameters.get());
}

std::string getNetworkAreaDiagramSvg(const JavaHandle& network, const std::vector<std::string>& voltageLevelIds, int depth, double highNominalVoltageBound, double lowNominalVoltageBound, bool edgeNameDisplayed) {
std::string getNetworkAreaDiagramSvg(const JavaHandle& network, const std::vector<std::string>& voltageLevelIds, int depth, double highNominalVoltageBound, double lowNominalVoltageBound, const NadParameters& parameters) {
auto c_parameters = parameters.to_c_struct();
ToCharPtrPtr voltageLevelIdPtr(voltageLevelIds);
return toString(callJava<char*>(::getNetworkAreaDiagramSvg, network, voltageLevelIdPtr.get(), voltageLevelIds.size(), depth, highNominalVoltageBound, lowNominalVoltageBound, edgeNameDisplayed));
return toString(callJava<char*>(::getNetworkAreaDiagramSvg, network, voltageLevelIdPtr.get(), voltageLevelIds.size(), depth, highNominalVoltageBound, lowNominalVoltageBound, c_parameters.get()));
}

std::vector<std::string> getNetworkAreaDiagramDisplayedVoltageLevels(const JavaHandle& network, const std::vector<std::string>& voltageLevelIds, int depth) {
Expand Down Expand Up @@ -1247,6 +1249,10 @@ SldParameters::SldParameters(sld_parameters* src) {
component_library = toString(src->component_library);
}

NadParameters::NadParameters(nad_parameters* src) {
edge_name_displayed = (bool) src->edge_name_displayed;
}

void SldParameters::sld_to_c_struct(sld_parameters& res) const {
res.use_name = (unsigned char) use_name;
res.center_name = (unsigned char) center_name;
Expand All @@ -1256,6 +1262,10 @@ void SldParameters::sld_to_c_struct(sld_parameters& res) const {
res.component_library = copyStringToCharPtr(component_library);
}

void NadParameters::nad_to_c_struct(nad_parameters& res) const {
res.edge_name_displayed = (unsigned char) edge_name_displayed;
}

std::shared_ptr<sld_parameters> SldParameters::to_c_struct() const {
sld_parameters* res = new sld_parameters();
sld_to_c_struct(*res);
Expand All @@ -1265,6 +1275,15 @@ std::shared_ptr<sld_parameters> SldParameters::to_c_struct() const {
});
}

std::shared_ptr<nad_parameters> NadParameters::to_c_struct() const {
nad_parameters* res = new nad_parameters();
nad_to_c_struct(*res);
//Memory has been allocated here on C side, we need to clean it up on C side (not java side)
return std::shared_ptr<nad_parameters>(res, [](nad_parameters* ptr){
delete ptr;
});
}

SldParameters* createSldParameters() {
sld_parameters* parameters_ptr = callJava<sld_parameters*>(::createSldParameters);
auto parameters = std::shared_ptr<sld_parameters>(parameters_ptr, [](sld_parameters* ptr){
Expand All @@ -1274,6 +1293,15 @@ SldParameters* createSldParameters() {
return new SldParameters(parameters.get());
}

NadParameters* createNadParameters() {
nad_parameters* parameters_ptr = callJava<nad_parameters*>(::createNadParameters);
auto parameters = std::shared_ptr<nad_parameters>(parameters_ptr, [](nad_parameters* ptr){
//Memory has been allocated on java side, we need to clean it up on java side
callJava(::freeNadParameters, ptr);
});
return new NadParameters(parameters.get());
}

void removeElementsModification(pypowsybl::JavaHandle network, const std::vector<std::string>& connectableIds, dataframe* dataframe, remove_modification_type removeModificationType, bool throwException, JavaHandle* reporter) {
ToCharPtrPtr connectableIdsPtr(connectableIds);
pypowsybl::callJava(::removeElementsModification, network, connectableIdsPtr.get(), connectableIds.size(), dataframe, removeModificationType, throwException, (reporter == nullptr) ? nullptr : *reporter);
Expand Down
15 changes: 13 additions & 2 deletions cpp/src/pypowsybl.h
Expand Up @@ -277,6 +277,15 @@ class SldParameters {
std::string component_library;
};

class NadParameters {
public:
NadParameters(nad_parameters* src);
std::shared_ptr<nad_parameters> to_c_struct() const;
void nad_to_c_struct(nad_parameters& params) const;

bool edge_name_displayed;
};

char* copyStringToCharPtr(const std::string& str);
char** copyVectorStringToCharPtrPtr(const std::vector<std::string>& strings);
int* copyVectorInt(const std::vector<int>& ints);
Expand Down Expand Up @@ -382,9 +391,9 @@ std::vector<std::string> getSingleLineDiagramSvgAndMetadata(const JavaHandle& ne

std::vector<std::string> getSingleLineDiagramComponentLibraryNames();

void writeNetworkAreaDiagramSvg(const JavaHandle& network, const std::string& svgFile, const std::vector<std::string>& voltageLevelIds, int depth, double highNominalVoltageBound, double lowNominalVoltageBound, bool edgeNameDisplayed);
void writeNetworkAreaDiagramSvg(const JavaHandle& network, const std::string& svgFile, const std::vector<std::string>& voltageLevelIds, int depth, double highNominalVoltageBound, double lowNominalVoltageBound, const NadParameters& parameters);

std::string getNetworkAreaDiagramSvg(const JavaHandle& network, const std::vector<std::string>& voltageLevelIds, int depth, double highNominalVoltageBound, double lowNominalVoltageBound, bool edgeNameDisplayed);
std::string getNetworkAreaDiagramSvg(const JavaHandle& network, const std::vector<std::string>& voltageLevelIds, int depth, double highNominalVoltageBound, double lowNominalVoltageBound, const NadParameters& parameters);

std::vector<std::string> getNetworkAreaDiagramDisplayedVoltageLevels(const JavaHandle& network, const std::vector<std::string>& voltageLevelIds, int depth);

Expand Down Expand Up @@ -536,6 +545,8 @@ void removeElementsModification(pypowsybl::JavaHandle network, const std::vector

SldParameters* createSldParameters();

NadParameters* createNadParameters();

//=======dynamic modeling for dynawaltz package==========

//handle creation
Expand Down
Expand Up @@ -999,6 +999,15 @@ public interface SldParametersPointer extends PointerBase {
void setComponentLibrary(CCharPointer componentLibrary);
}

@CStruct("nad_parameters")
public interface NadParametersPointer extends PointerBase {
@CField("edge_name_displayed")
void setEdgeNameDisplayed(boolean edgeNameDisplayed);

@CField("edge_name_displayed")
boolean isEdgeNameDisplayed();
}

@CEnum("DynamicMappingType")
public enum DynamicMappingType {
ALPHA_BETA_LOAD,
Expand Down
Expand Up @@ -36,45 +36,45 @@ private NetworkAreaDiagramUtil() {
}

static void writeSvg(Network network, List<String> voltageLevelIds, int depth, Writer writer,
double highNominalVoltageBound, double lowNominalVoltageBound, boolean edgeNameDisplayed) {
SvgParameters svgParameters = new SvgParameters()
.setSvgWidthAndHeightAdded(true)
.setFixedWidth(800)
.setFixedHeight(600)
.setEdgeNameDisplayed(edgeNameDisplayed);

double highNominalVoltageBound, double lowNominalVoltageBound, NadParameters nadParameters) {
Predicate<VoltageLevel> filter = !voltageLevelIds.isEmpty()
? getNominalVoltageFilter(network, voltageLevelIds, highNominalVoltageBound, lowNominalVoltageBound, depth)
: VoltageLevelFilter.NO_FILTER;
NadParameters nadParameters = new NadParameters()
.setSvgParameters(svgParameters);

NetworkAreaDiagram.draw(network, writer, nadParameters, filter);
}

static String getSvg(Network network, List<String> voltageLevelIds, int depth, boolean edgeNameDisplayed) {
return getSvg(network, voltageLevelIds, depth, -1, -1, edgeNameDisplayed);
static String getSvg(Network network, List<String> voltageLevelIds, NadParameters nadParameters) {
return getSvg(network, voltageLevelIds, 0, -1, -1, nadParameters);
}

static String getSvg(Network network, List<String> voltageLevelIds, int depth,
double highNominalVoltageBound, double lowNominalVoltageBound, boolean edgeNameDisplayed) {
double highNominalVoltageBound, double lowNominalVoltageBound, NadParameters nadParameters) {
try (StringWriter writer = new StringWriter()) {
writeSvg(network, voltageLevelIds, depth, writer, highNominalVoltageBound, lowNominalVoltageBound, edgeNameDisplayed);
writeSvg(network, voltageLevelIds, depth, writer, highNominalVoltageBound, lowNominalVoltageBound, nadParameters);
return writer.toString();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}

static void writeSvg(Network network, List<String> voltageLevelIds, int depth, String svgFile,
Double highNominalVoltageBound, Double lowNominalVoltageBound, boolean edgeNameDisplayed) {
Double highNominalVoltageBound, Double lowNominalVoltageBound, NadParameters nadParameters) {
try (Writer writer = Files.newBufferedWriter(Paths.get(svgFile), StandardCharsets.UTF_8)) {
writeSvg(network, voltageLevelIds, depth, writer, highNominalVoltageBound, lowNominalVoltageBound, edgeNameDisplayed);
writeSvg(network, voltageLevelIds, depth, writer, highNominalVoltageBound, lowNominalVoltageBound, nadParameters);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}

static NadParameters createNadParameters() {
SvgParameters svgParameters = new SvgParameters()
.setSvgWidthAndHeightAdded(true)
.setFixedWidth(800)
.setFixedHeight(600);
return new NadParameters()
.setSvgParameters(svgParameters);
}

static VoltageLevelFilter getNominalVoltageFilter(Network network, List<String> voltageLevelIds,
double highNominalVoltageBound,
double lowNominalVoltageBound, int depth) {
Expand Down
Expand Up @@ -29,6 +29,7 @@
import com.powsybl.dataframe.update.UpdatingDataframe;
import com.powsybl.iidm.network.*;
import com.powsybl.iidm.reducer.*;
import com.powsybl.nad.NadParameters;
import com.powsybl.python.commons.CTypeUtil;
import com.powsybl.python.commons.Directives;
import com.powsybl.python.commons.PyPowsyblApiHeader;
Expand Down Expand Up @@ -879,6 +880,21 @@ public static SldParametersPointer createSldParameters(IsolateThread thread, PyP
return doCatch(exceptionHandlerPtr, () -> convertToSldParametersPointer(SingleLineDiagramUtil.createSldParameters()));
}

public static NadParametersPointer convertToNadParametersPointer(NadParameters parameters) {
NadParametersPointer paramsPtr = UnmanagedMemory.calloc(SizeOf.get(NadParametersPointer.class));
copyToCNadParameters(parameters, paramsPtr);
return paramsPtr;
}

public static void copyToCNadParameters(NadParameters parameters, NadParametersPointer cParameters) {
cParameters.setEdgeNameDisplayed(parameters.getSvgParameters().isEdgeNameDisplayed());
}

@CEntryPoint(name = "createNadParameters")
public static NadParametersPointer createNadParameters(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) {
return doCatch(exceptionHandlerPtr, () -> convertToNadParametersPointer(NetworkAreaDiagramUtil.createNadParameters()));
}

public static void freeSldParametersPointer(SldParametersPointer sldParametersPtr) {
UnmanagedMemory.free(sldParametersPtr);
}
Expand All @@ -891,6 +907,14 @@ public static void freeSldParameters(IsolateThread thread, SldParametersPointer
});
}

@CEntryPoint(name = "freeNadParameters")
public static void freeNadParameters(IsolateThread thread, NadParametersPointer nadParametersPointer,
PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) {
doCatch(exceptionHandlerPtr, () -> {
UnmanagedMemory.free(nadParametersPointer);
});
}

public static SldParameters convertSldParameters(SldParametersPointer sldParametersPtr) {
String componentLibraryName = CTypeUtil.toString(sldParametersPtr.getComponentLibrary());
SldParameters sldParameters = SingleLineDiagramUtil.createSldParameters()
Expand All @@ -904,6 +928,13 @@ public static SldParameters convertSldParameters(SldParametersPointer sldParamet
return sldParameters;
}

public static NadParameters convertNadParameters(NadParametersPointer nadParametersPointer) {
NadParameters nadParameters = NetworkAreaDiagramUtil.createNadParameters();
nadParameters.getSvgParameters()
.setEdgeNameDisplayed(nadParametersPointer.isEdgeNameDisplayed());
return nadParameters;
}

@CEntryPoint(name = "writeSingleLineDiagramSvg")
public static void writeSingleLineDiagramSvg(IsolateThread thread, ObjectHandle networkHandle, CCharPointer containerId,
CCharPointer svgFile, CCharPointer metadataFile, SldParametersPointer sldParametersPtr,
Expand Down Expand Up @@ -949,24 +980,26 @@ public static PyPowsyblApiHeader.ArrayPointer<CCharPointerPointer> getSingleLine
@CEntryPoint(name = "writeNetworkAreaDiagramSvg")
public static void writeNetworkAreaDiagramSvg(IsolateThread thread, ObjectHandle networkHandle, CCharPointer svgFile,
CCharPointerPointer voltageLevelIdsPointer, int voltageLevelIdCount, int depth,
double highNominalVoltageBound, double lowNominalVoltageBound, boolean edgeNameDisplayed,
double highNominalVoltageBound, double lowNominalVoltageBound, NadParametersPointer nadParametersPointer,
ExceptionHandlerPointer exceptionHandlerPtr) {
doCatch(exceptionHandlerPtr, () -> {
Network network = ObjectHandles.getGlobal().get(networkHandle);
String svgFileStr = CTypeUtil.toString(svgFile);
List<String> voltageLevelIds = toStringList(voltageLevelIdsPointer, voltageLevelIdCount);
NetworkAreaDiagramUtil.writeSvg(network, voltageLevelIds, depth, svgFileStr, highNominalVoltageBound, lowNominalVoltageBound, edgeNameDisplayed);
NadParameters nadParameters = convertNadParameters(nadParametersPointer);
NetworkAreaDiagramUtil.writeSvg(network, voltageLevelIds, depth, svgFileStr, highNominalVoltageBound, lowNominalVoltageBound, nadParameters);
});
}

@CEntryPoint(name = "getNetworkAreaDiagramSvg")
public static CCharPointer getNetworkAreaDiagramSvg(IsolateThread thread, ObjectHandle networkHandle, CCharPointerPointer voltageLevelIdsPointer,
int voltageLevelIdCount, int depth, double highNominalVoltageBound,
double lowNominalVoltageBound, boolean edgeNameDisplayed, ExceptionHandlerPointer exceptionHandlerPtr) {
double lowNominalVoltageBound, NadParametersPointer nadParametersPointer, ExceptionHandlerPointer exceptionHandlerPtr) {
return doCatch(exceptionHandlerPtr, () -> {
Network network = ObjectHandles.getGlobal().get(networkHandle);
List<String> voltageLevelIds = toStringList(voltageLevelIdsPointer, voltageLevelIdCount);
String svg = NetworkAreaDiagramUtil.getSvg(network, voltageLevelIds, depth, highNominalVoltageBound, lowNominalVoltageBound, edgeNameDisplayed);
NadParameters nadParameters = convertNadParameters(nadParametersPointer);
String svg = NetworkAreaDiagramUtil.getSvg(network, voltageLevelIds, depth, highNominalVoltageBound, lowNominalVoltageBound, nadParameters);
return CTypeUtil.toCharPtr(svg);
});
}
Expand Down
Expand Up @@ -30,7 +30,7 @@ private SingleLineDiagramUtil() {

static void writeSvg(Network network, String containerId, String svgFile, String metadataFile, SldParameters sldParameters) {
try (Writer writer = Files.newBufferedWriter(Paths.get(svgFile));
Writer metadataWriter = metadataFile.isEmpty() ? new StringWriter() : Files.newBufferedWriter(Paths.get(metadataFile))) {
Writer metadataWriter = metadataFile == null || metadataFile.isEmpty() ? new StringWriter() : Files.newBufferedWriter(Paths.get(metadataFile))) {
writeSvg(network, containerId, writer, metadataWriter, sldParameters);
} catch (IOException e) {
throw new UncheckedIOException(e);
Expand Down

0 comments on commit ebf2708

Please sign in to comment.