From c1c80da667e367a5f6d5e603479b3d15c5e91808 Mon Sep 17 00:00:00 2001 From: Elad Salomons Date: Wed, 26 Sep 2018 11:15:37 +0300 Subject: [PATCH 1/3] Add APIs to get\set demand categories names --- include/epanet2.bas | 3 ++ include/epanet2.h | 26 ++++++++++++++-- src/epanet.c | 58 ++++++++++++++++++++++++++++++++++++ win_build/WinSDK/epanet2.def | 4 ++- 4 files changed, 88 insertions(+), 3 deletions(-) diff --git a/include/epanet2.bas b/include/epanet2.bas index da0f66e..1fbc228 100644 --- a/include/epanet2.bas +++ b/include/epanet2.bas @@ -226,6 +226,9 @@ Public Const EN_G_CURVE = 4 ' General\default curve Declare Function ENgetbasedemand Lib "epanet2.dll" (ByVal index As Long, ByVal DemandIndex As Long, value As Single) As Long Declare Function ENgetdemandpattern Lib "epanet2.dll" (ByVal index As Long, ByVal DemandIndex As Long, PatIndex As Long) As Long + Declare Function ENgetdemandname Lib "epanet2.dll" (ByVal index As Long, ByVal DemandIndex As Long, ByVal demandName As String) As Long + Declare Function ENsetdemandname Lib "epanet2.dll" (ByVal nodeIndex As Long, ByVal DemandIndex As Long, ByVal demandName As String) As Long + Declare Function ENgetlinkindex Lib "epanet2.dll" (ByVal id As String, index As Long) As Long Declare Function ENgetlinkid Lib "epanet2.dll" (ByVal index As Long, ByVal id As String) As Long Declare Function ENgetlinktype Lib "epanet2.dll" (ByVal index As Long, code As Long) As Long diff --git a/include/epanet2.h b/include/epanet2.h index c7ccf1e..4d088fa 100644 --- a/include/epanet2.h +++ b/include/epanet2.h @@ -936,6 +936,26 @@ extern "C" { @see EN_QualityType */ int DLLEXPORT ENgetqualinfo(int *qualcode, char *chemname, char *chemunits, int *tracenode); + + /** + @brief Sets the node's demand name for a category. + @param nodeIndex The index of a node. + @param demandIdx The index of a demand category. + @param demandName The demand name for the selected category. + @return Error code. + @see ENgetdemandname + */ + int DLLEXPORT ENsetdemandname(int nodeIndex, int demandIdx, char *demandName); + + /** + @brief Retrieves the node's demand name for a category. + @param nodeIndex The index of a node. + @param demandIdx The index of a demand category. + @param demandName The demand name for the selected category. + @return Error code. + @see ENsetdemandname + */ + int DLLEXPORT ENgetdemandname(int nodeIndex, int demandIdx, char *demandName); /** @brief Sets the node's base demand for a category. @@ -1287,12 +1307,14 @@ extern "C" { int DLLEXPORT EN_getdemandmodel(EN_ProjectHandle ph, int *type, EN_API_FLOAT_TYPE *pmin, EN_API_FLOAT_TYPE *preq, EN_API_FLOAT_TYPE *pexp); - int DLLEXPORT EN_setdemandmodel(EN_ProjectHandle ph, int type, EN_API_FLOAT_TYPE pmin, + int DLLEXPORT EN_setdemandmodel(EN_ProjectHandle ph, int type, EN_API_FLOAT_TYPE pmin, EN_API_FLOAT_TYPE preq, EN_API_FLOAT_TYPE pexp); + int DLLEXPORT EN_setdemandname(EN_ProjectHandle ph, int nodeIndex, int demandIdx, char *demandName); + int DLLEXPORT EN_getdemandname(EN_ProjectHandle ph, int nodeIndex, int demandIdx, char *demandName); int DLLEXPORT EN_getqualinfo(EN_ProjectHandle ph, int *qualcode, char *chemname, char *chemunits, int *tracenode); int DLLEXPORT EN_setbasedemand(EN_ProjectHandle ph, int nodeIndex, int demandIdx, EN_API_FLOAT_TYPE baseDemand); - int DLLEXPORT EN_setdemandpattern(EN_ProjectHandle ph, int nodeIndex, int demandIdx, int patIndex); + int DLLEXPORT EN_setdemandpattern(EN_ProjectHandle ph, int nodeIndex, int demandIdx, int patIndex); int DLLEXPORT EN_getcurveindex(EN_ProjectHandle ph, char *id, int *index); int DLLEXPORT EN_getcurveid(EN_ProjectHandle ph, int index, char *id); int DLLEXPORT EN_getcurvelen(EN_ProjectHandle ph, int index, int *len); diff --git a/src/epanet.c b/src/epanet.c index 2776daf..a445069 100644 --- a/src/epanet.c +++ b/src/epanet.c @@ -530,6 +530,15 @@ int DLLEXPORT ENgetaveragepatternvalue(int index, EN_API_FLOAT_TYPE *value) { return EN_getaveragepatternvalue(_defaultModel, index, value); } +int DLLEXPORT ENgetdemandname(int nodeIndex, int demandIdx, + char *demandName) { + return EN_getdemandname(_defaultModel, nodeIndex, demandIdx, demandName); +} + +int DLLEXPORT ENsetdemandname(int nodeIndex, int demandIdx, + char *demandName) { + return EN_setdemandname(_defaultModel, nodeIndex, demandIdx, demandName); +} int DLLEXPORT ENgetrule(int index, int *nPremises, int *nTrueActions, int *nFalseActions, EN_API_FLOAT_TYPE *priority) { @@ -4762,6 +4771,55 @@ int DLLEXPORT EN_setbasedemand(EN_ProjectHandle ph, int nodeIndex, int demandIdx return set_error(pr->error_handle, 0); } +int DLLEXPORT EN_getdemandname(EN_ProjectHandle ph, int nodeIndex, int demandIdx, char *demandName) { + Pdemand d; + int n = 1; + + EN_Project *p = (EN_Project*)ph; + + strcpy(demandName, ""); + /* Check for valid arguments */ + if (!p->Openflag) + return set_error(p->error_handle, 102); + if (nodeIndex <= 0 || nodeIndex > p->network.Njuncs) + return set_error(p->error_handle, 203); + for (d = p->network.Node[nodeIndex].D; n < demandIdx && d->next != NULL; d = d->next) { + n++; + } + if (n != demandIdx) { + return set_error(p->error_handle, 253); + } + strcpy(demandName, d->Name); + return set_error(p->error_handle, 0); +} + +int DLLEXPORT EN_setdemandname(EN_ProjectHandle ph, int nodeIndex, int demandIdx, char *demandName) { + + EN_Project *pr = (EN_Project*)ph; + + EN_Network *net = &pr->network; + Snode *Node = net->Node; + + const int Nnodes = net->Nnodes; + const int Njuncs = net->Njuncs; + + double *Ucf = pr->Ucf; + + Pdemand d; + int n = 1; + /* Check for valid arguments */ + if (!pr->Openflag) + return set_error(pr->error_handle, 102); + if (nodeIndex <= 0 || nodeIndex > Njuncs) + return set_error(pr->error_handle, 203); + for (d = Node[nodeIndex].D; n < demandIdx && d->next != NULL; d = d->next) + n++; + if (n != demandIdx) + return set_error(pr->error_handle, 253); + strncpy(d->Name, demandName, MAXMSG); + return set_error(pr->error_handle, 0); +} + int DLLEXPORT EN_setdemandpattern(EN_ProjectHandle ph, int nodeIndex, int demandIdx, int patIndex) { EN_Project *pr = (EN_Project*)ph; diff --git a/win_build/WinSDK/epanet2.def b/win_build/WinSDK/epanet2.def index 398b2f1..fd4d4a9 100644 --- a/win_build/WinSDK/epanet2.def +++ b/win_build/WinSDK/epanet2.def @@ -99,4 +99,6 @@ EXPORTS ENgetdemandmodel = _ENgetdemandmodel@16 ENsetdemandmodel = _ENsetdemandmodel@16 ENgetcurvetype = _ENgetcurvetype@8 - ENinit = _ENinit@16 \ No newline at end of file + ENinit = _ENinit@16 + ENgetdemandname = _ENgetdemandname@12 + ENsetdemandname = _ENsetdemandname@12 \ No newline at end of file From 0b5c5a3b7e40308c7db2f1e784f666c6e749e66a Mon Sep 17 00:00:00 2001 From: Elad Salomons Date: Wed, 26 Sep 2018 12:13:49 +0300 Subject: [PATCH 2/3] Test for set\get demand categories --- tests/test_demand_categories.cpp | 72 ++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 tests/test_demand_categories.cpp diff --git a/tests/test_demand_categories.cpp b/tests/test_demand_categories.cpp new file mode 100644 index 0000000..a910500 --- /dev/null +++ b/tests/test_demand_categories.cpp @@ -0,0 +1,72 @@ +// +// test_demand_categories.cpp +// + +/* +This is a test for the demand categories names get\set APIs +A demand category name is set, the network is saved, reopened and the new demand category name is checked. +*/ + +#define BOOST_TEST_MODULE "toolkit" +#include + +#include +#include "epanet2.h" + +// NOTE: Project Home needs to be updated to run unit test +#define DATA_PATH_INP "./net1.inp" +#define DATA_PATH_RPT "./test.rpt" +#define DATA_PATH_OUT "./test.out" + +using namespace std; + +BOOST_AUTO_TEST_SUITE (test_toolkit) + +BOOST_AUTO_TEST_CASE(test_demand_categories) +{ + int error = 0; + int Nindex, ndem; + char demname[80]; + EN_ProjectHandle ph = NULL; + + std::string path_inp = std::string(DATA_PATH_INP); + std::string path_rpt = std::string(DATA_PATH_RPT); + std::string path_out = std::string(DATA_PATH_OUT); + + error = EN_createproject(&ph); + BOOST_REQUIRE(error == 0); + error = EN_open(ph, path_inp.c_str(), path_rpt.c_str(), path_out.c_str()); + BOOST_REQUIRE(error == 0); + error = EN_getnodeindex(ph, (char *)"12", &Nindex); + BOOST_REQUIRE(error == 0); + error = EN_getnumdemands(ph, Nindex, &ndem); + BOOST_REQUIRE(error == 0); + BOOST_REQUIRE(ndem == 1); + error = EN_setdemandname(ph, Nindex, ndem, (char *)"Demand category name"); + BOOST_REQUIRE(error == 0); + error = EN_saveinpfile(ph, "net1_dem_cat.inp"); + BOOST_REQUIRE(error == 0); + error = EN_close(ph); + BOOST_REQUIRE(error == 0); + error = EN_deleteproject(&ph); + BOOST_REQUIRE(error == 0); + + error = EN_createproject(&ph); + BOOST_REQUIRE(error == 0); + error = EN_open(ph, "net1_dem_cat.inp", path_rpt.c_str(), path_out.c_str()); + BOOST_REQUIRE(error == 0); + error = EN_getnodeindex(ph, (char *)"12", &Nindex); + BOOST_REQUIRE(error == 0); + error = EN_getnumdemands(ph, Nindex, &ndem); + BOOST_REQUIRE(error == 0); + BOOST_REQUIRE(ndem == 1); + error = EN_getdemandname(ph, Nindex, ndem, demname); + BOOST_REQUIRE(error == 0); + BOOST_REQUIRE(strcmp(demname, "Demand category name")==0); + error = EN_close(ph); + BOOST_REQUIRE(error == 0); + error = EN_deleteproject(&ph); + BOOST_REQUIRE(error == 0); +} + +BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file From 0932ef7d80fefb5a8833c241e0a5b6612155881a Mon Sep 17 00:00:00 2001 From: Elad Salomons Date: Wed, 26 Sep 2018 12:24:11 +0300 Subject: [PATCH 3/3] Update ReleaseNotes2_2.md --- ReleaseNotes2_2.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ReleaseNotes2_2.md b/ReleaseNotes2_2.md index 4ee31d3..dd14ca3 100644 --- a/ReleaseNotes2_2.md +++ b/ReleaseNotes2_2.md @@ -130,7 +130,8 @@ for the thread-safe API. Some additional points regarding the new **PDA** option |`ENaddlink`|| |`ENdeletelink`|| |`ENdeletenode`|| - +|`ENgetdemandname`|| +|`ENsetdemandname`|| ## API Extensions (additional definitions) ### Link value types: