diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2014-10-26 12:33:50 +0400 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2014-10-26 12:33:50 +0400 |
commit | 47e6e7c84f008a53061e661f31ae96629bc694ef (patch) | |
tree | 648a07f3b5b9d67ce19b0fd72e8caa1175c98f1a /src/pmview/metriclist.cpp | |
download | pcp-debian.tar.gz |
Debian 3.9.10debian/3.9.10debian
Diffstat (limited to 'src/pmview/metriclist.cpp')
-rw-r--r-- | src/pmview/metriclist.cpp | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/src/pmview/metriclist.cpp b/src/pmview/metriclist.cpp new file mode 100644 index 0000000..fed2e40 --- /dev/null +++ b/src/pmview/metriclist.cpp @@ -0,0 +1,234 @@ +/* + * Copyright (c) 1997 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2009 Aconex. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ +#include "metriclist.h" +#include "scenegroup.h" +#include "main.h" + +static bool doMetricFlag = true; +static MetricList *currentList; + +MetricList::~MetricList() +{ + int i; + + for (i = 0; i < _metrics.size(); i++) + delete _metrics[i]; + for (i = 0; i < _colors.size(); i++) + delete _colors[i]; +} + +MetricList::MetricList() +: _metrics(), _colors(), _values(0) +{ +} + +void +MetricList::toString(const SbColor &color, QString &str) +{ + char buf[48]; + + const float *values = color.getValue(); + sprintf(buf, "rgbi:%f/%f/%f", values[0], values[1], values[2]); + str = buf; +} + +int +MetricList::add(char const* metric, double scale) +{ + QmcMetric *ptr = new QmcMetric(activeGroup, metric, scale); + + if (ptr->status() >= 0) { + _metrics.append(ptr); + _values += ptr->numValues(); + } + + return ptr->status(); +} + +int +MetricList::add(char const* metric, double scale, int history) +{ + QmcMetric *ptr = new QmcMetric(activeGroup, metric, scale, history); + + if (ptr->status() >= 0) { + _metrics.append(ptr); + _values += ptr->numValues(); + } + + return ptr->status(); +} + +int +MetricList::add(pmMetricSpec *metric, double scale) +{ + QmcMetric *ptr = new QmcMetric(activeGroup, metric, scale); + + if (ptr->status() >= 0) { + _metrics.append(ptr); + _values += ptr->numValues(); + } + + return ptr->status(); +} + +int +MetricList::add(pmMetricSpec *metric, double scale, int history) +{ + QmcMetric *ptr = new QmcMetric(activeGroup, metric, scale, history); + + if (ptr->status() >= 0) { + _metrics.append(ptr); + _values += ptr->numValues(); + } + + return ptr->status(); +} + +void +MetricList::add(SbColor const& color) +{ + SbColor *ptr = new SbColor; + + ptr->setValue(color.getValue()); + _colors.append(ptr); +} + +void +MetricList::add(int packedcol) +{ + float tran = 0.0; + SbColor *ptr = new SbColor; + + ptr->setPackedValue(packedcol, tran); + _colors.append(ptr); +} + +void +MetricList::resolveColors(AlignColor align) +{ + int need = 0; + + switch(align) { + case perMetric: + need = _metrics.size(); + break; + case perValue: + need = _values; + break; + case noColors: + default: + need = 0; + break; + } + + if (_metrics.size() == 0) + return; + + if (_colors.size() == 0 && need > 0) + add(SbColor(0.0, 0.0, 1.0)); + + if (_colors.size() < need) { + int o = 0; + int n = 0; + + while (n < need) { + for (o = 0; o < _colors.size() && n < need; o++, n++) { + SbColor *ptr = new SbColor; + ptr->setValue(((SbColor *)_colors[o])->getValue()); + _colors.append(ptr); + } + } + } +} + +QTextStream& +operator<<(QTextStream &os, MetricList const &list) +{ + int i; + float r, g, b; + + for (i = 0; i < list._metrics.size(); i++) { + os << '[' << i << "]: "; + if (i < list._colors.size()) { + list._colors[i]->getValue(r, g, b); + os << r << ',' << g << ',' << b << ": "; + } + os << *(list._metrics[i]) << endl; + } + return os; +} + +static void +dometric(const char *name) +{ + if (currentList->add(name, 0.0) < 0) + doMetricFlag = false; +} + +int +MetricList::traverse(const char *str) +{ + pmMetricSpec *theMetric; + QString source; + char *msg; + int type = PM_CONTEXT_HOST; + SceneGroup *group = liveGroup; + int sts = 0; + + sts = pmParseMetricSpec((char *)str, 0, (char *)0, &theMetric, &msg); + if (sts < 0) { + pmprintf("%s: Error: Unable to parse metric spec:\n%s\n", + pmProgname, msg); + free(msg); + return sts; + /*NOTREACHED*/ + } + + // If the metric has instances, then it cannot be traversed + if (theMetric->ninst) { + sts = add(theMetric, 0.0); + } + else { + if (theMetric->isarch == 2) { + type = PM_CONTEXT_LOCAL; + } + else if (theMetric->source && strlen(theMetric->source) > 0) { + if (theMetric->isarch == 1) { + type = PM_CONTEXT_ARCHIVE; + group = archiveGroup; + } + } + + currentList = this; + source = theMetric->source; + sts = group->use(type, source); + if (sts >= 0) { + sts = pmTraversePMNS(theMetric->metric, dometric); + if (sts >= 0 && doMetricFlag == false) + sts = -1; + else if (sts < 0) + pmprintf("%s: Error: %s%c%s: %s\n", + pmProgname, + group->context()->source().sourceAscii(), + type == PM_CONTEXT_ARCHIVE ? '/' : ':', + theMetric->metric, + pmErrStr(sts)); + } + } + + free(theMetric); + + return sts; +} |