summaryrefslogtreecommitdiff
path: root/src/pmview/metriclist.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/pmview/metriclist.cpp')
-rw-r--r--src/pmview/metriclist.cpp234
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;
+}