diff --git a/Applications/DataExplorer/DataView/DiagramView/CMakeLists.txt b/Applications/DataExplorer/DataView/DiagramView/CMakeLists.txt index b8030c4a2fa2098356e7d362983cf3214b4a7167..558733cebedff970f6126e98be5149782a6e87d5 100644 --- a/Applications/DataExplorer/DataView/DiagramView/CMakeLists.txt +++ b/Applications/DataExplorer/DataView/DiagramView/CMakeLists.txt @@ -10,6 +10,7 @@ set(SOURCES set(HEADERS DiagramList.h + GetDateTime.h QArrow.h QGraphicsGrid.h DiagramScene.h diff --git a/Applications/DataExplorer/DataView/DiagramView/DiagramList.cpp b/Applications/DataExplorer/DataView/DiagramView/DiagramList.cpp index 8b2ef69a036071666254b406fbe11936e2b626f4..0083b08a56a84d28ab2841c4fd4facd864ed41e6 100644 --- a/Applications/DataExplorer/DataView/DiagramView/DiagramList.cpp +++ b/Applications/DataExplorer/DataView/DiagramView/DiagramList.cpp @@ -13,6 +13,7 @@ */ #include "DiagramList.h" +#include "GetDateTime.h" #include <logog/include/logog.hpp> @@ -171,9 +172,6 @@ int DiagramList::readList(const QString &path, std::vector<DiagramList*> &lists) } bool first_loop(true); - int numberOfSecs(0); - double value(0); - QString stringDate(""); QDateTime startDate, currentDate; unsigned line_count (1); @@ -184,7 +182,7 @@ int DiagramList::readList(const QString &path, std::vector<DiagramList*> &lists) fields = line.split('\t'); if (fields.size() >= (nLists + 1)) { - stringDate = fields.takeFirst(); + QString const stringDate = fields.takeFirst(); currentDate = getDateTime(stringDate); if (first_loop) { @@ -194,15 +192,12 @@ int DiagramList::readList(const QString &path, std::vector<DiagramList*> &lists) first_loop = false; } - numberOfSecs = startDate.secsTo(currentDate); - + float const numberOfSecs = static_cast<float>(startDate.secsTo(currentDate)); for (int i = 0; i < nLists; i++) { - value = - strtod(BaseLib::replaceString( - ",", ".", fields.takeFirst().toStdString()) - .c_str(), - nullptr); + float const value = static_cast<float>(strtod( + BaseLib::replaceString(",", ".", fields.takeFirst().toStdString()).c_str(), + nullptr)); lists[i]->addNextPoint(numberOfSecs,value); } } @@ -266,12 +261,12 @@ int DiagramList::readList(const SensorData* data, std::vector<DiagramList*> &lis if (is_date) { l->setXUnit("day"); - QDateTime startDate(getDateTime(QString::fromStdString(BaseLib::int2date(time_steps[0])))); + QDateTime const startDate(getDateTime(BaseLib::int2date(time_steps[0]))); lists[i]->setStartDate(startDate); - int numberOfSecs(0); for (std::size_t j = 0; j < nValues; j++) { - numberOfSecs = startDate.secsTo(getDateTime(QString::fromStdString(BaseLib::int2date(time_steps[j])))); + QDateTime const currentDate(getDateTime(BaseLib::int2date(time_steps[j]))); + float numberOfSecs = static_cast<float>(startDate.secsTo(currentDate)); lists[i]->addNextPoint(numberOfSecs, (*time_series)[j]); } } @@ -279,7 +274,8 @@ int DiagramList::readList(const SensorData* data, std::vector<DiagramList*> &lis { l->setXUnit("time step"); for (std::size_t j = 0; j < nValues; j++) - lists[i]->addNextPoint(time_steps[j], (*time_series)[j]); + lists[i]->addNextPoint(static_cast<float>(time_steps[j]), + (*time_series)[j]); } lists[i]->update(); @@ -288,9 +284,31 @@ int DiagramList::readList(const SensorData* data, std::vector<DiagramList*> &lis return nLists; } -void DiagramList::setList(std::vector< std::pair<QDateTime, float> > coords) +void DiagramList::truncateToRange(QDateTime const& start, QDateTime const& end) +{ + float start_secs = static_cast<float>(_startDate.secsTo(start)); + if (start_secs < 0) + start_secs = 0; + float end_secs = static_cast<float>(_startDate.secsTo(end)); + if (end_secs < start_secs) + end_secs = _coords.back().first; + + if (start_secs == 0 && end_secs == _coords.back().first) + return; + + _coords.erase(std::remove_if(_coords.begin(), _coords.end(), + [&](std::pair<float, float> const& c){return (c.first<start_secs || c.first>end_secs);}), + _coords.end()); + _startDate = start; + for (auto& c : _coords) + c.first -= start_secs; + update(); +} + +void DiagramList::setList(std::vector<std::pair<QDateTime, float>> const& coords) { - int numberOfDays; + if (coords.empty()) + return; this->_startDate = coords[0].first; _coords.emplace_back(0.0f, coords[0].second); @@ -298,16 +316,19 @@ void DiagramList::setList(std::vector< std::pair<QDateTime, float> > coords) std::size_t nCoords = coords.size(); for (std::size_t i = 1; i < nCoords; i++) { - numberOfDays = this->_startDate.daysTo(coords[i].first); - _coords.emplace_back(static_cast<float>(numberOfDays), - coords[i].second); + _coords.emplace_back( + static_cast<float>(_startDate.daysTo(coords[i].first)), + coords[i].second); } update(); } -void DiagramList::setList(std::vector< std::pair<float, float> > coords) +void DiagramList::setList(std::vector< std::pair<float, float> > const& coords) { + if (coords.empty()) + return; + this->_startDate = QDateTime(); std::size_t nCoords = coords.size(); for (std::size_t i = 0; i < nCoords; i++) @@ -332,10 +353,4 @@ void DiagramList::update() _maxY = calcMaxYValue(); } -QDateTime DiagramList::getDateTime(QString stringDate) -{ - if (stringDate.length() <= 10) - return QDateTime::fromString(stringDate, "dd.MM.yyyy"); - return QDateTime::fromString(stringDate, "dd.MM.yyyy.HH.mm.ss"); -} diff --git a/Applications/DataExplorer/DataView/DiagramView/DiagramList.h b/Applications/DataExplorer/DataView/DiagramView/DiagramList.h index f90ff3642daf71f3297ec790dabee6645fc6b7b9..36f45a45fc9be745c8584fafe4c6aae7821fbd3c 100644 --- a/Applications/DataExplorer/DataView/DiagramView/DiagramList.h +++ b/Applications/DataExplorer/DataView/DiagramView/DiagramList.h @@ -107,6 +107,10 @@ public: /// Adds a point at (x,y) to the list void addNextPoint(float x, float y) { _coords.emplace_back(x, y); } + + /// cut list entries not within the given range + void truncateToRange(QDateTime const& start, QDateTime const& end); + /// Sets the start date (i.e. the min-value of the x-axis). void setStartDate(QDateTime date) { _startDate = date; } @@ -120,7 +124,7 @@ public: * Sets the list of x/y-coordinates. * \param coords List of coordinates. */ - void setList(std::vector< std::pair<float, float> > coords); + void setList(std::vector< std::pair<float, float> > const& coords); /** * Sets the list of x/y-coordinates. @@ -128,7 +132,7 @@ public: * days from the first date (which is set as day 0) * \param coords List of coordinates. */ - void setList(std::vector< std::pair<QDateTime, float> > coords); + void setList(std::vector< std::pair<QDateTime, float> > const& coords); /// Specifies the unit of the x Axis. void setXUnit(QString unit) { _xUnit = unit; } @@ -155,8 +159,6 @@ private: /// Returns the maximum y-value of all the data points. float calcMaxYValue(); - static QDateTime getDateTime(QString s); - /** * Reads an ASCII file containing the coordinates in the following format: * date (tab) value diff --git a/Applications/DataExplorer/DataView/DiagramView/DiagramPrefs.ui b/Applications/DataExplorer/DataView/DiagramView/DiagramPrefs.ui index 19ca90608a4368f247d84c664c690bc2bdb182e0..2d83be760f9afa43bcf90b70decec864df20e402 100644 --- a/Applications/DataExplorer/DataView/DiagramView/DiagramPrefs.ui +++ b/Applications/DataExplorer/DataView/DiagramView/DiagramPrefs.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>267</width> - <height>236</height> + <width>317</width> + <height>244</height> </rect> </property> <property name="windowTitle"> @@ -45,7 +45,16 @@ </item> <item> <layout class="QGridLayout" name="DateBoundsLayout"> - <property name="margin"> + <property name="leftMargin"> + <number>10</number> + </property> + <property name="topMargin"> + <number>10</number> + </property> + <property name="rightMargin"> + <number>10</number> + </property> + <property name="bottomMargin"> <number>10</number> </property> <property name="spacing"> diff --git a/Applications/DataExplorer/DataView/DiagramView/DiagramPrefsDialog.cpp b/Applications/DataExplorer/DataView/DiagramView/DiagramPrefsDialog.cpp index 137fc350bc362e77581e9b2eded3fc83f0b0bb55..fa90b934052cad26ade2135afd93dcc814022e46 100644 --- a/Applications/DataExplorer/DataView/DiagramView/DiagramPrefsDialog.cpp +++ b/Applications/DataExplorer/DataView/DiagramView/DiagramPrefsDialog.cpp @@ -12,9 +12,10 @@ * */ +#include "DiagramPrefsDialog.h" #include "DetailWindow.h" #include "DiagramList.h" -#include "DiagramPrefsDialog.h" +#include "GetDateTime.h" #include "OGSError.h" #include "Station.h" @@ -67,47 +68,51 @@ DiagramPrefsDialog::~DiagramPrefsDialog() void DiagramPrefsDialog::accept() { - if ((fromDateLine->text().length() > 0) && (toDateLine->text().length() > 0) && - (!_list.empty())) + QDateTime start_date(getDateTime(fromDateLine->text())); + QDateTime end_date(getDateTime(toDateLine->text())); + + if (start_date == QDateTime() || end_date == QDateTime() || + start_date > end_date || _list.empty()) { - // data has been loaded - if (_list[0]->size() > 0) - { - bool window_is_empty(false); - if (_window == nullptr) - { - _window = new DetailWindow(); - _window->setAttribute(Qt::WA_DeleteOnClose); - window_is_empty = true; - } - - for (std::size_t i = 0; i < _list.size(); i++) - if (this->_visability[i]->isChecked()) - { - _window->addList(_list[i]); - window_is_empty = false; - } - - if (!window_is_empty) - { - _window->show(); - this->done(QDialog::Accepted); - } - else - { - delete _window; - _window = nullptr; - OGSError::box("No dataset selected."); - } - } - else + OGSError::box("No data found..."); + return; + } + + if (_list[0]->size() == 0) + { + OGSError::box("Invalid station data."); + this->done(QDialog::Rejected); + } + + // Data has been loaded. + // If loading lists beyond the first one fails at least nothing terrible will happen. + bool window_is_empty(false); + if (_window == nullptr) + { + _window = new DetailWindow(); + _window->setAttribute(Qt::WA_DeleteOnClose); + window_is_empty = true; + } + + for (std::size_t i = 0; i < _list.size(); i++) + if (_visability[i]->isChecked()) { - OGSError::box("Invalid station data."); - this->done(QDialog::Rejected); + _list[i]->truncateToRange(start_date, end_date); + _window->addList(_list[i]); + window_is_empty = false; } + + if (!window_is_empty) + { + _window->show(); + this->done(QDialog::Accepted); } else - OGSError::box("No data found..."); + { + delete _window; + _window = nullptr; + OGSError::box("No dataset selected."); + } } void DiagramPrefsDialog::reject() @@ -139,10 +144,9 @@ int DiagramPrefsDialog::loadFile(const QString &filename) // item->setYUnit("metres"); item->setColor(QColor(Qt::red)); } - fromDateLine->setText(_list[0]->getStartDate().toString("dd.MM.yyyy")); //QString::number(_list[0]->minXValue())); - QDateTime endDate = - _list[0]->getStartDate().addSecs(static_cast<int>(_list[0]->maxXValue())); - toDateLine->setText(endDate.toString("dd.MM.yyyy")); //QString::number(_list[0]->maxXValue())); + fromDateLine->setText(_list[0]->getStartDate().toString("dd.MM.yyyy")); + QDateTime endDate = _list[0]->getStartDate().addSecs(static_cast<int>(_list[0]->maxXValue())); + toDateLine->setText(endDate.toString("dd.MM.yyyy")); this->createVisibilityCheckboxes(); return 1; } diff --git a/Applications/DataExplorer/DataView/DiagramView/DiagramScene.cpp b/Applications/DataExplorer/DataView/DiagramView/DiagramScene.cpp index 544621fb6d39405b34c603c28a3ac3d840ebad0e..0c02905aabbc7ef2780bb68719042172a8d9a33f 100644 --- a/Applications/DataExplorer/DataView/DiagramView/DiagramScene.cpp +++ b/Applications/DataExplorer/DataView/DiagramView/DiagramScene.cpp @@ -68,7 +68,7 @@ DiagramScene::~DiagramScene() } /// Adds an arrow object to the diagram which might be used as a coordinate axis, etc. -QArrow* DiagramScene::addArrow(float length, float angle, QPen &pen) +QArrow* DiagramScene::addArrow(qreal length, qreal angle, QPen &pen) { auto* arrow = new QArrow(length, angle, 8, 5, pen); addItem(arrow); @@ -130,7 +130,7 @@ QNonScalableGraphicsTextItem* DiagramScene::addNonScalableText(const QString &te } /// Resizes a given axis to "nice" dimensions and calculates an adequate number of ticks to be placed on it -void DiagramScene::adjustAxis(float &min, float &max, int &numberOfTicks) +void DiagramScene::adjustAxis(qreal& min, qreal& max, int& numberOfTicks) { const int MinTicks = 4; double grossStep = (max - min) / MinTicks; @@ -151,8 +151,8 @@ void DiagramScene::adjustScaling() { if ( (_unscaledBounds.width() > 0) && (_unscaledBounds.height() > 0)) { - _scaleX = DEFAULTX / (_unscaledBounds.width()); - _scaleY = DEFAULTY / (_unscaledBounds.height()); + _scaleX = DEFAULTX / static_cast<float>(_unscaledBounds.width()); + _scaleY = DEFAULTY / static_cast<float>(_unscaledBounds.height()); } } @@ -184,10 +184,10 @@ void DiagramScene::constructGrid() { // be very careful with scaling parameters here! int numXTicks, numYTicks; - float xMin = _unscaledBounds.left(); - float yMin = _unscaledBounds.top(); - float xMax = _unscaledBounds.right(); - float yMax = _unscaledBounds.bottom(); + qreal xMin = _unscaledBounds.left(); + qreal yMin = _unscaledBounds.top(); + qreal xMax = _unscaledBounds.right(); + qreal yMax = _unscaledBounds.bottom(); adjustAxis(xMin, xMax, numXTicks); adjustAxis(yMin, yMax, numYTicks); @@ -229,9 +229,9 @@ void DiagramScene::constructGrid() for (int j = 0; j <= numYTicks; ++j) { - float y = _bounds.bottom() / _scaleY - + qreal y = _bounds.bottom() / _scaleY - (j * (_bounds.height() / _scaleY) / numYTicks); - float label = _bounds.top() / _scaleY + + qreal label = _bounds.top() / _scaleY + (j * (_bounds.height() / _scaleY) / numYTicks); _yTicksText.push_back(addNonScalableText(QString::number(label))); _yTicksText.last()->setPos(_bounds.left() - MARGIN / 2, y * _scaleY); @@ -284,7 +284,7 @@ int DiagramScene::getYAxisOffset() /// calculates axes-lengths, offsets, etc. void DiagramScene::initialize() { - QPen pen(Qt::black, 2, Qt::SolidLine, Qt::SquareCap, Qt::RoundJoin); + QPen pen(Qt::black, 1, Qt::SolidLine, Qt::SquareCap, Qt::RoundJoin); pen.setCosmetic(true); setXAxis(addArrow(_bounds.width(), 0, pen)); diff --git a/Applications/DataExplorer/DataView/DiagramView/DiagramScene.h b/Applications/DataExplorer/DataView/DiagramView/DiagramScene.h index 889b0a2d5f9e4493bb8cdbca51b6c828cce713c6..3eef400d7ca8941d1dbe3c676df2d3977a1ba424 100644 --- a/Applications/DataExplorer/DataView/DiagramView/DiagramScene.h +++ b/Applications/DataExplorer/DataView/DiagramView/DiagramScene.h @@ -32,7 +32,7 @@ public: DiagramScene(DiagramList* list, QObject* parent = nullptr); ~DiagramScene() override; - QArrow* addArrow(float length, float angle, QPen &pen); + QArrow* addArrow(qreal length, qreal angle, QPen &pen); void addGraph(DiagramList* list); QGraphicsGrid* addGrid(const QRectF &rect, int xTicks, int yTicks, const QPen &pen); @@ -42,7 +42,7 @@ private: void addCaption(const QString &name, QPen &pen); QNonScalableGraphicsTextItem* addNonScalableText(const QString &text, const QFont &font = QFont()); - void adjustAxis(float &min, float &max, int &numberOfTicks); + void adjustAxis(qreal& min, qreal& max, int& numberOfTicks); void adjustScaling(); void clearGrid(); void constructGrid(); diff --git a/Applications/DataExplorer/DataView/DiagramView/GetDateTime.h b/Applications/DataExplorer/DataView/DiagramView/GetDateTime.h new file mode 100644 index 0000000000000000000000000000000000000000..63e50ea0770eb13abd98d630e976087b79ff7297 --- /dev/null +++ b/Applications/DataExplorer/DataView/DiagramView/GetDateTime.h @@ -0,0 +1,31 @@ +/** + * \file + * \copyright + * Copyright (c) 2012-2018, OpenGeoSys Community (http://www.opengeosys.org) + * Distributed under a Modified BSD License. + * See accompanying file LICENSE.txt or + * http://www.opengeosys.org/project/license + * + */ + +#include <QDateTime> +#include <QString> +#include <string> + +/// Converts string into QDateTime-format +inline QDateTime getDateTime(QString const& stringDate) +{ + if (stringDate.length() == 10) + return QDateTime::fromString(stringDate, "dd.MM.yyyy"); + + if (stringDate.length() == 19) + return QDateTime::fromString(stringDate, "dd.MM.yyyy.HH.mm.ss"); + + return QDateTime(); +} + +/// Converts string into QDateTime-format +inline QDateTime getDateTime(std::string const& stringDate) +{ + return getDateTime(QString::fromStdString(stringDate)); +} diff --git a/Applications/DataExplorer/DataView/DiagramView/QArrow.cpp b/Applications/DataExplorer/DataView/DiagramView/QArrow.cpp index a2fe1ef03213b46d1b89fde3f89cf0332b6faf7e..e54f20f7a0d3347daba65c8ab47aff5a6dac0034 100644 --- a/Applications/DataExplorer/DataView/DiagramView/QArrow.cpp +++ b/Applications/DataExplorer/DataView/DiagramView/QArrow.cpp @@ -25,7 +25,7 @@ * \param pen The pen for drawing the arrow * \param parent The parent QGraphicsItem. */ -QArrow::QArrow(float l, float a, float hl, float hw, QPen &pen, +QArrow::QArrow(qreal l, qreal a, qreal hl, qreal hw, QPen& pen, QGraphicsItem* parent) : QGraphicsItem(parent) { _arrowLength = l; @@ -42,7 +42,8 @@ QArrow::QArrow(float l, float a, float hl, float hw, QPen &pen, * \param pen The pen for drawing the arrow * \param parent The parent QGraphicsItem. */ -QArrow::QArrow(float l, float a, QPen &pen, QGraphicsItem* parent) : QGraphicsItem(parent) +QArrow::QArrow(qreal l, qreal a, QPen& pen, QGraphicsItem* parent) + : QGraphicsItem(parent) { _arrowLength = l; _arrowAngle = a; @@ -116,13 +117,13 @@ void QArrow::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QW } /// Changes orientation of the arrow. -void QArrow::setAngle(double a) +void QArrow::setAngle(qreal a) { _arrowAngle = a; } /// Changes the length of the arrow. -void QArrow::setLength(double l) +void QArrow::setLength(qreal l) { _arrowLength = l; } diff --git a/Applications/DataExplorer/DataView/DiagramView/QArrow.h b/Applications/DataExplorer/DataView/DiagramView/QArrow.h index f87f4c447340bbf50dc1c6cacdb4dfbaceeeeadc..208fd333cd50ffe69baf3b217cea53577cb9e345 100644 --- a/Applications/DataExplorer/DataView/DiagramView/QArrow.h +++ b/Applications/DataExplorer/DataView/DiagramView/QArrow.h @@ -25,9 +25,9 @@ const double PI = 3.14159265; class QArrow : public QGraphicsItem { public: - QArrow(float l, float a, float hl, float hw, QPen& pen, + QArrow(qreal l, qreal a, qreal hl, qreal hw, QPen& pen, QGraphicsItem* parent = nullptr); - QArrow(float l, float a, QPen& pen, QGraphicsItem* parent = nullptr); + QArrow(qreal l, qreal a, QPen& pen, QGraphicsItem* parent = nullptr); ~QArrow() override; double getLength(); @@ -35,16 +35,16 @@ public: void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override; QRectF boundingRect() const override; - void setAngle(double a); - void setLength(double l); + void setAngle(qreal a); + void setLength(qreal l); private: double calcCos(double angle); double calcSin(double angle); - float _arrowLength; - float _arrowAngle; - float _headLength; - float _headWidth; + qreal _arrowLength; + qreal _arrowAngle; + qreal _headLength; + qreal _headWidth; QPen _arrowPen; };