diff options
Diffstat (limited to 'examples/datavisualization/customitems/customitemgraph.cpp')
-rw-r--r-- | examples/datavisualization/customitems/customitemgraph.cpp | 317 |
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; +} |