/* $Id:$
*/
#include "cybernet.h"
/** {duh} **/
Junction::Junction() : Entity()
{
}
/** {duh} **/
Junction::~Junction()
{
}
/** {secret} **/
static int getJctKey(struct resbuf *rb, int *key)
{
while (rb)
{
if (rb->restype == 1000 &&!strcmp(rb->resval.rstring, "NODE_#"))
{
rb = rb->rbnext;
*key = atoi(rb->resval.rstring + 1);
return 0;
}
rb = rb->rbnext;
}
return -1;
}
Selection * Junction::jcts = NULL;
/**
** Iz Acad baze pobere vse vozle in jih popreje registriramo z Register()
** Naredi hiter AVL seznam za uporabo v Find()
**/
void Junction::Collect()
{
struct resbuf x_jct = {NULL, 2};
x_jct.resval.rstring = "X_JCT";
struct resbuf xFilter = {&x_jct, 0};
xFilter.resval.rstring = "INSERT";
if (jcts)
delete (jcts);
jcts = new Selection();
if (jcts != NULL)
jcts->Select(&xFilter, getJctKey, apps);
}
/**
** Zbrise seznam vseh vozlov
**/
void Junction::Throw()
{
delete (jcts);
jcts = NULL;
}
void Junction::ForAll(void (*func) (ads_name name))
{
jcts->ForAll(func);
}
/**
** Poisce vozel v bazi z imenom /jctName/, ki je normalno Cybernet
** ime (J234). Ce ga najde vrne 0. Izbor iz baze je cashiran v izboru,
** zato lahko se veckratno iskanje po seznamu vozlov izvaja hitreje.
** Ob napaki vrne -1; Ce ni nasel vrne 1; Ce je OK vrne 0;
**/
Junction::Find(const char *jctName)
{
ads_name ent;
if (!jcts)
Collect();
if(jcts->Find(atoi(jctName + 1), ent) != AVL_OK)
return -1;
Get(ent);
return 0;
}
Junction::Get(ads_name name)
{
Entity::Get(name);
return getData();
}
/**
** Nastavi spremenljivke, ki so specificne za Junction.
**/
int Junction::getData(void)
{
Entity::Get();
if (!isA("X_JCT", rb))
return RTERROR;
/* Kar predpostavimo, da je vse to ze notri */
Num = getXdata(rb, "NODE_#")->rstring;
Zone = getXdata(rb, "ZONE")->rlong;
Elev = getXdata(rb, "ELEV")->rreal;
Elev = getXdata(rb, "ELEV")->rreal;
U_elev = getXdata(rb, "U_ELEV")->rreal;
Dmdad = getXdata(rb, "DMDAD")->rreal;
Dmdmd = getXdata(rb, "DMDMD")->rreal;
Dmdph = getXdata(rb, "DMDPH")->rreal;
Dmd1 = getXdata(rb, "DMD1")->rreal;
Dmd2 = getXdata(rb, "DMD2")->rreal;
Dmdf = getXdata(rb, "DMDF")->rstring;
Desc = getXdata(rb, "DESC")->rstring;
Text = getXdata(rb, "TEXT")->rstring;
/* Za Hyperwaft pa tega ne moremo reci */
union ads_u_val *p;
if ((p = getXdata(rb, "TZ")) != NULL)
tempZone = p->rlong;
else
tempZone = 0;
if ((p = getXdata(rb, "UCODE")) != NULL)
unitCode = p->rstring;
else
unitCode = "";
return RTNORM;
}
/**
** Nastavi spremenljivke, ki so specificne za Pipe.
**/
int Pipe::getData(void)
{
Get();
if (!isA("X_PIPE", rb))
{
return RTERROR;
}
/* Kar predpostavimo, da je vse to ze notri */
num = getXdata(rb, "PIPE_#")->rlong;
jct1 = getXdata(rb, "NODE1_#")->rstring;
jct2 = getXdata(rb, "NODE2_#")->rstring;
Diam = getXdata(rb, "DIAM")->rreal;
Len = getXdata(rb, "LEN")->rreal;
Lenud = getXdata(rb, "LENUD")->rreal;
CoefR = getXdata(rb, "COEFR")->rreal;
CoefML = getXdata(rb, "COEFML")->rreal;
CoefMLUD= getXdata(rb, "COEFMLUD")->rreal;
Dsc = getXdata(rb, "DESC")->rstring;
Text_1 = getXdata(rb, "TEXT")->rstring;
O_c = getXdata(rb, "O_C")->rstring;
/* Za Hyperwaft pa tega ne moremo reci */
union ads_u_val *p;
if ((p = getXdata(rb, "TZ")) != NULL)
tempZone = p->rlong;
else
tempZone = 0;
if ((p = getXdata(rb, "UCODE")) != NULL)
unitCode = p->rstring;
else
unitCode = "";
return RTNORM;
}
/**
** Omogoca izbor cevi
**/
int Pipe::Pick()
{
int status = Entity::Pick("Izberi cev:");
if (status != RTNORM)
return status;
return getData();
}
/**
** Zapolni podatke o cevi in vrne RTNORM ce je vse OK
**/
Pipe::GetPipe(ads_name name)
{
Get(name);
int status = getData();
return status;
}
syntax highlighted by Code2HTML, v. 0.9.1