diff --git a/CMakeLists.txt b/CMakeLists.txt index 466e964..d0fbce6 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -75,12 +75,11 @@ source_group("Library" FILES ${EPANET_LIB_ALL}) # the shared library -add_library(epanet SHARED ${EPANET_SOURCES}) #${EPANET_API_HEADER}) +add_library(epanet SHARED ${EPANET_SOURCES}) target_include_directories(epanet PUBLIC ${PROJECT_SOURCE_DIR}/include) # create export lib so we can link against dll using Visual Studio -add_definitions(-D WITH_GENX) include(GenerateExportHeader) GENERATE_EXPORT_HEADER(epanet BASE_NAME epanet diff --git a/README.md b/README.md index 0c1c01b..4020cb0 100755 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ EPANET {#epanet-readme} ====== ## Build Status -[![Build status](https://ci.appveyor.com/api/projects/status/19wpg4g2cmj3oihl?svg=true)](https://ci.appveyor.com/project/OpenWaterAnalytics/epanet) +[![Build status](https://ci.appveyor.com/api/projects/status/19wpg4g2cmj3oihl?svg=true)](https://ci.appveyor.com/project/OpenWaterAnalytics/epanet/branch/dev) [![Build Status](https://travis-ci.org/OpenWaterAnalytics/EPANET.svg?branch=master)](https://travis-ci.org/OpenWaterAnalytics/EPANET) ## For EPANET-related questions and discussion diff --git a/include/epanet2.h b/include/epanet2.h index 0aeb7b4..6ac7733 100644 --- a/include/epanet2.h +++ b/include/epanet2.h @@ -30,9 +30,7 @@ #define EN_API_FLOAT_TYPE float #endif -#ifdef WITH_GENX - #include "epanet_export.h" -#else +#ifdef NO_GENX // --- define WINDOWS #undef WINDOWS #ifdef _WIN32 @@ -62,6 +60,8 @@ #define DLLEXPORT #endif #endif +#else + #include "epanet_export.h" #endif diff --git a/run/CMakeLists.txt b/run/CMakeLists.txt index 53e792b..4822e95 100644 --- a/run/CMakeLists.txt +++ b/run/CMakeLists.txt @@ -19,7 +19,6 @@ source_group("CLI" FILES ${EPANET_CLI_SOURCES}) # Creates the EPANET command line executable -add_definitions(-D WITH_GENX) add_executable(runepanet ${EPANET_CLI_SOURCES}) if(NOT WIN32) target_link_libraries(runepanet LINK_PUBLIC epanet m) diff --git a/src/epanet.c b/src/epanet.c index 63d1524..ca3495a 100644 --- a/src/epanet.c +++ b/src/epanet.c @@ -132,7 +132,7 @@ execute function x and set the error code equal to its return value. // This single global variable is used only when the library is called // in "legacy mode" with the 2.1-style API. -EN_Project *_defaultModel; +void *_defaultModel; // Local functions @@ -164,12 +164,15 @@ void errorLookup(int errcode, char *errmsg, int len); int DLLEXPORT ENepanet(const char *f1, const char *f2, const char *f3, void (*pviewprog)(char *)) { int errcode = 0; + EN_Project *p = NULL; ERRCODE(EN_createproject(&_defaultModel)); ERRCODE(EN_open(_defaultModel, f1, f2, f3)); - _defaultModel->viewprog = pviewprog; - if (_defaultModel->out_files.Hydflag != USE) { + p = (EN_Project*)(_defaultModel); + p->viewprog = pviewprog; + + if (p->out_files.Hydflag != USE) { ERRCODE(EN_solveH(_defaultModel)); } @@ -182,6 +185,14 @@ int DLLEXPORT ENepanet(const char *f1, const char *f2, const char *f3, void (*pv return (errcode); } +int DLLEXPORT ENinit(char *f2, char *f3, int UnitsType, + int HeadlossFormula) { + int errcode = 0; + ERRCODE(EN_createproject(&_defaultModel)); + ERRCODE(EN_init(_defaultModel, f2, f3, UnitsType, HeadlossFormula)); + return (errcode); +} + int DLLEXPORT ENopen(char *f1, char *f2, char *f3) { int errcode = 0; ERRCODE(EN_createproject(&_defaultModel)); @@ -603,7 +614,7 @@ int DLLEXPORT EN_deleteproject(EN_ProjectHandle *ph) } -int DLLEXPORT EN_init(EN_ProjectHandle *ph, char *f2, char *f3, +int DLLEXPORT EN_init(EN_ProjectHandle ph, char *f2, char *f3, EN_FlowUnits UnitsType, EN_FormType HeadlossFormula) /*---------------------------------------------------------------- ** Input: @@ -624,7 +635,7 @@ int DLLEXPORT EN_init(EN_ProjectHandle *ph, char *f2, char *f3, _fpreset(); #endif - EN_Project *pr = (EN_Project*)*ph; + EN_Project *pr = (EN_Project*)ph; /* Set system flags */ pr->Openflag = TRUE; @@ -3104,7 +3115,7 @@ int DLLEXPORT EN_addpattern(EN_ProjectHandle ph, char *id) { if (!p->Openflag) return set_error(p->error_handle, 102); - if (ENgetpatternindex(id, &i) == 0) + if (EN_getpatternindex(ph, id, &i) == 0) return set_error(p->error_handle, 215); /* Check that id name is not too long */ @@ -3157,7 +3168,7 @@ int DLLEXPORT EN_addpattern(EN_ProjectHandle ph, char *id) { for (i = 0; i <= Npats; i++) free(Pattern[i].F); free(Pattern); - Pattern = tmpPat; + net->Pattern = tmpPat; net->Npats = n; par->MaxPats = n; return set_error(p->error_handle, 0); @@ -3644,7 +3655,7 @@ int DLLEXPORT EN_setheadcurveindex(EN_ProjectHandle ph, int index, int curveinde double *Ucf = p->Ucf; int pIdx; Spump *pump; - + if (!p->Openflag) return set_error(p->error_handle, 102); if (index < 1 || index > Nlinks || EN_PUMP != Link[index].Type) { @@ -4829,6 +4840,7 @@ int DLLEXPORT EN_addlink(EN_ProjectHandle ph, char *id, EN_LinkType linkType, ch link->Type = linkType; link->N1 = N1; link->N2 = N2; + link->Stat = OPEN; if (linkType == EN_PUMP) { link->Kc = 1.0; // Speed factor @@ -4844,23 +4856,14 @@ int DLLEXPORT EN_addlink(EN_ProjectHandle ph, char *id, EN_LinkType linkType, ch link->Kc = 0.0; // Valve setting. link->Km = 0.0; // Loss coeff link->Len = 0.0; + link->Stat = ACTIVE; } - // link->Len = 0.0; - // link->Kc = 0.01; - // link->Km = 0; link->Kb = 0; link->Kw = 0; link->R = 0; link->Rc = 0; link->Rpt = 0; - if (linkType == EN_CVPIPE) { - link->Stat = OPEN; - } - else { - link->Stat = CLOSED; - } - ENHashTableInsert(net->LinkHashTable, link->ID, n); return set_error(p->error_handle, 0); } diff --git a/tests/test_toolkit.cpp b/tests/test_toolkit.cpp index a0e0bdb..7b87674 100644 --- a/tests/test_toolkit.cpp +++ b/tests/test_toolkit.cpp @@ -236,6 +236,28 @@ BOOST_FIXTURE_TEST_CASE(test_setdemandpattern, Fixture) BOOST_REQUIRE(pat_index == pat_index_2); } } + +BOOST_FIXTURE_TEST_CASE(test_addpattern, Fixture) +{ + int pat_index, n_patterns_1, n_patterns_2; + char newpat[] = "new_pattern"; + + // get the number of current patterns + error = EN_getcount(ph, EN_PATCOUNT, &n_patterns_1); + BOOST_REQUIRE(error == 0); + + // add a new pattern + error = EN_addpattern(ph, newpat); + BOOST_REQUIRE(error == 0); + + // get the new patterns count, shoul dbe the old one + 1 + error = EN_getcount(ph, EN_PATCOUNT, &n_patterns_2); + BOOST_REQUIRE(error == 0); + BOOST_REQUIRE(n_patterns_1 + 1 == n_patterns_2); + + // gwt the new patterns index, should be as the number of patterns + error = EN_getpatternindex(ph, newpat, &pat_index); + BOOST_REQUIRE(pat_index == n_patterns_2); } BOOST_AUTO_TEST_SUITE_END() diff --git a/win_build/WinSDK/Makefile.bat b/win_build/WinSDK/Makefile.bat index 91ffc95..e5188c2 100644 --- a/win_build/WinSDK/Makefile.bat +++ b/win_build/WinSDK/Makefile.bat @@ -21,9 +21,9 @@ Find /i "x86" < checkOS.tmp > StringCheck.tmp If %ERRORLEVEL% == 1 ( CALL "%SDK_PATH%bin\"SetEnv.cmd /x64 /release rem : create EPANET2.DLL - cl -o epanet2.dll epanet.c util\errormanager.c hash.c hydraul.c hydcoeffs.c hydstatus.c hydsolver.c inpfile.c input1.c input2.c input3.c mempool.c output.c quality.c report.c rules.c smatrix.c genmmd.c /I ..\include /I ..\run /link /DLL + cl -o epanet2.dll /D NO_GENX epanet.c util\errormanager.c hash.c hydraul.c hydcoeffs.c hydstatus.c hydsolver.c inpfile.c input1.c input2.c input3.c mempool.c output.c quality.c report.c rules.c smatrix.c genmmd.c /I ..\include /I ..\run /link /DLL rem : create EPANET2.EXE - cl -o epanet2.exe epanet.c util\errormanager.c ..\run\main.c hash.c hydraul.c hydcoeffs.c hydstatus.c hydsolver.c inpfile.c input1.c input2.c input3.c mempool.c output.c quality.c report.c rules.c smatrix.c genmmd.c /I ..\include /I ..\run /I ..\src /link + cl -o epanet2.exe /D NO_GENX epanet.c util\errormanager.c ..\run\main.c hash.c hydraul.c hydcoeffs.c hydstatus.c hydsolver.c inpfile.c input1.c input2.c input3.c mempool.c output.c quality.c report.c rules.c smatrix.c genmmd.c /I ..\include /I ..\run /I ..\src /link md "%Build_PATH%"\64bit move /y "%SRC_PATH%"\*.dll "%Build_PATH%"\64bit move /y "%SRC_PATH%"\*.exe "%Build_PATH%"\64bit @@ -35,9 +35,9 @@ rem : 32 bit with DEF CALL "%SDK_PATH%bin\"SetEnv.cmd /x86 /release echo "32 bit with epanet2.def mapping" rem : create EPANET2.DLL -cl -o epanet2.dll epanet.c util\errormanager.c hash.c hydraul.c hydcoeffs.c hydstatus.c hydsolver.c inpfile.c input1.c input2.c input3.c mempool.c output.c quality.c report.c rules.c smatrix.c genmmd.c /I ..\include /I ..\run /link /DLL /def:..\win_build\WinSDK\epanet2.def /MAP +cl -o epanet2.dll /D NO_GENX epanet.c util\errormanager.c hash.c hydraul.c hydcoeffs.c hydstatus.c hydsolver.c inpfile.c input1.c input2.c input3.c mempool.c output.c quality.c report.c rules.c smatrix.c genmmd.c /I ..\include /I ..\run /link /DLL /def:..\win_build\WinSDK\epanet2.def /MAP rem : create EPANET2.EXE -cl -o epanet2.exe epanet.c util\errormanager.c ..\run\main.c hash.c hydraul.c hydcoeffs.c hydstatus.c hydsolver.c inpfile.c input1.c input2.c input3.c mempool.c output.c quality.c report.c rules.c smatrix.c genmmd.c /I ..\include /I ..\run /I ..\src /link +cl -o epanet2.exe /D NO_GENX epanet.c util\errormanager.c ..\run\main.c hash.c hydraul.c hydcoeffs.c hydstatus.c hydsolver.c inpfile.c input1.c input2.c input3.c mempool.c output.c quality.c report.c rules.c smatrix.c genmmd.c /I ..\include /I ..\run /I ..\src /link md "%Build_PATH%"\32bit move /y "%SRC_PATH%"\*.dll "%Build_PATH%"\32bit move /y "%SRC_PATH%"\*.exe "%Build_PATH%"\32bit diff --git a/win_build/WinSDK/epanet2.def b/win_build/WinSDK/epanet2.def index a497c50..a330677 100644 --- a/win_build/WinSDK/epanet2.def +++ b/win_build/WinSDK/epanet2.def @@ -68,6 +68,7 @@ EXPORTS ENsetdemandpattern = _ENsetdemandpattern@12 ENgetaveragepatternvalue = _ENgetaveragepatternvalue@8 ENgetheadcurveindex = _ENgetheadcurveindex@8 + ENsetheadcurveindex = _ENsetheadcurveindex@8 ENgetpumptype = _ENgetpumptype@8 ENgetcurveindex = _ENgetcurveindex@8 ENgetcurveid = _ENgetcurveid@8 @@ -97,4 +98,4 @@ EXPORTS ENgetdemandmodel = _ENgetdemandmodel@16 ENsetdemandmodel = _ENsetdemandmodel@16 ENgetcurvetype = _ENgetcurvetype@8 - + ENinit = _ENinit@16 \ No newline at end of file