5
LICENSE
5
LICENSE
@@ -1,11 +1,6 @@
|
|||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
<<<<<<< HEAD
|
|
||||||
Works are copyright (c) 2018 their respective AUTHORS,
|
|
||||||
unless such work is in the Public Domain (again, see AUTHORS)
|
|
||||||
=======
|
|
||||||
Copyright (c) 2017 Open Water Analytics
|
Copyright (c) 2017 Open Water Analytics
|
||||||
>>>>>>> master
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
@@ -1867,16 +1867,15 @@ int DLLEXPORT EN_deletenode(EN_Project p, int index, int actionCode)
|
|||||||
// Can't delete a water quality trace node
|
// Can't delete a water quality trace node
|
||||||
if (index == p->quality.TraceNode) return 260;
|
if (index == p->quality.TraceNode) return 260;
|
||||||
|
|
||||||
// Count number of simple & rule-based controls that contain the node
|
// Do not delete a node contained in a control or is connected to a link
|
||||||
if (actionCode == EN_CONDITIONAL)
|
if (actionCode == EN_CONDITIONAL)
|
||||||
{
|
{
|
||||||
actionCode = incontrols(p, NODE, index);
|
if (incontrols(p, NODE, index)) return 261;
|
||||||
for (i = 1; i <= net->Nlinks; i++)
|
for (i = 1; i <= net->Nlinks; i++)
|
||||||
{
|
{
|
||||||
if (net->Link[i].N1 == index ||
|
if (net->Link[i].N1 == index ||
|
||||||
net->Link[i].N2 == index) actionCode += incontrols(p, LINK, i);
|
net->Link[i].N2 == index) return 259;
|
||||||
}
|
}
|
||||||
if (actionCode > 0) return 261;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get a reference to the node & its type
|
// Get a reference to the node & its type
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ DAT(253,"nonexistent demand category")
|
|||||||
DAT(254,"node with no coordinates")
|
DAT(254,"node with no coordinates")
|
||||||
DAT(257,"nonexistent rule")
|
DAT(257,"nonexistent rule")
|
||||||
DAT(258,"nonexistent rule clause")
|
DAT(258,"nonexistent rule clause")
|
||||||
|
DAT(259,"attempt to delete a node that still has links connected to it")
|
||||||
DAT(260,"attempt to delete node assigned as a Trace Node")
|
DAT(260,"attempt to delete node assigned as a Trace Node")
|
||||||
DAT(261,"attempt to delete a node or link contained in a control")
|
DAT(261,"attempt to delete a node or link contained in a control")
|
||||||
DAT(262,"attempt to modify network structure while solver is active")
|
DAT(262,"attempt to modify network structure while solver is active")
|
||||||
|
|||||||
34
src/rules.c
34
src/rules.c
@@ -110,6 +110,10 @@ void initrules(Project *pr)
|
|||||||
//--------------------------------------------------------------
|
//--------------------------------------------------------------
|
||||||
{
|
{
|
||||||
pr->rules.RuleState = r_PRIORITY;
|
pr->rules.RuleState = r_PRIORITY;
|
||||||
|
pr->rules.LastPremise = NULL;
|
||||||
|
pr->rules.LastThenAction = NULL;
|
||||||
|
pr->rules.LastElseAction = NULL;
|
||||||
|
pr->rules.ActionList = NULL;
|
||||||
pr->network.Rule = NULL;
|
pr->network.Rule = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,8 +173,14 @@ void freerules(Project *pr)
|
|||||||
//--------------------------------------------------------------
|
//--------------------------------------------------------------
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
// Already freed
|
||||||
|
if (pr->network.Rule == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
for (i = 1; i <= pr->network.Nrules; i++) clearrule(pr, i);
|
for (i = 1; i <= pr->network.Nrules; i++) clearrule(pr, i);
|
||||||
free(pr->network.Rule);
|
free(pr->network.Rule);
|
||||||
|
pr->network.Rule = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ruledata(Project *pr)
|
int ruledata(Project *pr)
|
||||||
@@ -199,6 +209,12 @@ int ruledata(Project *pr)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case r_RULE:
|
case r_RULE:
|
||||||
|
// Missing the rule label
|
||||||
|
if (parser->Ntokens != 2)
|
||||||
|
{
|
||||||
|
err = 201;
|
||||||
|
break;
|
||||||
|
}
|
||||||
net->Nrules++;
|
net->Nrules++;
|
||||||
newrule(pr);
|
newrule(pr);
|
||||||
rules->RuleState = r_RULE;
|
rules->RuleState = r_RULE;
|
||||||
@@ -302,24 +318,24 @@ void ruleerrmsg(Project *pr)
|
|||||||
// Get label of rule being parsed
|
// Get label of rule being parsed
|
||||||
if (net->Nrules > 0)
|
if (net->Nrules > 0)
|
||||||
{
|
{
|
||||||
strcpy(label, t_RULE);
|
strncpy(label, t_RULE, MAXMSG);
|
||||||
strcat(label, " ");
|
strncat(label, " ", MAXMSG);
|
||||||
strcat(label, net->Rule[net->Nrules].label);
|
strncat(label, net->Rule[net->Nrules].label, MAXMSG);
|
||||||
}
|
}
|
||||||
else strcpy(label, t_RULES_SECT);
|
else strncpy(label, t_RULES_SECT, MAXMSG);
|
||||||
|
|
||||||
// Write rule label and error message to status report
|
// Write rule label and error message to status report
|
||||||
sprintf(pr->Msg, "%s", msg);
|
snprintf(pr->Msg, MAXMSG, "%s", msg);
|
||||||
strcat(pr->Msg, label);
|
strncat(pr->Msg, label, MAXMSG);
|
||||||
strcat(pr->Msg, ":");
|
strncat(pr->Msg, ":", MAXMSG);
|
||||||
writeline(pr, pr->Msg);
|
writeline(pr, pr->Msg);
|
||||||
|
|
||||||
// Write text of rule clause being parsed to status report
|
// Write text of rule clause being parsed to status report
|
||||||
strcpy(msg, Tok[0]);
|
strcpy(msg, Tok[0]);
|
||||||
for (i = 1; i < parser->Ntokens; i++)
|
for (i = 1; i < parser->Ntokens; i++)
|
||||||
{
|
{
|
||||||
strcat(msg, " ");
|
strncat(msg, " ", MAXLINE);
|
||||||
strcat(msg, Tok[i]);
|
strncat(msg, Tok[i], MAXLINE);
|
||||||
}
|
}
|
||||||
writeline(pr, msg);
|
writeline(pr, msg);
|
||||||
}
|
}
|
||||||
|
|||||||
45
win_build/WinSDK/Makefile2.bat
Normal file
45
win_build/WinSDK/Makefile2.bat
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
rem : set the path to CMAKE
|
||||||
|
SET CMAKE_PATH=cmake.exe
|
||||||
|
|
||||||
|
SET Build_PATH=%CD%
|
||||||
|
|
||||||
|
rem : set genarator
|
||||||
|
SET GENERATOR=Visual Studio 15 2017
|
||||||
|
|
||||||
|
rem : the directory where the program will be compiled to
|
||||||
|
SET COMPILE_PATH_WIN64TMP=%Build_PATH%\tmp64\
|
||||||
|
SET COMPILE_PATH_WIN64=%Build_PATH%\64bit\
|
||||||
|
|
||||||
|
rem : the directory where the program will be compiled to
|
||||||
|
SET COMPILE_PATH_WIN32TMP=%Build_PATH%\tmp32\
|
||||||
|
SET COMPILE_PATH_WIN32=%Build_PATH%\32bit\
|
||||||
|
|
||||||
|
rem : CMAKE the root directory of the EPANET project
|
||||||
|
rem : 64 bit
|
||||||
|
MKDIR "%COMPILE_PATH_WIN64TMP%"
|
||||||
|
CD "%COMPILE_PATH_WIN64TMP%"
|
||||||
|
MKDIR "%COMPILE_PATH_WIN64%"
|
||||||
|
%CMAKE_PATH% -G "%GENERATOR% Win64" ../../../
|
||||||
|
rem : %CMAKE_PATH% --build . --config Debug
|
||||||
|
%CMAKE_PATH% --build . --config Release
|
||||||
|
|
||||||
|
XCOPY "%COMPILE_PATH_WIN64TMP%bin\Release\epanet2.dll" "%COMPILE_PATH_WIN64%epanet2.dll*" /y
|
||||||
|
XCOPY "%COMPILE_PATH_WIN64TMP%bin\Release\runepanet.exe" "%COMPILE_PATH_WIN64%epanet2.exe*" /y
|
||||||
|
|
||||||
|
rem : CMAKE the root directory of the EPANET project
|
||||||
|
rem : 32 bit
|
||||||
|
MKDIR "%COMPILE_PATH_WIN32TMP%"
|
||||||
|
CD "%COMPILE_PATH_WIN32TMP%"
|
||||||
|
MKDIR "%COMPILE_PATH_WIN32%"
|
||||||
|
%CMAKE_PATH% -G "%GENERATOR%" ../../../
|
||||||
|
rem : %CMAKE_PATH% --build . --config Debug
|
||||||
|
%CMAKE_PATH% --build . --config Release
|
||||||
|
|
||||||
|
XCOPY "%COMPILE_PATH_WIN32TMP%bin\Release\epanet2.dll" "%COMPILE_PATH_WIN32%epanet2.dll*" /y
|
||||||
|
XCOPY "%COMPILE_PATH_WIN32TMP%bin\Release\runepanet.exe" "%COMPILE_PATH_WIN32%epanet2.exe*" /y
|
||||||
|
|
||||||
|
CD "%Build_PATH%"
|
||||||
|
|
||||||
|
rem : cleaning
|
||||||
|
RMDIR /s /q "%COMPILE_PATH_WIN64TMP%"
|
||||||
|
RMDIR /s /q "%COMPILE_PATH_WIN32TMP%"
|
||||||
Reference in New Issue
Block a user