Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor network area diagram parameters #675

Merged
merged 3 commits into from Nov 22, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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