diff options
author | Tomi Korpipää <tomi.korpipaa@digia.com> | 2013-04-05 13:11:05 +0300 |
---|---|---|
committer | Mika Salmela <mika.salmela@digia.com> | 2013-04-05 20:26:20 +0300 |
commit | a6bc36e7ccdee05b2e3bca17ae8632854eba0483 (patch) | |
tree | 1794206c0578f1fb9896adeca4bbc464b988e96e | |
parent | 8f4ea5395e70408a27bdd9514b4d7ab3cf10b1f4 (diff) |
Added data set classes for easier data insertion
Note: Not taken fully into use yet.
Moved rainfall chart into it's own example.
Added usage of data set classes to barchart
Fixed a crash in case a row contains less data than sample space assumes
Change-Id: I73f12de0214fe594d9054028da88b7280213fdd6
Reviewed-by: Mika Salmela <mika.salmela@digia.com>
-rw-r--r-- | examples/datavis3d/barchart/barchart.pro | 4 | ||||
-rw-r--r-- | examples/datavis3d/barchart/main.cpp | 303 | ||||
-rw-r--r-- | examples/datavis3d/datavis3d.pro | 1 | ||||
-rw-r--r-- | examples/datavis3d/rainfall/main.cpp | 327 | ||||
-rw-r--r-- | examples/datavis3d/rainfall/rainfall.pro | 5 | ||||
-rw-r--r-- | src/datavis3d/engine/engine.pri | 10 | ||||
-rw-r--r-- | src/datavis3d/engine/q3dbars.cpp | 36 | ||||
-rw-r--r-- | src/datavis3d/engine/q3dbars.h | 14 | ||||
-rw-r--r-- | src/datavis3d/engine/q3dbars_p.h | 2 | ||||
-rw-r--r-- | src/datavis3d/engine/q3dwindow.cpp | 1 | ||||
-rw-r--r-- | src/datavis3d/engine/qdataitem.cpp | 5 | ||||
-rw-r--r-- | src/datavis3d/engine/qdataitem.h | 3 | ||||
-rw-r--r-- | src/datavis3d/engine/qdataitem_p.h | 2 | ||||
-rw-r--r-- | src/datavis3d/engine/qdatarow.cpp | 122 | ||||
-rw-r--r-- | src/datavis3d/engine/qdatarow.h | 72 | ||||
-rw-r--r-- | src/datavis3d/engine/qdatarow_p.h | 73 | ||||
-rw-r--r-- | src/datavis3d/engine/qdataset.cpp | 156 | ||||
-rw-r--r-- | src/datavis3d/engine/qdataset.h | 78 | ||||
-rw-r--r-- | src/datavis3d/engine/qdataset_p.h | 78 |
19 files changed, 1035 insertions, 257 deletions
diff --git a/examples/datavis3d/barchart/barchart.pro b/examples/datavis3d/barchart/barchart.pro index 80d6fd6c..f61adac0 100644 --- a/examples/datavis3d/barchart/barchart.pro +++ b/examples/datavis3d/barchart/barchart.pro @@ -1,9 +1,5 @@ SOURCES += main.cpp -HEADERS += QT += datavis3d target.path = $$[QT_INSTALL_EXAMPLES]/datavis3d/barchart INSTALLS += target - -RESOURCES += - diff --git a/examples/datavis3d/barchart/main.cpp b/examples/datavis3d/barchart/main.cpp index ecb92820..352bbcf3 100644 --- a/examples/datavis3d/barchart/main.cpp +++ b/examples/datavis3d/barchart/main.cpp @@ -39,7 +39,7 @@ ****************************************************************************/ #include "q3dbars.h" -#include "qdataitem.h" +#include "qdataset.h" #include <QGuiApplication> #include <QTimer> @@ -48,15 +48,7 @@ //#define CYCLE_THROUGH_STYLES //#define CYCLE_THROUGH_PRESET_CAMERAS //#define CYCLE_THROUGH_THEMES -#define USE_ACTUAL_DATA - -#ifdef USE_ACTUAL_DATA -const int rows = 13; -const int columns = 12; -#else -const int rows = 9; -const int columns = 9; -#endif +#define USE_STATIC_DATA using namespace QtDataVis3D; @@ -89,48 +81,29 @@ ChartDataGenerator::ChartDataGenerator(Q3DBars *barchart) , m_styleTimer(0) , m_presetTimer(0) , m_themeTimer(0) - , m_columnCount(columns) - , m_rowCount(rows) + , m_columnCount(9) + , m_rowCount(9) { // Set up bar specifications; make the bars as wide as they are deep, // and add a small space between the bars m_chart->setBarSpecs(QPointF(1.0f, 1.0f), QPointF(0.2f, 0.2f), true); -#ifndef USE_ACTUAL_DATA +#ifndef USE_STATIC_DATA // Set up sample space; make it as deep as it's wide m_chart->setupSampleSpace(QPoint(m_columnCount, m_rowCount)); -#else - // Set up sample space; make it match actual data size - m_chart->setupSampleSpace(QPoint(m_columnCount, m_rowCount) - , QStringLiteral("year"), QStringLiteral("month") - , QStringLiteral("rainfall (in mm)")); #endif // Set bar type to smooth bar #ifndef CYCLE_THROUGH_STYLES -#ifdef USE_ACTUAL_DATA - m_chart->setBarType(Q3DBars::Cylinders, true); -#else m_chart->setBarType(Q3DBars::Bars, false); #endif -#endif -#ifdef USE_ACTUAL_DATA - // Set selection mode to bar and column - m_chart->setSelectionMode(Q3DBars::BarAndColumn); -#else // Set selection mode to full m_chart->setSelectionMode(Q3DBars::BarRowAndColumn); -#endif #ifndef CYCLE_THROUGH_THEMES -#ifndef USE_ACTUAL_DATA // Set bar colors m_chart->setBarColor(QColor(Qt::black), QColor(Qt::red), QColor(Qt::darkBlue)); -#else - // Set theme - m_chart->setTheme(Q3DBars::ThemeBlueNcs); -#endif #endif // Set preset camera position @@ -160,7 +133,7 @@ ChartDataGenerator::~ChartDataGenerator() void ChartDataGenerator::start() { -#ifndef USE_ACTUAL_DATA +#ifndef USE_STATIC_DATA m_dataTimer = new QTimer(); m_dataTimer->setTimerType(Qt::CoarseTimer); m_dataTimer->setInterval(100); @@ -193,234 +166,80 @@ void ChartDataGenerator::start() // Change theme every 2 seconds m_themeTimer = new QTimer(); m_themeTimer->setTimerType(Qt::CoarseTimer); - m_themeTimer->setInterval(6000);//2000); + m_themeTimer->setInterval(3000);//2000); QObject::connect(m_themeTimer, &QTimer::timeout, this , &ChartDataGenerator::changeTheme); - m_themeTimer->start(6000);//2000); + m_themeTimer->start(3000);//2000); #endif } void ChartDataGenerator::addDataSet() { -#if 0 +#if 1 + // Prepare data to be visualized + // Use float vector adder QVector< QVector<float> > data; QVector<float> row; // TODO: Keep here for testing for (int j = 0; j < m_rowCount; j++) { for (int i = 0; i < m_columnCount; i++) { - //row.prepend(((float)i / (float)m_columnCount) / 1.5f + (float)(rand() % 30) / 100); - row.prepend(1.0f); + row.prepend(((float)i / (float)m_columnCount) * 100 + (float)(rand() % 30)); + //row.prepend(1.0f); } data.prepend(row); row.clear(); } + // Set up sample space based on inserted data + m_chart->setupSampleSpace(QPoint(m_columnCount, m_rowCount)); + // Add data to chart + m_chart->addDataSet(data); #else - m_chart->setWindowTitle(QStringLiteral("Monthly rainfall in Northern Finland (2000-2012)")); - // Fill in rainfall per month from 2000 to 2012 in Northern Finland (Sodankylä, Utsjoki, Kuusamo) - QVector< QVector<QDataItem*> > data; - QVector<QDataItem*> row; - // 2000 - row.prepend(new QDataItem(72, "mm, January 2000")); - row.prepend(new QDataItem(47, "mm, February 2000")); - row.prepend(new QDataItem(37, "mm, March 2000")); - row.prepend(new QDataItem(79, "mm, April 2000")); - row.prepend(new QDataItem(42, "mm, May 2000")); - row.prepend(new QDataItem(73, "mm, June 2000")); - row.prepend(new QDataItem(94, "mm, July 2000")); - row.prepend(new QDataItem(37, "mm, August 2000")); - row.prepend(new QDataItem(17, "mm, September 2000")); - row.prepend(new QDataItem(69, "mm, October 2000")); - row.prepend(new QDataItem(42, "mm, November 2000")); - row.prepend(new QDataItem(42, "mm, December 2000")); - data.prepend(row); - row.clear(); - // 2001 - row.prepend(new QDataItem(25, "mm, January 2001")); - row.prepend(new QDataItem(47, "mm, February 2001")); - row.prepend(new QDataItem(20, "mm, March 2001")); - row.prepend(new QDataItem(70, "mm, April 2001")); - row.prepend(new QDataItem(27, "mm, May 2001")); - row.prepend(new QDataItem(40, "mm, June 2001")); - row.prepend(new QDataItem(123, "mm, July 2001")); - row.prepend(new QDataItem(39, "mm, August 2001")); - row.prepend(new QDataItem(66, "mm, September 2001")); - row.prepend(new QDataItem(55, "mm, October 2001")); - row.prepend(new QDataItem(29, "mm, November 2001")); - row.prepend(new QDataItem(12, "mm, December 2001")); - data.prepend(row); - row.clear(); - // 2002 - row.prepend(new QDataItem(24, "mm, January 2002")); - row.prepend(new QDataItem(45, "mm, February 2002")); - row.prepend(new QDataItem(27, "mm, March 2002")); - row.prepend(new QDataItem(30, "mm, April 2002")); - row.prepend(new QDataItem(16, "mm, May 2002")); - row.prepend(new QDataItem(98, "mm, June 2002")); - row.prepend(new QDataItem(122, "mm, July 2002")); - row.prepend(new QDataItem(20, "mm, August 2002")); - row.prepend(new QDataItem(50, "mm, September 2002")); - row.prepend(new QDataItem(24, "mm, October 2002")); - row.prepend(new QDataItem(22, "mm, November 2002")); - row.prepend(new QDataItem(12, "mm, December 2002")); - data.prepend(row); - row.clear(); - // 2003 - row.prepend(new QDataItem(43, "mm, January 2003")); - row.prepend(new QDataItem(17, "mm, February 2003")); - row.prepend(new QDataItem(26, "mm, March 2003")); - row.prepend(new QDataItem(22, "mm, April 2003")); - row.prepend(new QDataItem(60, "mm, May 2003")); - row.prepend(new QDataItem(14, "mm, June 2003")); - row.prepend(new QDataItem(86, "mm, July 2003")); - row.prepend(new QDataItem(77, "mm, August 2003")); - row.prepend(new QDataItem(69, "mm, September 2003")); - row.prepend(new QDataItem(49, "mm, October 2003")); - row.prepend(new QDataItem(23, "mm, November 2003")); - row.prepend(new QDataItem(44, "mm, December 2003")); - data.prepend(row); - row.clear(); - // 2004 - row.prepend(new QDataItem(15, "mm, January 2004")); - row.prepend(new QDataItem(19, "mm, February 2004")); - row.prepend(new QDataItem(10, "mm, March 2004")); - row.prepend(new QDataItem(11, "mm, April 2004")); - row.prepend(new QDataItem(41, "mm, May 2004")); - row.prepend(new QDataItem(29, "mm, June 2004")); - row.prepend(new QDataItem(49, "mm, July 2004")); - row.prepend(new QDataItem(72, "mm, August 2004")); - row.prepend(new QDataItem(50, "mm, September 2004")); - row.prepend(new QDataItem(18, "mm, October 2004")); - row.prepend(new QDataItem(19, "mm, November 2004")); - row.prepend(new QDataItem(40, "mm, December 2004")); - data.prepend(row); - row.clear(); - // 2005 - row.prepend(new QDataItem(60, "mm, January 2005")); - row.prepend(new QDataItem(24, "mm, February 2005")); - row.prepend(new QDataItem(12, "mm, March 2005")); - row.prepend(new QDataItem(50, "mm, April 2005")); - row.prepend(new QDataItem(88, "mm, May 2005")); - row.prepend(new QDataItem(32, "mm, June 2005")); - row.prepend(new QDataItem(76, "mm, July 2005")); - row.prepend(new QDataItem(55, "mm, August 2005")); - row.prepend(new QDataItem(92, "mm, September 2005")); - row.prepend(new QDataItem(35, "mm, October 2005")); - row.prepend(new QDataItem(105, "mm, November 2005")); - row.prepend(new QDataItem(59, "mm, December 2005")); - data.prepend(row); - row.clear(); - // 2006 - row.prepend(new QDataItem(27, "mm, January 2006")); - row.prepend(new QDataItem(18, "mm, February 2006")); - row.prepend(new QDataItem(17, "mm, March 2006")); - row.prepend(new QDataItem(26, "mm, April 2006")); - row.prepend(new QDataItem(24, "mm, May 2006")); - row.prepend(new QDataItem(18, "mm, June 2006")); - row.prepend(new QDataItem(35, "mm, July 2006")); - row.prepend(new QDataItem(28, "mm, August 2006")); - row.prepend(new QDataItem(80, "mm, September 2006")); - row.prepend(new QDataItem(52, "mm, October 2006")); - row.prepend(new QDataItem(43, "mm, November 2006")); - row.prepend(new QDataItem(44, "mm, December 2006")); - data.prepend(row); - row.clear(); - // 2007 - row.prepend(new QDataItem(41, "mm, January 2007")); - row.prepend(new QDataItem(21, "mm, February 2007")); - row.prepend(new QDataItem(30, "mm, March 2007")); - row.prepend(new QDataItem(20, "mm, April 2007")); - row.prepend(new QDataItem(53, "mm, May 2007")); - row.prepend(new QDataItem(29, "mm, June 2007")); - row.prepend(new QDataItem(139, "mm, July 2007")); - row.prepend(new QDataItem(52, "mm, August 2007")); - row.prepend(new QDataItem(51, "mm, September 2007")); - row.prepend(new QDataItem(24, "mm, October 2007")); - row.prepend(new QDataItem(47, "mm, November 2007")); - row.prepend(new QDataItem(33, "mm, December 2007")); - data.prepend(row); - row.clear(); - // 2008 - row.prepend(new QDataItem(67, "mm, January 2008")); - row.prepend(new QDataItem(19, "mm, February 2008")); - row.prepend(new QDataItem(30, "mm, March 2008")); - row.prepend(new QDataItem(31, "mm, April 2008")); - row.prepend(new QDataItem(29, "mm, May 2008")); - row.prepend(new QDataItem(79, "mm, June 2008")); - row.prepend(new QDataItem(75, "mm, July 2008")); - row.prepend(new QDataItem(99, "mm, August 2008")); - row.prepend(new QDataItem(34, "mm, September 2008")); - row.prepend(new QDataItem(52, "mm, October 2008")); - row.prepend(new QDataItem(60, "mm, November 2008")); - row.prepend(new QDataItem(20, "mm, December 2008")); - data.prepend(row); - row.clear(); - // 2009 - row.prepend(new QDataItem(9, "mm, January 2009")); - row.prepend(new QDataItem(22, "mm, February 2009")); - row.prepend(new QDataItem(11, "mm, March 2009")); - row.prepend(new QDataItem(10, "mm, April 2009")); - row.prepend(new QDataItem(69, "mm, May 2009")); - row.prepend(new QDataItem(30, "mm, June 2009")); - row.prepend(new QDataItem(78, "mm, July 2009")); - row.prepend(new QDataItem(93, "mm, August 2009")); - row.prepend(new QDataItem(70, "mm, September 2009")); - row.prepend(new QDataItem(32, "mm, October 2009")); - row.prepend(new QDataItem(56, "mm, November 2009")); - row.prepend(new QDataItem(23, "mm, December 2009")); - data.prepend(row); - row.clear(); - // 2010 - row.prepend(new QDataItem(12, "mm, January 2010")); - row.prepend(new QDataItem(28, "mm, February 2010")); - row.prepend(new QDataItem(55, "mm, March 2010")); - row.prepend(new QDataItem(20, "mm, April 2010")); - row.prepend(new QDataItem(65, "mm, May 2010")); - row.prepend(new QDataItem(26, "mm, June 2010")); - row.prepend(new QDataItem(134, "mm, July 2010")); - row.prepend(new QDataItem(57, "mm, August 2010")); - row.prepend(new QDataItem(51, "mm, September 2010")); - row.prepend(new QDataItem(53, "mm, October 2010")); - row.prepend(new QDataItem(8, "mm, November 2010")); - row.prepend(new QDataItem(9, "mm, December 2010")); - data.prepend(row); - row.clear(); - // 2011 - row.prepend(new QDataItem(34, "mm, January 2011")); - row.prepend(new QDataItem(20, "mm, February 2011")); - row.prepend(new QDataItem(30, "mm, March 2011")); - row.prepend(new QDataItem(31, "mm, April 2011")); - row.prepend(new QDataItem(42, "mm, May 2011")); - row.prepend(new QDataItem(78, "mm, June 2011")); - row.prepend(new QDataItem(85, "mm, July 2011")); - row.prepend(new QDataItem(33, "mm, August 2011")); - row.prepend(new QDataItem(42, "mm, September 2011")); - row.prepend(new QDataItem(87, "mm, October 2011")); - row.prepend(new QDataItem(41, "mm, November 2011")); - row.prepend(new QDataItem(72, "mm, December 2011")); - data.prepend(row); - row.clear(); - // 2012 - row.prepend(new QDataItem(32, "mm, January 2012")); - row.prepend(new QDataItem(42, "mm, February 2012")); - row.prepend(new QDataItem(30, "mm, March 2012")); - row.prepend(new QDataItem(50, "mm, April 2012")); - row.prepend(new QDataItem(30, "mm, May 2012")); - row.prepend(new QDataItem(70, "mm, June 2012")); - row.prepend(new QDataItem(52, "mm, July 2012")); - row.prepend(new QDataItem(20, "mm, August 2012")); - row.prepend(new QDataItem(99, "mm, September 2012")); - row.prepend(new QDataItem(70, "mm, October 2012")); - row.prepend(new QDataItem(69, "mm, November 2012")); - row.prepend(new QDataItem(49, "mm, December 2012")); - data.prepend(row); - row.clear(); + // Prepare data to be visualized + // Use QDataSet adder + + // Set window title + m_chart->setWindowTitle(QStringLiteral("Hours playing banjo")); + // Set up row and column names - QVector<QString> months; - months << "January" << "February" << "March" << "April" << "May" << "June" << "July" << "August" << "September" << "October" << "November" << "December"; - QVector<QString> years; - years << "2000" << "2001" << "2002" << "2003" << "2004" << "2005" << "2006" << "2007" << "2008" << "2009" << "2010" << "2011" << "2012"; + QVector<QString> days; + days << "Monday" << "Tuesday" << "Wednesday" << "Thursday" << "Friday" << "Saturday" << "Sunday"; + QVector<QString> weeks; + weeks << "week 1" << "week 2" << "week 3" << "week 4" << "week 5"; + + // Set up data + float hours[5][7] = {{2, 1, 3, 0, 1, 5, 7} + , {0, 1, 3, 1, 2, 2, 3} + , {1, 1, 2, 1, 4, 4, 4} + , {0, 0, 0, 0, 2, 2, 0} + , {3, 3, 6, 2, 2, 1, 1}}; + + // Create data set + QDataSet *dataSet = new QDataSet(); + + // Add labels + dataSet->setLabels("Day of week", "Week of year", "Hours doing something", weeks, days); + + // Create data rows + QDataRow *dataRow; + for (int week = 0; week < weeks.size(); week++) { + dataRow = new QDataRow(weeks.at(week)); + // Create data items + for (int day = 0; day < days.size(); day++) { + // Add data to rows + dataRow->addItem(new QDataItem(hours[week][day], "hours," + days.at(day))); + } + // Add row to set + dataSet->addRow(dataRow); + // Get next pointer + dataRow++; + } + + // Set up sample space based on prepared data + m_chart->setupSampleSpace(QPoint(days.size(), weeks.size())); + + // Add data to chart + m_chart->addDataSet(dataSet); #endif - m_chart->addDataSet(data, years, months); } void ChartDataGenerator::addBars() diff --git a/examples/datavis3d/datavis3d.pro b/examples/datavis3d/datavis3d.pro index bd1fe983..d127083c 100644 --- a/examples/datavis3d/datavis3d.pro +++ b/examples/datavis3d/datavis3d.pro @@ -1,3 +1,4 @@ TEMPLATE = subdirs SUBDIRS += barchart \ + rainfall \ spectrum diff --git a/examples/datavis3d/rainfall/main.cpp b/examples/datavis3d/rainfall/main.cpp new file mode 100644 index 00000000..4139228a --- /dev/null +++ b/examples/datavis3d/rainfall/main.cpp @@ -0,0 +1,327 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "q3dbars.h" +#include "qdataitem.h" + +#include <QGuiApplication> +#include <QTimer> +#include <QDebug> + +using namespace QtDataVis3D; + +class ChartDataGenerator : public QObject +{ +public: + explicit ChartDataGenerator(Q3DBars *rainfall); + ~ChartDataGenerator(); + + void addDataSet(); + void start(); + +private: + Q3DBars *m_chart; + int m_columnCount; + int m_rowCount; +}; + +ChartDataGenerator::ChartDataGenerator(Q3DBars *rainfall) + : m_chart(rainfall) + , m_columnCount(12) + , m_rowCount(13) +{ + // Set up bar specifications; make the bars as wide as they are deep, + // and add a small space between the bars + m_chart->setBarSpecs(QPointF(1.0f, 1.0f), QPointF(0.2f, 0.2f), true); + + // Set up sample space; make it match actual data size + m_chart->setupSampleSpace(QPoint(m_columnCount, m_rowCount) + , QStringLiteral("year"), QStringLiteral("month") + , QStringLiteral("rainfall (in mm)")); + + // Set bar type to cylinder + m_chart->setBarType(Q3DBars::Cylinders, false); + + // Set selection mode to bar and column + m_chart->setSelectionMode(Q3DBars::BarAndColumn); + + // Set theme + m_chart->setTheme(Q3DBars::ThemeBlueNcs); + + // Set preset camera position + m_chart->setCameraPreset(Q3DBars::PresetFront); + + // Set window title + m_chart->setWindowTitle(QStringLiteral("Monthly rainfall in Northern Finland (2000-2012)")); +} + +ChartDataGenerator::~ChartDataGenerator() +{ + delete m_chart; +} + +void ChartDataGenerator::start() +{ + addDataSet(); +} + +void ChartDataGenerator::addDataSet() +{ + // Fill in rainfall per month from 2000 to 2012 in Northern Finland (Sodankylä, Utsjoki, Kuusamo) + QVector< QVector<QDataItem*> > data; + QVector<QDataItem*> row; + // 2000 + row.prepend(new QDataItem(72, "mm, January 2000")); + row.prepend(new QDataItem(47, "mm, February 2000")); + row.prepend(new QDataItem(37, "mm, March 2000")); + row.prepend(new QDataItem(79, "mm, April 2000")); + row.prepend(new QDataItem(42, "mm, May 2000")); + row.prepend(new QDataItem(73, "mm, June 2000")); + row.prepend(new QDataItem(94, "mm, July 2000")); + row.prepend(new QDataItem(37, "mm, August 2000")); + row.prepend(new QDataItem(17, "mm, September 2000")); + row.prepend(new QDataItem(69, "mm, October 2000")); + row.prepend(new QDataItem(42, "mm, November 2000")); + row.prepend(new QDataItem(42, "mm, December 2000")); + data.prepend(row); + row.clear(); + // 2001 + row.prepend(new QDataItem(25, "mm, January 2001")); + row.prepend(new QDataItem(47, "mm, February 2001")); + row.prepend(new QDataItem(20, "mm, March 2001")); + row.prepend(new QDataItem(70, "mm, April 2001")); + row.prepend(new QDataItem(27, "mm, May 2001")); + row.prepend(new QDataItem(40, "mm, June 2001")); + row.prepend(new QDataItem(123, "mm, July 2001")); + row.prepend(new QDataItem(39, "mm, August 2001")); + row.prepend(new QDataItem(66, "mm, September 2001")); + row.prepend(new QDataItem(55, "mm, October 2001")); + row.prepend(new QDataItem(29, "mm, November 2001")); + row.prepend(new QDataItem(12, "mm, December 2001")); + data.prepend(row); + row.clear(); + // 2002 + row.prepend(new QDataItem(24, "mm, January 2002")); + row.prepend(new QDataItem(45, "mm, February 2002")); + row.prepend(new QDataItem(27, "mm, March 2002")); + row.prepend(new QDataItem(30, "mm, April 2002")); + row.prepend(new QDataItem(16, "mm, May 2002")); + row.prepend(new QDataItem(98, "mm, June 2002")); + row.prepend(new QDataItem(122, "mm, July 2002")); + row.prepend(new QDataItem(20, "mm, August 2002")); + row.prepend(new QDataItem(50, "mm, September 2002")); + row.prepend(new QDataItem(24, "mm, October 2002")); + row.prepend(new QDataItem(22, "mm, November 2002")); + row.prepend(new QDataItem(12, "mm, December 2002")); + data.prepend(row); + row.clear(); + // 2003 + row.prepend(new QDataItem(43, "mm, January 2003")); + row.prepend(new QDataItem(17, "mm, February 2003")); + row.prepend(new QDataItem(26, "mm, March 2003")); + row.prepend(new QDataItem(22, "mm, April 2003")); + row.prepend(new QDataItem(60, "mm, May 2003")); + row.prepend(new QDataItem(14, "mm, June 2003")); + row.prepend(new QDataItem(86, "mm, July 2003")); + row.prepend(new QDataItem(77, "mm, August 2003")); + row.prepend(new QDataItem(69, "mm, September 2003")); + row.prepend(new QDataItem(49, "mm, October 2003")); + row.prepend(new QDataItem(23, "mm, November 2003")); + row.prepend(new QDataItem(44, "mm, December 2003")); + data.prepend(row); + row.clear(); + // 2004 + row.prepend(new QDataItem(15, "mm, January 2004")); + row.prepend(new QDataItem(19, "mm, February 2004")); + row.prepend(new QDataItem(10, "mm, March 2004")); + row.prepend(new QDataItem(11, "mm, April 2004")); + row.prepend(new QDataItem(41, "mm, May 2004")); + row.prepend(new QDataItem(29, "mm, June 2004")); + row.prepend(new QDataItem(49, "mm, July 2004")); + row.prepend(new QDataItem(72, "mm, August 2004")); + row.prepend(new QDataItem(50, "mm, September 2004")); + row.prepend(new QDataItem(18, "mm, October 2004")); + row.prepend(new QDataItem(19, "mm, November 2004")); + row.prepend(new QDataItem(40, "mm, December 2004")); + data.prepend(row); + row.clear(); + // 2005 + row.prepend(new QDataItem(60, "mm, January 2005")); + row.prepend(new QDataItem(24, "mm, February 2005")); + row.prepend(new QDataItem(12, "mm, March 2005")); + row.prepend(new QDataItem(50, "mm, April 2005")); + row.prepend(new QDataItem(88, "mm, May 2005")); + row.prepend(new QDataItem(32, "mm, June 2005")); + row.prepend(new QDataItem(76, "mm, July 2005")); + row.prepend(new QDataItem(55, "mm, August 2005")); + row.prepend(new QDataItem(92, "mm, September 2005")); + row.prepend(new QDataItem(35, "mm, October 2005")); + row.prepend(new QDataItem(105, "mm, November 2005")); + row.prepend(new QDataItem(59, "mm, December 2005")); + data.prepend(row); + row.clear(); + // 2006 + row.prepend(new QDataItem(27, "mm, January 2006")); + row.prepend(new QDataItem(18, "mm, February 2006")); + row.prepend(new QDataItem(17, "mm, March 2006")); + row.prepend(new QDataItem(26, "mm, April 2006")); + row.prepend(new QDataItem(24, "mm, May 2006")); + row.prepend(new QDataItem(18, "mm, June 2006")); + row.prepend(new QDataItem(35, "mm, July 2006")); + row.prepend(new QDataItem(28, "mm, August 2006")); + row.prepend(new QDataItem(80, "mm, September 2006")); + row.prepend(new QDataItem(52, "mm, October 2006")); + row.prepend(new QDataItem(43, "mm, November 2006")); + row.prepend(new QDataItem(44, "mm, December 2006")); + data.prepend(row); + row.clear(); + // 2007 + row.prepend(new QDataItem(41, "mm, January 2007")); + row.prepend(new QDataItem(21, "mm, February 2007")); + row.prepend(new QDataItem(30, "mm, March 2007")); + row.prepend(new QDataItem(20, "mm, April 2007")); + row.prepend(new QDataItem(53, "mm, May 2007")); + row.prepend(new QDataItem(29, "mm, June 2007")); + row.prepend(new QDataItem(139, "mm, July 2007")); + row.prepend(new QDataItem(52, "mm, August 2007")); + row.prepend(new QDataItem(51, "mm, September 2007")); + row.prepend(new QDataItem(24, "mm, October 2007")); + row.prepend(new QDataItem(47, "mm, November 2007")); + row.prepend(new QDataItem(33, "mm, December 2007")); + data.prepend(row); + row.clear(); + // 2008 + row.prepend(new QDataItem(67, "mm, January 2008")); + row.prepend(new QDataItem(19, "mm, February 2008")); + row.prepend(new QDataItem(30, "mm, March 2008")); + row.prepend(new QDataItem(31, "mm, April 2008")); + row.prepend(new QDataItem(29, "mm, May 2008")); + row.prepend(new QDataItem(79, "mm, June 2008")); + row.prepend(new QDataItem(75, "mm, July 2008")); + row.prepend(new QDataItem(99, "mm, August 2008")); + row.prepend(new QDataItem(34, "mm, September 2008")); + row.prepend(new QDataItem(52, "mm, October 2008")); + row.prepend(new QDataItem(60, "mm, November 2008")); + row.prepend(new QDataItem(20, "mm, December 2008")); + data.prepend(row); + row.clear(); + // 2009 + row.prepend(new QDataItem(9, "mm, January 2009")); + row.prepend(new QDataItem(22, "mm, February 2009")); + row.prepend(new QDataItem(11, "mm, March 2009")); + row.prepend(new QDataItem(10, "mm, April 2009")); + row.prepend(new QDataItem(69, "mm, May 2009")); + row.prepend(new QDataItem(30, "mm, June 2009")); + row.prepend(new QDataItem(78, "mm, July 2009")); + row.prepend(new QDataItem(93, "mm, August 2009")); + row.prepend(new QDataItem(70, "mm, September 2009")); + row.prepend(new QDataItem(32, "mm, October 2009")); + row.prepend(new QDataItem(56, "mm, November 2009")); + row.prepend(new QDataItem(23, "mm, December 2009")); + data.prepend(row); + row.clear(); + // 2010 + row.prepend(new QDataItem(12, "mm, January 2010")); + row.prepend(new QDataItem(28, "mm, February 2010")); + row.prepend(new QDataItem(55, "mm, March 2010")); + row.prepend(new QDataItem(20, "mm, April 2010")); + row.prepend(new QDataItem(65, "mm, May 2010")); + row.prepend(new QDataItem(26, "mm, June 2010")); + row.prepend(new QDataItem(134, "mm, July 2010")); + row.prepend(new QDataItem(57, "mm, August 2010")); + row.prepend(new QDataItem(51, "mm, September 2010")); + row.prepend(new QDataItem(53, "mm, October 2010")); + row.prepend(new QDataItem(8, "mm, November 2010")); + row.prepend(new QDataItem(9, "mm, December 2010")); + data.prepend(row); + row.clear(); + // 2011 + row.prepend(new QDataItem(34, "mm, January 2011")); + row.prepend(new QDataItem(20, "mm, February 2011")); + row.prepend(new QDataItem(30, "mm, March 2011")); + row.prepend(new QDataItem(31, "mm, April 2011")); + row.prepend(new QDataItem(42, "mm, May 2011")); + row.prepend(new QDataItem(78, "mm, June 2011")); + row.prepend(new QDataItem(85, "mm, July 2011")); + row.prepend(new QDataItem(33, "mm, August 2011")); + row.prepend(new QDataItem(42, "mm, September 2011")); + row.prepend(new QDataItem(87, "mm, October 2011")); + row.prepend(new QDataItem(41, "mm, November 2011")); + row.prepend(new QDataItem(72, "mm, December 2011")); + data.prepend(row); + row.clear(); + // 2012 + row.prepend(new QDataItem(32, "mm, January 2012")); + row.prepend(new QDataItem(42, "mm, February 2012")); + row.prepend(new QDataItem(30, "mm, March 2012")); + row.prepend(new QDataItem(50, "mm, April 2012")); + row.prepend(new QDataItem(30, "mm, May 2012")); + row.prepend(new QDataItem(70, "mm, June 2012")); + row.prepend(new QDataItem(52, "mm, July 2012")); + row.prepend(new QDataItem(20, "mm, August 2012")); + row.prepend(new QDataItem(99, "mm, September 2012")); + row.prepend(new QDataItem(70, "mm, October 2012")); + row.prepend(new QDataItem(69, "mm, November 2012")); + row.prepend(new QDataItem(49, "mm, December 2012")); + data.prepend(row); + row.clear(); + // Set up row and column names + QVector<QString> months; + months << "January" << "February" << "March" << "April" << "May" << "June" << "July" << "August" << "September" << "October" << "November" << "December"; + QVector<QString> years; + years << "2000" << "2001" << "2002" << "2003" << "2004" << "2005" << "2006" << "2007" << "2008" << "2009" << "2010" << "2011" << "2012"; + + m_chart->addDataSet(data, years, months); +} + +int main(int argc, char **argv) +{ + QGuiApplication app(argc, argv); + + Q3DBars rainfall; + rainfall.resize(1280, 1024); + rainfall.setPosition(QPoint(10, 30)); + rainfall.show(); + + ChartDataGenerator *generator = new ChartDataGenerator(&rainfall); + generator->start(); + + return app.exec(); +} diff --git a/examples/datavis3d/rainfall/rainfall.pro b/examples/datavis3d/rainfall/rainfall.pro new file mode 100644 index 00000000..b48c1b7c --- /dev/null +++ b/examples/datavis3d/rainfall/rainfall.pro @@ -0,0 +1,5 @@ +SOURCES += main.cpp +QT += datavis3d + +target.path = $$[QT_INSTALL_EXAMPLES]/datavis3d/rainfall +INSTALLS += target diff --git a/src/datavis3d/engine/engine.pri b/src/datavis3d/engine/engine.pri index 54f7cf6b..7ad5c5d5 100644 --- a/src/datavis3d/engine/engine.pri +++ b/src/datavis3d/engine/engine.pri @@ -1,12 +1,18 @@ SOURCES += $$PWD/q3dwindow.cpp \ $$PWD/q3dbars.cpp \ - $$PWD/qdataitem.cpp + $$PWD/qdataitem.cpp \ + $$PWD/qdatarow.cpp \ + $$PWD/qdataset.cpp HEADERS += $$PWD/q3dwindow_p.h \ $$PWD/q3dwindow.h \ $$PWD/q3dbars.h \ $$PWD/q3dbars_p.h \ $$PWD/qdataitem.h \ - $$PWD/qdataitem_p.h + $$PWD/qdataitem_p.h \ + $$PWD/qdatarow.h \ + $$PWD/qdatarow_p.h \ + $$PWD/qdataset.h \ + $$PWD/qdataset_p.h RESOURCES += engine/engine.qrc diff --git a/src/datavis3d/engine/q3dbars.cpp b/src/datavis3d/engine/q3dbars.cpp index f8c51d50..7c3ca016 100644 --- a/src/datavis3d/engine/q3dbars.cpp +++ b/src/datavis3d/engine/q3dbars.cpp @@ -43,6 +43,8 @@ #include "q3dbars_p.h" #include "camerahelper_p.h" #include "qdataitem_p.h" +#include "qdatarow_p.h" +#include "qdataset_p.h" #include "shaderhelper_p.h" #include "objecthelper_p.h" #include "utils_p.h" @@ -280,6 +282,8 @@ void Q3DBars::drawScene() glDisable(GL_DITHER); // disable dithering, it may affect colors if enabled for (int row = startRow; row != stopRow; row += stepRow) { for (int bar = startBar; bar != stopBar; bar += stepBar) { + if (d_ptr->m_dataSet.at(row).size() < (bar + 1)) + continue; QDataItem *item = d_ptr->m_dataSet.at(row).at(bar); float barHeight = item->d_ptr->value() / d_ptr->m_heightNormalizer; QMatrix4x4 modelMatrix; @@ -471,6 +475,8 @@ void Q3DBars::drawScene() bool barSelectionFound = false; for (int row = startRow; row != stopRow; row += stepRow) { for (int bar = startBar; bar != stopBar; bar += stepBar) { + if (d_ptr->m_dataSet.at(row).size() < (bar + 1)) + continue; QDataItem *item = d_ptr->m_dataSet.at(row).at(bar); float barHeight = item->d_ptr->value() / d_ptr->m_heightNormalizer; if (barHeight == 0) @@ -1104,7 +1110,7 @@ void Q3DBars::addDataRow(const QVector<float> &dataRow, const QString &labelRow } d_ptr->findHighestValue(sampleRow); // The vector contains data (=height) for each bar, a row at a time - // With each new row, the previous data set (=row) must be moved back + // With each new row, the previous data row must be moved back // ie. we need as many vectors as we have rows in the sample space d_ptr->m_dataSet.prepend(sampleRow); // if the added data pushed us over sample space, remove the oldest data set @@ -1122,8 +1128,7 @@ void Q3DBars::addDataRow(const QVector<QDataItem*> &dataRow, const QString &labe qWarning("Data set too large for sample space"); } d_ptr->findHighestValue(row); - // The vector contains data (=height) for each bar, a row at a time - // With each new row, the previous data set (=row) must be moved back + // With each new row, the previous data row must be moved back // ie. we need as many vectors as we have rows in the sample space d_ptr->m_dataSet.prepend(row); // if the added data pushed us over sample space, remove the oldest data set @@ -1131,6 +1136,19 @@ void Q3DBars::addDataRow(const QVector<QDataItem*> &dataRow, const QString &labe d_ptr->resizeDataSet(); } +void Q3DBars::addDataRow(QDataRow *dataRow) +{ + QDataRow *row = dataRow; + // Check that the input data fits into sample space, and resize if it doesn't + row->d_ptr->verifySize(d_ptr->m_sampleCount.x()); + d_ptr->m_heightNormalizer = row->d_ptr->highestValue(); + // With each new row, the previous data row must be moved back + // ie. we need as many vectors as we have rows in the sample space + d_ptr->m_dataSetTest->addRow(row); + // if the added data pushed us over sample space, remove the oldest data set + d_ptr->m_dataSetTest->d_ptr->verifySize(d_ptr->m_sampleCount.y()); +} + void Q3DBars::addDataSet(const QVector< QVector<float> > &data, const QVector<QString> &labelsRow , const QVector<QString> &labelsColumn) { @@ -1173,6 +1191,17 @@ void Q3DBars::addDataSet(const QVector< QVector<QDataItem*> > &data d_ptr->findHighestValue(d_ptr->m_dataSet.at(i)); } +void Q3DBars::addDataSet(QDataSet* dataSet) +{ + delete d_ptr->m_dataSetTest; + // Check sizes + dataSet->d_ptr->verifySize(d_ptr->m_sampleCount.y(), d_ptr->m_sampleCount.x()); + // Take ownership of given set + d_ptr->m_dataSetTest = dataSet; + // Find highest value + d_ptr->m_heightNormalizer = d_ptr->m_dataSetTest->d_ptr->highestValue(); +} + Q3DBarsPrivate::Q3DBarsPrivate(Q3DBars *q) : q_ptr(q) , m_paintDevice(0) @@ -1218,6 +1247,7 @@ Q3DBarsPrivate::Q3DBarsPrivate(Q3DBars *q) , m_isInitialized(false) , m_selectionMode(Q3DBars::Bar) , m_selectedBar(0) + , m_dataSetTest(0) { } diff --git a/src/datavis3d/engine/q3dbars.h b/src/datavis3d/engine/q3dbars.h index f4c03f1a..41775549 100644 --- a/src/datavis3d/engine/q3dbars.h +++ b/src/datavis3d/engine/q3dbars.h @@ -51,6 +51,8 @@ QTCOMMERCIALDATAVIS3D_BEGIN_NAMESPACE class Q3DBarsPrivate; class QDataItem; +class QDataRow; +class QDataSet; class QTCOMMERCIALDATAVIS3D_EXPORT Q3DBars : public Q3DWindow { @@ -96,12 +98,16 @@ public: ThemeLight }; + // TODO: Implement modes for "zooming" into selected row/column, ie. display only selected row/column + // in full window and 3d chart in a small viewport enum SelectionMode { None = 0, Bar, BarAndRow, BarAndColumn, - BarRowAndColumn + BarRowAndColumn, + ZoomRow, + ZoomColumn }; public: @@ -119,9 +125,12 @@ public: , const QString &labelRow = QString() , const QVector<QString> &labelsColumn = QVector<QString>()); // TODO: Replace QVector<..> with a data row class (QDataRow)? Move labels to class. + // ownership of dataItems is transferred void addDataRow(const QVector<QDataItem*> &dataRow , const QString &labelRow = QString() , const QVector<QString> &labelsColumn = QVector<QString>()); + // ownership of dataRow is transferred + void addDataRow(QDataRow *dataRow); // Add complete data set at a time, as a vector of data rows // TODO: Replace QVector<QVector<..>> with a data set class (QDataSet)? Move labels to class. @@ -130,9 +139,12 @@ public: , const QVector<QString> &labelsColumn = QVector<QString>()); // TODO: Replace QVector<QVector<..>> with a data set class (QDataSet)? Move labels to class. + // ownership of dataItems is transferred void addDataSet(const QVector< QVector<QDataItem*> > &data , const QVector<QString> &labelsRow = QVector<QString>() , const QVector<QString> &labelsColumn = QVector<QString>()); + // ownership of dataSet is transferred + void addDataSet(QDataSet* dataSet); // bar thickness, spacing between bars, and is spacing relative to thickness or absolute // y -component sets the thickness/spacing of z -direction diff --git a/src/datavis3d/engine/q3dbars_p.h b/src/datavis3d/engine/q3dbars_p.h index 5d2d3d20..0fa88af3 100644 --- a/src/datavis3d/engine/q3dbars_p.h +++ b/src/datavis3d/engine/q3dbars_p.h @@ -53,6 +53,7 @@ QTCOMMERCIALDATAVIS3D_BEGIN_NAMESPACE class Q3DBars; class QDataItem; +class QDataSet; class ShaderHelper; class ObjectHelper; @@ -133,6 +134,7 @@ public: bool m_isInitialized; Q3DBars::SelectionMode m_selectionMode; QDataItem *m_selectedBar; + QDataSet *m_dataSetTest; }; QTCOMMERCIALDATAVIS3D_END_NAMESPACE diff --git a/src/datavis3d/engine/q3dwindow.cpp b/src/datavis3d/engine/q3dwindow.cpp index a2a7d37d..54300793 100644 --- a/src/datavis3d/engine/q3dwindow.cpp +++ b/src/datavis3d/engine/q3dwindow.cpp @@ -58,6 +58,7 @@ Q3DWindow::Q3DWindow(QWindow *parent) { setSurfaceType(QWindow::OpenGLSurface); QSurfaceFormat surfaceFormat; + surfaceFormat.setDepthBufferSize(16); surfaceFormat.setSamples(4); surfaceFormat.setSwapBehavior(QSurfaceFormat::DoubleBuffer); //surfaceFormat.setRenderableType(QSurfaceFormat::OpenGLES); // OpenGL crashes with ANGLE, comment out or define OpenGLES diff --git a/src/datavis3d/engine/qdataitem.cpp b/src/datavis3d/engine/qdataitem.cpp index 8cdd9b8b..efe48e0a 100644 --- a/src/datavis3d/engine/qdataitem.cpp +++ b/src/datavis3d/engine/qdataitem.cpp @@ -56,7 +56,6 @@ QDataItem::QDataItem(float value, const QString &label) QDataItem::~QDataItem() { //qDebug("~QDataItem"); - delete d_ptr; } void QDataItem::setLabel(const QString &label, bool prepend) @@ -70,8 +69,8 @@ void QDataItem::setValue(float value) d_ptr->m_value = value; } -QDataItemPrivate::QDataItemPrivate(QDataItem *parent, float value, const QString &label) - : q_ptr(parent) +QDataItemPrivate::QDataItemPrivate(QDataItem *q, float value, const QString &label) + : q_ptr(q) , m_value(value) , m_label(label) , m_prependLabel(false) diff --git a/src/datavis3d/engine/qdataitem.h b/src/datavis3d/engine/qdataitem.h index 7cd10fa3..a54a1f0e 100644 --- a/src/datavis3d/engine/qdataitem.h +++ b/src/datavis3d/engine/qdataitem.h @@ -60,9 +60,10 @@ public: void setValue(float value); private: - QDataItemPrivate *d_ptr; // TODO: Why doesn't QScopedPointer work here? + QScopedPointer<QDataItemPrivate> d_ptr; friend class Q3DBars; friend class Q3DBarsPrivate; + friend class QDataRowPrivate; }; QTCOMMERCIALDATAVIS3D_END_NAMESPACE diff --git a/src/datavis3d/engine/qdataitem_p.h b/src/datavis3d/engine/qdataitem_p.h index c7bec54f..e191a8b5 100644 --- a/src/datavis3d/engine/qdataitem_p.h +++ b/src/datavis3d/engine/qdataitem_p.h @@ -52,7 +52,7 @@ QTCOMMERCIALDATAVIS3D_BEGIN_NAMESPACE class QDataItemPrivate { public: - explicit QDataItemPrivate(QDataItem *parent, float value = 0.0f + explicit QDataItemPrivate(QDataItem *q, float value = 0.0f , const QString &label = QString()); ~QDataItemPrivate(); diff --git a/src/datavis3d/engine/qdatarow.cpp b/src/datavis3d/engine/qdatarow.cpp new file mode 100644 index 00000000..0da8f487 --- /dev/null +++ b/src/datavis3d/engine/qdatarow.cpp @@ -0,0 +1,122 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtDataVis3D module. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qdatarow.h" +#include "qdatarow_p.h" +#include "qdataitem.h" +#include "qdataitem_p.h" + +#include <QString> + +QTCOMMERCIALDATAVIS3D_BEGIN_NAMESPACE + +QDataRow::QDataRow(const QString &label) + : d_ptr(new QDataRowPrivate(this, label)) +{ + qDebug("QDataRow"); +} + +QDataRow::~QDataRow() +{ + qDebug("~QDataRow"); +} + +void QDataRow::setLabel(const QString &label) +{ + d_ptr->m_label = label; +} + +void QDataRow::addItem(QDataItem *item) +{ + d_ptr->m_row.prepend(item); +} + +QDataRowPrivate::QDataRowPrivate(QDataRow *q, const QString &label) + : q_ptr(q) + , m_label(label) +{ +} + +QDataRowPrivate::~QDataRowPrivate() +{ + for (int itemCount = 0; itemCount < m_row.size(); itemCount++) { + delete m_row.at(itemCount); + } + m_row.clear(); +} + +QVector<QDataItem*> QDataRowPrivate::row() +{ + return m_row; +} + +void QDataRowPrivate::verifySize(int size) +{ + qDebug("verifySize (QDataRow)"); + if (size > m_row.size()) { + // QVector's resize doesn't delete data contained in it + // Delete contents of items to be removed + int nbrToBeRemoved = m_row.size() - size; + for (int itemCount = 0; itemCount < nbrToBeRemoved; itemCount++) { + int itemToBeRemoved = m_row.size() - itemCount - 1; // -1 to compensate index 0 + delete m_row.at(itemToBeRemoved); + } + // Resize vector + m_row.resize(size); + } + else if (size < m_row.size()) { + qCritical("Check your sample space size! Your row is too short."); + } +} + +float QDataRowPrivate::highestValue() +{ + float max = 0; + for (int i = 0; i < m_row.size(); i++) { + QDataItem *item = m_row.at(i); + float itemValue = item->d_ptr->value(); + if (max < itemValue) + max = itemValue; + } + return max; +} + +QTCOMMERCIALDATAVIS3D_END_NAMESPACE diff --git a/src/datavis3d/engine/qdatarow.h b/src/datavis3d/engine/qdatarow.h new file mode 100644 index 00000000..13ca1af7 --- /dev/null +++ b/src/datavis3d/engine/qdatarow.h @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtDataVis3D module. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QDATAROW_H +#define QDATAROW_H + +#include "QtDataVis3D/qdatavis3dglobal.h" +#include <QScopedPointer> +#include <QString> + +QTCOMMERCIALDATAVIS3D_BEGIN_NAMESPACE + +class QDataRowPrivate; +class QDataItem; + +class QTCOMMERCIALDATAVIS3D_EXPORT QDataRow +{ +public: + explicit QDataRow(const QString &label = QString()); + ~QDataRow(); + + void setLabel(const QString &label); // label for value, unit for example + void addItem(QDataItem *item); + +private: + QScopedPointer<QDataRowPrivate> d_ptr; + friend class Q3DBars; + friend class Q3DBarsPrivate; + friend class QDataSetPrivate; +}; + +QTCOMMERCIALDATAVIS3D_END_NAMESPACE + +#endif diff --git a/src/datavis3d/engine/qdatarow_p.h b/src/datavis3d/engine/qdatarow_p.h new file mode 100644 index 00000000..0224b225 --- /dev/null +++ b/src/datavis3d/engine/qdatarow_p.h @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtDataVis3D module. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QDATAROW_P_H +#define QDATAROW_P_H + +#include "qdatavis3dglobal.h" +#include "qdatarow.h" +#include <QVector> +#include <QString> + +QTCOMMERCIALDATAVIS3D_BEGIN_NAMESPACE + +class QDataItem; + +class QDataRowPrivate +{ + public: + explicit QDataRowPrivate(QDataRow *q, const QString &label = QString()); + ~QDataRowPrivate(); + + QVector<QDataItem*> row(); + void verifySize(int size); + float highestValue(); + + private: + QDataRow *q_ptr; + QVector<QDataItem*> m_row; + QString m_label; + friend class QDataRow; +}; + +QTCOMMERCIALDATAVIS3D_END_NAMESPACE + +#endif diff --git a/src/datavis3d/engine/qdataset.cpp b/src/datavis3d/engine/qdataset.cpp new file mode 100644 index 00000000..39b2f399 --- /dev/null +++ b/src/datavis3d/engine/qdataset.cpp @@ -0,0 +1,156 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtDataVis3D module. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qdataset.h" +#include "qdataset_p.h" +#include "qdatarow.h" +#include "qdatarow_p.h" + +#include <QPoint> +#include <QString> + +QTCOMMERCIALDATAVIS3D_BEGIN_NAMESPACE + +QDataSet::QDataSet() + : d_ptr(new QDataSetPrivate(this)) +{ + qDebug("QDataSet"); +} + +QDataSet::~QDataSet() +{ + qDebug("~QDataSet"); +} + +void QDataSet::setLabels(const QString &xAxis + , const QString &zAxis + , const QString &yAxis + , const QVector<QString> &labelsRow + , const QVector<QString> &labelsColumn) +{ + d_ptr->m_xAxis = xAxis; + d_ptr->m_zAxis = zAxis; + d_ptr->m_yAxis = yAxis; + d_ptr->m_labelsRow = labelsRow; + d_ptr->m_labelsColumn = labelsColumn; +} + +void QDataSet::addRow(QDataRow *row) +{ + d_ptr->m_set.prepend(row); +} + +QDataSetPrivate::QDataSetPrivate(QDataSet *q) + : q_ptr(q) + , m_set(QVector<QDataRow*>()) + , m_xAxis(QString()) + , m_zAxis(QString()) + , m_yAxis(QString()) + , m_labelsRow(QVector<QString>()) + , m_labelsColumn(QVector<QString>()) +{ +} + +QDataSetPrivate::~QDataSetPrivate() +{ + for (int itemCount = 0; itemCount < m_set.size(); itemCount++) { + delete m_set.at(itemCount); + } + m_set.clear(); +} + +QVector<QDataRow*> QDataSetPrivate::set() +{ + return m_set; +} + +QVector<QString> QDataSetPrivate::rowLabels() +{ + return m_labelsRow; +} + +QVector<QString> QDataSetPrivate::columnLabels() +{ + return m_labelsColumn; +} + +void QDataSetPrivate::axisLabels(QString *xAxis, QString *zAxis, QString *yAxis) +{ + *xAxis = m_xAxis; + *zAxis = m_zAxis; + *yAxis = m_yAxis; +} + +void QDataSetPrivate::verifySize(int colSize, int rowSize) +{ + qDebug("verifySize (QDataSet)"); + // First verify columns + // QVector's resize doesn't delete data contained in it + // Delete contents of rows to be removed + if (colSize > m_set.size()) { + int nbrToBeRemoved = m_set.size() - colSize; + for (int rowCount = 0; rowCount < nbrToBeRemoved; rowCount++) { + int rowToBeRemoved = m_set.size() - rowCount - 1; // -1 to compensate index 0 + delete m_set.at(rowToBeRemoved); + } + // Resize vector + m_set.resize(colSize); + } + // Then verify each row left + if (rowSize) { + for (int i = 0; i < m_set.size(); i++) + m_set.at(i)->d_ptr->verifySize(rowSize); + } +} + +float QDataSetPrivate::highestValue() +{ + float max = 0; + float rowMax = 0; + for (int i = 0; i < m_set.size(); i++) { + rowMax = m_set.at(i)->d_ptr->highestValue(); + if (max < rowMax) + max = rowMax; + } + return max; +} + +QTCOMMERCIALDATAVIS3D_END_NAMESPACE diff --git a/src/datavis3d/engine/qdataset.h b/src/datavis3d/engine/qdataset.h new file mode 100644 index 00000000..76748b47 --- /dev/null +++ b/src/datavis3d/engine/qdataset.h @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtDataVis3D module. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QDATASET_H +#define QDATASET_H + +#include "QtDataVis3D/qdatavis3dglobal.h" +#include "qdataitem.h" +#include "qdatarow.h" + +#include <QScopedPointer> +#include <QVector> +#include <QString> + +QTCOMMERCIALDATAVIS3D_BEGIN_NAMESPACE + +class QDataSetPrivate; + +class QTCOMMERCIALDATAVIS3D_EXPORT QDataSet +{ +public: + explicit QDataSet(); + ~QDataSet(); + + void setLabels(const QString &xAxis = QString() + , const QString &zAxis = QString() + , const QString &yAxis = QString() + , const QVector<QString> &labelsRow = QVector<QString>() + , const QVector<QString> &labelsColumn = QVector<QString>()); + void addRow(QDataRow *row); + +private: + QScopedPointer<QDataSetPrivate> d_ptr; + friend class Q3DBars; + friend class Q3DBarsPrivate; +}; + +QTCOMMERCIALDATAVIS3D_END_NAMESPACE + +#endif diff --git a/src/datavis3d/engine/qdataset_p.h b/src/datavis3d/engine/qdataset_p.h new file mode 100644 index 00000000..6f89b2b4 --- /dev/null +++ b/src/datavis3d/engine/qdataset_p.h @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtDataVis3D module. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QDATASET_P_H +#define QDATASET_P_H + +#include "qdatavis3dglobal.h" +#include "qdataset.h" +#include <QVector> +#include <QString> + +QTCOMMERCIALDATAVIS3D_BEGIN_NAMESPACE + +class QDataSetPrivate +{ + public: + explicit QDataSetPrivate(QDataSet *q); + ~QDataSetPrivate(); + + QVector<QDataRow*> set(); + QVector<QString> rowLabels(); + QVector<QString> columnLabels(); + void axisLabels(QString *xAxis, QString *zAxis, QString *yAxis); + void verifySize(int colSize, int rowSize = 0); // If rowSize is 0, don't verify rows + float highestValue(); + + private: + QDataSet *q_ptr; + QVector<QDataRow*> m_set; + QString m_xAxis; + QString m_zAxis; + QString m_yAxis; + QVector<QString> m_labelsRow; + QVector<QString> m_labelsColumn; + friend class QDataSet; +}; + +QTCOMMERCIALDATAVIS3D_END_NAMESPACE + +#endif |