|
|
|
|
@@ -8,6 +8,8 @@ using namespace CDUtils;
|
|
|
|
|
|
|
|
|
|
//int cdtype_debug_cnt = 1;
|
|
|
|
|
|
|
|
|
|
const int cd_x_history_max_size = 4000;
|
|
|
|
|
|
|
|
|
|
CDType::CDType() {
|
|
|
|
|
index_ = -1;
|
|
|
|
|
value_d = 0.;
|
|
|
|
|
@@ -49,9 +51,28 @@ CDType::CDType(int i, const PIString & n, const PIString & t, const PIString & v
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CDType &CDType::operator =(double x) {
|
|
|
|
|
value_d = x;
|
|
|
|
|
if (mode_ == X_All_Avg) {
|
|
|
|
|
avg_h << x;
|
|
|
|
|
double val = 0;
|
|
|
|
|
if (avg_h.size_s() >= avg_size) {
|
|
|
|
|
for (int i=0; i<avg_h.size_s(); i++) {
|
|
|
|
|
val += avg_h[i];
|
|
|
|
|
}
|
|
|
|
|
val /= avg_h.size();
|
|
|
|
|
avg_h.pop_front();
|
|
|
|
|
}
|
|
|
|
|
if (history.size() < cd_x_history_max_size)
|
|
|
|
|
history << val;
|
|
|
|
|
}
|
|
|
|
|
return *this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PIString CDType::type() const {
|
|
|
|
|
if (type_.trimmed().isEmpty()) return "f";
|
|
|
|
|
// piCout << "type =" << type_.trimmed() << ";" << type_ << "#";
|
|
|
|
|
// piCout << "type =" << type_.trimmed() << ";" << type_ << "#";
|
|
|
|
|
return type_;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -206,7 +227,7 @@ PIVariantTypes::Enum CDType::parseEnumComment(PIString c) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int CDSection::count(bool recursive) const {
|
|
|
|
|
int ret = k.size_s();
|
|
|
|
|
int ret = cd.size_s();
|
|
|
|
|
if (recursive) {
|
|
|
|
|
PIMap<int, CDSection>::const_iterator i;
|
|
|
|
|
for (i = s.begin(); i != s.end(); ++i)
|
|
|
|
|
@@ -224,7 +245,7 @@ int CDSection::sectionsCount() const {
|
|
|
|
|
PIStringList CDSection::index_names() const {
|
|
|
|
|
PIStringList ret;
|
|
|
|
|
PIMap<int, CDType>::const_iterator i;
|
|
|
|
|
for (i = k.begin(); i != k.end(); ++i)
|
|
|
|
|
for (i = cd.begin(); i != cd.end(); ++i)
|
|
|
|
|
ret << i->second.name();
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
@@ -275,13 +296,13 @@ CDType & CDSection::getByName(const PIString & name_) {
|
|
|
|
|
int dv = 0;
|
|
|
|
|
if (isd) dv = np.back().toInt();
|
|
|
|
|
//piCout << np.back() << isd << dv;
|
|
|
|
|
for (it = cs->k.begin(); it != cs->k.end(); ++it) {
|
|
|
|
|
for (it = cs->cd.begin(); it != cs->cd.end(); ++it) {
|
|
|
|
|
bool f = false;
|
|
|
|
|
if (isd) f = (dv == it.key());
|
|
|
|
|
else f = (np.back() == it.value().name());
|
|
|
|
|
//piCout << "k..." << it.key() << it.value().name() << f;
|
|
|
|
|
if (f)
|
|
|
|
|
return cs->k[it.key()];
|
|
|
|
|
return cs->cd[it.key()];
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
@@ -297,13 +318,15 @@ CDType & CDSection::getByPath(const PIDeque<int> & path_) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void CDSection::write(PIIODevice * d, const PIString & prefix) {
|
|
|
|
|
void CDSection::write(PIIODevice * d, CDType::cdT cdt, const PIString & prefix) {
|
|
|
|
|
if (!d) return;
|
|
|
|
|
if (k.isEmpty() && s.isEmpty()) return;
|
|
|
|
|
if (cd.isEmpty() && s.isEmpty()) return;
|
|
|
|
|
// piCout << "[CDSection] write start";
|
|
|
|
|
PIString l;
|
|
|
|
|
if (prefix.isEmpty()) l = "[k]";
|
|
|
|
|
else l = "[" + prefix + ".k]";
|
|
|
|
|
PIStringList cdtl;
|
|
|
|
|
cdtl << "null" << "k" << "x" << "c";
|
|
|
|
|
if (prefix.isEmpty()) l = "[" + cdtl[cdt] + "]";
|
|
|
|
|
else l = "[" + prefix + "." + cdtl[cdt] + "]";
|
|
|
|
|
l += "\n";
|
|
|
|
|
d->write(l.toUTF8());
|
|
|
|
|
l = "name = " + name + " \n";
|
|
|
|
|
@@ -311,20 +334,38 @@ void CDSection::write(PIIODevice * d, const PIString & prefix) {
|
|
|
|
|
l = "alias = " + alias + " \n";
|
|
|
|
|
d->write(l.toUTF8());
|
|
|
|
|
PIMap<int, CDType>::iterator i;
|
|
|
|
|
for (i = k.begin(); i != k.end(); ++i) {
|
|
|
|
|
for (i = cd.begin(); i != cd.end(); ++i) {
|
|
|
|
|
CDType & ck(i.value());
|
|
|
|
|
l.clear(); l << ck.index() << ".f = " << ck.formula() << " #s " << ck.comment() << " \n";
|
|
|
|
|
d->write(l.toUTF8());
|
|
|
|
|
l.clear(); l << ck.index() << ".v = " << ck.value() << " #" << ck.type() << " " << ck.name() << " \n";
|
|
|
|
|
d->write(l.toUTF8());
|
|
|
|
|
if (!ck.enumValues().enum_list.isEmpty()) {
|
|
|
|
|
l.clear(); l << ck.index() << ".ev = {";
|
|
|
|
|
//PIVector<CDType::Enumerator> el = ck.enumValues();
|
|
|
|
|
piForeachC (PIVariantTypes::Enumerator & e, ck.enumValues().enum_list)
|
|
|
|
|
l << e.value << " - " << e.name << ", ";
|
|
|
|
|
l.cutRight(2);
|
|
|
|
|
l << "} \n";
|
|
|
|
|
if (ck.cd_type() != cdt) continue;
|
|
|
|
|
switch (cdt) {
|
|
|
|
|
case CDType::cdNull: break;
|
|
|
|
|
case CDType::cdK:
|
|
|
|
|
l.clear(); l << ck.index() << ".f = " << ck.formula() << " #s " << ck.comment() << " \n";
|
|
|
|
|
d->write(l.toUTF8());
|
|
|
|
|
l.clear(); l << ck.index() << ".v = " << ck.value() << " #" << ck.type() << " " << ck.name() << " \n";
|
|
|
|
|
d->write(l.toUTF8());
|
|
|
|
|
if (!ck.enumValues().enum_list.isEmpty()) {
|
|
|
|
|
l.clear(); l << ck.index() << ".ev = {";
|
|
|
|
|
//PIVector<CDType::Enumerator> el = ck.enumValues();
|
|
|
|
|
piForeachC (PIVariantTypes::Enumerator & e, ck.enumValues().enum_list)
|
|
|
|
|
l << e.value << " - " << e.name << ", ";
|
|
|
|
|
l.cutRight(2);
|
|
|
|
|
l << "} \n";
|
|
|
|
|
d->write(l.toUTF8());
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case CDType::cdX:
|
|
|
|
|
l.clear(); l << ck.index() << ".name = " << ck.name() << " #s " << ck.comment() << " \n";
|
|
|
|
|
d->write(l.toUTF8());
|
|
|
|
|
l.clear(); l << ck.index() << ".mode = " << ck.xmode() << " #e (0 - cur, 1 - all_avg) " << "\n";
|
|
|
|
|
d->write(l.toUTF8());
|
|
|
|
|
l.clear(); l << ck.index() << ".avg = " << ck.avg() << " #n " << "\n";
|
|
|
|
|
d->write(l.toUTF8());
|
|
|
|
|
break;
|
|
|
|
|
case CDType::cdC:
|
|
|
|
|
l.clear(); l << ck.index() << ".name = " << ck.name() << " #s " << ck.comment() << " \n";
|
|
|
|
|
d->write(l.toUTF8());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!s.isEmpty()) {
|
|
|
|
|
@@ -332,7 +373,7 @@ void CDSection::write(PIIODevice * d, const PIString & prefix) {
|
|
|
|
|
else l = prefix + ".s";
|
|
|
|
|
PIMap<int, CDSection>::iterator j;
|
|
|
|
|
for (j = s.begin(); j != s.end(); ++j) {
|
|
|
|
|
j.value().write(d, l + "." + PIString::fromNumber(j.key()));
|
|
|
|
|
j.value().write(d, cdt, l + "." + PIString::fromNumber(j.key()));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (prefix.isEmpty()) {
|
|
|
|
|
@@ -343,34 +384,51 @@ void CDSection::write(PIIODevice * d, const PIString & prefix) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void CDSection::read(const void * ep) {
|
|
|
|
|
void CDSection::read(const void * ep, CDType::cdT cdt) {
|
|
|
|
|
// piCout << "[CDSection] read start";
|
|
|
|
|
k.clear();
|
|
|
|
|
PIStringList cdtl;
|
|
|
|
|
cdtl << "null" << "k" << "x" << "c";
|
|
|
|
|
cd.clear();
|
|
|
|
|
s.clear();
|
|
|
|
|
PIConfig::Entry & e(*(PIConfig::Entry*)ep);
|
|
|
|
|
name = e.getValue("k.name").value();
|
|
|
|
|
alias = e.getValue("k.alias").value();
|
|
|
|
|
PIConfig::Entry & kl = e.getValue("k");
|
|
|
|
|
name = e.getValue(cdtl[cdt] + ".name").value();
|
|
|
|
|
alias = e.getValue(cdtl[cdt] + ".alias").value();
|
|
|
|
|
PIConfig::Entry & kl = e.getValue(cdtl[cdt]);
|
|
|
|
|
for (int i = 0; i < kl.childCount(); ++i) {
|
|
|
|
|
const PIConfig::Entry * ke(kl.child(i));
|
|
|
|
|
const PIConfig::Entry * e(kl.child(i));
|
|
|
|
|
bool ok = false;
|
|
|
|
|
int kid = ke->name().toInt(-1, &ok);
|
|
|
|
|
int id = e->name().toInt(-1, &ok);
|
|
|
|
|
// piCout << "[read]" << ke->name() << ke->value() << ok;
|
|
|
|
|
// PIString n = ke->getValue("v").comment();
|
|
|
|
|
// PIString t = n.takeLeft(1);
|
|
|
|
|
if (ok) {
|
|
|
|
|
CDType ck = CDType(kid, ke->getValue("v").comment(), ke->getValue("v").type(), ke->getValue("v").value(), ke->getValue("f").value(), ke->getValue("f").comment(), CDType::cdK);
|
|
|
|
|
PIString ev = ke->getValue("ev", "");
|
|
|
|
|
if (!ev.isEmpty())
|
|
|
|
|
ck.enum_values = ck.parseEnumComment(ev);
|
|
|
|
|
k[kid] = ck;
|
|
|
|
|
CDType c;
|
|
|
|
|
PIString ev;
|
|
|
|
|
switch (cdt) {
|
|
|
|
|
case CDType::cdNull: break;
|
|
|
|
|
case CDType::cdK:
|
|
|
|
|
c = CDType(id, e->getValue("v").comment(), e->getValue("v").type(), e->getValue("v").value(), e->getValue("f").value(), e->getValue("f").comment(), cdt);
|
|
|
|
|
ev = e->getValue("ev", "");
|
|
|
|
|
if (!ev.isEmpty())
|
|
|
|
|
c.enum_values = c.parseEnumComment(ev);
|
|
|
|
|
break;
|
|
|
|
|
case CDType::cdX:
|
|
|
|
|
c = CDType(id, e->getValue("name").value(), PIString(), PIString(), PIString() , e->getValue("name").comment(), cdt);
|
|
|
|
|
c.setXMode((CDType::XMode)e->getValue("mode").value().toInt());
|
|
|
|
|
c.setAvg((CDType::XMode)e->getValue("avg").value().toInt());
|
|
|
|
|
break;
|
|
|
|
|
case CDType::cdC:
|
|
|
|
|
c = CDType(id, e->getValue("name").value(), PIString(), PIString(), PIString() , e->getValue("name").comment(), cdt);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
cd[id] = c;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
PIConfig::Entry & sl = e.getValue("s");
|
|
|
|
|
for (int i = 0; i < sl.childCount(); ++i) {
|
|
|
|
|
const PIConfig::Entry * se(sl.child(i));
|
|
|
|
|
int sid = se->name().toInt();
|
|
|
|
|
s[sid].read(se);
|
|
|
|
|
s[sid].read(se, cdt);
|
|
|
|
|
}
|
|
|
|
|
// piCout << "[CDSection] read end";
|
|
|
|
|
}
|
|
|
|
|
@@ -388,26 +446,26 @@ void CDSection::update(CDSection & v, UpdateModeFlags mode) {
|
|
|
|
|
PIMap<PIString, PIString> prev_k_f_bn;
|
|
|
|
|
PIMap<int, CDType>::iterator i;
|
|
|
|
|
if (mode[SaveByIndex]) {
|
|
|
|
|
for (i = k.begin(); i != k.end(); ++i)
|
|
|
|
|
for (i = cd.begin(); i != cd.end(); ++i)
|
|
|
|
|
prev_k_f_bi[i.key()] = i.value().formula();
|
|
|
|
|
}
|
|
|
|
|
if (mode[SaveByName]) {
|
|
|
|
|
for (i = k.begin(); i != k.end(); ++i)
|
|
|
|
|
for (i = cd.begin(); i != cd.end(); ++i)
|
|
|
|
|
prev_k_f_bn[i.value().name_] = i.value().formula();
|
|
|
|
|
}
|
|
|
|
|
if (!mode[Merge])
|
|
|
|
|
k.clear();
|
|
|
|
|
for (i = v.k.begin(); i != v.k.end(); ++i) {
|
|
|
|
|
cd.clear();
|
|
|
|
|
for (i = v.cd.begin(); i != v.cd.end(); ++i) {
|
|
|
|
|
int id = i.key();
|
|
|
|
|
PIString n = i.value().name();
|
|
|
|
|
k[id] = i.value();
|
|
|
|
|
cd[id] = i.value();
|
|
|
|
|
if (mode[SaveByIndex]) {
|
|
|
|
|
if (prev_k_f_bi.contains(id))
|
|
|
|
|
k[id].setFormula(prev_k_f_bi[id]);
|
|
|
|
|
cd[id].setFormula(prev_k_f_bi[id]);
|
|
|
|
|
}
|
|
|
|
|
if (mode[SaveByName]) {
|
|
|
|
|
if (prev_k_f_bn.contains(n))
|
|
|
|
|
k[id].setFormula(prev_k_f_bn[n]);
|
|
|
|
|
cd[id].setFormula(prev_k_f_bn[n]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -479,12 +537,12 @@ void CDSection::update(CDSection & v, UpdateModeFlags mode) {
|
|
|
|
|
bool CDSection::isSameStructure(CDSection & v) {
|
|
|
|
|
PIMap<PIString, int> k_ids;
|
|
|
|
|
PIMap<int, CDType>::iterator i;
|
|
|
|
|
for (i = k.begin(); i != k.end(); ++i)
|
|
|
|
|
for (i = cd.begin(); i != cd.end(); ++i)
|
|
|
|
|
k_ids[i.value().name()] = i.key();
|
|
|
|
|
for (i = v.k.begin(); i != v.k.end(); ++i) {
|
|
|
|
|
for (i = v.cd.begin(); i != v.cd.end(); ++i) {
|
|
|
|
|
if (!k_ids.contains(i.value().name())) continue;
|
|
|
|
|
//piCout << i.key() << k[i.key()].name() << i.value().name();
|
|
|
|
|
if (k[k_ids[i.value().name()]].index() != i.key())
|
|
|
|
|
if (cd[k_ids[i.value().name()]].index() != i.key())
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
PIMap<int, CDSection>::iterator j;
|
|
|
|
|
@@ -499,7 +557,7 @@ bool CDSection::isSameStructure(CDSection & v) {
|
|
|
|
|
|
|
|
|
|
void CDSection::prepareCalculate() {
|
|
|
|
|
PIMap<int, CDType>::iterator i;
|
|
|
|
|
for (i = k.begin(); i != k.end(); ++i) {
|
|
|
|
|
for (i = cd.begin(); i != cd.end(); ++i) {
|
|
|
|
|
i.value().parent = this;
|
|
|
|
|
i.value().calculated = false;
|
|
|
|
|
}
|
|
|
|
|
@@ -511,7 +569,7 @@ void CDSection::prepareCalculate() {
|
|
|
|
|
|
|
|
|
|
void CDSection::calculateRecursive(PIEvaluator * e) {
|
|
|
|
|
PIMap<int, CDType>::iterator i;
|
|
|
|
|
for (i = k.begin(); i != k.end(); ++i)
|
|
|
|
|
for (i = cd.begin(); i != cd.end(); ++i)
|
|
|
|
|
i.value().calculate(e);
|
|
|
|
|
PIMap<int, CDSection>::iterator j;
|
|
|
|
|
for (j = s.begin(); j != s.end(); ++j)
|
|
|
|
|
@@ -522,7 +580,7 @@ void CDSection::calculateRecursive(PIEvaluator * e) {
|
|
|
|
|
void CDSection::makePath(PIDeque<int> p) {
|
|
|
|
|
PIDeque<int> tp;
|
|
|
|
|
PIMap<int, CDType>::iterator i;
|
|
|
|
|
for (i = k.begin(); i != k.end(); ++i) {
|
|
|
|
|
for (i = cd.begin(); i != cd.end(); ++i) {
|
|
|
|
|
tp = p;
|
|
|
|
|
tp << i.key();
|
|
|
|
|
i.value().path_ = tp;
|
|
|
|
|
@@ -540,7 +598,7 @@ void CDSection::makePath(PIDeque<int> p) {
|
|
|
|
|
PIVector<CDType * > CDSection::children(bool recursive) const {
|
|
|
|
|
PIVector<CDType * > ret;
|
|
|
|
|
PIMap<int, CDType>::const_iterator i;
|
|
|
|
|
for (i = k.begin(); i != k.end(); ++i)
|
|
|
|
|
for (i = cd.begin(); i != cd.end(); ++i)
|
|
|
|
|
ret << const_cast<CDType * >(&(i.value()));
|
|
|
|
|
if (!recursive) return ret;
|
|
|
|
|
PIMap<int, CDSection>::const_iterator j;
|
|
|
|
|
@@ -553,14 +611,9 @@ PIVector<CDType * > CDSection::children(bool recursive) const {
|
|
|
|
|
PIVariantTypes::Enum CDSection::enumValues() const {
|
|
|
|
|
PIVariantTypes::Enum ret;
|
|
|
|
|
PIMap<int, CDType>::const_iterator i;
|
|
|
|
|
for (i = k.begin(); i != k.end(); ++i)
|
|
|
|
|
for (i = cd.begin(); i != cd.end(); ++i)
|
|
|
|
|
ret << PIVariantTypes::Enumerator(i.key(), i.value().name());
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
XType::XType(const CDType & cdt) {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|