summaryrefslogtreecommitdiffstats
path: root/examples/datavisualization/customitems/customitemgraph.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/datavisualization/customitems/customitemgraph.cpp')
-rw-r--r--examples/datavisualization/customitems/customitemgraph.cpp317
1 files changed, 317 insertions, 0 deletions
diff --git a/examples/datavisualization/customitems/customitemgraph.cpp b/examples/datavisualization/customitems/customitemgraph.cpp
new file mode 100644
index 00000000..96ce5e46
--- /dev/null
+++ b/examples/datavisualization/customitems/customitemgraph.cpp
@@ -0,0 +1,317 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the QtDataVisualization module.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+#include "customitemgraph.h"
+
+#include <QtDataVisualization/Q3DTheme>
+#include <QtDataVisualization/QCustom3DItem>
+#include <QtDataVisualization/QCustom3DLabel>
+#include <QtGui/QImage>
+
+using namespace QtDataVisualization;
+
+CustomItemGraph::CustomItemGraph(Q3DSurface *surface, QLabel *label)
+ : m_graph(surface),
+ m_textField(label),
+ m_previouslyAnimatedItem(0)
+{
+ QImage layerOneHMap(":/maps/layer_1.png");
+ QHeightMapSurfaceDataProxy *layerOneProxy = new QHeightMapSurfaceDataProxy(layerOneHMap);
+ QSurface3DSeries *layerOneSeries = new QSurface3DSeries(layerOneProxy);
+ layerOneSeries->setItemLabelFormat(QStringLiteral("(@xLabel, @zLabel): @yLabel"));
+ layerOneProxy->setValueRanges(34.0f, 40.0f, 18.0f, 24.0f);
+ layerOneSeries->setDrawMode(QSurface3DSeries::DrawSurface);
+ layerOneSeries->setFlatShadingEnabled(false);
+
+ QImage layerTwoHMap(":/maps/layer_2.png");
+ QHeightMapSurfaceDataProxy *layerTwoProxy = new QHeightMapSurfaceDataProxy(layerTwoHMap);
+ QSurface3DSeries *layerTwoSeries = new QSurface3DSeries(layerTwoProxy);
+ layerTwoSeries->setItemLabelFormat(QStringLiteral("(@xLabel, @zLabel): @yLabel"));
+ layerTwoProxy->setValueRanges(34.0f, 40.0f, 18.0f, 24.0f);
+ layerTwoSeries->setDrawMode(QSurface3DSeries::DrawSurface);
+ layerTwoSeries->setFlatShadingEnabled(false);
+
+ QImage layerThreeHMap(":/maps/layer_3.png");
+ QHeightMapSurfaceDataProxy *layerThreeProxy = new QHeightMapSurfaceDataProxy(layerThreeHMap);
+ QSurface3DSeries *layerThreeSeries = new QSurface3DSeries(layerThreeProxy);
+ layerThreeSeries->setItemLabelFormat(QStringLiteral("(@xLabel, @zLabel): @yLabel"));
+ layerThreeProxy->setValueRanges(34.0f, 40.0f, 18.0f, 24.0f);
+ layerThreeSeries->setDrawMode(QSurface3DSeries::DrawSurface);
+ layerThreeSeries->setFlatShadingEnabled(false);
+
+ m_graph->axisX()->setLabelFormat("%.1f N");
+ m_graph->axisZ()->setLabelFormat("%.1f E");
+ m_graph->axisX()->setRange(34.0f, 40.0f);
+ m_graph->axisY()->setRange(0.0f, 200.0f);
+ m_graph->axisZ()->setRange(18.0f, 24.0f);
+
+ m_graph->axisX()->setTitle(QStringLiteral("Latitude"));
+ m_graph->axisY()->setTitle(QStringLiteral("Height"));
+ m_graph->axisZ()->setTitle(QStringLiteral("Longitude"));
+
+ m_graph->addSeries(layerOneSeries);
+ m_graph->addSeries(layerTwoSeries);
+ m_graph->addSeries(layerThreeSeries);
+
+ QLinearGradient grOne;
+ grOne.setColorAt(0.0, Qt::black);
+ grOne.setColorAt(0.38, Qt::darkYellow);
+ grOne.setColorAt(0.39, Qt::darkGreen);
+ grOne.setColorAt(0.5, Qt::darkGray);
+ grOne.setColorAt(1.0, Qt::gray);
+ m_graph->seriesList().at(0)->setBaseGradient(grOne);
+ m_graph->seriesList().at(0)->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
+
+ QLinearGradient grTwo;
+ grTwo.setColorAt(0.385, Qt::blue);
+ grTwo.setColorAt(0.395, Qt::white);
+ m_graph->seriesList().at(1)->setBaseGradient(grTwo);
+ m_graph->seriesList().at(1)->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
+
+ QLinearGradient grThree;
+ grThree.setColorAt(0.0, Qt::white);
+ grThree.setColorAt(0.05, Qt::black);
+ m_graph->seriesList().at(2)->setBaseGradient(grThree);
+ m_graph->seriesList().at(2)->setColorStyle(Q3DTheme::ColorStyleRangeGradient);
+
+ m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetFront);
+
+ connect(m_graph, &QAbstract3DGraph::selectedElementChanged,
+ this, &CustomItemGraph::handleElementSelected);
+
+ m_selectionAnimation = new QPropertyAnimation(this);
+ m_selectionAnimation->setPropertyName("scaling");
+ m_selectionAnimation->setDuration(500);
+ m_selectionAnimation->setLoopCount(-1);
+
+ QFont titleFont = QFont("Century Gothic", 30);
+ titleFont.setBold(true);
+ QCustom3DLabel *titleLabel = new QCustom3DLabel("Oil Rigs on Imaginary Sea", titleFont,
+ QVector3D(0.0f, 1.2f, 0.0f),
+ QVector3D(1.0f, 1.0f, 0.0f),
+ QQuaternion());
+ titleLabel->setPositionAbsolute(true);
+ titleLabel->setFacingCamera(true);
+ titleLabel->setBackgroundColor(QColor(0x66cdaa));
+ m_graph->addCustomItem(titleLabel);
+}
+
+CustomItemGraph::~CustomItemGraph()
+{
+ delete m_graph;
+}
+
+void CustomItemGraph::toggleItemOne(bool show)
+{
+ //! [1]
+ QVector3D positionOne = QVector3D(39.0f, 77.0f, 19.2f);
+ //! [1]
+ QVector3D positionOnePipe = QVector3D(39.0f, 45.0f, 19.2f);
+ QVector3D positionOneLabel = QVector3D(39.0f, 107.0f, 19.2f);
+ if (show) {
+ //! [0]
+ QImage color = QImage(2, 2, QImage::Format_RGB32);
+ color.fill(Qt::red);
+ //! [0]
+ //! [2]
+ QCustom3DItem *item = new QCustom3DItem(":/items/oilrig.obj", positionOne,
+ QVector3D(0.025f, 0.025f, 0.025f),
+ QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 45.0f),
+ color);
+ //! [2]
+ //! [3]
+ m_graph->addCustomItem(item);
+ //! [3]
+ item = new QCustom3DItem(":/items/pipe.obj", positionOnePipe,
+ QVector3D(0.005f, 0.5f, 0.005f),
+ QQuaternion(),
+ color);
+ item->setShadowCasting(false);
+ m_graph->addCustomItem(item);
+
+ QCustom3DLabel *label = new QCustom3DLabel();
+ label->setText("Oil Rig One");
+ label->setPosition(positionOneLabel);
+ label->setScaling(QVector3D(1.0f, 1.0f, 1.0f));
+ m_graph->addCustomItem(label);
+ } else {
+ resetSelection();
+ //! [4]
+ m_graph->removeCustomItemAt(positionOne);
+ //! [4]
+ m_graph->removeCustomItemAt(positionOnePipe);
+ m_graph->removeCustomItemAt(positionOneLabel);
+ }
+}
+
+void CustomItemGraph::toggleItemTwo(bool show)
+{
+ QVector3D positionTwo = QVector3D(34.5f, 77.0f, 23.4f);
+ QVector3D positionTwoPipe = QVector3D(34.5f, 45.0f, 23.4f);
+ QVector3D positionTwoLabel = QVector3D(34.5f, 107.0f, 23.4f);
+ if (show) {
+ QImage color = QImage(2, 2, QImage::Format_RGB32);
+ color.fill(Qt::red);
+ QCustom3DItem *item = new QCustom3DItem();
+ item->setMeshFile(":/items/oilrig.obj");
+ item->setPosition(positionTwo);
+ item->setScaling(QVector3D(0.025f, 0.025f, 0.025f));
+ item->setRotation(QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 25.0f));
+ item->setTextureImage(color);
+ m_graph->addCustomItem(item);
+ item = new QCustom3DItem(":/items/pipe.obj", positionTwoPipe,
+ QVector3D(0.005f, 0.5f, 0.005f),
+ QQuaternion(),
+ color);
+ item->setShadowCasting(false);
+ m_graph->addCustomItem(item);
+
+ QCustom3DLabel *label = new QCustom3DLabel();
+ label->setText("Oil Rig Two");
+ label->setPosition(positionTwoLabel);
+ label->setScaling(QVector3D(1.0f, 1.0f, 1.0f));
+ m_graph->addCustomItem(label);
+ } else {
+ resetSelection();
+ m_graph->removeCustomItemAt(positionTwo);
+ m_graph->removeCustomItemAt(positionTwoPipe);
+ m_graph->removeCustomItemAt(positionTwoLabel);
+ }
+}
+
+void CustomItemGraph::toggleItemThree(bool show)
+{
+ QVector3D positionThree = QVector3D(34.5f, 86.0f, 19.1f);
+ QVector3D positionThreeLabel = QVector3D(34.5f, 116.0f, 19.1f);
+ if (show) {
+ QImage color = QImage(2, 2, QImage::Format_RGB32);
+ color.fill(Qt::darkMagenta);
+ QCustom3DItem *item = new QCustom3DItem();
+ item->setMeshFile(":/items/refinery.obj");
+ item->setPosition(positionThree);
+ item->setScaling(QVector3D(0.04f, 0.04f, 0.04f));
+ item->setRotation(QQuaternion::fromAxisAndAngle(0.0f, 1.0f, 0.0f, 75.0f));
+ item->setTextureImage(color);
+ m_graph->addCustomItem(item);
+
+ QCustom3DLabel *label = new QCustom3DLabel();
+ label->setText("Refinery");
+ label->setPosition(positionThreeLabel);
+ label->setScaling(QVector3D(1.0f, 1.0f, 1.0f));
+ m_graph->addCustomItem(label);
+ } else {
+ resetSelection();
+ m_graph->removeCustomItemAt(positionThree);
+ m_graph->removeCustomItemAt(positionThreeLabel);
+ }
+}
+
+void CustomItemGraph::toggleSeeThrough(bool seethrough)
+{
+ if (seethrough) {
+ m_graph->seriesList().at(0)->setDrawMode(QSurface3DSeries::DrawWireframe);
+ m_graph->seriesList().at(1)->setDrawMode(QSurface3DSeries::DrawWireframe);
+ } else {
+ m_graph->seriesList().at(0)->setDrawMode(QSurface3DSeries::DrawSurface);
+ m_graph->seriesList().at(1)->setDrawMode(QSurface3DSeries::DrawSurface);
+ }
+}
+
+void CustomItemGraph::toggleOilHighlight(bool highlight)
+{
+ if (highlight) {
+ QLinearGradient grThree;
+ grThree.setColorAt(0.0, Qt::black);
+ grThree.setColorAt(0.05, Qt::red);
+ m_graph->seriesList().at(2)->setBaseGradient(grThree);
+ } else {
+ QLinearGradient grThree;
+ grThree.setColorAt(0.0, Qt::white);
+ grThree.setColorAt(0.05, Qt::black);
+ m_graph->seriesList().at(2)->setBaseGradient(grThree);
+ }
+}
+
+void CustomItemGraph::toggleShadows(bool shadows)
+{
+ if (shadows)
+ m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityMedium);
+ else
+ m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityNone);
+}
+
+void CustomItemGraph::handleElementSelected(QAbstract3DGraph::ElementType type)
+{
+ resetSelection();
+ if (type == QAbstract3DGraph::ElementCustomItem) {
+ QCustom3DItem *item = m_graph->selectedCustomItem();
+ QString text;
+ if (qobject_cast<QCustom3DLabel *>(item) != 0) {
+ text.append("Custom label: ");
+ } else {
+ QStringList split = item->meshFile().split("/");
+ text.append(split.last());
+ text.append(": ");
+ }
+ int index = m_graph->selectedCustomItemIndex();
+ text.append(QString::number(index));
+ m_textField->setText(text);
+ m_previouslyAnimatedItem = item;
+ m_previousScaling = item->scaling();
+ m_selectionAnimation->setTargetObject(item);
+ m_selectionAnimation->setStartValue(item->scaling());
+ m_selectionAnimation->setEndValue(item->scaling() * 1.5f);
+ m_selectionAnimation->start();
+ } else if (type == QAbstract3DGraph::ElementSeries) {
+ QString text = "Surface (";
+ QSurface3DSeries *series = m_graph->selectedSeries();
+ if (series) {
+ QPoint point = series->selectedPoint();
+ QString posStr;
+ posStr.setNum(point.x());
+ text.append(posStr);
+ text.append(", ");
+ posStr.setNum(point.y());
+ text.append(posStr);
+ }
+ text.append(")");
+ m_textField->setText(text);
+ } else if (type > QAbstract3DGraph::ElementSeries
+ && type < QAbstract3DGraph::ElementCustomItem) {
+ int index = m_graph->selectedLabelIndex();
+ QString text;
+ if (type == QAbstract3DGraph::ElementAxisXLabel)
+ text.append("Axis X label: ");
+ else if (type == QAbstract3DGraph::ElementAxisYLabel)
+ text.append("Axis Y label: ");
+ else
+ text.append("Axis Z label: ");
+ text.append(QString::number(index));
+ m_textField->setText(text);
+ } else {
+ m_textField->setText("Nothing");
+ }
+}
+
+void CustomItemGraph::resetSelection()
+{
+ m_selectionAnimation->stop();
+ if (m_previouslyAnimatedItem)
+ m_previouslyAnimatedItem->setScaling(m_previousScaling);
+ m_previouslyAnimatedItem = 0;
+}