Merge pull request #296 from eladsal/dev-dem-cat

Add demand names get\set APIs
Close #294
This commit is contained in:
Elad Salomons
2018-10-01 10:47:40 +03:00
committed by GitHub
6 changed files with 162 additions and 4 deletions

View File

@@ -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:

View File

@@ -227,6 +227,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

View File

@@ -938,6 +938,26 @@ extern "C" {
*/
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.
@param nodeIndex The index of a node.
@@ -1288,12 +1308,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);

View File

@@ -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) {
@@ -4765,6 +4774,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;

View File

@@ -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 <boost/test/included/unit_test.hpp>
#include <string>
#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()

View File

@@ -100,3 +100,5 @@ EXPORTS
ENsetdemandmodel = _ENsetdemandmodel@16
ENgetcurvetype = _ENgetcurvetype@8
ENinit = _ENinit@16
ENgetdemandname = _ENgetdemandname@12
ENsetdemandname = _ENsetdemandname@12