00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef _SPARSE_VALUE_MODEL_H_
00017 #define _SPARSE_VALUE_MODEL_H_
00018
00019 #include "SparseModel.h"
00020 #include "base/UnitDatabase.h"
00021
00022 #include <cmath>
00023
00030 template <typename PointType>
00031 class SparseValueModel : public SparseModel<PointType>
00032 {
00033 public:
00034 SparseValueModel(size_t sampleRate, size_t resolution,
00035 bool notifyOnAdd = true) :
00036 SparseModel<PointType>(sampleRate, resolution, notifyOnAdd),
00037 m_valueMinimum(0.f),
00038 m_valueMaximum(0.f),
00039 m_haveExtents(false)
00040 { }
00041
00042 SparseValueModel(size_t sampleRate, size_t resolution,
00043 float valueMinimum, float valueMaximum,
00044 bool notifyOnAdd = true) :
00045 SparseModel<PointType>(sampleRate, resolution, notifyOnAdd),
00046 m_valueMinimum(valueMinimum),
00047 m_valueMaximum(valueMaximum),
00048 m_haveExtents(true)
00049 { }
00050
00051 using SparseModel<PointType>::m_points;
00052 using SparseModel<PointType>::modelChanged;
00053 using SparseModel<PointType>::getPoints;
00054 using SparseModel<PointType>::tr;
00055
00056 QString getTypeName() const { return tr("Sparse Value"); }
00057
00058 virtual float getValueMinimum() const { return m_valueMinimum; }
00059 virtual float getValueMaximum() const { return m_valueMaximum; }
00060
00061 virtual QString getScaleUnits() const { return m_units; }
00062 virtual void setScaleUnits(QString units) {
00063 m_units = units;
00064 UnitDatabase::getInstance()->registerUnit(units);
00065 }
00066
00067 virtual void addPoint(const PointType &point)
00068 {
00069 bool allChange = false;
00070
00071 if (!std::isnan(point.value) && !std::isinf(point.value)) {
00072 if (!m_haveExtents || point.value < m_valueMinimum) {
00073 m_valueMinimum = point.value; allChange = true;
00074
00075 }
00076 if (!m_haveExtents || point.value > m_valueMaximum) {
00077 m_valueMaximum = point.value; allChange = true;
00078
00079 }
00080 m_haveExtents = true;
00081 }
00082
00083 SparseModel<PointType>::addPoint(point);
00084 if (allChange) emit modelChanged();
00085 }
00086
00087 virtual void deletePoint(const PointType &point)
00088 {
00089 SparseModel<PointType>::deletePoint(point);
00090
00091 if (point.value == m_valueMinimum ||
00092 point.value == m_valueMaximum) {
00093
00094 float formerMin = m_valueMinimum, formerMax = m_valueMaximum;
00095
00096 for (typename SparseModel<PointType>::PointList::const_iterator i
00097 = m_points.begin();
00098 i != m_points.end(); ++i) {
00099
00100 if (i == m_points.begin() || i->value < m_valueMinimum) {
00101 m_valueMinimum = i->value;
00102
00103 }
00104 if (i == m_points.begin() || i->value > m_valueMaximum) {
00105 m_valueMaximum = i->value;
00106
00107 }
00108 }
00109
00110 if (formerMin != m_valueMinimum || formerMax != m_valueMaximum) {
00111 emit modelChanged();
00112 }
00113 }
00114 }
00115
00116 virtual void toXml(QTextStream &stream,
00117 QString indent = "",
00118 QString extraAttributes = "") const
00119 {
00120 std::cerr << "SparseValueModel::toXml: extraAttributes = \""
00121 << extraAttributes.toStdString() << std::endl;
00122
00123 SparseModel<PointType>::toXml
00124 (stream,
00125 indent,
00126 QString("%1 minimum=\"%2\" maximum=\"%3\" units=\"%4\"")
00127 .arg(extraAttributes).arg(m_valueMinimum).arg(m_valueMaximum)
00128 .arg(this->encodeEntities(m_units)));
00129 }
00130
00131 protected:
00132 float m_valueMinimum;
00133 float m_valueMaximum;
00134 bool m_haveExtents;
00135 QString m_units;
00136 };
00137
00138
00139 #endif
00140