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`||
|
||||
|`ENdeletelink`||
|
||||
|`ENdeletenode`||
|
||||
|
||||
|`ENgetdemandname`||
|
||||
|`ENsetdemandname`||
|
||||
|
||||
## API Extensions (additional definitions)
|
||||
### 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 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
|
||||
|
||||
@@ -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.
|
||||
@@ -1291,6 +1311,8 @@ extern "C" {
|
||||
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);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
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
|
||||
ENgetcurvetype = _ENgetcurvetype@8
|
||||
ENinit = _ENinit@16
|
||||
ENgetdemandname = _ENgetdemandname@12
|
||||
ENsetdemandname = _ENsetdemandname@12
|
||||
Reference in New Issue
Block a user