Merge pull request #296 from eladsal/dev-dem-cat
Add demand names get\set APIs Close #294
This commit is contained in:
@@ -130,7 +130,8 @@ for the thread-safe API. Some additional points regarding the new **PDA** option
|
|||||||
|`ENaddlink`||
|
|`ENaddlink`||
|
||||||
|`ENdeletelink`||
|
|`ENdeletelink`||
|
||||||
|`ENdeletenode`||
|
|`ENdeletenode`||
|
||||||
|
|`ENgetdemandname`||
|
||||||
|
|`ENsetdemandname`||
|
||||||
|
|
||||||
## API Extensions (additional definitions)
|
## API Extensions (additional definitions)
|
||||||
### Link value types:
|
### Link value types:
|
||||||
|
|||||||
@@ -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 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 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 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 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
|
Declare Function ENgetlinktype Lib "epanet2.dll" (ByVal index As Long, code As Long) As Long
|
||||||
|
|||||||
@@ -938,6 +938,26 @@ extern "C" {
|
|||||||
*/
|
*/
|
||||||
int DLLEXPORT ENgetqualinfo(int *qualcode, char *chemname, char *chemunits, int *tracenode);
|
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.
|
@brief Sets the node's base demand for a category.
|
||||||
@param nodeIndex The index of a node.
|
@param nodeIndex The index of a node.
|
||||||
@@ -1291,6 +1311,8 @@ extern "C" {
|
|||||||
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);
|
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_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_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);
|
||||||
|
|||||||
58
src/epanet.c
58
src/epanet.c
@@ -530,6 +530,15 @@ int DLLEXPORT ENgetaveragepatternvalue(int index, EN_API_FLOAT_TYPE *value) {
|
|||||||
return EN_getaveragepatternvalue(_defaultModel, index, 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 DLLEXPORT ENgetrule(int index, int *nPremises, int *nTrueActions,
|
||||||
int *nFalseActions, EN_API_FLOAT_TYPE *priority) {
|
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);
|
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) {
|
int DLLEXPORT EN_setdemandpattern(EN_ProjectHandle ph, int nodeIndex, int demandIdx, int patIndex) {
|
||||||
|
|
||||||
EN_Project *pr = (EN_Project*)ph;
|
EN_Project *pr = (EN_Project*)ph;
|
||||||
|
|||||||
72
tests/test_demand_categories.cpp
Normal file
72
tests/test_demand_categories.cpp
Normal 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()
|
||||||
@@ -100,3 +100,5 @@ EXPORTS
|
|||||||
ENsetdemandmodel = _ENsetdemandmodel@16
|
ENsetdemandmodel = _ENsetdemandmodel@16
|
||||||
ENgetcurvetype = _ENgetcurvetype@8
|
ENgetcurvetype = _ENgetcurvetype@8
|
||||||
ENinit = _ENinit@16
|
ENinit = _ENinit@16
|
||||||
|
ENgetdemandname = _ENgetdemandname@12
|
||||||
|
ENsetdemandname = _ENsetdemandname@12
|
||||||
Reference in New Issue
Block a user