ModifyingRuleBaseControls

These modifications allow rule based controls to be modified with the
additional functions added in the dll toolkit
This commit is contained in:
AngelaMarchi
2016-09-23 13:07:06 +09:30
parent 8b4a03d349
commit 6f8be1be55
6 changed files with 664 additions and 46 deletions

View File

@@ -815,6 +815,7 @@ int DLLEXPORT ENgetcount(int code, int *count)
case EN_PATCOUNT: *count = Npats; break;
case EN_CURVECOUNT: *count = Ncurves; break;
case EN_CONTROLCOUNT: *count = Ncontrols; break;
case EN_RULECOUNT: *count = Nrules; break;
default: return(251);
}
return(0);
@@ -3163,5 +3164,295 @@ int DLLEXPORT ENgetaveragepatternvalue(int index, EN_API_FLOAT_TYPE *value)
}
int DLLEXPORT ENgetrule(int index, int *nPremises, int *nTrueActions, int *nFalseActions, double *priority)
{
/*----------------------------------------------------------------
** Input: index = index of the rule
** nPremises = number of conditions (IF AND OR)
** nTrueActions = number of actions with true conditions (THEN)
** nFalseActions = number of actions with false conditions (ELSE)
** priority = rule priority
** Output: none
** Returns: error code
**----------------------------------------------------------------
*/
int count;
struct Premise *p;
struct Action *c;
if (index > Nrules) return(257);
*priority = Rule[index].priority;
count = 1;
p = Rule[index].Pchain;
while (p->next != NULL)
{
count++;
p=p->next;
}
*nPremises = count;
count = 1;
c=Rule[index].Tchain;
while (c->next != NULL)
{
count++;
c = c->next;
}
*nTrueActions = count;
c = Rule[index].Fchain;
count = 0;
if (c != NULL)
{
count = 1;
while (c->next != NULL)
{
count ++;
c = c->next;
}
}
*nFalseActions = count;
return(0);
}
int DLLEXPORT ENgetpremise(int indexRule, int idxPremise, int *logop, int *object, int *indexObj, int *variable, int *relop, int *status, double *value)
{
int count = 1, error = 0, nPremises, a, b;
double priority;
struct Premise *p;
if (indexRule > Nrules) return(257);
error = ENgetrule(indexRule, &nPremises, &a, &b, &priority);
if (idxPremise > nPremises) return(258);
p = Rule[indexRule].Pchain;
while (count < idxPremise)
{
count++;
p = p->next;
}
*logop = p->logop;
*object = p->object;
*indexObj = p->index;
*variable = p->variable;
*relop = p->relop;
*status = p->status;
*value = p[0].value;
return(0);
}
int DLLEXPORT ENsetrulepriority(int index, double priority)
{
/*----------------------------------------------------------------
** Input: index = index of the rule
** priority = rule priority
** Output: none
** Returns: error code
**----------------------------------------------------------------
*/
if (index > Nrules) return(257);
Rule[index].priority = priority;
return(0);
}
int DLLEXPORT ENsetpremise(int indexRule, int indexPremise, int logop, int object, int indexObj, int variable, int relop, int status, double value)
{
int count = 1,error = 0, nPremises, a, b;
double priority;
struct Premise *p;
if (indexRule > Nrules) return(257);
error = ENgetrule(indexRule, &nPremises, &a, &b, &priority);
if (indexPremise > nPremises) return(258);
p = Rule[indexRule].Pchain;
while (count < indexPremise)
{
count++;
p = p->next;
}
p->logop = logop;
p->object = object;
p->index = indexObj;
p->variable = variable;
p->relop = relop;
p->status = status;
p->value = value;
return(0);
}
int DLLEXPORT ENsetpremiseindex(int indexRule, int indexPremise, int indexObj)
{
int count = 1,error = 0, nPremises, a, b;
double priority;
struct Premise *p;
if (indexRule > Nrules) return(257);
error = ENgetrule(indexRule, &nPremises, &a, &b, &priority);
if (indexPremise > nPremises) return(258);
p = Rule[indexRule].Pchain;
while (count < indexPremise)
{
count++;
p = p->next;
}
p->index = indexObj;
return(0);
}
int DLLEXPORT ENsetpremisestatus(int indexRule, int indexPremise, int status)
{
int count = 1, error = 0, nPremises, a, b;
double priority;
struct Premise *p;
if (indexRule > Nrules) return(257);
error = ENgetrule(indexRule, &nPremises, &a, &b, &priority);
if (indexPremise > nPremises) return(258);
p = Rule[indexRule].Pchain;
while (count < indexPremise)
{
count++;
p = p->next;
}
p->status = status;
return(0);
}
int DLLEXPORT ENsetpremisevalue(int indexRule, int indexPremise, double value)
{
int count = 1,error = 0, nPremises, a, b;
double priority;
struct Premise *p;
if (indexRule > Nrules) return(257);
error = ENgetrule(indexRule, &nPremises, &a, &b, &priority);
if (indexPremise > nPremises) return(258);
p = Rule[indexRule].Pchain;
while (count < indexPremise)
{
count++;
p = p->next;
}
p->value = value;
return(0);
}
int DLLEXPORT ENgettrueaction(int indexRule, int indexAction, int *indexLink, int *status, double *setting)
{
int count = 1, error = 0, nTrueAction, c, b;
double priority;
struct Action *a;
if (indexRule > Nrules) return(252);
error = ENgetrule(indexRule, &c, &nTrueAction, &b, &priority);
if (indexAction > nTrueAction) return(253);
a = Rule[indexRule].Tchain;
while (count<indexAction)
{
count++;
a = a->next;
}
*indexLink = a->link;
*status = a->status;
*setting = a->setting;
return(0);
}
int DLLEXPORT ENsettrueaction(int indexRule, int indexAction, int indexLink, int status,double setting)
{
int count = 1, error = 0, nTrueAction, c, b;
double priority;
struct Action *a;
if (indexRule > Nrules) return(257);
error = ENgetrule(indexRule, &c, &nTrueAction, &b, &priority);
if (indexAction > nTrueAction) return(258);
a = Rule[indexRule].Tchain;
while (count<indexAction)
{
count++;
a = a->next;
}
a->link = indexLink;
a->status = status;
a->setting = setting;
return(0);
}
int DLLEXPORT ENgetfalseaction(int indexRule, int indexAction, int *indexLink, int *status, double *setting)
{
int count = 1, error = 0, nFalseAction, c, b;
double priority;
struct Action *a;
if (indexRule > Nrules) return(257);
error = ENgetrule(indexRule, &c, &b, &nFalseAction, &priority);
if (indexAction > nFalseAction) return(258);
a = Rule[indexRule].Fchain;
while (count < indexAction)
{
count++;
a = a->next;
}
*indexLink = a->link;
*status = a->status;
*setting = a->setting;
return(0);
}
int DLLEXPORT ENsetfalseaction(int indexRule, int indexAction, int indexLink, int status,double setting)
{
int count = 1, error = 0, nFalseAction, c, b;
double priority;
struct Action *a;
if (indexRule > Nrules) return(257);
error = ENgetrule(indexRule, &c, &b, &nFalseAction, &priority);
if (indexAction > nFalseAction) return(258);
a = Rule[indexRule].Fchain;
while (count < indexAction)
{
count++;
a = a->next;
}
a->link = indexLink;
a->status = status;
a->setting = setting;
return(0);
}
int DLLEXPORT ENgetruleID(int indexRule, char* id)
{
strcpy(id,"");
if (!Openflag) return(102);
if (indexRule < 1 || indexRule > Nrules) return(257);
strcpy(id,Rule[indexRule].label);
return(0);
}
/*************************** END OF EPANET.C ***************************/