summaryrefslogtreecommitdiffstats
path: root/examples/datavisualization
diff options
context:
space:
mode:
Diffstat (limited to 'examples/datavisualization')
-rw-r--r--examples/datavisualization/audiolevels/audiolevels.cpp89
-rw-r--r--examples/datavisualization/audiolevels/audiolevels.h45
-rw-r--r--examples/datavisualization/audiolevels/audiolevels.pro14
-rw-r--r--examples/datavisualization/audiolevels/audiolevelsiodevice.cpp103
-rw-r--r--examples/datavisualization/audiolevels/audiolevelsiodevice.h44
-rw-r--r--examples/datavisualization/audiolevels/doc/images/audiolevels-example.pngbin0 -> 120978 bytes
-rw-r--r--examples/datavisualization/audiolevels/doc/src/audiolevels.qdoc85
-rw-r--r--examples/datavisualization/audiolevels/main.cpp39
-rw-r--r--examples/datavisualization/bars/bars.pro8
-rw-r--r--examples/datavisualization/bars/doc/images/bars-example.pngbin0 -> 151337 bytes
-rw-r--r--examples/datavisualization/bars/doc/src/bars.qdoc172
-rw-r--r--examples/datavisualization/bars/graphmodifier.cpp280
-rw-r--r--examples/datavisualization/bars/graphmodifier.h87
-rw-r--r--examples/datavisualization/bars/main.cpp271
-rw-r--r--examples/datavisualization/custominput/custominput.pro12
-rw-r--r--examples/datavisualization/custominput/custominput.qrc5
-rw-r--r--examples/datavisualization/custominput/custominputhandler.cpp54
-rw-r--r--examples/datavisualization/custominput/custominputhandler.h36
-rw-r--r--examples/datavisualization/custominput/data/data.txt1060
-rw-r--r--examples/datavisualization/custominput/doc/images/custominput-example.pngbin0 -> 62422 bytes
-rw-r--r--examples/datavisualization/custominput/doc/src/custominput.qdoc70
-rw-r--r--examples/datavisualization/custominput/main.cpp84
-rw-r--r--examples/datavisualization/custominput/scatterdatamodifier.cpp172
-rw-r--r--examples/datavisualization/custominput/scatterdatamodifier.h60
-rw-r--r--examples/datavisualization/customproxy/customproxy.pro20
-rw-r--r--examples/datavisualization/customproxy/customproxy.qrc5
-rw-r--r--examples/datavisualization/customproxy/data/raindata.txt158
-rw-r--r--examples/datavisualization/customproxy/doc/images/customproxy-example.pngbin0 -> 125698 bytes
-rw-r--r--examples/datavisualization/customproxy/doc/src/customproxy.qdoc113
-rw-r--r--examples/datavisualization/customproxy/main.cpp38
-rw-r--r--examples/datavisualization/customproxy/rainfallgraph.cpp155
-rw-r--r--examples/datavisualization/customproxy/rainfallgraph.h51
-rw-r--r--examples/datavisualization/customproxy/variantbardatamapping.cpp133
-rw-r--r--examples/datavisualization/customproxy/variantbardatamapping.h79
-rw-r--r--examples/datavisualization/customproxy/variantbardataproxy.cpp140
-rw-r--r--examples/datavisualization/customproxy/variantbardataproxy.h68
-rw-r--r--examples/datavisualization/customproxy/variantdataset.cpp63
-rw-r--r--examples/datavisualization/customproxy/variantdataset.h57
-rw-r--r--examples/datavisualization/datavisualization.pro21
-rw-r--r--examples/datavisualization/examples.pri13
-rw-r--r--examples/datavisualization/itemmodel/doc/images/itemmodel-example-2.pngbin0 -> 78536 bytes
-rw-r--r--examples/datavisualization/itemmodel/doc/images/itemmodel-example.pngbin0 -> 45381 bytes
-rw-r--r--examples/datavisualization/itemmodel/doc/src/itemmodel.qdoc181
-rw-r--r--examples/datavisualization/itemmodel/itemmodel.pro7
-rw-r--r--examples/datavisualization/itemmodel/main.cpp285
-rw-r--r--examples/datavisualization/qmlbars/doc/images/qmlbars-example.pngbin0 -> 149167 bytes
-rw-r--r--examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc93
-rw-r--r--examples/datavisualization/qmlbars/main.cpp51
-rw-r--r--examples/datavisualization/qmlbars/qml/qmlbars/Axes.qml52
-rw-r--r--examples/datavisualization/qmlbars/qml/qmlbars/Data.qml119
-rw-r--r--examples/datavisualization/qmlbars/qml/qmlbars/main.qml303
-rw-r--r--examples/datavisualization/qmlbars/qmlbars.desktop11
-rw-r--r--examples/datavisualization/qmlbars/qmlbars.pro20
-rw-r--r--examples/datavisualization/qmlbars/qmlbars.qrc7
-rw-r--r--examples/datavisualization/qmlbars/qmlbars64.pngbin0 -> 3400 bytes
-rw-r--r--examples/datavisualization/qmlbars/qtquick2applicationviewer/qtquick2applicationviewer.cpp81
-rw-r--r--examples/datavisualization/qmlbars/qtquick2applicationviewer/qtquick2applicationviewer.h33
-rw-r--r--examples/datavisualization/qmlbars/qtquick2applicationviewer/qtquick2applicationviewer.pri180
-rw-r--r--examples/datavisualization/qmlcustominput/doc/images/qmlcustominput-example.pngbin0 -> 57821 bytes
-rw-r--r--examples/datavisualization/qmlcustominput/doc/src/qmlcustominput.qdoc79
-rw-r--r--examples/datavisualization/qmlcustominput/main.cpp51
-rw-r--r--examples/datavisualization/qmlcustominput/qml/qmlcustominput/Data.qml1087
-rw-r--r--examples/datavisualization/qmlcustominput/qml/qmlcustominput/NewButton.qml52
-rw-r--r--examples/datavisualization/qmlcustominput/qml/qmlcustominput/main.qml205
-rw-r--r--examples/datavisualization/qmlcustominput/qmlcustominput.desktop11
-rw-r--r--examples/datavisualization/qmlcustominput/qmlcustominput.pro21
-rw-r--r--examples/datavisualization/qmlcustominput/qmlcustominput.qrc7
-rw-r--r--examples/datavisualization/qmlcustominput/qmlcustominput64.pngbin0 -> 3400 bytes
-rw-r--r--examples/datavisualization/qmlcustominput/qmlcustominput80.pngbin0 -> 4945 bytes
-rw-r--r--examples/datavisualization/qmlcustominput/qtquick2applicationviewer/qtquick2applicationviewer.cpp81
-rw-r--r--examples/datavisualization/qmlcustominput/qtquick2applicationviewer/qtquick2applicationviewer.h33
-rw-r--r--examples/datavisualization/qmlcustominput/qtquick2applicationviewer/qtquick2applicationviewer.pri180
-rw-r--r--examples/datavisualization/qmllegend/doc/images/qmllegend-example.pngbin0 -> 98023 bytes
-rw-r--r--examples/datavisualization/qmllegend/doc/src/qmllegend.qdoc67
-rw-r--r--examples/datavisualization/qmllegend/main.cpp51
-rw-r--r--examples/datavisualization/qmllegend/qml/qmllegend/Data.qml78
-rw-r--r--examples/datavisualization/qmllegend/qml/qmllegend/LegendItem.qml118
-rw-r--r--examples/datavisualization/qmllegend/qml/qmllegend/NewButton.qml52
-rw-r--r--examples/datavisualization/qmllegend/qml/qmllegend/main.qml239
-rw-r--r--examples/datavisualization/qmllegend/qmllegend.desktop11
-rw-r--r--examples/datavisualization/qmllegend/qmllegend.pro23
-rw-r--r--examples/datavisualization/qmllegend/qmllegend.qrc8
-rw-r--r--examples/datavisualization/qmllegend/qmllegend64.pngbin0 -> 3400 bytes
-rw-r--r--examples/datavisualization/qmllegend/qtquick2applicationviewer/qtquick2applicationviewer.cpp81
-rw-r--r--examples/datavisualization/qmllegend/qtquick2applicationviewer/qtquick2applicationviewer.h33
-rw-r--r--examples/datavisualization/qmllegend/qtquick2applicationviewer/qtquick2applicationviewer.pri180
-rw-r--r--examples/datavisualization/qmlmultigraph/doc/images/qmlmultigraph-example.pngbin0 -> 82347 bytes
-rw-r--r--examples/datavisualization/qmlmultigraph/doc/src/qmlmultigraph.qdoc46
-rw-r--r--examples/datavisualization/qmlmultigraph/main.cpp50
-rw-r--r--examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/Data.qml48
-rw-r--r--examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/NewButton.qml52
-rw-r--r--examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/main.qml215
-rw-r--r--examples/datavisualization/qmlmultigraph/qmlmultigraph.desktop11
-rw-r--r--examples/datavisualization/qmlmultigraph/qmlmultigraph.pro20
-rw-r--r--examples/datavisualization/qmlmultigraph/qmlmultigraph.qrc7
-rw-r--r--examples/datavisualization/qmlmultigraph/qmlmultigraph64.pngbin0 -> 3400 bytes
-rw-r--r--examples/datavisualization/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.cpp81
-rw-r--r--examples/datavisualization/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.h33
-rw-r--r--examples/datavisualization/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.pri180
-rw-r--r--examples/datavisualization/qmloscilloscope/datasource.cpp166
-rw-r--r--examples/datavisualization/qmloscilloscope/datasource.h54
-rw-r--r--examples/datavisualization/qmloscilloscope/doc/images/qmloscilloscope-example.pngbin0 -> 235720 bytes
-rw-r--r--examples/datavisualization/qmloscilloscope/doc/src/qmloscilloscope.qdoc102
-rw-r--r--examples/datavisualization/qmloscilloscope/main.cpp58
-rw-r--r--examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/NewButton.qml52
-rw-r--r--examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml289
-rw-r--r--examples/datavisualization/qmloscilloscope/qmloscilloscope.desktop11
-rw-r--r--examples/datavisualization/qmloscilloscope/qmloscilloscope.pro24
-rw-r--r--examples/datavisualization/qmloscilloscope/qmloscilloscope.qrc6
-rw-r--r--examples/datavisualization/qmloscilloscope/qmloscilloscope64.pngbin0 -> 3400 bytes
-rw-r--r--examples/datavisualization/qmloscilloscope/qtquick2applicationviewer/qtquick2applicationviewer.cpp81
-rw-r--r--examples/datavisualization/qmloscilloscope/qtquick2applicationviewer/qtquick2applicationviewer.h33
-rw-r--r--examples/datavisualization/qmloscilloscope/qtquick2applicationviewer/qtquick2applicationviewer.pri180
-rw-r--r--examples/datavisualization/qmlscatter/doc/images/qmlscatter-example.pngbin0 -> 98086 bytes
-rw-r--r--examples/datavisualization/qmlscatter/doc/images/qmlscatter-newproject.pngbin0 -> 37045 bytes
-rw-r--r--examples/datavisualization/qmlscatter/doc/src/qmlscatter.qdoc190
-rw-r--r--examples/datavisualization/qmlscatter/main.cpp56
-rw-r--r--examples/datavisualization/qmlscatter/qml/qmlscatter/Data.qml1099
-rw-r--r--examples/datavisualization/qmlscatter/qml/qmlscatter/NewButton.qml52
-rw-r--r--examples/datavisualization/qmlscatter/qml/qmlscatter/main.qml229
-rw-r--r--examples/datavisualization/qmlscatter/qmlscatter.desktop11
-rw-r--r--examples/datavisualization/qmlscatter/qmlscatter.pro20
-rw-r--r--examples/datavisualization/qmlscatter/qmlscatter.qrc7
-rw-r--r--examples/datavisualization/qmlscatter/qmlscatter64.pngbin0 -> 3400 bytes
-rw-r--r--examples/datavisualization/qmlscatter/qtquick2applicationviewer/qtquick2applicationviewer.cpp81
-rw-r--r--examples/datavisualization/qmlscatter/qtquick2applicationviewer/qtquick2applicationviewer.h33
-rw-r--r--examples/datavisualization/qmlscatter/qtquick2applicationviewer/qtquick2applicationviewer.pri180
-rw-r--r--examples/datavisualization/qmlsurface/doc/images/qmlsurface-example.pngbin0 -> 195500 bytes
-rw-r--r--examples/datavisualization/qmlsurface/doc/src/qmlsurface.qdoc108
-rw-r--r--examples/datavisualization/qmlsurface/heightmap.pngbin0 -> 38634 bytes
-rw-r--r--examples/datavisualization/qmlsurface/main.cpp51
-rw-r--r--examples/datavisualization/qmlsurface/qml/qmlsurface/Data.qml10029
-rw-r--r--examples/datavisualization/qmlsurface/qml/qmlsurface/NewButton.qml52
-rw-r--r--examples/datavisualization/qmlsurface/qml/qmlsurface/main.qml250
-rw-r--r--examples/datavisualization/qmlsurface/qmlsurface.desktop11
-rw-r--r--examples/datavisualization/qmlsurface/qmlsurface.pro20
-rw-r--r--examples/datavisualization/qmlsurface/qmlsurface.qrc10
-rw-r--r--examples/datavisualization/qmlsurface/qmlsurface64.pngbin0 -> 3400 bytes
-rw-r--r--examples/datavisualization/qmlsurface/qtquick2applicationviewer/qtquick2applicationviewer.cpp81
-rw-r--r--examples/datavisualization/qmlsurface/qtquick2applicationviewer/qtquick2applicationviewer.h33
-rw-r--r--examples/datavisualization/qmlsurface/qtquick2applicationviewer/qtquick2applicationviewer.pri180
-rw-r--r--examples/datavisualization/qmlsurfacelayers/doc/images/qmlsurfacelayers-example.pngbin0 -> 86259 bytes
-rw-r--r--examples/datavisualization/qmlsurfacelayers/doc/src/qmlsurfacelayers.qdoc80
-rw-r--r--examples/datavisualization/qmlsurfacelayers/layer_1.pngbin0 -> 34540 bytes
-rw-r--r--examples/datavisualization/qmlsurfacelayers/layer_2.pngbin0 -> 13022 bytes
-rw-r--r--examples/datavisualization/qmlsurfacelayers/layer_3.pngbin0 -> 10553 bytes
-rw-r--r--examples/datavisualization/qmlsurfacelayers/main.cpp51
-rw-r--r--examples/datavisualization/qmlsurfacelayers/qml/qmlsurfacelayers/NewButton.qml52
-rw-r--r--examples/datavisualization/qmlsurfacelayers/qml/qmlsurfacelayers/main.qml234
-rw-r--r--examples/datavisualization/qmlsurfacelayers/qmlsurfacelayers.desktop11
-rw-r--r--examples/datavisualization/qmlsurfacelayers/qmlsurfacelayers.pro20
-rw-r--r--examples/datavisualization/qmlsurfacelayers/qmlsurfacelayers.qrc11
-rw-r--r--examples/datavisualization/qmlsurfacelayers/qmlsurfacelayers64.pngbin0 -> 3400 bytes
-rw-r--r--examples/datavisualization/qmlsurfacelayers/qtquick2applicationviewer/qtquick2applicationviewer.cpp81
-rw-r--r--examples/datavisualization/qmlsurfacelayers/qtquick2applicationviewer/qtquick2applicationviewer.h33
-rw-r--r--examples/datavisualization/qmlsurfacelayers/qtquick2applicationviewer/qtquick2applicationviewer.pri180
-rw-r--r--examples/datavisualization/rotations/doc/images/rotations-example.pngbin0 -> 69487 bytes
-rw-r--r--examples/datavisualization/rotations/doc/src/rotations.qdoc68
-rw-r--r--examples/datavisualization/rotations/main.cpp87
-rw-r--r--examples/datavisualization/rotations/mesh/largesphere.obj1938
-rw-r--r--examples/datavisualization/rotations/mesh/narrowarrow.obj413
-rw-r--r--examples/datavisualization/rotations/rotations.pro10
-rw-r--r--examples/datavisualization/rotations/rotations.qrc6
-rw-r--r--examples/datavisualization/rotations/scatterdatamodifier.cpp183
-rw-r--r--examples/datavisualization/rotations/scatterdatamodifier.h56
-rw-r--r--examples/datavisualization/scatter/doc/images/scatter-example.pngbin0 -> 142496 bytes
-rw-r--r--examples/datavisualization/scatter/doc/src/scatter.qdoc146
-rw-r--r--examples/datavisualization/scatter/main.cpp176
-rw-r--r--examples/datavisualization/scatter/scatter.pro8
-rw-r--r--examples/datavisualization/scatter/scatterdatamodifier.cpp203
-rw-r--r--examples/datavisualization/scatter/scatterdatamodifier.h69
-rw-r--r--examples/datavisualization/surface/doc/images/surface-example.pngbin0 -> 149046 bytes
-rw-r--r--examples/datavisualization/surface/doc/src/surface.qdoc136
-rw-r--r--examples/datavisualization/surface/main.cpp210
-rw-r--r--examples/datavisualization/surface/mountain.pngbin0 -> 34540 bytes
-rw-r--r--examples/datavisualization/surface/surface.pro12
-rw-r--r--examples/datavisualization/surface/surface.qrc5
-rw-r--r--examples/datavisualization/surface/surfacegraph.cpp265
-rw-r--r--examples/datavisualization/surface/surfacegraph.h88
179 files changed, 27489 insertions, 0 deletions
diff --git a/examples/datavisualization/audiolevels/audiolevels.cpp b/examples/datavisualization/audiolevels/audiolevels.cpp
new file mode 100644
index 00000000..18c1342a
--- /dev/null
+++ b/examples/datavisualization/audiolevels/audiolevels.cpp
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** 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 "audiolevelsiodevice.h"
+#include "audiolevels.h"
+
+#include <QtDataVisualization/qbardataproxy.h>
+#include <QtDataVisualization/qvalue3daxis.h>
+#include <QtDataVisualization/q3dscene.h>
+#include <QtDataVisualization/q3dcamera.h>
+#include <QtDataVisualization/qbar3dseries.h>
+#include <QtDataVisualization/q3dtheme.h>
+
+#include <QAudioDeviceInfo>
+#include <QAudioInput>
+
+using namespace QtDataVisualization;
+
+AudioLevels::AudioLevels(Q3DBars *graph, QObject *parent)
+ : QObject(parent),
+ m_graph(graph),
+ m_device(0),
+ m_audioInput(0)
+{
+ // Set up the graph
+ m_graph->setBarThickness(0.5f);
+ m_graph->setBarSpacing(QSizeF(0.0, 1.0));
+ m_graph->valueAxis()->setRange(-100.0f, 100.0f);
+ m_graph->valueAxis()->setSegmentCount(20);
+ m_graph->valueAxis()->setLabelFormat(QStringLiteral("%d%%"));
+ m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityNone);
+ m_graph->setSelectionMode(QAbstract3DGraph::SelectionNone);
+ m_graph->scene()->activeCamera()->setCameraPosition(-25.0f, 10.0f, 190.0f);
+ m_graph->activeTheme()->setType(Q3DTheme::ThemeIsabelle);
+ m_graph->activeTheme()->setGridEnabled(true);
+ m_graph->activeTheme()->setBackgroundEnabled(false);
+ QFont font = m_graph->activeTheme()->font();
+ font.setPointSize(10);
+ m_graph->activeTheme()->setFont(font);
+ QBar3DSeries *series = new QBar3DSeries;
+ series->setMesh(QAbstract3DSeries::MeshBar);
+ m_graph->addSeries(series);
+
+ //! [0]
+ QAudioDeviceInfo inputDevice = QAudioDeviceInfo::defaultInputDevice();
+
+ QAudioFormat formatAudio;
+ formatAudio.setSampleRate(inputDevice.supportedSampleRates().at(0));
+ formatAudio.setChannelCount(inputDevice.supportedChannelCounts().at(0));
+ formatAudio.setSampleSize(inputDevice.supportedSampleSizes().at(0));
+ formatAudio.setCodec(inputDevice.supportedCodecs().at(0));
+ formatAudio.setByteOrder(QAudioFormat::LittleEndian);
+ formatAudio.setSampleType(QAudioFormat::UnSignedInt);
+
+ m_audioInput = new QAudioInput(inputDevice, formatAudio, this);
+#ifdef Q_OS_MAC
+ // Mac seems to wait for entire buffer to fill before calling writeData, so use smaller buffer
+ m_audioInput->setBufferSize(256);
+#else
+ m_audioInput->setBufferSize(1024);
+#endif
+
+ m_device = new AudioLevelsIODevice(m_graph->seriesList().at(0)->dataProxy(), this);
+ m_device->open(QIODevice::WriteOnly);
+
+ m_audioInput->start(m_device);
+ //! [0]
+}
+
+AudioLevels::~AudioLevels()
+{
+ m_audioInput->stop();
+ m_device->close();
+}
diff --git a/examples/datavisualization/audiolevels/audiolevels.h b/examples/datavisualization/audiolevels/audiolevels.h
new file mode 100644
index 00000000..84d9b4c4
--- /dev/null
+++ b/examples/datavisualization/audiolevels/audiolevels.h
@@ -0,0 +1,45 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+#ifndef AUDIOLEVELS_H
+#define AUDIOLEVELS_H
+
+#include <QtDataVisualization/q3dbars.h>
+
+using namespace QtDataVisualization;
+
+class AudioLevelsIODevice;
+class QAudioInput;
+
+class AudioLevels : public QObject
+{
+ Q_OBJECT
+
+public:
+ AudioLevels(Q3DBars *graph, QObject *parent = 0);
+ ~AudioLevels();
+
+private:
+ //! [0]
+ Q3DBars *m_graph;
+ AudioLevelsIODevice *m_device;
+ QAudioInput *m_audioInput;
+ //! [0]
+};
+
+#endif
diff --git a/examples/datavisualization/audiolevels/audiolevels.pro b/examples/datavisualization/audiolevels/audiolevels.pro
new file mode 100644
index 00000000..46f01635
--- /dev/null
+++ b/examples/datavisualization/audiolevels/audiolevels.pro
@@ -0,0 +1,14 @@
+!include( ../examples.pri ) {
+ error( "Couldn't find the examples.pri file!" )
+}
+
+TARGET = audiolevels
+
+QT += multimedia
+
+SOURCES += main.cpp \
+ audiolevels.cpp \
+ audiolevelsiodevice.cpp
+
+HEADERS += audiolevels.h \
+ audiolevelsiodevice.h
diff --git a/examples/datavisualization/audiolevels/audiolevelsiodevice.cpp b/examples/datavisualization/audiolevels/audiolevelsiodevice.cpp
new file mode 100644
index 00000000..c0cd70e3
--- /dev/null
+++ b/examples/datavisualization/audiolevels/audiolevelsiodevice.cpp
@@ -0,0 +1,103 @@
+/****************************************************************************
+**
+** 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 "audiolevelsiodevice.h"
+#include <QDebug>
+
+using namespace QtDataVisualization;
+
+//! [1]
+static const int resolution = 8;
+static const int rowSize = 800;
+static const int rowCount = 7; // Must be odd number
+static const int middleRow = rowCount / 2;
+//! [1]
+
+AudioLevelsIODevice::AudioLevelsIODevice(QBarDataProxy *proxy, QObject *parent)
+ : QIODevice(parent),
+ m_proxy(proxy),
+ m_array(new QBarDataArray)
+{
+ // We reuse the existing array for maximum performance, so construct the array here
+ //! [0]
+ m_array->reserve(rowCount);
+ for (int i = 0; i < rowCount; i++)
+ m_array->append(new QBarDataRow(rowSize));
+ //! [0]
+
+ qDebug() << "Total of" << (rowSize * rowCount) << "items in the array.";
+}
+
+// Implementation required for this pure virtual function
+qint64 AudioLevelsIODevice::readData(char *data, qint64 maxSize)
+{
+ Q_UNUSED(data)
+ Q_UNUSED(maxSize)
+ return -1;
+}
+
+//! [2]
+qint64 AudioLevelsIODevice::writeData(const char *data, qint64 maxSize)
+{
+ // The amount of new data available.
+ int newDataSize = maxSize / resolution;
+
+ // If we get more data than array size, we need to adjust the start index for new data.
+ int newDataStartIndex = qMax(0, (newDataSize - rowSize));
+
+ // Move the old data ahead in the rows (only do first half of rows + middle one now).
+ // If the amount of new data was larger than row size, skip copying.
+ if (!newDataStartIndex) {
+ for (int i = 0; i <= middleRow; i++) {
+ QBarDataItem *srcPos = m_array->at(i)->data();
+ QBarDataItem *dstPos = srcPos + newDataSize;
+ memmove((void *)dstPos, (void *)srcPos, (rowSize - newDataSize) * sizeof(QBarDataItem));
+ }
+ }
+
+ // Insert data in reverse order, so that newest data is always at the front of the row.
+ int index = 0;
+ for (int i = newDataSize - 1; i >= newDataStartIndex; i--) {
+ // Add 0.01 to the value to avoid gaps in the graph (i.e. zero height bars).
+ // Also, scale to 0...100
+ float value = float(quint8(data[resolution * i]) - 128) / 1.28f + 0.01f;
+ (*m_array->at(middleRow))[index].setValue(value);
+ // Insert a fractional value into front half of the rows.
+ for (int j = 1; j <= middleRow; j++) {
+ float fractionalValue = value / float(j + 1);
+ (*m_array->at(middleRow - j))[index].setValue(fractionalValue);
+ }
+ index++;
+ }
+
+ // Copy the front half of rows to the back half for symmetry.
+ index = 0;
+ for (int i = rowCount - 1; i > middleRow; i--) {
+ QBarDataItem *srcPos = m_array->at(index++)->data();
+ QBarDataItem *dstPos = m_array->at(i)->data();
+ memcpy((void *)dstPos, (void *)srcPos, rowSize * sizeof(QBarDataItem));
+ }
+
+ // Reset the proxy array now that data has been updated to trigger a redraw.
+ m_proxy->resetArray(m_array);
+
+ return maxSize;
+}
+//! [2]
+
+
diff --git a/examples/datavisualization/audiolevels/audiolevelsiodevice.h b/examples/datavisualization/audiolevels/audiolevelsiodevice.h
new file mode 100644
index 00000000..45f17626
--- /dev/null
+++ b/examples/datavisualization/audiolevels/audiolevelsiodevice.h
@@ -0,0 +1,44 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+#ifndef AUDIOLEVELSIODEVICE_H
+#define AUDIOLEVELSIODEVICE_H
+
+#include <QtDataVisualization/qbardataproxy.h>
+#include <QIODevice>
+
+using namespace QtDataVisualization;
+
+class AudioLevelsIODevice : public QIODevice
+{
+ Q_OBJECT
+public:
+ explicit AudioLevelsIODevice(QBarDataProxy *proxy, QObject *parent = 0);
+
+protected:
+ qint64 readData(char *data, qint64 maxSize);
+ qint64 writeData(const char *data, qint64 maxSize);
+
+private:
+ //! [0]
+ QBarDataProxy *m_proxy;
+ QBarDataArray *m_array;
+ //! [0]
+};
+
+#endif
diff --git a/examples/datavisualization/audiolevels/doc/images/audiolevels-example.png b/examples/datavisualization/audiolevels/doc/images/audiolevels-example.png
new file mode 100644
index 00000000..ec79eb5a
--- /dev/null
+++ b/examples/datavisualization/audiolevels/doc/images/audiolevels-example.png
Binary files differ
diff --git a/examples/datavisualization/audiolevels/doc/src/audiolevels.qdoc b/examples/datavisualization/audiolevels/doc/src/audiolevels.qdoc
new file mode 100644
index 00000000..ad87ecc0
--- /dev/null
+++ b/examples/datavisualization/audiolevels/doc/src/audiolevels.qdoc
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+/*!
+ \example audiolevels
+ \title Audiolevels Example
+ \ingroup qtdatavisualization_examples
+ \brief Simple application showing real time audio data.
+
+ The audiolevels example shows how feed real-time dynamic data to a graph using Q3DBars.
+
+ This example reads the audio levels from a microphone and displays those levels
+ in a bar graph. To increase the load for demonstration purposes, and to make the
+ graph little fancier, slightly modified data is used to fill multiple rows.
+
+ \image audiolevels-example.png
+
+ The interesting stuff happens in \c AudioLevels and \c AudioLevelsIODevice classes, so we
+ concentrate on those and skip explaining the basic Q3DBars functionality - for that see
+ \l{Bars Example}.
+
+ \c AudioLevelsIODevice subclasses QIODevice and is given as input device for QAudioInput
+ class, so it receives microphone data.
+
+ In the header file for \c AudioLevels class we declare necessary members:
+
+ \snippet ../examples/audiolevels/audiolevels.h 0
+
+ And initialize the microphone listening in the source:
+
+ \snippet ../examples/audiolevels/audiolevels.cpp 0
+
+ In the header file for \c AudioLevelsIODevice class we store pointers to the data proxy and
+ also the data array we give to the proxy, because we reuse the same array to keep memory
+ reallocations to the minimum:
+
+ \snippet ../examples/audiolevels/audiolevelsiodevice.h 0
+
+ In the source file we define some static constants to define size of the data array and
+ the middle row index, as well as the resolution of the visualization. You may need to adjust
+ these values to get decent performance in low-end devices:
+
+ \snippet ../examples/audiolevels/audiolevelsiodevice.cpp 1
+
+ The \c resolution constant indicates the sample rate, for example, value 8 means every eighth
+ byte from audio input is visualized. This is necessary to make the data readable, as it would
+ otherwise make the graph scroll too fast.
+
+ In the \c AudioLevelsIODevice class constructor we initialize the data array:
+
+ \snippet ../examples/audiolevels/audiolevelsiodevice.cpp 0
+
+ The \c AudioLevelsIODevice::writeData function is called whenever there is new audio data
+ available to be visualized. There we move the old data along the rows and insert new
+ data in the beginning of the rows:
+
+ \snippet ../examples/audiolevels/audiolevelsiodevice.cpp 2
+
+ We use a couple of techniques here to improve performance. First, we reuse
+ the existing data array, as this allows us to avoid any extra memory allocations in our
+ application code. This also means the data array dimensions do not change, which further
+ improves efficiency in the bar graph renderer.
+ Secondly, since each row is a QVector of bar data items, which do not allocate any data that needs
+ deletion, we can utilize \c memmove and \c memcpy functions to quickly move and copy data around.
+
+ \note In the future versions of Qt Data Visualization, QBarDataItem might get extended so that
+ it does allocate some memory to store other optional bar properties besides the value.
+ In use cases where those optional properties are used, using \c memmove and \c memcpy could lead to
+ memory leaks, so use them with care.
+*/
diff --git a/examples/datavisualization/audiolevels/main.cpp b/examples/datavisualization/audiolevels/main.cpp
new file mode 100644
index 00000000..9dd07b1b
--- /dev/null
+++ b/examples/datavisualization/audiolevels/main.cpp
@@ -0,0 +1,39 @@
+/****************************************************************************
+**
+** 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 "audiolevels.h"
+
+#include <QGuiApplication>
+#include <QAudio>
+
+using namespace QtDataVisualization;
+
+int main(int argc, char *argv[])
+{
+ QGuiApplication app(argc, argv);
+
+ Q3DBars window;
+ window.setFlags(window.flags() ^ Qt::FramelessWindowHint);
+ window.resize(800, 500);
+ window.setTitle("Qt Data Visualization - Microphone audio levels visualizer");
+ window.show();
+
+ AudioLevels audioLevels(&window);
+
+ return app.exec();
+}
diff --git a/examples/datavisualization/bars/bars.pro b/examples/datavisualization/bars/bars.pro
new file mode 100644
index 00000000..5de4626a
--- /dev/null
+++ b/examples/datavisualization/bars/bars.pro
@@ -0,0 +1,8 @@
+!include( ../examples.pri ) {
+ error( "Couldn't find the examples.pri file!" )
+}
+
+SOURCES += main.cpp graphmodifier.cpp
+HEADERS += graphmodifier.h
+
+QT += widgets
diff --git a/examples/datavisualization/bars/doc/images/bars-example.png b/examples/datavisualization/bars/doc/images/bars-example.png
new file mode 100644
index 00000000..5bd2c7d9
--- /dev/null
+++ b/examples/datavisualization/bars/doc/images/bars-example.png
Binary files differ
diff --git a/examples/datavisualization/bars/doc/src/bars.qdoc b/examples/datavisualization/bars/doc/src/bars.qdoc
new file mode 100644
index 00000000..3cfc72b1
--- /dev/null
+++ b/examples/datavisualization/bars/doc/src/bars.qdoc
@@ -0,0 +1,172 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+/*!
+ \example bars
+ \title Bars Example
+ \ingroup qtdatavisualization_examples
+ \brief Using Q3DBars in a widget application.
+
+ The bars example shows how to make a 3D bar graph using Q3DBars and combining the use of
+ widgets for adjusting several adjustable qualities. The example shows how to:
+
+ \list
+ \li Create an application with Q3DBars and some widgets
+ \li Use QBar3DSeries and QBarDataProxy to set data to the graph
+ \li Adjust some graph and series properties using widget controls
+ \endlist
+
+ It also demonstrates how having negative bar values affects the graph.
+
+ For instructions about how to interact with the graph, see \l{Qt Data Visualization Interacting with Data}{this page}.
+
+ \image bars-example.png
+
+ \section1 Creating the application
+
+ First, in main.cpp, we create a QApplication, instantiate Q3DBars and a window container
+ for it:
+
+ \snippet ../examples/bars/main.cpp 0
+
+ The call to QWidget::createWindowContainer is required, as all data visualization types
+ (Q3DBars, Q3DScatter, Q3DSurface) inherit QWindow. Any class inheriting QWindow cannot be used
+ as a widget any other way.
+
+ Then we'll create horizontal and vertical layouts. We'll add the graph and the vertical
+ layout into the horizontal one:
+
+ \snippet ../examples/bars/main.cpp 1
+
+ We're not using the vertical layout for anything yet, but we'll get back to it in
+ \l {Using widgets to control the graph}
+
+ Next, let's create another class to handle the data addition and other interaction with the
+ graph. Let's call it \c GraphModifier (See \l {Setting up the graph} and
+ \l {Adding data to the graph} for details):
+
+ \snippet ../examples/bars/main.cpp 2
+
+ The application main is done and we can show the graph and start the event loop:
+
+ \snippet ../examples/bars/main.cpp 3
+
+ \section1 Setting up the graph
+
+ Let's set up the graph in the constructor of the \c GraphModifier class we instantiated in the
+ application main:
+
+ \snippet ../examples/bars/graphmodifier.cpp 0
+
+ Let's take a closer look at parts of the code.
+
+ First we're creating the axes and the series into member variables to support changing them
+ easily later on, if we want to:
+
+ \snippet ../examples/bars/graphmodifier.cpp 1
+
+ Then we're setting some of the visual qualities for the graph:
+
+ \snippet ../examples/bars/graphmodifier.cpp 2
+
+ We're also setting up the axes and setting them to the graph as active axes:
+
+ \snippet ../examples/bars/graphmodifier.cpp 3
+
+ Next we initialize the visual properties of the series.
+ Note that the second series is initially not visible:
+
+ \snippet ../examples/bars/graphmodifier.cpp 8
+
+ The series need to be added to the graph to show them:
+
+ \snippet ../examples/bars/graphmodifier.cpp 4
+
+ Finally, we set the camera angle by calling the same method the camera angle change button
+ in the UI uses to cycle through various camera angles:
+
+ \snippet ../examples/bars/graphmodifier.cpp 6
+
+ There you can see that the camera is controlled via the scene object of the graph:
+
+ \snippet ../examples/bars/graphmodifier.cpp 10
+
+ For more information about using scene and cameras, see Q3DScene and Q3DCamera.
+
+ That concludes setting up the graph.
+
+ \section1 Adding data to the graph
+
+ At the end of the constructor there's a call:
+
+ \snippet ../examples/bars/graphmodifier.cpp 9
+
+ This method is used to add data to the proxies of the two series:
+
+ \snippet ../examples/bars/graphmodifier.cpp 5
+
+ Now the series have data to show.
+
+ \section1 Using widgets to control the graph
+
+ There isn't much interaction yet, so let's continue by adding some widgets back in the
+ application main. Let's just focus on two as an example:
+
+ \snippet ../examples/bars/main.cpp 4
+
+ We can use these slider widgets to rotate the graph instead of just using the mouse or
+ touch.
+
+ Let's add them to the vertical layout we created earlier:
+
+ \snippet ../examples/bars/main.cpp 5
+
+ Then we'll connect them to methods in \c GraphModifier:
+
+ \snippet ../examples/bars/main.cpp 6
+
+ Here are the methods in \c GraphModifier the signals were connected to. The camera
+ is controlled via the scene object. This time we specify the actual camera position
+ along the orbit around the center point, instead of specifying a preset camera angle:
+
+ \snippet ../examples/bars/graphmodifier.cpp 7
+
+ Now these two sliders can be used to rotate the graph.
+
+ And so we have an application in which we can control:
+
+ \list
+ \li Graph rotation
+ \li Label style
+ \li Camera preset
+ \li Background visibility
+ \li Grid visibility
+ \li Bar shading smoothness
+ \li Visibility of the second bar series
+ \li Data range to be shown
+ \li Bar style
+ \li Selection mode
+ \li Theme
+ \li Shadow quality
+ \li Font
+ \li Font size
+ \endlist
+
+ \section1 Example contents
+
+*/
diff --git a/examples/datavisualization/bars/graphmodifier.cpp b/examples/datavisualization/bars/graphmodifier.cpp
new file mode 100644
index 00000000..55f52580
--- /dev/null
+++ b/examples/datavisualization/bars/graphmodifier.cpp
@@ -0,0 +1,280 @@
+/****************************************************************************
+**
+** 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 "graphmodifier.h"
+#include <QtDataVisualization/qcategory3daxis.h>
+#include <QtDataVisualization/qvalue3daxis.h>
+#include <QtDataVisualization/qbardataproxy.h>
+#include <QtDataVisualization/q3dscene.h>
+#include <QtDataVisualization/q3dcamera.h>
+#include <QtDataVisualization/qbar3dseries.h>
+#include <QtDataVisualization/q3dtheme.h>
+#include <QTime>
+#include <QComboBox>
+
+using namespace QtDataVisualization;
+
+const QString celsiusString = QString(QChar(0xB0)) + "C";
+
+//! [0]
+GraphModifier::GraphModifier(Q3DBars *bargraph)
+ : m_graph(bargraph),
+ m_xRotation(0.0f),
+ m_yRotation(0.0f),
+ m_fontSize(30),
+ m_segments(4),
+ m_subSegments(3),
+ m_minval(-20.0f),
+ m_maxval(20.0f),
+ //! [1]
+ m_temperatureAxis(new QValue3DAxis),
+ m_yearAxis(new QCategory3DAxis),
+ m_monthAxis(new QCategory3DAxis),
+ m_primarySeries(new QBar3DSeries),
+ m_secondarySeries(new QBar3DSeries),
+ //! [1]
+ m_barMesh(QAbstract3DSeries::MeshBevelBar),
+ m_smooth(false)
+{
+ //! [2]
+ m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualitySoftMedium);
+ m_graph->activeTheme()->setBackgroundEnabled(false);
+ m_graph->activeTheme()->setFont(QFont("Times New Roman", m_fontSize));
+ m_graph->activeTheme()->setLabelBackgroundEnabled(true);
+ m_graph->setMultiSeriesUniform(true);
+ //! [2]
+
+ m_months << "January" << "February" << "March" << "April" << "May" << "June" << "July" << "August" << "September" << "October" << "November" << "December";
+ m_years << "2006" << "2007" << "2008" << "2009" << "2010" << "2011" << "2012" << "2013";
+
+ //! [3]
+ m_temperatureAxis->setTitle("Average temperature");
+ m_temperatureAxis->setSegmentCount(m_segments);
+ m_temperatureAxis->setSubSegmentCount(m_subSegments);
+ m_temperatureAxis->setRange(m_minval, m_maxval);
+ m_temperatureAxis->setLabelFormat(QString(QStringLiteral("%.1f ") + celsiusString));
+
+ m_yearAxis->setTitle("Year");
+ m_monthAxis->setTitle("Month");
+
+ m_graph->setValueAxis(m_temperatureAxis);
+ m_graph->setRowAxis(m_yearAxis);
+ m_graph->setColumnAxis(m_monthAxis);
+ //! [3]
+
+ //! [8]
+ m_primarySeries->setItemLabelFormat(QStringLiteral("Oulu - @colLabel @rowLabel: @valueLabel"));
+ m_primarySeries->setMesh(QAbstract3DSeries::MeshBevelBar);
+ m_primarySeries->setMeshSmooth(false);
+
+ m_secondarySeries->setItemLabelFormat(QStringLiteral("Helsinki - @colLabel @rowLabel: @valueLabel"));
+ m_secondarySeries->setMesh(QAbstract3DSeries::MeshBevelBar);
+ m_secondarySeries->setMeshSmooth(false);
+ m_secondarySeries->setVisible(false);
+ //! [8]
+
+ //! [4]
+ m_graph->addSeries(m_primarySeries);
+ m_graph->addSeries(m_secondarySeries);
+ //! [4]
+
+ //! [6]
+ changePresetCamera();
+ //! [6]
+
+ //! [9]
+ resetTemperatureData();
+ //! [9]
+}
+//! [0]
+
+GraphModifier::~GraphModifier()
+{
+ delete m_graph;
+}
+
+void GraphModifier::resetTemperatureData()
+{
+ //! [5]
+ // Set up data
+ static const float tempOulu[8][12] = {
+ {-6.7f, -11.7f, -9.7f, 3.3f, 9.2f, 14.0f, 16.3f, 17.8f, 10.2f, 2.1f, -2.6f, -0.3f}, // 2006
+ {-6.8f, -13.3f, 0.2f, 1.5f, 7.9f, 13.4f, 16.1f, 15.5f, 8.2f, 5.4f, -2.6f, -0.8f}, // 2007
+ {-4.2f, -4.0f, -4.6f, 1.9f, 7.3f, 12.5f, 15.0f, 12.8f, 7.6f, 5.1f, -0.9f, -1.3f}, // 2008
+ {-7.8f, -8.8f, -4.2f, 0.7f, 9.3f, 13.2f, 15.8f, 15.5f, 11.2f, 0.6f, 0.7f, -8.4f}, // 2009
+ {-14.4f, -12.1f, -7.0f, 2.3f, 11.0f, 12.6f, 18.8f, 13.8f, 9.4f, 3.9f, -5.6f, -13.0f}, // 2010
+ {-9.0f, -15.2f, -3.8f, 2.6f, 8.3f, 15.9f, 18.6f, 14.9f, 11.1f, 5.3f, 1.8f, -0.2f}, // 2011
+ {-8.7f, -11.3f, -2.3f, 0.4f, 7.5f, 12.2f, 16.4f, 14.1f, 9.2f, 3.1f, 0.3f, -12.1f}, // 2012
+ {-7.9f, -5.3f, -9.1f, 0.8f, 11.6f, 16.6f, 15.9f, 15.5f, 11.2f, 4.0f, 0.1f, -1.9f} // 2013
+ };
+
+ static const float tempHelsinki[8][12] = {
+ {-3.7f, -7.8f, -5.4f, 3.4f, 10.7f, 15.4f, 18.6f, 18.7f, 14.3f, 8.5f, 2.9f, 4.1f}, // 2006
+ {-1.2f, -7.5f, 3.1f, 5.5f, 10.3f, 15.9f, 17.4f, 17.9f, 11.2f, 7.3f, 1.1f, 0.5f}, // 2007
+ {-0.6f, 1.2f, 0.2f, 6.3f, 10.2f, 13.8f, 18.1f, 15.1f, 10.1f, 9.4f, 2.5f, 0.4f}, // 2008
+ {-2.9f, -3.5f, -0.9f, 4.7f, 10.9f, 14.0f, 17.4f, 16.8f, 13.2f, 4.1f, 2.6f, -2.3f}, // 2009
+ {-10.2f, -8.0f, -1.9f, 6.6f, 11.3f, 14.5f, 21.0f, 18.8f, 12.6f, 6.1f, -0.5f, -7.3f}, // 2010
+ {-4.4f, -9.1f, -2.0f, 5.5f, 9.9f, 15.6f, 20.8f, 17.8f, 13.4f, 8.9f, 3.6f, 1.5f}, // 2011
+ {-3.5f, -3.2f, -0.7f, 4.0f, 11.1f, 13.4f, 17.3f, 15.8f, 13.1f, 6.4f, 4.1f, -5.1f}, // 2012
+ {-4.8f, -1.8f, -5.0f, 2.9f, 12.8f, 17.2f, 18.0f, 17.1f, 12.5f, 7.5f, 4.5f, 2.3f} // 2013
+ };
+
+ // Create data arrays
+ QBarDataArray *dataSet = new QBarDataArray;
+ QBarDataArray *dataSet2 = new QBarDataArray;
+ QBarDataRow *dataRow;
+ QBarDataRow *dataRow2;
+
+ dataSet->reserve(m_years.size());
+ for (int year = 0; year < m_years.size(); year++) {
+ // Create a data row
+ dataRow = new QBarDataRow(m_months.size());
+ dataRow2 = new QBarDataRow(m_months.size());
+ for (int month = 0; month < m_months.size(); month++) {
+ // Add data to the row
+ (*dataRow)[month].setValue(tempOulu[year][month]);
+ (*dataRow2)[month].setValue(tempHelsinki[year][month]);
+ }
+ // Add the row to the set
+ dataSet->append(dataRow);
+ dataSet2->append(dataRow2);
+ }
+
+ // Add data to the data proxy (the data proxy assumes ownership of it)
+ m_primarySeries->dataProxy()->resetArray(dataSet, m_years, m_months);
+ m_secondarySeries->dataProxy()->resetArray(dataSet2, m_years, m_months);
+ //! [5]
+}
+
+void GraphModifier::changeRange(int range)
+{
+ if (range >= m_years.count())
+ m_yearAxis->setRange(0, m_years.count() - 1);
+ else
+ m_yearAxis->setRange(range, range);
+}
+
+void GraphModifier::changeStyle(int style)
+{
+ QComboBox *comboBox = qobject_cast<QComboBox *>(sender());
+ if (comboBox) {
+ m_barMesh = QAbstract3DSeries::Mesh(comboBox->itemData(style).toInt());
+ m_primarySeries->setMesh(m_barMesh);
+ m_secondarySeries->setMesh(m_barMesh);
+ }
+}
+
+void GraphModifier::changePresetCamera()
+{
+ //! [10]
+ static int preset = Q3DCamera::CameraPresetFront;
+
+ m_graph->scene()->activeCamera()->setCameraPreset((Q3DCamera::CameraPreset)preset);
+
+ if (++preset > Q3DCamera::CameraPresetDirectlyBelow)
+ preset = Q3DCamera::CameraPresetFrontLow;
+ //! [10]
+}
+
+void GraphModifier::changeTheme(int theme)
+{
+ Q3DTheme *currentTheme = m_graph->activeTheme();
+ currentTheme->setType(Q3DTheme::Theme(theme));
+ emit backgroundEnabledChanged(currentTheme->isBackgroundEnabled());
+ emit gridEnabledChanged(currentTheme->isGridEnabled());
+ emit fontChanged(currentTheme->font());
+ emit fontSizeChanged(currentTheme->font().pointSize());
+}
+
+void GraphModifier::changeLabelBackground()
+{
+ m_graph->activeTheme()->setLabelBackgroundEnabled(!m_graph->activeTheme()->isLabelBackgroundEnabled());
+}
+
+void GraphModifier::changeSelectionMode(int selectionMode)
+{
+ QComboBox *comboBox = qobject_cast<QComboBox *>(sender());
+ if (comboBox) {
+ int flags = comboBox->itemData(selectionMode).toInt();
+ m_graph->setSelectionMode(QAbstract3DGraph::SelectionFlags(flags));
+ }
+}
+
+void GraphModifier::changeFont(const QFont &font)
+{
+ QFont newFont = font;
+ m_graph->activeTheme()->setFont(newFont);
+}
+
+void GraphModifier::changeFontSize(int fontsize)
+{
+ m_fontSize = fontsize;
+ QFont font = m_graph->activeTheme()->font();
+ font.setPointSize(m_fontSize);
+ m_graph->activeTheme()->setFont(font);
+}
+
+void GraphModifier::shadowQualityUpdatedByVisual(QAbstract3DGraph::ShadowQuality sq)
+{
+ int quality = int(sq);
+ // Updates the UI component to show correct shadow quality
+ emit shadowQualityChanged(quality);
+}
+
+void GraphModifier::changeShadowQuality(int quality)
+{
+ QAbstract3DGraph::ShadowQuality sq = QAbstract3DGraph::ShadowQuality(quality);
+ m_graph->setShadowQuality(sq);
+ emit shadowQualityChanged(quality);
+}
+
+//! [7]
+void GraphModifier::rotateX(int rotation)
+{
+ m_xRotation = rotation;
+ m_graph->scene()->activeCamera()->setCameraPosition(m_xRotation, m_yRotation);
+}
+
+void GraphModifier::rotateY(int rotation)
+{
+ m_yRotation = rotation;
+ m_graph->scene()->activeCamera()->setCameraPosition(m_xRotation, m_yRotation);
+}
+//! [7]
+
+void GraphModifier::setBackgroundEnabled(int enabled)
+{
+ m_graph->activeTheme()->setBackgroundEnabled(bool(enabled));
+}
+
+void GraphModifier::setGridEnabled(int enabled)
+{
+ m_graph->activeTheme()->setGridEnabled(bool(enabled));
+}
+
+void GraphModifier::setSmoothBars(int smooth)
+{
+ m_smooth = bool(smooth);
+ m_primarySeries->setMeshSmooth(m_smooth);
+ m_secondarySeries->setMeshSmooth(m_smooth);
+}
+
+void GraphModifier::setSeriesVisibility(int enabled)
+{
+ m_secondarySeries->setVisible(bool(enabled));
+}
diff --git a/examples/datavisualization/bars/graphmodifier.h b/examples/datavisualization/bars/graphmodifier.h
new file mode 100644
index 00000000..674c3262
--- /dev/null
+++ b/examples/datavisualization/bars/graphmodifier.h
@@ -0,0 +1,87 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+#ifndef GRAPHMODIFIER_H
+#define GRAPHMODIFIER_H
+
+#include <QtDataVisualization/q3dbars.h>
+#include <QtDataVisualization/qbardataproxy.h>
+#include <QtDataVisualization/qabstract3dseries.h>
+
+#include <QFont>
+#include <QDebug>
+#include <QStringList>
+#include <QPointer>
+
+using namespace QtDataVisualization;
+
+class GraphModifier : public QObject
+{
+ Q_OBJECT
+public:
+ explicit GraphModifier(Q3DBars *bargraph);
+ ~GraphModifier();
+
+ void resetTemperatureData();
+ void changePresetCamera();
+ void changeLabelBackground();
+ void changeFont(const QFont &font);
+ void changeFontSize(int fontsize);
+ void rotateX(int rotation);
+ void rotateY(int rotation);
+ void setBackgroundEnabled(int enabled);
+ void setGridEnabled(int enabled);
+ void setSmoothBars(int smooth);
+ void setSeriesVisibility(int enabled);
+
+public slots:
+ void changeRange(int range);
+ void changeStyle(int style);
+ void changeSelectionMode(int selectionMode);
+ void changeTheme(int theme);
+ void changeShadowQuality(int quality);
+ void shadowQualityUpdatedByVisual(QAbstract3DGraph::ShadowQuality shadowQuality);
+
+signals:
+ void shadowQualityChanged(int quality);
+ void backgroundEnabledChanged(bool enabled);
+ void gridEnabledChanged(bool enabled);
+ void fontChanged(QFont font);
+ void fontSizeChanged(int size);
+
+private:
+ Q3DBars *m_graph;
+ float m_xRotation;
+ float m_yRotation;
+ int m_fontSize;
+ int m_segments;
+ int m_subSegments;
+ float m_minval;
+ float m_maxval;
+ QStringList m_months;
+ QStringList m_years;
+ QValue3DAxis *m_temperatureAxis;
+ QCategory3DAxis *m_yearAxis;
+ QCategory3DAxis *m_monthAxis;
+ QBar3DSeries *m_primarySeries;
+ QBar3DSeries *m_secondarySeries;
+ QAbstract3DSeries::Mesh m_barMesh;
+ bool m_smooth;
+};
+
+#endif
diff --git a/examples/datavisualization/bars/main.cpp b/examples/datavisualization/bars/main.cpp
new file mode 100644
index 00000000..f04e501d
--- /dev/null
+++ b/examples/datavisualization/bars/main.cpp
@@ -0,0 +1,271 @@
+/****************************************************************************
+**
+** 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 "graphmodifier.h"
+
+#include <QApplication>
+#include <QWidget>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QPushButton>
+#include <QCheckBox>
+#include <QSlider>
+#include <QFontComboBox>
+#include <QLabel>
+#include <QScreen>
+#include <QFontDatabase>
+
+int main(int argc, char **argv)
+{
+ //! [0]
+ QApplication app(argc, argv);
+ Q3DBars *widgetgraph = new Q3DBars();
+ QWidget *container = QWidget::createWindowContainer(widgetgraph);
+ //! [0]
+
+ QSize screenSize = widgetgraph->screen()->size();
+ container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 1.5));
+ container->setMaximumSize(screenSize);
+ container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ container->setFocusPolicy(Qt::StrongFocus);
+
+ //! [1]
+ QWidget *widget = new QWidget;
+ QHBoxLayout *hLayout = new QHBoxLayout(widget);
+ QVBoxLayout *vLayout = new QVBoxLayout();
+ hLayout->addWidget(container, 1);
+ hLayout->addLayout(vLayout);
+ //! [1]
+
+ widget->setWindowTitle(QStringLiteral("Average temperatures in Oulu and Helsinki, Finland (2006-2013)"));
+
+ QComboBox *themeList = new QComboBox(widget);
+ themeList->addItem(QStringLiteral("Qt"));
+ themeList->addItem(QStringLiteral("Primary Colors"));
+ themeList->addItem(QStringLiteral("Digia"));
+ themeList->addItem(QStringLiteral("Stone Moss"));
+ themeList->addItem(QStringLiteral("Army Blue"));
+ themeList->addItem(QStringLiteral("Retro"));
+ themeList->addItem(QStringLiteral("Ebony"));
+ themeList->addItem(QStringLiteral("Isabelle"));
+ themeList->setCurrentIndex(0);
+
+ QPushButton *labelButton = new QPushButton(widget);
+ labelButton->setText(QStringLiteral("Change label style"));
+
+ QCheckBox *smoothCheckBox = new QCheckBox(widget);
+ smoothCheckBox->setText(QStringLiteral("Smooth bars"));
+ smoothCheckBox->setChecked(false);
+
+ QComboBox *barStyleList = new QComboBox(widget);
+ barStyleList->addItem(QStringLiteral("Bar"), int(QAbstract3DSeries::MeshBar));
+ barStyleList->addItem(QStringLiteral("Pyramid"), int(QAbstract3DSeries::MeshPyramid));
+ barStyleList->addItem(QStringLiteral("Cone"), int(QAbstract3DSeries::MeshCone));
+ barStyleList->addItem(QStringLiteral("Cylinder"), int(QAbstract3DSeries::MeshCylinder));
+ barStyleList->addItem(QStringLiteral("Bevel bar"), int(QAbstract3DSeries::MeshBevelBar));
+ barStyleList->addItem(QStringLiteral("Sphere"), int(QAbstract3DSeries::MeshSphere));
+ barStyleList->setCurrentIndex(4);
+
+ QPushButton *cameraButton = new QPushButton(widget);
+ cameraButton->setText(QStringLiteral("Change camera preset"));
+
+ QComboBox *selectionModeList = new QComboBox(widget);
+ selectionModeList->addItem(QStringLiteral("None"),
+ int(QAbstract3DGraph::SelectionNone));
+ selectionModeList->addItem(QStringLiteral("Bar"),
+ int(QAbstract3DGraph::SelectionItem));
+ selectionModeList->addItem(QStringLiteral("Row"),
+ int(QAbstract3DGraph::SelectionRow));
+ selectionModeList->addItem(QStringLiteral("Bar and Row"),
+ int(QAbstract3DGraph::SelectionItemAndRow));
+ selectionModeList->addItem(QStringLiteral("Column"),
+ int(QAbstract3DGraph::SelectionColumn));
+ selectionModeList->addItem(QStringLiteral("Bar and Column"),
+ int(QAbstract3DGraph::SelectionItemAndColumn));
+ selectionModeList->addItem(QStringLiteral("Row and Column"),
+ int(QAbstract3DGraph::SelectionRowAndColumn));
+ selectionModeList->addItem(QStringLiteral("Bar, Row and Column"),
+ int(QAbstract3DGraph::SelectionItemRowAndColumn));
+ selectionModeList->addItem(QStringLiteral("Slice into Row"),
+ int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionRow));
+ selectionModeList->addItem(QStringLiteral("Slice into Row and Item"),
+ int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndRow));
+ selectionModeList->addItem(QStringLiteral("Slice into Column"),
+ int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionColumn));
+ selectionModeList->addItem(QStringLiteral("Slice into Column and Item"),
+ int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndColumn));
+ selectionModeList->addItem(QStringLiteral("Multi: Bar, Row, Col"),
+ int(QAbstract3DGraph::SelectionItemRowAndColumn
+ | QAbstract3DGraph::SelectionMultiSeries));
+ selectionModeList->addItem(QStringLiteral("Multi, Slice: Row, Item"),
+ int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndRow
+ | QAbstract3DGraph::SelectionMultiSeries));
+ selectionModeList->addItem(QStringLiteral("Multi, Slice: Col, Item"),
+ int(QAbstract3DGraph::SelectionSlice | QAbstract3DGraph::SelectionItemAndColumn
+ | QAbstract3DGraph::SelectionMultiSeries));
+ selectionModeList->setCurrentIndex(1);
+
+ QCheckBox *backgroundCheckBox = new QCheckBox(widget);
+ backgroundCheckBox->setText(QStringLiteral("Show background"));
+ backgroundCheckBox->setChecked(false);
+
+ QCheckBox *gridCheckBox = new QCheckBox(widget);
+ gridCheckBox->setText(QStringLiteral("Show grid"));
+ gridCheckBox->setChecked(true);
+
+ QCheckBox *seriesCheckBox = new QCheckBox(widget);
+ seriesCheckBox->setText(QStringLiteral("Show second series"));
+ seriesCheckBox->setChecked(false);
+
+ //! [4]
+ QSlider *rotationSliderX = new QSlider(Qt::Horizontal, widget);
+ rotationSliderX->setTickInterval(30);
+ rotationSliderX->setTickPosition(QSlider::TicksBelow);
+ rotationSliderX->setMinimum(-180);
+ rotationSliderX->setValue(0);
+ rotationSliderX->setMaximum(180);
+ QSlider *rotationSliderY = new QSlider(Qt::Horizontal, widget);
+ rotationSliderY->setTickInterval(15);
+ rotationSliderY->setTickPosition(QSlider::TicksAbove);
+ rotationSliderY->setMinimum(-90);
+ rotationSliderY->setValue(0);
+ rotationSliderY->setMaximum(90);
+ //! [4]
+
+ QSlider *fontSizeSlider = new QSlider(Qt::Horizontal, widget);
+ fontSizeSlider->setTickInterval(10);
+ fontSizeSlider->setTickPosition(QSlider::TicksBelow);
+ fontSizeSlider->setMinimum(1);
+ fontSizeSlider->setValue(30);
+ fontSizeSlider->setMaximum(100);
+
+ QFontComboBox *fontList = new QFontComboBox(widget);
+ fontList->setCurrentFont(QFont("Times New Roman"));
+
+ QComboBox *shadowQuality = new QComboBox(widget);
+ shadowQuality->addItem(QStringLiteral("None"));
+ shadowQuality->addItem(QStringLiteral("Low"));
+ shadowQuality->addItem(QStringLiteral("Medium"));
+ shadowQuality->addItem(QStringLiteral("High"));
+ shadowQuality->addItem(QStringLiteral("Low Soft"));
+ shadowQuality->addItem(QStringLiteral("Medium Soft"));
+ shadowQuality->addItem(QStringLiteral("High Soft"));
+ shadowQuality->setCurrentIndex(5);
+
+ QComboBox *rangeList = new QComboBox(widget);
+ rangeList->addItem(QStringLiteral("2006"));
+ rangeList->addItem(QStringLiteral("2007"));
+ rangeList->addItem(QStringLiteral("2008"));
+ rangeList->addItem(QStringLiteral("2009"));
+ rangeList->addItem(QStringLiteral("2010"));
+ rangeList->addItem(QStringLiteral("2011"));
+ rangeList->addItem(QStringLiteral("2012"));
+ rangeList->addItem(QStringLiteral("2013"));
+ rangeList->addItem(QStringLiteral("All"));
+ rangeList->setCurrentIndex(8);
+
+ //! [5]
+ vLayout->addWidget(new QLabel(QStringLiteral("Rotate horizontally")));
+ vLayout->addWidget(rotationSliderX, 0, Qt::AlignTop);
+ vLayout->addWidget(new QLabel(QStringLiteral("Rotate vertically")));
+ vLayout->addWidget(rotationSliderY, 0, Qt::AlignTop);
+ //! [5]
+ vLayout->addWidget(labelButton, 0, Qt::AlignTop);
+ vLayout->addWidget(cameraButton, 0, Qt::AlignTop);
+ vLayout->addWidget(backgroundCheckBox);
+ vLayout->addWidget(gridCheckBox);
+ vLayout->addWidget(smoothCheckBox);
+ vLayout->addWidget(seriesCheckBox);
+ vLayout->addWidget(new QLabel(QStringLiteral("Show year")));
+ vLayout->addWidget(rangeList);
+ vLayout->addWidget(new QLabel(QStringLiteral("Change bar style")));
+ vLayout->addWidget(barStyleList);
+ vLayout->addWidget(new QLabel(QStringLiteral("Change selection mode")));
+ vLayout->addWidget(selectionModeList);
+ vLayout->addWidget(new QLabel(QStringLiteral("Change theme")));
+ vLayout->addWidget(themeList);
+ vLayout->addWidget(new QLabel(QStringLiteral("Adjust shadow quality")));
+ vLayout->addWidget(shadowQuality);
+ vLayout->addWidget(new QLabel(QStringLiteral("Change font")));
+ vLayout->addWidget(fontList);
+ vLayout->addWidget(new QLabel(QStringLiteral("Adjust font size")));
+ vLayout->addWidget(fontSizeSlider, 1, Qt::AlignTop);
+
+ //! [2]
+ GraphModifier *modifier = new GraphModifier(widgetgraph);
+ //! [2]
+
+ //! [6]
+ QObject::connect(rotationSliderX, &QSlider::valueChanged, modifier, &GraphModifier::rotateX);
+ QObject::connect(rotationSliderY, &QSlider::valueChanged, modifier, &GraphModifier::rotateY);
+ //! [6]
+
+ QObject::connect(labelButton, &QPushButton::clicked, modifier,
+ &GraphModifier::changeLabelBackground);
+ QObject::connect(cameraButton, &QPushButton::clicked, modifier,
+ &GraphModifier::changePresetCamera);
+
+ QObject::connect(backgroundCheckBox, &QCheckBox::stateChanged, modifier,
+ &GraphModifier::setBackgroundEnabled);
+ QObject::connect(gridCheckBox, &QCheckBox::stateChanged, modifier,
+ &GraphModifier::setGridEnabled);
+ QObject::connect(smoothCheckBox, &QCheckBox::stateChanged, modifier,
+ &GraphModifier::setSmoothBars);
+ QObject::connect(seriesCheckBox, &QCheckBox::stateChanged, modifier,
+ &GraphModifier::setSeriesVisibility);
+
+ QObject::connect(modifier, &GraphModifier::backgroundEnabledChanged,
+ backgroundCheckBox, &QCheckBox::setChecked);
+ QObject::connect(modifier, &GraphModifier::gridEnabledChanged,
+ gridCheckBox, &QCheckBox::setChecked);
+
+ QObject::connect(rangeList, SIGNAL(currentIndexChanged(int)), modifier,
+ SLOT(changeRange(int)));
+
+ QObject::connect(barStyleList, SIGNAL(currentIndexChanged(int)), modifier,
+ SLOT(changeStyle(int)));
+
+ QObject::connect(selectionModeList, SIGNAL(currentIndexChanged(int)), modifier,
+ SLOT(changeSelectionMode(int)));
+
+ QObject::connect(themeList, SIGNAL(currentIndexChanged(int)), modifier,
+ SLOT(changeTheme(int)));
+
+ QObject::connect(shadowQuality, SIGNAL(currentIndexChanged(int)), modifier,
+ SLOT(changeShadowQuality(int)));
+
+ QObject::connect(modifier, &GraphModifier::shadowQualityChanged, shadowQuality,
+ &QComboBox::setCurrentIndex);
+ QObject::connect(widgetgraph, &Q3DBars::shadowQualityChanged, modifier,
+ &GraphModifier::shadowQualityUpdatedByVisual);
+
+ QObject::connect(fontSizeSlider, &QSlider::valueChanged, modifier,
+ &GraphModifier::changeFontSize);
+ QObject::connect(fontList, &QFontComboBox::currentFontChanged, modifier,
+ &GraphModifier::changeFont);
+
+ QObject::connect(modifier, &GraphModifier::fontSizeChanged, fontSizeSlider,
+ &QSlider::setValue);
+ QObject::connect(modifier, &GraphModifier::fontChanged, fontList,
+ &QFontComboBox::setCurrentFont);
+
+ //! [3]
+ widget->show();
+ return app.exec();
+ //! [3]
+}
diff --git a/examples/datavisualization/custominput/custominput.pro b/examples/datavisualization/custominput/custominput.pro
new file mode 100644
index 00000000..303cfc83
--- /dev/null
+++ b/examples/datavisualization/custominput/custominput.pro
@@ -0,0 +1,12 @@
+!include( ../examples.pri ) {
+ error( "Couldn't find the examples.pri file!" )
+}
+
+SOURCES += main.cpp scatterdatamodifier.cpp \
+ custominputhandler.cpp
+HEADERS += scatterdatamodifier.h \
+ custominputhandler.h
+
+QT += widgets
+
+RESOURCES += custominput.qrc
diff --git a/examples/datavisualization/custominput/custominput.qrc b/examples/datavisualization/custominput/custominput.qrc
new file mode 100644
index 00000000..8ced2b91
--- /dev/null
+++ b/examples/datavisualization/custominput/custominput.qrc
@@ -0,0 +1,5 @@
+<RCC>
+ <qresource prefix="/">
+ <file>data/data.txt</file>
+ </qresource>
+</RCC>
diff --git a/examples/datavisualization/custominput/custominputhandler.cpp b/examples/datavisualization/custominput/custominputhandler.cpp
new file mode 100644
index 00000000..a5734e16
--- /dev/null
+++ b/examples/datavisualization/custominput/custominputhandler.cpp
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** 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 "custominputhandler.h"
+
+#include <QtDataVisualization/Q3DCamera>
+
+CustomInputHandler::CustomInputHandler(QObject *parent) :
+ QAbstract3DInputHandler(parent)
+{
+}
+
+//! [0]
+void CustomInputHandler::mouseMoveEvent(QMouseEvent *event, const QPoint &mousePos)
+{
+ Q_UNUSED(event)
+ setInputPosition(mousePos);
+}
+//! [0]
+
+//! [1]
+void CustomInputHandler::wheelEvent(QWheelEvent *event)
+{
+ // Adjust zoom level based on what zoom range we're in.
+ int zoomLevel = scene()->activeCamera()->zoomLevel();
+ if (zoomLevel > 100)
+ zoomLevel += event->angleDelta().y() / 12;
+ else if (zoomLevel > 50)
+ zoomLevel += event->angleDelta().y() / 60;
+ else
+ zoomLevel += event->angleDelta().y() / 120;
+ if (zoomLevel > 500)
+ zoomLevel = 500;
+ else if (zoomLevel < 10)
+ zoomLevel = 10;
+
+ scene()->activeCamera()->setZoomLevel(zoomLevel);
+}
+//! [1]
diff --git a/examples/datavisualization/custominput/custominputhandler.h b/examples/datavisualization/custominput/custominputhandler.h
new file mode 100644
index 00000000..60c88ef7
--- /dev/null
+++ b/examples/datavisualization/custominput/custominputhandler.h
@@ -0,0 +1,36 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+#ifndef CUSTOMINPUTHANDLER_H
+#define CUSTOMINPUTHANDLER_H
+
+#include <QtDataVisualization/QAbstract3DInputHandler>
+
+using namespace QtDataVisualization;
+
+class CustomInputHandler : public QAbstract3DInputHandler
+{
+ Q_OBJECT
+public:
+ explicit CustomInputHandler(QObject *parent = 0);
+
+ virtual void mouseMoveEvent(QMouseEvent *event, const QPoint &mousePos);
+ virtual void wheelEvent(QWheelEvent *event);
+};
+
+#endif
diff --git a/examples/datavisualization/custominput/data/data.txt b/examples/datavisualization/custominput/data/data.txt
new file mode 100644
index 00000000..d0689b1f
--- /dev/null
+++ b/examples/datavisualization/custominput/data/data.txt
@@ -0,0 +1,1060 @@
+# Each line contains 3 floating point values
+# for x, y and z values in the scatter chart
+-10.0084,5.01799,-5.04425,
+-9.06229,3.07132,-4.54268,
+-8.55132,4.19424,-4.03318,
+-8.03806,4.75162,-3.99583,
+-9.50337,4.90684,-4.21947,
+-9.93819,3.42724,-3.58955,
+-7.84971,3.15272,-4.90367,
+-7.30477,2.91062,-4.11078,
+-7.11201,3.68863,-4.52683,
+-8.83267,2.96504,-3.61108,
+-6.94874,2.49808,-2.92883,
+-9.02606,4.7496,-4.18193,
+-9.5434,3.15534,-3.83789,
+-6.8679,3.66922,-3.58288,
+-8.16487,1.82227,-4.64523,
+-7.42165,3.18192,-4.22791,
+-7.99257,3.06559,-4.33262,
+-8.98851,2.64924,-4.44595,
+-6.36774,3.96697,-4.38998,
+-7.18413,3.32417,-4.04636,
+-7.91649,3.46826,-2.78126,
+-7.49495,3.12306,-3.14539,
+-7.5445,2.85744,-3.68421,
+2.25354,1.36828,-1.32025,
+-2.35524,-0.081203,1.23267,
+2.6517,-1.20549,2.73606,
+-2.55382,3.48814,-0.454971,
+-3.85468,0.263955,0.578276,
+2.85275,1.32315,1.0565,
+-0.404099,-2.36811,-1.60324,
+1.58908,0.363782,-0.554303,
+0.251507,0.124637,-0.752568,
+-2.45626,-0.722719,-1.11764,
+4.15342,1.92247,-0.954975,
+2.05845,0.643191,-0.121564,
+0.253468,0.814651,3.05732,
+1.51724,0.244303,2.25864,
+1.15,-0.487518,0.815931,
+-0.0538979,0.124927,0.251571,
+0.941523,-0.483498,-3.2731,
+3.55074,-1.04714,-0.954301,
+-2.43125,-0.964099,-0.658537,
+4.25459,0.163296,2.05563,
+-0.612031,1.03234,-0.227175,
+7.8338,-0.847922,-0.959189,
+-4.20076,1.44907,0.853836,
+-1.59466,-1.27511,-1.5686,
+-3.3567,-1.96864,1.83224,
+-2.75169,-0.964221,-1.26465,
+-2.45624,0.287046,-4.55032,
+2.73649,-1.48789,-0.653082,
+2.73284,2.2912,-2.4933,
+-0.854321,-2.04288,3.7516,
+-1.35708,-1.84915,2.35985,
+-3.25001,-1.64456,-4.45419,
+-0.356834,-0.569139,-1.75308,
+-0.813569,-0.287899,-0.0535036,
+4.75975,-1.48817,-2.45957,
+4.35294,1.46154,0.814214,
+-3.22467,2.76903,0.510435,
+2.49494,1.9286,0.552287,
+-0.456521,0.688277,-0.82788,
+-2.72568,2.80278,-2.45782,
+-1.65023,1.32005,-2.05754,
+-1.63551,1.88519,-3.65544,
+-1.20008,-0.723785,0.853563,
+1.45448,1.08701,2.17385,
+-3.9042,-1.16916,-0.85395,
+3.15645,0.123932,-0.950988,
+-1.35924,-2.64015,-0.54254,
+-4.15753,1.28294,-4.47502,
+-2.7885,2.48535,-0.159651,
+-3.44364,0.627232,6.11881,
+-1.55639,-0.967484,2.35497,
+-0.752853,1.16736,-0.757871,
+-0.859974,0.640213,-1.75453,
+0.85744,0.480175,2.97204,
+4.0571,3.24083,-0.183622,
+0.658087,0.841418,0.357839,
+-2.13027,0.920836,-2.758,
+-0.65825,0.164257,1.69478,
+-1.88335,-1.4811,-2.15408,
+-1.67331,2.96982,1.85521,
+-0.750937,0.282914,-0.758707,
+2.29891,1.16949,2.65927,
+2.69132,2.92632,-0.206126,
+-1.65771,3.28846,2.50201,
+-0.568799,2.5289,-1.15875,
+-1.85383,0.528953,-2.32418,
+0.159422,-2.36165,-0.569393,
+-3.96506,0.282374,-0.254519,
+0.150933,-3.88058,-0.759422,
+-1.17917,-1.96176,0.95589,
+-0.340817,-3.52333,-1.45715,
+3.21784,-2.56593,2.55468,
+0.609650,-2.44153,1.35813,
+1.4594,-1.96511,0.170228,
+3.55017,-2.16882,1.75539,
+2.89487,-0.727481,-0.39588,
+-1.65151,-0.603877,0.250508,
+-4.35232,-1.32155,-2.31877,
+2.75852,-1.88931,1.77874,
+2.75452,-0.64123,2.45546,
+0.151914,-0.888395,-0.260935,
+0.150593,0.0461652,-0.158206,
+-1.22087,-2.92034,-3.78604,
+-0.761622,0.161856,3.5586,
+-1.88456,-2.48094,0.287091,
+1.25293,2.64374,1.6532,
+-0.657609,1.32547,-0.557301,
+3.85995,2.32568,-1.38265,
+1.65572,-2.28977,0.957488,
+-2.45312,-2.96071,3.45147,
+-1.75259,0.365259,1.60113,
+1.14045,-0.844805,0.359343,
+-1.55951,1.65687,-3.10398,
+0.441652,-1.36623,-1.55494,
+-3.95762,0.288753,3.7791,
+-1.80101,-0.241499,2.29693,
+-0.456931,1.64399,1.35559,
+-0.691421,-0.723378,2.51839,
+-1.20658,-3.04063,-1.552,
+-0.958574,1.48688,0.950152,
+1.76319,-1.36072,2.15866,
+-3.91301,-0.328932,-2.45524,
+2.9553,3.12703,-2.43321,
+3.55939,-1.48028,0.152252,
+-1.41545,3.247,0.779314,
+-3.34482,-0.894538,2.09302,
+1.15338,0.362332,-2.7924,
+0.468852,0.120872,1.35593,
+1.98778,-3.32292,-0.758591,
+0.420718,-0.225014,-2.44806,
+0.550207,1.56432,2.25317,
+4.35156,-0.966178,-0.791032,
+3.35179,-1.04981,-0.854089,
+1.70857,-0.281369,-0.254686,
+-3.05855,-0.443693,1.30251,
+-3.9509,-2.72179,-3.83489,
+2.19632,1.32915,1.15345,
+1.42782,-0.449435,-2.85005,
+-2.19053,0.049866,2.87493,
+2.45196,-2.44705,-2.85302,
+4.35263,0.245956,1.12886,
+1.8167,1.85407,-0.714159,
+1.88577,2.04227,-0.959396,
+1.6522,-2.48289,0.355373,
+-3.39965,0.286834,-1.68171,
+1.85639,1.47419,2.25749,
+-2.5216,-0.88573,-2.69594,
+-0.143043,0.28453,-1.75898,
+-2.52745,-2.76741,-0.257011,
+0.381448,-1.64793,-0.756889,
+2.30469,-1.28844,-2.79271,
+-1.72491,-1.48634,-2.61686,
+0.503342,0.248352,-2.27162,
+0.457491,-1.88183,-0.951124,
+-1.23123,0.963519,2.3569,
+-0.55709,-0.364372,-1.82528,
+2.73963,-0.567024,-0.496936,
+1.17979,2.76252,-2.35641,
+-1.20723,-2.1692,3.14368,
+-0.0504301,1.76714,1.64265,
+1.45714,-0.725448,0.739217,
+0.246123,-3.27811,-0.251218,
+-0.894632,1.08758,-0.17184,
+-2.45217,0.565077,-0.557015,
+2.51301,1.1271,2.25057,
+-1.05099,-2.1688,-1.88996,
+1.26945,-2.1225,-1.55031,
+-4.30129,-0.760298,0.259868,
+-0.157336,-0.237532,-2.69483,
+-2.95778,1.36212,-3.65524,
+2.74003,1.16234,2.05928,
+0.955294,-1.52182,-1.05684,
+-1.87004,2.72729,-0.550608,
+0.459439,2.88101,-4.4135,
+1.35069,1.08445,-0.808625,
+-2.70034,-1.36291,-2.65126,
+0.353099,2.32354,-1.61885,
+-0.453359,1.67524,0.122888,
+3.7506,1.12855,-3.86338,
+0.548626,2.63101,0.552261,
+-0.753935,-3.52241,-3.21122,
+0.258935,-1.32453,2.25745,
+-2.8797,-1.60832,-2.45626,
+0.151838,-0.565264,3.98539,
+2.1508,-1.68734,-1.75076,
+-4.23947,-1.92531,2.35438,
+1.95273,-1.32736,0.313398,
+0.533647,0.646686,0.75712,
+0.856619,-0.843249,-0.577773,
+-2.15649,-1.64285,-2.31055,
+-0.851309,-2.84717,-0.324933,
+-3.17772,-0.324817,-0.858394,
+3.45303,5.29449,0.818094,
+1.42912,0.238088,0.385617,
+0.459586,1.7661,-0.153761,
+0.855577,3.16845,-2.19548,
+2.15181,0.729021,-0.955922,
+-2.40113,0.665756,-0.521366,
+1.45469,-0.462177,-1.95869,
+0.629115,-1.84769,1.86755,
+3.47576,-0.209875,-0.555502,
+0.295075,-0.840772,4.68895,
+-0.253301,-2.49078,2.11749,
+-1.15923,-3.163,-3.05671,
+1.45484,0.963654,-0.734942,
+0.354307,0.520772,-1.32278,
+2.65725,0.284589,-0.856856,
+-1.2596,0.765493,-1.66469,
+-0.656057,-2.16906,3.72144,
+-0.251559,-2.36406,-1.89709,
+0.35608,-0.80463,1.85674,
+0.0508692,0.615674,0.856785,
+-2.50726,2.28743,-2.05697,
+1.65272,1.29604,2.11481,
+-3.2878,-0.244516,0.799732,
+-2.18989,-0.847222,-0.264559,
+0.452832,0.960993,2.53691,
+-2.43913,1.28957,2.75427,
+-1.72889,-3.29414,-2.31426,
+0.952615,-0.0844651,0.346607,
+1.41175,0.889643,0.450356,
+2.13145,1.08697,0.223055,
+-2.16002,-0.225505,-0.602641,
+0.54028,1.24765,-0.456129,
+2.55086,-0.56734,-2.65051,
+-4.53921,-0.483588,-1.25013,
+3.45413,-0.44258,2.29687,
+-0.257456,0.64624,1.65041,
+1.25559,-0.65493,-0.358872,
+1.9599,-1.56965,-4.17044,
+2.75996,-1.98665,3.31794,
+3.05837,1.04847,-0.975536,
+-2.95407,1.40294,-2.25825,
+1.38718,0.360709,-2.98211,
+0.481728,-2.48564,3.25864,
+-1.15089,0.363522,0.458662,
+-2.25551,0.0421839,0.650008,
+-1.85862,-0.969237,4.25313,
+1.55797,0.0465051,-3.85709,
+0.0555338,0.682957,-2.45556,
+-0.186868,-0.482811,1.96957,
+2.197,-1.5248,-4.20912,
+3.40636,6.26268,-2.05757,
+0.780426,2.68048,-0.852693,
+1.65184,1.68951,-0.892089,
+2.11929,-2.44406,1.21168,
+-0.153348,-1.88112,-0.357374,
+-0.359393,1.76654,1.63063,
+-2.15954,0.0819277,0.757621,
+-0.159898,-3.36316,0.359582,
+2.74125,-2.84148,0.355785,
+-1.3558,0.27827,-0.588162,
+-0.354346,-2.56747,-0.984403,
+-2.75082,-3.56807,1.5599,
+-2.54708,-0.686147,2.75649,
+1.35138,0.692978,-2.24969,
+-1.39826,-0.246682,-1.65876,
+-1.46629,-1.44446,4.45293,
+-1.89442,3.64549,2.05732,
+-0.658093,0.0815129,3.95269,
+2.25603,2.96329,-2.35993,
+1.36323,1.64488,-0.0538547,
+1.75659,2.24227,-2.8522,
+-0.0566584,-1.56465,-0.0503143,
+-3.8532,-0.822258,-0.345406,
+0.951328,0.329296,-2.52211,
+-2.48659,0.410856,-3.55401,
+3.72676,2.36324,3.65589,
+0.559972,0.884984,3.15283,
+-1.37624,-1.36007,-2.16578,
+2.05543,0.4472,-0.82911,
+-4.75258,1.8779,-1.75376,
+0.15648,2.64039,-2.21467,
+-2.0593,-2.56775,1.15037,
+-3.70217,2.12375,1.3652,
+1.05566,6.8299,4.02985,
+-0.766882,-0.88359,1.35525,
+0.951335,-1.84689,0.178337,
+0.751608,1.1691,4.25273,
+-1.36367,0.728904,0.655858,
+3.17581,-0.0844758,-1.75811,
+2.85546,-0.683618,0.653701,
+-0.471118,3.04176,-2.35393,
+3.0574,-0.601996,-0.611932,
+-0.854024,-0.44532,0.355575,
+0.504700,-1.92888,6.4818,
+-1.25515,-1.44466,1.90429,
+-1.67201,0.0461708,-0.796655,
+1.45345,-1.66159,-3.48143,
+-2.84514,-1.24586,-3.47945,
+0.287402,-0.688276,-3.75664,
+3.35908,0.687828,-1.94406,
+-2.39167,1.08322,-1.73508,
+1.52152,1.86032,-1.25351,
+1.55931,3.64414,1.35944,
+1.15954,-1.36058,0.758814,
+-1.95325,0.0851092,-0.854106,
+-2.25254,-0.523024,1.05486,
+-2.68036,-1.32901,1.05877,
+-0.485956,-1.52164,2.45303,
+-0.0546215,0.640683,-2.85953,
+4.45295,-0.246051,-0.159626,
+3.4523,1.7215,-1.10587,
+3.35142,-1.72053,-0.252105,
+1.74251,2.76108,2.51524,
+2.15054,-2.88101,-1.7527,
+-3.70517,-0.0470951,0.258921,
+-0.45593,-3.47184,-2.95345,
+3.15988,-2.32107,0.105299,
+0.751449,-2.88762,-3.45245,
+2.9794,0.493172,-0.654683,
+-1.87713,-2.48632,-3.534,
+1.65266,3.16008,2.1579,
+-1.25239,-0.763119,2.15776,
+3.5572,0.282681,2.44174,
+0.251145,0.520256,2.3184,
+-1.78596,-1.36913,-2.50818,
+3.82122,1.04473,0.456159,
+2.45979,-0.722759,-4.05123,
+-0.855594,0.163792,-0.553702,
+0.656895,0.529982,3.35129,
+0.857952,-0.0885677,0.695128,
+-0.143269,1.12972,-3.155,
+-2.95923,0.241767,0.832165,
+0.253329,-0.622952,-0.459799,
+0.151499,2.5297,1.53059,
+0.655464,-1.49902,-1.51071,
+4.7585,1.76425,1.15164,
+-1.75063,-1.44645,-3.65525,
+0.850392,0.0417223,-0.340588,
+-0.557015,-0.282305,-1.85291,
+-4.05639,0.522959,-2.3507,
+-0.358137,-0.967852,0.807832,
+-1.82056,-0.0483894,0.0541359,
+-2.16623,0.129809,-2.52513,
+-1.85591,-1.04417,-1.28501,
+-1.79647,-3.44045,-1.73399,
+2.25342,0.161308,-0.0517495,
+-1.37877,0.243596,-1.52931,
+-0.059299,-0.480825,1.7137,
+-2.54357,0.286685,-2.11495,
+3.92334,-0.442936,-0.852895,
+-0.390023,-1.96437,1.38718,
+1.35263,2.92968,-1.1545,
+-2.25892,-2.27429,-0.451533,
+-0.2215,-0.126727,0.155541,
+0.715932,1.47509,-3.52895,
+-0.382939,3.16461,2.65165,
+-1.14437,-1.44682,0.456601,
+0.251892,-1.0431,4.31548,
+-2.23281,-2.48698,0.46995,
+0.954231,-3.4323,-1.20233,
+2.75569,-1.66383,-1.95486,
+0.750644,-1.84163,-0.159206,
+-0.757387,-1.84192,0.354209,
+-2.85509,-2.12151,-0.954754,
+-0.888427,-2.8403,-0.157387,
+-1.95265,-0.445753,2.17956,
+-1.05845,-2.48694,-1.25315,
+-2.66497,-1.48251,0.873192,
+2.50491,-1.0833,1.99667,
+0.453931,2.52158,0.456875,
+1.55859,-0.161924,0.256619,
+-2.92585,0.368018,0.35908,
+2.95509,-1.56248,-2.74469,
+3.46082,-1.76026,3.05835,
+1.75644,-2.84241,0.507631,
+-0.959006,0.649579,1.10824,
+2.63856,2.0417,0.187281,
+-0.150004,-0.0838836,-0.949314,
+2.26402,-1.28916,2.85284,
+-0.821239,2.68795,-0.317185,
+3.47124,0.840813,-2.65322,
+-0.253209,-0.244177,0.457348,
+2.76181,1.64033,-1.95329,
+1.35105,-2.96027,0.659952,
+-1.45423,-0.24358,0.832696,
+1.45109,1.64958,-3.45448,
+-1.15659,3.08225,1.11445,
+0.806359,1.88298,-2.13001,
+1.15538,3.04545,-0.759437,
+-0.450074,1.36121,-0.155042,
+-2.80924,-1.24207,2.55513,
+4.48859,2.04394,1.25324,
+-0.958741,1.24575,3.65169,
+3.45143,1.3276,2.5144,
+-3.25232,1.12514,-1.21425,
+-2.45327,0.681109,4.35764,
+0.55395,-0.128353,-3.95705,
+-0.352458,3.08882,-0.340631,
+1.35213,-2.92251,-3.31166,
+0.52621,-0.279201,0.959619,
+1.2243,-0.240093,-0.75247,
+-1.29854,2.16477,3.3507,
+-3.35677,2.36713,3.4585,
+0.957717,-0.885793,1.25827,
+0.150983,1.24269,5.39106,
+1.84986,1.56932,-1.05811,
+-1.35563,3.82103,-1.45287,
+1.4544,-2.6453,0.58082,
+2.05908,1.16496,1.44075,
+2.9507,-2.4957,0.153512,
+-1.10289,0.763085,-1.65351,
+-2.50708,-2.467,1.05892,
+3.55284,-1.8509,-2.55732,
+-0.848034,1.24305,-3.7516,
+-1.35051,-2.48178,2.85326,
+-2.18554,1.48771,-0.155205,
+-0.459278,2.68404,2.85727,
+0.854722,1.47322,-3.35951,
+-2.23505,-2.24254,0.353203,
+1.42395,-2.32169,0.558188,
+3.65106,1.12201,-4.58409,
+0.11,-0.68782,1.85804,
+-1.9551,-0.560204,-2.0577,
+1.85964,1.32737,-4.40673,
+-0.616311,0.649737,-0.30189,
+-1.55375,1.52043,-3.75629,
+1.85417,0.486964,0.654806,
+3.35638,2.52599,1.94343,
+0.491389,1.40427,-1.31935,
+-2.72939,0.844341,1.62621,
+-0.525985,1.31415,0.484015,
+2.25998,-1.719,1.25143,
+1.79268,2.46378,-0.951188,
+-3.55105,1.04122,3.9501,
+0.954251,1.28296,2.05486,
+-3.15267,1.96498,-0.361707,
+1.35358,-0.921098,-1.71743,
+-3.16896,-3.08548,0.903411,
+1.25127,-2.44903,2.25616,
+-3.88899,0.761334,-1.05751,
+-1.05163,-3.89783,-0.883668,
+-4.189,1.24176,-2.63816,
+2.45671,-1.84859,0.352808,
+-1.59618,2.16255,4.33699,
+2.10913,-1.88673,-0.952497,
+-1.85571,-0.287392,0.277176,
+0.751967,1.04568,-1.35427,
+2.85792,1.60982,-2.05454,
+-2.13152,-0.260207,-2.15124,
+1.75432,2.28936,0.756254,
+1.95711,-0.681098,-2.38037,
+-0.826273,1.08361,1.6515,
+-1.85118,1.89481,-0.756754,
+-3.0571,2.44795,0.355341,
+-0.455122,-3.58071,-2.85209,
+-0.95805,0.641282,2.15189,
+-1.35515,-0.234803,-0.825819,
+2.12472,-0.0444431,0.651227,
+2.67573,0.223987,2.75712,
+1.65871,-0.163059,1.6513,
+-1.85429,0.68862,1.9576,
+-3.05186,-2.2804,0.100919,
+3.41813,-1.88775,3.67075,
+-0.753778,0.36467,1.55333,
+2.97628,-1.36502,-1.85135,
+0.477128,1.08862,0.858931,
+-1.0531,1.0488,2.15218,
+2.66911,-2.08876,-0.182397,
+5.117,-2.84097,-0.953684,
+0.468302,1.88616,2.05369,
+-3.16099,-2.76085,-2.75679,
+-2.6593,3.52373,-1.24072,
+-4.37957,-0.286903,3.63863,
+-2.85958,-2.56921,-2.85723,
+-0.159735,2.72758,-2.80575,
+-0.951849,-0.607465,1.05633,
+1.93077,2.56422,1.25446,
+-0.859754,0.248106,0.0584456,
+2.4023,2.56659,-1.2588,
+2.35295,-1.08729,2.7851,
+-2.1537,-0.765032,2.83652,
+1.40185,1.29804,2.3588,
+-0.991566,1.72049,4.17146,
+3.76736,-1.48837,2.05329,
+-0.251896,0.765367,-1.4087,
+-1.6228,0.328693,0.0528287,
+2.56735,-3.08103,0.853144,
+0.0531812,-1.96216,1.55734,
+-3.77052,0.8421,-0.258953,
+2.35523,0.676643,-1.55789,
+1.16702,2.64474,-1.45533,
+2.55709,-1.56013,2.05351,
+-2.15518,3.56253,3.257,
+-0.553936,-1.24935,2.65224,
+-0.355931,1.32374,0.859863,
+-1.92974,1.2482,1.15936,
+0.350652,-2.44371,-1.35611,
+2.98996,-1.08527,-4.30641,
+1.82765,-0.440236,1.25528,
+-0.689231,-1.08813,-0.668663,
+-0.326426,-0.881857,-1.45371,
+-1.0655,2.12466,2.34146,
+3.1563,0.523166,-2.8572,
+0.455505,2.48775,-1.33482,
+0.53939,-0.847333,0.732877,
+-0.683025,-0.448889,-1.35747,
+-1.7711,-0.125587,-2.55083,
+-0.512871,0.520964,1.40731,
+4.93857,-1.6805,-0.127298,
+1.46098,-1.64073,1.35833,
+0.0518058,0.285151,-2.2437,
+1.5587,-1.23067,0.458753,
+3.13089,3.64132,1.45181,
+-1.55648,2.167,0.153491,
+3.94451,-2.56372,-1.25276,
+4.15866,0.646921,2.65542,
+-2.88189,0.562407,-1.35379,
+1.31686,1.2808,0.804375,
+-2.36912,-3.08775,1.28335,
+0.575203,-0.36483,-2.43958,
+0.613108,0.526892,2.75368,
+3.96027,-0.525425,-4.25746,
+-0.510821,1.28578,-0.058488,
+-0.254704,-3.847,3.15258,
+-0.925874,-1.72014,-3.15341,
+0.85704,0.84788,-1.75947,
+-3.35712,0.722104,2.15645,
+-1.67305,0.681216,1.65726,
+-3.64682,0.867926,2.63525,
+-0.715921,1.96081,-0.939934,
+-2.45646,1.3249,-2.75733,
+-1.75798,0.725382,-0.851921,
+-2.78528,0.679275,-2.59212,
+-2.24551,-3.4597,-1.85735,
+0.85142,2.28058,-3.75328,
+-3.85054,2.44519,4.35081,
+-3.6553,0.521917,0.293354,
+-4.35959,-0.528198,1.55557,
+1.45186,-0.0891161,-0.468118,
+1.85594,-0.761461,-4.68083,
+0.950642,0.526239,-1.30614,
+-2.50526,-0.885606,-0.362569,
+-2.96569,1.68519,-1.15965,
+-3.212,0.260715,1.18472,
+0.950556,-0.282806,0.776252,
+3.66678,1.08585,-2.15646,
+-0.806289,1.72784,2.85906,
+0.363827,1.76644,0.931866,
+-1.34204,-0.563686,-2.34091,
+-2.81333,0.415358,4.28363,
+1.52053,-0.327359,0.35052,
+-0.633441,-0.240518,4.05745,
+-2.38947,-1.84662,-2.29572,
+-1.95744,-0.863705,1.85889,
+-0.0509082,-0.164164,3.8571,
+0.156438,-2.64188,1.75836,
+-3.85642,1.48025,0.171659,
+0.253545,1.0852,-2.45243,
+-4.11318,4.1655,-0.120976,
+-1.44928,-0.328222,-0.871279,
+-1.90972,-1.8495,-3.16966,
+0.359433,1.3236,-3.95045,
+-2.60974,-1.04138,4.25836,
+-3.16336,-0.961581,-1.65161,
+-0.552909,-1.16942,4.05164,
+-3.10918,-1.2402,-0.555073,
+2.25494,1.24432,3.44063,
+-1.24998,-1.24928,-4.05493,
+3.05441,1.92762,1.43329,
+0.557032,-2.7688,-3.25463,
+-2.05665,1.6357,0.656665,
+-0.459042,0.122664,-0.152961,
+2.17715,2.96833,1.1332,
+0.0536573,-2.08635,-0.736471,
+-3.15658,1.0818,-0.172166,
+-1.95784,0.44402,0.612685,
+0.15168,-0.323951,2.85563,
+0.559356,1.63101,0.558005,
+-2.05643,1.84615,-1.87964,
+-0.254098,0.368208,1.23061,
+4.6438,-0.209283,0.695869,
+-1.95087,-0.859788,0.0539467,
+-0.351737,-1.04291,0.869198,
+0.776319,3.04922,-3.55278,
+-0.158751,1.12538,-2.59681,
+-0.560997,-1.68381,1.56935,
+1.71385,-0.446223,-1.56843,
+4.05142,-1.3243,2.85052,
+1.68685,-1.56305,2.159,
+0.359977,-1.16029,1.25037,
+-2.65045,-1.28532,0.459338,
+5.42068,1.52601,-1.35562,
+1.34386,1.68231,-2.75114,
+1.25123,0.43108,0.383897,
+-0.952936,3.6889,1.75759,
+-3.55855,0.484241,1.15503,
+-1.71394,-2.64568,-3.30684,
+-2.23513,-2.46812,1.05321,
+0.160986,0.442362,-1.05077,
+2.05433,0.473204,0.823968,
+0.482077,0.0477338,4.21712,
+-1.25348,0.767612,0.455813,
+1.61308,2.04125,-2.95433,
+-2.05862,-0.444052,1.35177,
+-3.2582,0.44354,2.15898,
+-1.75935,0.0459283,2.35061,
+-4.15501,0.68674,0.802439,
+-1.66005,1.12067,0.552901,
+-0.150828,3.4151,3.05446,
+-0.274381,0.0405946,-1.45463,
+2.94543,-0.360918,1.45895,
+-1.42494,1.56503,1.31012,
+3.45402,-1.27808,-4.29049,
+-1.14819,0.674339,1.55807,
+-0.356159,1.52295,-0.351445,
+0.387809,0.965119,1.84271,
+2.56165,-1.84639,1.65056,
+-0.619108,2.24004,-2.92134,
+-0.254288,-2.32744,-0.720931,
+3.3508,-2.24501,1.58268,
+1.69434,1.96814,3.97439,
+1.80785,0.685502,-1.55595,
+2.71587,1.76415,-2.98124,
+-2.35151,-0.697338,-3.96269,
+-1.85759,1.96899,-1.25212,
+-4.05922,1.12838,-2.7597,
+-2.85434,-1.36487,0.659987,
+-1.75616,2.12969,-1.35032,
+-2.95985,-0.0854955,3.65545,
+-2.46049,2.45378,4.51969,
+-0.0577358,0.0427911,0.359068,
+-3.25346,0.161829,1.12956,
+3.55498,2.32482,1.33302,
+4.99905,-1.88748,0.450165,
+-2.35406,-1.44715,-0.745307,
+2.44217,-0.642981,0.126924,
+1.73283,1.67362,1.91136,
+1.34239,-0.434386,-0.449795,
+-0.9813,-2.72962,-3.6889,
+1.29807,-0.448566,2.13911,
+0.654017,3.54591,-1.55982,
+-1.55508,-2.64564,0.555,
+1.92722,-0.322513,-2.13691,
+1.35913,-2.84853,-0.470788,
+0.257868,-2.68874,-0.268328,
+-2.05043,-1.68405,-3.05075,
+1.65173,-0.446801,-0.75339,
+-1.25655,0.965275,-4.15374,
+-4.27942,-0.564403,1.45826,
+0.950669,-2.4416,-1.68235,
+-0.0541107,0.882274,3.15308,
+-1.65016,-0.886156,-3.85588,
+0.355613,0.217671,4.25412,
+0.800472,0.847259,3.11114,
+1.8599,-2.16981,-2.22314,
+-2.05061,0.164561,-0.452181,
+0.854144,1.84334,-1.45981,
+1.68547,1.56536,-1.45874,
+1.25244,-0.844991,-2.95475,
+-1.92348,2.32119,-1.80444,
+-0.645646,2.45193,-3.65332,
+4.45803,0.527732,3.02031,
+2.74572,0.287964,-1.80485,
+0.35961,-2.56437,3.97194,
+-0.956828,-1.28915,1.64424,
+0.414971,-0.235061,-2.15757,
+-0.0530542,-1.08464,-4.11853,
+3.17203,-1.21013,-3.85806,
+0.758948,0.124698,-3.10188,
+-1.65404,-1.16204,-1.65357,
+-1.65985,3.84433,4.65101,
+2.83444,-2.69529,-1.65021,
+1.29814,-2.76926,-2.27139,
+0.462382,3.04217,3.45153,
+-3.61944,1.04723,-0.638308,
+2.25235,1.64048,2.95175,
+-3.05826,-0.76526,-2.38243,
+-2.8506,2.12102,-0.659444,
+-0.10046,0.0887098,-1.63621,
+-1.55585,-1.36073,2.2076,
+-0.474968,1.56568,-0.302349,
+0.36584,-2.36102,1.35289,
+0.224784,-0.637694,1.62444,
+-0.658172,1.9689,-3.13712,
+0.646334,-1.04672,2.59285,
+-2.63054,-1.08263,-0.851087,
+1.45804,-2.56159,-2.66388,
+-2.45748,0.0409116,-2.85428,
+-0.0561462,-1.24229,-1.25145,
+-2.95391,-1.80896,-2.05036,
+4.36778,-0.969951,3.53686,
+2.15582,-1.67173,-0.831609,
+-1.27059,-1.14919,1.7569,
+-1.57398,-1.28091,-0.251735,
+2.59506,-2.6408,-0.345589,
+-1.64147,-0.360324,3.1562,
+-0.125427,-0.641484,-3.66095,
+-1.9148,1.8885,2.12972,
+-2.85768,-2.28782,-1.55719,
+-1.37239,-0.485964,-2.22291,
+0.516294,0.281078,0.652612,
+-1.13028,0.246659,-2.25636,
+1.7555,-1.41602,0.348449,
+1.5355,-1.32646,-2.82417,
+-0.95426,2.0824,-0.383507,
+2.75739,0.241779,0.755701,
+0.752655,0.56204,-1.55738,
+1.1271,-3.76145,4.3701,
+0.326656,-1.24467,2.62222,
+-0.259702,2.68152,-3.18542,
+1.88504,-0.760623,4.42592,
+2.51673,4.72252,-1.99239,
+-1.66934,-0.129677,-2.49048,
+-1.25499,2.36151,-2.98447,
+2.65331,0.0443886,0.108819,
+-3.35439,0.0872109,-1.33429,
+3.35597,0.0403626,2.8203,
+4.45191,1.24824,-0.95821,
+-0.171441,-1.52622,-4.68253,
+1.19986,1.72992,-3.29566,
+-0.451339,1.92976,1.21534,
+-0.743119,-0.160688,0.805688,
+2.38678,0.272829,2.75457,
+1.72464,2.08232,-0.950389,
+2.11167,1.56576,1.21969,
+3.05157,-1.56838,-0.450535,
+0.132417,-3.08279,-1.34127,
+1.65441,-0.325204,-0.825145,
+2.05515,-1.8417,1.8561,
+-0.555858,1.52007,-0.80122,
+-2.05026,1.52773,2.33529,
+-2.35231,-3.28716,3.53598,
+-2.25771,2.5667,-1.92243,
+0.386884,-3.28674,3.49336,
+0.957272,-1.68124,-1.89095,
+2.99881,2.24992,-0.0535837,
+3.19604,2.92893,-2.16276,
+2.55903,3.12413,2.95022,
+-0.570758,-2.85326,-0.339255,
+0.356627,0.641074,0.355538,
+-1.15777,-0.162227,-0.455885,
+-2.4871,-0.885492,-0.374875,
+1.55464,-1.48929,-0.593706,
+-0.852655,-2.08736,-1.18281,
+0.504087,-0.879247,1.35148,
+-2.15261,1.04511,-3.25543,
+-0.653745,-1.32873,-3.18964,
+0.35973,-0.844255,-1.72034,
+-2.11112,0.962572,2.59386,
+1.47531,-0.693626,-3.15249,
+-1.35814,0.767202,3.45094,
+-3.05812,-1.26298,1.45287,
+-1.63927,0.893568,-1.94978,
+0.751992,1.68559,2.3618,
+5.8205,-0.769076,-0.958994,
+-2.38512,-0.166005,-1.25855,
+-0.556071,-2.28164,1.57032,
+5.89172,-0.244834,0.553728,
+-0.468648,-0.927756,-0.737048,
+-2.66659,-1.64374,-0.995568,
+0.251499,-1.24569,0.95028,
+0.737721,2.88575,0.448918,
+-0.634421,-1.84377,-2.47094,
+0.556349,2.86774,1.62621,
+-3.29644,3.28642,-3.45459,
+-1.45045,2.52138,2.75329,
+1.87449,-2.68651,3.60371,
+-0.656424,-2.56828,1.35509,
+1.95771,-1.48325,-3.85265,
+3.85074,0.0825779,-1.65283,
+-1.17278,-1.69258,-1.05875,
+1.25754,-0.0439433,1.3571,
+2.91459,2.08715,0.259842,
+0.748196,2.52132,0.659051,
+-1.85745,-1.88355,1.05259,
+1.69311,1.12299,-3.05453,
+-2.86301,0.123274,0.559289,
+-1.43146,1.64425,-1.95053,
+2.35287,0.414621,-0.950807,
+0.952585,-0.280452,-0.844588,
+-1.53836,-1.76396,2.51742,
+-3.05431,2.45,-0.26571,
+-0.637412,1.12028,-0.587387,
+-1.71017,-0.728497,-1.05087,
+0.454027,0.849208,-0.151716,
+-3.54846,0.367137,1.1484,
+0.200816,-2.08832,0.255433,
+-2.15817,0.725338,0.852676,
+-2.45708,-0.725538,-0.859435,
+4.25339,1.84177,-0.555145,
+0.119319,-1.32041,-1.45864,
+-3.65177,0.361323,0.351554,
+0.928598,0.321024,-3.64759,
+-0.250062,1.84912,7.49887,
+3.59593,0.929451,-2.15224,
+0.658599,2.36796,4.11632,
+0.55841,-1.08657,0.258326,
+1.9419,0.0488641,-3.75375,
+0.0589998,0.521351,-3.85723,
+3.45108,0.562199,4.20946,
+-0.255073,2.36504,-3.556,
+1.95848,1.28698,4.25014,
+1.85411,3.12131,0.652769,
+-3.3589,0.801817,-1.5591,
+2.48128,-0.163406,1.25243,
+2.52135,0.960467,1.45432,
+0.827496,-0.163021,-0.558886,
+-3.45032,-0.0831453,0.851212,
+-3.45334,0.855944,1.35596,
+-0.834644,0.245598,-1.23878,
+3.64558,1.16831,-0.18559,
+-1.45919,-3.08196,-0.329805,
+-3.65715,-1.04485,0.159208,
+1.35463,-0.766382,0.558632,
+-2.75899,-1.67431,-1.55069,
+1.67539,2.04337,0.912884,
+3.51677,-3.24285,0.170272,
+-4.25189,0.56589,-4.35936,
+-2.68545,-0.448243,0.540342,
+0.279844,-0.641466,-0.353986,
+-3.27626,-3.52006,1.77644,
+-0.724096,-1.84647,-2.45271,
+-4.18603,0.123376,3.85066,
+-4.05156,0.0499386,-0.332945,
+2.69508,2.32777,1.26256,
+-0.353726,1.07252,-0.738837,
+-0.947178,0.36459,1.55593,
+-0.058346,2.44781,-4.35023,
+1.51586,-0.961109,-3.43483,
+-2.8852,2.08863,-1.75468,
+-0.297867,0.722757,0.91355,
+-1.12917,-1.68328,0.175315,
+-1.24248,-0.323519,-0.854841,
+0.751943,0.564075,3.95073,
+1.15436,2.81813,0.653114,
+-2.55058,-2.56486,0.756618,
+0.959794,0.845224,-0.854001,
+-2.15033,0.248556,-3.16151,
+0.353224,-1.68637,0.457949,
+-0.753237,-2.48313,-0.355373,
+0.296585,2.04822,0.198473,
+-2.4737,0.682952,1.85349,
+1.9027,0.882796,1.45908,
+0.254799,1.92572,-1.70848,
+-0.951602,-0.698987,-2.22682,
+0.262582,-2.44093,1.05636,
+0.385415,-0.685667,-3.35928,
+0.055981,0.523585,-3.36093,
+-0.0518635,-0.889068,-0.840648,
+0.455171,2.84624,-1.98276,
+2.85475,-0.685697,-2.45695,
+-1.05047,-1.92121,0.931666,
+-2.75962,-0.164458,-1.55261,
+1.91811,1.65767,3.15004,
+-2.25653,0.856735,-4.351,
+1.89178,-0.728669,-3.8803,
+-3.25958,-1.16223,-1.85148,
+-1.6291,-2.32967,-0.874786,
+3.17524,0.327351,2.15337,
+-1.05094,-0.560694,-3.4581,
+0.759785,-1.0801,-0.257876,
+-0.4597,-2.2404,2.54341,
+0.242266,0.121832,7.80878,
+-1.6573,1.56049,-1.61749,
+1.39912,-2.84395,-0.25965,
+0.552342,1.36924,2.95278,
+-1.92932,-0.883981,0.0589583,
+-1.9026,0.56297,-0.723523,
+-1.25867,-0.529617,2.3503,
+2.16527,-0.723364,-1.45609,
+-0.984608,-0.720375,-2.05144,
+0.946803,-0.969188,-3.14625,
+2.7986,-2.36069,1.25827,
+3.37979,-1.11699,-3.55116,
+-0.753992,-1.9649,2.98548,
+-0.456321,0.525303,-0.109174,
+0.8642,1.53147,-3.34749,
+-0.450507,-0.443265,-2.8325,
+-3.24876,3.12791,0.576143,
+-3.14755,2.84502,-0.45749,
+0.226819,-1.28172,0.939501,
+-0.650725,-1.40317,-1.35211,
+-0.451625,1.84271,-0.950536,
+-1.36693,0.850218,-1.09799,
+2.35374,-0.28759,1.55815,
+2.60577,-2.46765,1.2633,
+1.21562,-1.72153,-0.4034,
+-2.43216,3.04268,1.90109,
+-1.85365,-0.16523,-2.98947,
+-0.953475,-2.76164,2.53396,
+2.55264,-0.645611,3.25479,
+-0.675476,-0.724382,-1.4566,
+0.801062,0.16778,2.21815,
+0.680443,0.0407888,3.27279,
+-3.75426,-0.247624,0.26307,
+0.427609,-0.322312,0.652005,
+-2.17428,-3.68643,0.256619,
+0.456732,-2.44858,3.13051,
+0.524175,-1.88231,-1.93171,
+7.2311,1.8354,-1.2502,
+2.69502,2.25543,-4.25127,
+0.259357,2.28099,-0.476734,
+-0.327316,-1.24908,0.78628,
+0.190362,-3.26019,0.0545844,
+-1.25409,-0.761609,2.65361,
+2.86816,0.443709,0.556137,
+2.60289,-0.680561,0.248414,
+1.75631,-0.162859,-3.62488,
+-0.559754,-0.16222,2.35858,
+0.157552,-1.72639,-0.48056,
+3.69492,-0.848265,-0.256413,
+-1.4264,-1.48589,-2.724,
+1.15372,-0.27228,-2.75499,
+-1.85159,1.76577,-0.858854,
+0.0580466,-0.41133,1.05649,
+-1.25289,0.528142,-0.386138,
+-0.858101,-0.245127,1.95078,
+-1.95302,-0.0862415,-1.95806,
+-2.79133,-0.527094,-0.356931,
+0.110597,0.167534,4.12784,
+-0.637771,-0.526587,-1.25734,
+-2.311,-0.489068,-2.8594,
+-0.352617,-1.23939,-1.85435,
+1.78814,-0.265883,3.35913,
+2.75557,-2.32271,3.15559,
+2.85426,0.443661,0.921828,
+-2.14262,0.400863,1.11614,
+4.45496,-0.488668,-3.7533,
+0.754719,-1.44165,0.853323,
+-0.856506,1.76559,1.05702,
+-0.418565,-0.921031,-2.43699,
+-1.29292,-0.282271,-1.62927,
+-0.759531,0.566692,-0.750991,
+0.559787,1.72479,-0.26667,
+2.75533,-0.245187,-0.543844,
+-2.27924,-1.04154,-4.05156,
+3.35852,-0.561129,-2.98986,
+2.41843,-0.321119,-1.55651,
+0.85431,-0.883719,-2.17826,
+0.417867,0.242995,-0.456326,
+-4.17449,-0.720086,0.355145,
+-0.577386,0.0440364,-0.950268,
+-2.8156,2.92346,0.958713,
+-1.65138,0.963561,1.25265,
+1.45117,0.845424,0.252789,
+2.27848,-1.76777,0.117707,
+-0.754248,1.08381,-2.15345,
+-3.15415,-0.162292,-1.15347,
+2.55396,-1.68912,1.15698,
+0.159561,1.84202,0.428428,
+-1.58079,2.04207,3.29578,
+-1.05711,-0.843112,-1.98122,
+0.138866,-2.96642,-0.212247,
+2.6778,0.686972,-2.6553,
+-0.498291,-0.362846,-1.0538,
+1.19872,0.0476518,-2.42077,
+-2.3972,1.40393,-0.1943,
+0.85034,-1.24222,1.5646,
+0.142174,0.249903,-2.75252,
+1.15197,1.32746,-1.70104,
+0.359387,-1.65115,-2.75243,
+0.357917,-1.36406,2.55102,
+-1.65268,-0.28339,2.75665,
+-3.82681,-3.28984,2.55128,
+-2.61371,1.08247,-0.457068,
+1.67152,-2.25527,2.45819,
+-0.753832,1.1682,-1.95913,
+-2.05131,3.04537,1.91954,
+-0.695378,2.88924,1.41965,
+3.25767,-2.76934,-0.354127,
+-0.746795,1.36034,1.85953,
+0.859135,1.08222,0.959116,
+1.15898,1.32443,3.41981,
+3.67954,0.447177,-0.414029,
+0.907323,2.12852,1.95837,
+-0.683456,-0.247536,1.05621,
+-1.67809,0.641544,-1.31143,
+-1.30192,-0.677394,-1.95159,
+-0.105665,0.365205,-1.2567,
+1.12189,-1.48969,0.957166,
+1.25554,-1.92186,-0.904086,
+0.117786,2.23836,-0.498009,
+-2.85788,0.643364,0.55867,
+-1.66115,2.56146,-2.28632,
+-3.29334,-0.0894367,-0.656519,
+3.15561,-0.769732,1.15695,
+1.25684,0.64652,-2.6002,
+2.65231,-3.52625,1.55617,
+-1.8573,-1.76276,-1.74075,
+-1.55648,1.2592,2.1585,
+-0.555522,2.88068,-2.85423,
+-3.14249,-0.288592,-3.35534,
+2.45413,0.0854903,-2.20507,
+-2.05464,0.887836,-0.658349,
+1.12708,-0.568106,-3.65865,
+-0.59147,-0.685439,0.301612,
+0.473679,0.886411,-1.65386,
+1.65166,0.166741,0.751119,
+-0.299287,1.72233,0.618559,
+1.15181,-0.488026,0.124448,
+0.0561315,1.04877,2.15922,
+0.154258,-0.64401,-1.31179,
+1.75863,-1.88571,-2.8537,
+3.35024,1.28154,-1.05461,
+-3.71738,-2.88631,-1.05314,
+-1.78258,3.08967,0.150476,
+3.47828,-2.524,-2.45502,
+-0.159138,0.160633,-0.338796,
+-2.15885,-0.82959,1.25022,
+-1.95268,-0.841195,-3.19487,
+-0.281381,-0.887435,-3.55807,
+0.415164,0.326482,-1.55411,
+1.92868,-2.84771,-0.556196,
+1.05804,1.32866,0.66596,
+2.46545,1.00747,2.35957,
+-0.77358,0.284677,-1.38805,
+0.851046,0.960742,-2.70934,
+-0.858208,-0.884015,1.16663,
+1.55291,0.282705,-3.18254,
+1.99034,0.286298,-1.75821,
+0.259097,-2.04379,-0.858936,
+-1.5956,2.04693,-1.35234,
+-0.775432,1.24465,1.95935,
+1.65595,-1.04954,-0.954437,
+-2.35417,-1.76095,-0.248306,
+0.855717,-2.92161,3.4496,
+-0.717941,2.52993,1.25007,
+-3.42927,0.673305,0.995742,
+8.03373,-2.05136,4.02113,
+7.88929,-2.2029,5.0036,
+7.61596,-2.44569,4.54892,
+7.41949,-2.64169,3.82339,
+7.21192,-2.87947,4.89423,
+7.08346,-2.38649,4.19212,
+6.90279,-3.33038,4.9273,
+6.78959,-3.55575,3.55127,
+6.57074,-3.75902,3.32517,
+6.30756,-3.40499,3.78366,
+7.90893,-3.3237,2.48012,
+6.24078,-4.04978,3.47459,
+8.0691,-4.6865,4.08057,
+5.98731,-2.26113,2.82166,
+5.46898,-3.99581,3.25024,
+8.1461,-3.34471,3.42168,
+6.8456,-5.00126,2.36145,
+7.62888,-3.82465,2.7879,
+7.18034,-3.94376,2.74348,
+6.02527,-4.36523,2.56247,
+8.64577,-3.04345,2.62974,
+7.82539,-3.6881,2.96164,
+7.10508,-3.6174,4.22416,
+7.64684,-3.88431,3.9336,
+7.46411,-4.21516,3.32001,
+6.98777,-3.94024,3.14694,
+7.36355,-4.24875,1.72061,
+8.42011,-4.52065,2.62078,
+6.04598,-4.48682,2.74494,
+8.7682,-3.9271,3.82815,
+6.76279,-3.58031,2.92525,
+7.14794,-4.42742,2.62365,
+5.32696,-3.28733,3.34916,
+6.43655,-4.60784,2.41548,
+5.66033,-4.98497,3.72282
diff --git a/examples/datavisualization/custominput/doc/images/custominput-example.png b/examples/datavisualization/custominput/doc/images/custominput-example.png
new file mode 100644
index 00000000..b2656b69
--- /dev/null
+++ b/examples/datavisualization/custominput/doc/images/custominput-example.png
Binary files differ
diff --git a/examples/datavisualization/custominput/doc/src/custominput.qdoc b/examples/datavisualization/custominput/doc/src/custominput.qdoc
new file mode 100644
index 00000000..88c53b4d
--- /dev/null
+++ b/examples/datavisualization/custominput/doc/src/custominput.qdoc
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+/*!
+ \example custominput
+ \title Custom Input Example
+ \ingroup qtdatavisualization_examples
+ \brief Implementing custom input handler in a widget application.
+
+ The Custom Input example shows how to customize the 3D graph controls in a widget application using a custom graph input handler to capture and process mouse events.
+ The code in this example shows also how the camera is controlled by using QPropertyAnimation to animate the camera and item selection
+ is done on mouseover rather than clicking any mouse buttons. Also the code shows how to implement similar zoom with mouse wheel functionality as the default
+ input handler implements.
+
+ \image custominput-example.png
+
+ \section1 Replacing default input handling
+
+ The default input handling mechanism is replaced by setting the active input handler of \l Q3DScatter
+ to \c CustomInputHandler that implements the custom behavior.
+
+ \snippet ../examples/custominput/scatterdatamodifier.cpp 0
+
+ \section1 Implementing custom selection handling
+
+ The on mouseover selection handling is implemented in the \c CustomInputHandler that captures the mouse events.
+ It then stores the last known coordinates to the \l QAbstract3DInputHandler::inputPosition property.
+
+ \snippet ../examples/custominput/custominputhandler.cpp 0
+
+ As the selection is one shot, and is cleared each time a 3D frame is rendered, a timer is setup to retrigger selection so that the selection moves to the item
+ currently under the mouse cursor as the camera animates around the graph even when the mouse cursor is not moving.
+
+ \snippet ../examples/custominput/scatterdatamodifier.cpp 1
+
+ \section1 Implementing custom zoom handling
+
+ The camera has a zoom factor that represents amount of zoom in percentages. In this example the zoom range is limited
+ between 10% and 500%. This range is then divided to four subranges where \c angleDelta is scaled to different amount of zoom change
+ based on the current subrange.
+
+ \snippet ../examples/custominput/custominputhandler.cpp 1
+
+ \section1 Implementing custom camera handling
+
+ The camera is animated to constantly rotate around the graph with two animations. The rotation around the graph is done with
+ a simple QPropertyAnimation that just increments during 20 seconds from 0 degrees to 360 degrees and sets the \l Q3DCamera::xRotation property.
+
+ \snippet ../examples/custominput/scatterdatamodifier.cpp 2
+
+ The camera movement up and down is implemented with a QSequentialAnimationGroup that varies the \l Q3DCamera::yRotation property of the camera
+ from 5 degrees to 45 degrees and back with in and out easing.
+
+ \snippet ../examples/custominput/scatterdatamodifier.cpp 3
+*/
diff --git a/examples/datavisualization/custominput/main.cpp b/examples/datavisualization/custominput/main.cpp
new file mode 100644
index 00000000..069a5b0a
--- /dev/null
+++ b/examples/datavisualization/custominput/main.cpp
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** 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 "scatterdatamodifier.h"
+
+#include <QApplication>
+#include <QWidget>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QPushButton>
+#include <QCheckBox>
+#include <QComboBox>
+#include <QFontComboBox>
+#include <QLabel>
+#include <QScreen>
+#include <QFontDatabase>
+
+int main(int argc, char **argv)
+{
+ QApplication app(argc, argv);
+ Q3DScatter *graph = new Q3DScatter();
+ QWidget *container = QWidget::createWindowContainer(graph);
+
+ QSize screenSize = graph->screen()->size();
+ container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 1.5));
+ container->setMaximumSize(screenSize);
+ container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ container->setFocusPolicy(Qt::StrongFocus);
+
+ QWidget *widget = new QWidget;
+ QHBoxLayout *hLayout = new QHBoxLayout(widget);
+ QVBoxLayout *vLayout = new QVBoxLayout();
+ hLayout->addWidget(container, 1);
+ hLayout->addLayout(vLayout);
+
+ widget->setWindowTitle(QStringLiteral("Custom Input Handling"));
+
+ QPushButton *cameraButton = new QPushButton(widget);
+ cameraButton->setText(QStringLiteral("Toggle Camera Animation"));
+
+ QComboBox *shadowQuality = new QComboBox(widget);
+ shadowQuality->addItem(QStringLiteral("None"));
+ shadowQuality->addItem(QStringLiteral("Low"));
+ shadowQuality->addItem(QStringLiteral("Medium"));
+ shadowQuality->addItem(QStringLiteral("High"));
+ shadowQuality->addItem(QStringLiteral("Low Soft"));
+ shadowQuality->addItem(QStringLiteral("Medium Soft"));
+ shadowQuality->addItem(QStringLiteral("High Soft"));
+ shadowQuality->setCurrentIndex(2);
+
+ vLayout->addWidget(cameraButton, 0, Qt::AlignTop);
+ vLayout->addWidget(new QLabel(QStringLiteral("Adjust shadow quality")), 0, Qt::AlignTop);
+ vLayout->addWidget(shadowQuality, 1, Qt::AlignTop);
+
+ ScatterDataModifier *modifier = new ScatterDataModifier(graph);
+
+ QObject::connect(cameraButton, &QPushButton::clicked, modifier,
+ &ScatterDataModifier::toggleCameraAnimation);
+
+ QObject::connect(shadowQuality, SIGNAL(currentIndexChanged(int)), modifier,
+ SLOT(changeShadowQuality(int)));
+
+ QObject::connect(modifier, &ScatterDataModifier::shadowQualityChanged, shadowQuality,
+ &QComboBox::setCurrentIndex);
+
+ widget->show();
+ modifier->start();
+ return app.exec();
+}
diff --git a/examples/datavisualization/custominput/scatterdatamodifier.cpp b/examples/datavisualization/custominput/scatterdatamodifier.cpp
new file mode 100644
index 00000000..a2a5bea9
--- /dev/null
+++ b/examples/datavisualization/custominput/scatterdatamodifier.cpp
@@ -0,0 +1,172 @@
+/****************************************************************************
+**
+** 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 "scatterdatamodifier.h"
+
+#include <QtDataVisualization/QScatterDataProxy>
+#include <QtDataVisualization/QValue3DAxis>
+#include <QtDataVisualization/Q3DScene>
+#include <QtDataVisualization/Q3DCamera>
+#include <QtDataVisualization/QScatter3DSeries>
+#include <QtDataVisualization/Q3DTheme>
+#include <qmath.h>
+
+using namespace QtDataVisualization;
+
+ScatterDataModifier::ScatterDataModifier(Q3DScatter *scatter)
+ : m_graph(scatter),
+ m_inputHandler(new CustomInputHandler())
+{
+ m_graph->activeTheme()->setType(Q3DTheme::ThemeDigia);
+ m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityMedium);
+ m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetFront);
+
+ m_graph->setAxisX(new QValue3DAxis);
+ m_graph->setAxisY(new QValue3DAxis);
+ m_graph->setAxisZ(new QValue3DAxis);
+
+ m_graph->axisX()->setRange(-10.0f, 10.0f);
+ m_graph->axisY()->setRange(-5.0f, 5.0f);
+ m_graph->axisZ()->setRange(-5.0f, 5.0f);
+
+ QScatter3DSeries *series = new QScatter3DSeries;
+ series->setItemLabelFormat(QStringLiteral("@xLabel, @yLabel, @zLabel"));
+ series->setMesh(QAbstract3DSeries::MeshCube);
+ series->setItemSize(0.15f);
+ m_graph->addSeries(series);
+
+ //! [2]
+ m_animationCameraX = new QPropertyAnimation(m_graph->scene()->activeCamera(), "xRotation");
+ m_animationCameraX->setDuration(20000);
+ m_animationCameraX->setStartValue(QVariant::fromValue(0.0f));
+ m_animationCameraX->setEndValue(QVariant::fromValue(360.0f));
+ m_animationCameraX->setLoopCount(-1);
+ //! [2]
+
+ //! [3]
+ QPropertyAnimation *upAnimation = new QPropertyAnimation(m_graph->scene()->activeCamera(), "yRotation");
+ upAnimation->setDuration(9000);
+ upAnimation->setStartValue(QVariant::fromValue(5.0f));
+ upAnimation->setEndValue(QVariant::fromValue(45.0f));
+
+ QPropertyAnimation *downAnimation = new QPropertyAnimation(m_graph->scene()->activeCamera(), "yRotation");
+ downAnimation->setDuration(9000);
+ downAnimation->setStartValue(QVariant::fromValue(45.0f));
+ downAnimation->setEndValue(QVariant::fromValue(5.0f));
+
+ m_animationCameraY = new QSequentialAnimationGroup();
+ m_animationCameraY->setLoopCount(-1);
+ m_animationCameraY->addAnimation(upAnimation);
+ m_animationCameraY->addAnimation(downAnimation);
+ //! [3]
+
+ m_animationCameraX->start();
+ m_animationCameraY->start();
+
+ // Give ownership of the handler to the graph and make it the active handler
+ //! [0]
+ m_graph->setActiveInputHandler(m_inputHandler);
+ //! [0]
+
+ //! [1]
+ m_selectionTimer = new QTimer(this);
+ m_selectionTimer->setInterval(10);
+ m_selectionTimer->setSingleShot(false);
+ QObject::connect(m_selectionTimer, &QTimer::timeout, this,
+ &ScatterDataModifier::triggerSelection);
+ m_selectionTimer->start();
+ //! [1]
+}
+
+ScatterDataModifier::~ScatterDataModifier()
+{
+ delete m_graph;
+}
+
+void ScatterDataModifier::start()
+{
+ addData();
+}
+
+void ScatterDataModifier::addData()
+{
+ QVector<QVector3D> itemList;
+
+ // Read data items from the file to QVector
+ QTextStream stream;
+ QFile dataFile(":/data/data.txt");
+ if (dataFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ stream.setDevice(&dataFile);
+ while (!stream.atEnd()) {
+ QString line = stream.readLine();
+ if (line.startsWith("#")) // Ignore comments
+ continue;
+ QStringList strList = line.split(",", QString::SkipEmptyParts);
+ // Each line has three data items: xPos, yPos and zPos value
+ if (strList.size() < 3) {
+ qWarning() << "Invalid row read from data:" << line;
+ continue;
+ }
+ itemList.append(QVector3D(
+ strList.at(0).trimmed().toFloat(),
+ strList.at(1).trimmed().toFloat(),
+ strList.at(2).trimmed().toFloat()));
+ }
+ } else {
+ qWarning() << "Unable to open data file:" << dataFile.fileName();
+ }
+
+ // Add data from the QVector to datamodel
+ QScatterDataArray *dataArray = new QScatterDataArray;
+ dataArray->resize(itemList.count());
+ QScatterDataItem *ptrToDataArray = &dataArray->first();
+ for (int i = 0; i < itemList.count(); i++) {
+ ptrToDataArray->setPosition(itemList.at(i));
+ ptrToDataArray++;
+ }
+
+ m_graph->seriesList().at(0)->dataProxy()->resetArray(dataArray);
+}
+
+void ScatterDataModifier::toggleCameraAnimation()
+{
+ if (m_animationCameraX->state() != QAbstractAnimation::Paused) {
+ m_animationCameraX->pause();
+ m_animationCameraY->pause();
+ } else {
+ m_animationCameraX->resume();
+ m_animationCameraY->resume();
+ }
+}
+
+void ScatterDataModifier::triggerSelection()
+{
+ m_graph->scene()->setSelectionQueryPosition(m_inputHandler->inputPosition());
+}
+
+void ScatterDataModifier::shadowQualityUpdatedByVisual(QAbstract3DGraph::ShadowQuality sq)
+{
+ int quality = int(sq);
+ emit shadowQualityChanged(quality); // connected to a checkbox in main.cpp
+}
+
+void ScatterDataModifier::changeShadowQuality(int quality)
+{
+ QAbstract3DGraph::ShadowQuality sq = QAbstract3DGraph::ShadowQuality(quality);
+ m_graph->setShadowQuality(sq);
+}
diff --git a/examples/datavisualization/custominput/scatterdatamodifier.h b/examples/datavisualization/custominput/scatterdatamodifier.h
new file mode 100644
index 00000000..9ea6a5c8
--- /dev/null
+++ b/examples/datavisualization/custominput/scatterdatamodifier.h
@@ -0,0 +1,60 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+#ifndef SCATTERDATAMODIFIER_H
+#define SCATTERDATAMODIFIER_H
+
+#include "custominputhandler.h"
+
+#include <QtDataVisualization/q3dscatter.h>
+#include <QtGui/QFont>
+#include <QtCore/QTimer>
+#include <QPropertyAnimation>
+#include <QSequentialAnimationGroup>
+#include <QVector3D>
+
+using namespace QtDataVisualization;
+
+class ScatterDataModifier : public QObject
+{
+ Q_OBJECT
+public:
+ explicit ScatterDataModifier(Q3DScatter *scatter);
+ ~ScatterDataModifier();
+
+ void addData();
+ void toggleCameraAnimation();
+ void start();
+
+public slots:
+ void changeShadowQuality(int quality);
+ void shadowQualityUpdatedByVisual(QAbstract3DGraph::ShadowQuality shadowQuality);
+ void triggerSelection();
+
+signals:
+ void shadowQualityChanged(int quality);
+
+private:
+ Q3DScatter *m_graph;
+ QPropertyAnimation *m_animationCameraX;
+ QSequentialAnimationGroup *m_animationCameraY;
+ CustomInputHandler *m_inputHandler;
+ QTimer *m_selectionTimer;
+};
+
+#endif
diff --git a/examples/datavisualization/customproxy/customproxy.pro b/examples/datavisualization/customproxy/customproxy.pro
new file mode 100644
index 00000000..7a347d78
--- /dev/null
+++ b/examples/datavisualization/customproxy/customproxy.pro
@@ -0,0 +1,20 @@
+!include( ../examples.pri ) {
+ error( "Couldn't find the examples.pri file!" )
+}
+
+SOURCES += main.cpp \
+ rainfallgraph.cpp \
+ variantdataset.cpp \
+ variantbardataproxy.cpp \
+ variantbardatamapping.cpp \
+
+HEADERS += \
+ rainfallgraph.h \
+ variantdataset.h \
+ variantbardataproxy.h \
+ variantbardatamapping.h
+
+RESOURCES += customproxy.qrc
+
+OTHER_FILES += data/raindata.txt
+
diff --git a/examples/datavisualization/customproxy/customproxy.qrc b/examples/datavisualization/customproxy/customproxy.qrc
new file mode 100644
index 00000000..53cd4915
--- /dev/null
+++ b/examples/datavisualization/customproxy/customproxy.qrc
@@ -0,0 +1,5 @@
+<RCC>
+ <qresource prefix="/">
+ <file>data/raindata.txt</file>
+ </qresource>
+</RCC>
diff --git a/examples/datavisualization/customproxy/data/raindata.txt b/examples/datavisualization/customproxy/data/raindata.txt
new file mode 100644
index 00000000..531d66be
--- /dev/null
+++ b/examples/datavisualization/customproxy/data/raindata.txt
@@ -0,0 +1,158 @@
+# Rainfall per month from 2000 to 2012 in Northern Finland (Sodankylä, Utsjoki, Kuusamo)
+# Format: year, month, rainfall
+2000,1, 72,
+2000,2, 47,
+2000,3, 37,
+2000,4, 79,
+2000,5, 42,
+2000,6, 73,
+2000,7, 94,
+2000,8, 37,
+2000,9, 17,
+2000,10,69,
+2000,11,42,
+2000,12,42,
+2001,1, 25,
+2001,2, 47,
+2001,3, 20,
+2001,4, 70,
+2001,5, 27,
+2001,6, 40,
+2001,7, 123,
+2001,8, 39,
+2001,9, 66,
+2001,10,55,
+2001,11,29,
+2001,12,12,
+2002,1, 24,
+2002,2, 45,
+2002,3, 27,
+2002,4, 30,
+2002,5, 16,
+2002,6, 98,
+2002,7, 122,
+2002,8, 20,
+2002,9, 50,
+2002,10,24,
+2002,11,22,
+2002,12,12,
+2003,1, 43,
+2003,2, 17,
+2003,3, 26,
+2003,4, 22,
+2003,5, 60,
+2003,6, 14,
+2003,7, 86,
+2003,8, 77,
+2003,9, 69,
+2003,10,49,
+2003,11,23,
+2003,12,44,
+2004,1, 15,
+2004,2, 19,
+2004,3, 10,
+2004,4, 11,
+2004,5, 41,
+2004,6, 29,
+2004,7, 49,
+2004,8, 72,
+2004,9, 50,
+2004,10,18,
+2004,11,19,
+2004,12,40,
+2005,1, 60,
+2005,2, 24,
+2005,3, 12,
+2005,4, 50,
+2005,5, 88,
+2005,6, 32,
+2005,7, 76,
+2005,8, 55,
+2005,9, 92,
+2005,10,35,
+2005,11,105,
+2005,12,59,
+2006,1, 27,
+2006,2, 18,
+2006,3, 17,
+2006,4, 26,
+2006,5, 24,
+2006,6, 18,
+2006,7, 35,
+2006,8, 28,
+2006,9, 80,
+2006,10,52,
+2006,11,43,
+2006,12,44,
+2007,1, 41,
+2007,2, 21,
+2007,3, 30,
+2007,4, 20,
+2007,5, 53,
+2007,6, 29,
+2007,7, 139,
+2007,8, 52,
+2007,9, 51,
+2007,10,24,
+2007,11,47,
+2007,12,33,
+2008,1, 67,
+2008,2, 19,
+2008,3, 30,
+2008,4, 31,
+2008,5, 29,
+2008,6, 79,
+2008,7, 75,
+2008,8, 99,
+2008,9, 34,
+2008,10,52,
+2008,11,60,
+2008,12,20,
+2009,1, 9,
+2009,2, 22,
+2009,3, 11,
+2009,4, 10,
+2009,5, 69,
+2009,6, 30,
+2009,7, 78,
+2009,8, 93,
+2009,9, 70,
+2009,10,32,
+2009,11,56,
+2009,12,23,
+2010,1, 12,
+2010,2, 28,
+2010,3, 55,
+2010,4, 20,
+2010,5, 65,
+2010,6, 26,
+2010,7, 134,
+2010,8, 57,
+2010,9, 51,
+2010,10,53,
+2010,11,8,
+2010,12,9,
+2011,1, 34,
+2011,2, 20,
+2011,3, 30,
+2011,4, 31,
+2011,5, 42,
+2011,6, 78,
+2011,7, 85,
+2011,8, 33,
+2011,9, 42,
+2011,10,87,
+2011,11,41,
+2011,12,72,
+2012,1, 32,
+2012,2, 42,
+2012,3, 30,
+2012,4, 50,
+2012,5, 30,
+2012,6, 70,
+2012,7, 52,
+2012,8, 20,
+2012,9, 99,
+2012,10,70,
+2012,11,69,
+2012,12,49
diff --git a/examples/datavisualization/customproxy/doc/images/customproxy-example.png b/examples/datavisualization/customproxy/doc/images/customproxy-example.png
new file mode 100644
index 00000000..753b8951
--- /dev/null
+++ b/examples/datavisualization/customproxy/doc/images/customproxy-example.png
Binary files differ
diff --git a/examples/datavisualization/customproxy/doc/src/customproxy.qdoc b/examples/datavisualization/customproxy/doc/src/customproxy.qdoc
new file mode 100644
index 00000000..e666c709
--- /dev/null
+++ b/examples/datavisualization/customproxy/doc/src/customproxy.qdoc
@@ -0,0 +1,113 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+/*!
+ \example customproxy
+ \title Custom Proxy Example
+ \ingroup qtdatavisualization_examples
+ \brief Using Q3DBars with a custom proxy.
+
+ The custom proxy example shows how to create a custom proxy to use with Q3DBars.
+
+ \image customproxy-example.png
+
+ The interesting thing about custom proxy example is the custom dataset and the corresponding
+ proxy usage, so we concentrate on that and skip explaining the basic Q3DBars functionality
+ - for that see \l{Bars Example}.
+
+ This example defines a simple flexible data set \c VariantDataSet where each data item is a
+ a variant list. Each item can have multiple different values, identified by their index in
+ the list. In this example, the data set is storing monthly rainfall data, where the value in
+ index zero is the year, the value in index one is the month, and the value in index two is
+ the amount of rainfall in that month.
+
+ The custom proxy we provide here is similar to item model based proxies provided by Qt
+ Data Visualization in that it requires a mapping to interpret the data.
+
+ Let's take a closer look at the custom classes:
+
+ \section1 VariantDataSet
+
+ \c VariantDataSet class provides a simple API:
+
+ \snippet ../examples/customproxy/variantdataset.h 1
+ \dots 0
+ \codeline
+ \snippet ../examples/customproxy/variantdataset.h 0
+
+ As you can see, the data items are simply QVariantList objects, and the data can be added either
+ singly or in lists. The only additional functionality provided is clearing the data set and querying
+ for a reference to the data contained in the set. Signals are emitted when data is added or the set
+ is cleared.
+
+ \section1 VariantBarDataProxy
+
+ \c VariantBarDataProxy is a subclass of QBarDataProxy and provides a simple API of just getters
+ and setters for the data set and the mapping:
+
+ \snippet ../examples/customproxy/variantbardataproxy.h 0
+ \dots 0
+ \codeline
+ \snippet ../examples/customproxy/variantbardataproxy.h 1
+
+ On the implementation side, the proxy listens for the changes in the data set and the mapping,
+ and resolves the data set if any changes are detected. It is not particularly efficient
+ implementation in that any change will cause re-resolving of the entire data set, but that is not
+ an issue for this example. The interesting part is the \c resolveDataSet() method:
+
+ \snippet ../examples/customproxy/variantbardataproxy.cpp 0
+
+ In \c resolveDataSet() method we sort the variant data values into rows and columns based on the
+ mapping. This is very similar to how QItemModelBarDataProxy handles mapping, except we use
+ list indexes instead of item model roles here. Once the values are sorted, we generate \c QBarDataArray
+ out of them, and call \c resetArray() method on the parent class.
+
+ \section1 VariantBarDataMapping
+
+ \c VariantBarDataMapping stores the mapping information between \c VariantDataSet data item indexes
+ and rows, columns, and values of \c QBarDataArray. It also contains the lists of rows and columns to
+ be included in the resolved data:
+
+ \snippet ../examples/customproxy/variantbardatamapping.h 0
+ \dots 0
+ \codeline
+ \snippet ../examples/customproxy/variantbardatamapping.h 1
+ \dots 0
+ \codeline
+ \snippet ../examples/customproxy/variantbardatamapping.h 2
+ \dots 0
+ \codeline
+ \snippet ../examples/customproxy/variantbardatamapping.h 3
+
+ The primary way to use a \c VariantBarDataMapping object is to give the mappings already at the
+ constructor, though they can be set later individually or all together with the \c remap() method.
+ A signal is emitted if mapping changes. It is basically a simplified version of the mapping
+ functionality of QItemModelBarDataProxy adapted to work with variant lists instead of item models.
+
+ \section1 RainfallGraph
+
+ \c RainfallGraph class handles the setup of the graph. The interesting part is the \c addDataSet()
+ method:
+
+ \snippet ../examples/customproxy/rainfallgraph.cpp 0
+
+ The bulk of that method is used for populating the variant data set. Once the set is populated,
+ visualizing the data is trivial with the help of our custom proxy:
+
+ \snippet ../examples/customproxy/rainfallgraph.cpp 1
+*/
diff --git a/examples/datavisualization/customproxy/main.cpp b/examples/datavisualization/customproxy/main.cpp
new file mode 100644
index 00000000..dd74721e
--- /dev/null
+++ b/examples/datavisualization/customproxy/main.cpp
@@ -0,0 +1,38 @@
+/****************************************************************************
+**
+** 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 "rainfallgraph.h"
+#include <QGuiApplication>
+
+using namespace QtDataVisualization;
+
+int main(int argc, char **argv)
+{
+ QGuiApplication app(argc, argv);
+
+ Q3DBars *rainfall = new Q3DBars;
+ rainfall->setFlags(rainfall->flags() ^ Qt::FramelessWindowHint);
+ rainfall->resize(1280, 800);
+ rainfall->setPosition(QPoint(10, 30));
+ rainfall->show();
+
+ RainfallGraph rainfallgraph(rainfall);
+ rainfallgraph.start();
+
+ return app.exec();
+}
diff --git a/examples/datavisualization/customproxy/rainfallgraph.cpp b/examples/datavisualization/customproxy/rainfallgraph.cpp
new file mode 100644
index 00000000..e2f04923
--- /dev/null
+++ b/examples/datavisualization/customproxy/rainfallgraph.cpp
@@ -0,0 +1,155 @@
+/****************************************************************************
+**
+** 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 "rainfallgraph.h"
+#include <QtDataVisualization/qcategory3daxis.h>
+#include <QtDataVisualization/qvalue3daxis.h>
+#include <QtDataVisualization/q3dscene.h>
+#include <QtDataVisualization/q3dcamera.h>
+#include <QtDataVisualization/qbar3dseries.h>
+#include <QtDataVisualization/q3dtheme.h>
+#include <QGuiApplication>
+#include <QFont>
+#include <QDebug>
+#include <QTextStream>
+#include <QFile>
+
+using namespace QtDataVisualization;
+
+RainfallGraph::RainfallGraph(Q3DBars *rainfall)
+ : m_graph(rainfall)
+{
+ // In data file the months are in numeric format, so create custom list
+ for (int i = 1; i <= 12; i++)
+ m_numericMonths << QString::number(i);
+
+ m_columnCount = m_numericMonths.size();
+
+ m_proxy = new VariantBarDataProxy;
+ QBar3DSeries *series = new QBar3DSeries(m_proxy);
+ m_graph->addSeries(series);
+
+ updateYearsList(2000, 2012);
+
+ // Set up bar specifications; make the bars as wide as they are deep,
+ // and add a small space between the bars
+ m_graph->setBarThickness(1.0f);
+ m_graph->setBarSpacing(QSizeF(0.2, 0.2));
+
+ // Set axis labels and titles
+ QStringList months;
+ months << "January" << "February" << "March" << "April" << "May" << "June" << "July" << "August" << "September" << "October" << "November" << "December";
+ m_graph->rowAxis()->setTitle("Year");
+ m_graph->columnAxis()->setTitle("Month");
+ m_graph->valueAxis()->setTitle("rainfall");
+ m_graph->valueAxis()->setLabelFormat("%d mm");
+ m_graph->valueAxis()->setSegmentCount(5);
+ m_graph->rowAxis()->setLabels(m_years);
+ m_graph->columnAxis()->setLabels(months);
+
+ // Set bar type to cylinder
+ series->setMesh(QAbstract3DSeries::MeshCylinder);
+
+ // Set shadows to medium
+ m_graph->setShadowQuality(QAbstract3DGraph::ShadowQualityMedium);
+
+ // Set selection mode to bar and column
+ m_graph->setSelectionMode(QAbstract3DGraph::SelectionItemAndColumn | QAbstract3DGraph::SelectionSlice);
+
+ // Set theme
+ m_graph->activeTheme()->setType(Q3DTheme::ThemeArmyBlue);
+
+ // Override font in theme
+ m_graph->activeTheme()->setFont(QFont("Century Gothic", 30));
+
+ // Override label background for theme
+ m_graph->activeTheme()->setLabelBackgroundEnabled(false);
+
+ // Set camera position and zoom
+ m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetIsometricRightHigh);
+
+ // Set window title
+ m_graph->setTitle(QStringLiteral("Monthly rainfall in Northern Finland"));
+}
+
+RainfallGraph::~RainfallGraph()
+{
+ delete m_mapping;
+ delete m_dataSet;
+ delete m_graph;
+}
+
+void RainfallGraph::start()
+{
+ addDataSet();
+}
+
+void RainfallGraph::updateYearsList(int start, int end)
+{
+ m_years.clear();
+ for (int i = start; i <= end; i++)
+ m_years << QString::number(i);
+
+ m_rowCount = m_years.size();
+}
+
+//! [0]
+void RainfallGraph::addDataSet()
+{
+ // Create a new variant data set and data item list
+ m_dataSet = new VariantDataSet;
+ VariantDataItemList *itemList = new VariantDataItemList;
+
+ // Read data from a data file into the data item list
+ QTextStream stream;
+ QFile dataFile(":/data/raindata.txt");
+ if (dataFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ stream.setDevice(&dataFile);
+ while (!stream.atEnd()) {
+ QString line = stream.readLine();
+ if (line.startsWith("#")) // Ignore comments
+ continue;
+ QStringList strList = line.split(",", QString::SkipEmptyParts);
+ // Each line has three data items: Year, month, and rainfall value
+ if (strList.size() < 3) {
+ qWarning() << "Invalid row read from data:" << line;
+ continue;
+ }
+ // Store year and month as strings, and rainfall value as double
+ // into a variant data item and add the item to the item list.
+ VariantDataItem *newItem = new VariantDataItem;
+ for (int i = 0; i < 2; i++)
+ newItem->append(strList.at(i).trimmed());
+ newItem->append(strList.at(2).trimmed().toDouble());
+ itemList->append(newItem);
+ }
+ } else {
+ qWarning() << "Unable to open data file:" << dataFile.fileName();
+ }
+
+ //! [1]
+ // Add items to the data set and set it to the proxy
+ m_dataSet->addItems(itemList);
+ m_proxy->setDataSet(m_dataSet);
+
+ // Create new mapping for the data and set it to the proxy
+ m_mapping = new VariantBarDataMapping(0, 1, 2, m_years, m_numericMonths);
+ m_proxy->setMapping(m_mapping);
+ //! [1]
+}
+//! [0]
diff --git a/examples/datavisualization/customproxy/rainfallgraph.h b/examples/datavisualization/customproxy/rainfallgraph.h
new file mode 100644
index 00000000..6116eb9b
--- /dev/null
+++ b/examples/datavisualization/customproxy/rainfallgraph.h
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+#ifndef RAINFALLGRAPH_H
+#define RAINFALLGRAPH_H
+
+#include "variantbardataproxy.h"
+#include <QtDataVisualization/q3dbars.h>
+
+using namespace QtDataVisualization;
+
+class RainfallGraph : public QObject
+{
+ Q_OBJECT
+public:
+ explicit RainfallGraph(Q3DBars *rainfall);
+ ~RainfallGraph();
+
+ void addDataSet();
+ void start();
+
+private:
+
+ void updateYearsList(int start, int end);
+ Q3DBars *m_graph;
+ int m_columnCount;
+ int m_rowCount;
+ QStringList m_years;
+ QStringList m_numericMonths;
+ VariantBarDataProxy *m_proxy;
+ VariantBarDataMapping *m_mapping;
+ VariantDataSet *m_dataSet;
+};
+
+
+#endif
diff --git a/examples/datavisualization/customproxy/variantbardatamapping.cpp b/examples/datavisualization/customproxy/variantbardatamapping.cpp
new file mode 100644
index 00000000..c8369b6e
--- /dev/null
+++ b/examples/datavisualization/customproxy/variantbardatamapping.cpp
@@ -0,0 +1,133 @@
+/****************************************************************************
+**
+** 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 "variantbardatamapping.h"
+
+VariantBarDataMapping::VariantBarDataMapping()
+ : QObject(0),
+ m_rowIndex(0),
+ m_columnIndex(1),
+ m_valueIndex(2)
+{
+}
+
+VariantBarDataMapping::VariantBarDataMapping(const VariantBarDataMapping &other)
+ : QObject(0),
+ m_rowIndex(0),
+ m_columnIndex(1),
+ m_valueIndex(2)
+{
+ operator=(other);
+}
+
+VariantBarDataMapping::VariantBarDataMapping(int rowIndex, int columnIndex, int valueIndex,
+ const QStringList &rowCategories,
+ const QStringList &columnCategories)
+ : QObject(0),
+ m_rowIndex(0),
+ m_columnIndex(1),
+ m_valueIndex(2)
+{
+ m_rowIndex = rowIndex;
+ m_columnIndex = columnIndex;
+ m_valueIndex = valueIndex;
+ m_rowCategories = rowCategories;
+ m_columnCategories = columnCategories;
+}
+
+VariantBarDataMapping::~VariantBarDataMapping()
+{
+}
+
+VariantBarDataMapping &VariantBarDataMapping::operator=(const VariantBarDataMapping &other)
+{
+ m_rowIndex = other.m_rowIndex;
+ m_columnIndex = other.m_columnIndex;
+ m_valueIndex = other.m_valueIndex;
+ m_rowCategories = other.m_rowCategories;
+ m_columnCategories = other.m_columnCategories;
+
+ return *this;
+}
+
+void VariantBarDataMapping::setRowIndex(int index)
+{
+ m_rowIndex = index;
+ emit mappingChanged();
+}
+
+int VariantBarDataMapping::rowIndex() const
+{
+ return m_rowIndex;
+}
+
+void VariantBarDataMapping::setColumnIndex(int index)
+{
+ m_columnIndex = index;
+ emit mappingChanged();
+}
+
+int VariantBarDataMapping::columnIndex() const
+{
+ return m_columnIndex;
+}
+
+void VariantBarDataMapping::setValueIndex(int index)
+{
+ m_valueIndex = index;
+ emit mappingChanged();
+}
+
+int VariantBarDataMapping::valueIndex() const
+{
+ return m_valueIndex;
+}
+
+void VariantBarDataMapping::setRowCategories(const QStringList &categories)
+{
+ m_rowCategories = categories;
+ emit mappingChanged();
+}
+
+const QStringList &VariantBarDataMapping::rowCategories() const
+{
+ return m_rowCategories;
+}
+
+void VariantBarDataMapping::setColumnCategories(const QStringList &categories)
+{
+ m_columnCategories = categories;
+ emit mappingChanged();
+}
+
+const QStringList &VariantBarDataMapping::columnCategories() const
+{
+ return m_columnCategories;
+}
+
+void VariantBarDataMapping::remap(int rowIndex, int columnIndex, int valueIndex,
+ const QStringList &rowCategories,
+ const QStringList &columnCategories)
+{
+ m_rowIndex = rowIndex;
+ m_columnIndex = columnIndex;
+ m_valueIndex = valueIndex;
+ m_rowCategories = rowCategories;
+ m_columnCategories = columnCategories;
+ emit mappingChanged();
+}
diff --git a/examples/datavisualization/customproxy/variantbardatamapping.h b/examples/datavisualization/customproxy/variantbardatamapping.h
new file mode 100644
index 00000000..3a145d9a
--- /dev/null
+++ b/examples/datavisualization/customproxy/variantbardatamapping.h
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+#ifndef VARIANTBARDATAMAPPING_H
+#define VARIANTBARDATAMAPPING_H
+
+#include <QStringList>
+
+class VariantBarDataMapping : public QObject
+{
+ Q_OBJECT
+ //! [0]
+ Q_PROPERTY(int rowIndex READ rowIndex WRITE setRowIndex)
+ Q_PROPERTY(int columnIndex READ columnIndex WRITE setColumnIndex)
+ Q_PROPERTY(int valueIndex READ valueIndex WRITE setValueIndex)
+ Q_PROPERTY(QStringList rowCategories READ rowCategories WRITE setRowCategories)
+ Q_PROPERTY(QStringList columnCategories READ columnCategories WRITE setColumnCategories)
+ //! [0]
+public:
+ explicit VariantBarDataMapping();
+ VariantBarDataMapping(const VariantBarDataMapping &other);
+ //! [1]
+ VariantBarDataMapping(int rowIndex, int columnIndex, int valueIndex,
+ const QStringList &rowCategories,
+ const QStringList &columnCategories);
+ //! [1]
+ virtual ~VariantBarDataMapping();
+
+ VariantBarDataMapping &operator=(const VariantBarDataMapping &other);
+
+ void setRowIndex(int index);
+ int rowIndex() const;
+ void setColumnIndex(int index);
+ int columnIndex() const;
+ void setValueIndex(int index);
+ int valueIndex() const;
+
+ void setRowCategories(const QStringList &categories);
+ const QStringList &rowCategories() const;
+ void setColumnCategories(const QStringList &categories);
+ const QStringList &columnCategories() const;
+
+ //! [2]
+ void remap(int rowIndex, int columnIndex, int valueIndex,
+ const QStringList &rowCategories,
+ const QStringList &columnCategories);
+ //! [2]
+signals:
+ //! [3]
+ void mappingChanged();
+ //! [3]
+
+private:
+ // Indexes of the mapped items in the VariantDataItem
+ int m_rowIndex;
+ int m_columnIndex;
+ int m_valueIndex;
+
+ // For row/column items, sort items into these categories. Other categories are ignored.
+ QStringList m_rowCategories;
+ QStringList m_columnCategories;
+};
+
+#endif
diff --git a/examples/datavisualization/customproxy/variantbardataproxy.cpp b/examples/datavisualization/customproxy/variantbardataproxy.cpp
new file mode 100644
index 00000000..cf1e1f90
--- /dev/null
+++ b/examples/datavisualization/customproxy/variantbardataproxy.cpp
@@ -0,0 +1,140 @@
+/****************************************************************************
+**
+** 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 "variantbardataproxy.h"
+
+using namespace QtDataVisualization;
+
+VariantBarDataProxy::VariantBarDataProxy() :
+ QBarDataProxy()
+{
+}
+
+VariantBarDataProxy::VariantBarDataProxy(VariantDataSet *newSet,
+ VariantBarDataMapping *mapping) :
+ QBarDataProxy()
+{
+ setDataSet(newSet);
+ setMapping(mapping);
+}
+
+VariantBarDataProxy::~VariantBarDataProxy()
+{
+ delete m_dataSet;
+}
+
+void VariantBarDataProxy::setDataSet(VariantDataSet *newSet)
+{
+ if (!m_dataSet.isNull())
+ QObject::disconnect(m_dataSet.data(), 0, this, 0);
+
+ m_dataSet = newSet;
+
+ if (!m_dataSet.isNull()) {
+ QObject::connect(m_dataSet.data(), &VariantDataSet::itemsAdded, this,
+ &VariantBarDataProxy::handleItemsAdded);
+ QObject::connect(m_dataSet.data(), &VariantDataSet::dataCleared, this,
+ &VariantBarDataProxy::handleDataCleared);
+ }
+ resolveDataSet();
+}
+
+VariantDataSet *VariantBarDataProxy::dataSet()
+{
+ return m_dataSet.data();
+}
+
+void VariantBarDataProxy::setMapping(VariantBarDataMapping *mapping)
+{
+ if (!m_mapping.isNull())
+ QObject::disconnect(m_mapping.data(), &VariantBarDataMapping::mappingChanged, this,
+ &VariantBarDataProxy::handleMappingChanged);
+
+ m_mapping = mapping;
+
+ if (!m_mapping.isNull())
+ QObject::connect(m_mapping.data(), &VariantBarDataMapping::mappingChanged, this,
+ &VariantBarDataProxy::handleMappingChanged);
+
+ resolveDataSet();
+}
+
+VariantBarDataMapping *VariantBarDataProxy::mapping()
+{
+ return m_mapping.data();
+}
+
+void VariantBarDataProxy::handleItemsAdded(int index, int count)
+{
+ Q_UNUSED(index)
+ Q_UNUSED(count)
+
+ // Resolve new items
+ resolveDataSet();
+}
+
+void VariantBarDataProxy::handleDataCleared()
+{
+ // Data cleared, reset array
+ resetArray(0);
+}
+
+void VariantBarDataProxy::handleMappingChanged()
+{
+ resolveDataSet();
+}
+
+// Resolve entire dataset into QBarDataArray.
+//! [0]
+void VariantBarDataProxy::resolveDataSet()
+{
+ // If we have no data or mapping, or the categories are not defined, simply clear the array
+ if (m_dataSet.isNull() || m_mapping.isNull() || !m_mapping->rowCategories().size()
+ || !m_mapping->columnCategories().size()) {
+ resetArray(0);
+ return;
+ }
+ const VariantDataItemList &itemList = m_dataSet->itemList();
+
+ int rowIndex = m_mapping->rowIndex();
+ int columnIndex = m_mapping->columnIndex();
+ int valueIndex = m_mapping->valueIndex();
+ const QStringList &rowList = m_mapping->rowCategories();
+ const QStringList &columnList = m_mapping->columnCategories();
+
+ // Sort values into rows and columns
+ typedef QHash<QString, float> ColumnValueMap;
+ QHash <QString, ColumnValueMap> itemValueMap;
+ foreach (const VariantDataItem *item, itemList) {
+ itemValueMap[item->at(rowIndex).toString()][item->at(columnIndex).toString()]
+ = item->at(valueIndex).toReal();
+ }
+
+ // Create a new data array in format the parent class understands
+ QBarDataArray *newProxyArray = new QBarDataArray;
+ foreach (QString rowKey, rowList) {
+ QBarDataRow *newProxyRow = new QBarDataRow(columnList.size());
+ for (int i = 0; i < columnList.size(); i++)
+ (*newProxyRow)[i].setValue(itemValueMap[rowKey][columnList.at(i)]);
+ newProxyArray->append(newProxyRow);
+ }
+
+ // Finally, reset the data array in the parent class
+ resetArray(newProxyArray);
+}
+//! [0]
diff --git a/examples/datavisualization/customproxy/variantbardataproxy.h b/examples/datavisualization/customproxy/variantbardataproxy.h
new file mode 100644
index 00000000..b83f8a71
--- /dev/null
+++ b/examples/datavisualization/customproxy/variantbardataproxy.h
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+#ifndef VARIANTBARDATAPROXY_H
+#define VARIANTBARDATAPROXY_H
+
+#include "qbardataproxy.h"
+#include "variantdataset.h"
+#include "variantbardatamapping.h"
+#include <QStringList>
+#include <QMap>
+#include <QPointer>
+
+using namespace QtDataVisualization;
+
+//! [0]
+class VariantBarDataProxy : public QBarDataProxy
+//! [0]
+{
+ Q_OBJECT
+
+public:
+ explicit VariantBarDataProxy();
+ explicit VariantBarDataProxy(VariantDataSet *newSet, VariantBarDataMapping *mapping);
+ virtual ~VariantBarDataProxy();
+
+ //! [1]
+ // Doesn't gain ownership of the dataset, but does connect to it to listen for data changes.
+ void setDataSet(VariantDataSet *newSet);
+ VariantDataSet *dataSet();
+
+ // Map key (row, column, value) to value index in data item (VariantItem).
+ // Doesn't gain ownership of mapping, but does connect to it to listen for mapping changes.
+ // Modifying mapping that is set to proxy will trigger dataset re-resolving.
+ void setMapping(VariantBarDataMapping *mapping);
+ VariantBarDataMapping *mapping();
+ //! [1]
+
+public slots:
+ void handleItemsAdded(int index, int count);
+ void handleDataCleared();
+ void handleMappingChanged();
+
+private:
+ void resolveDataSet();
+
+ QPointer<VariantDataSet> m_dataSet;
+ QPointer<VariantBarDataMapping> m_mapping;
+
+ Q_DISABLE_COPY(VariantBarDataProxy)
+};
+
+#endif
diff --git a/examples/datavisualization/customproxy/variantdataset.cpp b/examples/datavisualization/customproxy/variantdataset.cpp
new file mode 100644
index 00000000..3576aaab
--- /dev/null
+++ b/examples/datavisualization/customproxy/variantdataset.cpp
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** 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 "variantdataset.h"
+
+VariantDataSet::VariantDataSet()
+ : QObject(0)
+{
+}
+
+VariantDataSet::~VariantDataSet()
+{
+ clear();
+}
+
+void VariantDataSet::clear()
+{
+ foreach (VariantDataItem *item, m_variantData) {
+ item->clear();
+ delete item;
+ }
+ m_variantData.clear();
+ emit dataCleared();
+}
+
+int VariantDataSet::addItem(VariantDataItem *item)
+{
+ m_variantData.append(item);
+ int addIndex = m_variantData.size();
+
+ emit itemsAdded(addIndex, 1);
+ return addIndex;
+}
+
+int VariantDataSet::addItems(VariantDataItemList *itemList)
+{
+ int newCount = itemList->size();
+ int addIndex = m_variantData.size();
+ m_variantData.append(*itemList);
+ delete itemList;
+ emit itemsAdded(addIndex, newCount);
+ return addIndex;
+}
+
+const VariantDataItemList &VariantDataSet::itemList() const
+{
+ return m_variantData;
+}
diff --git a/examples/datavisualization/customproxy/variantdataset.h b/examples/datavisualization/customproxy/variantdataset.h
new file mode 100644
index 00000000..f5eb5863
--- /dev/null
+++ b/examples/datavisualization/customproxy/variantdataset.h
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+#ifndef VARIANTDATASET_H
+#define VARIANTDATASET_H
+
+#include <QScopedPointer>
+#include <QVariantList>
+
+//! [1]
+typedef QVariantList VariantDataItem;
+typedef QList<VariantDataItem *> VariantDataItemList;
+//! [1]
+
+class VariantDataSet : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit VariantDataSet();
+ ~VariantDataSet();
+
+ //! [0]
+ void clear();
+
+ int addItem(VariantDataItem *item);
+ int addItems(VariantDataItemList *itemList);
+
+ const VariantDataItemList &itemList() const;
+
+signals:
+ void itemsAdded(int index, int count);
+ void dataCleared();
+ //! [0]
+
+private:
+ VariantDataItemList m_variantData;
+
+ Q_DISABLE_COPY(VariantDataSet)
+};
+
+#endif
diff --git a/examples/datavisualization/datavisualization.pro b/examples/datavisualization/datavisualization.pro
new file mode 100644
index 00000000..4330ef4c
--- /dev/null
+++ b/examples/datavisualization/datavisualization.pro
@@ -0,0 +1,21 @@
+TEMPLATE = subdirs
+SUBDIRS += qmlbars \
+ qmlscatter \
+ qmlsurface \
+ qmlcustominput \
+ qmllegend \
+ qmlmultigraph \
+ qmloscilloscope \
+ qmlsurfacelayers
+
+!android:!ios {
+ SUBDIRS += bars \
+ custominput \
+ customproxy \
+ itemmodel \
+ scatter \
+ surface \
+ rotations
+}
+
+qtHaveModule(multimedia):!android:!ios: SUBDIRS += audiolevels
diff --git a/examples/datavisualization/examples.pri b/examples/datavisualization/examples.pri
new file mode 100644
index 00000000..d5f37733
--- /dev/null
+++ b/examples/datavisualization/examples.pri
@@ -0,0 +1,13 @@
+INCLUDEPATH += ../../../include
+
+LIBS += -L$$OUT_PWD/../../../lib
+
+TEMPLATE = app
+
+QT += datavisualization
+
+target.path = $$[QT_INSTALL_EXAMPLES]/datavisualization/$$TARGET
+INSTALLS += target
+
+OTHER_FILES += doc/src/* \
+ doc/images/*
diff --git a/examples/datavisualization/itemmodel/doc/images/itemmodel-example-2.png b/examples/datavisualization/itemmodel/doc/images/itemmodel-example-2.png
new file mode 100644
index 00000000..677b7eec
--- /dev/null
+++ b/examples/datavisualization/itemmodel/doc/images/itemmodel-example-2.png
Binary files differ
diff --git a/examples/datavisualization/itemmodel/doc/images/itemmodel-example.png b/examples/datavisualization/itemmodel/doc/images/itemmodel-example.png
new file mode 100644
index 00000000..c042f84d
--- /dev/null
+++ b/examples/datavisualization/itemmodel/doc/images/itemmodel-example.png
Binary files differ
diff --git a/examples/datavisualization/itemmodel/doc/src/itemmodel.qdoc b/examples/datavisualization/itemmodel/doc/src/itemmodel.qdoc
new file mode 100644
index 00000000..16cd1974
--- /dev/null
+++ b/examples/datavisualization/itemmodel/doc/src/itemmodel.qdoc
@@ -0,0 +1,181 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+/*!
+ \example itemmodel
+ \title Item Model Example
+ \ingroup qtdatavisualization_examples
+ \brief Using an item model as data source for Q3DBars.
+
+ The item model example shows how to make a simple 3D bar graph using Q3DBars and how to modify
+ the data being drawn at run-time. The example shows how to:
+
+ \list
+ \li Create an application with Q3DBars and widgets
+ \li Use QItemModelBarDataProxy to set data to the graph
+ \li Use a table widget to modify the data in the graph
+ \endlist
+
+ For instructions about how to interact with the graph, see \l{Qt Data Visualization Interacting with Data}{this page}.
+
+ \image itemmodel-example-2.png
+
+ \section1 Creating the application
+
+ First, in main.cpp, we create a QApplication, instantiate Q3DBars and a window container for it:
+
+ \snippet ../examples/itemmodel/main.cpp 0
+
+ The call to QWidget::createWindowContainer is required, as all data visualization types
+ (Q3DBars, Q3DScatter, and Q3DSurface) inherit QWindow. Any class inheriting QWindow cannot be used
+ as a widget any other way.
+
+ Then we'll create a layout and add the graph and the table widget into it:
+
+ \snippet ../examples/itemmodel/main.cpp 1
+
+ The table widget is going to be used to display the numerical data being inserted into the
+ graph, and to modify it (See \l {Adding data to the graph} and \l {Interacting with the data}).
+
+ We need to instantiate QItemModelBarDataProxy and a QBar3DSeries for it, and give the series
+ to the graph:
+
+ \snippet ../examples/itemmodel/main.cpp 2
+
+ Here we tell the proxy to directly map the model's rows and columns into the proxy's rows and
+ columns instead of defining row and column roles to map for them. Then we give the model from
+ the table widget to the proxy. We also create a series instance and set the proxy to it.
+ We customize the series visuals a bit by changing the object mesh to pyramids, and finally
+ add the series to the graph.
+
+ Next, let's create another class to handle the data addition and other interaction with the
+ graph. Let's call it \c GraphDataGenerator (See \l {Setting up the graph} and
+ \l {Adding data to the graph} for details) and connect some signals between QBar3DSeries,
+ \c GraphDataGenerator, and QTableWidget (See \l {Interacting with the data} for a closer look):
+
+ \snippet ../examples/itemmodel/main.cpp 3
+
+ The application main is done and we can show the graph and start the event loop:
+
+ \snippet ../examples/itemmodel/main.cpp 4
+
+ \section1 Setting up the graph
+
+ Let's set up the visual attributes for the graph in the constructor of \c GraphDataGenerator:
+
+ \snippet ../examples/itemmodel/main.cpp 5
+ \snippet ../examples/itemmodel/main.cpp 6
+ \snippet ../examples/itemmodel/main.cpp 7
+
+ First we set bar thickness ratio to 1.0, which means bars will be as wide as they are deep. 1.0
+ is also the default value, so the line is basically unnecessary. It's left there so you could
+ easily try how changing it affects the graph. The second line sets bar spacings to 0.2, which
+ means there will be a gap of 20% of the bar's thickness between the bars in both directions.
+
+ We want to be able to select rows of data for a closer inspection, so we set the selection mode
+ to slice item and row. This means that whenever we select a bar in the graph, the whole row will be
+ displayed separately and the selected bar will be highlighted.
+
+ We don't want to use the default colors, so we set one of the predefined themes as the active theme.
+
+ Next line sets the font to \c Impact. If your system doesn't have it, it will be replaced by
+ the system default.
+
+ And finally, we set the camera position to one of the predefined camera positions.
+ Now the initial graph settings are done.
+
+ \note You do not need to set any of these in case you're happy with the defaults. You can
+ easily try them by commenting out the contents of the constructor.
+
+ \section1 Adding data to the graph
+
+ We created the data generator in the application main and gave it the graph and the table
+ widget as parameters:
+
+ \code GraphDataGenerator generator(graph, tableWidget); \endcode
+
+ We added a separate start method to the generator, so that it wouldn't start doing anything
+ until everything else is set up. We then called the method when starting the application:
+
+ \code generator.start(); \endcode
+
+ Let's have a look at the contents of the \c start() method:
+
+ \snippet ../examples/itemmodel/main.cpp 8
+
+ The main thing \c start() does is set up the data model. It also activates a timer for getting
+ the accurate dimensions of the table widget after it's been filled with data. The reason we
+ do this is that the widget doesn't know its final visual domensions until all the data has been
+ inserted to it and it has been shown. The data timer usage is not vital for the
+ application, so we won't take a closer look at it. It's just there to make QTableWidget look better.
+
+ In \c setupModel() we first introduce the row and column labels, and the actual data:
+
+ \snippet ../examples/itemmodel/main.cpp 9
+
+ Then we set up the axes:
+
+ \snippet ../examples/itemmodel/main.cpp 10
+
+ Next we will set up the table widget:
+
+ \snippet ../examples/itemmodel/main.cpp 11
+
+ After that all that's left is adding the data to the table widget:
+
+ \snippet ../examples/itemmodel/main.cpp 12
+
+ Now we have a bar graph and a table widget, both displaying the same data.
+
+ You're probably wondering how the data can be displayed in the graph, as the only thing we did
+ was add it to the table widget? That's because of what we did earlier, in the application main:
+
+ \snippet ../examples/itemmodel/main.cpp 2
+
+ We created QItemModelBarDataProxy instance, and gave the proxy the model of the table widget
+ we just created. The proxy maps the rows and the columns in the model of the table widget into
+ rows and columns for itself directly, as we set the QItemModelBarDataProxy::useModelCategories
+ property to true, and the graph gets the data to be displayed via the series that owns the proxy.
+
+ \section1 Interacting with the data
+
+ We made a couple of signal connections in the application main earlier:
+
+ \snippet ../examples/itemmodel/main.cpp 3
+
+ Now we'll find out what these were for.
+
+ The first one connects a signal from Q3DBars to the \c GraphDataGenerator. Signal
+ QBar3DSeries::selectedBarChanged() is emitted when a bar is selected from the series. We connect
+ that to a method in the data generator that selects the same data item in the table widget:
+
+ \snippet ../examples/itemmodel/main.cpp 13
+
+ The second connection does the opposite; it connects a signal from the table widget to a
+ method in the data generator. The method then selects the corresponding bar in the series:
+
+ \snippet ../examples/itemmodel/main.cpp 14
+
+ You can even select an item in the widget and change the value of it, and the new value is
+ updated to the graph. This is handled again by the proxy with mapping between the data
+ in the table widget and itself.
+
+ \image itemmodel-example.png
+
+ \section1 Example contents
+*/
diff --git a/examples/datavisualization/itemmodel/itemmodel.pro b/examples/datavisualization/itemmodel/itemmodel.pro
new file mode 100644
index 00000000..844fe3d8
--- /dev/null
+++ b/examples/datavisualization/itemmodel/itemmodel.pro
@@ -0,0 +1,7 @@
+!include( ../examples.pri ) {
+ error( "Couldn't find the examples.pri file!" )
+}
+
+SOURCES += main.cpp
+
+QT += widgets
diff --git a/examples/datavisualization/itemmodel/main.cpp b/examples/datavisualization/itemmodel/main.cpp
new file mode 100644
index 00000000..2fce72aa
--- /dev/null
+++ b/examples/datavisualization/itemmodel/main.cpp
@@ -0,0 +1,285 @@
+/****************************************************************************
+**
+** 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 <QtDataVisualization/q3dbars.h>
+#include <QtDataVisualization/qcategory3daxis.h>
+#include <QtDataVisualization/qitemmodelbardataproxy.h>
+#include <QtDataVisualization/qvalue3daxis.h>
+#include <QtDataVisualization/q3dscene.h>
+#include <QtDataVisualization/q3dcamera.h>
+#include <QtDataVisualization/qbar3dseries.h>
+#include <QtDataVisualization/q3dtheme.h>
+
+#include <QApplication>
+#include <QVBoxLayout>
+#include <QTableWidget>
+#include <QScreen>
+#include <QTimer>
+#include <QFont>
+#include <QDebug>
+#include <QHeaderView>
+
+#define USE_STATIC_DATA
+
+using namespace QtDataVisualization;
+
+class GraphDataGenerator : public QObject
+{
+public:
+ explicit GraphDataGenerator(Q3DBars *bargraph, QTableWidget *tableWidget);
+ ~GraphDataGenerator();
+
+ void setupModel();
+ void addRow();
+ void changeStyle();
+ void changePresetCamera();
+ void changeTheme();
+ void start();
+ void selectFromTable(const QPoint &selection);
+ void selectedFromTable(int currentRow, int currentColumn, int previousRow, int previousColumn);
+ void fixTableSize();
+
+private:
+ Q3DBars *m_graph;
+ QTimer *m_dataTimer;
+ QTimer *m_styleTimer;
+ QTimer *m_presetTimer;
+ QTimer *m_themeTimer;
+ int m_columnCount;
+ int m_rowCount;
+ QTableWidget *m_tableWidget; // not owned
+};
+
+GraphDataGenerator::GraphDataGenerator(Q3DBars *bargraph, QTableWidget *tableWidget)
+ : m_graph(bargraph),
+ m_dataTimer(0),
+ m_styleTimer(0),
+ m_presetTimer(0),
+ m_themeTimer(0),
+ m_columnCount(100),
+ m_rowCount(50),
+ m_tableWidget(tableWidget)
+{
+ //! [5]
+ // Set up bar specifications; make the bars as wide as they are deep,
+ // and add a small space between them
+ m_graph->setBarThickness(1.0f);
+ m_graph->setBarSpacing(QSizeF(0.2, 0.2));
+
+ //! [5]
+#ifndef USE_STATIC_DATA
+ // Set up sample space; make it as deep as it's wide
+ m_graph->rowAxis()->setRange(0, m_rowCount);
+ m_graph->columnAxis()->setRange(0, m_columnCount);
+ m_tableWidget->setColumnCount(m_columnCount);
+
+ // Set selection mode to full
+ m_graph->setSelectionMode(QAbstract3DGraph::SelectionItemRowAndColumn);
+
+ // Hide axis labels by explicitly setting one empty string as label list
+ m_graph->rowAxis()->setLabels(QStringList(QString()));
+ m_graph->columnAxis()->setLabels(QStringList(QString()));
+
+ m_graph->seriesList().at(0)->setItemLabelFormat(QStringLiteral("@valueLabel"));
+#else
+ //! [6]
+ // Set selection mode to slice row
+ m_graph->setSelectionMode(QAbstract3DGraph::SelectionItemAndRow | QAbstract3DGraph::SelectionSlice);
+
+ //! [6]
+#endif
+
+ //! [7]
+ // Set theme
+ m_graph->activeTheme()->setType(Q3DTheme::ThemeDigia);
+
+ // Set font
+ m_graph->activeTheme()->setFont(QFont("Impact", 20));
+
+ // Set preset camera position
+ m_graph->scene()->activeCamera()->setCameraPreset(Q3DCamera::CameraPresetFront);
+ //! [7]
+}
+
+GraphDataGenerator::~GraphDataGenerator()
+{
+ if (m_dataTimer) {
+ m_dataTimer->stop();
+ delete m_dataTimer;
+ }
+ delete m_graph;
+}
+
+void GraphDataGenerator::start()
+{
+#ifndef USE_STATIC_DATA
+ m_dataTimer = new QTimer();
+ m_dataTimer->setTimerType(Qt::CoarseTimer);
+ QObject::connect(m_dataTimer, &QTimer::timeout, this, &GraphDataGenerator::addRow);
+ m_dataTimer->start(0);
+ m_tableWidget->setFixedWidth(m_graph->width());
+#else
+ //! [8]
+ setupModel();
+
+ // Table needs to be shown before the size of its headers can be accurately obtained,
+ // so we postpone it a bit
+ m_dataTimer = new QTimer();
+ m_dataTimer->setSingleShot(true);
+ QObject::connect(m_dataTimer, &QTimer::timeout, this, &GraphDataGenerator::fixTableSize);
+ m_dataTimer->start(0);
+ //! [8]
+#endif
+}
+
+void GraphDataGenerator::setupModel()
+{
+ //! [9]
+ // Set up row and column names
+ QStringList days;
+ days << "Monday" << "Tuesday" << "Wednesday" << "Thursday" << "Friday" << "Saturday" << "Sunday";
+ QStringList weeks;
+ weeks << "week 1" << "week 2" << "week 3" << "week 4" << "week 5";
+
+ // Set up data Mon Tue Wed Thu Fri Sat Sun
+ float hours[5][7] = {{2.0f, 1.0f, 3.0f, 0.2f, 1.0f, 5.0f, 10.0f}, // week 1
+ {0.5f, 1.0f, 3.0f, 1.0f, 2.0f, 2.0f, 3.0f}, // week 2
+ {1.0f, 1.0f, 2.0f, 1.0f, 4.0f, 4.0f, 4.0f}, // week 3
+ {0.0f, 1.0f, 0.0f, 0.0f, 2.0f, 2.0f, 0.3f}, // week 4
+ {3.0f, 3.0f, 6.0f, 2.0f, 2.0f, 1.0f, 1.0f}}; // week 5
+ //! [9]
+
+ // Add labels
+ //! [10]
+ m_graph->rowAxis()->setTitle("Week of year");
+ m_graph->columnAxis()->setTitle("Day of week");
+ m_graph->valueAxis()->setTitle("Hours spent on the Internet");
+ m_graph->valueAxis()->setLabelFormat("%.1f h");
+ //! [10]
+
+ //! [11]
+ m_tableWidget->setRowCount(5);
+ m_tableWidget->setColumnCount(7);
+ m_tableWidget->setHorizontalHeaderLabels(days);
+ m_tableWidget->setVerticalHeaderLabels(weeks);
+ m_tableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ m_tableWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ m_tableWidget->setCurrentCell(-1, -1);
+ //! [11]
+
+ //! [12]
+ for (int week = 0; week < weeks.size(); week++) {
+ for (int day = 0; day < days.size(); day++) {
+ QModelIndex index = m_tableWidget->model()->index(week, day);
+ m_tableWidget->model()->setData(index, hours[week][day]);
+ }
+ }
+ //! [12]
+}
+
+void GraphDataGenerator::addRow()
+{
+ m_tableWidget->model()->insertRow(0);
+ if (m_tableWidget->model()->rowCount() > m_rowCount)
+ m_tableWidget->model()->removeRow(m_rowCount);
+ for (int i = 0; i < m_columnCount; i++) {
+ QModelIndex index = m_tableWidget->model()->index(0, i);
+ m_tableWidget->model()->setData(index,
+ ((float)i / (float)m_columnCount) / 2.0f + (float)(rand() % 30) / 100.0f);
+ }
+ m_tableWidget->resizeColumnsToContents();
+}
+
+//! [13]
+void GraphDataGenerator::selectFromTable(const QPoint &selection)
+{
+ m_tableWidget->setFocus();
+ m_tableWidget->setCurrentCell(selection.x(), selection.y());
+}
+//! [13]
+
+//! [14]
+void GraphDataGenerator::selectedFromTable(int currentRow, int currentColumn,
+ int previousRow, int previousColumn)
+{
+ Q_UNUSED(previousRow)
+ Q_UNUSED(previousColumn)
+ m_graph->seriesList().at(0)->setSelectedBar(QPoint(currentRow, currentColumn));
+}
+//! [14]
+
+void GraphDataGenerator::fixTableSize()
+{
+ int width = m_tableWidget->horizontalHeader()->length();
+ width += m_tableWidget->verticalHeader()->width();
+ m_tableWidget->setFixedWidth(width + 2);
+ int height = m_tableWidget->verticalHeader()->length();
+ height += m_tableWidget->horizontalHeader()->height();
+ m_tableWidget->setFixedHeight(height + 2);
+}
+
+int main(int argc, char **argv)
+{
+ //! [0]
+ QApplication app(argc, argv);
+ Q3DBars *graph = new Q3DBars();
+ QWidget *container = QWidget::createWindowContainer(graph);
+ //! [0]
+
+ QSize screenSize = graph->screen()->size();
+ container->setMinimumSize(QSize(screenSize.width() / 2, screenSize.height() / 2));
+ container->setMaximumSize(screenSize);
+ container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ container->setFocusPolicy(Qt::StrongFocus);
+
+ //! [1]
+ QWidget widget;
+ QVBoxLayout *layout = new QVBoxLayout(&widget);
+ QTableWidget *tableWidget = new QTableWidget(&widget);
+ layout->addWidget(container, 1);
+ layout->addWidget(tableWidget, 1, Qt::AlignHCenter);
+ //! [1]
+
+ tableWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+ tableWidget->setAlternatingRowColors(true);
+ widget.setWindowTitle(QStringLiteral("Hours spent on the Internet"));
+
+ //! [2]
+ // Since we are dealing with QTableWidget, the model will already have data sorted properly
+ // into rows and columns, so we simply set useModelCategories property to true to utilize this.
+ QItemModelBarDataProxy *proxy = new QItemModelBarDataProxy(tableWidget->model());
+ proxy->setUseModelCategories(true);
+ QBar3DSeries *series = new QBar3DSeries(proxy);
+ series->setMesh(QAbstract3DSeries::MeshPyramid);
+ graph->addSeries(series);
+ //! [2]
+
+ //! [3]
+ GraphDataGenerator generator(graph, tableWidget);
+ QObject::connect(series, &QBar3DSeries::selectedBarChanged, &generator,
+ &GraphDataGenerator::selectFromTable);
+ QObject::connect(tableWidget, &QTableWidget::currentCellChanged, &generator,
+ &GraphDataGenerator::selectedFromTable);
+ //! [3]
+
+ //! [4]
+ widget.show();
+ generator.start();
+ return app.exec();
+ //! [4]
+}
diff --git a/examples/datavisualization/qmlbars/doc/images/qmlbars-example.png b/examples/datavisualization/qmlbars/doc/images/qmlbars-example.png
new file mode 100644
index 00000000..64ad6b0e
--- /dev/null
+++ b/examples/datavisualization/qmlbars/doc/images/qmlbars-example.png
Binary files differ
diff --git a/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc b/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc
new file mode 100644
index 00000000..cc344c9c
--- /dev/null
+++ b/examples/datavisualization/qmlbars/doc/src/qmlbars.qdoc
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+/*!
+ \example qmlbars
+ \title Qt Quick 2 Bars Example
+ \ingroup qtdatavisualization_examples
+ \brief Using Bars3D in a QML application.
+
+ The Qt Quick 2 bars example shows how to make a simple 3D bar graph using Bars3D and Qt
+ Quick 2.
+
+ \image qmlbars-example.png
+
+ The interesting thing about this example is switching series and displaying more than one series
+ at once. We'll concentrate on those and skip explaining the basic Bars3D functionality - for
+ more detailed QML example documentation, see \l{Qt Quick 2 Scatter Example}.
+
+ \section1 Data
+
+ The example data is monthly income and expenses of a fictional company over several years.
+ The data is defined in a list model in \c Data.qml like this:
+
+ \snippet ../examples/qmlbars/qml/qmlbars/Data.qml 0
+ \dots
+
+ Each data item has four roles: year, month, income, and expenses. Years and months are natural to
+ map to rows and columns of a bar chart, but we can only show either income or expenses as the
+ value.
+
+ Now we need to add the data to the Bars3D graph. We will create two Bar3DSeries inside it,
+ starting with a series for the income:
+
+ \snippet ../examples/qmlbars/qml/qmlbars/main.qml 3
+ \dots
+
+ The data is attached to the \c itemModel property of the ItemModelBarDataProxy inside the
+ series.
+
+ Then we add another series for the expenses:
+
+ \snippet ../examples/qmlbars/qml/qmlbars/main.qml 4
+ \dots
+
+ We use the \c visible property of the series to hide the second series for now.
+
+ \section1 Custom axis labels
+
+ One interesting tidbit about axes is that we redefine the category labels for column axis in
+ \c Axes.qml. This is done because the data contains abbreviated month names, which we don't want
+ to use for our column labels:
+
+ \snippet ../examples/qmlbars/qml/qmlbars/Axes.qml 0
+
+ \section1 Switching series
+
+ In the \c main.qml, we set up the graph and various UI elements. There are three interesting
+ code blocks we want to highlight here. The first one shows how to change the
+ visualized data between income, expenses, and both, by simply changing visibility of the two
+ series:
+
+ \snippet ../examples/qmlbars/qml/qmlbars/main.qml 0
+
+ The axis change is done because income and expenses have a different label format. The same could have
+ been achieved using a single axis and just changing the label format.
+
+ The second interesting block is where we filter some of the rows away from the visualized data:
+
+ \snippet ../examples/qmlbars/qml/qmlbars/main.qml 1
+
+ The filtering is done by setting \c autoRowCategories to false on the ItemModelBarDataProxy item and defining
+ the row categories explicitly. This way, only the items in specified rows are visualized.
+
+ The third interesting block shows how to get the row and column index of an item if you know the
+ row and column values by using ItemModelBarDataProxy methods \c rowCategoryIndex() and \c columnCategoryIndex():
+
+ \snippet ../examples/qmlbars/qml/qmlbars/main.qml 2
+*/
diff --git a/examples/datavisualization/qmlbars/main.cpp b/examples/datavisualization/qmlbars/main.cpp
new file mode 100644
index 00000000..a6b2f4c5
--- /dev/null
+++ b/examples/datavisualization/qmlbars/main.cpp
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** 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 "qtquick2applicationviewer.h"
+#include <QtDataVisualization/qutils.h>
+
+#include <QtGui/QGuiApplication>
+#include <QtCore/QDir>
+
+int main(int argc, char *argv[])
+{
+ QGuiApplication app(argc, argv);
+
+ QtQuick2ApplicationViewer viewer;
+
+ // Enable antialiasing
+ viewer.setFormat(QtDataVisualization::qDefaultSurfaceFormat());
+
+ // The following are needed to make examples run without having to install the module
+ // in desktop environments.
+#ifdef Q_OS_WIN
+ QString extraImportPath(QStringLiteral("%1/../../../../%2"));
+#else
+ QString extraImportPath(QStringLiteral("%1/../../../%2"));
+#endif
+ viewer.addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
+ QString::fromLatin1("qml")));
+
+ viewer.setTitle(QStringLiteral("Monthly income/expenses"));
+
+ viewer.setSource(QUrl("qrc:/qml/qmlbars/main.qml"));
+ viewer.setResizeMode(QQuickView::SizeRootObjectToView);
+ viewer.show();
+
+ return app.exec();
+}
diff --git a/examples/datavisualization/qmlbars/qml/qmlbars/Axes.qml b/examples/datavisualization/qmlbars/qml/qmlbars/Axes.qml
new file mode 100644
index 00000000..29979e1b
--- /dev/null
+++ b/examples/datavisualization/qmlbars/qml/qmlbars/Axes.qml
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtDataVisualization 1.0
+
+Item {
+ property alias column: columnAxis
+ property alias expenses: expensesAxis
+ property alias income: incomeAxis
+
+ // For row labels we can use row labels from data proxy, so default axis
+ // suffices for rows.
+
+ // Custom labels for columns, since the data contains abbreviated month names.
+ //! [0]
+ CategoryAxis3D {
+ id: columnAxis
+ labels: ["January", "February", "March", "April", "May", "June",
+ "July", "August", "September", "October", "November", "December"]
+ }
+ //! [0]
+ ValueAxis3D {
+ id: incomeAxis
+ min: 0
+ max: 35
+ labelFormat: "%.2f M\u20AC"
+ title: "Monthly income"
+ }
+ ValueAxis3D {
+ id: expensesAxis
+ min: 0
+ max: 35
+ labelFormat: "-%.2f M\u20AC"
+ title: "Monthly expenses"
+ }
+}
diff --git a/examples/datavisualization/qmlbars/qml/qmlbars/Data.qml b/examples/datavisualization/qmlbars/qml/qmlbars/Data.qml
new file mode 100644
index 00000000..7e0978c6
--- /dev/null
+++ b/examples/datavisualization/qmlbars/qml/qmlbars/Data.qml
@@ -0,0 +1,119 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+import QtQuick 2.1
+
+Item {
+ property alias model: dataModel
+
+ //! [0]
+ ListModel {
+ id: dataModel
+ ListElement{ year: "2006"; month: "Jan"; expenses: "4"; income: "5" }
+ ListElement{ year: "2006"; month: "Feb"; expenses: "5"; income: "6" }
+ ListElement{ year: "2006"; month: "Mar"; expenses: "7"; income: "4" }
+ //! [0]
+ ListElement{ year: "2006"; month: "Apr"; expenses: "3"; income: "2" }
+ ListElement{ year: "2006"; month: "May"; expenses: "4"; income: "1" }
+ ListElement{ year: "2006"; month: "Jun"; expenses: "2"; income: "2" }
+ ListElement{ year: "2006"; month: "Jul"; expenses: "1"; income: "3" }
+ ListElement{ year: "2006"; month: "Aug"; expenses: "5"; income: "1" }
+ ListElement{ year: "2006"; month: "Sep"; expenses: "2"; income: "3" }
+ ListElement{ year: "2006"; month: "Oct"; expenses: "5"; income: "2" }
+ ListElement{ year: "2006"; month: "Nov"; expenses: "8"; income: "5" }
+ ListElement{ year: "2006"; month: "Dec"; expenses: "3"; income: "3" }
+
+ ListElement{ year: "2007"; month: "Jan"; expenses: "3"; income: "1" }
+ ListElement{ year: "2007"; month: "Feb"; expenses: "4"; income: "2" }
+ ListElement{ year: "2007"; month: "Mar"; expenses: "12"; income: "4" }
+ ListElement{ year: "2007"; month: "Apr"; expenses: "13"; income: "6" }
+ ListElement{ year: "2007"; month: "May"; expenses: "14"; income: "11" }
+ ListElement{ year: "2007"; month: "Jun"; expenses: "7"; income: "7" }
+ ListElement{ year: "2007"; month: "Jul"; expenses: "6"; income: "4" }
+ ListElement{ year: "2007"; month: "Aug"; expenses: "4"; income: "15" }
+ ListElement{ year: "2007"; month: "Sep"; expenses: "2"; income: "18" }
+ ListElement{ year: "2007"; month: "Oct"; expenses: "29"; income: "25" }
+ ListElement{ year: "2007"; month: "Nov"; expenses: "23"; income: "29" }
+ ListElement{ year: "2007"; month: "Dec"; expenses: "5"; income: "9" }
+
+ ListElement{ year: "2008"; month: "Jan"; expenses: "3"; income: "8" }
+ ListElement{ year: "2008"; month: "Feb"; expenses: "8"; income: "14" }
+ ListElement{ year: "2008"; month: "Mar"; expenses: "10"; income: "20" }
+ ListElement{ year: "2008"; month: "Apr"; expenses: "12"; income: "24" }
+ ListElement{ year: "2008"; month: "May"; expenses: "10"; income: "19" }
+ ListElement{ year: "2008"; month: "Jun"; expenses: "5"; income: "8" }
+ ListElement{ year: "2008"; month: "Jul"; expenses: "1"; income: "4" }
+ ListElement{ year: "2008"; month: "Aug"; expenses: "7"; income: "12" }
+ ListElement{ year: "2008"; month: "Sep"; expenses: "4"; income: "16" }
+ ListElement{ year: "2008"; month: "Oct"; expenses: "22"; income: "33" }
+ ListElement{ year: "2008"; month: "Nov"; expenses: "16"; income: "25" }
+ ListElement{ year: "2008"; month: "Dec"; expenses: "2"; income: "7" }
+
+ ListElement{ year: "2009"; month: "Jan"; expenses: "4"; income: "5" }
+ ListElement{ year: "2009"; month: "Feb"; expenses: "4"; income: "7" }
+ ListElement{ year: "2009"; month: "Mar"; expenses: "11"; income: "14" }
+ ListElement{ year: "2009"; month: "Apr"; expenses: "16"; income: "22" }
+ ListElement{ year: "2009"; month: "May"; expenses: "3"; income: "5" }
+ ListElement{ year: "2009"; month: "Jun"; expenses: "4"; income: "8" }
+ ListElement{ year: "2009"; month: "Jul"; expenses: "7"; income: "9" }
+ ListElement{ year: "2009"; month: "Aug"; expenses: "9"; income: "13" }
+ ListElement{ year: "2009"; month: "Sep"; expenses: "1"; income: "6" }
+ ListElement{ year: "2009"; month: "Oct"; expenses: "14"; income: "25" }
+ ListElement{ year: "2009"; month: "Nov"; expenses: "19"; income: "29" }
+ ListElement{ year: "2009"; month: "Dec"; expenses: "5"; income: "7" }
+
+ ListElement{ year: "2010"; month: "Jan"; expenses: "14"; income: "22" }
+ ListElement{ year: "2010"; month: "Feb"; expenses: "5"; income: "7" }
+ ListElement{ year: "2010"; month: "Mar"; expenses: "1"; income: "9" }
+ ListElement{ year: "2010"; month: "Apr"; expenses: "1"; income: "12" }
+ ListElement{ year: "2010"; month: "May"; expenses: "5"; income: "9" }
+ ListElement{ year: "2010"; month: "Jun"; expenses: "5"; income: "8" }
+ ListElement{ year: "2010"; month: "Jul"; expenses: "3"; income: "7" }
+ ListElement{ year: "2010"; month: "Aug"; expenses: "1"; income: "5" }
+ ListElement{ year: "2010"; month: "Sep"; expenses: "2"; income: "4" }
+ ListElement{ year: "2010"; month: "Oct"; expenses: "10"; income: "13" }
+ ListElement{ year: "2010"; month: "Nov"; expenses: "12"; income: "17" }
+ ListElement{ year: "2010"; month: "Dec"; expenses: "6"; income: "9" }
+
+ ListElement{ year: "2011"; month: "Jan"; expenses: "2"; income: "6" }
+ ListElement{ year: "2011"; month: "Feb"; expenses: "4"; income: "8" }
+ ListElement{ year: "2011"; month: "Mar"; expenses: "7"; income: "12" }
+ ListElement{ year: "2011"; month: "Apr"; expenses: "9"; income: "15" }
+ ListElement{ year: "2011"; month: "May"; expenses: "7"; income: "19" }
+ ListElement{ year: "2011"; month: "Jun"; expenses: "9"; income: "18" }
+ ListElement{ year: "2011"; month: "Jul"; expenses: "13"; income: "17" }
+ ListElement{ year: "2011"; month: "Aug"; expenses: "5"; income: "9" }
+ ListElement{ year: "2011"; month: "Sep"; expenses: "3"; income: "8" }
+ ListElement{ year: "2011"; month: "Oct"; expenses: "13"; income: "15" }
+ ListElement{ year: "2011"; month: "Nov"; expenses: "8"; income: "17" }
+ ListElement{ year: "2011"; month: "Dec"; expenses: "7"; income: "10" }
+
+ ListElement{ year: "2012"; month: "Jan"; expenses: "12"; income: "16" }
+ ListElement{ year: "2012"; month: "Feb"; expenses: "24"; income: "28" }
+ ListElement{ year: "2012"; month: "Mar"; expenses: "27"; income: "22" }
+ ListElement{ year: "2012"; month: "Apr"; expenses: "29"; income: "25" }
+ ListElement{ year: "2012"; month: "May"; expenses: "27"; income: "29" }
+ ListElement{ year: "2012"; month: "Jun"; expenses: "19"; income: "18" }
+ ListElement{ year: "2012"; month: "Jul"; expenses: "13"; income: "17" }
+ ListElement{ year: "2012"; month: "Aug"; expenses: "15"; income: "19" }
+ ListElement{ year: "2012"; month: "Sep"; expenses: "3"; income: "8" }
+ ListElement{ year: "2012"; month: "Oct"; expenses: "3"; income: "6" }
+ ListElement{ year: "2012"; month: "Nov"; expenses: "4"; income: "8" }
+ ListElement{ year: "2012"; month: "Dec"; expenses: "5"; income: "9" }
+ }
+}
diff --git a/examples/datavisualization/qmlbars/qml/qmlbars/main.qml b/examples/datavisualization/qmlbars/qml/qmlbars/main.qml
new file mode 100644
index 00000000..0ff060ca
--- /dev/null
+++ b/examples/datavisualization/qmlbars/qml/qmlbars/main.qml
@@ -0,0 +1,303 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtQuick.Controls 1.0
+import QtQuick.Layouts 1.0
+import QtDataVisualization 1.0
+import QtQuick.Window 2.0
+import "."
+
+Item {
+ id: mainview
+ width: 1280
+ height: 1024
+
+ property int buttonLayoutHeight: 180;
+ state: Screen.width < Screen.height ? "portrait" : "landscape"
+
+ Data {
+ id: graphData
+ }
+
+ Axes {
+ id: graphAxes
+ }
+
+ property Bar3DSeries selectedSeries
+ selectedSeries: barSeries
+
+ function handleSelectionChange(series, position) {
+ if (position != series.invalidSelectionPosition) {
+ selectedSeries = series
+ }
+
+ // Set tableView current row to selected bar
+ var rowRole = series.dataProxy.rowLabels[position.x];
+ var colRole = series.dataProxy.columnLabels[position.y];
+ var currentRow = tableView.currentRow
+ if (currentRow === -1 || rowRole !== graphData.model.get(currentRow).year
+ || colRole !== graphData.model.get(currentRow).month) {
+ var totalRows = tableView.rowCount;
+ for (var i = 0; i < totalRows; i++) {
+ var currentRowRole = graphData.model.get(i).year
+ var currentColRole = graphData.model.get(i).month
+ if (currentRowRole === rowRole && currentColRole === colRole) {
+ tableView.currentRow = i
+ // Workaround to 5.2 row selection issue
+ if (typeof tableView.selection != "undefined") {
+ tableView.selection.clear()
+ tableView.selection.select(i)
+ }
+ break
+ }
+ }
+ }
+ }
+
+ Item {
+ id: dataView
+ anchors.right: mainview.right;
+ anchors.bottom: mainview.bottom
+
+ Bars3D {
+ id: barGraph
+ width: dataView.width
+ height: dataView.height
+ shadowQuality: AbstractGraph3D.ShadowQualityMedium
+ selectionMode: AbstractGraph3D.SelectionItem
+ theme: Theme3D {
+ type: Theme3D.ThemeRetro
+ labelBorderEnabled: true
+ font.pointSize: 35
+ labelBackgroundEnabled: true
+ colorStyle: Theme3D.ColorStyleRangeGradient
+ singleHighlightGradient: customGradient
+
+ ColorGradient {
+ id: customGradient
+ ColorGradientStop { position: 1.0; color: "#FFFF00" }
+ ColorGradientStop { position: 0.0; color: "#808000" }
+ }
+ }
+ barThickness: 0.7
+ barSpacing: Qt.size(0.5, 0.5)
+ barSpacingRelative: false
+ scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeftHigh
+ columnAxis: graphAxes.column
+ valueAxis: graphAxes.income
+
+ //! [3]
+ Bar3DSeries {
+ id: barSeries
+ itemLabelFormat: "Income for @colLabel, @rowLabel: @valueLabel"
+ baseGradient: barGradient
+
+ ItemModelBarDataProxy {
+ id: modelProxy
+ itemModel: graphData.model
+ rowRole: "year"
+ columnRole: "month"
+ valueRole: "income"
+ }
+ //! [3]
+
+ ColorGradient {
+ id: barGradient
+ ColorGradientStop { position: 1.0; color: "#00FF00" }
+ ColorGradientStop { position: 0.0; color: "#006000" }
+ }
+
+ onSelectedBarChanged: handleSelectionChange(barSeries, position)
+ }
+
+ //! [4]
+ Bar3DSeries {
+ id: secondarySeries
+ visible: false
+ itemLabelFormat: "Expenses for @colLabel, @rowLabel: @valueLabel"
+ baseGradient: secondaryGradient
+
+ ItemModelBarDataProxy {
+ id: secondaryProxy
+ itemModel: graphData.model
+ rowRole: "year"
+ columnRole: "month"
+ valueRole: "expenses"
+ }
+ //! [4]
+
+ ColorGradient {
+ id: secondaryGradient
+ ColorGradientStop { position: 1.0; color: "#FF0000" }
+ ColorGradientStop { position: 0.0; color: "#600000" }
+ }
+
+ onSelectedBarChanged: handleSelectionChange(secondarySeries, position)
+ }
+ }
+ }
+
+ TableView {
+ id: tableView
+ anchors.top: parent.top
+ anchors.left: parent.left
+ TableViewColumn{ role: "year" ; title: "Year" ; width: tableView.width / 4 }
+ TableViewColumn{ role: "month" ; title: "Month" ; width: tableView.width / 4 }
+ TableViewColumn{ role: "expenses" ; title: "Expenses" ; width: tableView.width / 4 }
+ TableViewColumn{ role: "income" ; title: "Income" ; width: tableView.width / 4 }
+ model: graphData.model
+
+ //! [2]
+ onCurrentRowChanged: {
+ var rowIndex = modelProxy.rowCategoryIndex(graphData.model.get(currentRow).year)
+ var colIndex = modelProxy.columnCategoryIndex(graphData.model.get(currentRow).month)
+ if (selectedSeries.visible)
+ mainview.selectedSeries.selectedBar = Qt.point(rowIndex, colIndex)
+ else if (barSeries.visible)
+ barSeries.selectedBar = Qt.point(rowIndex, colIndex)
+ else
+ secondarySeries.selectedBar = Qt.point(rowIndex, colIndex)
+ }
+ //! [2]
+ }
+
+ ColumnLayout {
+ id: controlLayout
+ spacing: 0
+
+ Button {
+ id: dataToggle
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ text: "Show 2010 - 2012"
+ clip: true
+ //! [1]
+ onClicked: {
+ if (barGraph.rowAxis.max !== 6) {
+ text = "Show 2010 - 2012"
+ modelProxy.autoRowCategories = true
+ secondaryProxy.autoRowCategories = true
+ } else {
+ text = "Show all years"
+ // Explicitly defining row categories, since we do not want to show data for
+ // all years in the model, just for the selected ones.
+ modelProxy.autoRowCategories = false
+ secondaryProxy.autoRowCategories = false
+ modelProxy.rowCategories = ["2010", "2011", "2012"]
+ secondaryProxy.rowCategories = ["2010", "2011", "2012"]
+ }
+ }
+ //! [1]
+ }
+
+ Button {
+ id: shadowToggle
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ text: "Hide Shadows"
+ clip: true
+ onClicked: {
+ if (barGraph.shadowQuality == AbstractGraph3D.ShadowQualityNone) {
+ barGraph.shadowQuality = AbstractGraph3D.ShadowQualityMedium;
+ text = "Hide Shadows"
+ } else {
+ barGraph.shadowQuality = AbstractGraph3D.ShadowQualityNone;
+ text = "Show Shadows"
+ }
+ }
+ }
+
+ Button {
+ id: seriesToggle
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ text: "Show Expenses"
+ clip: true
+ //! [0]
+ onClicked: {
+ if (!secondarySeries.visible) {
+ text = "Show Both"
+ barGraph.valueAxis = graphAxes.expenses
+ barSeries.visible = false
+ secondarySeries.visible = true
+ } else if (!barSeries.visible){
+ barSeries.visible = true
+ text = "Show Income"
+ barGraph.valueAxis = graphAxes.income
+ } else {
+ secondarySeries.visible = false
+ text = "Show Expenses"
+ barGraph.valueAxis = graphAxes.income
+ }
+ }
+ //! [0]
+ }
+ }
+
+ states: [
+ State {
+ name: "landscape"
+ PropertyChanges {
+ target: dataView
+ width: mainview.width / 4 * 3
+ height: mainview.height
+ }
+ PropertyChanges {
+ target: tableView
+ height: mainview.height - buttonLayoutHeight
+ anchors.right: dataView.left
+ anchors.left: mainview.left
+ anchors.bottom: undefined
+ }
+ PropertyChanges {
+ target: controlLayout
+ width: mainview.width / 4
+ height: buttonLayoutHeight
+ anchors.top: tableView.bottom
+ anchors.bottom: mainview.bottom
+ anchors.left: mainview.left
+ anchors.right: dataView.left
+ }
+ },
+ State {
+ name: "portrait"
+ PropertyChanges {
+ target: dataView
+ width: mainview.height / 4 * 3
+ height: mainview.width
+ }
+ PropertyChanges {
+ target: tableView
+ height: mainview.width
+ anchors.right: controlLayout.left
+ anchors.left: mainview.left
+ anchors.bottom: dataView.top
+ }
+ PropertyChanges {
+ target: controlLayout
+ width: mainview.height / 4
+ height: mainview.width / 4
+ anchors.top: mainview.top
+ anchors.bottom: dataView.top
+ anchors.left: undefined
+ anchors.right: mainview.right
+ }
+ }
+ ]
+}
diff --git a/examples/datavisualization/qmlbars/qmlbars.desktop b/examples/datavisualization/qmlbars/qmlbars.desktop
new file mode 100644
index 00000000..cf59c6b8
--- /dev/null
+++ b/examples/datavisualization/qmlbars/qmlbars.desktop
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Encoding=UTF-8
+Version=1.0
+Type=Application
+Terminal=false
+Name=qmlbars
+Exec=/opt/qmlbars/bin/qmlbars
+Icon=qmlbars64
+X-Window-Icon=
+X-HildonDesk-ShowInToolbar=true
+X-Osso-Type=application/x-executable
diff --git a/examples/datavisualization/qmlbars/qmlbars.pro b/examples/datavisualization/qmlbars/qmlbars.pro
new file mode 100644
index 00000000..c3d48fd9
--- /dev/null
+++ b/examples/datavisualization/qmlbars/qmlbars.pro
@@ -0,0 +1,20 @@
+!include( ../examples.pri ) {
+ error( "Couldn't find the examples.pri file!" )
+}
+
+# Add more folders to ship with the application, here
+folder_01.source = qml/qmlbars
+folder_01.target = qml
+DEPLOYMENTFOLDERS = folder_01
+
+# Additional import path used to resolve QML modules in Creator's code model
+QML_IMPORT_PATH =
+
+# The .cpp file which was generated for your project. Feel free to hack it.
+SOURCES += main.cpp
+
+# Please do not modify the following two lines. Required for deployment.
+include(qtquick2applicationviewer/qtquick2applicationviewer.pri)
+qtcAddDeployment()
+
+RESOURCES += qmlbars.qrc
diff --git a/examples/datavisualization/qmlbars/qmlbars.qrc b/examples/datavisualization/qmlbars/qmlbars.qrc
new file mode 100644
index 00000000..2240fbef
--- /dev/null
+++ b/examples/datavisualization/qmlbars/qmlbars.qrc
@@ -0,0 +1,7 @@
+<RCC>
+ <qresource prefix="/">
+ <file>qml/qmlbars/Axes.qml</file>
+ <file>qml/qmlbars/Data.qml</file>
+ <file>qml/qmlbars/main.qml</file>
+ </qresource>
+</RCC>
diff --git a/examples/datavisualization/qmlbars/qmlbars64.png b/examples/datavisualization/qmlbars/qmlbars64.png
new file mode 100644
index 00000000..707d5c4e
--- /dev/null
+++ b/examples/datavisualization/qmlbars/qmlbars64.png
Binary files differ
diff --git a/examples/datavisualization/qmlbars/qtquick2applicationviewer/qtquick2applicationviewer.cpp b/examples/datavisualization/qmlbars/qtquick2applicationviewer/qtquick2applicationviewer.cpp
new file mode 100644
index 00000000..10709d7a
--- /dev/null
+++ b/examples/datavisualization/qmlbars/qtquick2applicationviewer/qtquick2applicationviewer.cpp
@@ -0,0 +1,81 @@
+// checksum 0x4f6f version 0x90005
+/*
+ This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
+ QtQuick2ApplicationViewer is a convenience class containing mobile device specific
+ code such as screen orientation handling. Also QML paths and debugging are
+ handled here.
+ It is recommended not to modify this file, since newer versions of Qt Creator
+ may offer an updated version of it.
+*/
+
+#include "qtquick2applicationviewer.h"
+
+#include <QtCore/QCoreApplication>
+#include <QtCore/QDir>
+#include <QtQml/QQmlEngine>
+
+class QtQuick2ApplicationViewerPrivate
+{
+ QString mainQmlFile;
+ friend class QtQuick2ApplicationViewer;
+ static QString adjustPath(const QString &path);
+};
+
+QString QtQuick2ApplicationViewerPrivate::adjustPath(const QString &path)
+{
+#if defined(Q_OS_MAC)
+ if (!QDir::isAbsolutePath(path))
+ return QString::fromLatin1("%1/../Resources/%2")
+ .arg(QCoreApplication::applicationDirPath(), path);
+#elif defined(Q_OS_BLACKBERRY)
+ if (!QDir::isAbsolutePath(path))
+ return QString::fromLatin1("app/native/%1").arg(path);
+#elif !defined(Q_OS_ANDROID)
+ QString pathInInstallDir =
+ QString::fromLatin1("%1/../%2").arg(QCoreApplication::applicationDirPath(), path);
+ if (QFileInfo(pathInInstallDir).exists())
+ return pathInInstallDir;
+ pathInInstallDir =
+ QString::fromLatin1("%1/%2").arg(QCoreApplication::applicationDirPath(), path);
+ if (QFileInfo(pathInInstallDir).exists())
+ return pathInInstallDir;
+#endif
+ return path;
+}
+
+QtQuick2ApplicationViewer::QtQuick2ApplicationViewer(QWindow *parent)
+ : QQuickView(parent)
+ , d(new QtQuick2ApplicationViewerPrivate())
+{
+ connect(engine(), SIGNAL(quit()), SLOT(close()));
+ setResizeMode(QQuickView::SizeRootObjectToView);
+}
+
+QtQuick2ApplicationViewer::~QtQuick2ApplicationViewer()
+{
+ delete d;
+}
+
+void QtQuick2ApplicationViewer::setMainQmlFile(const QString &file)
+{
+ d->mainQmlFile = QtQuick2ApplicationViewerPrivate::adjustPath(file);
+#ifdef Q_OS_ANDROID
+ setSource(QUrl(QLatin1String("assets:/")+d->mainQmlFile));
+#else
+ setSource(QUrl::fromLocalFile(d->mainQmlFile));
+#endif
+}
+
+void QtQuick2ApplicationViewer::addImportPath(const QString &path)
+{
+ engine()->addImportPath(QtQuick2ApplicationViewerPrivate::adjustPath(path));
+}
+
+void QtQuick2ApplicationViewer::showExpanded()
+{
+#if defined(Q_WS_SIMULATOR) || defined(Q_OS_QNX)
+ showFullScreen();
+#else
+ show();
+#endif
+}
diff --git a/examples/datavisualization/qmlbars/qtquick2applicationviewer/qtquick2applicationviewer.h b/examples/datavisualization/qmlbars/qtquick2applicationviewer/qtquick2applicationviewer.h
new file mode 100644
index 00000000..cf66f140
--- /dev/null
+++ b/examples/datavisualization/qmlbars/qtquick2applicationviewer/qtquick2applicationviewer.h
@@ -0,0 +1,33 @@
+// checksum 0xfde6 version 0x90005
+/*
+ This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
+ QtQuick2ApplicationViewer is a convenience class containing mobile device specific
+ code such as screen orientation handling. Also QML paths and debugging are
+ handled here.
+ It is recommended not to modify this file, since newer versions of Qt Creator
+ may offer an updated version of it.
+*/
+
+#ifndef QTQUICK2APPLICATIONVIEWER_H
+#define QTQUICK2APPLICATIONVIEWER_H
+
+#include <QtQuick/QQuickView>
+
+class QtQuick2ApplicationViewer : public QQuickView
+{
+ Q_OBJECT
+
+public:
+ explicit QtQuick2ApplicationViewer(QWindow *parent = 0);
+ virtual ~QtQuick2ApplicationViewer();
+
+ void setMainQmlFile(const QString &file);
+ void addImportPath(const QString &path);
+
+ void showExpanded();
+
+private:
+ class QtQuick2ApplicationViewerPrivate *d;
+};
+
+#endif // QTQUICK2APPLICATIONVIEWER_H
diff --git a/examples/datavisualization/qmlbars/qtquick2applicationviewer/qtquick2applicationviewer.pri b/examples/datavisualization/qmlbars/qtquick2applicationviewer/qtquick2applicationviewer.pri
new file mode 100644
index 00000000..e5f7990f
--- /dev/null
+++ b/examples/datavisualization/qmlbars/qtquick2applicationviewer/qtquick2applicationviewer.pri
@@ -0,0 +1,180 @@
+# checksum 0x7b0d version 0x90005
+# This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
+# The code below adds the QtQuick2ApplicationViewer to the project and handles
+# the activation of QML debugging.
+# It is recommended not to modify this file, since newer versions of Qt Creator
+# may offer an updated version of it.
+
+QT += qml quick
+
+SOURCES += $$PWD/qtquick2applicationviewer.cpp
+HEADERS += $$PWD/qtquick2applicationviewer.h
+INCLUDEPATH += $$PWD
+# This file was generated by an application wizard of Qt Creator.
+# The code below handles deployment to Android and Maemo, aswell as copying
+# of the application data to shadow build directories on desktop.
+# It is recommended not to modify this file, since newer versions of Qt Creator
+# may offer an updated version of it.
+
+defineTest(qtcAddDeployment) {
+for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ greaterThan(QT_MAJOR_VERSION, 4) {
+ itemsources = $${item}.files
+ } else {
+ itemsources = $${item}.sources
+ }
+ $$itemsources = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath= $$eval($${deploymentfolder}.target)
+ export($$itemsources)
+ export($$itempath)
+ DEPLOYMENT += $$item
+}
+
+MAINPROFILEPWD = $$PWD
+
+android-no-sdk {
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemfiles = $${item}.files
+ $$itemfiles = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath = /data/user/qt/$$eval($${deploymentfolder}.target)
+ export($$itemfiles)
+ export($$itempath)
+ INSTALLS += $$item
+ }
+
+ target.path = /data/user/qt
+
+ export(target.path)
+ INSTALLS += target
+} else:android {
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemfiles = $${item}.files
+ $$itemfiles = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath = /assets/$$eval($${deploymentfolder}.target)
+ export($$itemfiles)
+ export($$itempath)
+ INSTALLS += $$item
+ }
+
+ x86 {
+ target.path = /libs/x86
+ } else: armeabi-v7a {
+ target.path = /libs/armeabi-v7a
+ } else {
+ target.path = /libs/armeabi
+ }
+
+ export(target.path)
+ INSTALLS += target
+} else:win32 {
+ copyCommand =
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
+ source = $$replace(source, /, \\)
+ sourcePathSegments = $$split(source, \\)
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)/$$last(sourcePathSegments)
+ target = $$replace(target, /, \\)
+ target ~= s,\\\\\\.?\\\\,\\,
+ !isEqual(source,$$target) {
+ !isEmpty(copyCommand):copyCommand += &&
+ isEqual(QMAKE_DIR_SEP, \\) {
+ copyCommand += $(COPY_DIR) \"$$source\" \"$$target\"
+ } else {
+ source = $$replace(source, \\\\, /)
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
+ target = $$replace(target, \\\\, /)
+ copyCommand += test -d \"$$target\" || mkdir -p \"$$target\" && cp -r \"$$source\" \"$$target\"
+ }
+ }
+ }
+ !isEmpty(copyCommand) {
+ copyCommand = @echo Copying application data... && $$copyCommand
+ copydeploymentfolders.commands = $$copyCommand
+ first.depends = $(first) copydeploymentfolders
+ export(first.depends)
+ export(copydeploymentfolders.commands)
+ QMAKE_EXTRA_TARGETS += first copydeploymentfolders
+ }
+} else:unix {
+ maemo5 {
+ desktopfile.files = $${TARGET}.desktop
+ desktopfile.path = /usr/share/applications/hildon
+ icon.files = $${TARGET}64.png
+ icon.path = /usr/share/icons/hicolor/64x64/apps
+ } else:!isEmpty(MEEGO_VERSION_MAJOR) {
+ desktopfile.files = $${TARGET}_harmattan.desktop
+ desktopfile.path = /usr/share/applications
+ icon.files = $${TARGET}80.png
+ icon.path = /usr/share/icons/hicolor/80x80/apps
+ } else { # Assumed to be a Desktop Unix
+ copyCommand =
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
+ source = $$replace(source, \\\\, /)
+ macx {
+ target = $$OUT_PWD/$${TARGET}.app/Contents/Resources/$$eval($${deploymentfolder}.target)
+ } else {
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
+ }
+ target = $$replace(target, \\\\, /)
+ sourcePathSegments = $$split(source, /)
+ targetFullPath = $$target/$$last(sourcePathSegments)
+ targetFullPath ~= s,/\\.?/,/,
+ !isEqual(source,$$targetFullPath) {
+ !isEmpty(copyCommand):copyCommand += &&
+ copyCommand += $(MKDIR) \"$$target\"
+ copyCommand += && $(COPY_DIR) \"$$source\" \"$$target\"
+ }
+ }
+ !isEmpty(copyCommand) {
+ copyCommand = @echo Copying application data... && $$copyCommand
+ copydeploymentfolders.commands = $$copyCommand
+ first.depends = $(first) copydeploymentfolders
+ export(first.depends)
+ export(copydeploymentfolders.commands)
+ QMAKE_EXTRA_TARGETS += first copydeploymentfolders
+ }
+ }
+ !isEmpty(target.path) {
+ installPrefix = $${target.path}
+ } else {
+ installPrefix = /opt/$${TARGET}
+ }
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemfiles = $${item}.files
+ $$itemfiles = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath = $${installPrefix}/$$eval($${deploymentfolder}.target)
+ export($$itemfiles)
+ export($$itempath)
+ INSTALLS += $$item
+ }
+
+ !isEmpty(desktopfile.path) {
+ export(icon.files)
+ export(icon.path)
+ export(desktopfile.files)
+ export(desktopfile.path)
+ INSTALLS += icon desktopfile
+ }
+
+ isEmpty(target.path) {
+ target.path = $${installPrefix}/bin
+ export(target.path)
+ }
+ INSTALLS += target
+}
+
+export (ICON)
+export (INSTALLS)
+export (DEPLOYMENT)
+export (LIBS)
+export (QMAKE_EXTRA_TARGETS)
+}
diff --git a/examples/datavisualization/qmlcustominput/doc/images/qmlcustominput-example.png b/examples/datavisualization/qmlcustominput/doc/images/qmlcustominput-example.png
new file mode 100644
index 00000000..1de740ea
--- /dev/null
+++ b/examples/datavisualization/qmlcustominput/doc/images/qmlcustominput-example.png
Binary files differ
diff --git a/examples/datavisualization/qmlcustominput/doc/src/qmlcustominput.qdoc b/examples/datavisualization/qmlcustominput/doc/src/qmlcustominput.qdoc
new file mode 100644
index 00000000..7702dadf
--- /dev/null
+++ b/examples/datavisualization/qmlcustominput/doc/src/qmlcustominput.qdoc
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+/*!
+ \example qmlcustominput
+ \title Qt Quick Custom Input Example
+ \ingroup qtdatavisualization_examples
+ \brief Customizing input in a Qt Quick application.
+
+ The Qt Quick Custom Input example shows how to customize the 3D graph controls from Qt Quick using the MouseArea to capture and process mouse events in Qt Quick.
+ Custom input handling code in this example shows how the camera is now controlled by using NumberAnimation to animate the camera and item selection
+ is done on mouseover rather than clicking any mouse buttons. Also the code shows how to implement similar zoom with mouse wheel functionality as the default
+ input handler implements.
+
+ \image qmlcustominput-example.png
+
+ \section1 Removing default input handling
+
+ The default input handling mechanism is disabled by setting the inputHandler property to null.
+
+ \snippet ../examples/qmlcustominput/qml/qmlcustominput/main.qml 0
+ \dots 0
+ \snippet ../examples/qmlcustominput/qml/qmlcustominput/main.qml 1
+ \dots 0
+
+ \section1 Implementing custom selection handling
+
+ The on mouseover selection handling is implemented using standard MouseArea to capture the mouse events.
+ The mouse area is configured to capture hover events and has two custom properties for \c mouseX and \c mouseY
+ to store the last known mouse coordinates.
+
+ \snippet ../examples/qmlcustominput/qml/qmlcustominput/main.qml 2
+
+ Whenever a pointer movement related signal is received the code updates the \c mouseX and \c mouseY properties.
+
+ \snippet ../examples/qmlcustominput/qml/qmlcustominput/main.qml 3
+
+ As the selection is one shot, and is cleared each time a 3D frame is rendered, a timer is setup to retrigger selection so that the selection moves to the item
+ currently under the mouse cursor as the camera animates around the graph even when the mouse cursor is not moving.
+
+ \snippet ../examples/qmlcustominput/qml/qmlcustominput/main.qml 4
+
+ \section1 Implementing custom zoom handling
+
+ The camera has a zoom factor that represents amount of zoom in percentages. In this example the zoom range is limited
+ between 10% and 500%. This range is then divided to four subranges where angleDelta is scaled to different amount of zoom change
+ based on the current subrange.
+
+ \dots
+ \snippet ../examples/qmlcustominput/qml/qmlcustominput/main.qml 5
+ \dots
+
+ \section1 Implementing custom camera handling
+
+ The camera is animated to constantly rotate around the graph with two animations. The rotation around the graph is done with
+ a simple NumberAnimation that just increments during 20 seconds from 0 degrees to 360 degrees and sets the \l Q3DCamera::xRotation property.
+
+ \snippet ../examples/qmlcustominput/qml/qmlcustominput/main.qml 6
+
+ The camera movement up and down is implemented with a SequentialAnimation that varies the \l Q3DCamera::yRotation property of the camera
+ from 5 degrees to 45 degrees and back with in and out easing.
+
+ \snippet ../examples/qmlcustominput/qml/qmlcustominput/main.qml 7
+*/
diff --git a/examples/datavisualization/qmlcustominput/main.cpp b/examples/datavisualization/qmlcustominput/main.cpp
new file mode 100644
index 00000000..9bb88836
--- /dev/null
+++ b/examples/datavisualization/qmlcustominput/main.cpp
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** 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 "qtquick2applicationviewer.h"
+#include <QtDataVisualization/qutils.h>
+
+#include <QtGui/QGuiApplication>
+#include <QtCore/QDir>
+
+int main(int argc, char *argv[])
+{
+ QGuiApplication app(argc, argv);
+
+ QtQuick2ApplicationViewer viewer;
+
+ // Enable antialiasing
+ viewer.setFormat(QtDataVisualization::qDefaultSurfaceFormat());
+
+ // The following are needed to make examples run without having to install the module
+ // in desktop environments.
+#ifdef Q_OS_WIN
+ QString extraImportPath(QStringLiteral("%1/../../../../%2"));
+#else
+ QString extraImportPath(QStringLiteral("%1/../../../%2"));
+#endif
+ viewer.addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
+ QString::fromLatin1("qml")));
+
+ viewer.setTitle(QStringLiteral("QML Custom Input"));
+
+ viewer.setSource(QUrl("qrc:/qml/qmlcustominput/main.qml"));
+ viewer.setResizeMode(QQuickView::SizeRootObjectToView);
+ viewer.show();
+
+ return app.exec();
+}
diff --git a/examples/datavisualization/qmlcustominput/qml/qmlcustominput/Data.qml b/examples/datavisualization/qmlcustominput/qml/qmlcustominput/Data.qml
new file mode 100644
index 00000000..201247f1
--- /dev/null
+++ b/examples/datavisualization/qmlcustominput/qml/qmlcustominput/Data.qml
@@ -0,0 +1,1087 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+import QtQuick 2.1
+
+Item {
+ property alias model: dataModel
+
+ ListModel {
+ id: dataModel
+ ListElement{ xPos: -10.0000; yPos: 5.00000; zPos: -5.00000 }
+ ListElement{ xPos: -9.06229; yPos: 3.07132; zPos: -4.54268 }
+ ListElement{ xPos: -8.55132; yPos: 4.19424; zPos: -4.03318 }
+ ListElement{ xPos: -8.03806; yPos: 4.75162; zPos: -3.99583 }
+ ListElement{ xPos: -9.50337; yPos: 4.90684; zPos: -4.21947 }
+ ListElement{ xPos: -9.93819; yPos: 3.42724; zPos: -3.58955 }
+ ListElement{ xPos: -7.84971; yPos: 3.15272; zPos: -4.90367 }
+ ListElement{ xPos: -7.30477; yPos: 2.91062; zPos: -4.11078 }
+ ListElement{ xPos: -7.11201; yPos: 3.68863; zPos: -4.52683 }
+ ListElement{ xPos: -8.83267; yPos: 2.96504; zPos: -3.61108 }
+ ListElement{ xPos: -6.94874; yPos: 2.49808; zPos: -2.92883 }
+ ListElement{ xPos: -9.02606; yPos: 4.7496; zPos: -4.18193 }
+ ListElement{ xPos: -9.5434; yPos: 3.15534; zPos: -3.83789 }
+ ListElement{ xPos: -6.8679; yPos: 3.66922; zPos: -3.58288 }
+ ListElement{ xPos: -8.16487; yPos: 1.82227; zPos: -4.64523 }
+ ListElement{ xPos: -7.42165; yPos: 3.18192; zPos: -4.22791 }
+ ListElement{ xPos: -7.99257; yPos: 3.06559; zPos: -4.33262 }
+ ListElement{ xPos: -8.98851; yPos: 2.64924; zPos: -4.44595 }
+ ListElement{ xPos: -6.36774; yPos: 3.96697; zPos: -4.38998 }
+ ListElement{ xPos: -7.18413; yPos: 3.32417; zPos: -4.04636 }
+ ListElement{ xPos: -7.91649; yPos: 3.46826; zPos: -2.78126 }
+ ListElement{ xPos: -7.49495; yPos: 3.12306; zPos: -3.14539 }
+ ListElement{ xPos: -7.5445; yPos: 2.85744; zPos: -3.68421 }
+
+ ListElement{ xPos: 2.25354; yPos: 1.36828; zPos: -1.32025 }
+ ListElement{ xPos: -2.35524; yPos: -0.081203; zPos: 1.23267 }
+ ListElement{ xPos: 2.6517; yPos: -1.20549; zPos: 2.73606 }
+ ListElement{ xPos: -2.55382; yPos: 3.48814; zPos: -0.454971 }
+ ListElement{ xPos: -3.85468; yPos: 0.263955; zPos: 0.578276 }
+ ListElement{ xPos: 2.85275; yPos: 1.32315; zPos: 1.0565 }
+ ListElement{ xPos: -0.404099; yPos: -2.36811; zPos: -1.60324 }
+ ListElement{ xPos: 1.58908; yPos: 0.363782; zPos: -0.554303 }
+ ListElement{ xPos: 0.251507; yPos: 0.124637; zPos: -0.752568 }
+ ListElement{ xPos: -2.45626; yPos: -0.722719; zPos: -1.11764 }
+ ListElement{ xPos: 4.15342; yPos: 1.92247; zPos: -0.954975 }
+ ListElement{ xPos: 2.05845; yPos: 0.643191; zPos: -0.121564 }
+ ListElement{ xPos: 0.253468; yPos: 0.814651; zPos: 3.05732 }
+ ListElement{ xPos: 1.51724; yPos: 0.244303; zPos: 2.25864 }
+ ListElement{ xPos: 1.15; yPos: -0.487518; zPos: 0.815931 }
+ ListElement{ xPos: -0.0538979; yPos: 0.124927; zPos: 0.251571 }
+ ListElement{ xPos: 0.941523; yPos: -0.483498; zPos: -3.2731 }
+ ListElement{ xPos: 3.55074; yPos: -1.04714; zPos: -0.954301 }
+ ListElement{ xPos: -2.43125; yPos: -0.964099; zPos: -0.658537 }
+ ListElement{ xPos: 4.25459; yPos: 0.163296; zPos: 2.05563 }
+ ListElement{ xPos: -0.612031; yPos: 1.03234; zPos: -0.227175 }
+ ListElement{ xPos: 0.78338; yPos: -0.847922; zPos: -0.959189 }
+ ListElement{ xPos: -4.20076; yPos: 1.44907; zPos: 0.853836 }
+ ListElement{ xPos: -1.59466; yPos: -1.27511; zPos: -1.5686 }
+ ListElement{ xPos: -3.3567; yPos: -1.96864; zPos: 1.83224 }
+ ListElement{ xPos: -2.75169; yPos: -0.964221; zPos: -1.26465 }
+ ListElement{ xPos: -2.45624; yPos: 0.287046; zPos: -4.55032 }
+ ListElement{ xPos: 2.73649; yPos: -1.48789; zPos: -0.653082 }
+ ListElement{ xPos: 2.73284; yPos: 2.2912; zPos: -2.4933 }
+ ListElement{ xPos: -0.854321; yPos: -2.04288; zPos: 3.7516 }
+ ListElement{ xPos: -1.35708; yPos: -1.84915; zPos: 2.35985 }
+ ListElement{ xPos: -3.25001; yPos: -1.64456; zPos: -4.45419 }
+ ListElement{ xPos: -0.356834; yPos: -0.569139; zPos: -1.75308 }
+ ListElement{ xPos: -0.813569; yPos: -0.287899; zPos: -0.0535036 }
+ ListElement{ xPos: 4.75975; yPos: -1.48817; zPos: -2.45957 }
+ ListElement{ xPos: 4.35294; yPos: 1.46154; zPos: 0.814214 }
+ ListElement{ xPos: -3.22467; yPos: 2.76903; zPos: 0.510435 }
+ ListElement{ xPos: 2.49494; yPos: 1.9286; zPos: 0.552287 }
+ ListElement{ xPos: -0.456521; yPos: 0.688277; zPos: -0.82788 }
+ ListElement{ xPos: -2.72568; yPos: 2.80278; zPos: -2.45782 }
+ ListElement{ xPos: -1.65023; yPos: 1.32005; zPos: -2.05754 }
+ ListElement{ xPos: -1.63551; yPos: 1.88519; zPos: -3.65544 }
+ ListElement{ xPos: -1.20008; yPos: -0.723785; zPos: 0.853563 }
+ ListElement{ xPos: 1.45448; yPos: 1.08701; zPos: 2.17385 }
+ ListElement{ xPos: -3.9042; yPos: -1.16916; zPos: -0.85395 }
+ ListElement{ xPos: 3.15645; yPos: 0.123932; zPos: -0.950988 }
+ ListElement{ xPos: -1.35924; yPos: -2.64015; zPos: -0.54254 }
+ ListElement{ xPos: -4.15753; yPos: 1.28294; zPos: -4.47502 }
+ ListElement{ xPos: -2.7885; yPos: 2.48535; zPos: -0.159651 }
+ ListElement{ xPos: -3.44364; yPos: 0.627232; zPos: 0.611881 }
+ ListElement{ xPos: -1.55639; yPos: -0.967484; zPos: 2.35497 }
+ ListElement{ xPos: -0.752853; yPos: 1.16736; zPos: -0.757871 }
+ ListElement{ xPos: -0.859974; yPos: 0.640213; zPos: -1.75453 }
+ ListElement{ xPos: 0.85744; yPos: 0.480175; zPos: 2.97204 }
+ ListElement{ xPos: 4.0571; yPos: 3.24083; zPos: -0.183622 }
+ ListElement{ xPos: 0.658087; yPos: 0.841418; zPos: 0.357839 }
+ ListElement{ xPos: -2.13027; yPos: 0.920836; zPos: -2.758 }
+ ListElement{ xPos: -0.65825; yPos: 0.164257; zPos: 1.69478 }
+ ListElement{ xPos: -1.88335; yPos: -1.4811; zPos: -2.15408 }
+ ListElement{ xPos: -1.67331; yPos: 2.96982; zPos: 1.85521 }
+ ListElement{ xPos: -0.750937; yPos: 0.282914; zPos: -0.758707 }
+ ListElement{ xPos: 2.29891; yPos: 1.16949; zPos: 2.65927 }
+ ListElement{ xPos: 2.69132; yPos: 2.92632; zPos: -0.206126 }
+ ListElement{ xPos: -1.65771; yPos: 3.28846; zPos: 2.50201 }
+ ListElement{ xPos: -0.568799; yPos: 2.5289; zPos: -1.15875 }
+ ListElement{ xPos: -1.85383; yPos: 0.528953; zPos: -2.32418 }
+ ListElement{ xPos: 0.159422; yPos: -2.36165; zPos: -0.569393 }
+ ListElement{ xPos: -3.96506; yPos: 0.282374; zPos: -0.254519 }
+ ListElement{ xPos: 0.150933; yPos: -3.88058; zPos: -0.759422 }
+ ListElement{ xPos: -1.17917; yPos: -1.96176; zPos: 0.95589 }
+ ListElement{ xPos: -0.340817; yPos: -3.52333; zPos: -1.45715 }
+ ListElement{ xPos: 3.21784; yPos: -2.56593; zPos: 2.55468 }
+ ListElement{ xPos: 0.060965; yPos: -2.44153; zPos: 1.35813 }
+ ListElement{ xPos: 1.4594; yPos: -1.96511; zPos: 0.170228 }
+ ListElement{ xPos: 3.55017; yPos: -2.16882; zPos: 1.75539 }
+ ListElement{ xPos: 2.89487; yPos: -0.727481; zPos: -0.39588 }
+ ListElement{ xPos: -1.65151; yPos: -0.603877; zPos: 0.250508 }
+ ListElement{ xPos: -4.35232; yPos: -1.32155; zPos: -2.31877 }
+ ListElement{ xPos: 2.75852; yPos: -1.88931; zPos: 1.77874 }
+ ListElement{ xPos: 2.75452; yPos: -0.64123; zPos: 2.45546 }
+ ListElement{ xPos: 0.151914; yPos: -0.888395; zPos: -0.260935 }
+ ListElement{ xPos: 0.150593; yPos: 0.0461652; zPos: -0.158206 }
+ ListElement{ xPos: -1.22087; yPos: -2.92034; zPos: -3.78604 }
+ ListElement{ xPos: -0.761622; yPos: 0.161856; zPos: 3.5586 }
+ ListElement{ xPos: -1.88456; yPos: -2.48094; zPos: 0.287091 }
+ ListElement{ xPos: 1.25293; yPos: 2.64374; zPos: 1.6532 }
+ ListElement{ xPos: -0.657609; yPos: 1.32547; zPos: -0.557301 }
+ ListElement{ xPos: 3.85995; yPos: 2.32568; zPos: -1.38265 }
+ ListElement{ xPos: 1.65572; yPos: -2.28977; zPos: 0.957488 }
+ ListElement{ xPos: -2.45312; yPos: -2.96071; zPos: 3.45147 }
+ ListElement{ xPos: -1.75259; yPos: 0.365259; zPos: 1.60113 }
+ ListElement{ xPos: 1.14045; yPos: -0.844805; zPos: 0.359343 }
+ ListElement{ xPos: -1.55951; yPos: 1.65687; zPos: -3.10398 }
+ ListElement{ xPos: 0.441652; yPos: -1.36623; zPos: -1.55494 }
+ ListElement{ xPos: -3.95762; yPos: 0.288753; zPos: 3.7791 }
+ ListElement{ xPos: -1.80101; yPos: -0.241499; zPos: 2.29693 }
+ ListElement{ xPos: -0.456931; yPos: 1.64399; zPos: 1.35559 }
+ ListElement{ xPos: -0.691421; yPos: -0.723378; zPos: 2.51839 }
+ ListElement{ xPos: -1.20658; yPos: -3.04063; zPos: -1.552 }
+ ListElement{ xPos: -0.958574; yPos: 1.48688; zPos: 0.950152 }
+ ListElement{ xPos: 1.76319; yPos: -1.36072; zPos: 2.15866 }
+ ListElement{ xPos: -3.91301; yPos: -0.328932; zPos: -2.45524 }
+ ListElement{ xPos: 2.9553; yPos: 3.12703; zPos: -2.43321 }
+ ListElement{ xPos: 3.55939; yPos: -1.48028; zPos: 0.152252 }
+ ListElement{ xPos: -1.41545; yPos: 3.247; zPos: 0.779314 }
+ ListElement{ xPos: -3.34482; yPos: -0.894538; zPos: 0.209302 }
+ ListElement{ xPos: 1.15338; yPos: 0.362332; zPos: -2.7924 }
+ ListElement{ xPos: 0.468852; yPos: 0.120872; zPos: 1.35593 }
+ ListElement{ xPos: 1.98778; yPos: -3.32292; zPos: -0.758591 }
+ ListElement{ xPos: 0.420718; yPos: -0.225014; zPos: -2.44806 }
+ ListElement{ xPos: 0.550207; yPos: 1.56432; zPos: 2.25317 }
+ ListElement{ xPos: 4.35156; yPos: -0.966178; zPos: -0.791032 }
+ ListElement{ xPos: 3.35179; yPos: -1.04981; zPos: -0.854089 }
+ ListElement{ xPos: 1.70857; yPos: -0.281369; zPos: -0.254686 }
+ ListElement{ xPos: -3.05855; yPos: -0.443693; zPos: 1.30251 }
+ ListElement{ xPos: -3.9509; yPos: -2.72179; zPos: -3.83489 }
+ ListElement{ xPos: 2.19632; yPos: 1.32915; zPos: 1.15345 }
+ ListElement{ xPos: 1.42782; yPos: -0.449435; zPos: -2.85005 }
+ ListElement{ xPos: -2.19053; yPos: 0.049866; zPos: 2.87493 }
+ ListElement{ xPos: 2.45196; yPos: -2.44705; zPos: -2.85302 }
+ ListElement{ xPos: 4.35263; yPos: 0.245956; zPos: 1.12886 }
+ ListElement{ xPos: 1.8167; yPos: 1.85407; zPos: -0.714159 }
+ ListElement{ xPos: 1.88577; yPos: 2.04227; zPos: -0.959396 }
+ ListElement{ xPos: 1.6522; yPos: -2.48289; zPos: 0.355373 }
+ ListElement{ xPos: -3.39965; yPos: 0.286834; zPos: -1.68171 }
+ ListElement{ xPos: 1.85639; yPos: 1.47419; zPos: 2.25749 }
+ ListElement{ xPos: -2.5216; yPos: -0.88573; zPos: -2.69594 }
+ ListElement{ xPos: -0.143043; yPos: 0.28453; zPos: -1.75898 }
+ ListElement{ xPos: -2.52745; yPos: -2.76741; zPos: -0.257011 }
+ ListElement{ xPos: 0.381448; yPos: -1.64793; zPos: -0.756889 }
+ ListElement{ xPos: 2.30469; yPos: -1.28844; zPos: -2.79271 }
+ ListElement{ xPos: -1.72491; yPos: -1.48634; zPos: -2.61686 }
+ ListElement{ xPos: 0.503342; yPos: 0.248352; zPos: -2.27162 }
+ ListElement{ xPos: 0.457491; yPos: -1.88183; zPos: -0.951124 }
+ ListElement{ xPos: -1.23123; yPos: 0.963519; zPos: 2.3569 }
+ ListElement{ xPos: -0.55709; yPos: -0.364372; zPos: -1.82528 }
+ ListElement{ xPos: 2.73963; yPos: -0.567024; zPos: -0.496936 }
+ ListElement{ xPos: 1.17979; yPos: 2.76252; zPos: -2.35641 }
+ ListElement{ xPos: -1.20723; yPos: -2.1692; zPos: 3.14368 }
+ ListElement{ xPos: -0.0504301; yPos: 1.76714; zPos: 1.64265 }
+ ListElement{ xPos: 1.45714; yPos: -0.725448; zPos: 0.739217 }
+ ListElement{ xPos: 0.246123; yPos: -3.27811; zPos: -0.251218 }
+ ListElement{ xPos: -0.894632; yPos: 1.08758; zPos: -0.17184 }
+ ListElement{ xPos: -2.45217; yPos: 0.565077; zPos: -0.557015 }
+ ListElement{ xPos: 2.51301; yPos: 1.1271; zPos: 2.25057 }
+ ListElement{ xPos: -1.05099; yPos: -2.1688; zPos: -1.88996 }
+ ListElement{ xPos: 1.26945; yPos: -2.1225; zPos: -1.55031 }
+ ListElement{ xPos: -4.30129; yPos: -0.760298; zPos: 0.259868 }
+ ListElement{ xPos: -0.157336; yPos: -0.237532; zPos: -2.69483 }
+ ListElement{ xPos: -2.95778; yPos: 1.36212; zPos: -3.65524 }
+ ListElement{ xPos: 2.74003; yPos: 1.16234; zPos: 2.05928 }
+ ListElement{ xPos: 0.955294; yPos: -1.52182; zPos: -1.05684 }
+ ListElement{ xPos: -1.87004; yPos: 2.72729; zPos: -0.550608 }
+ ListElement{ xPos: 0.459439; yPos: 2.88101; zPos: -4.4135 }
+ ListElement{ xPos: 1.35069; yPos: 1.08445; zPos: -0.808625 }
+ ListElement{ xPos: -2.70034; yPos: -1.36291; zPos: -2.65126 }
+ ListElement{ xPos: 0.353099; yPos: 2.32354; zPos: -1.61885 }
+ ListElement{ xPos: -0.453359; yPos: 1.67524; zPos: 0.122888 }
+ ListElement{ xPos: 3.7506; yPos: 1.12855; zPos: -3.86338 }
+ ListElement{ xPos: 0.548626; yPos: 2.63101; zPos: 0.552261 }
+ ListElement{ xPos: -0.753935; yPos: -3.52241; zPos: -3.21122 }
+ ListElement{ xPos: 0.258935; yPos: -1.32453; zPos: 2.25745 }
+ ListElement{ xPos: -2.8797; yPos: -1.60832; zPos: -2.45626 }
+ ListElement{ xPos: 0.151838; yPos: -0.565264; zPos: 3.98539 }
+ ListElement{ xPos: 2.1508; yPos: -1.68734; zPos: -1.75076 }
+ ListElement{ xPos: -4.23947; yPos: -1.92531; zPos: 2.35438 }
+ ListElement{ xPos: 1.95273; yPos: -1.32736; zPos: 0.313398 }
+ ListElement{ xPos: 0.533647; yPos: 0.646686; zPos: 0.75712 }
+ ListElement{ xPos: 0.856619; yPos: -0.843249; zPos: -0.577773 }
+ ListElement{ xPos: -2.15649; yPos: -1.64285; zPos: -2.31055 }
+ ListElement{ xPos: -0.851309; yPos: -2.84717; zPos: -0.324933 }
+ ListElement{ xPos: -3.17772; yPos: -0.324817; zPos: -0.858394 }
+ ListElement{ xPos: 3.45303; yPos: 0.529449; zPos: 0.818094 }
+ ListElement{ xPos: 1.42912; yPos: 0.238088; zPos: 0.385617 }
+ ListElement{ xPos: 0.459586; yPos: 1.7661; zPos: -0.153761 }
+ ListElement{ xPos: 0.855577; yPos: 3.16845; zPos: -2.19548 }
+ ListElement{ xPos: 2.15181; yPos: 0.729021; zPos: -0.955922 }
+ ListElement{ xPos: -2.40113; yPos: 0.665756; zPos: -0.521366 }
+ ListElement{ xPos: 1.45469; yPos: -0.462177; zPos: -1.95869 }
+ ListElement{ xPos: 0.629115; yPos: -1.84769; zPos: 1.86755 }
+ ListElement{ xPos: 3.47576; yPos: -0.209875; zPos: -0.555502 }
+ ListElement{ xPos: 0.295075; yPos: -0.840772; zPos: 4.68895 }
+ ListElement{ xPos: -0.253301; yPos: -2.49078; zPos: 2.11749 }
+ ListElement{ xPos: -1.15923; yPos: -3.163; zPos: -3.05671 }
+ ListElement{ xPos: 1.45484; yPos: 0.963654; zPos: -0.734942 }
+ ListElement{ xPos: 0.354307; yPos: 0.520772; zPos: -1.32278 }
+ ListElement{ xPos: 2.65725; yPos: 0.284589; zPos: -0.856856 }
+ ListElement{ xPos: -1.2596; yPos: 0.765493; zPos: -1.66469 }
+ ListElement{ xPos: -0.656057; yPos: -2.16906; zPos: 3.72144 }
+ ListElement{ xPos: -0.251559; yPos: -2.36406; zPos: -1.89709 }
+ ListElement{ xPos: 0.35608; yPos: -0.80463; zPos: 1.85674 }
+ ListElement{ xPos: 0.0508692; yPos: 0.615674; zPos: 0.856785 }
+ ListElement{ xPos: -2.50726; yPos: 2.28743; zPos: -2.05697 }
+ ListElement{ xPos: 1.65272; yPos: 1.29604; zPos: 2.11481 }
+ ListElement{ xPos: -3.2878; yPos: -0.244516; zPos: 0.799732 }
+ ListElement{ xPos: -2.18989; yPos: -0.847222; zPos: -0.264559 }
+ ListElement{ xPos: 0.452832; yPos: 0.960993; zPos: 2.53691 }
+ ListElement{ xPos: -2.43913; yPos: 1.28957; zPos: 2.75427 }
+ ListElement{ xPos: -1.72889; yPos: -3.29414; zPos: -2.31426 }
+ ListElement{ xPos: 0.952615; yPos: -0.0844651; zPos: 0.346607 }
+ ListElement{ xPos: 1.41175; yPos: 0.889643; zPos: 0.450356 }
+ ListElement{ xPos: 2.13145; yPos: 1.08697; zPos: 0.223055 }
+ ListElement{ xPos: -2.16002; yPos: -0.225505; zPos: -0.602641 }
+ ListElement{ xPos: 0.54028; yPos: 1.24765; zPos: -0.456129 }
+ ListElement{ xPos: 2.55086; yPos: -0.56734; zPos: -2.65051 }
+ ListElement{ xPos: -4.53921; yPos: -0.483588; zPos: -1.25013 }
+ ListElement{ xPos: 3.45413; yPos: -0.44258; zPos: 2.29687 }
+ ListElement{ xPos: -0.257456; yPos: 0.64624; zPos: 1.65041 }
+ ListElement{ xPos: 1.25559; yPos: -0.65493; zPos: -0.358872 }
+ ListElement{ xPos: 1.9599; yPos: -1.56965; zPos: -4.17044 }
+ ListElement{ xPos: 2.75996; yPos: -1.98665; zPos: 3.31794 }
+ ListElement{ xPos: 3.05837; yPos: 1.04847; zPos: -0.975536 }
+ ListElement{ xPos: -2.95407; yPos: 1.40294; zPos: -2.25825 }
+ ListElement{ xPos: 1.38718; yPos: 0.360709; zPos: -2.98211 }
+ ListElement{ xPos: 0.481728; yPos: -2.48564; zPos: 3.25864 }
+ ListElement{ xPos: -1.15089; yPos: 0.363522; zPos: 0.458662 }
+ ListElement{ xPos: -2.25551; yPos: 0.0421839; zPos: 0.650008 }
+ ListElement{ xPos: -1.85862; yPos: -0.969237; zPos: 4.25313 }
+ ListElement{ xPos: 1.55797; yPos: 0.0465051; zPos: -3.85709 }
+ ListElement{ xPos: 0.0555338; yPos: 0.682957; zPos: -2.45556 }
+ ListElement{ xPos: -0.186868; yPos: -0.482811; zPos: 1.96957 }
+ ListElement{ xPos: 2.197; yPos: -1.5248; zPos: -4.20912 }
+ ListElement{ xPos: 3.40636; yPos: 0.626269; zPos: -2.05757 }
+ ListElement{ xPos: 0.780426; yPos: 2.68048; zPos: -0.852693 }
+ ListElement{ xPos: 1.65184; yPos: 1.68951; zPos: -0.892089 }
+ ListElement{ xPos: 2.11929; yPos: -2.44406; zPos: 1.21168 }
+ ListElement{ xPos: -0.153348; yPos: -1.88112; zPos: -0.357374 }
+ ListElement{ xPos: -0.359393; yPos: 1.76654; zPos: 1.63063 }
+ ListElement{ xPos: -2.15954; yPos: 0.0819277; zPos: 0.757621 }
+ ListElement{ xPos: -0.159898; yPos: -3.36316; zPos: 0.359582 }
+ ListElement{ xPos: 2.74125; yPos: -2.84148; zPos: 0.355785 }
+ ListElement{ xPos: -1.3558; yPos: 0.0027827; zPos: -0.588162 }
+ ListElement{ xPos: -0.354346; yPos: -2.56747; zPos: -0.984403 }
+ ListElement{ xPos: -2.75082; yPos: -3.56807; zPos: 1.5599 }
+ ListElement{ xPos: -2.54708; yPos: -0.686147; zPos: 2.75649 }
+ ListElement{ xPos: 1.35138; yPos: 0.692978; zPos: -2.24969 }
+ ListElement{ xPos: -1.39826; yPos: -0.246682; zPos: -1.65876 }
+ ListElement{ xPos: -1.46629; yPos: -1.44446; zPos: 4.45293 }
+ ListElement{ xPos: -1.89442; yPos: 3.64549; zPos: 2.05732 }
+ ListElement{ xPos: -0.658093; yPos: 0.0815129; zPos: 3.95269 }
+ ListElement{ xPos: 2.25603; yPos: 2.96329; zPos: -2.35993 }
+ ListElement{ xPos: 1.36323; yPos: 1.64488; zPos: -0.0538547 }
+ ListElement{ xPos: 1.75659; yPos: 2.24227; zPos: -2.8522 }
+ ListElement{ xPos: -0.0566584; yPos: -1.56465; zPos: -0.0503143 }
+ ListElement{ xPos: -3.8532; yPos: -0.822258; zPos: -0.345406 }
+ ListElement{ xPos: 0.951328; yPos: 0.329296; zPos: -2.52211 }
+ ListElement{ xPos: -2.48659; yPos: 0.410856; zPos: -3.55401 }
+ ListElement{ xPos: 3.72676; yPos: 2.36324; zPos: 3.65589 }
+ ListElement{ xPos: 0.559972; yPos: 0.884984; zPos: 3.15283 }
+ ListElement{ xPos: -1.37624; yPos: -1.36007; zPos: -2.16578 }
+ ListElement{ xPos: 2.05543; yPos: 0.4472; zPos: -0.82911 }
+ ListElement{ xPos: -4.75258; yPos: 1.8779; zPos: -1.75376 }
+ ListElement{ xPos: 0.15648; yPos: 2.64039; zPos: -2.21467 }
+ ListElement{ xPos: -2.0593; yPos: -2.56775; zPos: 1.15037 }
+ ListElement{ xPos: -3.70217; yPos: 2.12375; zPos: 1.3652 }
+ ListElement{ xPos: 1.05566; yPos: 0.98299; zPos: 4.02985 }
+ ListElement{ xPos: -0.766882; yPos: -0.88359; zPos: 1.35525 }
+ ListElement{ xPos: 0.951335; yPos: -1.84689; zPos: 0.178337 }
+ ListElement{ xPos: 0.751608; yPos: 1.1691; zPos: 4.25273 }
+ ListElement{ xPos: -1.36367; yPos: 0.728904; zPos: 0.655858 }
+ ListElement{ xPos: 3.17581; yPos: -0.0844758; zPos: -1.75811 }
+ ListElement{ xPos: 2.85546; yPos: -0.683618; zPos: 0.653701 }
+ ListElement{ xPos: -0.471118; yPos: 3.04176; zPos: -2.35393 }
+ ListElement{ xPos: 3.0574; yPos: -0.601996; zPos: -0.611932 }
+ ListElement{ xPos: -0.854024; yPos: -0.44532; zPos: 0.355575 }
+ ListElement{ xPos: 0.05047; yPos: -1.92888; zPos: 0.64818 }
+ ListElement{ xPos: -1.25515; yPos: -1.44466; zPos: 1.90429 }
+ ListElement{ xPos: -1.67201; yPos: 0.0461708; zPos: -0.796655 }
+ ListElement{ xPos: 1.45345; yPos: -1.66159; zPos: -3.48143 }
+ ListElement{ xPos: -2.84514; yPos: -1.24586; zPos: -3.47945 }
+ ListElement{ xPos: 0.287402; yPos: -0.688276; zPos: -3.75664 }
+ ListElement{ xPos: 3.35908; yPos: 0.687828; zPos: -1.94406 }
+ ListElement{ xPos: -2.39167; yPos: 1.08322; zPos: -1.73508 }
+ ListElement{ xPos: 1.52152; yPos: 1.86032; zPos: -1.25351 }
+ ListElement{ xPos: 1.55931; yPos: 3.64414; zPos: 1.35944 }
+ ListElement{ xPos: 1.15954; yPos: -1.36058; zPos: 0.758814 }
+ ListElement{ xPos: -1.95325; yPos: 0.0851092; zPos: -0.854106 }
+ ListElement{ xPos: -2.25254; yPos: -0.523024; zPos: 1.05486 }
+ ListElement{ xPos: -2.68036; yPos: -1.32901; zPos: 1.05877 }
+ ListElement{ xPos: -0.485956; yPos: -1.52164; zPos: 2.45303 }
+ ListElement{ xPos: -0.0546215; yPos: 0.640683; zPos: -2.85953 }
+ ListElement{ xPos: 4.45295; yPos: -0.246051; zPos: -0.159626 }
+ ListElement{ xPos: 3.4523; yPos: 1.7215; zPos: -1.10587 }
+ ListElement{ xPos: 3.35142; yPos: -1.72053; zPos: -0.252105 }
+ ListElement{ xPos: 1.74251; yPos: 2.76108; zPos: 2.51524 }
+ ListElement{ xPos: 2.15054; yPos: -2.88101; zPos: -1.7527 }
+ ListElement{ xPos: -3.70517; yPos: -0.0470951; zPos: 0.258921 }
+ ListElement{ xPos: -0.45593; yPos: -3.47184; zPos: -2.95345 }
+ ListElement{ xPos: 3.15988; yPos: -2.32107; zPos: 0.105299 }
+ ListElement{ xPos: 0.751449; yPos: -2.88762; zPos: -3.45245 }
+ ListElement{ xPos: 2.9794; yPos: 0.493172; zPos: -0.654683 }
+ ListElement{ xPos: -1.87713; yPos: -2.48632; zPos: -3.534 }
+ ListElement{ xPos: 1.65266; yPos: 3.16008; zPos: 2.1579 }
+ ListElement{ xPos: -1.25239; yPos: -0.763119; zPos: 2.15776 }
+ ListElement{ xPos: 3.5572; yPos: 0.282681; zPos: 2.44174 }
+ ListElement{ xPos: 0.251145; yPos: 0.520256; zPos: 2.3184 }
+ ListElement{ xPos: -1.78596; yPos: -1.36913; zPos: -2.50818 }
+ ListElement{ xPos: 3.82122; yPos: 1.04473; zPos: 0.456159 }
+ ListElement{ xPos: 2.45979; yPos: -0.722759; zPos: -4.05123 }
+ ListElement{ xPos: -0.855594; yPos: 0.163792; zPos: -0.553702 }
+ ListElement{ xPos: 0.656895; yPos: 0.529982; zPos: 3.35129 }
+ ListElement{ xPos: 0.857952; yPos: -0.0885677; zPos: 0.695128 }
+ ListElement{ xPos: -0.143269; yPos: 1.12972; zPos: -3.155 }
+ ListElement{ xPos: -2.95923; yPos: 0.241767; zPos: 0.832165 }
+ ListElement{ xPos: 0.253329; yPos: -0.622952; zPos: -0.459799 }
+ ListElement{ xPos: 0.151499; yPos: 2.5297; zPos: 1.53059 }
+ ListElement{ xPos: 0.655464; yPos: -1.49902; zPos: -1.51071 }
+ ListElement{ xPos: 4.7585; yPos: 1.76425; zPos: 1.15164 }
+ ListElement{ xPos: -1.75063; yPos: -1.44645; zPos: -3.65525 }
+ ListElement{ xPos: 0.850392; yPos: 0.0417223; zPos: -0.340588 }
+ ListElement{ xPos: -0.557015; yPos: -0.282305; zPos: -1.85291 }
+ ListElement{ xPos: -4.05639; yPos: 0.522959; zPos: -2.3507 }
+ ListElement{ xPos: -0.358137; yPos: -0.967852; zPos: 0.807832 }
+ ListElement{ xPos: -1.82056; yPos: -0.0483894; zPos: 0.0541359 }
+ ListElement{ xPos: -2.16623; yPos: 0.129809; zPos: -2.52513 }
+ ListElement{ xPos: -1.85591; yPos: -1.04417; zPos: -1.28501 }
+ ListElement{ xPos: -1.79647; yPos: -3.44045; zPos: -1.73399 }
+ ListElement{ xPos: 2.25342; yPos: 0.161308; zPos: -0.0517495 }
+ ListElement{ xPos: -1.37877; yPos: 0.243596; zPos: -1.52931 }
+ ListElement{ xPos: -0.059299; yPos: -0.480825; zPos: 1.7137 }
+ ListElement{ xPos: -2.54357; yPos: 0.286685; zPos: -2.11495 }
+ ListElement{ xPos: 3.92334; yPos: -0.442936; zPos: -0.852895 }
+ ListElement{ xPos: -0.390023; yPos: -1.96437; zPos: 1.38718 }
+ ListElement{ xPos: 1.35263; yPos: 2.92968; zPos: -1.1545 }
+ ListElement{ xPos: -2.25892; yPos: -2.27429; zPos: -0.451533 }
+ ListElement{ xPos: -0.2215; yPos: -0.126727; zPos: 0.155541 }
+ ListElement{ xPos: 0.715932; yPos: 1.47509; zPos: -3.52895 }
+ ListElement{ xPos: -0.382939; yPos: 3.16461; zPos: 2.65165 }
+ ListElement{ xPos: -1.14437; yPos: -1.44682; zPos: 0.456601 }
+ ListElement{ xPos: 0.251892; yPos: -1.0431; zPos: 4.31548 }
+ ListElement{ xPos: -2.23281; yPos: -2.48698; zPos: 0.46995 }
+ ListElement{ xPos: 0.954231; yPos: -3.4323; zPos: -1.20233 }
+ ListElement{ xPos: 2.75569; yPos: -1.66383; zPos: -1.95486 }
+ ListElement{ xPos: 0.750644; yPos: -1.84163; zPos: -0.159206 }
+ ListElement{ xPos: -0.757387; yPos: -1.84192; zPos: 0.354209 }
+ ListElement{ xPos: -2.85509; yPos: -2.12151; zPos: -0.954754 }
+ ListElement{ xPos: -0.888427; yPos: -2.8403; zPos: -0.157387 }
+ ListElement{ xPos: -1.95265; yPos: -0.445753; zPos: 2.17956 }
+ ListElement{ xPos: -1.05845; yPos: -2.48694; zPos: -1.25315 }
+ ListElement{ xPos: -2.66497; yPos: -1.48251; zPos: 0.873192 }
+ ListElement{ xPos: 2.50491; yPos: -1.0833; zPos: 1.99667 }
+ ListElement{ xPos: 0.453931; yPos: 2.52158; zPos: 0.456875 }
+ ListElement{ xPos: 1.55859; yPos: -0.161924; zPos: 0.256619 }
+ ListElement{ xPos: -2.92585; yPos: 0.368018; zPos: 0.35908 }
+ ListElement{ xPos: 2.95509; yPos: -1.56248; zPos: -2.74469 }
+ ListElement{ xPos: 3.46082; yPos: -1.76026; zPos: 3.05835 }
+ ListElement{ xPos: 1.75644; yPos: -2.84241; zPos: 0.507631 }
+ ListElement{ xPos: -0.959006; yPos: 0.649579; zPos: 1.10824 }
+ ListElement{ xPos: 2.63856; yPos: 2.0417; zPos: 0.187281 }
+ ListElement{ xPos: -0.150004; yPos: -0.0838836; zPos: -0.949314 }
+ ListElement{ xPos: 2.26402; yPos: -1.28916; zPos: 2.85284 }
+ ListElement{ xPos: -0.821239; yPos: 2.68795; zPos: -0.317185 }
+ ListElement{ xPos: 3.47124; yPos: 0.840813; zPos: -2.65322 }
+ ListElement{ xPos: -0.253209; yPos: -0.244177; zPos: 0.457348 }
+ ListElement{ xPos: 2.76181; yPos: 1.64033; zPos: -1.95329 }
+ ListElement{ xPos: 1.35105; yPos: -2.96027; zPos: 0.659952 }
+ ListElement{ xPos: -1.45423; yPos: -0.24358; zPos: 0.832696 }
+ ListElement{ xPos: 1.45109; yPos: 1.64958; zPos: -3.45448 }
+ ListElement{ xPos: -1.15659; yPos: 3.08225; zPos: 1.11445 }
+ ListElement{ xPos: 0.806359; yPos: 1.88298; zPos: -2.13001 }
+ ListElement{ xPos: 1.15538; yPos: 3.04545; zPos: -0.759437 }
+ ListElement{ xPos: -0.450074; yPos: 1.36121; zPos: -0.155042 }
+ ListElement{ xPos: -2.80924; yPos: -1.24207; zPos: 2.55513 }
+ ListElement{ xPos: 4.48859; yPos: 2.04394; zPos: 1.25324 }
+ ListElement{ xPos: -0.958741; yPos: 1.24575; zPos: 3.65169 }
+ ListElement{ xPos: 3.45143; yPos: 1.3276; zPos: 2.5144 }
+ ListElement{ xPos: -3.25232; yPos: 1.12514; zPos: -1.21425 }
+ ListElement{ xPos: -2.45327; yPos: 0.681109; zPos: 4.35764 }
+ ListElement{ xPos: 0.55395; yPos: -0.128353; zPos: -3.95705 }
+ ListElement{ xPos: -0.352458; yPos: 3.08882; zPos: -0.340631 }
+ ListElement{ xPos: 1.35213; yPos: -2.92251; zPos: -3.31166 }
+ ListElement{ xPos: 0.52621; yPos: -0.279201; zPos: 0.959619 }
+ ListElement{ xPos: 1.2243; yPos: -0.240093; zPos: -0.75247 }
+ ListElement{ xPos: -1.29854; yPos: 2.16477; zPos: 3.3507 }
+ ListElement{ xPos: -3.35677; yPos: 2.36713; zPos: 3.4585 }
+ ListElement{ xPos: 0.957717; yPos: -0.885793; zPos: 1.25827 }
+ ListElement{ xPos: 0.150983; yPos: 1.24269; zPos: 0.539106 }
+ ListElement{ xPos: 1.84986; yPos: 1.56932; zPos: -1.05811 }
+ ListElement{ xPos: -1.35563; yPos: 3.82103; zPos: -1.45287 }
+ ListElement{ xPos: 1.4544; yPos: -2.6453; zPos: 0.58082 }
+ ListElement{ xPos: 2.05908; yPos: 1.16496; zPos: 1.44075 }
+ ListElement{ xPos: 2.9507; yPos: -2.4957; zPos: 0.153512 }
+ ListElement{ xPos: -1.10289; yPos: 0.763085; zPos: -1.65351 }
+ ListElement{ xPos: -2.50708; yPos: -2.467; zPos: 1.05892 }
+ ListElement{ xPos: 3.55284; yPos: -1.8509; zPos: -2.55732 }
+ ListElement{ xPos: -0.848034; yPos: 1.24305; zPos: -3.7516 }
+ ListElement{ xPos: -1.35051; yPos: -2.48178; zPos: 2.85326 }
+ ListElement{ xPos: -2.18554; yPos: 1.48771; zPos: -0.155205 }
+ ListElement{ xPos: -0.459278; yPos: 2.68404; zPos: 2.85727 }
+ ListElement{ xPos: 0.854722; yPos: 1.47322; zPos: -3.35951 }
+ ListElement{ xPos: -2.23505; yPos: -2.24254; zPos: 0.353203 }
+ ListElement{ xPos: 1.42395; yPos: -2.32169; zPos: 0.558188 }
+ ListElement{ xPos: 3.65106; yPos: 1.12201; zPos: -4.58409 }
+ ListElement{ xPos: 0.11; yPos: -0.68782; zPos: 1.85804 }
+ ListElement{ xPos: -1.9551; yPos: -0.560204; zPos: -2.0577 }
+ ListElement{ xPos: 1.85964; yPos: 1.32737; zPos: -4.40673 }
+ ListElement{ xPos: -0.616311; yPos: 0.649737; zPos: -0.30189 }
+ ListElement{ xPos: -1.55375; yPos: 1.52043; zPos: -3.75629 }
+ ListElement{ xPos: 1.85417; yPos: 0.486964; zPos: 0.654806 }
+ ListElement{ xPos: 3.35638; yPos: 2.52599; zPos: 1.94343 }
+ ListElement{ xPos: 0.491389; yPos: 1.40427; zPos: -1.31935 }
+ ListElement{ xPos: -2.72939; yPos: 0.844341; zPos: 1.62621 }
+ ListElement{ xPos: -0.525985; yPos: 1.31415; zPos: 0.484015 }
+ ListElement{ xPos: 2.25998; yPos: -1.719; zPos: 1.25143 }
+ ListElement{ xPos: 1.79268; yPos: 2.46378; zPos: -0.951188 }
+ ListElement{ xPos: -3.55105; yPos: 1.04122; zPos: 3.9501 }
+ ListElement{ xPos: 0.954251; yPos: 1.28296; zPos: 2.05486 }
+ ListElement{ xPos: -3.15267; yPos: 1.96498; zPos: -0.361707 }
+ ListElement{ xPos: 1.35358; yPos: -0.921098; zPos: -1.71743 }
+ ListElement{ xPos: -3.16896; yPos: -3.08548; zPos: 0.903411 }
+ ListElement{ xPos: 1.25127; yPos: -2.44903; zPos: 2.25616 }
+ ListElement{ xPos: -3.88899; yPos: 0.761334; zPos: -1.05751 }
+ ListElement{ xPos: -1.05163; yPos: -3.89783; zPos: -0.883668 }
+ ListElement{ xPos: -4.189; yPos: 1.24176; zPos: -2.63816 }
+ ListElement{ xPos: 2.45671; yPos: -1.84859; zPos: 0.352808 }
+ ListElement{ xPos: -1.59618; yPos: 2.16255; zPos: 4.33699 }
+ ListElement{ xPos: 2.10913; yPos: -1.88673; zPos: -0.952497 }
+ ListElement{ xPos: -1.85571; yPos: -0.287392; zPos: 0.277176 }
+ ListElement{ xPos: 0.751967; yPos: 1.04568; zPos: -1.35427 }
+ ListElement{ xPos: 2.85792; yPos: 1.60982; zPos: -2.05454 }
+ ListElement{ xPos: -2.13152; yPos: -0.260207; zPos: -2.15124 }
+ ListElement{ xPos: 1.75432; yPos: 2.28936; zPos: 0.756254 }
+ ListElement{ xPos: 1.95711; yPos: -0.681098; zPos: -2.38037 }
+ ListElement{ xPos: -0.826273; yPos: 1.08361; zPos: 1.6515 }
+ ListElement{ xPos: -1.85118; yPos: 1.89481; zPos: -0.756754 }
+ ListElement{ xPos: -3.0571; yPos: 2.44795; zPos: 0.355341 }
+ ListElement{ xPos: -0.455122; yPos: -3.58071; zPos: -2.85209 }
+ ListElement{ xPos: -0.95805; yPos: 0.641282; zPos: 2.15189 }
+ ListElement{ xPos: -1.35515; yPos: -0.234803; zPos: -0.825819 }
+ ListElement{ xPos: 2.12472; yPos: -0.0444431; zPos: 0.651227 }
+ ListElement{ xPos: 2.67573; yPos: 0.223987; zPos: 2.75712 }
+ ListElement{ xPos: 1.65871; yPos: -0.163059; zPos: 1.6513 }
+ ListElement{ xPos: -1.85429; yPos: 0.68862; zPos: 1.9576 }
+ ListElement{ xPos: -3.05186; yPos: -2.2804; zPos: 0.100919 }
+ ListElement{ xPos: 3.41813; yPos: -1.88775; zPos: 3.67075 }
+ ListElement{ xPos: -0.753778; yPos: 0.36467; zPos: 1.55333 }
+ ListElement{ xPos: 2.97628; yPos: -1.36503; zPos: -1.85135 }
+ ListElement{ xPos: 0.477128; yPos: 1.08862; zPos: 0.858931 }
+ ListElement{ xPos: -1.0531; yPos: 1.0488; zPos: 2.15218 }
+ ListElement{ xPos: 2.66911; yPos: -2.08876; zPos: -0.182397 }
+ ListElement{ xPos: 0.5117; yPos: -2.84097; zPos: -0.953684 }
+ ListElement{ xPos: 0.468302; yPos: 1.88616; zPos: 2.05369 }
+ ListElement{ xPos: -3.16099; yPos: -2.76085; zPos: -2.75679 }
+ ListElement{ xPos: -2.6593; yPos: 3.52373; zPos: -1.24072 }
+ ListElement{ xPos: -4.37957; yPos: -0.286903; zPos: 3.63863 }
+ ListElement{ xPos: -2.85958; yPos: -2.56921; zPos: -2.85723 }
+ ListElement{ xPos: -0.159735; yPos: 2.72758; zPos: -2.80575 }
+ ListElement{ xPos: -0.951849; yPos: -0.607465; zPos: 1.05633 }
+ ListElement{ xPos: 1.93077; yPos: 2.56422; zPos: 1.25446 }
+ ListElement{ xPos: -0.859754; yPos: 0.248106; zPos: 0.0584456 }
+ ListElement{ xPos: 2.4023; yPos: 2.56659; zPos: -1.2588 }
+ ListElement{ xPos: 2.35295; yPos: -1.08729; zPos: 2.7851 }
+ ListElement{ xPos: -2.1537; yPos: -0.765032; zPos: 2.83652 }
+ ListElement{ xPos: 1.40185; yPos: 1.29804; zPos: 2.3588 }
+ ListElement{ xPos: -0.991566; yPos: 1.72049; zPos: 4.17146 }
+ ListElement{ xPos: 3.76736; yPos: -1.48837; zPos: 2.05329 }
+ ListElement{ xPos: -0.251896; yPos: 0.765367; zPos: -1.4087 }
+ ListElement{ xPos: -1.6228; yPos: 0.328693; zPos: 0.0528287 }
+ ListElement{ xPos: 2.56735; yPos: -3.08103; zPos: 0.853144 }
+ ListElement{ xPos: 0.0531812; yPos: -1.96216; zPos: 1.55734 }
+ ListElement{ xPos: -3.77052; yPos: 0.8421; zPos: -0.258953 }
+ ListElement{ xPos: 2.35523; yPos: 0.676643; zPos: -1.55789 }
+ ListElement{ xPos: 1.16702; yPos: 2.64474; zPos: -1.45533 }
+ ListElement{ xPos: 2.55709; yPos: -1.56013; zPos: 2.05351 }
+ ListElement{ xPos: -2.15518; yPos: 3.56253; zPos: 3.257 }
+ ListElement{ xPos: -0.553936; yPos: -1.24935; zPos: 2.65224 }
+ ListElement{ xPos: -0.355931; yPos: 1.32374; zPos: 0.859863 }
+ ListElement{ xPos: -1.92974; yPos: 1.2482; zPos: 1.15936 }
+ ListElement{ xPos: 0.350652; yPos: -2.44371; zPos: -1.35611 }
+ ListElement{ xPos: 2.98996; yPos: -1.08527; zPos: -4.30641 }
+ ListElement{ xPos: 1.82765; yPos: -0.440236; zPos: 1.25528 }
+ ListElement{ xPos: -0.689231; yPos: -1.08813; zPos: -0.668663 }
+ ListElement{ xPos: -0.326426; yPos: -0.881857; zPos: -1.45371 }
+ ListElement{ xPos: -1.0655; yPos: 2.12466; zPos: 2.34146 }
+ ListElement{ xPos: 3.1563; yPos: 0.523166; zPos: -2.8572 }
+ ListElement{ xPos: 0.455505; yPos: 2.48775; zPos: -1.33482 }
+ ListElement{ xPos: 0.53939; yPos: -0.847333; zPos: 0.732877 }
+ ListElement{ xPos: -0.683025; yPos: -0.448889; zPos: -1.35747 }
+ ListElement{ xPos: -1.7711; yPos: -0.125587; zPos: -2.55083 }
+ ListElement{ xPos: -0.512871; yPos: 0.520964; zPos: 1.40731 }
+ ListElement{ xPos: 4.93857; yPos: -1.6805; zPos: -0.127298 }
+ ListElement{ xPos: 1.46098; yPos: -1.64073; zPos: 1.35833 }
+ ListElement{ xPos: 0.0518058; yPos: 0.285151; zPos: -2.2437 }
+ ListElement{ xPos: 1.5587; yPos: -1.23067; zPos: 0.458753 }
+ ListElement{ xPos: 3.13089; yPos: 3.64132; zPos: 1.45181 }
+ ListElement{ xPos: -1.55648; yPos: 2.167; zPos: 0.153491 }
+ ListElement{ xPos: 3.94451; yPos: -2.56372; zPos: -1.25276 }
+ ListElement{ xPos: 4.15866; yPos: 0.646921; zPos: 2.65542 }
+ ListElement{ xPos: -2.88189; yPos: 0.562407; zPos: -1.35379 }
+ ListElement{ xPos: 1.31686; yPos: 1.2808; zPos: 0.804375 }
+ ListElement{ xPos: -2.36912; yPos: -3.08775; zPos: 1.28335 }
+ ListElement{ xPos: 0.575203; yPos: -0.36483; zPos: -2.43958 }
+ ListElement{ xPos: 0.613108; yPos: 0.526892; zPos: 2.75368 }
+ ListElement{ xPos: 3.96027; yPos: -0.525425; zPos: -4.25746 }
+ ListElement{ xPos: -0.510821; yPos: 1.28578; zPos: -0.058488 }
+ ListElement{ xPos: -0.254704; yPos: -3.847; zPos: 3.15258 }
+ ListElement{ xPos: -0.925874; yPos: -1.72014; zPos: -3.15341 }
+ ListElement{ xPos: 0.85704; yPos: 0.84788; zPos: -1.75947 }
+ ListElement{ xPos: -3.35712; yPos: 0.722104; zPos: 2.15645 }
+ ListElement{ xPos: -1.67305; yPos: 0.681216; zPos: 1.65726 }
+ ListElement{ xPos: -3.64682; yPos: 0.867926; zPos: 2.63525 }
+ ListElement{ xPos: -0.715921; yPos: 1.96081; zPos: -0.939934 }
+ ListElement{ xPos: -2.45646; yPos: 1.3249; zPos: -2.75733 }
+ ListElement{ xPos: -1.75798; yPos: 0.725382; zPos: -0.851921 }
+ ListElement{ xPos: -2.78528; yPos: 0.679275; zPos: -2.59212 }
+ ListElement{ xPos: -2.24551; yPos: -3.4597; zPos: -1.85735 }
+ ListElement{ xPos: 0.85142; yPos: 2.28058; zPos: -3.75328 }
+ ListElement{ xPos: -3.85054; yPos: 2.44519; zPos: 4.35081 }
+ ListElement{ xPos: -3.6553; yPos: 0.521917; zPos: 0.293354 }
+ ListElement{ xPos: -4.35959; yPos: -0.528198; zPos: 1.55557 }
+ ListElement{ xPos: 1.45186; yPos: -0.0891161; zPos: -0.468118 }
+ ListElement{ xPos: 1.85594; yPos: -0.761461; zPos: -4.68083 }
+ ListElement{ xPos: 0.950642; yPos: 0.526239; zPos: -1.30614 }
+ ListElement{ xPos: -2.50526; yPos: -0.885606; zPos: -0.362569 }
+ ListElement{ xPos: -2.96569; yPos: 1.68519; zPos: -1.15965 }
+ ListElement{ xPos: -3.212; yPos: 0.260715; zPos: 1.18472 }
+ ListElement{ xPos: 0.950556; yPos: -0.282806; zPos: 0.776252 }
+ ListElement{ xPos: 3.66678; yPos: 1.08585; zPos: -2.15646 }
+ ListElement{ xPos: -0.806289; yPos: 1.72784; zPos: 2.85906 }
+ ListElement{ xPos: 0.363827; yPos: 1.76644; zPos: 0.931866 }
+ ListElement{ xPos: -1.34204; yPos: -0.563686; zPos: -2.34091 }
+ ListElement{ xPos: -2.81333; yPos: 0.415358; zPos: 4.28363 }
+ ListElement{ xPos: 1.52053; yPos: -0.327359; zPos: 0.35052 }
+ ListElement{ xPos: -0.633441; yPos: -0.240518; zPos: 4.05745 }
+ ListElement{ xPos: -2.38947; yPos: -1.84662; zPos: -2.29572 }
+ ListElement{ xPos: -1.95744; yPos: -0.863705; zPos: 1.85889 }
+ ListElement{ xPos: -0.0509082; yPos: -0.164164; zPos: 3.8571 }
+ ListElement{ xPos: 0.156438; yPos: -2.64188; zPos: 1.75836 }
+ ListElement{ xPos: -3.85642; yPos: 1.48025; zPos: 0.171659 }
+ ListElement{ xPos: 0.253545; yPos: 1.0852; zPos: -2.45243 }
+ ListElement{ xPos: -4.11318; yPos: 0.41655; zPos: -0.120976 }
+ ListElement{ xPos: -1.44928; yPos: -0.328222; zPos: -0.871279 }
+ ListElement{ xPos: -1.90972; yPos: -1.8495; zPos: -3.16966 }
+ ListElement{ xPos: 0.359433; yPos: 1.3236; zPos: -3.95045 }
+ ListElement{ xPos: -2.60974; yPos: -1.04138; zPos: 4.25836 }
+ ListElement{ xPos: -3.16336; yPos: -0.961581; zPos: -1.65161 }
+ ListElement{ xPos: -0.552909; yPos: -1.16942; zPos: 4.05164 }
+ ListElement{ xPos: -3.10918; yPos: -1.2402; zPos: -0.555073 }
+ ListElement{ xPos: 2.25494; yPos: 1.24432; zPos: 3.44063 }
+ ListElement{ xPos: -1.24998; yPos: -1.24928; zPos: -4.05493 }
+ ListElement{ xPos: 3.05441; yPos: 1.92762; zPos: 1.43329 }
+ ListElement{ xPos: 0.557032; yPos: -2.7688; zPos: -3.25463 }
+ ListElement{ xPos: -2.05665; yPos: 1.6357; zPos: 0.656665 }
+ ListElement{ xPos: -0.459042; yPos: 0.122664; zPos: -0.152961 }
+ ListElement{ xPos: 2.17715; yPos: 2.96833; zPos: 1.1332 }
+ ListElement{ xPos: 0.0536573; yPos: -2.08635; zPos: -0.736471 }
+ ListElement{ xPos: -3.15658; yPos: 1.0818; zPos: -0.172166 }
+ ListElement{ xPos: -1.95784; yPos: 0.44402; zPos: 0.612685 }
+ ListElement{ xPos: 0.15168; yPos: -0.323951; zPos: 2.85563 }
+ ListElement{ xPos: 0.559356; yPos: 1.63101; zPos: 0.558005 }
+ ListElement{ xPos: -2.05643; yPos: 1.84615; zPos: -1.87964 }
+ ListElement{ xPos: -0.254098; yPos: 0.368208; zPos: 1.23061 }
+ ListElement{ xPos: 4.6438; yPos: -0.209283; zPos: 0.695869 }
+ ListElement{ xPos: -1.95087; yPos: -0.859788; zPos: 0.0539467 }
+ ListElement{ xPos: -0.351737; yPos: -1.04291; zPos: 0.869198 }
+ ListElement{ xPos: 0.776319; yPos: 3.04922; zPos: -3.55278 }
+ ListElement{ xPos: -0.158751; yPos: 1.12538; zPos: -2.59681 }
+ ListElement{ xPos: -0.560997; yPos: -1.68381; zPos: 1.56935 }
+ ListElement{ xPos: 1.71385; yPos: -0.446223; zPos: -1.56843 }
+ ListElement{ xPos: 4.05142; yPos: -1.3243; zPos: 2.85052 }
+ ListElement{ xPos: 1.68685; yPos: -1.56305; zPos: 2.159 }
+ ListElement{ xPos: 0.359977; yPos: -1.16029; zPos: 1.25037 }
+ ListElement{ xPos: -2.65045; yPos: -1.28532; zPos: 0.459338 }
+ ListElement{ xPos: 0.542068; yPos: 1.52601; zPos: -1.35562 }
+ ListElement{ xPos: 1.34386; yPos: 1.68231; zPos: -2.75114 }
+ ListElement{ xPos: 1.25123; yPos: 0.43108; zPos: 0.383897 }
+ ListElement{ xPos: -0.952936; yPos: 3.6889; zPos: 1.75759 }
+ ListElement{ xPos: -3.55855; yPos: 0.484241; zPos: 1.15503 }
+ ListElement{ xPos: -1.71394; yPos: -2.64568; zPos: -3.30684 }
+ ListElement{ xPos: -2.23513; yPos: -2.46812; zPos: 1.05321 }
+ ListElement{ xPos: 0.160986; yPos: 0.442362; zPos: -1.05077 }
+ ListElement{ xPos: 2.05433; yPos: 0.473204; zPos: 0.823968 }
+ ListElement{ xPos: 0.482077; yPos: 0.0477338; zPos: 4.21712 }
+ ListElement{ xPos: -1.25348; yPos: 0.767612; zPos: 0.455813 }
+ ListElement{ xPos: 1.61308; yPos: 2.04125; zPos: -2.95433 }
+ ListElement{ xPos: -2.05862; yPos: -0.444052; zPos: 1.35177 }
+ ListElement{ xPos: -3.2582; yPos: 0.44354; zPos: 2.15898 }
+ ListElement{ xPos: -1.75935; yPos: 0.0459283; zPos: 2.35061 }
+ ListElement{ xPos: -4.15501; yPos: 0.68674; zPos: 0.802439 }
+ ListElement{ xPos: -1.66005; yPos: 1.12067; zPos: 0.552901 }
+ ListElement{ xPos: -0.150828; yPos: 3.4151; zPos: 3.05446 }
+ ListElement{ xPos: -0.274381; yPos: 0.0405946; zPos: -1.45463 }
+ ListElement{ xPos: 2.94543; yPos: -0.360918; zPos: 1.45895 }
+ ListElement{ xPos: -1.42494; yPos: 1.56503; zPos: 1.31012 }
+ ListElement{ xPos: 3.45402; yPos: -1.27808; zPos: -4.29049 }
+ ListElement{ xPos: -1.14819; yPos: 0.674339; zPos: 1.55807 }
+ ListElement{ xPos: -0.356159; yPos: 1.52295; zPos: -0.351445 }
+ ListElement{ xPos: 0.387809; yPos: 0.965119; zPos: 1.84271 }
+ ListElement{ xPos: 2.56165; yPos: -1.84639; zPos: 1.65056 }
+ ListElement{ xPos: -0.619108; yPos: 2.24004; zPos: -2.92134 }
+ ListElement{ xPos: -0.254288; yPos: -2.32744; zPos: -0.720931 }
+ ListElement{ xPos: 3.3508; yPos: -2.24501; zPos: 1.58268 }
+ ListElement{ xPos: 1.69434; yPos: 1.96814; zPos: 3.97439 }
+ ListElement{ xPos: 1.80785; yPos: 0.685502; zPos: -1.55595 }
+ ListElement{ xPos: 2.71587; yPos: 1.76415; zPos: -2.98124 }
+ ListElement{ xPos: -2.35151; yPos: -0.697338; zPos: -3.96269 }
+ ListElement{ xPos: -1.85759; yPos: 1.96899; zPos: -1.25212 }
+ ListElement{ xPos: -4.05922; yPos: 1.12838; zPos: -2.7597 }
+ ListElement{ xPos: -2.85434; yPos: -1.36487; zPos: 0.659987 }
+ ListElement{ xPos: -1.75616; yPos: 2.12969; zPos: -1.35032 }
+ ListElement{ xPos: -2.95985; yPos: -0.0854955; zPos: 3.65545 }
+ ListElement{ xPos: -2.46049; yPos: 2.45378; zPos: 4.51969 }
+ ListElement{ xPos: -0.0577358; yPos: 0.0427911; zPos: 0.359068 }
+ ListElement{ xPos: -3.25346; yPos: 0.161829; zPos: 1.12956 }
+ ListElement{ xPos: 3.55498; yPos: 2.32482; zPos: 1.33302 }
+ ListElement{ xPos: 4.99905; yPos: -1.88748; zPos: 0.450165 }
+ ListElement{ xPos: -2.35406; yPos: -1.44715; zPos: -0.745307 }
+ ListElement{ xPos: 2.44217; yPos: -0.642981; zPos: 0.126924 }
+ ListElement{ xPos: 1.73283; yPos: 1.67362; zPos: 1.91136 }
+ ListElement{ xPos: 1.34239; yPos: -0.434386; zPos: -0.449795 }
+ ListElement{ xPos: -0.9813; yPos: -2.72962; zPos: -3.6889 }
+ ListElement{ xPos: 1.29807; yPos: -0.448566; zPos: 2.13911 }
+ ListElement{ xPos: 0.654017; yPos: 3.54591; zPos: -1.55982 }
+ ListElement{ xPos: -1.55508; yPos: -2.64564; zPos: 0.555 }
+ ListElement{ xPos: 1.92722; yPos: -0.322513; zPos: -2.13691 }
+ ListElement{ xPos: 1.35913; yPos: -2.84853; zPos: -0.470788 }
+ ListElement{ xPos: 0.257868; yPos: -2.68874; zPos: -0.268328 }
+ ListElement{ xPos: -2.05043; yPos: -1.68405; zPos: -3.05075 }
+ ListElement{ xPos: 1.65173; yPos: -0.446801; zPos: -0.75339 }
+ ListElement{ xPos: -1.25655; yPos: 0.965275; zPos: -4.15374 }
+ ListElement{ xPos: -4.27942; yPos: -0.564403; zPos: 1.45826 }
+ ListElement{ xPos: 0.950669; yPos: -2.4416; zPos: -1.68235 }
+ ListElement{ xPos: -0.0541107; yPos: 0.882274; zPos: 3.15308 }
+ ListElement{ xPos: -1.65016; yPos: -0.886156; zPos: -3.85588 }
+ ListElement{ xPos: 0.355613; yPos: 0.217671; zPos: 4.25412 }
+ ListElement{ xPos: 0.800472; yPos: 0.847259; zPos: 3.11114 }
+ ListElement{ xPos: 1.8599; yPos: -2.16981; zPos: -2.22314 }
+ ListElement{ xPos: -2.05061; yPos: 0.164561; zPos: -0.452181 }
+ ListElement{ xPos: 0.854144; yPos: 1.84334; zPos: -1.45981 }
+ ListElement{ xPos: 1.68547; yPos: 1.56536; zPos: -1.45874 }
+ ListElement{ xPos: 1.25244; yPos: -0.844991; zPos: -2.95475 }
+ ListElement{ xPos: -1.92348; yPos: 2.32119; zPos: -1.80444 }
+ ListElement{ xPos: -0.645646; yPos: 2.45193; zPos: -3.65332 }
+ ListElement{ xPos: 4.45803; yPos: 0.527732; zPos: 3.02031 }
+ ListElement{ xPos: 2.74572; yPos: 0.287964; zPos: -1.80485 }
+ ListElement{ xPos: 0.35961; yPos: -2.56437; zPos: 3.97194 }
+ ListElement{ xPos: -0.956828; yPos: -1.28915; zPos: 1.64424 }
+ ListElement{ xPos: 0.414971; yPos: -0.235061; zPos: -2.15757 }
+ ListElement{ xPos: -0.0530542; yPos: -1.08464; zPos: -4.11853 }
+ ListElement{ xPos: 3.17203; yPos: -1.21013; zPos: -3.85806 }
+ ListElement{ xPos: 0.758948; yPos: 0.124698; zPos: -3.10188 }
+ ListElement{ xPos: -1.65404; yPos: -1.16204; zPos: -1.65357 }
+ ListElement{ xPos: -1.65985; yPos: 3.84433; zPos: 4.65101 }
+ ListElement{ xPos: 2.83444; yPos: -2.69529; zPos: -1.65021 }
+ ListElement{ xPos: 1.29814; yPos: -2.76926; zPos: -2.27139 }
+ ListElement{ xPos: 0.462382; yPos: 3.04217; zPos: 3.45153 }
+ ListElement{ xPos: -3.61944; yPos: 1.04723; zPos: -0.638308 }
+ ListElement{ xPos: 2.25235; yPos: 1.64048; zPos: 2.95175 }
+ ListElement{ xPos: -3.05826; yPos: -0.76526; zPos: -2.38243 }
+ ListElement{ xPos: -2.8506; yPos: 2.12102; zPos: -0.659444 }
+ ListElement{ xPos: -0.10046; yPos: 0.0887098; zPos: -1.63621 }
+ ListElement{ xPos: -1.55585; yPos: -1.36073; zPos: 2.2076 }
+ ListElement{ xPos: -0.474968; yPos: 1.56568; zPos: -0.302349 }
+ ListElement{ xPos: 0.36584; yPos: -2.36102; zPos: 1.35289 }
+ ListElement{ xPos: 0.224784; yPos: -0.637694; zPos: 1.62444 }
+ ListElement{ xPos: -0.658172; yPos: 1.9689; zPos: -3.13712 }
+ ListElement{ xPos: 0.646334; yPos: -1.04672; zPos: 2.59285 }
+ ListElement{ xPos: -2.63054; yPos: -1.08263; zPos: -0.851087 }
+ ListElement{ xPos: 1.45804; yPos: -2.56159; zPos: -2.66388 }
+ ListElement{ xPos: -2.45748; yPos: 0.0409116; zPos: -2.85428 }
+ ListElement{ xPos: -0.0561462; yPos: -1.24229; zPos: -1.25145 }
+ ListElement{ xPos: -2.95391; yPos: -1.80896; zPos: -2.05036 }
+ ListElement{ xPos: 4.36778; yPos: -0.969951; zPos: 3.53686 }
+ ListElement{ xPos: 2.15582; yPos: -1.67173; zPos: -0.831609 }
+ ListElement{ xPos: -1.27059; yPos: -1.14919; zPos: 1.7569 }
+ ListElement{ xPos: -1.57398; yPos: -1.28091; zPos: -0.251735 }
+ ListElement{ xPos: 2.59506; yPos: -2.6408; zPos: -0.345589 }
+ ListElement{ xPos: -1.64147; yPos: -0.360324; zPos: 3.1562 }
+ ListElement{ xPos: -0.125427; yPos: -0.641484; zPos: -3.66095 }
+ ListElement{ xPos: -1.9148; yPos: 1.8885; zPos: 2.12972 }
+ ListElement{ xPos: -2.85768; yPos: -2.28782; zPos: -1.55719 }
+ ListElement{ xPos: -1.37239; yPos: -0.485964; zPos: -2.22291 }
+ ListElement{ xPos: 0.516294; yPos: 0.281078; zPos: 0.652612 }
+ ListElement{ xPos: -1.13028; yPos: 0.246659; zPos: -2.25636 }
+ ListElement{ xPos: 1.7555; yPos: -1.41602; zPos: 0.348449 }
+ ListElement{ xPos: 1.5355; yPos: -1.32646; zPos: -2.82417 }
+ ListElement{ xPos: -0.95426; yPos: 2.0824; zPos: -0.383507 }
+ ListElement{ xPos: 2.75739; yPos: 0.241779; zPos: 0.755701 }
+ ListElement{ xPos: 0.752655; yPos: 0.56204; zPos: -1.55738 }
+ ListElement{ xPos: 1.1271; yPos: -3.76145; zPos: 0.43701 }
+ ListElement{ xPos: 0.326656; yPos: -1.24467; zPos: 2.62222 }
+ ListElement{ xPos: -0.259702; yPos: 2.68152; zPos: -3.18542 }
+ ListElement{ xPos: 1.88504; yPos: -0.760623; zPos: 4.42592 }
+ ListElement{ xPos: 0.251673; yPos: 0.472252; zPos: -1.99239 }
+ ListElement{ xPos: -1.66934; yPos: -0.129677; zPos: -2.49048 }
+ ListElement{ xPos: -1.25499; yPos: 2.36151; zPos: -2.98447 }
+ ListElement{ xPos: 2.65331; yPos: 0.0443886; zPos: 0.108819 }
+ ListElement{ xPos: -3.35439; yPos: 0.0872109; zPos: -1.33429 }
+ ListElement{ xPos: 3.35597; yPos: 0.0403626; zPos: 2.8203 }
+ ListElement{ xPos: 4.45191; yPos: 1.24824; zPos: -0.95821 }
+ ListElement{ xPos: -0.171441; yPos: -1.52622; zPos: -4.68253 }
+ ListElement{ xPos: 1.19986; yPos: 1.72992; zPos: -3.29566 }
+ ListElement{ xPos: -0.451339; yPos: 1.92976; zPos: 1.21534 }
+ ListElement{ xPos: -0.743119; yPos: -0.160688; zPos: 0.805688 }
+ ListElement{ xPos: 2.38678; yPos: 0.272829; zPos: 2.75457 }
+ ListElement{ xPos: 1.72464; yPos: 2.08232; zPos: -0.950389 }
+ ListElement{ xPos: 2.11167; yPos: 1.56576; zPos: 1.21969 }
+ ListElement{ xPos: 3.05157; yPos: -1.56838; zPos: -0.450535 }
+ ListElement{ xPos: 0.132417; yPos: -3.08279; zPos: -1.34127 }
+ ListElement{ xPos: 1.65441; yPos: -0.325204; zPos: -0.825145 }
+ ListElement{ xPos: 2.05515; yPos: -1.8417; zPos: 1.8561 }
+ ListElement{ xPos: -0.555858; yPos: 1.52007; zPos: -0.80122 }
+ ListElement{ xPos: -2.05026; yPos: 1.52773; zPos: 2.33529 }
+ ListElement{ xPos: -2.35231; yPos: -3.28716; zPos: 3.53598 }
+ ListElement{ xPos: -2.25771; yPos: 2.5667; zPos: -1.92243 }
+ ListElement{ xPos: 0.386884; yPos: -3.28674; zPos: 3.49336 }
+ ListElement{ xPos: 0.957272; yPos: -1.68124; zPos: -1.89095 }
+ ListElement{ xPos: 2.99881; yPos: 2.24992; zPos: -0.0535837 }
+ ListElement{ xPos: 3.19604; yPos: 2.92893; zPos: -2.16276 }
+ ListElement{ xPos: 2.55903; yPos: 3.12413; zPos: 2.95022 }
+ ListElement{ xPos: -0.570758; yPos: -2.85326; zPos: -0.339255 }
+ ListElement{ xPos: 0.356627; yPos: 0.641074; zPos: 0.355538 }
+ ListElement{ xPos: -1.15777; yPos: -0.162227; zPos: -0.455885 }
+ ListElement{ xPos: -2.4871; yPos: -0.885492; zPos: -0.374875 }
+ ListElement{ xPos: 1.55464; yPos: -1.48929; zPos: -0.593706 }
+ ListElement{ xPos: -0.852655; yPos: -2.08736; zPos: -1.18281 }
+ ListElement{ xPos: 0.504087; yPos: -0.879247; zPos: 1.35148 }
+ ListElement{ xPos: -2.15261; yPos: 1.04511; zPos: -3.25543 }
+ ListElement{ xPos: -0.653745; yPos: -1.32873; zPos: -3.18964 }
+ ListElement{ xPos: 0.35973; yPos: -0.844255; zPos: -1.72034 }
+ ListElement{ xPos: -2.11112; yPos: 0.962572; zPos: 2.59386 }
+ ListElement{ xPos: 1.47531; yPos: -0.693626; zPos: -3.15249 }
+ ListElement{ xPos: -1.35814; yPos: 0.767202; zPos: 3.45094 }
+ ListElement{ xPos: -3.05812; yPos: -1.26298; zPos: 1.45287 }
+ ListElement{ xPos: -1.63927; yPos: 0.893568; zPos: -1.94978 }
+ ListElement{ xPos: 0.751992; yPos: 1.68559; zPos: 2.3618 }
+ ListElement{ xPos: 0.58205; yPos: -0.769076; zPos: -0.958994 }
+ ListElement{ xPos: -2.38512; yPos: -0.166005; zPos: -1.25855 }
+ ListElement{ xPos: -0.556071; yPos: -2.28164; zPos: 1.57032 }
+ ListElement{ xPos: 0.589172; yPos: -0.244834; zPos: 0.553728 }
+ ListElement{ xPos: -0.468648; yPos: -0.927756; zPos: -0.737048 }
+ ListElement{ xPos: -2.66659; yPos: -1.64374; zPos: -0.995568 }
+ ListElement{ xPos: 0.251499; yPos: -1.24569; zPos: 0.95028 }
+ ListElement{ xPos: 0.737721; yPos: 2.88575; zPos: 0.448918 }
+ ListElement{ xPos: -0.634421; yPos: -1.84377; zPos: -2.47094 }
+ ListElement{ xPos: 0.556349; yPos: 2.86774; zPos: 1.62621 }
+ ListElement{ xPos: -3.29644; yPos: 3.28642; zPos: -3.45459 }
+ ListElement{ xPos: -1.45045; yPos: 2.52138; zPos: 2.75329 }
+ ListElement{ xPos: 1.87449; yPos: -2.68651; zPos: 3.60371 }
+ ListElement{ xPos: -0.656424; yPos: -2.56828; zPos: 1.35509 }
+ ListElement{ xPos: 1.95771; yPos: -1.48325; zPos: -3.85265 }
+ ListElement{ xPos: 3.85074; yPos: 0.0825779; zPos: -1.65283 }
+ ListElement{ xPos: -1.17278; yPos: -1.69258; zPos: -1.05875 }
+ ListElement{ xPos: 1.25754; yPos: -0.0439433; zPos: 1.3571 }
+ ListElement{ xPos: 2.91459; yPos: 2.08715; zPos: 0.259842 }
+ ListElement{ xPos: 0.748196; yPos: 2.52132; zPos: 0.659051 }
+ ListElement{ xPos: -1.85745; yPos: -1.88355; zPos: 1.05259 }
+ ListElement{ xPos: 1.69311; yPos: 1.12299; zPos: -3.05453 }
+ ListElement{ xPos: -2.86301; yPos: 0.123274; zPos: 0.559289 }
+ ListElement{ xPos: -1.43146; yPos: 1.64425; zPos: -1.95053 }
+ ListElement{ xPos: 2.35287; yPos: 0.414621; zPos: -0.950807 }
+ ListElement{ xPos: 0.952585; yPos: -0.280452; zPos: -0.844588 }
+ ListElement{ xPos: -1.53836; yPos: -1.76396; zPos: 2.51742 }
+ ListElement{ xPos: -3.05431; yPos: 2.45; zPos: -0.26571 }
+ ListElement{ xPos: -0.637412; yPos: 1.12028; zPos: -0.587387 }
+ ListElement{ xPos: -1.71017; yPos: -0.728497; zPos: -1.05087 }
+ ListElement{ xPos: 0.454027; yPos: 0.849208; zPos: -0.151716 }
+ ListElement{ xPos: -3.54846; yPos: 0.367137; zPos: 1.1484 }
+ ListElement{ xPos: 0.200816; yPos: -2.08832; zPos: 0.255433 }
+ ListElement{ xPos: -2.15817; yPos: 0.725338; zPos: 0.852676 }
+ ListElement{ xPos: -2.45708; yPos: -0.725538; zPos: -0.859435 }
+ ListElement{ xPos: 4.25339; yPos: 1.84177; zPos: -0.555145 }
+ ListElement{ xPos: 0.119319; yPos: -1.32041; zPos: -1.45864 }
+ ListElement{ xPos: -3.65177; yPos: 0.361323; zPos: 0.351554 }
+ ListElement{ xPos: 0.928598; yPos: 0.321024; zPos: -3.64759 }
+ ListElement{ xPos: -0.250062; yPos: 1.84912; zPos: 0.949887 }
+ ListElement{ xPos: 3.59593; yPos: 0.929451; zPos: -2.15224 }
+ ListElement{ xPos: 0.658599; yPos: 2.36796; zPos: 4.11632 }
+ ListElement{ xPos: 0.55841; yPos: -1.08657; zPos: 0.258326 }
+ ListElement{ xPos: 1.9419; yPos: 0.0488641; zPos: -3.75375 }
+ ListElement{ xPos: 0.0589998; yPos: 0.521351; zPos: -3.85723 }
+ ListElement{ xPos: 3.45108; yPos: 0.562199; zPos: 4.20946 }
+ ListElement{ xPos: -0.255073; yPos: 2.36504; zPos: -3.556 }
+ ListElement{ xPos: 1.95848; yPos: 1.28698; zPos: 4.25014 }
+ ListElement{ xPos: 1.85411; yPos: 3.12131; zPos: 0.652769 }
+ ListElement{ xPos: -3.3589; yPos: 0.801817; zPos: -1.5591 }
+ ListElement{ xPos: 2.48128; yPos: -0.163406; zPos: 1.25243 }
+ ListElement{ xPos: 2.52135; yPos: 0.960467; zPos: 1.45432 }
+ ListElement{ xPos: 0.827496; yPos: -0.163021; zPos: -0.558886 }
+ ListElement{ xPos: -3.45032; yPos: -0.0831453; zPos: 0.851212 }
+ ListElement{ xPos: -3.45334; yPos: 0.855944; zPos: 1.35596 }
+ ListElement{ xPos: -0.834644; yPos: 0.245598; zPos: -1.23878 }
+ ListElement{ xPos: 3.64558; yPos: 1.16831; zPos: -0.18559 }
+ ListElement{ xPos: -1.45919; yPos: -3.08196; zPos: -0.329805 }
+ ListElement{ xPos: -3.65715; yPos: -1.04485; zPos: 0.159208 }
+ ListElement{ xPos: 1.35463; yPos: -0.766382; zPos: 0.558632 }
+ ListElement{ xPos: -2.75899; yPos: -1.67431; zPos: -1.55069 }
+ ListElement{ xPos: 1.67539; yPos: 2.04337; zPos: 0.912884 }
+ ListElement{ xPos: 3.51677; yPos: -3.24285; zPos: 0.170272 }
+ ListElement{ xPos: -4.25189; yPos: 0.56589; zPos: -4.35936 }
+ ListElement{ xPos: -2.68545; yPos: -0.448243; zPos: 0.540342 }
+ ListElement{ xPos: 0.279844; yPos: -0.641466; zPos: -0.353986 }
+ ListElement{ xPos: -3.27626; yPos: -3.52006; zPos: 1.77644 }
+ ListElement{ xPos: -0.724096; yPos: -1.84647; zPos: -2.45271 }
+ ListElement{ xPos: -4.18603; yPos: 0.123376; zPos: 3.85066 }
+ ListElement{ xPos: -4.05156; yPos: 0.0499386; zPos: -0.332945 }
+ ListElement{ xPos: 2.69508; yPos: 2.32777; zPos: 1.26256 }
+ ListElement{ xPos: -0.353726; yPos: 1.07252; zPos: -0.738837 }
+ ListElement{ xPos: -0.947178; yPos: 0.36459; zPos: 1.55593 }
+ ListElement{ xPos: -0.058346; yPos: 2.44781; zPos: -4.35023 }
+ ListElement{ xPos: 1.51586; yPos: -0.961109; zPos: -3.43483 }
+ ListElement{ xPos: -2.8852; yPos: 2.08863; zPos: -1.75468 }
+ ListElement{ xPos: -0.297867; yPos: 0.722757; zPos: 0.91355 }
+ ListElement{ xPos: -1.12917; yPos: -1.68328; zPos: 0.175315 }
+ ListElement{ xPos: -1.24248; yPos: -0.323519; zPos: -0.854841 }
+ ListElement{ xPos: 0.751943; yPos: 0.564075; zPos: 3.95073 }
+ ListElement{ xPos: 1.15436; yPos: 2.81813; zPos: 0.653114 }
+ ListElement{ xPos: -2.55058; yPos: -2.56486; zPos: 0.756618 }
+ ListElement{ xPos: 0.959794; yPos: 0.845224; zPos: -0.854001 }
+ ListElement{ xPos: -2.15033; yPos: 0.248556; zPos: -3.16151 }
+ ListElement{ xPos: 0.353224; yPos: -1.68637; zPos: 0.457949 }
+ ListElement{ xPos: -0.753237; yPos: -2.48313; zPos: -0.355373 }
+ ListElement{ xPos: 0.296585; yPos: 2.04822; zPos: 0.198473 }
+ ListElement{ xPos: -2.4737; yPos: 0.682952; zPos: 1.85349 }
+ ListElement{ xPos: 1.9027; yPos: 0.882796; zPos: 1.45908 }
+ ListElement{ xPos: 0.254799; yPos: 1.92572; zPos: -1.70848 }
+ ListElement{ xPos: -0.951602; yPos: -0.698987; zPos: -2.22682 }
+ ListElement{ xPos: 0.262582; yPos: -2.44093; zPos: 1.05636 }
+ ListElement{ xPos: 0.385415; yPos: -0.685667; zPos: -3.35928 }
+ ListElement{ xPos: 0.055981; yPos: 0.523585; zPos: -3.36093 }
+ ListElement{ xPos: -0.0518635; yPos: -0.889068; zPos: -0.840648 }
+ ListElement{ xPos: 0.455171; yPos: 2.84624; zPos: -1.98276 }
+ ListElement{ xPos: 2.85475; yPos: -0.685697; zPos: -2.45695 }
+ ListElement{ xPos: -1.05047; yPos: -1.92121; zPos: 0.931666 }
+ ListElement{ xPos: -2.75962; yPos: -0.164458; zPos: -1.55261 }
+ ListElement{ xPos: 1.91811; yPos: 1.65767; zPos: 3.15004 }
+ ListElement{ xPos: -2.25653; yPos: 0.856735; zPos: -4.351 }
+ ListElement{ xPos: 1.89178; yPos: -0.728669; zPos: -3.8803 }
+ ListElement{ xPos: -3.25958; yPos: -1.16223; zPos: -1.85148 }
+ ListElement{ xPos: -1.6291; yPos: -2.32967; zPos: -0.874786 }
+ ListElement{ xPos: 3.17524; yPos: 0.327351; zPos: 2.15337 }
+ ListElement{ xPos: -1.05094; yPos: -0.560694; zPos: -3.4581 }
+ ListElement{ xPos: 0.759785; yPos: -1.0801; zPos: -0.257876 }
+ ListElement{ xPos: -0.4597; yPos: -2.2404; zPos: 2.54341 }
+ ListElement{ xPos: 0.242266; yPos: 0.121832; zPos: 0.780878 }
+ ListElement{ xPos: -1.6573; yPos: 1.56049; zPos: -1.61749 }
+ ListElement{ xPos: 1.39912; yPos: -2.84395; zPos: -0.25965 }
+ ListElement{ xPos: 0.552342; yPos: 1.36924; zPos: 2.95278 }
+ ListElement{ xPos: -1.92932; yPos: -0.883981; zPos: 0.0589583 }
+ ListElement{ xPos: -1.9026; yPos: 0.56297; zPos: -0.723523 }
+ ListElement{ xPos: -1.25867; yPos: -0.529617; zPos: 2.3503 }
+ ListElement{ xPos: 2.16527; yPos: -0.723364; zPos: -1.45609 }
+ ListElement{ xPos: -0.984608; yPos: -0.720375; zPos: -2.05144 }
+ ListElement{ xPos: 0.946803; yPos: -0.969188; zPos: -3.14625 }
+ ListElement{ xPos: 2.7986; yPos: -2.36069; zPos: 1.25827 }
+ ListElement{ xPos: 3.37979; yPos: -1.11699; zPos: -3.55116 }
+ ListElement{ xPos: -0.753992; yPos: -1.9649; zPos: 2.98548 }
+ ListElement{ xPos: -0.456321; yPos: 0.525303; zPos: -0.109174 }
+ ListElement{ xPos: 0.8642; yPos: 0.153147; zPos: -3.34749 }
+ ListElement{ xPos: -0.450507; yPos: -0.443265; zPos: -2.8325 }
+ ListElement{ xPos: -3.24876; yPos: 3.12791; zPos: 0.576143 }
+ ListElement{ xPos: -3.14755; yPos: 2.84502; zPos: -0.45749 }
+ ListElement{ xPos: 0.226819; yPos: -1.28172; zPos: 0.939501 }
+ ListElement{ xPos: -0.650725; yPos: -1.40317; zPos: -1.35211 }
+ ListElement{ xPos: -0.451625; yPos: 1.84271; zPos: -0.950536 }
+ ListElement{ xPos: -1.36693; yPos: 0.850218; zPos: -1.09799 }
+ ListElement{ xPos: 2.35374; yPos: -0.28759; zPos: 1.55815 }
+ ListElement{ xPos: 2.60577; yPos: -2.46765; zPos: 1.2633 }
+ ListElement{ xPos: 1.21562; yPos: -1.72153; zPos: -0.4034 }
+ ListElement{ xPos: -2.43216; yPos: 3.04268; zPos: 1.90109 }
+ ListElement{ xPos: -1.85365; yPos: -0.16523; zPos: -2.98947 }
+ ListElement{ xPos: -0.953475; yPos: -2.76164; zPos: 2.53396 }
+ ListElement{ xPos: 2.55264; yPos: -0.645611; zPos: 3.25479 }
+ ListElement{ xPos: -0.675476; yPos: -0.724382; zPos: -1.4566 }
+ ListElement{ xPos: 0.801062; yPos: 0.16778; zPos: 2.21815 }
+ ListElement{ xPos: 0.680443; yPos: 0.0407888; zPos: 3.27279 }
+ ListElement{ xPos: -3.75426; yPos: -0.247624; zPos: 0.26307 }
+ ListElement{ xPos: 0.427609; yPos: -0.322312; zPos: 0.652005 }
+ ListElement{ xPos: -2.17428; yPos: -3.68643; zPos: 0.256619 }
+ ListElement{ xPos: 0.456732; yPos: -2.44858; zPos: 3.13051 }
+ ListElement{ xPos: 0.524175; yPos: -1.88231; zPos: -1.93171 }
+ ListElement{ xPos: 0.92311; yPos: 1.8354; zPos: -1.2502 }
+ ListElement{ xPos: 2.69502; yPos: 2.25543; zPos: -4.25127 }
+ ListElement{ xPos: 0.259357; yPos: 2.28099; zPos: -0.476734 }
+ ListElement{ xPos: -0.327316; yPos: -1.24908; zPos: 0.78628 }
+ ListElement{ xPos: 0.190362; yPos: -3.26019; zPos: 0.0545844 }
+ ListElement{ xPos: -1.25409; yPos: -0.761609; zPos: 2.65361 }
+ ListElement{ xPos: 2.86816; yPos: 0.443709; zPos: 0.556137 }
+ ListElement{ xPos: 2.60289; yPos: -0.680561; zPos: 0.248414 }
+ ListElement{ xPos: 1.75631; yPos: -0.162859; zPos: -3.62488 }
+ ListElement{ xPos: -0.559754; yPos: -0.16222; zPos: 2.35858 }
+ ListElement{ xPos: 0.157552; yPos: -1.72639; zPos: -0.48056 }
+ ListElement{ xPos: 3.69492; yPos: -0.848265; zPos: -0.256413 }
+ ListElement{ xPos: -1.4264; yPos: -1.48589; zPos: -2.724 }
+ ListElement{ xPos: 1.15372; yPos: -0.27228; zPos: -2.75499 }
+ ListElement{ xPos: -1.85159; yPos: 1.76577; zPos: -0.858854 }
+ ListElement{ xPos: 0.0580466; yPos: -0.41133; zPos: 1.05649 }
+ ListElement{ xPos: -1.25289; yPos: 0.528142; zPos: -0.386138 }
+ ListElement{ xPos: -0.858101; yPos: -0.245127; zPos: 1.95078 }
+ ListElement{ xPos: -1.95302; yPos: -0.0862415; zPos: -1.95806 }
+ ListElement{ xPos: -2.79133; yPos: -0.527094; zPos: -0.356931 }
+ ListElement{ xPos: 0.110597; yPos: 0.167534; zPos: 4.12784 }
+ ListElement{ xPos: -0.637771; yPos: -0.526587; zPos: -1.25734 }
+ ListElement{ xPos: -2.311; yPos: -0.489068; zPos: -2.8594 }
+ ListElement{ xPos: -0.352617; yPos: -1.23939; zPos: -1.85435 }
+ ListElement{ xPos: 1.78814; yPos: -0.265883; zPos: 3.35913 }
+ ListElement{ xPos: 2.75557; yPos: -2.32271; zPos: 3.15559 }
+ ListElement{ xPos: 2.85426; yPos: 0.443661; zPos: 0.921828 }
+ ListElement{ xPos: -2.14262; yPos: 0.400863; zPos: 1.11614 }
+ ListElement{ xPos: 4.45496; yPos: -0.488668; zPos: -3.7533 }
+ ListElement{ xPos: 0.754719; yPos: -1.44165; zPos: 0.853323 }
+ ListElement{ xPos: -0.856506; yPos: 1.76559; zPos: 1.05702 }
+ ListElement{ xPos: -0.418565; yPos: -0.921031; zPos: -2.43699 }
+ ListElement{ xPos: -1.29292; yPos: -0.282271; zPos: -1.62927 }
+ ListElement{ xPos: -0.759531; yPos: 0.566692; zPos: -0.750991 }
+ ListElement{ xPos: 0.559787; yPos: 1.72479; zPos: -0.26667 }
+ ListElement{ xPos: 2.75533; yPos: -0.245187; zPos: -0.543844 }
+ ListElement{ xPos: -2.27924; yPos: -1.04154; zPos: -4.05156 }
+ ListElement{ xPos: 3.35852; yPos: -0.561129; zPos: -2.98986 }
+ ListElement{ xPos: 2.41843; yPos: -0.321119; zPos: -1.55651 }
+ ListElement{ xPos: 0.85431; yPos: -0.883719; zPos: -2.17826 }
+ ListElement{ xPos: 0.417867; yPos: 0.242995; zPos: -0.456326 }
+ ListElement{ xPos: -4.17449; yPos: -0.720086; zPos: 0.355145 }
+ ListElement{ xPos: -0.577386; yPos: 0.0440364; zPos: -0.950268 }
+ ListElement{ xPos: -2.8156; yPos: 2.92346; zPos: 0.958713 }
+ ListElement{ xPos: -1.65138; yPos: 0.963561; zPos: 1.25265 }
+ ListElement{ xPos: 1.45117; yPos: 0.845424; zPos: 0.252789 }
+ ListElement{ xPos: 2.27848; yPos: -1.76777; zPos: 0.0117707 }
+ ListElement{ xPos: -0.754248; yPos: 1.08381; zPos: -2.15345 }
+ ListElement{ xPos: -3.15415; yPos: -0.162292; zPos: -1.15347 }
+ ListElement{ xPos: 2.55396; yPos: -1.68912; zPos: 1.15698 }
+ ListElement{ xPos: 0.159561; yPos: 1.84202; zPos: 0.428428 }
+ ListElement{ xPos: -1.58079; yPos: 2.04207; zPos: 3.29578 }
+ ListElement{ xPos: -1.05711; yPos: -0.843112; zPos: -1.98122 }
+ ListElement{ xPos: 0.138866; yPos: -2.96642; zPos: -0.212247 }
+ ListElement{ xPos: 2.6778; yPos: 0.686972; zPos: -2.6553 }
+ ListElement{ xPos: -0.498291; yPos: -0.362846; zPos: -1.0538 }
+ ListElement{ xPos: 1.19872; yPos: 0.0476518; zPos: -2.42077 }
+ ListElement{ xPos: -2.3972; yPos: 1.40393; zPos: -0.1943 }
+ ListElement{ xPos: 0.85034; yPos: -1.24222; zPos: 1.5646 }
+ ListElement{ xPos: 0.142174; yPos: 0.249903; zPos: -2.75252 }
+ ListElement{ xPos: 1.15197; yPos: 1.32746; zPos: -1.70104 }
+ ListElement{ xPos: 0.359387; yPos: -1.65115; zPos: -2.75243 }
+ ListElement{ xPos: 0.357917; yPos: -1.36406; zPos: 2.55102 }
+ ListElement{ xPos: -1.65268; yPos: -0.28339; zPos: 2.75665 }
+ ListElement{ xPos: -3.82681; yPos: -3.28984; zPos: 2.55128 }
+ ListElement{ xPos: -2.61371; yPos: 1.08247; zPos: -0.457068 }
+ ListElement{ xPos: 1.67152; yPos: -2.25527; zPos: 2.45819 }
+ ListElement{ xPos: -0.753832; yPos: 1.1682; zPos: -1.95913 }
+ ListElement{ xPos: -2.05131; yPos: 3.04537; zPos: 1.91954 }
+ ListElement{ xPos: -0.695378; yPos: 2.88924; zPos: 1.41965 }
+ ListElement{ xPos: 3.25767; yPos: -2.76934; zPos: -0.354127 }
+ ListElement{ xPos: -0.746795; yPos: 1.36034; zPos: 1.85953 }
+ ListElement{ xPos: 0.859135; yPos: 1.08222; zPos: 0.959116 }
+ ListElement{ xPos: 1.15898; yPos: 1.32443; zPos: 3.41981 }
+ ListElement{ xPos: 3.67954; yPos: 0.447177; zPos: -0.414029 }
+ ListElement{ xPos: 0.907323; yPos: 2.12852; zPos: 1.95837 }
+ ListElement{ xPos: -0.683456; yPos: -0.247536; zPos: 1.05621 }
+ ListElement{ xPos: -1.67809; yPos: 0.641544; zPos: -1.31143 }
+ ListElement{ xPos: -1.30192; yPos: -0.677394; zPos: -1.95159 }
+ ListElement{ xPos: -0.105665; yPos: 0.365205; zPos: -1.2567 }
+ ListElement{ xPos: 1.12189; yPos: -1.48969; zPos: 0.957166 }
+ ListElement{ xPos: 1.25554; yPos: -1.92186; zPos: -0.904086 }
+ ListElement{ xPos: 0.117786; yPos: 2.23836; zPos: -0.498009 }
+ ListElement{ xPos: -2.85788; yPos: 0.643364; zPos: 0.55867 }
+ ListElement{ xPos: -1.66115; yPos: 2.56146; zPos: -2.28632 }
+ ListElement{ xPos: -3.29334; yPos: -0.0894367; zPos: -0.656519 }
+ ListElement{ xPos: 3.15561; yPos: -0.769732; zPos: 1.15695 }
+ ListElement{ xPos: 1.25684; yPos: 0.64652; zPos: -2.6002 }
+ ListElement{ xPos: 2.65231; yPos: -3.52625; zPos: 1.55617 }
+ ListElement{ xPos: -1.8573; yPos: -1.76276; zPos: -1.74075 }
+ ListElement{ xPos: -1.55648; yPos: 1.2592; zPos: 2.1585 }
+ ListElement{ xPos: -0.555522; yPos: 2.88068; zPos: -2.85423 }
+ ListElement{ xPos: -3.14249; yPos: -0.288592; zPos: -3.35534 }
+ ListElement{ xPos: 2.45413; yPos: 0.0854903; zPos: -2.20507 }
+ ListElement{ xPos: -2.05464; yPos: 0.887836; zPos: -0.658349 }
+ ListElement{ xPos: 1.12708; yPos: -0.568106; zPos: -3.65865 }
+ ListElement{ xPos: -0.59147; yPos: -0.685439; zPos: 0.301612 }
+ ListElement{ xPos: 0.473679; yPos: 0.886411; zPos: -1.65386 }
+ ListElement{ xPos: 1.65166; yPos: 0.166741; zPos: 0.751119 }
+ ListElement{ xPos: -0.299287; yPos: 1.72233; zPos: 0.618559 }
+ ListElement{ xPos: 1.15181; yPos: -0.488026; zPos: 0.124448 }
+ ListElement{ xPos: 0.0561315; yPos: 1.04877; zPos: 2.15922 }
+ ListElement{ xPos: 0.154258; yPos: -0.64401; zPos: -1.31179 }
+ ListElement{ xPos: 1.75863; yPos: -1.88571; zPos: -2.8537 }
+ ListElement{ xPos: 3.35024; yPos: 1.28154; zPos: -1.05461 }
+ ListElement{ xPos: -3.71738; yPos: -2.88631; zPos: -1.05314 }
+ ListElement{ xPos: -1.78258; yPos: 3.08967; zPos: 0.150476 }
+ ListElement{ xPos: 3.47828; yPos: -2.524; zPos: -2.45502 }
+ ListElement{ xPos: -0.159138; yPos: 0.160633; zPos: -0.338796 }
+ ListElement{ xPos: -2.15885; yPos: -0.82959; zPos: 1.25022 }
+ ListElement{ xPos: -1.95268; yPos: -0.841195; zPos: -3.19487 }
+ ListElement{ xPos: -0.281381; yPos: -0.887435; zPos: -3.55807 }
+ ListElement{ xPos: 0.415164; yPos: 0.326482; zPos: -1.55411 }
+ ListElement{ xPos: 1.92868; yPos: -2.84771; zPos: -0.556196 }
+ ListElement{ xPos: 1.05804; yPos: 1.32866; zPos: 0.66596 }
+ ListElement{ xPos: 2.46545; yPos: 1.00747; zPos: 2.35957 }
+ ListElement{ xPos: -0.77358; yPos: 0.284677; zPos: -1.38805 }
+ ListElement{ xPos: 0.851046; yPos: 0.960742; zPos: -2.70934 }
+ ListElement{ xPos: -0.858208; yPos: -0.884015; zPos: 1.16663 }
+ ListElement{ xPos: 1.55291; yPos: 0.282705; zPos: -3.18254 }
+ ListElement{ xPos: 1.99034; yPos: 0.286298; zPos: -1.75821 }
+ ListElement{ xPos: 0.259097; yPos: -2.04379; zPos: -0.858936 }
+ ListElement{ xPos: -1.5956; yPos: 2.04693; zPos: -1.35234 }
+ ListElement{ xPos: -0.775432; yPos: 1.24465; zPos: 1.95935 }
+ ListElement{ xPos: 1.65595; yPos: -1.04954; zPos: -0.954437 }
+ ListElement{ xPos: -2.35417; yPos: -1.76095; zPos: -0.248306 }
+ ListElement{ xPos: 0.855717; yPos: -2.92161; zPos: 3.4496 }
+ ListElement{ xPos: -0.717941; yPos: 2.52993; zPos: 1.25007 }
+ ListElement{ xPos: -3.42927; yPos: 0.673305; zPos: 0.995742 }
+
+ ListElement{ xPos: 8.00000; yPos: -2.05136; zPos: 4.02113 }
+ ListElement{ xPos: 7.88929; yPos: -2.2029; zPos: 5.0000 }
+ ListElement{ xPos: 7.61596; yPos: -2.44569; zPos: 4.54892 }
+ ListElement{ xPos: 7.41949; yPos: -2.64169; zPos: 3.82339 }
+ ListElement{ xPos: 7.21192; yPos: -2.87947; zPos: 4.89423 }
+ ListElement{ xPos: 7.08346; yPos: -2.38649; zPos: 4.19212 }
+ ListElement{ xPos: 6.90279; yPos: -3.33038; zPos: 4.9273 }
+ ListElement{ xPos: 6.78959; yPos: -3.55575; zPos: 3.55127 }
+ ListElement{ xPos: 6.57074; yPos: -3.75902; zPos: 3.32517 }
+ ListElement{ xPos: 6.30756; yPos: -3.40499; zPos: 3.78366 }
+ ListElement{ xPos: 7.90893; yPos: -3.3237; zPos: 2.48012 }
+ ListElement{ xPos: 6.24078; yPos: -4.04978; zPos: 3.47459 }
+ ListElement{ xPos: 7.93452; yPos: -4.6865; zPos: 4.08057 }
+ ListElement{ xPos: 5.98731; yPos: -2.26113; zPos: 2.82166 }
+ ListElement{ xPos: 5.46898; yPos: -3.99581; zPos: 3.25024 }
+ ListElement{ xPos: 7.92353; yPos: -3.34471; zPos: 3.42168 }
+ ListElement{ xPos: 6.8456; yPos: -5.00000; zPos: 2.36145 }
+ ListElement{ xPos: 7.62888; yPos: -3.82465; zPos: 2.7879 }
+ ListElement{ xPos: 7.18034; yPos: -3.94376; zPos: 2.74348 }
+ ListElement{ xPos: 6.02527; yPos: -4.36523; zPos: 2.56247 }
+ ListElement{ xPos: 7.82353; yPos: -3.04345; zPos: 2.62974 }
+ ListElement{ xPos: 7.82539; yPos: -3.6881; zPos: 2.96164 }
+ ListElement{ xPos: 7.10508; yPos: -3.6174; zPos: 4.22416 }
+ ListElement{ xPos: 7.64684; yPos: -3.88431; zPos: 3.9336 }
+ ListElement{ xPos: 7.46411; yPos: -4.21516; zPos: 3.32001 }
+ ListElement{ xPos: 6.98777; yPos: -3.94024; zPos: 3.14694 }
+ ListElement{ xPos: 7.36355; yPos: -4.24875; zPos: 1.72061 }
+ ListElement{ xPos: 7.92773; yPos: -4.52065; zPos: 2.62078 }
+ ListElement{ xPos: 6.04598; yPos: -4.48682; zPos: 2.74494 }
+ ListElement{ xPos: 7.83353; yPos: -3.9271; zPos: 3.82815 }
+ ListElement{ xPos: 6.76279; yPos: -3.58031; zPos: 2.92525 }
+ ListElement{ xPos: 7.14794; yPos: -4.42742; zPos: 2.62365 }
+ ListElement{ xPos: 5.32696; yPos: -3.28733; zPos: 3.34916 }
+ ListElement{ xPos: 6.43655; yPos: -4.60784; zPos: 2.41548 }
+ ListElement{ xPos: 5.66033; yPos: -4.98497; zPos: 3.72282 }
+ }
+}
diff --git a/examples/datavisualization/qmlcustominput/qml/qmlcustominput/NewButton.qml b/examples/datavisualization/qmlcustominput/qml/qmlcustominput/NewButton.qml
new file mode 100644
index 00000000..e4fb99d2
--- /dev/null
+++ b/examples/datavisualization/qmlcustominput/qml/qmlcustominput/NewButton.qml
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtQuick.Controls 1.0
+import QtQuick.Controls.Styles 1.0
+
+Item {
+ id: newbutton
+
+ property alias text: buttonText.text
+
+ signal clicked
+
+ implicitWidth: buttonText.implicitWidth + 5
+ implicitHeight: buttonText.implicitHeight + 10
+
+ Button {
+ id: buttonText
+ width: parent.width
+ height: parent.height
+
+ style: ButtonStyle {
+ label: Component {
+ Text {
+ text: buttonText.text
+ clip: true
+ wrapMode: Text.WordWrap
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ anchors.fill: parent
+ }
+ }
+ }
+ onClicked: newbutton.clicked()
+ }
+}
diff --git a/examples/datavisualization/qmlcustominput/qml/qmlcustominput/main.qml b/examples/datavisualization/qmlcustominput/qml/qmlcustominput/main.qml
new file mode 100644
index 00000000..cfac0f15
--- /dev/null
+++ b/examples/datavisualization/qmlcustominput/qml/qmlcustominput/main.qml
@@ -0,0 +1,205 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtQuick.Layouts 1.0
+import QtDataVisualization 1.0
+import "."
+
+Item {
+ id: mainView
+ width: 1280
+ height: 720
+
+ Data {
+ id: graphData
+ }
+
+ Item {
+ id: dataView
+ anchors.bottom: parent.bottom
+ width: parent.width
+ height: parent.height - buttonLayout.height
+
+ //! [0]
+ Scatter3D {
+ //! [0]
+ id: scatterGraph
+ width: dataView.width
+ height: dataView.height
+ theme: Theme3D { type: Theme3D.ThemeDigia }
+ shadowQuality: AbstractGraph3D.ShadowQualityMedium
+ scene.activeCamera.yRotation: 30.0
+ //! [1]
+ inputHandler: null
+ //! [1]
+
+ Scatter3DSeries {
+ id: scatterSeries
+ itemLabelFormat: "X:@xLabel Y:@yLabel Z:@zLabel"
+ mesh: Abstract3DSeries.MeshCube
+
+ ItemModelScatterDataProxy {
+ itemModel: graphData.model
+ xPosRole: "xPos"
+ yPosRole: "yPos"
+ zPosRole: "zPos"
+ }
+ }
+ }
+
+ //! [2]
+ MouseArea {
+ id: inputArea
+ anchors.fill: parent
+ hoverEnabled: true
+ acceptedButtons: Qt.LeftButton | Qt.RightButton
+ property int mouseX: -1
+ property int mouseY: -1
+ //! [2]
+
+ //! [3]
+ onPositionChanged: {
+ mouseX = mouse.x;
+ mouseY = mouse.y;
+ }
+ //! [3]
+
+ //! [5]
+ onWheel: {
+ // Adjust zoom level based on what zoom range we're in.
+ var zoomLevel = scatterGraph.scene.activeCamera.zoomLevel;
+ if (zoomLevel > 100)
+ zoomLevel += wheel.angleDelta.y / 12.0;
+ else if (zoomLevel > 50)
+ zoomLevel += wheel.angleDelta.y / 60.0;
+ else
+ zoomLevel += wheel.angleDelta.y / 120.0;
+ if (zoomLevel > 500)
+ zoomLevel = 500;
+ else if (zoomLevel < 10)
+ zoomLevel = 10;
+
+ scatterGraph.scene.activeCamera.zoomLevel = zoomLevel;
+ }
+ //! [5]
+ }
+
+ //! [4]
+ Timer {
+ id: reselectTimer
+ interval: 10
+ running: true
+ repeat: true
+ onTriggered: {
+ scatterGraph.scene.selectionQueryPosition = Qt.point(inputArea.mouseX, inputArea.mouseY);
+ }
+ }
+ //! [4]
+ }
+
+ //! [6]
+ NumberAnimation {
+ id: cameraAnimationX
+ loops: Animation.Infinite
+ running: true
+ target: scatterGraph.scene.activeCamera
+ property:"xRotation"
+ from: 0.0
+ to: 360.0
+ duration: 20000
+ }
+ //! [6]
+
+
+ //! [7]
+ SequentialAnimation {
+ id: cameraAnimationY
+ loops: Animation.Infinite
+ running: true
+
+ NumberAnimation {
+ target: scatterGraph.scene.activeCamera
+ property:"yRotation"
+ from: 5.0
+ to: 45.0
+ duration: 9000
+ easing.type: Easing.InOutSine
+ }
+
+ NumberAnimation {
+ target: scatterGraph.scene.activeCamera
+ property:"yRotation"
+ from: 45.0
+ to: 5.0
+ duration: 9000
+ easing.type: Easing.InOutSine
+ }
+ }
+ //! [7]
+
+ RowLayout {
+ id: buttonLayout
+ Layout.minimumHeight: shadowToggle.height
+ width: parent.width
+ anchors.left: parent.left
+ spacing: 0
+
+ NewButton {
+ id: shadowToggle
+ Layout.fillHeight: true
+ Layout.minimumWidth: parent.width / 3 // 3 buttons divided equally in the layout
+ text: "Hide Shadows"
+
+ onClicked: {
+ if (scatterGraph.shadowQuality === AbstractGraph3D.ShadowQualityNone) {
+ scatterGraph.shadowQuality = AbstractGraph3D.ShadowQualitySoftMedium;
+ text = "Hide Shadows";
+ } else {
+ scatterGraph.shadowQuality = AbstractGraph3D.ShadowQualityNone;
+ text = "Show Shadows";
+ }
+ }
+ }
+
+ NewButton {
+ id: cameraToggle
+ Layout.fillHeight: true
+ Layout.minimumWidth: parent.width / 3
+ text: "Pause Camera"
+
+ onClicked: {
+ cameraAnimationX.paused = !cameraAnimationX.paused;
+ cameraAnimationY.paused = cameraAnimationX.paused;
+ if (cameraAnimationX.paused) {
+ text = "Animate Camera";
+ } else {
+ text = "Pause Camera";
+ }
+ }
+ }
+
+ NewButton {
+ id: exitButton
+ Layout.fillHeight: true
+ Layout.minimumWidth: parent.width / 3
+ text: "Quit"
+ onClicked: Qt.quit(0);
+ }
+ }
+}
diff --git a/examples/datavisualization/qmlcustominput/qmlcustominput.desktop b/examples/datavisualization/qmlcustominput/qmlcustominput.desktop
new file mode 100644
index 00000000..536f87a9
--- /dev/null
+++ b/examples/datavisualization/qmlcustominput/qmlcustominput.desktop
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Encoding=UTF-8
+Version=1.0
+Type=Application
+Terminal=false
+Name=qmlcustominput
+Exec=/opt/qmlcustominput/bin/qmlcustominput
+Icon=qmlcustominput64
+X-Window-Icon=
+X-HildonDesk-ShowInToolbar=true
+X-Osso-Type=application/x-executable
diff --git a/examples/datavisualization/qmlcustominput/qmlcustominput.pro b/examples/datavisualization/qmlcustominput/qmlcustominput.pro
new file mode 100644
index 00000000..07e61d72
--- /dev/null
+++ b/examples/datavisualization/qmlcustominput/qmlcustominput.pro
@@ -0,0 +1,21 @@
+!include( ../examples.pri ) {
+ error( "Couldn't find the examples.pri file!" )
+}
+
+# Add more folders to ship with the application, here
+folder_01.source = qml/qmlcustominput
+folder_01.target = qml
+DEPLOYMENTFOLDERS = folder_01
+
+# Additional import path used to resolve QML modules in Creator's code model
+QML_IMPORT_PATH =
+
+# The .cpp file which was generated for your project. Feel free to hack it.
+SOURCES += main.cpp
+
+# Please do not modify the following two lines. Required for deployment.
+include(qtquick2applicationviewer/qtquick2applicationviewer.pri)
+qtcAddDeployment()
+
+RESOURCES += \
+ qmlcustominput.qrc
diff --git a/examples/datavisualization/qmlcustominput/qmlcustominput.qrc b/examples/datavisualization/qmlcustominput/qmlcustominput.qrc
new file mode 100644
index 00000000..5800150a
--- /dev/null
+++ b/examples/datavisualization/qmlcustominput/qmlcustominput.qrc
@@ -0,0 +1,7 @@
+<RCC>
+ <qresource prefix="/">
+ <file>qml/qmlcustominput/Data.qml</file>
+ <file>qml/qmlcustominput/main.qml</file>
+ <file>qml/qmlcustominput/NewButton.qml</file>
+ </qresource>
+</RCC>
diff --git a/examples/datavisualization/qmlcustominput/qmlcustominput64.png b/examples/datavisualization/qmlcustominput/qmlcustominput64.png
new file mode 100644
index 00000000..707d5c4e
--- /dev/null
+++ b/examples/datavisualization/qmlcustominput/qmlcustominput64.png
Binary files differ
diff --git a/examples/datavisualization/qmlcustominput/qmlcustominput80.png b/examples/datavisualization/qmlcustominput/qmlcustominput80.png
new file mode 100644
index 00000000..6ad8096c
--- /dev/null
+++ b/examples/datavisualization/qmlcustominput/qmlcustominput80.png
Binary files differ
diff --git a/examples/datavisualization/qmlcustominput/qtquick2applicationviewer/qtquick2applicationviewer.cpp b/examples/datavisualization/qmlcustominput/qtquick2applicationviewer/qtquick2applicationviewer.cpp
new file mode 100644
index 00000000..10709d7a
--- /dev/null
+++ b/examples/datavisualization/qmlcustominput/qtquick2applicationviewer/qtquick2applicationviewer.cpp
@@ -0,0 +1,81 @@
+// checksum 0x4f6f version 0x90005
+/*
+ This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
+ QtQuick2ApplicationViewer is a convenience class containing mobile device specific
+ code such as screen orientation handling. Also QML paths and debugging are
+ handled here.
+ It is recommended not to modify this file, since newer versions of Qt Creator
+ may offer an updated version of it.
+*/
+
+#include "qtquick2applicationviewer.h"
+
+#include <QtCore/QCoreApplication>
+#include <QtCore/QDir>
+#include <QtQml/QQmlEngine>
+
+class QtQuick2ApplicationViewerPrivate
+{
+ QString mainQmlFile;
+ friend class QtQuick2ApplicationViewer;
+ static QString adjustPath(const QString &path);
+};
+
+QString QtQuick2ApplicationViewerPrivate::adjustPath(const QString &path)
+{
+#if defined(Q_OS_MAC)
+ if (!QDir::isAbsolutePath(path))
+ return QString::fromLatin1("%1/../Resources/%2")
+ .arg(QCoreApplication::applicationDirPath(), path);
+#elif defined(Q_OS_BLACKBERRY)
+ if (!QDir::isAbsolutePath(path))
+ return QString::fromLatin1("app/native/%1").arg(path);
+#elif !defined(Q_OS_ANDROID)
+ QString pathInInstallDir =
+ QString::fromLatin1("%1/../%2").arg(QCoreApplication::applicationDirPath(), path);
+ if (QFileInfo(pathInInstallDir).exists())
+ return pathInInstallDir;
+ pathInInstallDir =
+ QString::fromLatin1("%1/%2").arg(QCoreApplication::applicationDirPath(), path);
+ if (QFileInfo(pathInInstallDir).exists())
+ return pathInInstallDir;
+#endif
+ return path;
+}
+
+QtQuick2ApplicationViewer::QtQuick2ApplicationViewer(QWindow *parent)
+ : QQuickView(parent)
+ , d(new QtQuick2ApplicationViewerPrivate())
+{
+ connect(engine(), SIGNAL(quit()), SLOT(close()));
+ setResizeMode(QQuickView::SizeRootObjectToView);
+}
+
+QtQuick2ApplicationViewer::~QtQuick2ApplicationViewer()
+{
+ delete d;
+}
+
+void QtQuick2ApplicationViewer::setMainQmlFile(const QString &file)
+{
+ d->mainQmlFile = QtQuick2ApplicationViewerPrivate::adjustPath(file);
+#ifdef Q_OS_ANDROID
+ setSource(QUrl(QLatin1String("assets:/")+d->mainQmlFile));
+#else
+ setSource(QUrl::fromLocalFile(d->mainQmlFile));
+#endif
+}
+
+void QtQuick2ApplicationViewer::addImportPath(const QString &path)
+{
+ engine()->addImportPath(QtQuick2ApplicationViewerPrivate::adjustPath(path));
+}
+
+void QtQuick2ApplicationViewer::showExpanded()
+{
+#if defined(Q_WS_SIMULATOR) || defined(Q_OS_QNX)
+ showFullScreen();
+#else
+ show();
+#endif
+}
diff --git a/examples/datavisualization/qmlcustominput/qtquick2applicationviewer/qtquick2applicationviewer.h b/examples/datavisualization/qmlcustominput/qtquick2applicationviewer/qtquick2applicationviewer.h
new file mode 100644
index 00000000..cf66f140
--- /dev/null
+++ b/examples/datavisualization/qmlcustominput/qtquick2applicationviewer/qtquick2applicationviewer.h
@@ -0,0 +1,33 @@
+// checksum 0xfde6 version 0x90005
+/*
+ This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
+ QtQuick2ApplicationViewer is a convenience class containing mobile device specific
+ code such as screen orientation handling. Also QML paths and debugging are
+ handled here.
+ It is recommended not to modify this file, since newer versions of Qt Creator
+ may offer an updated version of it.
+*/
+
+#ifndef QTQUICK2APPLICATIONVIEWER_H
+#define QTQUICK2APPLICATIONVIEWER_H
+
+#include <QtQuick/QQuickView>
+
+class QtQuick2ApplicationViewer : public QQuickView
+{
+ Q_OBJECT
+
+public:
+ explicit QtQuick2ApplicationViewer(QWindow *parent = 0);
+ virtual ~QtQuick2ApplicationViewer();
+
+ void setMainQmlFile(const QString &file);
+ void addImportPath(const QString &path);
+
+ void showExpanded();
+
+private:
+ class QtQuick2ApplicationViewerPrivate *d;
+};
+
+#endif // QTQUICK2APPLICATIONVIEWER_H
diff --git a/examples/datavisualization/qmlcustominput/qtquick2applicationviewer/qtquick2applicationviewer.pri b/examples/datavisualization/qmlcustominput/qtquick2applicationviewer/qtquick2applicationviewer.pri
new file mode 100644
index 00000000..e5f7990f
--- /dev/null
+++ b/examples/datavisualization/qmlcustominput/qtquick2applicationviewer/qtquick2applicationviewer.pri
@@ -0,0 +1,180 @@
+# checksum 0x7b0d version 0x90005
+# This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
+# The code below adds the QtQuick2ApplicationViewer to the project and handles
+# the activation of QML debugging.
+# It is recommended not to modify this file, since newer versions of Qt Creator
+# may offer an updated version of it.
+
+QT += qml quick
+
+SOURCES += $$PWD/qtquick2applicationviewer.cpp
+HEADERS += $$PWD/qtquick2applicationviewer.h
+INCLUDEPATH += $$PWD
+# This file was generated by an application wizard of Qt Creator.
+# The code below handles deployment to Android and Maemo, aswell as copying
+# of the application data to shadow build directories on desktop.
+# It is recommended not to modify this file, since newer versions of Qt Creator
+# may offer an updated version of it.
+
+defineTest(qtcAddDeployment) {
+for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ greaterThan(QT_MAJOR_VERSION, 4) {
+ itemsources = $${item}.files
+ } else {
+ itemsources = $${item}.sources
+ }
+ $$itemsources = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath= $$eval($${deploymentfolder}.target)
+ export($$itemsources)
+ export($$itempath)
+ DEPLOYMENT += $$item
+}
+
+MAINPROFILEPWD = $$PWD
+
+android-no-sdk {
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemfiles = $${item}.files
+ $$itemfiles = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath = /data/user/qt/$$eval($${deploymentfolder}.target)
+ export($$itemfiles)
+ export($$itempath)
+ INSTALLS += $$item
+ }
+
+ target.path = /data/user/qt
+
+ export(target.path)
+ INSTALLS += target
+} else:android {
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemfiles = $${item}.files
+ $$itemfiles = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath = /assets/$$eval($${deploymentfolder}.target)
+ export($$itemfiles)
+ export($$itempath)
+ INSTALLS += $$item
+ }
+
+ x86 {
+ target.path = /libs/x86
+ } else: armeabi-v7a {
+ target.path = /libs/armeabi-v7a
+ } else {
+ target.path = /libs/armeabi
+ }
+
+ export(target.path)
+ INSTALLS += target
+} else:win32 {
+ copyCommand =
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
+ source = $$replace(source, /, \\)
+ sourcePathSegments = $$split(source, \\)
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)/$$last(sourcePathSegments)
+ target = $$replace(target, /, \\)
+ target ~= s,\\\\\\.?\\\\,\\,
+ !isEqual(source,$$target) {
+ !isEmpty(copyCommand):copyCommand += &&
+ isEqual(QMAKE_DIR_SEP, \\) {
+ copyCommand += $(COPY_DIR) \"$$source\" \"$$target\"
+ } else {
+ source = $$replace(source, \\\\, /)
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
+ target = $$replace(target, \\\\, /)
+ copyCommand += test -d \"$$target\" || mkdir -p \"$$target\" && cp -r \"$$source\" \"$$target\"
+ }
+ }
+ }
+ !isEmpty(copyCommand) {
+ copyCommand = @echo Copying application data... && $$copyCommand
+ copydeploymentfolders.commands = $$copyCommand
+ first.depends = $(first) copydeploymentfolders
+ export(first.depends)
+ export(copydeploymentfolders.commands)
+ QMAKE_EXTRA_TARGETS += first copydeploymentfolders
+ }
+} else:unix {
+ maemo5 {
+ desktopfile.files = $${TARGET}.desktop
+ desktopfile.path = /usr/share/applications/hildon
+ icon.files = $${TARGET}64.png
+ icon.path = /usr/share/icons/hicolor/64x64/apps
+ } else:!isEmpty(MEEGO_VERSION_MAJOR) {
+ desktopfile.files = $${TARGET}_harmattan.desktop
+ desktopfile.path = /usr/share/applications
+ icon.files = $${TARGET}80.png
+ icon.path = /usr/share/icons/hicolor/80x80/apps
+ } else { # Assumed to be a Desktop Unix
+ copyCommand =
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
+ source = $$replace(source, \\\\, /)
+ macx {
+ target = $$OUT_PWD/$${TARGET}.app/Contents/Resources/$$eval($${deploymentfolder}.target)
+ } else {
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
+ }
+ target = $$replace(target, \\\\, /)
+ sourcePathSegments = $$split(source, /)
+ targetFullPath = $$target/$$last(sourcePathSegments)
+ targetFullPath ~= s,/\\.?/,/,
+ !isEqual(source,$$targetFullPath) {
+ !isEmpty(copyCommand):copyCommand += &&
+ copyCommand += $(MKDIR) \"$$target\"
+ copyCommand += && $(COPY_DIR) \"$$source\" \"$$target\"
+ }
+ }
+ !isEmpty(copyCommand) {
+ copyCommand = @echo Copying application data... && $$copyCommand
+ copydeploymentfolders.commands = $$copyCommand
+ first.depends = $(first) copydeploymentfolders
+ export(first.depends)
+ export(copydeploymentfolders.commands)
+ QMAKE_EXTRA_TARGETS += first copydeploymentfolders
+ }
+ }
+ !isEmpty(target.path) {
+ installPrefix = $${target.path}
+ } else {
+ installPrefix = /opt/$${TARGET}
+ }
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemfiles = $${item}.files
+ $$itemfiles = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath = $${installPrefix}/$$eval($${deploymentfolder}.target)
+ export($$itemfiles)
+ export($$itempath)
+ INSTALLS += $$item
+ }
+
+ !isEmpty(desktopfile.path) {
+ export(icon.files)
+ export(icon.path)
+ export(desktopfile.files)
+ export(desktopfile.path)
+ INSTALLS += icon desktopfile
+ }
+
+ isEmpty(target.path) {
+ target.path = $${installPrefix}/bin
+ export(target.path)
+ }
+ INSTALLS += target
+}
+
+export (ICON)
+export (INSTALLS)
+export (DEPLOYMENT)
+export (LIBS)
+export (QMAKE_EXTRA_TARGETS)
+}
diff --git a/examples/datavisualization/qmllegend/doc/images/qmllegend-example.png b/examples/datavisualization/qmllegend/doc/images/qmllegend-example.png
new file mode 100644
index 00000000..ee546077
--- /dev/null
+++ b/examples/datavisualization/qmllegend/doc/images/qmllegend-example.png
Binary files differ
diff --git a/examples/datavisualization/qmllegend/doc/src/qmllegend.qdoc b/examples/datavisualization/qmllegend/doc/src/qmllegend.qdoc
new file mode 100644
index 00000000..586ba415
--- /dev/null
+++ b/examples/datavisualization/qmllegend/doc/src/qmllegend.qdoc
@@ -0,0 +1,67 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+/*!
+ \example qmllegend
+ \title Qt Quick 2 Legend Example
+ \ingroup qtdatavisualization_examples
+ \brief Showing graph legend in a QML application.
+
+ The Qt Quick 2 legend example shows how to make an interactive legend for a graph.
+
+ \image qmllegend-example.png
+
+ The interesting thing about this example is displaying the legend. We'll concentrate on
+ that and skip explaining the basic functionality - for
+ more detailed QML example documentation, see \l{Qt Quick 2 Scatter Example}.
+
+ \section1 Legend
+
+ The legend is simply a column of custom \c LegendItem items inside a transparent rectangle.
+ Each item is supplied with a series and the graph theme:
+
+ \snippet ../examples/qmllegend/qml/qmllegend/main.qml 0
+
+ The legend items consist of a marker rectangle, which indicates the color of the series,
+ and a text field, which shows the name of the series. The colors we get from the series and
+ the theme supplied at legend item initialization:
+
+ \snippet ../examples/qmllegend/qml/qmllegend/LegendItem.qml 0
+ \dots 4
+ \snippet ../examples/qmllegend/qml/qmllegend/LegendItem.qml 1
+
+ We want the legend to be interactive, so we add additional logic to enable selection of a
+ series by clicking on a legend item, as well as highlighting the legend item corresponding
+ to the selected series.
+
+ The highlight depends on the selection state of the series, so we define two states, which
+ follow the Bar3DSeries::selectedBar property and adjust the \c legendItem color appropriately:
+
+ \snippet ../examples/qmllegend/qml/qmllegend/LegendItem.qml 3
+
+ To make the legend item interactive, we define a MouseArea to detect clicks on it and adjust
+ the series selection accordingly:
+
+ \snippet ../examples/qmllegend/qml/qmllegend/LegendItem.qml 2
+
+ The \c previousSelection used above is another custom property of \c LegendItem, which we update
+ whenever selection changes on the series. This way we remember the last selected bar of
+ each series:
+
+ \snippet ../examples/qmllegend/qml/qmllegend/LegendItem.qml 4
+*/
diff --git a/examples/datavisualization/qmllegend/main.cpp b/examples/datavisualization/qmllegend/main.cpp
new file mode 100644
index 00000000..5c6b8d24
--- /dev/null
+++ b/examples/datavisualization/qmllegend/main.cpp
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** 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 "qtquick2applicationviewer.h"
+#include <QtDataVisualization/qutils.h>
+
+#include <QtGui/QGuiApplication>
+#include <QtCore/QDir>
+
+int main(int argc, char *argv[])
+{
+ QGuiApplication app(argc, argv);
+
+ QtQuick2ApplicationViewer viewer;
+
+ // Enable antialiasing
+ viewer.setFormat(QtDataVisualization::qDefaultSurfaceFormat());
+
+ // The following are needed to make examples run without having to install the module
+ // in desktop environments.
+#ifdef Q_OS_WIN
+ QString extraImportPath(QStringLiteral("%1/../../../../%2"));
+#else
+ QString extraImportPath(QStringLiteral("%1/../../../%2"));
+#endif
+ viewer.addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
+ QString::fromLatin1("qml")));
+
+ viewer.setTitle(QStringLiteral("Legend example"));
+
+ viewer.setSource(QUrl("qrc:/qml/qmllegend/main.qml"));
+ viewer.setResizeMode(QQuickView::SizeRootObjectToView);
+ viewer.show();
+
+ return app.exec();
+}
diff --git a/examples/datavisualization/qmllegend/qml/qmllegend/Data.qml b/examples/datavisualization/qmllegend/qml/qmllegend/Data.qml
new file mode 100644
index 00000000..4681c61c
--- /dev/null
+++ b/examples/datavisualization/qmllegend/qml/qmllegend/Data.qml
@@ -0,0 +1,78 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+import QtQuick 2.1
+
+Item {
+ property alias model: dataModel
+
+ ListModel {
+ id: dataModel
+ ListElement{ year: "2010"; month: "Jan"; s1: "-14"; s2: "-15"; s3: "-15" }
+ ListElement{ year: "2010"; month: "Feb"; s1: "-15"; s2: "-16"; s3: "-9" }
+ ListElement{ year: "2010"; month: "Mar"; s1: "-7"; s2: "-4"; s3: "-2" }
+ ListElement{ year: "2010"; month: "Apr"; s1: "3"; s2: "2"; s3: "2" }
+ ListElement{ year: "2010"; month: "May"; s1: "7"; s2: "9"; s3: "10" }
+ ListElement{ year: "2010"; month: "Jun"; s1: "12"; s2: "13"; s3: "22" }
+ ListElement{ year: "2010"; month: "Jul"; s1: "18"; s2: "19"; s3: "24" }
+ ListElement{ year: "2010"; month: "Aug"; s1: "15"; s2: "13"; s3: "16" }
+ ListElement{ year: "2010"; month: "Sep"; s1: "6"; s2: "3"; s3: "4" }
+ ListElement{ year: "2010"; month: "Oct"; s1: "1"; s2: "2"; s3: "-2" }
+ ListElement{ year: "2010"; month: "Nov"; s1: "-2"; s2: "-5"; s3: "-6" }
+ ListElement{ year: "2010"; month: "Dec"; s1: "-3"; s2: "-3"; s3: "-9" }
+
+ ListElement{ year: "2011"; month: "Jan"; s1: "-12"; s2: "-11"; s3: "-14" }
+ ListElement{ year: "2011"; month: "Feb"; s1: "-13"; s2: "-12"; s3: "-10" }
+ ListElement{ year: "2011"; month: "Mar"; s1: "-6"; s2: "-4"; s3: "-3" }
+ ListElement{ year: "2011"; month: "Apr"; s1: "0"; s2: "1"; s3: "3" }
+ ListElement{ year: "2011"; month: "May"; s1: "4"; s2: "12"; s3: "11" }
+ ListElement{ year: "2011"; month: "Jun"; s1: "9"; s2: "17"; s3: "23" }
+ ListElement{ year: "2011"; month: "Jul"; s1: "15"; s2: "22"; s3: "25" }
+ ListElement{ year: "2011"; month: "Aug"; s1: "12"; s2: "15"; s3: "12" }
+ ListElement{ year: "2011"; month: "Sep"; s1: "2"; s2: "4"; s3: "7" }
+ ListElement{ year: "2011"; month: "Oct"; s1: "-2"; s2: "4"; s3: "-4" }
+ ListElement{ year: "2011"; month: "Nov"; s1: "-4"; s2: "-8"; s3: "-5" }
+ ListElement{ year: "2011"; month: "Dec"; s1: "-6"; s2: "-6"; s3: "-7" }
+
+ ListElement{ year: "2012"; month: "Jan"; s1: "-10"; s2: "-19"; s3: "-11" }
+ ListElement{ year: "2012"; month: "Feb"; s1: "-11"; s2: "-17"; s3: "-4" }
+ ListElement{ year: "2012"; month: "Mar"; s1: "-6"; s2: "-3"; s3: "-1" }
+ ListElement{ year: "2012"; month: "Apr"; s1: "5"; s2: "1"; s3: "2" }
+ ListElement{ year: "2012"; month: "May"; s1: "9"; s2: "12"; s3: "13" }
+ ListElement{ year: "2012"; month: "Jun"; s1: "11"; s2: "16"; s3: "26" }
+ ListElement{ year: "2012"; month: "Jul"; s1: "18"; s2: "20"; s3: "23" }
+ ListElement{ year: "2012"; month: "Aug"; s1: "19"; s2: "12"; s3: "12" }
+ ListElement{ year: "2012"; month: "Sep"; s1: "9"; s2: "1"; s3: "3" }
+ ListElement{ year: "2012"; month: "Oct"; s1: "-3"; s2: "2"; s3: "-1" }
+ ListElement{ year: "2012"; month: "Nov"; s1: "-5"; s2: "-4"; s3: "-3" }
+ ListElement{ year: "2012"; month: "Dec"; s1: "-7"; s2: "-2"; s3: "-4" }
+
+ ListElement{ year: "2013"; month: "Jan"; s1: "-18"; s2: "-19"; s3: "-19" }
+ ListElement{ year: "2013"; month: "Feb"; s1: "-17"; s2: "-19"; s3: "-12" }
+ ListElement{ year: "2013"; month: "Mar"; s1: "-9"; s2: "-6"; s3: "-5" }
+ ListElement{ year: "2013"; month: "Apr"; s1: "0"; s2: "0"; s3: "0" }
+ ListElement{ year: "2013"; month: "May"; s1: "4"; s2: "7"; s3: "9" }
+ ListElement{ year: "2013"; month: "Jun"; s1: "9"; s2: "11"; s3: "18" }
+ ListElement{ year: "2013"; month: "Jul"; s1: "13"; s2: "15"; s3: "20" }
+ ListElement{ year: "2013"; month: "Aug"; s1: "10"; s2: "11"; s3: "13" }
+ ListElement{ year: "2013"; month: "Sep"; s1: "3"; s2: "1"; s3: "2" }
+ ListElement{ year: "2013"; month: "Oct"; s1: "0"; s2: "1"; s3: "-4" }
+ ListElement{ year: "2013"; month: "Nov"; s1: "-5"; s2: "-6"; s3: "-5" }
+ ListElement{ year: "2013"; month: "Dec"; s1: "-6"; s2: "-7"; s3: "-10" }
+ }
+}
diff --git a/examples/datavisualization/qmllegend/qml/qmllegend/LegendItem.qml b/examples/datavisualization/qmllegend/qml/qmllegend/LegendItem.qml
new file mode 100644
index 00000000..50be7a8d
--- /dev/null
+++ b/examples/datavisualization/qmllegend/qml/qmllegend/LegendItem.qml
@@ -0,0 +1,118 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtQuick.Layouts 1.0
+import QtQuick.Window 2.1
+import QtDataVisualization 1.0
+
+Rectangle {
+ //! [0]
+ property Theme3D theme
+ property Bar3DSeries series
+ //! [0]
+ property point previousSelection
+
+ id: legendItem
+ state: "unselected"
+
+ //! [1]
+ RowLayout {
+ anchors.fill: parent
+ spacing: 0
+ clip: true
+ Item {
+ id: markerSpace
+ Layout.minimumWidth: 20
+ Layout.minimumHeight: 20
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ Layout.alignment: Qt.AlignVCenter
+ Rectangle {
+ x: parent.x + parent.width / 4
+ y: parent.y + parent.height / 4
+ width: parent.width / 2
+ height: width
+ border.color: "black"
+ color: series.baseColor
+ }
+ }
+ Item {
+ height: markerSpace.height
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ Layout.alignment: Qt.AlignVCenter
+ Layout.minimumWidth: 100
+ Text {
+ anchors.fill: parent
+ text: series.name
+ verticalAlignment: Text.AlignVCenter
+ clip: true
+ color: theme.labelTextColor
+ font: theme.font
+ }
+ }
+ }
+ //! [1]
+
+ //! [2]
+ MouseArea {
+ id: mouseArea
+ anchors.fill: legendItem
+ onClicked: {
+ if (legendItem.state === "selected") {
+ series.selectedBar = series.invalidSelectionPosition
+ } else {
+ series.selectedBar = previousSelection
+ }
+ }
+ }
+ //! [2]
+
+ //! [4]
+ Connections {
+ target: series
+ onSelectedBarChanged: {
+ if (position != series.invalidSelectionPosition) {
+ previousSelection = position
+ }
+ }
+ }
+ //! [4]
+
+ //! [3]
+ states: [
+ State {
+ name: "selected"
+ when: series.selectedBar != series.invalidSelectionPosition
+ PropertyChanges {
+ target: legendItem
+ color: series.singleHighlightColor
+ }
+ },
+ State {
+ name: "unselected"
+ when: series.selectedBar == series.invalidSelectionPosition
+ PropertyChanges {
+ target: legendItem
+ color: theme.labelBackgroundColor
+ }
+ }
+ ]
+ //! [3]
+}
diff --git a/examples/datavisualization/qmllegend/qml/qmllegend/NewButton.qml b/examples/datavisualization/qmllegend/qml/qmllegend/NewButton.qml
new file mode 100644
index 00000000..e4fb99d2
--- /dev/null
+++ b/examples/datavisualization/qmllegend/qml/qmllegend/NewButton.qml
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtQuick.Controls 1.0
+import QtQuick.Controls.Styles 1.0
+
+Item {
+ id: newbutton
+
+ property alias text: buttonText.text
+
+ signal clicked
+
+ implicitWidth: buttonText.implicitWidth + 5
+ implicitHeight: buttonText.implicitHeight + 10
+
+ Button {
+ id: buttonText
+ width: parent.width
+ height: parent.height
+
+ style: ButtonStyle {
+ label: Component {
+ Text {
+ text: buttonText.text
+ clip: true
+ wrapMode: Text.WordWrap
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ anchors.fill: parent
+ }
+ }
+ }
+ onClicked: newbutton.clicked()
+ }
+}
diff --git a/examples/datavisualization/qmllegend/qml/qmllegend/main.qml b/examples/datavisualization/qmllegend/qml/qmllegend/main.qml
new file mode 100644
index 00000000..6c488d6a
--- /dev/null
+++ b/examples/datavisualization/qmllegend/qml/qmllegend/main.qml
@@ -0,0 +1,239 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtQuick.Controls 1.0
+import QtQuick.Layouts 1.0
+import QtDataVisualization 1.0
+import "."
+
+Item {
+ id: mainView
+ width: 800
+ height: 600
+
+ property int buttonLayoutHeight: 180;
+
+ Data {
+ id: graphData
+ }
+
+ Theme3D {
+ id: firstTheme
+ type: Theme3D.ThemeQt
+ }
+
+ Theme3D {
+ id: secondTheme
+ type: Theme3D.ThemeEbony
+ }
+
+ Item {
+ id: dataView
+ anchors.top: buttonLayout.bottom
+ anchors.bottom: parent.bottom
+ anchors.left: parent.left
+ anchors.right: parent.right
+
+ Bars3D {
+ id: barGraph
+ anchors.fill: parent
+ selectionMode: AbstractGraph3D.SelectionItemAndRow
+ scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeftHigh
+ theme: firstTheme
+ valueAxis.labelFormat: "%d\u00B0C"
+
+ Bar3DSeries {
+ id: station1
+ name: "Station 1"
+ itemLabelFormat: "Temperature at @seriesName for @colLabel, @rowLabel: @valueLabel"
+
+ ItemModelBarDataProxy {
+ itemModel: graphData.model
+ rowRole: "year"
+ columnRole: "month"
+ valueRole: "s1"
+ }
+ }
+ Bar3DSeries {
+ id: station2
+ name: "Station 2"
+ itemLabelFormat: "Temperature at @seriesName for @colLabel, @rowLabel: @valueLabel"
+
+ ItemModelBarDataProxy {
+ itemModel: graphData.model
+ rowRole: "year"
+ columnRole: "month"
+ valueRole: "s2"
+ }
+ }
+ Bar3DSeries {
+ id: station3
+ name: "Station 3"
+ itemLabelFormat: "Temperature at @seriesName for @colLabel, @rowLabel: @valueLabel"
+
+ ItemModelBarDataProxy {
+ itemModel: graphData.model
+ rowRole: "year"
+ columnRole: "month"
+ valueRole: "s2"
+ }
+ }
+ }
+ }
+
+ Rectangle {
+ property int legendLocation: 3
+
+ id: legendPanel
+ width: 200
+ height: 100
+ border.color: barGraph.theme.labelTextColor
+ border.width: 2
+ color: "#00000000" // Transparent
+
+ //! [0]
+ ColumnLayout {
+ anchors.fill: parent
+ anchors.margins: parent.border.width
+ spacing: 0
+ clip: true
+ LegendItem {
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ series: station1
+ theme: barGraph.theme
+ onColorChanged: legendPanel.relayout()
+ }
+ LegendItem {
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ series: station2
+ theme: barGraph.theme
+ onColorChanged: legendPanel.relayout()
+ }
+ LegendItem {
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ series: station3
+ theme: barGraph.theme
+ onColorChanged: legendPanel.relayout()
+ }
+ }
+ //! [0]
+
+ function relayout() {
+ // Workaround for a layout bug that causes transparent colors to use black background
+ // instead of what is actually under the items if just the color changes.
+ // Forcing a relayout by adjusting layout's available area fixes the background.
+ var originalWidth = border.width
+ border.width = originalWidth + 1
+ border.width = originalWidth
+ }
+
+ states: [
+ State {
+ name: "topleft"
+ when: legendPanel.legendLocation === 1
+ AnchorChanges {
+ target: legendPanel
+ anchors.top: dataView.top
+ anchors.bottom: undefined
+ anchors.left: dataView.left
+ anchors.right: undefined
+ }
+ },
+ State {
+ name: "topright"
+ when: legendPanel.legendLocation === 2
+ AnchorChanges {
+ target: legendPanel
+ anchors.top: dataView.top
+ anchors.bottom: undefined
+ anchors.left: undefined
+ anchors.right: dataView.right
+ }
+ },
+ State {
+ name: "bottomleft"
+ when: legendPanel.legendLocation === 3
+ AnchorChanges {
+ target: legendPanel
+ anchors.top: undefined
+ anchors.bottom: dataView.bottom
+ anchors.left: dataView.left
+ anchors.right: undefined
+ }
+ },
+ State {
+ name: "bottomright"
+ when: legendPanel.legendLocation === 4
+ AnchorChanges {
+ target: legendPanel
+ anchors.top: undefined
+ anchors.bottom: dataView.bottom
+ anchors.left: undefined
+ anchors.right: dataView.right
+ }
+ }
+ ]
+ }
+
+ RowLayout {
+ id: buttonLayout
+ Layout.minimumHeight: themeToggle.height
+ width: parent.width
+ anchors.left: parent.left
+ spacing: 0
+
+ NewButton {
+ id: themeToggle
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ text: "Change Theme"
+ onClicked: {
+ if (barGraph.theme === firstTheme) {
+ barGraph.theme = secondTheme
+ } else {
+ barGraph.theme = firstTheme
+ }
+ }
+ }
+ NewButton {
+ id: repositionLegend
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ text: "Reposition Legend"
+ onClicked: {
+ if (legendPanel.legendLocation === 4) {
+ legendPanel.legendLocation = 1
+ } else {
+ legendPanel.legendLocation++
+ }
+ }
+ }
+ NewButton {
+ id: exitButton
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ text: "Quit"
+ onClicked: Qt.quit(0);
+ }
+ }
+
+}
diff --git a/examples/datavisualization/qmllegend/qmllegend.desktop b/examples/datavisualization/qmllegend/qmllegend.desktop
new file mode 100644
index 00000000..6ad68edd
--- /dev/null
+++ b/examples/datavisualization/qmllegend/qmllegend.desktop
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Encoding=UTF-8
+Version=1.0
+Type=Application
+Terminal=false
+Name=qmllegend
+Exec=/opt/qmllegend/bin/qmllegend
+Icon=qmllegend64
+X-Window-Icon=
+X-HildonDesk-ShowInToolbar=true
+X-Osso-Type=application/x-executable
diff --git a/examples/datavisualization/qmllegend/qmllegend.pro b/examples/datavisualization/qmllegend/qmllegend.pro
new file mode 100644
index 00000000..4bf520b2
--- /dev/null
+++ b/examples/datavisualization/qmllegend/qmllegend.pro
@@ -0,0 +1,23 @@
+!include( ../examples.pri ) {
+ error( "Couldn't find the examples.pri file!" )
+}
+
+# Add more folders to ship with the application, here
+folder_01.source = qml/qmllegend
+folder_01.target = qml
+DEPLOYMENTFOLDERS = folder_01
+
+# Additional import path used to resolve QML modules in Creator's code model
+QML_IMPORT_PATH =
+
+# The .cpp file which was generated for your project. Feel free to hack it.
+SOURCES += main.cpp
+
+# Please do not modify the following two lines. Required for deployment.
+include(qtquick2applicationviewer/qtquick2applicationviewer.pri)
+qtcAddDeployment()
+
+RESOURCES += qmllegend.qrc
+
+OTHER_FILES += doc/src/* \
+ doc/images/*
diff --git a/examples/datavisualization/qmllegend/qmllegend.qrc b/examples/datavisualization/qmllegend/qmllegend.qrc
new file mode 100644
index 00000000..b9777b37
--- /dev/null
+++ b/examples/datavisualization/qmllegend/qmllegend.qrc
@@ -0,0 +1,8 @@
+<RCC>
+ <qresource prefix="/">
+ <file>qml/qmllegend/Data.qml</file>
+ <file>qml/qmllegend/LegendItem.qml</file>
+ <file>qml/qmllegend/main.qml</file>
+ <file>qml/qmllegend/NewButton.qml</file>
+ </qresource>
+</RCC>
diff --git a/examples/datavisualization/qmllegend/qmllegend64.png b/examples/datavisualization/qmllegend/qmllegend64.png
new file mode 100644
index 00000000..707d5c4e
--- /dev/null
+++ b/examples/datavisualization/qmllegend/qmllegend64.png
Binary files differ
diff --git a/examples/datavisualization/qmllegend/qtquick2applicationviewer/qtquick2applicationviewer.cpp b/examples/datavisualization/qmllegend/qtquick2applicationviewer/qtquick2applicationviewer.cpp
new file mode 100644
index 00000000..10709d7a
--- /dev/null
+++ b/examples/datavisualization/qmllegend/qtquick2applicationviewer/qtquick2applicationviewer.cpp
@@ -0,0 +1,81 @@
+// checksum 0x4f6f version 0x90005
+/*
+ This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
+ QtQuick2ApplicationViewer is a convenience class containing mobile device specific
+ code such as screen orientation handling. Also QML paths and debugging are
+ handled here.
+ It is recommended not to modify this file, since newer versions of Qt Creator
+ may offer an updated version of it.
+*/
+
+#include "qtquick2applicationviewer.h"
+
+#include <QtCore/QCoreApplication>
+#include <QtCore/QDir>
+#include <QtQml/QQmlEngine>
+
+class QtQuick2ApplicationViewerPrivate
+{
+ QString mainQmlFile;
+ friend class QtQuick2ApplicationViewer;
+ static QString adjustPath(const QString &path);
+};
+
+QString QtQuick2ApplicationViewerPrivate::adjustPath(const QString &path)
+{
+#if defined(Q_OS_MAC)
+ if (!QDir::isAbsolutePath(path))
+ return QString::fromLatin1("%1/../Resources/%2")
+ .arg(QCoreApplication::applicationDirPath(), path);
+#elif defined(Q_OS_BLACKBERRY)
+ if (!QDir::isAbsolutePath(path))
+ return QString::fromLatin1("app/native/%1").arg(path);
+#elif !defined(Q_OS_ANDROID)
+ QString pathInInstallDir =
+ QString::fromLatin1("%1/../%2").arg(QCoreApplication::applicationDirPath(), path);
+ if (QFileInfo(pathInInstallDir).exists())
+ return pathInInstallDir;
+ pathInInstallDir =
+ QString::fromLatin1("%1/%2").arg(QCoreApplication::applicationDirPath(), path);
+ if (QFileInfo(pathInInstallDir).exists())
+ return pathInInstallDir;
+#endif
+ return path;
+}
+
+QtQuick2ApplicationViewer::QtQuick2ApplicationViewer(QWindow *parent)
+ : QQuickView(parent)
+ , d(new QtQuick2ApplicationViewerPrivate())
+{
+ connect(engine(), SIGNAL(quit()), SLOT(close()));
+ setResizeMode(QQuickView::SizeRootObjectToView);
+}
+
+QtQuick2ApplicationViewer::~QtQuick2ApplicationViewer()
+{
+ delete d;
+}
+
+void QtQuick2ApplicationViewer::setMainQmlFile(const QString &file)
+{
+ d->mainQmlFile = QtQuick2ApplicationViewerPrivate::adjustPath(file);
+#ifdef Q_OS_ANDROID
+ setSource(QUrl(QLatin1String("assets:/")+d->mainQmlFile));
+#else
+ setSource(QUrl::fromLocalFile(d->mainQmlFile));
+#endif
+}
+
+void QtQuick2ApplicationViewer::addImportPath(const QString &path)
+{
+ engine()->addImportPath(QtQuick2ApplicationViewerPrivate::adjustPath(path));
+}
+
+void QtQuick2ApplicationViewer::showExpanded()
+{
+#if defined(Q_WS_SIMULATOR) || defined(Q_OS_QNX)
+ showFullScreen();
+#else
+ show();
+#endif
+}
diff --git a/examples/datavisualization/qmllegend/qtquick2applicationviewer/qtquick2applicationviewer.h b/examples/datavisualization/qmllegend/qtquick2applicationviewer/qtquick2applicationviewer.h
new file mode 100644
index 00000000..cf66f140
--- /dev/null
+++ b/examples/datavisualization/qmllegend/qtquick2applicationviewer/qtquick2applicationviewer.h
@@ -0,0 +1,33 @@
+// checksum 0xfde6 version 0x90005
+/*
+ This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
+ QtQuick2ApplicationViewer is a convenience class containing mobile device specific
+ code such as screen orientation handling. Also QML paths and debugging are
+ handled here.
+ It is recommended not to modify this file, since newer versions of Qt Creator
+ may offer an updated version of it.
+*/
+
+#ifndef QTQUICK2APPLICATIONVIEWER_H
+#define QTQUICK2APPLICATIONVIEWER_H
+
+#include <QtQuick/QQuickView>
+
+class QtQuick2ApplicationViewer : public QQuickView
+{
+ Q_OBJECT
+
+public:
+ explicit QtQuick2ApplicationViewer(QWindow *parent = 0);
+ virtual ~QtQuick2ApplicationViewer();
+
+ void setMainQmlFile(const QString &file);
+ void addImportPath(const QString &path);
+
+ void showExpanded();
+
+private:
+ class QtQuick2ApplicationViewerPrivate *d;
+};
+
+#endif // QTQUICK2APPLICATIONVIEWER_H
diff --git a/examples/datavisualization/qmllegend/qtquick2applicationviewer/qtquick2applicationviewer.pri b/examples/datavisualization/qmllegend/qtquick2applicationviewer/qtquick2applicationviewer.pri
new file mode 100644
index 00000000..e5f7990f
--- /dev/null
+++ b/examples/datavisualization/qmllegend/qtquick2applicationviewer/qtquick2applicationviewer.pri
@@ -0,0 +1,180 @@
+# checksum 0x7b0d version 0x90005
+# This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
+# The code below adds the QtQuick2ApplicationViewer to the project and handles
+# the activation of QML debugging.
+# It is recommended not to modify this file, since newer versions of Qt Creator
+# may offer an updated version of it.
+
+QT += qml quick
+
+SOURCES += $$PWD/qtquick2applicationviewer.cpp
+HEADERS += $$PWD/qtquick2applicationviewer.h
+INCLUDEPATH += $$PWD
+# This file was generated by an application wizard of Qt Creator.
+# The code below handles deployment to Android and Maemo, aswell as copying
+# of the application data to shadow build directories on desktop.
+# It is recommended not to modify this file, since newer versions of Qt Creator
+# may offer an updated version of it.
+
+defineTest(qtcAddDeployment) {
+for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ greaterThan(QT_MAJOR_VERSION, 4) {
+ itemsources = $${item}.files
+ } else {
+ itemsources = $${item}.sources
+ }
+ $$itemsources = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath= $$eval($${deploymentfolder}.target)
+ export($$itemsources)
+ export($$itempath)
+ DEPLOYMENT += $$item
+}
+
+MAINPROFILEPWD = $$PWD
+
+android-no-sdk {
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemfiles = $${item}.files
+ $$itemfiles = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath = /data/user/qt/$$eval($${deploymentfolder}.target)
+ export($$itemfiles)
+ export($$itempath)
+ INSTALLS += $$item
+ }
+
+ target.path = /data/user/qt
+
+ export(target.path)
+ INSTALLS += target
+} else:android {
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemfiles = $${item}.files
+ $$itemfiles = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath = /assets/$$eval($${deploymentfolder}.target)
+ export($$itemfiles)
+ export($$itempath)
+ INSTALLS += $$item
+ }
+
+ x86 {
+ target.path = /libs/x86
+ } else: armeabi-v7a {
+ target.path = /libs/armeabi-v7a
+ } else {
+ target.path = /libs/armeabi
+ }
+
+ export(target.path)
+ INSTALLS += target
+} else:win32 {
+ copyCommand =
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
+ source = $$replace(source, /, \\)
+ sourcePathSegments = $$split(source, \\)
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)/$$last(sourcePathSegments)
+ target = $$replace(target, /, \\)
+ target ~= s,\\\\\\.?\\\\,\\,
+ !isEqual(source,$$target) {
+ !isEmpty(copyCommand):copyCommand += &&
+ isEqual(QMAKE_DIR_SEP, \\) {
+ copyCommand += $(COPY_DIR) \"$$source\" \"$$target\"
+ } else {
+ source = $$replace(source, \\\\, /)
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
+ target = $$replace(target, \\\\, /)
+ copyCommand += test -d \"$$target\" || mkdir -p \"$$target\" && cp -r \"$$source\" \"$$target\"
+ }
+ }
+ }
+ !isEmpty(copyCommand) {
+ copyCommand = @echo Copying application data... && $$copyCommand
+ copydeploymentfolders.commands = $$copyCommand
+ first.depends = $(first) copydeploymentfolders
+ export(first.depends)
+ export(copydeploymentfolders.commands)
+ QMAKE_EXTRA_TARGETS += first copydeploymentfolders
+ }
+} else:unix {
+ maemo5 {
+ desktopfile.files = $${TARGET}.desktop
+ desktopfile.path = /usr/share/applications/hildon
+ icon.files = $${TARGET}64.png
+ icon.path = /usr/share/icons/hicolor/64x64/apps
+ } else:!isEmpty(MEEGO_VERSION_MAJOR) {
+ desktopfile.files = $${TARGET}_harmattan.desktop
+ desktopfile.path = /usr/share/applications
+ icon.files = $${TARGET}80.png
+ icon.path = /usr/share/icons/hicolor/80x80/apps
+ } else { # Assumed to be a Desktop Unix
+ copyCommand =
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
+ source = $$replace(source, \\\\, /)
+ macx {
+ target = $$OUT_PWD/$${TARGET}.app/Contents/Resources/$$eval($${deploymentfolder}.target)
+ } else {
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
+ }
+ target = $$replace(target, \\\\, /)
+ sourcePathSegments = $$split(source, /)
+ targetFullPath = $$target/$$last(sourcePathSegments)
+ targetFullPath ~= s,/\\.?/,/,
+ !isEqual(source,$$targetFullPath) {
+ !isEmpty(copyCommand):copyCommand += &&
+ copyCommand += $(MKDIR) \"$$target\"
+ copyCommand += && $(COPY_DIR) \"$$source\" \"$$target\"
+ }
+ }
+ !isEmpty(copyCommand) {
+ copyCommand = @echo Copying application data... && $$copyCommand
+ copydeploymentfolders.commands = $$copyCommand
+ first.depends = $(first) copydeploymentfolders
+ export(first.depends)
+ export(copydeploymentfolders.commands)
+ QMAKE_EXTRA_TARGETS += first copydeploymentfolders
+ }
+ }
+ !isEmpty(target.path) {
+ installPrefix = $${target.path}
+ } else {
+ installPrefix = /opt/$${TARGET}
+ }
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemfiles = $${item}.files
+ $$itemfiles = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath = $${installPrefix}/$$eval($${deploymentfolder}.target)
+ export($$itemfiles)
+ export($$itempath)
+ INSTALLS += $$item
+ }
+
+ !isEmpty(desktopfile.path) {
+ export(icon.files)
+ export(icon.path)
+ export(desktopfile.files)
+ export(desktopfile.path)
+ INSTALLS += icon desktopfile
+ }
+
+ isEmpty(target.path) {
+ target.path = $${installPrefix}/bin
+ export(target.path)
+ }
+ INSTALLS += target
+}
+
+export (ICON)
+export (INSTALLS)
+export (DEPLOYMENT)
+export (LIBS)
+export (QMAKE_EXTRA_TARGETS)
+}
diff --git a/examples/datavisualization/qmlmultigraph/doc/images/qmlmultigraph-example.png b/examples/datavisualization/qmlmultigraph/doc/images/qmlmultigraph-example.png
new file mode 100644
index 00000000..79073f5f
--- /dev/null
+++ b/examples/datavisualization/qmlmultigraph/doc/images/qmlmultigraph-example.png
Binary files differ
diff --git a/examples/datavisualization/qmlmultigraph/doc/src/qmlmultigraph.qdoc b/examples/datavisualization/qmlmultigraph/doc/src/qmlmultigraph.qdoc
new file mode 100644
index 00000000..5fa25500
--- /dev/null
+++ b/examples/datavisualization/qmlmultigraph/doc/src/qmlmultigraph.qdoc
@@ -0,0 +1,46 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+/*!
+ \example qmlmultigraph
+ \title Qt Quick 2 Multiple Graphs Example
+ \ingroup qtdatavisualization_examples
+ \brief Showing multiple graphs simultaneously in a QML application.
+
+ The Qt Quick 2 multiple graphs example demonstrates using multiple graphs in single window.
+
+ \image qmlmultigraph-example.png
+
+ The interesting thing about this example is demonstrating that multiple graphs can be used
+ simultaneously, so most functionality is not explained in detail.
+ For more detailed QML example documentation, see \l{Qt Quick 2 Scatter Example}.
+
+ \section1 Multiple Graphs
+
+ Using multiple graphs in a single application doesn't require anything special, simply define
+ and position the graphs as normal. In this example the graphs are shown in a 2 x 2 grid with
+ \c{GridLayout}:
+
+ \snippet ../examples/qmlmultigraph/qml/qmlmultigraph/main.qml 0
+
+ Each graph has a parent \c Rectangle item to provide it with a border. The color of the rectangle
+ is set to fully transparent, because otherwise the rectangles would hide the graphs, which are
+ always drawn behind all other QML elements.
+
+ Note that one of the grid cells is used for buttons in an another \c{GridLayout}.
+*/
diff --git a/examples/datavisualization/qmlmultigraph/main.cpp b/examples/datavisualization/qmlmultigraph/main.cpp
new file mode 100644
index 00000000..8450e28a
--- /dev/null
+++ b/examples/datavisualization/qmlmultigraph/main.cpp
@@ -0,0 +1,50 @@
+/****************************************************************************
+**
+** 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 "qtquick2applicationviewer.h"
+#include <QtDataVisualization/qutils.h>
+
+#include <QtGui/QGuiApplication>
+#include <QtCore/QDir>
+
+int main(int argc, char *argv[])
+{
+ QGuiApplication app(argc, argv);
+
+ QtQuick2ApplicationViewer viewer;
+
+ // Enable antialiasing
+ viewer.setFormat(QtDataVisualization::qDefaultSurfaceFormat());
+
+ // The following are needed to make examples run without having to install the module
+ // in desktop environments.
+#ifdef Q_OS_WIN
+ QString extraImportPath(QStringLiteral("%1/../../../../%2"));
+#else
+ QString extraImportPath(QStringLiteral("%1/../../../%2"));
+#endif
+ viewer.addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
+ QString::fromLatin1("qml")));
+
+ viewer.setTitle(QStringLiteral("QML multigraph example"));
+ viewer.setSource(QUrl("qrc:/qml/qmlmultigraph/main.qml"));
+ viewer.setResizeMode(QQuickView::SizeRootObjectToView);
+ viewer.showExpanded();
+
+ return app.exec();
+}
diff --git a/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/Data.qml b/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/Data.qml
new file mode 100644
index 00000000..998e4be3
--- /dev/null
+++ b/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/Data.qml
@@ -0,0 +1,48 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+import QtQuick 2.1
+
+Item {
+ property alias data: dataModel
+
+ ListModel {
+ id: dataModel
+ ListElement{ row: "0"; col: "0"; longitude: "20.0"; latitude: "10.0"; pop_density: "4.75"; }
+ ListElement{ row: "1"; col: "0"; longitude: "21.1"; latitude: "10.3"; pop_density: "3.00"; }
+ ListElement{ row: "2"; col: "0"; longitude: "22.5"; latitude: "10.7"; pop_density: "1.24"; }
+ ListElement{ row: "3"; col: "0"; longitude: "24.0"; latitude: "10.5"; pop_density: "2.53"; }
+ ListElement{ row: "0"; col: "1"; longitude: "20.2"; latitude: "11.2"; pop_density: "3.55"; }
+ ListElement{ row: "1"; col: "1"; longitude: "21.3"; latitude: "11.5"; pop_density: "3.03"; }
+ ListElement{ row: "2"; col: "1"; longitude: "22.6"; latitude: "11.7"; pop_density: "3.46"; }
+ ListElement{ row: "3"; col: "1"; longitude: "23.4"; latitude: "11.5"; pop_density: "4.12"; }
+ ListElement{ row: "0"; col: "2"; longitude: "20.2"; latitude: "12.3"; pop_density: "3.37"; }
+ ListElement{ row: "1"; col: "2"; longitude: "21.1"; latitude: "12.4"; pop_density: "2.98"; }
+ ListElement{ row: "2"; col: "2"; longitude: "22.5"; latitude: "12.1"; pop_density: "3.33"; }
+ ListElement{ row: "3"; col: "2"; longitude: "23.3"; latitude: "12.7"; pop_density: "3.23"; }
+ ListElement{ row: "0"; col: "3"; longitude: "20.7"; latitude: "13.3"; pop_density: "5.34"; }
+ ListElement{ row: "1"; col: "3"; longitude: "21.5"; latitude: "13.2"; pop_density: "4.54"; }
+ ListElement{ row: "2"; col: "3"; longitude: "22.4"; latitude: "13.6"; pop_density: "4.65"; }
+ ListElement{ row: "3"; col: "3"; longitude: "23.2"; latitude: "13.4"; pop_density: "6.67"; }
+ ListElement{ row: "0"; col: "4"; longitude: "20.6"; latitude: "15.0"; pop_density: "6.01"; }
+ ListElement{ row: "1"; col: "4"; longitude: "21.3"; latitude: "14.6"; pop_density: "5.83"; }
+ ListElement{ row: "2"; col: "4"; longitude: "22.5"; latitude: "14.8"; pop_density: "5.90"; }
+ ListElement{ row: "3"; col: "4"; longitude: "23.7"; latitude: "14.3"; pop_density: "7.32"; }
+ }
+}
+
diff --git a/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/NewButton.qml b/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/NewButton.qml
new file mode 100644
index 00000000..e4fb99d2
--- /dev/null
+++ b/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/NewButton.qml
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtQuick.Controls 1.0
+import QtQuick.Controls.Styles 1.0
+
+Item {
+ id: newbutton
+
+ property alias text: buttonText.text
+
+ signal clicked
+
+ implicitWidth: buttonText.implicitWidth + 5
+ implicitHeight: buttonText.implicitHeight + 10
+
+ Button {
+ id: buttonText
+ width: parent.width
+ height: parent.height
+
+ style: ButtonStyle {
+ label: Component {
+ Text {
+ text: buttonText.text
+ clip: true
+ wrapMode: Text.WordWrap
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ anchors.fill: parent
+ }
+ }
+ }
+ onClicked: newbutton.clicked()
+ }
+}
diff --git a/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/main.qml b/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/main.qml
new file mode 100644
index 00000000..7691563a
--- /dev/null
+++ b/examples/datavisualization/qmlmultigraph/qml/qmlmultigraph/main.qml
@@ -0,0 +1,215 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtQuick.Layouts 1.0
+import QtDataVisualization 1.0
+import "."
+
+Item {
+ id: mainView
+ width: 800
+ height: 600
+
+ Data {
+ id: data
+ }
+
+ //! [0]
+ GridLayout {
+ id: gridLayout
+ columns: 2
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ anchors.top: mainView.top
+ anchors.bottom: mainView.bottom
+ anchors.left: mainView.left
+ anchors.right: mainView.right
+
+ Rectangle {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ border.color: surfaceGraph.theme.gridLineColor
+ border.width: 2
+ color: "#00000000" // Transparent
+
+ Surface3D {
+ id: surfaceGraph
+ anchors.fill: parent
+ anchors.margins: parent.border.width
+ theme: Theme3D {
+ type: Theme3D.ThemePrimaryColors
+ font.pointSize: 60
+ }
+ scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeftHigh
+
+ Surface3DSeries {
+ itemLabelFormat: "Pop density at (@xLabel N, @zLabel E): @yLabel"
+ ItemModelSurfaceDataProxy {
+ itemModel: data.data
+ // The surface data points are not neatly lined up in rows and columns,
+ // so we define explicit row and column roles.
+ rowRole: "row"
+ columnRole: "col"
+ xPosRole: "latitude"
+ zPosRole: "longitude"
+ yPosRole: "pop_density"
+ }
+ }
+ }
+ }
+
+ // We'll use one grid cell for buttons
+ Rectangle {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ border.color: surfaceGraph.theme.gridLineColor // Let's use neighbor's border color
+ border.width: 2
+
+ GridLayout {
+ anchors.right: parent.right
+ anchors.left: parent.left
+ anchors.top: parent.top
+ anchors.bottom: parent.bottom
+ columns: 2
+
+ NewButton {
+ Layout.minimumWidth: parent.width / 2
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ text: "Clear Selections"
+ onClicked: clearSelections() // call a helper function to keep button itself simpler
+ }
+
+ NewButton {
+ Layout.minimumWidth: parent.width / 2
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ text: "Quit"
+ onClicked: Qt.quit(0);
+ }
+
+ NewButton {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ text: "Reset Cameras"
+ onClicked: resetCameras() // call a helper function to keep button itself simpler
+ }
+
+ NewButton {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ text: "Toggle Mesh Styles"
+ onClicked: toggleMeshStyle() // call a helper function to keep button itself simpler
+ }
+ }
+ }
+
+ Rectangle {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ border.color: scatterGraph.theme.gridLineColor
+ border.width: 2
+ color: "#00000000" // Transparent
+
+ Scatter3D {
+ id: scatterGraph
+ anchors.fill: parent
+ anchors.margins: parent.border.width
+ theme: Theme3D {
+ type: Theme3D.ThemeDigia
+ font.pointSize: 60
+ }
+ scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeftHigh
+
+ Scatter3DSeries {
+ itemLabelFormat: "Pop density at (@xLabel N, @zLabel E): @yLabel"
+ ItemModelScatterDataProxy {
+ itemModel: data.data
+ // Mapping model roles to scatter series item coordinates.
+ xPosRole: "latitude"
+ zPosRole: "longitude"
+ yPosRole: "pop_density"
+ }
+ }
+ }
+ }
+
+ Rectangle {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ border.color: barGraph.theme.gridLineColor
+ border.width: 2
+ color: "#00000000" // Transparent
+
+ Bars3D {
+ id: barGraph
+ anchors.fill: parent
+ anchors.margins: parent.border.width
+ theme: Theme3D {
+ type: Theme3D.ThemeQt
+ font.pointSize: 60
+ }
+ selectionMode: AbstractGraph3D.SelectionItemAndRow | AbstractGraph3D.SelectionSlice
+ scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeftHigh
+
+ Bar3DSeries {
+ itemLabelFormat: "@seriesName: @valueLabel"
+ name: "Population density"
+
+ ItemModelBarDataProxy {
+ itemModel: data.data
+ // Mapping model roles to bar series rows, columns, and values.
+ rowRole: "row"
+ columnRole: "col"
+ valueRole: "pop_density"
+ }
+ }
+ }
+ }
+ }
+ //! [0]
+
+ function clearSelections() {
+ barGraph.clearSelection()
+ scatterGraph.clearSelection()
+ surfaceGraph.clearSelection()
+ }
+
+ function resetCameras() {
+ surfaceGraph.scene.activeCamera.cameraPreset = Camera3D.CameraPresetIsometricLeftHigh
+ scatterGraph.scene.activeCamera.cameraPreset = Camera3D.CameraPresetIsometricLeftHigh
+ barGraph.scene.activeCamera.cameraPreset = Camera3D.CameraPresetIsometricLeftHigh
+ surfaceGraph.scene.activeCamera.zoomLevel = 100
+ scatterGraph.scene.activeCamera.zoomLevel = 100
+ barGraph.scene.activeCamera.zoomLevel = 100
+ }
+
+ function toggleMeshStyle() {
+ if (barGraph.seriesList[0].meshSmooth === true) {
+ barGraph.seriesList[0].meshSmooth = false
+ if (surfaceGraph.seriesList[0].flatShadingSupported)
+ surfaceGraph.seriesList[0].flatShadingEnabled = true
+ scatterGraph.seriesList[0].meshSmooth = false
+ } else {
+ barGraph.seriesList[0].meshSmooth = true
+ surfaceGraph.seriesList[0].flatShadingEnabled = false
+ scatterGraph.seriesList[0].meshSmooth = true
+ }
+ }
+}
diff --git a/examples/datavisualization/qmlmultigraph/qmlmultigraph.desktop b/examples/datavisualization/qmlmultigraph/qmlmultigraph.desktop
new file mode 100644
index 00000000..90b16a4e
--- /dev/null
+++ b/examples/datavisualization/qmlmultigraph/qmlmultigraph.desktop
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Encoding=UTF-8
+Version=1.0
+Type=Application
+Terminal=false
+Name=qmlmultigraph
+Exec=/opt/qmlmultigraph/bin/qmlmultigraph
+Icon=qmlmultigraph64
+X-Window-Icon=
+X-HildonDesk-ShowInToolbar=true
+X-Osso-Type=application/x-executable
diff --git a/examples/datavisualization/qmlmultigraph/qmlmultigraph.pro b/examples/datavisualization/qmlmultigraph/qmlmultigraph.pro
new file mode 100644
index 00000000..2231a2d1
--- /dev/null
+++ b/examples/datavisualization/qmlmultigraph/qmlmultigraph.pro
@@ -0,0 +1,20 @@
+!include( ../examples.pri ) {
+ error( "Couldn't find the examples.pri file!" )
+}
+
+# Add more folders to ship with the application, here
+folder_01.source = qml/qmlmultigraph
+folder_01.target = qml
+DEPLOYMENTFOLDERS = folder_01
+
+# Additional import path used to resolve QML modules in Creator's code model
+QML_IMPORT_PATH =
+
+# The .cpp file which was generated for your project. Feel free to hack it.
+SOURCES += main.cpp
+
+# Please do not modify the following two lines. Required for deployment.
+include(qtquick2applicationviewer/qtquick2applicationviewer.pri)
+qtcAddDeployment()
+
+RESOURCES += qmlmultigraph.qrc
diff --git a/examples/datavisualization/qmlmultigraph/qmlmultigraph.qrc b/examples/datavisualization/qmlmultigraph/qmlmultigraph.qrc
new file mode 100644
index 00000000..c5e63a1c
--- /dev/null
+++ b/examples/datavisualization/qmlmultigraph/qmlmultigraph.qrc
@@ -0,0 +1,7 @@
+<RCC>
+ <qresource prefix="/">
+ <file>qml/qmlmultigraph/Data.qml</file>
+ <file>qml/qmlmultigraph/main.qml</file>
+ <file>qml/qmlmultigraph/NewButton.qml</file>
+ </qresource>
+</RCC>
diff --git a/examples/datavisualization/qmlmultigraph/qmlmultigraph64.png b/examples/datavisualization/qmlmultigraph/qmlmultigraph64.png
new file mode 100644
index 00000000..707d5c4e
--- /dev/null
+++ b/examples/datavisualization/qmlmultigraph/qmlmultigraph64.png
Binary files differ
diff --git a/examples/datavisualization/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.cpp b/examples/datavisualization/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.cpp
new file mode 100644
index 00000000..10709d7a
--- /dev/null
+++ b/examples/datavisualization/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.cpp
@@ -0,0 +1,81 @@
+// checksum 0x4f6f version 0x90005
+/*
+ This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
+ QtQuick2ApplicationViewer is a convenience class containing mobile device specific
+ code such as screen orientation handling. Also QML paths and debugging are
+ handled here.
+ It is recommended not to modify this file, since newer versions of Qt Creator
+ may offer an updated version of it.
+*/
+
+#include "qtquick2applicationviewer.h"
+
+#include <QtCore/QCoreApplication>
+#include <QtCore/QDir>
+#include <QtQml/QQmlEngine>
+
+class QtQuick2ApplicationViewerPrivate
+{
+ QString mainQmlFile;
+ friend class QtQuick2ApplicationViewer;
+ static QString adjustPath(const QString &path);
+};
+
+QString QtQuick2ApplicationViewerPrivate::adjustPath(const QString &path)
+{
+#if defined(Q_OS_MAC)
+ if (!QDir::isAbsolutePath(path))
+ return QString::fromLatin1("%1/../Resources/%2")
+ .arg(QCoreApplication::applicationDirPath(), path);
+#elif defined(Q_OS_BLACKBERRY)
+ if (!QDir::isAbsolutePath(path))
+ return QString::fromLatin1("app/native/%1").arg(path);
+#elif !defined(Q_OS_ANDROID)
+ QString pathInInstallDir =
+ QString::fromLatin1("%1/../%2").arg(QCoreApplication::applicationDirPath(), path);
+ if (QFileInfo(pathInInstallDir).exists())
+ return pathInInstallDir;
+ pathInInstallDir =
+ QString::fromLatin1("%1/%2").arg(QCoreApplication::applicationDirPath(), path);
+ if (QFileInfo(pathInInstallDir).exists())
+ return pathInInstallDir;
+#endif
+ return path;
+}
+
+QtQuick2ApplicationViewer::QtQuick2ApplicationViewer(QWindow *parent)
+ : QQuickView(parent)
+ , d(new QtQuick2ApplicationViewerPrivate())
+{
+ connect(engine(), SIGNAL(quit()), SLOT(close()));
+ setResizeMode(QQuickView::SizeRootObjectToView);
+}
+
+QtQuick2ApplicationViewer::~QtQuick2ApplicationViewer()
+{
+ delete d;
+}
+
+void QtQuick2ApplicationViewer::setMainQmlFile(const QString &file)
+{
+ d->mainQmlFile = QtQuick2ApplicationViewerPrivate::adjustPath(file);
+#ifdef Q_OS_ANDROID
+ setSource(QUrl(QLatin1String("assets:/")+d->mainQmlFile));
+#else
+ setSource(QUrl::fromLocalFile(d->mainQmlFile));
+#endif
+}
+
+void QtQuick2ApplicationViewer::addImportPath(const QString &path)
+{
+ engine()->addImportPath(QtQuick2ApplicationViewerPrivate::adjustPath(path));
+}
+
+void QtQuick2ApplicationViewer::showExpanded()
+{
+#if defined(Q_WS_SIMULATOR) || defined(Q_OS_QNX)
+ showFullScreen();
+#else
+ show();
+#endif
+}
diff --git a/examples/datavisualization/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.h b/examples/datavisualization/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.h
new file mode 100644
index 00000000..cf66f140
--- /dev/null
+++ b/examples/datavisualization/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.h
@@ -0,0 +1,33 @@
+// checksum 0xfde6 version 0x90005
+/*
+ This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
+ QtQuick2ApplicationViewer is a convenience class containing mobile device specific
+ code such as screen orientation handling. Also QML paths and debugging are
+ handled here.
+ It is recommended not to modify this file, since newer versions of Qt Creator
+ may offer an updated version of it.
+*/
+
+#ifndef QTQUICK2APPLICATIONVIEWER_H
+#define QTQUICK2APPLICATIONVIEWER_H
+
+#include <QtQuick/QQuickView>
+
+class QtQuick2ApplicationViewer : public QQuickView
+{
+ Q_OBJECT
+
+public:
+ explicit QtQuick2ApplicationViewer(QWindow *parent = 0);
+ virtual ~QtQuick2ApplicationViewer();
+
+ void setMainQmlFile(const QString &file);
+ void addImportPath(const QString &path);
+
+ void showExpanded();
+
+private:
+ class QtQuick2ApplicationViewerPrivate *d;
+};
+
+#endif // QTQUICK2APPLICATIONVIEWER_H
diff --git a/examples/datavisualization/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.pri b/examples/datavisualization/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.pri
new file mode 100644
index 00000000..e5f7990f
--- /dev/null
+++ b/examples/datavisualization/qmlmultigraph/qtquick2applicationviewer/qtquick2applicationviewer.pri
@@ -0,0 +1,180 @@
+# checksum 0x7b0d version 0x90005
+# This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
+# The code below adds the QtQuick2ApplicationViewer to the project and handles
+# the activation of QML debugging.
+# It is recommended not to modify this file, since newer versions of Qt Creator
+# may offer an updated version of it.
+
+QT += qml quick
+
+SOURCES += $$PWD/qtquick2applicationviewer.cpp
+HEADERS += $$PWD/qtquick2applicationviewer.h
+INCLUDEPATH += $$PWD
+# This file was generated by an application wizard of Qt Creator.
+# The code below handles deployment to Android and Maemo, aswell as copying
+# of the application data to shadow build directories on desktop.
+# It is recommended not to modify this file, since newer versions of Qt Creator
+# may offer an updated version of it.
+
+defineTest(qtcAddDeployment) {
+for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ greaterThan(QT_MAJOR_VERSION, 4) {
+ itemsources = $${item}.files
+ } else {
+ itemsources = $${item}.sources
+ }
+ $$itemsources = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath= $$eval($${deploymentfolder}.target)
+ export($$itemsources)
+ export($$itempath)
+ DEPLOYMENT += $$item
+}
+
+MAINPROFILEPWD = $$PWD
+
+android-no-sdk {
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemfiles = $${item}.files
+ $$itemfiles = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath = /data/user/qt/$$eval($${deploymentfolder}.target)
+ export($$itemfiles)
+ export($$itempath)
+ INSTALLS += $$item
+ }
+
+ target.path = /data/user/qt
+
+ export(target.path)
+ INSTALLS += target
+} else:android {
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemfiles = $${item}.files
+ $$itemfiles = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath = /assets/$$eval($${deploymentfolder}.target)
+ export($$itemfiles)
+ export($$itempath)
+ INSTALLS += $$item
+ }
+
+ x86 {
+ target.path = /libs/x86
+ } else: armeabi-v7a {
+ target.path = /libs/armeabi-v7a
+ } else {
+ target.path = /libs/armeabi
+ }
+
+ export(target.path)
+ INSTALLS += target
+} else:win32 {
+ copyCommand =
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
+ source = $$replace(source, /, \\)
+ sourcePathSegments = $$split(source, \\)
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)/$$last(sourcePathSegments)
+ target = $$replace(target, /, \\)
+ target ~= s,\\\\\\.?\\\\,\\,
+ !isEqual(source,$$target) {
+ !isEmpty(copyCommand):copyCommand += &&
+ isEqual(QMAKE_DIR_SEP, \\) {
+ copyCommand += $(COPY_DIR) \"$$source\" \"$$target\"
+ } else {
+ source = $$replace(source, \\\\, /)
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
+ target = $$replace(target, \\\\, /)
+ copyCommand += test -d \"$$target\" || mkdir -p \"$$target\" && cp -r \"$$source\" \"$$target\"
+ }
+ }
+ }
+ !isEmpty(copyCommand) {
+ copyCommand = @echo Copying application data... && $$copyCommand
+ copydeploymentfolders.commands = $$copyCommand
+ first.depends = $(first) copydeploymentfolders
+ export(first.depends)
+ export(copydeploymentfolders.commands)
+ QMAKE_EXTRA_TARGETS += first copydeploymentfolders
+ }
+} else:unix {
+ maemo5 {
+ desktopfile.files = $${TARGET}.desktop
+ desktopfile.path = /usr/share/applications/hildon
+ icon.files = $${TARGET}64.png
+ icon.path = /usr/share/icons/hicolor/64x64/apps
+ } else:!isEmpty(MEEGO_VERSION_MAJOR) {
+ desktopfile.files = $${TARGET}_harmattan.desktop
+ desktopfile.path = /usr/share/applications
+ icon.files = $${TARGET}80.png
+ icon.path = /usr/share/icons/hicolor/80x80/apps
+ } else { # Assumed to be a Desktop Unix
+ copyCommand =
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
+ source = $$replace(source, \\\\, /)
+ macx {
+ target = $$OUT_PWD/$${TARGET}.app/Contents/Resources/$$eval($${deploymentfolder}.target)
+ } else {
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
+ }
+ target = $$replace(target, \\\\, /)
+ sourcePathSegments = $$split(source, /)
+ targetFullPath = $$target/$$last(sourcePathSegments)
+ targetFullPath ~= s,/\\.?/,/,
+ !isEqual(source,$$targetFullPath) {
+ !isEmpty(copyCommand):copyCommand += &&
+ copyCommand += $(MKDIR) \"$$target\"
+ copyCommand += && $(COPY_DIR) \"$$source\" \"$$target\"
+ }
+ }
+ !isEmpty(copyCommand) {
+ copyCommand = @echo Copying application data... && $$copyCommand
+ copydeploymentfolders.commands = $$copyCommand
+ first.depends = $(first) copydeploymentfolders
+ export(first.depends)
+ export(copydeploymentfolders.commands)
+ QMAKE_EXTRA_TARGETS += first copydeploymentfolders
+ }
+ }
+ !isEmpty(target.path) {
+ installPrefix = $${target.path}
+ } else {
+ installPrefix = /opt/$${TARGET}
+ }
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemfiles = $${item}.files
+ $$itemfiles = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath = $${installPrefix}/$$eval($${deploymentfolder}.target)
+ export($$itemfiles)
+ export($$itempath)
+ INSTALLS += $$item
+ }
+
+ !isEmpty(desktopfile.path) {
+ export(icon.files)
+ export(icon.path)
+ export(desktopfile.files)
+ export(desktopfile.path)
+ INSTALLS += icon desktopfile
+ }
+
+ isEmpty(target.path) {
+ target.path = $${installPrefix}/bin
+ export(target.path)
+ }
+ INSTALLS += target
+}
+
+export (ICON)
+export (INSTALLS)
+export (DEPLOYMENT)
+export (LIBS)
+export (QMAKE_EXTRA_TARGETS)
+}
diff --git a/examples/datavisualization/qmloscilloscope/datasource.cpp b/examples/datavisualization/qmloscilloscope/datasource.cpp
new file mode 100644
index 00000000..83ff0ff9
--- /dev/null
+++ b/examples/datavisualization/qmloscilloscope/datasource.cpp
@@ -0,0 +1,166 @@
+/****************************************************************************
+**
+** 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 "datasource.h"
+#include <qmath.h>
+
+using namespace QtDataVisualization;
+
+Q_DECLARE_METATYPE(QSurface3DSeries *)
+
+DataSource::DataSource(QObject *parent) :
+ QObject(parent),
+ m_index(-1),
+ m_resetArray(0)
+{
+ qRegisterMetaType<QSurface3DSeries *>();
+}
+
+DataSource::~DataSource()
+{
+ clearData();
+}
+
+//! [0]
+void DataSource::generateData(int cacheCount, int rowCount, int columnCount,
+ float xMin, float xMax, float yMin, float yMax,
+ float zMin, float zMax)
+{
+ if (!cacheCount)
+ return;
+
+ clearData();
+ // Re-create the cache array
+ m_data.resize(cacheCount);
+ for (int i(0); i < cacheCount; i++) {
+ QSurfaceDataArray &array = m_data[i];
+ array.reserve(rowCount);
+ for (int j(0); j < rowCount; j++)
+ array.append(new QSurfaceDataRow(columnCount));
+ }
+
+ float xRange = xMax - xMin;
+ float yRange = yMax - yMin;
+ float zRange = zMax - zMin;
+ int cacheIndexStep = columnCount / cacheCount;
+ float cacheStep = float(cacheIndexStep) * xRange / float(columnCount);
+
+ // Populate caches
+ for (int i(0); i < cacheCount; i++) {
+ QSurfaceDataArray &cache = m_data[i];
+ float cacheXAdjustment = cacheStep * i;
+ float cacheIndexAdjustment = cacheIndexStep * i;
+ for (int j(0); j < rowCount; j++) {
+ QSurfaceDataRow &row = *(cache[j]);
+ float rowMod = (float(j)) / float(rowCount);
+ float yRangeMod = yRange * rowMod;
+ float zRangeMod = zRange * rowMod;
+ float z = zRangeMod + zMin;
+ qreal rowColWaveAngleMul = M_PI * M_PI * rowMod;
+ float rowColWaveMul = yRangeMod * 0.2f;
+ for (int k(0); k < columnCount; k++) {
+ float colMod = (float(k)) / float(columnCount);
+ float xRangeMod = xRange * colMod;
+ float x = xRangeMod + xMin + cacheXAdjustment;
+ float colWave = float(qSin((2.0 * M_PI * colMod) - (1.0 / 2.0 * M_PI)) + 1.0);
+ float y = (colWave * ((float(qSin(rowColWaveAngleMul * colMod) + 1.0))))
+ * rowColWaveMul
+ + (0.15f * float(rand()) / float(RAND_MAX)) * yRangeMod;
+
+ int index = k + cacheIndexAdjustment;
+ if (index >= columnCount) {
+ // Wrap over
+ index -= columnCount;
+ x -= xRange;
+ }
+ row[index] = QVector3D(x, y, z);
+ }
+ }
+ }
+}
+//! [0]
+
+//! [1]
+void DataSource::update(QSurface3DSeries *series)
+{
+ if (series && m_data.size()) {
+ // Each iteration uses data from a different cached array
+ m_index++;
+ if (m_index > m_data.count() - 1)
+ m_index = 0;
+
+ QSurfaceDataArray array = m_data.at(m_index);
+ int newRowCount = array.size();
+ int newColumnCount = array.at(0)->size();
+
+ // If the first time or the dimensions of the cache array have changed,
+ // reconstruct the reset array
+ if (m_resetArray || series->dataProxy()->rowCount() != newRowCount
+ || series->dataProxy()->columnCount() != newColumnCount) {
+ m_resetArray = new QSurfaceDataArray();
+ m_resetArray->reserve(newRowCount);
+ for (int i(0); i < newRowCount; i++)
+ m_resetArray->append(new QSurfaceDataRow(newColumnCount));
+ }
+
+ // Copy items from our cache to the reset array
+ for (int i(0); i < newRowCount; i++) {
+ const QSurfaceDataRow &sourceRow = *(array.at(i));
+ QSurfaceDataRow &row = *(*m_resetArray)[i];
+ for (int j(0); j < newColumnCount; j++)
+ row[j].setPosition(sourceRow.at(j).position());
+ }
+
+ // Notify the proxy that data has changed
+ series->dataProxy()->resetArray(m_resetArray);
+ }
+}
+//! [1]
+
+//! [2]
+QString DataSource::selectionLabel(QSurface3DSeries *series, QValue3DAxis *axisX,
+ QValue3DAxis *axisY, QValue3DAxis *axisZ)
+{
+ QString label;
+
+ if (series && series->selectedPoint() != QSurface3DSeries::invalidSelectionPosition()) {
+ const QSurfaceDataItem *item = series->dataProxy()->itemAt(series->selectedPoint());
+ QString x;
+ QString y;
+ QString z;
+ x.sprintf(axisX->labelFormat().toUtf8().constData(), int(item->x()));
+ y.sprintf(axisY->labelFormat().toUtf8().constData(), int(item->y()));
+ z.sprintf(axisZ->labelFormat().toUtf8().constData(), int(item->z()));
+ label = QStringLiteral("%1, %3: %2").arg(x).arg(y).arg(z);
+ } else {
+ label = QStringLiteral("No selection");
+ }
+
+ return label;
+}
+//! [2]
+
+void DataSource::clearData()
+{
+ for (int i(0); i < m_data.size(); i++) {
+ QSurfaceDataArray &array = m_data[i];
+ for (int j(0); j < array.size(); j++)
+ delete array[j];
+ array.clear();
+ }
+}
diff --git a/examples/datavisualization/qmloscilloscope/datasource.h b/examples/datavisualization/qmloscilloscope/datasource.h
new file mode 100644
index 00000000..51d3e8e0
--- /dev/null
+++ b/examples/datavisualization/qmloscilloscope/datasource.h
@@ -0,0 +1,54 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+#ifndef DATASOURCE_H
+#define DATASOURCE_H
+
+#include <QtDataVisualization>
+#include <QObject>
+
+class QQuickView;
+
+using namespace QtDataVisualization;
+
+class DataSource : public QObject
+{
+ Q_OBJECT
+public:
+ explicit DataSource(QObject *parent = 0);
+ virtual ~DataSource();
+
+ //! [0]
+public slots:
+ void generateData(int cacheCount, int rowCount, int columnCount,
+ float xMin, float xMax, float yMin, float yMax, float zMin, float zMax);
+
+ void update(QSurface3DSeries *series);
+
+ QString selectionLabel(QSurface3DSeries *series, QValue3DAxis *axisX,
+ QValue3DAxis *axisY, QValue3DAxis *axisZ);
+ //! [0]
+private:
+ void clearData();
+
+ QVector<QSurfaceDataArray> m_data;
+ int m_index;
+ QSurfaceDataArray *m_resetArray;
+};
+
+#endif
diff --git a/examples/datavisualization/qmloscilloscope/doc/images/qmloscilloscope-example.png b/examples/datavisualization/qmloscilloscope/doc/images/qmloscilloscope-example.png
new file mode 100644
index 00000000..697f391e
--- /dev/null
+++ b/examples/datavisualization/qmloscilloscope/doc/images/qmloscilloscope-example.png
Binary files differ
diff --git a/examples/datavisualization/qmloscilloscope/doc/src/qmloscilloscope.qdoc b/examples/datavisualization/qmloscilloscope/doc/src/qmloscilloscope.qdoc
new file mode 100644
index 00000000..9fdcd8d2
--- /dev/null
+++ b/examples/datavisualization/qmloscilloscope/doc/src/qmloscilloscope.qdoc
@@ -0,0 +1,102 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+/*!
+ \example qmloscilloscope
+ \title Qt Quick 2 Oscilloscope Example
+ \ingroup qtdatavisualization_examples
+ \brief Example of a hybrid C++ and QML application.
+
+ The Qt Quick 2 oscilloscope example shows how to combine C++ and QML in an application,
+ as well as showing data that changes realtime.
+
+ \image qmloscilloscope-example.png
+
+ The interesting thing about this example is combining C++ and QML, so we'll concentrate on
+ that and skip explaining the basic functionality - for
+ more detailed QML example documentation, see \l{Qt Quick 2 Scatter Example}.
+
+ \section1 Data source in C++
+
+ The item model based proxies are good for simple and/or static graphs, but to achieve
+ best performance when displaying data changing in realtime, the basic proxies should be used.
+ Those are not supported in QML, as the data items they store are not \l{QObject}s and
+ cannot therefore be directly manipulated from QML code.
+ To overcome this limitation, we implement a simple \c DataSource class in C++ to populate the
+ data proxy of the series.
+
+ The \c DataSource class provides three methods that can be called from QML:
+
+ \snippet ../examples/qmloscilloscope/datasource.h 0
+
+ The first method, \c generateData(), creates a cache of simulated oscilloscope data for us
+ to display. The data is cached in a format accepted by QSurfaceDataProxy:
+
+ \snippet ../examples/qmloscilloscope/datasource.cpp 0
+
+ The secod method, \c update(), copies one set of the cached data into another array, which we
+ set to the data proxy of the series by calling QSurfaceDataProxy::resetArray().
+ We reuse the same array if the array dimensions have not changed to minimize overhead:
+
+ \snippet ../examples/qmloscilloscope/datasource.cpp 1
+
+ \note Even though we are operating on the array pointer we have previously set to the proxy
+ we still need to call QSurfaceDataProxy::resetArray() after changing the data in it to prompt
+ the graph to render the data.
+
+ The final method, \c selectionLabel(), is used to generate a label string we can show on the
+ QML ui. This method utilizes the axis formats to format the label:
+
+ \snippet ../examples/qmloscilloscope/datasource.cpp 2
+
+ To be able to access the \c DataSource methods from QML, we need to expose it. We do this by
+ defining a context property in application main:
+
+ \snippet ../examples/qmloscilloscope/main.cpp 0
+
+ \section1 QML
+
+ In the QML codes, we define a Surface3D graph normally and give it a Surface3DSeries:
+
+ \snippet ../examples/qmloscilloscope/qml/qmloscilloscope/main.qml 0
+
+ One interesting detail is that we don't specify a proxy for the Surface3DSeries we attach
+ to the graph. This makes the series to utilize the default QSurfaceDataProxy.
+
+ We also specify an empty string for \l{Abstract3DSeries::itemLabelFormat}{itemLabelFormat}, since we want to display
+ the selected item information in a \c Text element instead of a label above the selection pointer.
+ This is done because the selection pointer moves around a lot as the data changes, which makes
+ the regular selection label difficult to read.
+ When selection point changes, we update the label text using a helper function
+ \c updateSelectionLabel(), which calls one of the methods we defined for our \c DataSource class
+ to obtain the label:
+
+ \snippet ../examples/qmloscilloscope/qml/qmloscilloscope/main.qml 1
+
+ We initialize the \c DataSource cache when the graph is complete by calling a helper function
+ \c generateData(), which calls the method with the same name on the \c DataSource:
+
+ \snippet ../examples/qmloscilloscope/qml/qmloscilloscope/main.qml 2
+ \dots 4
+ \snippet ../examples/qmloscilloscope/qml/qmloscilloscope/main.qml 4
+
+ To trigger the updates in data, we define a \c Timer item which calls the \c update() method on the \c
+ DataSource at requested intervals. The label update is also triggered on each cycle:
+
+ \snippet ../examples/qmloscilloscope/qml/qmloscilloscope/main.qml 3
+*/
diff --git a/examples/datavisualization/qmloscilloscope/main.cpp b/examples/datavisualization/qmloscilloscope/main.cpp
new file mode 100644
index 00000000..dd7f7a30
--- /dev/null
+++ b/examples/datavisualization/qmloscilloscope/main.cpp
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** 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 "datasource.h"
+#include "qtquick2applicationviewer.h"
+#include <QtDataVisualization/qutils.h>
+
+#include <QtGui/QGuiApplication>
+#include <QtCore/QDir>
+#include <QtQml/QQmlContext>
+
+int main(int argc, char *argv[])
+{
+ QGuiApplication app(argc, argv);
+
+ QtQuick2ApplicationViewer viewer;
+
+ // Enable antialiasing
+ viewer.setFormat(QtDataVisualization::qDefaultSurfaceFormat());
+
+ // The following are needed to make examples run without having to install the module
+ // in desktop environments.
+#ifdef Q_OS_WIN
+ QString extraImportPath(QStringLiteral("%1/../../../../%2"));
+#else
+ QString extraImportPath(QStringLiteral("%1/../../../%2"));
+#endif
+ viewer.addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
+ QString::fromLatin1("qml")));
+
+ viewer.setTitle(QStringLiteral("Oscilloscope example"));
+
+ //! [0]
+ DataSource dataSource;
+ viewer.rootContext()->setContextProperty("dataSource", &dataSource);
+ //! [0]
+
+ viewer.setSource(QUrl("qrc:/qml/qmloscilloscope/main.qml"));
+ viewer.setResizeMode(QQuickView::SizeRootObjectToView);
+ viewer.show();
+
+ return app.exec();
+}
diff --git a/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/NewButton.qml b/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/NewButton.qml
new file mode 100644
index 00000000..e4fb99d2
--- /dev/null
+++ b/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/NewButton.qml
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtQuick.Controls 1.0
+import QtQuick.Controls.Styles 1.0
+
+Item {
+ id: newbutton
+
+ property alias text: buttonText.text
+
+ signal clicked
+
+ implicitWidth: buttonText.implicitWidth + 5
+ implicitHeight: buttonText.implicitHeight + 10
+
+ Button {
+ id: buttonText
+ width: parent.width
+ height: parent.height
+
+ style: ButtonStyle {
+ label: Component {
+ Text {
+ text: buttonText.text
+ clip: true
+ wrapMode: Text.WordWrap
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ anchors.fill: parent
+ }
+ }
+ }
+ onClicked: newbutton.clicked()
+ }
+}
diff --git a/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml b/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml
new file mode 100644
index 00000000..b9284777
--- /dev/null
+++ b/examples/datavisualization/qmloscilloscope/qml/qmloscilloscope/main.qml
@@ -0,0 +1,289 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtQuick.Layouts 1.0
+import QtQuick.Controls 1.0
+import QtDataVisualization 1.0
+import "."
+
+Item {
+ id: mainView
+ width: 1280
+ height: 1024
+
+ property int sampleColumns: sampleSlider.value
+ property int sampleRows: sampleColumns / 2
+ property int sampleCache: 24
+
+ onSampleRowsChanged: {
+ surfaceSeries.selectedPoint = surfaceSeries.invalidSelectionPosition
+ generateData()
+ }
+
+ Item {
+ id: dataView
+ anchors.bottom: parent.bottom
+ width: parent.width
+ height: parent.height - buttonLayout.height
+
+ Surface3D {
+ id: surfaceGraph
+
+ width: dataView.width
+ height: dataView.height
+ shadowQuality: AbstractGraph3D.ShadowQualityNone
+ selectionMode: AbstractGraph3D.SelectionSlice | AbstractGraph3D.SelectionItemAndRow
+
+ axisX.labelFormat: "%d ms"
+ axisY.labelFormat: "%d W"
+ axisZ.labelFormat: "%d mV"
+ axisX.min: 0
+ axisY.min: 0
+ axisZ.min: 0
+ axisX.max: 1000
+ axisY.max: 100
+ axisZ.max: 800
+ axisX.segmentCount: 4
+ axisY.segmentCount: 4
+ axisZ.segmentCount: 4
+
+ //! [0]
+ Surface3DSeries {
+ id: surfaceSeries
+ drawMode: Surface3DSeries.DrawSurface;
+ flatShadingEnabled: false;
+ meshSmooth: true
+ itemLabelFormat: ""
+
+ onSelectedPointChanged: mainView.updateSelectionLabel()
+ }
+ //! [0]
+
+ //! [2]
+ Component.onCompleted: mainView.generateData()
+ //! [2]
+ }
+ }
+
+ //! [3]
+ Timer {
+ id: refreshTimer
+ interval: 1000 / frequencySlider.value
+ running: true
+ repeat: true
+ onTriggered: {
+ dataSource.update(surfaceSeries)
+ mainView.updateSelectionLabel()
+ }
+ }
+ //! [3]
+
+ Rectangle {
+ width: parent.width
+ height: flatShadingToggle.height
+ anchors.left: parent.left
+ anchors.top: parent.top
+ color: surfaceGraph.theme.backgroundColor
+
+ RowLayout {
+ id: buttonLayout
+ Layout.minimumHeight: flatShadingToggle.height
+ anchors.fill: parent
+ spacing: 0
+
+ Rectangle {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ Layout.minimumWidth: samplesText.implicitWidth + 120
+ Layout.maximumWidth: samplesText.implicitWidth + 120
+ Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
+
+ border.color: "gray"
+ border.width: 1
+ radius: 4
+
+ RowLayout {
+ anchors.fill: parent
+ anchors.margins: parent.border.width + 1
+
+ Slider {
+ id: sampleSlider
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
+ Layout.minimumWidth: 100
+ minimumValue: mainView.sampleCache * 2
+ maximumValue: minimumValue * 10
+ stepSize: mainView.sampleCache
+ updateValueWhileDragging: false
+ value: minimumValue * 2
+ }
+
+ Rectangle {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ Layout.minimumWidth: samplesText.implicitWidth + 10
+ Layout.maximumWidth: samplesText.implicitWidth + 10
+ Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
+
+ Text {
+ id: samplesText
+ text: "Samples: " + (mainView.sampleRows * mainView.sampleColumns)
+ anchors.fill: parent
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ }
+ }
+ }
+ }
+
+ Rectangle {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ Layout.minimumWidth: frequencyText.implicitWidth + 120
+ Layout.maximumWidth: frequencyText.implicitWidth + 120
+ Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
+
+ border.color: "gray"
+ border.width: 1
+ radius: 4
+
+ RowLayout {
+ anchors.fill: parent
+ anchors.margins: parent.border.width + 1
+
+ Slider {
+ id: frequencySlider
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
+ Layout.minimumWidth: 100
+ minimumValue: 2
+ maximumValue: 60
+ stepSize: 2
+ updateValueWhileDragging: true
+ value: 30
+ }
+
+ Rectangle {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ Layout.minimumWidth: frequencyText.implicitWidth + 10
+ Layout.maximumWidth: frequencyText.implicitWidth + 10
+ Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
+
+ Text {
+ id: frequencyText
+ text: "Target freq: " + frequencySlider.value + " Hz"
+ anchors.fill: parent
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ }
+ }
+ }
+ }
+
+ Rectangle {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ Layout.minimumWidth: selectionText.implicitWidth + 10
+ Layout.maximumWidth: selectionText.implicitWidth + 10
+ Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
+
+ border.color: "gray"
+ border.width: 1
+ radius: 4
+
+ Text {
+ id: selectionText
+ text: "No selection"
+ anchors.fill: parent
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ }
+ }
+
+ NewButton {
+ id: flatShadingToggle
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+
+ text: "Show Flat"
+ enabled: surfaceSeries.flatShadingSupported
+
+ onClicked: {
+ if (surfaceSeries.flatShadingEnabled === true) {
+ surfaceSeries.flatShadingEnabled = false;
+ text = "Show Flat"
+ } else {
+ surfaceSeries.flatShadingEnabled = true;
+ text = "Show Smooth"
+ }
+ }
+ }
+
+ NewButton {
+ id: surfaceGridToggle
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+
+ text: "Show Surface Grid"
+
+ onClicked: {
+ if (surfaceSeries.drawMode & Surface3DSeries.DrawWireframe) {
+ surfaceSeries.drawMode &= ~Surface3DSeries.DrawWireframe;
+ text = "Show Surface Grid"
+ } else {
+ surfaceSeries.drawMode |= Surface3DSeries.DrawWireframe;
+ text = "Hide Surface Grid"
+ }
+ }
+ }
+
+ NewButton {
+ id: exitButton
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+
+ text: "Quit"
+
+ onClicked: Qt.quit(0);
+ }
+ }
+ }
+
+ //! [1]
+ function updateSelectionLabel() {
+ selectionText.text = dataSource.selectionLabel(surfaceSeries,
+ surfaceGraph.axisX,
+ surfaceGraph.axisY,
+ surfaceGraph.axisZ)
+ }
+ //! [1]
+
+ //! [4]
+ function generateData() {
+ dataSource.generateData(mainView.sampleCache, mainView.sampleRows,
+ mainView.sampleColumns, surfaceGraph.axisX.min,
+ surfaceGraph.axisX.max, surfaceGraph.axisY.min,
+ surfaceGraph.axisY.max, surfaceGraph.axisZ.min,
+ surfaceGraph.axisZ.max)
+ }
+ //! [4]
+}
diff --git a/examples/datavisualization/qmloscilloscope/qmloscilloscope.desktop b/examples/datavisualization/qmloscilloscope/qmloscilloscope.desktop
new file mode 100644
index 00000000..bd8e8325
--- /dev/null
+++ b/examples/datavisualization/qmloscilloscope/qmloscilloscope.desktop
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Encoding=UTF-8
+Version=1.0
+Type=Application
+Terminal=false
+Name=qmloscilloscope
+Exec=/opt/qmloscilloscope/bin/qmloscilloscope
+Icon=qmloscilloscope64
+X-Window-Icon=
+X-HildonDesk-ShowInToolbar=true
+X-Osso-Type=application/x-executable
diff --git a/examples/datavisualization/qmloscilloscope/qmloscilloscope.pro b/examples/datavisualization/qmloscilloscope/qmloscilloscope.pro
new file mode 100644
index 00000000..c1e556ae
--- /dev/null
+++ b/examples/datavisualization/qmloscilloscope/qmloscilloscope.pro
@@ -0,0 +1,24 @@
+!include( ../examples.pri ) {
+ error( "Couldn't find the examples.pri file!" )
+}
+
+QT += datavisualization
+
+# Add more folders to ship with the application, here
+folder_01.source = qml/qmloscilloscope
+folder_01.target = qml
+DEPLOYMENTFOLDERS = folder_01
+
+# Additional import path used to resolve QML modules in Creator's code model
+QML_IMPORT_PATH =
+
+# The .cpp file which was generated for your project. Feel free to hack it.
+SOURCES += main.cpp \
+ datasource.cpp
+HEADERS += datasource.h
+
+# Please do not modify the following two lines. Required for deployment.
+include(qtquick2applicationviewer/qtquick2applicationviewer.pri)
+qtcAddDeployment()
+
+RESOURCES += qmloscilloscope.qrc
diff --git a/examples/datavisualization/qmloscilloscope/qmloscilloscope.qrc b/examples/datavisualization/qmloscilloscope/qmloscilloscope.qrc
new file mode 100644
index 00000000..a2358789
--- /dev/null
+++ b/examples/datavisualization/qmloscilloscope/qmloscilloscope.qrc
@@ -0,0 +1,6 @@
+<RCC>
+ <qresource prefix="/">
+ <file>qml/qmloscilloscope/main.qml</file>
+ <file>qml/qmloscilloscope/NewButton.qml</file>
+ </qresource>
+</RCC>
diff --git a/examples/datavisualization/qmloscilloscope/qmloscilloscope64.png b/examples/datavisualization/qmloscilloscope/qmloscilloscope64.png
new file mode 100644
index 00000000..707d5c4e
--- /dev/null
+++ b/examples/datavisualization/qmloscilloscope/qmloscilloscope64.png
Binary files differ
diff --git a/examples/datavisualization/qmloscilloscope/qtquick2applicationviewer/qtquick2applicationviewer.cpp b/examples/datavisualization/qmloscilloscope/qtquick2applicationviewer/qtquick2applicationviewer.cpp
new file mode 100644
index 00000000..10709d7a
--- /dev/null
+++ b/examples/datavisualization/qmloscilloscope/qtquick2applicationviewer/qtquick2applicationviewer.cpp
@@ -0,0 +1,81 @@
+// checksum 0x4f6f version 0x90005
+/*
+ This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
+ QtQuick2ApplicationViewer is a convenience class containing mobile device specific
+ code such as screen orientation handling. Also QML paths and debugging are
+ handled here.
+ It is recommended not to modify this file, since newer versions of Qt Creator
+ may offer an updated version of it.
+*/
+
+#include "qtquick2applicationviewer.h"
+
+#include <QtCore/QCoreApplication>
+#include <QtCore/QDir>
+#include <QtQml/QQmlEngine>
+
+class QtQuick2ApplicationViewerPrivate
+{
+ QString mainQmlFile;
+ friend class QtQuick2ApplicationViewer;
+ static QString adjustPath(const QString &path);
+};
+
+QString QtQuick2ApplicationViewerPrivate::adjustPath(const QString &path)
+{
+#if defined(Q_OS_MAC)
+ if (!QDir::isAbsolutePath(path))
+ return QString::fromLatin1("%1/../Resources/%2")
+ .arg(QCoreApplication::applicationDirPath(), path);
+#elif defined(Q_OS_BLACKBERRY)
+ if (!QDir::isAbsolutePath(path))
+ return QString::fromLatin1("app/native/%1").arg(path);
+#elif !defined(Q_OS_ANDROID)
+ QString pathInInstallDir =
+ QString::fromLatin1("%1/../%2").arg(QCoreApplication::applicationDirPath(), path);
+ if (QFileInfo(pathInInstallDir).exists())
+ return pathInInstallDir;
+ pathInInstallDir =
+ QString::fromLatin1("%1/%2").arg(QCoreApplication::applicationDirPath(), path);
+ if (QFileInfo(pathInInstallDir).exists())
+ return pathInInstallDir;
+#endif
+ return path;
+}
+
+QtQuick2ApplicationViewer::QtQuick2ApplicationViewer(QWindow *parent)
+ : QQuickView(parent)
+ , d(new QtQuick2ApplicationViewerPrivate())
+{
+ connect(engine(), SIGNAL(quit()), SLOT(close()));
+ setResizeMode(QQuickView::SizeRootObjectToView);
+}
+
+QtQuick2ApplicationViewer::~QtQuick2ApplicationViewer()
+{
+ delete d;
+}
+
+void QtQuick2ApplicationViewer::setMainQmlFile(const QString &file)
+{
+ d->mainQmlFile = QtQuick2ApplicationViewerPrivate::adjustPath(file);
+#ifdef Q_OS_ANDROID
+ setSource(QUrl(QLatin1String("assets:/")+d->mainQmlFile));
+#else
+ setSource(QUrl::fromLocalFile(d->mainQmlFile));
+#endif
+}
+
+void QtQuick2ApplicationViewer::addImportPath(const QString &path)
+{
+ engine()->addImportPath(QtQuick2ApplicationViewerPrivate::adjustPath(path));
+}
+
+void QtQuick2ApplicationViewer::showExpanded()
+{
+#if defined(Q_WS_SIMULATOR) || defined(Q_OS_QNX)
+ showFullScreen();
+#else
+ show();
+#endif
+}
diff --git a/examples/datavisualization/qmloscilloscope/qtquick2applicationviewer/qtquick2applicationviewer.h b/examples/datavisualization/qmloscilloscope/qtquick2applicationviewer/qtquick2applicationviewer.h
new file mode 100644
index 00000000..cf66f140
--- /dev/null
+++ b/examples/datavisualization/qmloscilloscope/qtquick2applicationviewer/qtquick2applicationviewer.h
@@ -0,0 +1,33 @@
+// checksum 0xfde6 version 0x90005
+/*
+ This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
+ QtQuick2ApplicationViewer is a convenience class containing mobile device specific
+ code such as screen orientation handling. Also QML paths and debugging are
+ handled here.
+ It is recommended not to modify this file, since newer versions of Qt Creator
+ may offer an updated version of it.
+*/
+
+#ifndef QTQUICK2APPLICATIONVIEWER_H
+#define QTQUICK2APPLICATIONVIEWER_H
+
+#include <QtQuick/QQuickView>
+
+class QtQuick2ApplicationViewer : public QQuickView
+{
+ Q_OBJECT
+
+public:
+ explicit QtQuick2ApplicationViewer(QWindow *parent = 0);
+ virtual ~QtQuick2ApplicationViewer();
+
+ void setMainQmlFile(const QString &file);
+ void addImportPath(const QString &path);
+
+ void showExpanded();
+
+private:
+ class QtQuick2ApplicationViewerPrivate *d;
+};
+
+#endif // QTQUICK2APPLICATIONVIEWER_H
diff --git a/examples/datavisualization/qmloscilloscope/qtquick2applicationviewer/qtquick2applicationviewer.pri b/examples/datavisualization/qmloscilloscope/qtquick2applicationviewer/qtquick2applicationviewer.pri
new file mode 100644
index 00000000..e5f7990f
--- /dev/null
+++ b/examples/datavisualization/qmloscilloscope/qtquick2applicationviewer/qtquick2applicationviewer.pri
@@ -0,0 +1,180 @@
+# checksum 0x7b0d version 0x90005
+# This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
+# The code below adds the QtQuick2ApplicationViewer to the project and handles
+# the activation of QML debugging.
+# It is recommended not to modify this file, since newer versions of Qt Creator
+# may offer an updated version of it.
+
+QT += qml quick
+
+SOURCES += $$PWD/qtquick2applicationviewer.cpp
+HEADERS += $$PWD/qtquick2applicationviewer.h
+INCLUDEPATH += $$PWD
+# This file was generated by an application wizard of Qt Creator.
+# The code below handles deployment to Android and Maemo, aswell as copying
+# of the application data to shadow build directories on desktop.
+# It is recommended not to modify this file, since newer versions of Qt Creator
+# may offer an updated version of it.
+
+defineTest(qtcAddDeployment) {
+for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ greaterThan(QT_MAJOR_VERSION, 4) {
+ itemsources = $${item}.files
+ } else {
+ itemsources = $${item}.sources
+ }
+ $$itemsources = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath= $$eval($${deploymentfolder}.target)
+ export($$itemsources)
+ export($$itempath)
+ DEPLOYMENT += $$item
+}
+
+MAINPROFILEPWD = $$PWD
+
+android-no-sdk {
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemfiles = $${item}.files
+ $$itemfiles = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath = /data/user/qt/$$eval($${deploymentfolder}.target)
+ export($$itemfiles)
+ export($$itempath)
+ INSTALLS += $$item
+ }
+
+ target.path = /data/user/qt
+
+ export(target.path)
+ INSTALLS += target
+} else:android {
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemfiles = $${item}.files
+ $$itemfiles = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath = /assets/$$eval($${deploymentfolder}.target)
+ export($$itemfiles)
+ export($$itempath)
+ INSTALLS += $$item
+ }
+
+ x86 {
+ target.path = /libs/x86
+ } else: armeabi-v7a {
+ target.path = /libs/armeabi-v7a
+ } else {
+ target.path = /libs/armeabi
+ }
+
+ export(target.path)
+ INSTALLS += target
+} else:win32 {
+ copyCommand =
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
+ source = $$replace(source, /, \\)
+ sourcePathSegments = $$split(source, \\)
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)/$$last(sourcePathSegments)
+ target = $$replace(target, /, \\)
+ target ~= s,\\\\\\.?\\\\,\\,
+ !isEqual(source,$$target) {
+ !isEmpty(copyCommand):copyCommand += &&
+ isEqual(QMAKE_DIR_SEP, \\) {
+ copyCommand += $(COPY_DIR) \"$$source\" \"$$target\"
+ } else {
+ source = $$replace(source, \\\\, /)
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
+ target = $$replace(target, \\\\, /)
+ copyCommand += test -d \"$$target\" || mkdir -p \"$$target\" && cp -r \"$$source\" \"$$target\"
+ }
+ }
+ }
+ !isEmpty(copyCommand) {
+ copyCommand = @echo Copying application data... && $$copyCommand
+ copydeploymentfolders.commands = $$copyCommand
+ first.depends = $(first) copydeploymentfolders
+ export(first.depends)
+ export(copydeploymentfolders.commands)
+ QMAKE_EXTRA_TARGETS += first copydeploymentfolders
+ }
+} else:unix {
+ maemo5 {
+ desktopfile.files = $${TARGET}.desktop
+ desktopfile.path = /usr/share/applications/hildon
+ icon.files = $${TARGET}64.png
+ icon.path = /usr/share/icons/hicolor/64x64/apps
+ } else:!isEmpty(MEEGO_VERSION_MAJOR) {
+ desktopfile.files = $${TARGET}_harmattan.desktop
+ desktopfile.path = /usr/share/applications
+ icon.files = $${TARGET}80.png
+ icon.path = /usr/share/icons/hicolor/80x80/apps
+ } else { # Assumed to be a Desktop Unix
+ copyCommand =
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
+ source = $$replace(source, \\\\, /)
+ macx {
+ target = $$OUT_PWD/$${TARGET}.app/Contents/Resources/$$eval($${deploymentfolder}.target)
+ } else {
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
+ }
+ target = $$replace(target, \\\\, /)
+ sourcePathSegments = $$split(source, /)
+ targetFullPath = $$target/$$last(sourcePathSegments)
+ targetFullPath ~= s,/\\.?/,/,
+ !isEqual(source,$$targetFullPath) {
+ !isEmpty(copyCommand):copyCommand += &&
+ copyCommand += $(MKDIR) \"$$target\"
+ copyCommand += && $(COPY_DIR) \"$$source\" \"$$target\"
+ }
+ }
+ !isEmpty(copyCommand) {
+ copyCommand = @echo Copying application data... && $$copyCommand
+ copydeploymentfolders.commands = $$copyCommand
+ first.depends = $(first) copydeploymentfolders
+ export(first.depends)
+ export(copydeploymentfolders.commands)
+ QMAKE_EXTRA_TARGETS += first copydeploymentfolders
+ }
+ }
+ !isEmpty(target.path) {
+ installPrefix = $${target.path}
+ } else {
+ installPrefix = /opt/$${TARGET}
+ }
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemfiles = $${item}.files
+ $$itemfiles = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath = $${installPrefix}/$$eval($${deploymentfolder}.target)
+ export($$itemfiles)
+ export($$itempath)
+ INSTALLS += $$item
+ }
+
+ !isEmpty(desktopfile.path) {
+ export(icon.files)
+ export(icon.path)
+ export(desktopfile.files)
+ export(desktopfile.path)
+ INSTALLS += icon desktopfile
+ }
+
+ isEmpty(target.path) {
+ target.path = $${installPrefix}/bin
+ export(target.path)
+ }
+ INSTALLS += target
+}
+
+export (ICON)
+export (INSTALLS)
+export (DEPLOYMENT)
+export (LIBS)
+export (QMAKE_EXTRA_TARGETS)
+}
diff --git a/examples/datavisualization/qmlscatter/doc/images/qmlscatter-example.png b/examples/datavisualization/qmlscatter/doc/images/qmlscatter-example.png
new file mode 100644
index 00000000..65ec4816
--- /dev/null
+++ b/examples/datavisualization/qmlscatter/doc/images/qmlscatter-example.png
Binary files differ
diff --git a/examples/datavisualization/qmlscatter/doc/images/qmlscatter-newproject.png b/examples/datavisualization/qmlscatter/doc/images/qmlscatter-newproject.png
new file mode 100644
index 00000000..7c81cae8
--- /dev/null
+++ b/examples/datavisualization/qmlscatter/doc/images/qmlscatter-newproject.png
Binary files differ
diff --git a/examples/datavisualization/qmlscatter/doc/src/qmlscatter.qdoc b/examples/datavisualization/qmlscatter/doc/src/qmlscatter.qdoc
new file mode 100644
index 00000000..fe86d740
--- /dev/null
+++ b/examples/datavisualization/qmlscatter/doc/src/qmlscatter.qdoc
@@ -0,0 +1,190 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+/*!
+ \example qmlscatter
+ \title Qt Quick 2 Scatter Example
+ \ingroup qtdatavisualization_examples
+ \brief Using Scatter3D in a QML application.
+
+ The Qt Quick 2 scatter example shows how to make a simple scatter graph visualization using
+ Scatter3D and Qt Quick 2.
+
+ For instructions about how to interact with the graph, see \l{Qt Data Visualization Interacting with Data}{this page}.
+
+ \image qmlscatter-example.png
+
+ \section1 Creating the application
+
+ The application main is created by creating a new Qt Quick Application project in QtCreator.
+ The dialog shown here is from QtCreator 3.0.0, and it may look a bit different in other
+ versions:
+
+ \image qmlscatter-newproject.png
+
+ We'll modify the generated \c main.cpp a bit, as we want to add our \c main.qml file as a
+ resource. We do it by replacing
+
+ \code viewer.setMainQmlFile(QStringLiteral("qml/qmlscatter/main.qml")); \endcode
+
+ with
+
+ \snippet ../examples/qmlscatter/main.cpp 0
+
+ This will make application deployment easier.
+
+ We'll enable anti-aliasing for our application in environments that support it:
+
+ \snippet ../examples/qmlscatter/main.cpp 2
+
+ We'll also change the application to be shown maximized by replacing
+
+ \code viewer.showExpanded(); \endcode
+
+ with
+
+ \snippet ../examples/qmlscatter/main.cpp 1
+
+ We won't look into that any closer, as we'll change nothing in the generated
+ \c qtquick2applicationviewer files.
+
+ Next we'll create new qml files for data (\c Data.qml) and a QtQuick.Controls button
+ we want to modify a bit (\c NewButton.qml), and add them to the resource file, in addition to
+ main.qml:
+
+ \code
+ <RCC>
+ <qresource prefix="/">
+ <file>qml/qmlscatter/Data.qml</file>
+ <file>qml/qmlscatter/main.qml</file>
+ <file>qml/qmlscatter/NewButton.qml</file>
+ </qresource>
+ </RCC>
+ \endcode
+
+ Now the base for our application is done, and we can start setting up the graph.
+
+ \section1 Setting up the graph
+
+ Let's start modifying the generated \c {main.qml}. We can remove all previous content from it,
+ as it has nothing we need.
+
+ First we'll import all the QML modules we need:
+
+ \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 0
+
+ The last \c import just imports all the qml files in the same directory as our \c {main.qml},
+ because that's where \c NewButton.qml and \c Data.qml are.
+
+ Then we create our main \c Item and call it \c mainView:
+
+ \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 1
+
+ \note The Qt Creator application wizard will set a \c Rectangle item as the main item, which
+ is opaque white by default. This doesn't work for us, because the graphs are rendered behind the other
+ QML elements. We change the main item type to \c Item, which is invisible. This way the graph is
+ not covered by the main item.
+
+ Then we'll add another \c Item inside it, and call it \c dataView. This will be the item to hold
+ the Scatter3D graph. We'll anchor it to the parent bottom:
+
+ \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 9
+
+ Next we're ready to add the Scatter3D graph itself. We'll add it inside the \c dataView and
+ name it \c {scatterGraph}. Let's make it fill the \c {dataView}:
+
+ \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 2
+
+ Now the graph is ready for use, but has no data. It also has the default axes and visual
+ properties.
+
+ Let's modify some visual properties first by adding the following inside \c {scatterGraph}:
+
+ \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 3
+
+ We added a customized theme and changed the shadow quality.
+ We're happy with the other visual properties, so we won't change them.
+
+ The custom theme is based on a predefined theme, but we change the font in it:
+
+ \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 13
+
+ Then it's time to start feeding the graph some data.
+
+ \section1 Adding data to the graph
+
+ Let's create a \c Data item inside the \c mainView and name it \c seriesData:
+
+ \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 4
+
+ The \c seriesData item contains the data models for all three series we use in this example.
+
+ This is the component that holds our data in \c {Data.qml}. It has an \c Item as the main
+ component.
+
+ In the main component we'll add the data itself in a \c ListModel and name it
+ \c {dataModel}:
+
+ \snippet ../examples/qmlscatter/qml/qmlscatter/Data.qml 0
+ \dots
+
+ We'll add two more of these for the other two series, and name them \c dataModelTwo and
+ \c {dataModelThree}.
+
+ Then we need to expose the data models to be usable from \c {main.qml}. We do this by defining
+ them as aliases in the main data component:
+
+ \snippet ../examples/qmlscatter/qml/qmlscatter/Data.qml 1
+
+ Now we can use the data from \c Data.qml with \c scatterGraph in \c {main.qml}. First we'll add
+ a Scatter3DSeries and call it \c {scatterSeries}:
+
+ \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 5
+
+ Then we'll set up selection label format for the series:
+
+ \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 10
+
+ And finally the data for series one in a ItemModelScatterDataProxy. We set the data itself as
+ \c itemModel for the proxy:
+
+ \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 11
+
+ We'll add the other two series in the same way, but modify some series-specific details a bit:
+
+ \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 12
+ \dots
+
+ Then we'll modify the properties of the default axes in \c scatterGraph a bit:
+
+ \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 6
+
+ After that we'll just add a few buttons to the \c mainView to control the graph. We'll only
+ show one as an example:
+
+ \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 7
+
+ Then we'll modify \c dataView to make room for the buttons at the top:
+
+ \snippet ../examples/qmlscatter/qml/qmlscatter/main.qml 8
+ \dots
+
+ And we're done!
+
+ \section1 Example contents
+*/
diff --git a/examples/datavisualization/qmlscatter/main.cpp b/examples/datavisualization/qmlscatter/main.cpp
new file mode 100644
index 00000000..2215ca40
--- /dev/null
+++ b/examples/datavisualization/qmlscatter/main.cpp
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** 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 "qtquick2applicationviewer.h"
+#include <QtDataVisualization/qutils.h>
+
+#include <QtGui/QGuiApplication>
+#include <QtCore/QDir>
+
+int main(int argc, char *argv[])
+{
+ QGuiApplication app(argc, argv);
+
+ QtQuick2ApplicationViewer viewer;
+
+ // Enable antialiasing
+ //! [2]
+ viewer.setFormat(QtDataVisualization::qDefaultSurfaceFormat());
+ //! [2]
+
+ // The following are needed to make examples run without having to install the module
+ // in desktop environments.
+#ifdef Q_OS_WIN
+ QString extraImportPath(QStringLiteral("%1/../../../../%2"));
+#else
+ QString extraImportPath(QStringLiteral("%1/../../../%2"));
+#endif
+ viewer.addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
+ QString::fromLatin1("qml")));
+
+ viewer.setTitle(QStringLiteral("QML scatter example"));
+ //! [0]
+ viewer.setSource(QUrl("qrc:/qml/qmlscatter/main.qml"));
+ //! [0]
+ viewer.setResizeMode(QQuickView::SizeRootObjectToView);
+ //! [1]
+ viewer.showMaximized();
+ //! [1]
+
+ return app.exec();
+}
diff --git a/examples/datavisualization/qmlscatter/qml/qmlscatter/Data.qml b/examples/datavisualization/qmlscatter/qml/qmlscatter/Data.qml
new file mode 100644
index 00000000..23c4e5d5
--- /dev/null
+++ b/examples/datavisualization/qmlscatter/qml/qmlscatter/Data.qml
@@ -0,0 +1,1099 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+import QtQuick 2.1
+
+Item {
+ //! [1]
+ property alias model: dataModel
+ property alias modelTwo: dataModelTwo
+ property alias modelThree: dataModelThree
+ //! [1]
+
+ //! [0]
+ ListModel {
+ id: dataModel
+ ListElement{ xPos: -10.0; yPos: 5.0; zPos: -5.0 }
+ //! [0]
+ ListElement{ xPos: -9.0; yPos: 3.0; zPos: -4.5 }
+ ListElement{ xPos: -8.5; yPos: 4.1; zPos: -4.0 }
+ ListElement{ xPos: -8.0; yPos: 4.75; zPos: -3.9 }
+ ListElement{ xPos: -9.5; yPos: 4.9; zPos: -4.2 }
+ ListElement{ xPos: -9.9; yPos: 3.42; zPos: -3.5 }
+ ListElement{ xPos: -7.8; yPos: 3.1; zPos: -4.9 }
+ ListElement{ xPos: -7.3; yPos: 2.91; zPos: -4.1 }
+ ListElement{ xPos: -7.1 ; yPos: 3.68 ; zPos: -4.52 }
+ ListElement{ xPos: -8.8 ; yPos: 2.96 ; zPos: -3.6 }
+ ListElement{ xPos: -6.94 ; yPos: 2.4 ; zPos: -2.92 }
+ ListElement{ xPos: -9.02 ; yPos: 4.74 ; zPos: -4.18 }
+ ListElement{ xPos: -9.54 ; yPos: 3.1 ; zPos: -3.8 }
+ ListElement{ xPos: -6.86 ; yPos: 3.66 ; zPos: -3.58 }
+ ListElement{ xPos: -8.16 ; yPos: 1.82 ; zPos: -4.64 }
+ ListElement{ xPos: -7.4 ; yPos: 3.18 ; zPos: -4.22 }
+ ListElement{ xPos: -7.9 ; yPos: 3.06 ; zPos: -4.3 }
+ ListElement{ xPos: -8.98 ; yPos: 2.64 ; zPos: -4.44 }
+ ListElement{ xPos: -6.36 ; yPos: 3.96 ; zPos: -4.38 }
+ ListElement{ xPos: -7.18 ; yPos: 3.32 ; zPos: -4.04 }
+ ListElement{ xPos: -7.9 ; yPos: 3.4 ; zPos: -2.78 }
+ ListElement{ xPos: -7.4 ; yPos: 3.12 ; zPos: -3.1 }
+ ListElement{ xPos: -7.54 ; yPos: 2.8 ; zPos: -3.68 }
+ }
+
+ ListModel {
+ id: dataModelTwo
+ ListElement{ xPos: 2.25 ; yPos: 1.36 ; zPos: -1.3 }
+ ListElement{ xPos: -2 ; yPos: -0.08 ; zPos: 1 }
+ ListElement{ xPos: 2.65 ; yPos: -1.2 ; zPos: 2.7 }
+ ListElement{ xPos: -2.55 ; yPos: 3.48 ; zPos: -0.45 }
+ ListElement{ xPos: -3.85 ; yPos: 0.2 ; zPos: 0.5 }
+ ListElement{ xPos: 2.85 ; yPos: 1.32 ; zPos: 1.05 }
+ ListElement{ xPos: -0.4 ; yPos: -2.36 ; zPos: -1.6 }
+ ListElement{ xPos: 1.5 ; yPos: 0.36 ; zPos: -0.55 }
+ ListElement{ xPos: 0.25 ; yPos: 0.12 ; zPos: -0.75 }
+ ListElement{ xPos: -2.45 ; yPos: -0.72 ; zPos: -1.1 }
+ ListElement{ xPos: 4.1 ; yPos: 1.92 ; zPos: -0.95 }
+ ListElement{ xPos: 2.05 ; yPos: 0.64 ; zPos: -0.1 }
+ ListElement{ xPos: 0.25 ; yPos: 0.8 ; zPos: 3.05 }
+ ListElement{ xPos: 1.5 ; yPos: 0.24 ; zPos: 2.25 }
+ ListElement{ xPos: 1.15 ; yPos: -0.4 ; zPos: 0.8 }
+ ListElement{ xPos: -0.05 ; yPos: 0.12 ; zPos: 0.25 }
+ ListElement{ xPos: 0.9 ; yPos: -0.48 ; zPos: -3.2 }
+ ListElement{ xPos: 3.55 ; yPos: -1.04 ; zPos: -0.95 }
+ ListElement{ xPos: -2.4 ; yPos: -0.96 ; zPos: -0.65 }
+ ListElement{ xPos: 4.25 ; yPos: 0.16 ; zPos: 2.05 }
+ ListElement{ xPos: -0.6 ; yPos: 1 ; zPos: -0.2 }
+ ListElement{ xPos: 0 ; yPos: -0.84 ; zPos: -0.95 }
+ ListElement{ xPos: -4.2 ; yPos: 1.44 ; zPos: 0.85 }
+ ListElement{ xPos: -1.5 ; yPos: -1.2 ; zPos: -1.5 }
+ ListElement{ xPos: -3.35 ; yPos: -1.96 ; zPos: 1.8 }
+ ListElement{ xPos: -2.75 ; yPos: -0.96 ; zPos: -1.2 }
+ ListElement{ xPos: -2.45 ; yPos: 0.28 ; zPos: -4.55 }
+ ListElement{ xPos: 2.7 ; yPos: -1.4 ; zPos: -0.65 }
+ ListElement{ xPos: 2.7 ; yPos: 2.2 ; zPos: -2.4 }
+ ListElement{ xPos: -0.8 ; yPos: -2.04 ; zPos: 3.75 }
+ ListElement{ xPos: -1 ; yPos: -1.84 ; zPos: 2.35 }
+ ListElement{ xPos: -3.25 ; yPos: -1.6 ; zPos: -4.4 }
+ ListElement{ xPos: -0.35 ; yPos: -0.56 ; zPos: -1.75 }
+ ListElement{ xPos: -0.8 ; yPos: -0.28 ; zPos: -0.05 }
+ ListElement{ xPos: 4.75 ; yPos: -1.48 ; zPos: -2.45 }
+ ListElement{ xPos: 4.35 ; yPos: 1.4 ; zPos: 0.8 }
+ ListElement{ xPos: -3.2 ; yPos: 2 ; zPos: 0.5 }
+ ListElement{ xPos: 2 ; yPos: 1.92 ; zPos: 0.55 }
+ ListElement{ xPos: -0.45 ; yPos: 0.68 ; zPos: -0.8 }
+ ListElement{ xPos: -2.7 ; yPos: 2 ; zPos: -2.4 }
+ ListElement{ xPos: -1.65 ; yPos: 1.32 ; zPos: -2.05 }
+ ListElement{ xPos: -1.6 ; yPos: 1.8 ; zPos: -3.65 }
+ ListElement{ xPos: -1.2 ; yPos: -0.72 ; zPos: 0.85 }
+ ListElement{ xPos: 1.4 ; yPos: 1.08 ; zPos: 2.1 }
+ ListElement{ xPos: -3.9 ; yPos: -1.16 ; zPos: -0.85 }
+ ListElement{ xPos: 3.15 ; yPos: 0.12 ; zPos: -0.95 }
+ ListElement{ xPos: -1.35 ; yPos: -2.64 ; zPos: -0.5 }
+ ListElement{ xPos: -4.15 ; yPos: 1.28 ; zPos: -4.4 }
+ ListElement{ xPos: -2 ; yPos: 2.48 ; zPos: -0.15 }
+ ListElement{ xPos: -3.4 ; yPos: 0.6 ; zPos: 0 }
+ ListElement{ xPos: -1.5 ; yPos: -0.96 ; zPos: 2.35 }
+ ListElement{ xPos: -0.75 ; yPos: 1.16 ; zPos: -0.75 }
+ ListElement{ xPos: -0.85 ; yPos: 0.64 ; zPos: -1.75 }
+ ListElement{ xPos: 0.85 ; yPos: 0.48 ; zPos: 2.9 }
+ ListElement{ xPos: 4.05 ; yPos: 3.24 ; zPos: -0.1 }
+ ListElement{ xPos: 0.65 ; yPos: 0.84 ; zPos: 0.3 }
+ ListElement{ xPos: -2.1 ; yPos: 0.92 ; zPos: -2.75 }
+ ListElement{ xPos: -0.65 ; yPos: 0.16 ; zPos: 1.6 }
+ ListElement{ xPos: -1.8 ; yPos: -1.48 ; zPos: -2.15 }
+ ListElement{ xPos: -1.6 ; yPos: 2.96 ; zPos: 1.85 }
+ ListElement{ xPos: -0.75 ; yPos: 0.28 ; zPos: -0.75 }
+ ListElement{ xPos: 2.2 ; yPos: 1.16 ; zPos: 2.65 }
+ ListElement{ xPos: 2.6 ; yPos: 2.92 ; zPos: -0.2 }
+ ListElement{ xPos: -1.65 ; yPos: 3.28 ; zPos: 2.5 }
+ ListElement{ xPos: -0.5 ; yPos: 2.52 ; zPos: -1.15 }
+ ListElement{ xPos: -1.85 ; yPos: 0.52 ; zPos: -2 }
+ ListElement{ xPos: 0.15 ; yPos: -2.36 ; zPos: -0.5 }
+ ListElement{ xPos: -3.9 ; yPos: 0.28 ; zPos: -0.25 }
+ ListElement{ xPos: 0.1 ; yPos: -3.88 ; zPos: -0.7 }
+ ListElement{ xPos: -1 ; yPos: -1.96 ; zPos: 0.95 }
+ ListElement{ xPos: -0.3 ; yPos: -3.52 ; zPos: -1.45 }
+ ListElement{ xPos: 3.2 ; yPos: -2.56 ; zPos: 2.5 }
+ ListElement{ xPos: 0 ; yPos: -2.44 ; zPos: 1.35 }
+ ListElement{ xPos: 1.45 ; yPos: -1.96 ; zPos: 0.1 }
+ ListElement{ xPos: 3.55 ; yPos: -2.16 ; zPos: 1.75 }
+ ListElement{ xPos: 2.8 ; yPos: -0.72 ; zPos: -0.3 }
+ ListElement{ xPos: -1.65 ; yPos: -0.6 ; zPos: 0.25 }
+ ListElement{ xPos: -4.35 ; yPos: -1.32 ; zPos: -2.3 }
+ ListElement{ xPos: 2.75 ; yPos: -1.88 ; zPos: 1.7 }
+ ListElement{ xPos: 2.75 ; yPos: -0.6 ; zPos: 2.45 }
+ ListElement{ xPos: 0.15 ; yPos: -0.88 ; zPos: -0.2 }
+ ListElement{ xPos: 0.15 ; yPos: 0.04 ; zPos: -0.1 }
+ ListElement{ xPos: -1.2 ; yPos: -2.92 ; zPos: -3 }
+ ListElement{ xPos: -0.7 ; yPos: 0.16 ; zPos: 3.5 }
+ ListElement{ xPos: -1.8 ; yPos: -2.4 ; zPos: 0.2 }
+ ListElement{ xPos: 1.25 ; yPos: 2.64 ; zPos: 1.65 }
+ ListElement{ xPos: -0.65 ; yPos: 1.32 ; zPos: -0.55 }
+ ListElement{ xPos: 3.85 ; yPos: 2.32 ; zPos: -1 }
+ ListElement{ xPos: 1.65 ; yPos: -2.28 ; zPos: 0.95 }
+ ListElement{ xPos: -2.45 ; yPos: -2.96 ; zPos: 3.45 }
+ ListElement{ xPos: -1.75 ; yPos: 0.36 ; zPos: 1.6 }
+ ListElement{ xPos: 1.1 ; yPos: -0.84 ; zPos: 0.35 }
+ ListElement{ xPos: -1.55 ; yPos: 1.6 ; zPos: -3.1 }
+ ListElement{ xPos: 0.4 ; yPos: -1.36 ; zPos: -1.55 }
+ ListElement{ xPos: -3.95 ; yPos: 0.2 ; zPos: 3.7 }
+ ListElement{ xPos: -1.8 ; yPos: -0.24 ; zPos: 2.2 }
+ ListElement{ xPos: -0.45 ; yPos: 1.64 ; zPos: 1.35 }
+ ListElement{ xPos: -0.6 ; yPos: -0.72 ; zPos: 2.5 }
+ ListElement{ xPos: -1.2 ; yPos: -3.04 ; zPos: -1.55 }
+ ListElement{ xPos: -0.95 ; yPos: 1.48 ; zPos: 0.95 }
+ ListElement{ xPos: 1.7 ; yPos: -1.36 ; zPos: 2.15 }
+ ListElement{ xPos: -3.9 ; yPos: -0.32 ; zPos: -2.45 }
+ ListElement{ xPos: 2.95 ; yPos: 3.12 ; zPos: -2.4 }
+ ListElement{ xPos: 3.55 ; yPos: -1.48 ; zPos: 0.15 }
+ ListElement{ xPos: -1.4 ; yPos: 3.24 ; zPos: 0.7 }
+ ListElement{ xPos: -3.3 ; yPos: -0.8 ; zPos: 0 }
+ ListElement{ xPos: 1.15 ; yPos: 0.36 ; zPos: -2.7 }
+ ListElement{ xPos: 0.4 ; yPos: 0.12 ; zPos: 1.35 }
+ ListElement{ xPos: 1.9 ; yPos: -3.32 ; zPos: -0.75 }
+ ListElement{ xPos: 0.4 ; yPos: -0.2 ; zPos: -2.4 }
+ ListElement{ xPos: 0.55 ; yPos: 1.56 ; zPos: 2.25 }
+ ListElement{ xPos: 4.35 ; yPos: -0.96 ; zPos: -0.7 }
+ ListElement{ xPos: 3.35 ; yPos: -1.04 ; zPos: -0.85 }
+ ListElement{ xPos: 1.7 ; yPos: -0.28 ; zPos: -0.25 }
+ ListElement{ xPos: -3.05 ; yPos: -0.44 ; zPos: 1.3 }
+ ListElement{ xPos: -3.95 ; yPos: -2.72 ; zPos: -3.8 }
+ ListElement{ xPos: 2.1 ; yPos: 1.32 ; zPos: 1.15 }
+ ListElement{ xPos: 1.4 ; yPos: -0.44 ; zPos: -2.85 }
+ ListElement{ xPos: -2.1 ; yPos: 0.04 ; zPos: 2 }
+ ListElement{ xPos: 2.45 ; yPos: -2.44 ; zPos: -2.85 }
+ ListElement{ xPos: 4.35 ; yPos: 0.24 ; zPos: 1.1 }
+ ListElement{ xPos: 1.8 ; yPos: 1.8 ; zPos: -0.7 }
+ ListElement{ xPos: 1.8 ; yPos: 2.04 ; zPos: -0.95 }
+ ListElement{ xPos: 1.65 ; yPos: -2.48 ; zPos: 0.35 }
+ ListElement{ xPos: -3.3 ; yPos: 0.28 ; zPos: -1.6 }
+ ListElement{ xPos: 1.85 ; yPos: 1 ; zPos: 2.25 }
+ ListElement{ xPos: -2 ; yPos: -0.88 ; zPos: -2.6 }
+ ListElement{ xPos: -0.1 ; yPos: 0.28 ; zPos: -1.75 }
+ ListElement{ xPos: -2.5 ; yPos: -2.76 ; zPos: -0.2 }
+ ListElement{ xPos: 0.3 ; yPos: -1.64 ; zPos: -0.75 }
+ ListElement{ xPos: 2.3 ; yPos: -1.28 ; zPos: -2.7 }
+ ListElement{ xPos: -1.7 ; yPos: -1.48 ; zPos: -2.6 }
+ ListElement{ xPos: 0.5 ; yPos: 0.24 ; zPos: -2.2 }
+ ListElement{ xPos: 0.45 ; yPos: -1.88 ; zPos: -0.95 }
+ ListElement{ xPos: -1.2 ; yPos: 0.96 ; zPos: 2.35 }
+ ListElement{ xPos: -0.55 ; yPos: -0.36 ; zPos: -1.8 }
+ ListElement{ xPos: 2.7 ; yPos: -0.56 ; zPos: -0.4 }
+ ListElement{ xPos: 1.1 ; yPos: 2.76 ; zPos: -2.35 }
+ ListElement{ xPos: -1.2 ; yPos: -2.16 ; zPos: 3.1 }
+ ListElement{ xPos: -0.05 ; yPos: 1.76 ; zPos: 1 }
+ ListElement{ xPos: 1.45 ; yPos: -0.72 ; zPos: 0.7 }
+ ListElement{ xPos: 0.2 ; yPos: -3.2 ; zPos: -0.25 }
+ ListElement{ xPos: -0.8 ; yPos: 1.08 ; zPos: -0.1 }
+ ListElement{ xPos: -2.45 ; yPos: 0.56 ; zPos: -0.55 }
+ ListElement{ xPos: 2 ; yPos: 1.12 ; zPos: 2 }
+ ListElement{ xPos: -1.05 ; yPos: -2.16 ; zPos: -1.8 }
+ ListElement{ xPos: 1.2 ; yPos: -2.12 ; zPos: -1.55 }
+ ListElement{ xPos: -4 ; yPos: -0.76 ; zPos: 0.2 }
+ ListElement{ xPos: -0.15 ; yPos: -0.2 ; zPos: -2 }
+ ListElement{ xPos: -2.95 ; yPos: 1.36 ; zPos: -3.65 }
+ ListElement{ xPos: 2.7 ; yPos: 1.16 ; zPos: 2.05 }
+ ListElement{ xPos: 0.95 ; yPos: -1.52 ; zPos: -1.05 }
+ ListElement{ xPos: -1.8 ; yPos: 2.72 ; zPos: -0.55 }
+ ListElement{ xPos: 0.45 ; yPos: 2.88 ; zPos: -4.4 }
+ ListElement{ xPos: 1.35 ; yPos: 1.08 ; zPos: -0.8 }
+ ListElement{ xPos: -2.7 ; yPos: -1.36 ; zPos: -2.65 }
+ ListElement{ xPos: 0.35 ; yPos: 2.32 ; zPos: -1.6 }
+ ListElement{ xPos: -0.45 ; yPos: 1.6 ; zPos: 0.1 }
+ ListElement{ xPos: 3.75 ; yPos: 1.12 ; zPos: -3.8 }
+ ListElement{ xPos: 0.5 ; yPos: 2.6 ; zPos: 0.5 }
+ ListElement{ xPos: -0.75 ; yPos: -3.52 ; zPos: -3.2 }
+ ListElement{ xPos: 0.25 ; yPos: -1.32 ; zPos: 2.25 }
+ ListElement{ xPos: -2.8 ; yPos: -1.6 ; zPos: -2.45 }
+ ListElement{ xPos: 0.15 ; yPos: -0.56 ; zPos: 3.9 }
+ ListElement{ xPos: 2.15 ; yPos: -1.68 ; zPos: -1.7 }
+ ListElement{ xPos: -4.2 ; yPos: -1.92 ; zPos: 2.35 }
+ ListElement{ xPos: 1.95 ; yPos: -1.32 ; zPos: 0.3 }
+ ListElement{ xPos: 0.5 ; yPos: 0.64 ; zPos: 0.75 }
+ ListElement{ xPos: 0.85 ; yPos: -0.84 ; zPos: -0.5 }
+ ListElement{ xPos: -2.15 ; yPos: -1.64 ; zPos: -2.3 }
+ ListElement{ xPos: -0.85 ; yPos: -2.84 ; zPos: -0.3 }
+ ListElement{ xPos: -3.1 ; yPos: -0.32 ; zPos: -0.85 }
+ ListElement{ xPos: 3.45 ; yPos: 0 ; zPos: 0.8 }
+ ListElement{ xPos: 1.4 ; yPos: 0.2 ; zPos: 0.3 }
+ ListElement{ xPos: 0.45 ; yPos: 1.76 ; zPos: -0.15 }
+ ListElement{ xPos: 0.85 ; yPos: 3.16 ; zPos: -2 }
+ ListElement{ xPos: 2.15 ; yPos: 0.72 ; zPos: -0.95 }
+ ListElement{ xPos: -2.4 ; yPos: 0.6 ; zPos: -0.5 }
+ ListElement{ xPos: 1.45 ; yPos: -0.4 ; zPos: -1.95 }
+ ListElement{ xPos: 0.6 ; yPos: -1.84 ; zPos: 1.8 }
+ ListElement{ xPos: 3.4 ; yPos: -0.2 ; zPos: -0.55 }
+ ListElement{ xPos: 0.2 ; yPos: -0.84 ; zPos: 4.6 }
+ ListElement{ xPos: -0.25 ; yPos: -2.4 ; zPos: 2.1 }
+ ListElement{ xPos: -1.15 ; yPos: -3.16 ; zPos: -3.05 }
+ ListElement{ xPos: 1.45 ; yPos: 0.96 ; zPos: -0.7 }
+ ListElement{ xPos: 0.35 ; yPos: 0.52 ; zPos: -1 }
+ ListElement{ xPos: 2.6 ; yPos: 0.28 ; zPos: -0.85 }
+ ListElement{ xPos: -1.25 ; yPos: 0.76 ; zPos: -1.6 }
+ ListElement{ xPos: -0.65 ; yPos: -2.16 ; zPos: 3 }
+ ListElement{ xPos: -0.25 ; yPos: -2.36 ; zPos: -1.8 }
+ ListElement{ xPos: 0.35 ; yPos: -0.8 ; zPos: 1.85 }
+ ListElement{ xPos: 0.05 ; yPos: 0.6 ; zPos: 0.85 }
+ ListElement{ xPos: -2.5 ; yPos: 2.28 ; zPos: -2.05 }
+ ListElement{ xPos: 1.65 ; yPos: 1.2 ; zPos: 2.1 }
+ ListElement{ xPos: -3 ; yPos: -0.24 ; zPos: 0.7 }
+ ListElement{ xPos: -2.1 ; yPos: -0.84 ; zPos: -0.2 }
+ ListElement{ xPos: 0.45 ; yPos: 0.96 ; zPos: 2.5 }
+ ListElement{ xPos: -2.4 ; yPos: 1.28 ; zPos: 2.75 }
+ ListElement{ xPos: -1.7 ; yPos: -3.2 ; zPos: -2.3 }
+ ListElement{ xPos: 0.95 ; yPos: -0.08 ; zPos: 0.3 }
+ ListElement{ xPos: 1.4 ; yPos: 0.88 ; zPos: 0.45 }
+ ListElement{ xPos: 2.1 ; yPos: 1.08 ; zPos: 0.2 }
+ ListElement{ xPos: -2.1 ; yPos: -0.2 ; zPos: -0.6 }
+ ListElement{ xPos: 0.5 ; yPos: 1.24 ; zPos: -0.45 }
+ ListElement{ xPos: 2.55 ; yPos: -0.56 ; zPos: -2.65 }
+ ListElement{ xPos: -4.5 ; yPos: -0.48 ; zPos: -1.25 }
+ ListElement{ xPos: 3.45 ; yPos: -0.44 ; zPos: 2.2 }
+ ListElement{ xPos: -0.25 ; yPos: 0.64 ; zPos: 1.65 }
+ ListElement{ xPos: 1.25 ; yPos: -0.6 ; zPos: -0.35 }
+ ListElement{ xPos: 1.95 ; yPos: -1.56 ; zPos: -4.1 }
+ ListElement{ xPos: 2.75 ; yPos: -1 ; zPos: 3.3 }
+ ListElement{ xPos: 3.05 ; yPos: 1.04 ; zPos: -0.9 }
+ ListElement{ xPos: -2.95 ; yPos: 1.4 ; zPos: -2.25 }
+ ListElement{ xPos: 1.3 ; yPos: 0.36 ; zPos: -2.9 }
+ ListElement{ xPos: 0.4 ; yPos: -2.48 ; zPos: 3.25 }
+ ListElement{ xPos: -1.15 ; yPos: 0.36 ; zPos: 0.45 }
+ ListElement{ xPos: -2.25 ; yPos: 0.04 ; zPos: 0.65 }
+ ListElement{ xPos: -1.85 ; yPos: -0.96 ; zPos: 4.25 }
+ ListElement{ xPos: 1.5 ; yPos: 0.04 ; zPos: -3.85 }
+ ListElement{ xPos: 0.05 ; yPos: 0.68 ; zPos: -2.45 }
+ ListElement{ xPos: -0.1 ; yPos: -0.48 ; zPos: 1.9 }
+ ListElement{ xPos: 2.1 ; yPos: -1.52 ; zPos: -4 }
+ ListElement{ xPos: 3.4 ; yPos: 0 ; zPos: -2.05 }
+ ListElement{ xPos: 0.7 ; yPos: 2.68 ; zPos: -0.85 }
+ ListElement{ xPos: 1.6 ; yPos: 1.68 ; zPos: -0.8 }
+ ListElement{ xPos: 2.1 ; yPos: -2.44 ; zPos: 1.2 }
+ ListElement{ xPos: -0.15 ; yPos: -1.88 ; zPos: -0.35 }
+ ListElement{ xPos: -0.35 ; yPos: 1.76 ; zPos: 1.6 }
+ ListElement{ xPos: -2.15 ; yPos: 0.08 ; zPos: 0.75 }
+ ListElement{ xPos: -0.15 ; yPos: -3.36 ; zPos: 0.35 }
+ ListElement{ xPos: 2.7 ; yPos: -2.84 ; zPos: 0.35 }
+ ListElement{ xPos: -1.35 ; yPos: 0 ; zPos: -0.5 }
+ ListElement{ xPos: -0.35 ; yPos: -2.56 ; zPos: -0.9 }
+ ListElement{ xPos: -2.75 ; yPos: -3.56 ; zPos: 1.55 }
+ ListElement{ xPos: -2.5 ; yPos: -0.68 ; zPos: 2.7 }
+ ListElement{ xPos: 1.35 ; yPos: 0.6 ; zPos: -2.2 }
+ ListElement{ xPos: -1.3 ; yPos: -0.24 ; zPos: -1.65 }
+ ListElement{ xPos: -1.4 ; yPos: -1.44 ; zPos: 4.45 }
+ ListElement{ xPos: -1.8 ; yPos: 3.64 ; zPos: 2.05 }
+ ListElement{ xPos: -0.65 ; yPos: 0.08 ; zPos: 3.9 }
+ ListElement{ xPos: 2.25 ; yPos: 2.96 ; zPos: -2.35 }
+ ListElement{ xPos: 1.3 ; yPos: 1.64 ; zPos: -0.05 }
+ ListElement{ xPos: 1.75 ; yPos: 2.24 ; zPos: -2.85 }
+ ListElement{ xPos: -0.05 ; yPos: -1.56 ; zPos: -0.05 }
+ ListElement{ xPos: -3.85 ; yPos: -0.8 ; zPos: -0.3 }
+ ListElement{ xPos: 0.95 ; yPos: 0.32 ; zPos: -2.5 }
+ ListElement{ xPos: -2.4 ; yPos: 0.4 ; zPos: -3.55 }
+ ListElement{ xPos: 3.7 ; yPos: 2.36 ; zPos: 3.6 }
+ ListElement{ xPos: 0.55 ; yPos: 0.88 ; zPos: 3.15 }
+ ListElement{ xPos: -1 ; yPos: -1.36 ; zPos: -2.1 }
+ ListElement{ xPos: 2.05 ; yPos: 0.44 ; zPos: -0.8 }
+ ListElement{ xPos: -4.75 ; yPos: 1.8 ; zPos: -1.7 }
+ ListElement{ xPos: 0.15 ; yPos: 2.64 ; zPos: -2.2 }
+ ListElement{ xPos: -2.05 ; yPos: -2.56 ; zPos: 1.15 }
+ ListElement{ xPos: -3.7 ; yPos: 2.12 ; zPos: 1.3 }
+ ListElement{ xPos: 1.05 ; yPos: 0 ; zPos: 4 }
+ ListElement{ xPos: -0.7 ; yPos: -0.88 ; zPos: 1.35 }
+ ListElement{ xPos: 0.95 ; yPos: -1.84 ; zPos: 0.1 }
+ ListElement{ xPos: 0.75 ; yPos: 1.16 ; zPos: 4.25 }
+ ListElement{ xPos: -1.3 ; yPos: 0.72 ; zPos: 0.65 }
+ ListElement{ xPos: 3 ; yPos: -0.08 ; zPos: -1.75 }
+ ListElement{ xPos: 2.85 ; yPos: -0.68 ; zPos: 0.65 }
+ ListElement{ xPos: -0.4 ; yPos: 3.04 ; zPos: -2.35 }
+ ListElement{ xPos: 3.05 ; yPos: -0.6 ; zPos: -0.6 }
+ ListElement{ xPos: -0.85 ; yPos: -0.44 ; zPos: 0.35 }
+ ListElement{ xPos: 0 ; yPos: -1.92 ; zPos: 0 }
+ ListElement{ xPos: -1.25 ; yPos: -1.44 ; zPos: 1.9 }
+ ListElement{ xPos: -1.6 ; yPos: 0.04 ; zPos: -0.7 }
+ ListElement{ xPos: 1.45 ; yPos: -1 ; zPos: -3.4 }
+ ListElement{ xPos: -2.8 ; yPos: -1.24 ; zPos: -3 }
+ ListElement{ xPos: 0.2 ; yPos: -0.68 ; zPos: -3.7 }
+ ListElement{ xPos: 3.35 ; yPos: 0.68 ; zPos: -1.9 }
+ ListElement{ xPos: -2.3 ; yPos: 1.08 ; zPos: -1 }
+ ListElement{ xPos: 1.5 ; yPos: 1.8 ; zPos: -1.2 }
+ ListElement{ xPos: 1.55 ; yPos: 3.64 ; zPos: 1.35 }
+ ListElement{ xPos: 1.15 ; yPos: -1.36 ; zPos: 0.75 }
+ ListElement{ xPos: -1.95 ; yPos: 0.08 ; zPos: -0.85 }
+ ListElement{ xPos: -2.25 ; yPos: -0.52 ; zPos: 1.05 }
+ ListElement{ xPos: -2.6 ; yPos: -1.32 ; zPos: 1.05 }
+ ListElement{ xPos: -0.4 ; yPos: -1.52 ; zPos: 2.45 }
+ ListElement{ xPos: -0.05 ; yPos: 0.64 ; zPos: -2.85 }
+ ListElement{ xPos: 4.45 ; yPos: -0.24 ; zPos: -0.15 }
+ ListElement{ xPos: 3.45 ; yPos: 1.72 ; zPos: -1.1 }
+ ListElement{ xPos: 3.3 ; yPos: -1.72 ; zPos: -0.25 }
+ ListElement{ xPos: 1.7 ; yPos: 2.76 ; zPos: 2 }
+ ListElement{ xPos: 2.1 ; yPos: -2.88 ; zPos: -1.75 }
+ ListElement{ xPos: -3.7 ; yPos: -0.04 ; zPos: 0.25 }
+ ListElement{ xPos: -0.45 ; yPos: -3 ; zPos: -2.95 }
+ ListElement{ xPos: 3.1 ; yPos: -2.32 ; zPos: 0.1 }
+ ListElement{ xPos: 0.7 ; yPos: -2.88 ; zPos: -3.45 }
+ ListElement{ xPos: 2.9 ; yPos: 0.4 ; zPos: -0.65 }
+ ListElement{ xPos: -1.8 ; yPos: -2.48 ; zPos: -3.5 }
+ ListElement{ xPos: 1.65 ; yPos: 3.16 ; zPos: 2.15 }
+ ListElement{ xPos: -1.25 ; yPos: -0.76 ; zPos: 2.15 }
+ ListElement{ xPos: 3.55 ; yPos: 0.28 ; zPos: 2.4 }
+ ListElement{ xPos: 0.25 ; yPos: 0.52 ; zPos: 2.3 }
+ ListElement{ xPos: -1.7 ; yPos: -1.36 ; zPos: -2.5 }
+ ListElement{ xPos: 3.8 ; yPos: 1.04 ; zPos: 0.45 }
+ ListElement{ xPos: 2.45 ; yPos: -0.72 ; zPos: -4.05 }
+ ListElement{ xPos: -0.85 ; yPos: 0.16 ; zPos: -0.55 }
+ ListElement{ xPos: 0.65 ; yPos: 0.52 ; zPos: 3.3 }
+ ListElement{ xPos: 0.85 ; yPos: -0.08 ; zPos: 0.6 }
+ ListElement{ xPos: -0.1 ; yPos: 1.12 ; zPos: -3.15 }
+ ListElement{ xPos: -2.95 ; yPos: 0.24 ; zPos: 0.8 }
+ ListElement{ xPos: 0.2 ; yPos: -0.6 ; zPos: -0.45 }
+ ListElement{ xPos: 0.15 ; yPos: 2.52 ; zPos: 1.5 }
+ ListElement{ xPos: 0.65 ; yPos: -1.4 ; zPos: -1.5 }
+ ListElement{ xPos: 4.75 ; yPos: 1.76 ; zPos: 1.15 }
+ ListElement{ xPos: -1.75 ; yPos: -1.44 ; zPos: -3.6 }
+ ListElement{ xPos: 0.85 ; yPos: 0.04 ; zPos: -0.3 }
+ ListElement{ xPos: -0.55 ; yPos: -0.28 ; zPos: -1.85 }
+ ListElement{ xPos: -4.05 ; yPos: 0.52 ; zPos: -2.35 }
+ ListElement{ xPos: -0.35 ; yPos: -0.96 ; zPos: 0.8 }
+ ListElement{ xPos: -1.8 ; yPos: -0.04 ; zPos: 0.05 }
+ ListElement{ xPos: -2 ; yPos: 0.12 ; zPos: -2.5 }
+ ListElement{ xPos: -1.85 ; yPos: -1.04 ; zPos: -1.2 }
+ ListElement{ xPos: -1 ; yPos: -3.44 ; zPos: -1 }
+ ListElement{ xPos: 2.25 ; yPos: 0.16 ; zPos: -0.05 }
+ ListElement{ xPos: -1.3 ; yPos: 0.24 ; zPos: -1.5 }
+ ListElement{ xPos: -0.05 ; yPos: -0.48 ; zPos: 1.7 }
+ ListElement{ xPos: -2.5 ; yPos: 0.28 ; zPos: -2.1 }
+ ListElement{ xPos: 3.9 ; yPos: -0.44 ; zPos: -0.85 }
+ ListElement{ xPos: -0.3 ; yPos: -1.96 ; zPos: 1.3 }
+ ListElement{ xPos: 1.35 ; yPos: 2.92 ; zPos: -1.15 }
+ ListElement{ xPos: -2.2 ; yPos: -2.2 ; zPos: -0.45 }
+ ListElement{ xPos: -0.2 ; yPos: -0.12 ; zPos: 0.15 }
+ ListElement{ xPos: 0.7 ; yPos: 1.4 ; zPos: -3 }
+ ListElement{ xPos: -0.3 ; yPos: 3.16 ; zPos: 2.65 }
+ ListElement{ xPos: -1.1 ; yPos: -1.44 ; zPos: 0.45 }
+ ListElement{ xPos: 0.25 ; yPos: -1.04 ; zPos: 4.3 }
+ ListElement{ xPos: -2.2 ; yPos: -2.48 ; zPos: 0.4 }
+ ListElement{ xPos: 0.95 ; yPos: -3.4 ; zPos: -1.2 }
+ ListElement{ xPos: 2.75 ; yPos: -1.6 ; zPos: -1.95 }
+ ListElement{ xPos: 0.75 ; yPos: -1.84 ; zPos: -0.15 }
+ ListElement{ xPos: -0.75 ; yPos: -1.84 ; zPos: 0.35 }
+ ListElement{ xPos: -2.85 ; yPos: -2.12 ; zPos: -0.95 }
+ ListElement{ xPos: -0.8 ; yPos: -2.84 ; zPos: -0.15 }
+ ListElement{ xPos: -1.95 ; yPos: -0.44 ; zPos: 2.1 }
+ ListElement{ xPos: -1.05 ; yPos: -2.48 ; zPos: -1.25 }
+ ListElement{ xPos: -2.6 ; yPos: -1.48 ; zPos: 0.8 }
+ ListElement{ xPos: 2.5 ; yPos: -1.08 ; zPos: 1.9 }
+ ListElement{ xPos: 0.45 ; yPos: 2.52 ; zPos: 0.45 }
+ ListElement{ xPos: 1.55 ; yPos: -0.16 ; zPos: 0.25 }
+ ListElement{ xPos: -2.9 ; yPos: 0.36 ; zPos: 0.35 }
+ ListElement{ xPos: 2.95 ; yPos: -1.56 ; zPos: -2.7 }
+ ListElement{ xPos: 3.4 ; yPos: -1.76 ; zPos: 3.05 }
+ ListElement{ xPos: 1.75 ; yPos: -2.84 ; zPos: 0.5 }
+ ListElement{ xPos: -0.95 ; yPos: 0.64 ; zPos: 1.1 }
+ ListElement{ xPos: 2 ; yPos: 2.04 ; zPos: 0.1 }
+ ListElement{ xPos: -0.15 ; yPos: -0.08 ; zPos: -0.9 }
+ ListElement{ xPos: 2.2 ; yPos: -1.2 ; zPos: 2.8 }
+ ListElement{ xPos: -0.8 ; yPos: 2.68 ; zPos: -0.3 }
+ ListElement{ xPos: 3.4 ; yPos: 0.84 ; zPos: -2.65 }
+ ListElement{ xPos: -0.25 ; yPos: -0.24 ; zPos: 0.45 }
+ ListElement{ xPos: 2.7 ; yPos: 1.64 ; zPos: -1.95 }
+ ListElement{ xPos: 1.35 ; yPos: -2.96 ; zPos: 0.65 }
+ ListElement{ xPos: -1.45 ; yPos: -0.2 ; zPos: 0.8 }
+ ListElement{ xPos: 1.45 ; yPos: 1.64 ; zPos: -3.45 }
+ ListElement{ xPos: -1.1 ; yPos: 3.08 ; zPos: 1.1 }
+ ListElement{ xPos: 0.8 ; yPos: 1.88 ; zPos: -2.1 }
+ ListElement{ xPos: 1.15 ; yPos: 3.04 ; zPos: -0.75 }
+ ListElement{ xPos: -0.45 ; yPos: 1.36 ; zPos: -0.15 }
+ ListElement{ xPos: -2.8 ; yPos: -1.24 ; zPos: 2.55 }
+ ListElement{ xPos: 4.4 ; yPos: 2.04 ; zPos: 1.25 }
+ ListElement{ xPos: -0.95 ; yPos: 1.24 ; zPos: 3.65 }
+ ListElement{ xPos: 3.45 ; yPos: 1.32 ; zPos: 2.5 }
+ ListElement{ xPos: -3 ; yPos: 1.12 ; zPos: -1.2 }
+ ListElement{ xPos: -2.45 ; yPos: 0.68 ; zPos: 4.35 }
+ ListElement{ xPos: 0.55 ; yPos: -0.12 ; zPos: -3.95 }
+ ListElement{ xPos: -0.35 ; yPos: 3.08 ; zPos: -0.3 }
+ ListElement{ xPos: 1.35 ; yPos: -2.92 ; zPos: -3.3 }
+ ListElement{ xPos: 0.5 ; yPos: -0.2 ; zPos: 0.95 }
+ ListElement{ xPos: 1.2 ; yPos: -0.24 ; zPos: -0.75 }
+ ListElement{ xPos: -1.2 ; yPos: 2.16 ; zPos: 3.35 }
+ ListElement{ xPos: -3.35 ; yPos: 2.36 ; zPos: 3.45 }
+ ListElement{ xPos: 0.95 ; yPos: -0.88 ; zPos: 1.25 }
+ ListElement{ xPos: 0.1 ; yPos: 1.24 ; zPos: 0 }
+ ListElement{ xPos: 1.8 ; yPos: 1.56 ; zPos: -1.05 }
+ ListElement{ xPos: -1.35 ; yPos: 3.8 ; zPos: -1.45 }
+ ListElement{ xPos: 1.45 ; yPos: -2.64 ; zPos: 0.5 }
+ ListElement{ xPos: 2.05 ; yPos: 1.16 ; zPos: 1.4 }
+ ListElement{ xPos: 2.9 ; yPos: -2.4 ; zPos: 0.15 }
+ ListElement{ xPos: -1.1 ; yPos: 0.76 ; zPos: -1.65 }
+ ListElement{ xPos: -2.5 ; yPos: -2.4 ; zPos: 1.05 }
+ ListElement{ xPos: 3.55 ; yPos: -1.8 ; zPos: -2.55 }
+ ListElement{ xPos: -0.8 ; yPos: 1.24 ; zPos: -3.75 }
+ ListElement{ xPos: -1.35 ; yPos: -2.48 ; zPos: 2.85 }
+ ListElement{ xPos: -2.1 ; yPos: 1.48 ; zPos: -0.15 }
+ ListElement{ xPos: -0.45 ; yPos: 2.68 ; zPos: 2.85 }
+ ListElement{ xPos: 0.8 ; yPos: 1.4 ; zPos: -3.35 }
+ ListElement{ xPos: -2.2 ; yPos: -2.24 ; zPos: 0.35 }
+ ListElement{ xPos: 1.4 ; yPos: -2.32 ; zPos: 0.55 }
+ ListElement{ xPos: 3.65 ; yPos: 1.12 ; zPos: -4.5 }
+ ListElement{ xPos: 0.1 ; yPos: -0.68 ; zPos: 1.85 }
+ ListElement{ xPos: -1.95 ; yPos: -0.56 ; zPos: -2.05 }
+ ListElement{ xPos: 1.85 ; yPos: 1.32 ; zPos: -4.4 }
+ ListElement{ xPos: -0.6 ; yPos: 0.64 ; zPos: -0.3 }
+ ListElement{ xPos: -1.55 ; yPos: 1.52 ; zPos: -3.75 }
+ ListElement{ xPos: 1.85 ; yPos: 0.48 ; zPos: 0.65 }
+ ListElement{ xPos: 3.35 ; yPos: 2.52 ; zPos: 1.9 }
+ ListElement{ xPos: 0.4 ; yPos: 1.4 ; zPos: -1.3 }
+ ListElement{ xPos: -2.7 ; yPos: 0.84 ; zPos: 1.6 }
+ ListElement{ xPos: -0.5 ; yPos: 1 ; zPos: 0.4 }
+ ListElement{ xPos: 2.25 ; yPos: -1 ; zPos: 1.25 }
+ ListElement{ xPos: 1.7 ; yPos: 2.4 ; zPos: -0.95 }
+ ListElement{ xPos: -3.55 ; yPos: 1.04 ; zPos: 3.95 }
+ ListElement{ xPos: 0.9 ; yPos: 1.28 ; zPos: 2.05 }
+ ListElement{ xPos: -3.15 ; yPos: 1.96 ; zPos: -0.3 }
+ ListElement{ xPos: 1.35 ; yPos: -0.92 ; zPos: -1 }
+ ListElement{ xPos: -3.1 ; yPos: -3.08 ; zPos: 0.9 }
+ ListElement{ xPos: 1.25 ; yPos: -2.44 ; zPos: 2.25 }
+ ListElement{ xPos: -3.8 ; yPos: 0.76 ; zPos: -1.05 }
+ ListElement{ xPos: -1.05 ; yPos: -3.8 ; zPos: -0.8 }
+ ListElement{ xPos: -4 ; yPos: 1.24 ; zPos: -2.6 }
+ ListElement{ xPos: 2.45 ; yPos: -1.84 ; zPos: 0.35 }
+ ListElement{ xPos: -1.5 ; yPos: 2.16 ; zPos: 4.3 }
+ ListElement{ xPos: 2.1 ; yPos: -1.8 ; zPos: -0.95 }
+ ListElement{ xPos: -1.8 ; yPos: -0.2 ; zPos: 0.2 }
+ ListElement{ xPos: 0.75 ; yPos: 1.04 ; zPos: -1.3 }
+ ListElement{ xPos: 2.85 ; yPos: 1.6 ; zPos: -2.05 }
+ ListElement{ xPos: -2 ; yPos: -0.2 ; zPos: -2.15 }
+ ListElement{ xPos: 1.75 ; yPos: 2.28 ; zPos: 0.75 }
+ ListElement{ xPos: 1.95 ; yPos: -0.68 ; zPos: -2.3 }
+ ListElement{ xPos: -0.8 ; yPos: 1.08 ; zPos: 1.65 }
+ ListElement{ xPos: -1.85 ; yPos: 1.8 ; zPos: -0.75 }
+ ListElement{ xPos: -3.05 ; yPos: 2.44 ; zPos: 0.35 }
+ ListElement{ xPos: -0.4 ; yPos: -3 ; zPos: -2.85 }
+ ListElement{ xPos: -0.95 ; yPos: 0.64 ; zPos: 2.15 }
+ ListElement{ xPos: -1.35 ; yPos: -0.2 ; zPos: -0.8 }
+ ListElement{ xPos: 2.1 ; yPos: -0.04 ; zPos: 0.65 }
+ ListElement{ xPos: 2.6 ; yPos: 0.2 ; zPos: 2.75 }
+ ListElement{ xPos: 1.65 ; yPos: -0.16 ; zPos: 1.65 }
+ ListElement{ xPos: -1.85 ; yPos: 0.68 ; zPos: 1.95 }
+ ListElement{ xPos: -3.05 ; yPos: -2.28 ; zPos: 0.1 }
+ ListElement{ xPos: 3.4 ; yPos: -1.88 ; zPos: 3 }
+ ListElement{ xPos: -0.75 ; yPos: 0.36 ; zPos: 1.5 }
+ ListElement{ xPos: 2.9 ; yPos: -1 ; zPos: -1.85 }
+ ListElement{ xPos: 0.4 ; yPos: 1.08 ; zPos: 0.8 }
+ ListElement{ xPos: -1.05 ; yPos: 1.04 ; zPos: 2.15 }
+ ListElement{ xPos: 2.6 ; yPos: -2.08 ; zPos: -0.1 }
+ ListElement{ xPos: 0 ; yPos: -2.84 ; zPos: -0.95 }
+ ListElement{ xPos: 0.4 ; yPos: 1.88 ; zPos: 2.05 }
+ ListElement{ xPos: -3.1 ; yPos: -2.76 ; zPos: -2.75 }
+ ListElement{ xPos: -2.65 ; yPos: 3.52 ; zPos: -1.2 }
+ ListElement{ xPos: -4.3 ; yPos: -0.28 ; zPos: 3 }
+ ListElement{ xPos: -2.8 ; yPos: -2.56 ; zPos: -2.85 }
+ ListElement{ xPos: -0.15 ; yPos: 2.72 ; zPos: -2.8 }
+ ListElement{ xPos: -0.95 ; yPos: -0.6 ; zPos: 1.05 }
+ ListElement{ xPos: 1.9 ; yPos: 2.56 ; zPos: 1.25 }
+ ListElement{ xPos: -0.85 ; yPos: 0.24 ; zPos: 0.05 }
+ ListElement{ xPos: 2.4 ; yPos: 2.56 ; zPos: -1.2 }
+ ListElement{ xPos: 2.35 ; yPos: -1.08 ; zPos: 2.7 }
+ ListElement{ xPos: -2.1 ; yPos: -0.76 ; zPos: 2.8 }
+ ListElement{ xPos: 1.4 ; yPos: 1 ; zPos: 2.35 }
+ ListElement{ xPos: -0.9 ; yPos: 1.72 ; zPos: 4.1 }
+ ListElement{ xPos: 3.7 ; yPos: -1.4 ; zPos: 2.05 }
+ ListElement{ xPos: -0.25 ; yPos: 0.76 ; zPos: -1.4 }
+ ListElement{ xPos: -1.6 ; yPos: 0.32 ; zPos: 0.05 }
+ ListElement{ xPos: 2.5 ; yPos: -3.08 ; zPos: 0.85 }
+ ListElement{ xPos: 0.05 ; yPos: -1.96 ; zPos: 1.55 }
+ ListElement{ xPos: -3.7 ; yPos: 0.84 ; zPos: -0.25 }
+ ListElement{ xPos: 2.35 ; yPos: 0.6 ; zPos: -1.5 }
+ ListElement{ xPos: 1.1 ; yPos: 2.64 ; zPos: -1.45 }
+ ListElement{ xPos: 2.55 ; yPos: -1.56 ; zPos: 2.05 }
+ ListElement{ xPos: -2.15 ; yPos: 3.56 ; zPos: 3.25 }
+ ListElement{ xPos: -0.55 ; yPos: -1.24 ; zPos: 2.65 }
+ ListElement{ xPos: -0.3 ; yPos: 1.32 ; zPos: 0.85 }
+ ListElement{ xPos: -1.9 ; yPos: 1.24 ; zPos: 1.15 }
+ ListElement{ xPos: 0.35 ; yPos: -2.44 ; zPos: -1.35 }
+ ListElement{ xPos: 2.9 ; yPos: -1.08 ; zPos: -4.3 }
+ ListElement{ xPos: 1.8 ; yPos: -0.44 ; zPos: 1.25 }
+ ListElement{ xPos: -0.6 ; yPos: -1.08 ; zPos: -0.6 }
+ ListElement{ xPos: -0.3 ; yPos: -0.88 ; zPos: -1.45 }
+ ListElement{ xPos: -1 ; yPos: 2.12 ; zPos: 2.3 }
+ ListElement{ xPos: 3.15 ; yPos: 0.52 ; zPos: -2.8 }
+ ListElement{ xPos: 0.45 ; yPos: 2.48 ; zPos: -1.3 }
+ ListElement{ xPos: 0.5 ; yPos: -0.84 ; zPos: 0.7 }
+ ListElement{ xPos: -0.6 ; yPos: -0.44 ; zPos: -1.35 }
+ ListElement{ xPos: -1.7 ; yPos: -0.12 ; zPos: -2.55 }
+ ListElement{ xPos: -0.5 ; yPos: 0.52 ; zPos: 1.4 }
+ ListElement{ xPos: 4 ; yPos: -1.68 ; zPos: -0.1 }
+ ListElement{ xPos: 1.4 ; yPos: -1.64 ; zPos: 1.35 }
+ ListElement{ xPos: 0.05 ; yPos: 0.28 ; zPos: -2.2 }
+ ListElement{ xPos: 1.55 ; yPos: -1.2 ; zPos: 0.45 }
+ ListElement{ xPos: 3.1 ; yPos: 3.64 ; zPos: 1.45 }
+ ListElement{ xPos: -1.55 ; yPos: 2.16 ; zPos: 0.15 }
+ ListElement{ xPos: 3.9 ; yPos: -2.56 ; zPos: -1.25 }
+ ListElement{ xPos: 4.15 ; yPos: 0.64 ; zPos: 2.65 }
+ ListElement{ xPos: -2.8 ; yPos: 0.56 ; zPos: -1.35 }
+ ListElement{ xPos: 1.3 ; yPos: 1.28 ; zPos: 0.8 }
+ ListElement{ xPos: -2.3 ; yPos: -3.08 ; zPos: 1.2 }
+ ListElement{ xPos: 0.5 ; yPos: -0.36 ; zPos: -2.4 }
+ ListElement{ xPos: 0.6 ; yPos: 0.52 ; zPos: 2.75 }
+ ListElement{ xPos: 3.9 ; yPos: -0.52 ; zPos: -4.25 }
+ ListElement{ xPos: -0.5 ; yPos: 1.28 ; zPos: -0.05 }
+ ListElement{ xPos: -0.25 ; yPos: -3.84 ; zPos: 3.15 }
+ ListElement{ xPos: -0.9 ; yPos: -1.72 ; zPos: -3.15 }
+ ListElement{ xPos: 0.85 ; yPos: 0.84 ; zPos: -1.7 }
+ ListElement{ xPos: -3.35 ; yPos: 0.72 ; zPos: 2.15 }
+ ListElement{ xPos: -1.6 ; yPos: 0.6 ; zPos: 1.65 }
+ ListElement{ xPos: -3.6 ; yPos: 0.8 ; zPos: 2.6 }
+ ListElement{ xPos: -0.7 ; yPos: 1.96 ; zPos: -0.9 }
+ ListElement{ xPos: -2.4 ; yPos: 1.32 ; zPos: -2.75 }
+ ListElement{ xPos: -1.75 ; yPos: 0.72 ; zPos: -0.85 }
+ ListElement{ xPos: -2.7 ; yPos: 0.6 ; zPos: -2.5 }
+ ListElement{ xPos: -2.2 ; yPos: -3.4 ; zPos: -1.85 }
+ ListElement{ xPos: 0.85 ; yPos: 2.2 ; zPos: -3.75 }
+ ListElement{ xPos: -3.85 ; yPos: 2.44 ; zPos: 4.3 }
+ ListElement{ xPos: -3.65 ; yPos: 0.52 ; zPos: 0.2 }
+ ListElement{ xPos: -4.35 ; yPos: -0.52 ; zPos: 1.5 }
+ ListElement{ xPos: 1.45 ; yPos: -0.08 ; zPos: -0.4 }
+ ListElement{ xPos: 1.85 ; yPos: -0.76 ; zPos: -4.6 }
+ ListElement{ xPos: 0.95 ; yPos: 0.52 ; zPos: -1 }
+ ListElement{ xPos: -2.5 ; yPos: -0.88 ; zPos: -0.3 }
+ ListElement{ xPos: -2.9 ; yPos: 1.68 ; zPos: -1.15 }
+ ListElement{ xPos: -3.2 ; yPos: 0.2 ; zPos: 1.1 }
+ ListElement{ xPos: 0.9 ; yPos: -0.2 ; zPos: 0.7 }
+ ListElement{ xPos: 3.6 ; yPos: 1.08 ; zPos: -2.15 }
+ ListElement{ xPos: -0.8 ; yPos: 1.72 ; zPos: 2.85 }
+ ListElement{ xPos: 0.3 ; yPos: 1.76 ; zPos: 0.9 }
+ ListElement{ xPos: -1.3 ; yPos: -0.56 ; zPos: -2.3 }
+ ListElement{ xPos: -2.8 ; yPos: 0.4 ; zPos: 4.2 }
+ ListElement{ xPos: 1 ; yPos: -0.32 ; zPos: 0.35 }
+ ListElement{ xPos: -0.6 ; yPos: -0.24 ; zPos: 4.05 }
+ ListElement{ xPos: -2 ; yPos: -1.84 ; zPos: -2.2 }
+ ListElement{ xPos: -1.95 ; yPos: -0.8 ; zPos: 1.85 }
+ ListElement{ xPos: -0.05 ; yPos: -0.16 ; zPos: 3.85 }
+ ListElement{ xPos: 0.15 ; yPos: -2.64 ; zPos: 1.7 }
+ ListElement{ xPos: -3.85 ; yPos: 1.4 ; zPos: 0.1 }
+ ListElement{ xPos: 0.25 ; yPos: 1 ; zPos: -2.45 }
+ ListElement{ xPos: -4.1 ; yPos: 0 ; zPos: -0.1 }
+ ListElement{ xPos: -1.4 ; yPos: -0.32 ; zPos: -0.8 }
+ ListElement{ xPos: -1.9 ; yPos: -1.84 ; zPos: -3 }
+ ListElement{ xPos: 0.35 ; yPos: 1.32 ; zPos: -3.95 }
+ ListElement{ xPos: -2.6 ; yPos: -1.04 ; zPos: 4.25 }
+ ListElement{ xPos: -3.1 ; yPos: -0.96 ; zPos: -1.65 }
+ ListElement{ xPos: -0.55 ; yPos: -1.16 ; zPos: 4.05 }
+ ListElement{ xPos: -3.1 ; yPos: -1 ; zPos: -0.5 }
+ ListElement{ xPos: 2.25 ; yPos: 1.24 ; zPos: 3.4 }
+ ListElement{ xPos: -1.2 ; yPos: -1.24 ; zPos: -4.05 }
+ ListElement{ xPos: 3.05 ; yPos: 1.92 ; zPos: 1 }
+ ListElement{ xPos: 0.55 ; yPos: -2.76 ; zPos: -3.25 }
+ ListElement{ xPos: -2.05 ; yPos: 1.6 ; zPos: 0.6 }
+ ListElement{ xPos: -0.45 ; yPos: 0.12 ; zPos: -0.15 }
+ ListElement{ xPos: 2.1 ; yPos: 2.96 ; zPos: 1.1 }
+ ListElement{ xPos: 0.05 ; yPos: -2.08 ; zPos: -0.7 }
+ ListElement{ xPos: -3.15 ; yPos: 1.08 ; zPos: -0.1 }
+ ListElement{ xPos: -1.95 ; yPos: 0.44 ; zPos: 0.6 }
+ ListElement{ xPos: 0.15 ; yPos: -0.32 ; zPos: 2.85 }
+ ListElement{ xPos: 0.55 ; yPos: 1 ; zPos: 0.55 }
+ ListElement{ xPos: -2.05 ; yPos: 1.84 ; zPos: -1 }
+ ListElement{ xPos: -0.25 ; yPos: 0.36 ; zPos: 1.2 }
+ ListElement{ xPos: 4.6 ; yPos: -0.2 ; zPos: 0.6 }
+ ListElement{ xPos: -1.95 ; yPos: -0.8 ; zPos: 0.05 }
+ ListElement{ xPos: -0.35 ; yPos: -1.04 ; zPos: 0.8 }
+ ListElement{ xPos: 0.7 ; yPos: 3.04 ; zPos: -3.55 }
+ ListElement{ xPos: -0.15 ; yPos: 1.12 ; zPos: -2.5 }
+ ListElement{ xPos: -0.5 ; yPos: -1.68 ; zPos: 1.5 }
+ ListElement{ xPos: 1 ; yPos: -0.44 ; zPos: -1.5 }
+ ListElement{ xPos: 4.05 ; yPos: -1.32 ; zPos: 2.85 }
+ ListElement{ xPos: 1.6 ; yPos: -1.56 ; zPos: 2.15 }
+ ListElement{ xPos: 0.3 ; yPos: -1.16 ; zPos: 1.25 }
+ ListElement{ xPos: -2.65 ; yPos: -1.28 ; zPos: 0.45 }
+ ListElement{ xPos: 0 ; yPos: 1.52 ; zPos: -1.35 }
+ ListElement{ xPos: 1.3 ; yPos: 1.68 ; zPos: -2.75 }
+ ListElement{ xPos: 1.25 ; yPos: 0.4 ; zPos: 0.3 }
+ ListElement{ xPos: -0.95 ; yPos: 3.68 ; zPos: 1.75 }
+ ListElement{ xPos: -3.55 ; yPos: 0.48 ; zPos: 1.15 }
+ ListElement{ xPos: -1.7 ; yPos: -2.64 ; zPos: -3.3 }
+ ListElement{ xPos: -2.2 ; yPos: -2.4 ; zPos: 1.05 }
+ ListElement{ xPos: 0.1 ; yPos: 0.44 ; zPos: -1.05 }
+ ListElement{ xPos: 2.05 ; yPos: 0.4 ; zPos: 0.8 }
+ ListElement{ xPos: 0.4 ; yPos: 0.04 ; zPos: 4.2 }
+ ListElement{ xPos: -1.25 ; yPos: 0.76 ; zPos: 0.45 }
+ ListElement{ xPos: 1.6 ; yPos: 2.04 ; zPos: -2.95 }
+ ListElement{ xPos: -2.05 ; yPos: -0.44 ; zPos: 1.35 }
+ ListElement{ xPos: -3.25 ; yPos: 0.44 ; zPos: 2.15 }
+ ListElement{ xPos: -1.75 ; yPos: 0.04 ; zPos: 2.35 }
+ ListElement{ xPos: -4.15 ; yPos: 0.68 ; zPos: 0.8 }
+ ListElement{ xPos: -1.6 ; yPos: 1.12 ; zPos: 0.55 }
+ ListElement{ xPos: -0.15 ; yPos: 3.4 ; zPos: 3.05 }
+ ListElement{ xPos: -0.2 ; yPos: 0.04 ; zPos: -1.45 }
+ ListElement{ xPos: 2.9 ; yPos: -0.36 ; zPos: 1.45 }
+ ListElement{ xPos: -1.4 ; yPos: 1.56 ; zPos: 1 }
+ ListElement{ xPos: 3.4 ; yPos: -1.2 ; zPos: -4.2 }
+ ListElement{ xPos: -1.1 ; yPos: 0.6 ; zPos: 1.55 }
+ ListElement{ xPos: -0.35 ; yPos: 1.52 ; zPos: -0.35 }
+ ListElement{ xPos: 0.3 ; yPos: 0.96 ; zPos: 1.8 }
+ ListElement{ xPos: 2.5 ; yPos: -1.84 ; zPos: 1.65 }
+ ListElement{ xPos: -0.6 ; yPos: 2.24 ; zPos: -2.9 }
+ ListElement{ xPos: -0.25 ; yPos: -2.32 ; zPos: -0.7 }
+ ListElement{ xPos: 3.35 ; yPos: -2.24 ; zPos: 1.5 }
+ ListElement{ xPos: 1.6 ; yPos: 1.96 ; zPos: 3.9 }
+ ListElement{ xPos: 1.8 ; yPos: 0.68 ; zPos: -1.55 }
+ ListElement{ xPos: 2.7 ; yPos: 1.76 ; zPos: -2.9 }
+ ListElement{ xPos: -2.35 ; yPos: -0.6 ; zPos: -3.9 }
+ ListElement{ xPos: -1.85 ; yPos: 1.96 ; zPos: -1.2 }
+ ListElement{ xPos: -4.05 ; yPos: 1.12 ; zPos: -2.75 }
+ ListElement{ xPos: -2.85 ; yPos: -1.36 ; zPos: 0.65 }
+ ListElement{ xPos: -1.75 ; yPos: 2.12 ; zPos: -1.35 }
+ ListElement{ xPos: -2.95 ; yPos: -0.08 ; zPos: 3.65 }
+ ListElement{ xPos: -2.4 ; yPos: 2 ; zPos: 4.5 }
+ ListElement{ xPos: -0.05 ; yPos: 0.04 ; zPos: 0.35 }
+ ListElement{ xPos: -3.2 ; yPos: 0.16 ; zPos: 1.1 }
+ ListElement{ xPos: 3 ; yPos: 2.32 ; zPos: 1.3 }
+ ListElement{ xPos: 4.9 ; yPos: -1.88 ; zPos: 0.45 }
+ ListElement{ xPos: -2.35 ; yPos: -1.44 ; zPos: -0.7 }
+ ListElement{ xPos: 2.4 ; yPos: -0.6 ; zPos: 0.1 }
+ ListElement{ xPos: 1 ; yPos: 1.6 ; zPos: 1 }
+ ListElement{ xPos: 1.3 ; yPos: -0.4 ; zPos: -0.4 }
+ ListElement{ xPos: -0.9 ; yPos: -2.72 ; zPos: -3.6 }
+ ListElement{ xPos: 1.2 ; yPos: -0.44 ; zPos: 2.1 }
+ ListElement{ xPos: 0.65 ; yPos: 3 ; zPos: -1.55 }
+ ListElement{ xPos: -1.55 ; yPos: -2.64 ; zPos: 0.55 }
+ ListElement{ xPos: 1.9 ; yPos: -0.32 ; zPos: -2.1 }
+ ListElement{ xPos: 1.35 ; yPos: -2.84 ; zPos: -0.4 }
+ ListElement{ xPos: 0.25 ; yPos: -2.68 ; zPos: -0.2 }
+ ListElement{ xPos: -2.05 ; yPos: -1.6 ; zPos: -3.05 }
+ ListElement{ xPos: 1.65 ; yPos: -0.44 ; zPos: -0.75 }
+ ListElement{ xPos: -1.25 ; yPos: 0.96 ; zPos: -4.15 }
+ ListElement{ xPos: -4.2 ; yPos: -0.56 ; zPos: 1.45 }
+ ListElement{ xPos: 0.95 ; yPos: -2.4 ; zPos: -1.6 }
+ ListElement{ xPos: -0.05 ; yPos: 0.88 ; zPos: 3.15 }
+ ListElement{ xPos: -1.65 ; yPos: -0.88 ; zPos: -3.85 }
+ ListElement{ xPos: 0.35 ; yPos: 0.2 ; zPos: 4.25 }
+ ListElement{ xPos: 0.8 ; yPos: 0.84 ; zPos: 3.1 }
+ ListElement{ xPos: 1.85 ; yPos: -2.16 ; zPos: -2.2 }
+ ListElement{ xPos: -2.05 ; yPos: 0.16 ; zPos: -0.4 }
+ ListElement{ xPos: 0.85 ; yPos: 1.84 ; zPos: -1.45 }
+ ListElement{ xPos: 1.6 ; yPos: 1.56 ; zPos: -1.45 }
+ ListElement{ xPos: 1.25 ; yPos: -0.84 ; zPos: -2.95 }
+ ListElement{ xPos: -1.9 ; yPos: 2.32 ; zPos: -1.8 }
+ ListElement{ xPos: -0.6 ; yPos: 2.4 ; zPos: -3.65 }
+ ListElement{ xPos: 4.45 ; yPos: 0.52 ; zPos: 3 }
+ ListElement{ xPos: 2.7 ; yPos: 0.28 ; zPos: -1.8 }
+ ListElement{ xPos: 0.35 ; yPos: -2.56 ; zPos: 3.9 }
+ ListElement{ xPos: -0.95 ; yPos: -1.28 ; zPos: 1.6 }
+ ListElement{ xPos: 0.4 ; yPos: -0.2 ; zPos: -2.15 }
+ ListElement{ xPos: -0.05 ; yPos: -1.08 ; zPos: -4.1 }
+ ListElement{ xPos: 3.1 ; yPos: -1.2 ; zPos: -3.85 }
+ ListElement{ xPos: 0.75 ; yPos: 0.12 ; zPos: -3.1 }
+ ListElement{ xPos: -1.65 ; yPos: -1.16 ; zPos: -1.65 }
+ ListElement{ xPos: -1.65 ; yPos: 3.84 ; zPos: 4.65 }
+ ListElement{ xPos: 2.8 ; yPos: -2.6 ; zPos: -1.65 }
+ ListElement{ xPos: 1.2 ; yPos: -2.76 ; zPos: -2.2 }
+ ListElement{ xPos: 0.4 ; yPos: 3.04 ; zPos: 3.45 }
+ ListElement{ xPos: -3.6 ; yPos: 1.04 ; zPos: -0.6 }
+ ListElement{ xPos: 2.25 ; yPos: 1.64 ; zPos: 2.9 }
+ ListElement{ xPos: -3.05 ; yPos: -0.76 ; zPos: -2.3 }
+ ListElement{ xPos: -2.85 ; yPos: 2.12 ; zPos: -0.65 }
+ ListElement{ xPos: -0.1 ; yPos: 0.08 ; zPos: -1.6 }
+ ListElement{ xPos: -1.55 ; yPos: -1.36 ; zPos: 2.2 }
+ ListElement{ xPos: -0.4 ; yPos: 1.56 ; zPos: -0.3 }
+ ListElement{ xPos: 0.3 ; yPos: -2.36 ; zPos: 1.35 }
+ ListElement{ xPos: 0.2 ; yPos: -0.6 ; zPos: 1.6 }
+ ListElement{ xPos: -0.65 ; yPos: 1.96 ; zPos: -3.1 }
+ ListElement{ xPos: 0.6 ; yPos: -1.04 ; zPos: 2.5 }
+ ListElement{ xPos: -2 ; yPos: -1.08 ; zPos: -0.85 }
+ ListElement{ xPos: 1.45 ; yPos: -2.56 ; zPos: -2.6 }
+ ListElement{ xPos: -2.45 ; yPos: 0.04 ; zPos: -2.85 }
+ ListElement{ xPos: -0.05 ; yPos: -1.24 ; zPos: -1.25 }
+ ListElement{ xPos: -2.95 ; yPos: -1.8 ; zPos: -2.05 }
+ ListElement{ xPos: 4.3 ; yPos: -0.96 ; zPos: 3.5 }
+ ListElement{ xPos: 2.15 ; yPos: -1.6 ; zPos: -0.8 }
+ ListElement{ xPos: -1.2 ; yPos: -1 ; zPos: 1.75 }
+ ListElement{ xPos: -1.5 ; yPos: -1.28 ; zPos: -0.25 }
+ ListElement{ xPos: 2.5 ; yPos: -2.6 ; zPos: -0.3 }
+ ListElement{ xPos: -1.6 ; yPos: -0.36 ; zPos: 3.15 }
+ ListElement{ xPos: -0.1 ; yPos: -0.64 ; zPos: -3.6 }
+ ListElement{ xPos: -1.9 ; yPos: 1.88 ; zPos: 2.1 }
+ ListElement{ xPos: -2.85 ; yPos: -2.28 ; zPos: -1.55 }
+ ListElement{ xPos: -1.3 ; yPos: -0.48 ; zPos: -2.2 }
+ ListElement{ xPos: 0.5 ; yPos: 0.28 ; zPos: 0.65 }
+ ListElement{ xPos: -1.1 ; yPos: 0.24 ; zPos: -2.25 }
+ ListElement{ xPos: 1.75 ; yPos: -1.4 ; zPos: 0.3 }
+ ListElement{ xPos: 1.5 ; yPos: -1.32 ; zPos: -2.8 }
+ ListElement{ xPos: -0.95 ; yPos: 2.08 ; zPos: -0.3 }
+ ListElement{ xPos: 2.75 ; yPos: 0.24 ; zPos: 0.75 }
+ ListElement{ xPos: 0.75 ; yPos: 0.56 ; zPos: -1.5 }
+ ListElement{ xPos: 1.1 ; yPos: -3.76 ; zPos: 0 }
+ ListElement{ xPos: 0.3 ; yPos: -1.2 ; zPos: 2.6 }
+ ListElement{ xPos: -0.25 ; yPos: 2.68 ; zPos: -3 }
+ ListElement{ xPos: 1.8 ; yPos: -0.76 ; zPos: 4.4 }
+ ListElement{ xPos: 0 ; yPos: 0 ; zPos: -1.9 }
+ ListElement{ xPos: -1.6 ; yPos: -0.12 ; zPos: -2.4 }
+ ListElement{ xPos: -1.25 ; yPos: 2.36 ; zPos: -2.9 }
+ ListElement{ xPos: 2.65 ; yPos: 0.04 ; zPos: 0.1 }
+ ListElement{ xPos: -3.35 ; yPos: 0.08 ; zPos: -1.3 }
+ ListElement{ xPos: 3.35 ; yPos: 0.04 ; zPos: 2.8 }
+ ListElement{ xPos: 4.45 ; yPos: 1.24 ; zPos: -0.95 }
+ ListElement{ xPos: -0.1 ; yPos: -1.52 ; zPos: -4.6 }
+ ListElement{ xPos: 1.1 ; yPos: 1.72 ; zPos: -3.2 }
+ ListElement{ xPos: -0.45 ; yPos: 1.92 ; zPos: 1.2 }
+ ListElement{ xPos: -0.7 ; yPos: -0.16 ; zPos: 0.8 }
+ ListElement{ xPos: 2.3 ; yPos: 0.2 ; zPos: 2.75 }
+ ListElement{ xPos: 1.7 ; yPos: 2.08 ; zPos: -0.95 }
+ ListElement{ xPos: 2.1 ; yPos: 1.56 ; zPos: 1.2 }
+ ListElement{ xPos: 3.05 ; yPos: -1.56 ; zPos: -0.45 }
+ ListElement{ xPos: 0.1 ; yPos: -3.08 ; zPos: -1.3 }
+ ListElement{ xPos: 1.65 ; yPos: -0.32 ; zPos: -0.8 }
+ ListElement{ xPos: 2.05 ; yPos: -1.8 ; zPos: 1.8 }
+ ListElement{ xPos: -0.55 ; yPos: 1.52 ; zPos: -0.8 }
+ ListElement{ xPos: -2.05 ; yPos: 1.52 ; zPos: 2.3 }
+ ListElement{ xPos: -2.35 ; yPos: -3.28 ; zPos: 3.5 }
+ ListElement{ xPos: -2.25 ; yPos: 2.56 ; zPos: -1.9 }
+ ListElement{ xPos: 0.3 ; yPos: -3.28 ; zPos: 3.4 }
+ ListElement{ xPos: 0.95 ; yPos: -1.68 ; zPos: -1.8 }
+ ListElement{ xPos: 2 ; yPos: 2.2 ; zPos: -0.05 }
+ ListElement{ xPos: 3 ; yPos: 2.92 ; zPos: -2.1 }
+ ListElement{ xPos: 2.55 ; yPos: 3.12 ; zPos: 2.95 }
+ ListElement{ xPos: -0.5 ; yPos: -2.8 ; zPos: -0.3 }
+ ListElement{ xPos: 0.35 ; yPos: 0.64 ; zPos: 0.35 }
+ ListElement{ xPos: -1.15 ; yPos: -0.16 ; zPos: -0.45 }
+ ListElement{ xPos: -2.4 ; yPos: -0.88 ; zPos: -0.3 }
+ ListElement{ xPos: 1.55 ; yPos: -1.48 ; zPos: -0.5 }
+ ListElement{ xPos: -0.85 ; yPos: -2.08 ; zPos: -1.1 }
+ ListElement{ xPos: 0.5 ; yPos: -0.8 ; zPos: 1.35 }
+ ListElement{ xPos: -2.15 ; yPos: 1.04 ; zPos: -3.25 }
+ ListElement{ xPos: -0.65 ; yPos: -1.32 ; zPos: -3.1 }
+ ListElement{ xPos: 0.35 ; yPos: -0.84 ; zPos: -1.7 }
+ ListElement{ xPos: -2.1 ; yPos: 0.96 ; zPos: 2.5 }
+ ListElement{ xPos: 1 ; yPos: -0.6 ; zPos: -3.15 }
+ ListElement{ xPos: -1.35 ; yPos: 0.76 ; zPos: 3.45 }
+ ListElement{ xPos: -3.05 ; yPos: -1.2 ; zPos: 1.45 }
+ ListElement{ xPos: -1.6 ; yPos: 0.8 ; zPos: -1.9 }
+ ListElement{ xPos: 0.7 ; yPos: 1.68 ; zPos: 2.3 }
+ ListElement{ xPos: 0 ; yPos: -0.76 ; zPos: -0.95 }
+ ListElement{ xPos: -2.3 ; yPos: -0.16 ; zPos: -1.25 }
+ ListElement{ xPos: -0.55 ; yPos: -2.28 ; zPos: 1.5 }
+ ListElement{ xPos: 0 ; yPos: -0.24 ; zPos: 0.55 }
+ ListElement{ xPos: -0.4 ; yPos: -0.92 ; zPos: -0.7 }
+ ListElement{ xPos: -2.6 ; yPos: -1.64 ; zPos: -0.9 }
+ ListElement{ xPos: 0.25 ; yPos: -1.24 ; zPos: 0.9 }
+ ListElement{ xPos: 0.7 ; yPos: 2.88 ; zPos: 0.4 }
+ ListElement{ xPos: -0.6 ; yPos: -1.84 ; zPos: -2.4 }
+ ListElement{ xPos: 0.5 ; yPos: 2.8 ; zPos: 1.6 }
+ ListElement{ xPos: -3.2 ; yPos: 3.28 ; zPos: -3.45 }
+ ListElement{ xPos: -1.45 ; yPos: 2.52 ; zPos: 2.7 }
+ ListElement{ xPos: 1 ; yPos: -2.68 ; zPos: 3 }
+ ListElement{ xPos: -0.6 ; yPos: -2.56 ; zPos: 1.35 }
+ ListElement{ xPos: 1.95 ; yPos: -1.48 ; zPos: -3.85 }
+ ListElement{ xPos: 3.85 ; yPos: 0.08 ; zPos: -1.65 }
+ ListElement{ xPos: -1.1 ; yPos: -1.6 ; zPos: -1.05 }
+ ListElement{ xPos: 1.25 ; yPos: -0.04 ; zPos: 1.35 }
+ ListElement{ xPos: 2.9 ; yPos: 2.08 ; zPos: 0.2 }
+ ListElement{ xPos: 0.7 ; yPos: 2.52 ; zPos: 0.65 }
+ ListElement{ xPos: -1.85 ; yPos: -1.8 ; zPos: 1.05 }
+ ListElement{ xPos: 1.6 ; yPos: 1.12 ; zPos: -3.05 }
+ ListElement{ xPos: -2.8 ; yPos: 0.12 ; zPos: 0.5 }
+ ListElement{ xPos: -1.4 ; yPos: 1.64 ; zPos: -1.95 }
+ ListElement{ xPos: 2.35 ; yPos: 0.4 ; zPos: -0.95 }
+ ListElement{ xPos: 0.95 ; yPos: -0.28 ; zPos: -0.8 }
+ ListElement{ xPos: -1.5 ; yPos: -1.76 ; zPos: 2.5 }
+ ListElement{ xPos: -3.05 ; yPos: 2.44 ; zPos: -0.2 }
+ ListElement{ xPos: -0.6 ; yPos: 1.12 ; zPos: -0.5 }
+ ListElement{ xPos: -1.7 ; yPos: -0.72 ; zPos: -1.05 }
+ ListElement{ xPos: 0.45 ; yPos: 0.84 ; zPos: -0.1 }
+ ListElement{ xPos: -3.5 ; yPos: 0.36 ; zPos: 1.1 }
+ ListElement{ xPos: 0.2 ; yPos: -2.08 ; zPos: 0.25 }
+ ListElement{ xPos: -2.1 ; yPos: 0.72 ; zPos: 0.85 }
+ ListElement{ xPos: -2.45 ; yPos: -0.72 ; zPos: -0.8 }
+ ListElement{ xPos: 4.25 ; yPos: 1.84 ; zPos: -0.55 }
+ ListElement{ xPos: 0.1 ; yPos: -1.32 ; zPos: -1.45 }
+ ListElement{ xPos: -3.65 ; yPos: 0.36 ; zPos: 0.3 }
+ ListElement{ xPos: 0.9 ; yPos: 0.32 ; zPos: -3.6 }
+ ListElement{ xPos: -0.25 ; yPos: 1.84 ; zPos: 0 }
+ ListElement{ xPos: 3.5 ; yPos: 0.92 ; zPos: -2.1 }
+ ListElement{ xPos: 0.65 ; yPos: 2.36 ; zPos: 4 }
+ ListElement{ xPos: 0.55 ; yPos: -1.08 ; zPos: 0.2 }
+ ListElement{ xPos: 1 ; yPos: 0.04 ; zPos: -3.75 }
+ ListElement{ xPos: 0.05 ; yPos: 0.52 ; zPos: -3.8 }
+ ListElement{ xPos: 3.45 ; yPos: 0.56 ; zPos: 4.2 }
+ ListElement{ xPos: -0.25 ; yPos: 2.36 ; zPos: -3.55 }
+ ListElement{ xPos: 1.95 ; yPos: 1.28 ; zPos: 4.25 }
+ ListElement{ xPos: 1.8 ; yPos: 3.12 ; zPos: 0.65 }
+ ListElement{ xPos: -3.35 ; yPos: 0.8 ; zPos: -1 }
+ ListElement{ xPos: 2.4 ; yPos: -0.16 ; zPos: 1.25 }
+ ListElement{ xPos: 2.5 ; yPos: 0.96 ; zPos: 1.45 }
+ ListElement{ xPos: 0.8 ; yPos: -0.16 ; zPos: -0.55 }
+ ListElement{ xPos: -3.45 ; yPos: -0.08 ; zPos: 0.85 }
+ ListElement{ xPos: -3.4 ; yPos: 0.8 ; zPos: 1.35 }
+ ListElement{ xPos: -0.8 ; yPos: 0.24 ; zPos: -1.2 }
+ ListElement{ xPos: 3.6 ; yPos: 1.16 ; zPos: -0.1 }
+ ListElement{ xPos: -1.45 ; yPos: -3.08 ; zPos: -0.3 }
+ ListElement{ xPos: -3.65 ; yPos: -1.04 ; zPos: 0.15 }
+ ListElement{ xPos: 1.35 ; yPos: -0.76 ; zPos: 0.55 }
+ ListElement{ xPos: -2.75 ; yPos: -1 ; zPos: -1.55 }
+ ListElement{ xPos: 1.6 ; yPos: 2.04 ; zPos: 0.9 }
+ ListElement{ xPos: 3 ; yPos: -3.24 ; zPos: 0.1 }
+ ListElement{ xPos: -4.25 ; yPos: 0.56 ; zPos: -4.35 }
+ ListElement{ xPos: -2.6 ; yPos: -0.44 ; zPos: 0.5 }
+ ListElement{ xPos: 0.2 ; yPos: -0.64 ; zPos: -0.35 }
+ ListElement{ xPos: -3.2 ; yPos: -3.52 ; zPos: 1 }
+ ListElement{ xPos: -0.7 ; yPos: -1.84 ; zPos: -2.45 }
+ ListElement{ xPos: -4.1 ; yPos: 0.12 ; zPos: 3.85 }
+ ListElement{ xPos: -4.05 ; yPos: 0.04 ; zPos: -0.3 }
+ ListElement{ xPos: 2 ; yPos: 2.32 ; zPos: 1.2 }
+ ListElement{ xPos: -0.35 ; yPos: 1 ; zPos: -0.7 }
+ ListElement{ xPos: -0.9 ; yPos: 0.36 ; zPos: 1.55 }
+ ListElement{ xPos: -0.05 ; yPos: 2.4 ; zPos: -4.35 }
+ ListElement{ xPos: 1.5 ; yPos: -0.96 ; zPos: -3.4 }
+ ListElement{ xPos: -2.8 ; yPos: 2.08 ; zPos: -1.75 }
+ ListElement{ xPos: -0.2 ; yPos: 0.72 ; zPos: 0.9 }
+ ListElement{ xPos: -1.1 ; yPos: -1.68 ; zPos: 0.1 }
+ ListElement{ xPos: -1.2 ; yPos: -0.32 ; zPos: -0.85 }
+ ListElement{ xPos: 0.75 ; yPos: 0.56 ; zPos: 3.95 }
+ ListElement{ xPos: 1.15 ; yPos: 2.8 ; zPos: 0.65 }
+ ListElement{ xPos: -2.55 ; yPos: -2.56 ; zPos: 0.75 }
+ ListElement{ xPos: 0.95 ; yPos: 0.84 ; zPos: -0.85 }
+ ListElement{ xPos: -2.15 ; yPos: 0.24 ; zPos: -3.1 }
+ ListElement{ xPos: 0.35 ; yPos: -1.68 ; zPos: 0.45 }
+ ListElement{ xPos: -0.75 ; yPos: -2.4 ; zPos: -0.35 }
+ ListElement{ xPos: 0.2 ; yPos: 2.04 ; zPos: 0.1 }
+ ListElement{ xPos: -2.4 ; yPos: 0.68 ; zPos: 1.8 }
+ ListElement{ xPos: 1.9 ; yPos: 0.88 ; zPos: 1.45 }
+ ListElement{ xPos: 0.25 ; yPos: 1.92 ; zPos: -1.7 }
+ ListElement{ xPos: -0.95 ; yPos: -0.6 ; zPos: -2 }
+ ListElement{ xPos: 0.2 ; yPos: -2.44 ; zPos: 1.05 }
+ ListElement{ xPos: 0.3 ; yPos: -0.6 ; zPos: -3.35 }
+ ListElement{ xPos: 0.05 ; yPos: 0.52 ; zPos: -3.3 }
+ ListElement{ xPos: -0.05 ; yPos: -0.88 ; zPos: -0.8 }
+ ListElement{ xPos: 0.45 ; yPos: 2.84 ; zPos: -1.9 }
+ ListElement{ xPos: 2.85 ; yPos: -0.68 ; zPos: -2.45 }
+ ListElement{ xPos: -1.05 ; yPos: -1.92 ; zPos: 0.9 }
+ ListElement{ xPos: -2.75 ; yPos: -0.16 ; zPos: -1.55 }
+ ListElement{ xPos: 1.9 ; yPos: 1 ; zPos: 3.15 }
+ ListElement{ xPos: -2.25 ; yPos: 0.8 ; zPos: -4.35 }
+ ListElement{ xPos: 1.8 ; yPos: -0.72 ; zPos: -3.8 }
+ ListElement{ xPos: -3.25 ; yPos: -1.16 ; zPos: -1.85 }
+ ListElement{ xPos: -1.6 ; yPos: -2.32 ; zPos: -0.8 }
+ ListElement{ xPos: 3.1 ; yPos: 0.32 ; zPos: 2.15 }
+ ListElement{ xPos: -1.05 ; yPos: -0.56 ; zPos: -3.45 }
+ ListElement{ xPos: 0.75 ; yPos: -1.08 ; zPos: -0.25 }
+ ListElement{ xPos: -0.45 ; yPos: -2.24 ; zPos: 2.5 }
+ ListElement{ xPos: 0.2 ; yPos: 0.12 ; zPos: 0 }
+ ListElement{ xPos: -1 ; yPos: 1.56 ; zPos: -1.6 }
+ ListElement{ xPos: 1.3 ; yPos: -2.84 ; zPos: -0.25 }
+ ListElement{ xPos: 0.55 ; yPos: 1.36 ; zPos: 2.95 }
+ ListElement{ xPos: -1.9 ; yPos: -0.88 ; zPos: 0.05 }
+ ListElement{ xPos: -1.9 ; yPos: 0.56 ; zPos: -0.7 }
+ ListElement{ xPos: -1.25 ; yPos: -0.52 ; zPos: 2.35 }
+ ListElement{ xPos: 2.1 ; yPos: -0.72 ; zPos: -1.4 }
+ ListElement{ xPos: -0.9 ; yPos: -0.72 ; zPos: -2.05 }
+ ListElement{ xPos: 0.9 ; yPos: -0.96 ; zPos: -3 }
+ ListElement{ xPos: 2.7 ; yPos: -2.36 ; zPos: 1.25 }
+ ListElement{ xPos: 3.3 ; yPos: -1 ; zPos: -3.55 }
+ ListElement{ xPos: -0.75 ; yPos: -1.96 ; zPos: 2 }
+ ListElement{ xPos: -0.45 ; yPos: 0.52 ; zPos: -0.1 }
+ ListElement{ xPos: 0.8 ; yPos: 0 ; zPos: -3.3 }
+ ListElement{ xPos: -0.45 ; yPos: -0.44 ; zPos: -2.8 }
+ ListElement{ xPos: -3.2 ; yPos: 3.12 ; zPos: 0.5 }
+ ListElement{ xPos: -3.1 ; yPos: 2.84 ; zPos: -0.45 }
+ ListElement{ xPos: 0.2 ; yPos: -1.2 ; zPos: 0.9 }
+ ListElement{ xPos: -0.65 ; yPos: -1.4 ; zPos: -1.35 }
+ ListElement{ xPos: -0.45 ; yPos: 1.84 ; zPos: -0.95 }
+ ListElement{ xPos: -1.3 ; yPos: 0.8 ; zPos: -1 }
+ ListElement{ xPos: 2.35 ; yPos: -0.28 ; zPos: 1.55 }
+ ListElement{ xPos: 2 ; yPos: -2.4 ; zPos: 1.2 }
+ ListElement{ xPos: 1.2 ; yPos: -1.72 ; zPos: -0.4 }
+ ListElement{ xPos: -2 ; yPos: 3.04 ; zPos: 1.9 }
+ ListElement{ xPos: -1.85 ; yPos: -0.16 ; zPos: -2.9 }
+ ListElement{ xPos: -0.95 ; yPos: -2.76 ; zPos: 2.5 }
+ ListElement{ xPos: 2.55 ; yPos: -0.64 ; zPos: 3.25 }
+ ListElement{ xPos: -0.6 ; yPos: -0.72 ; zPos: -1.45 }
+ ListElement{ xPos: 0.8 ; yPos: 0.16 ; zPos: 2.2 }
+ ListElement{ xPos: 0.6 ; yPos: 0.04 ; zPos: 3.2 }
+ ListElement{ xPos: -3.75 ; yPos: -0.24 ; zPos: 0.2 }
+ ListElement{ xPos: 0.4 ; yPos: -0.32 ; zPos: 0.6 }
+ ListElement{ xPos: -2.1 ; yPos: -3.68 ; zPos: 0.2 }
+ ListElement{ xPos: 0.45 ; yPos: -2.44 ; zPos: 3 }
+ ListElement{ xPos: 0.5 ; yPos: -1.8 ; zPos: -1.9 }
+ ListElement{ xPos: 0 ; yPos: 1.8 ; zPos: -1.25 }
+ ListElement{ xPos: 2.6 ; yPos: 2.2 ; zPos: -4.25 }
+ ListElement{ xPos: 0.25 ; yPos: 2.28 ; zPos: -0.4 }
+ ListElement{ xPos: -0.3 ; yPos: -1.24 ; zPos: 0.7 }
+ ListElement{ xPos: 0.1 ; yPos: -3 ; zPos: 0.05 }
+ ListElement{ xPos: -1.2 ; yPos: -0.76 ; zPos: 2.65 }
+ ListElement{ xPos: 2.8 ; yPos: 0.44 ; zPos: 0.55 }
+ ListElement{ xPos: 2.6 ; yPos: -0.68 ; zPos: 0.2 }
+ ListElement{ xPos: 1.75 ; yPos: -0.16 ; zPos: -3.6 }
+ ListElement{ xPos: -0.55 ; yPos: -0.16 ; zPos: 2.3 }
+ ListElement{ xPos: 0.1 ; yPos: -1.72 ; zPos: -0.4 }
+ ListElement{ xPos: 3.6 ; yPos: -0.84 ; zPos: -0.2 }
+ ListElement{ xPos: -1.4 ; yPos: -1.48 ; zPos: -2.7 }
+ ListElement{ xPos: 1.1 ; yPos: -0.2 ; zPos: -2.75 }
+ ListElement{ xPos: -1.85 ; yPos: 1.76 ; zPos: -0.85 }
+ ListElement{ xPos: 0.05 ; yPos: -0.4 ; zPos: 1.05 }
+ ListElement{ xPos: -1.25 ; yPos: 0.52 ; zPos: -0.3 }
+ ListElement{ xPos: -0.85 ; yPos: -0.24 ; zPos: 1.9 }
+ ListElement{ xPos: -1.95 ; yPos: -0.08 ; zPos: -1.95 }
+ ListElement{ xPos: -2.7 ; yPos: -0.52 ; zPos: -0.35 }
+ ListElement{ xPos: 0.1 ; yPos: 0.16 ; zPos: 4.1 }
+ ListElement{ xPos: -0.6 ; yPos: -0.52 ; zPos: -1.2 }
+ ListElement{ xPos: -2.3 ; yPos: -0.4 ; zPos: -2.85 }
+ ListElement{ xPos: -0.35 ; yPos: -1.2 ; zPos: -1.85 }
+ ListElement{ xPos: 1.7 ; yPos: -0.2 ; zPos: 3.35 }
+ ListElement{ xPos: 2.75 ; yPos: -2.32 ; zPos: 3.15 }
+ ListElement{ xPos: 2.85 ; yPos: 0.44 ; zPos: 0.9 }
+ ListElement{ xPos: -2.1 ; yPos: 0.4 ; zPos: 1 }
+ ListElement{ xPos: 4.45 ; yPos: -0.4 ; zPos: -3.75 }
+ ListElement{ xPos: 0.7 ; yPos: -1.44 ; zPos: 0.85 }
+ ListElement{ xPos: -0.85 ; yPos: 1.76 ; zPos: 1.05 }
+ ListElement{ xPos: -0.4 ; yPos: -0.92 ; zPos: -2.4 }
+ ListElement{ xPos: -1 ; yPos: -0.28 ; zPos: -1.6 }
+ ListElement{ xPos: -0.75 ; yPos: 0.56 ; zPos: -0.75 }
+ ListElement{ xPos: 0.55 ; yPos: 1.72 ; zPos: -0.2 }
+ ListElement{ xPos: 2.75 ; yPos: -0.24 ; zPos: -0.5 }
+ ListElement{ xPos: -2.2 ; yPos: -1.04 ; zPos: -4.05 }
+ ListElement{ xPos: 3.35 ; yPos: -0.56 ; zPos: -2.9 }
+ ListElement{ xPos: 2.4 ; yPos: -0.32 ; zPos: -1.55 }
+ ListElement{ xPos: 0.85 ; yPos: -0.88 ; zPos: -2.1 }
+ ListElement{ xPos: 0.4 ; yPos: 0.24 ; zPos: -0.45 }
+ ListElement{ xPos: -4.1 ; yPos: -0.72 ; zPos: 0.35 }
+ ListElement{ xPos: -0.5 ; yPos: 0.04 ; zPos: -0.95 }
+ ListElement{ xPos: -2.8 ; yPos: 2.92 ; zPos: 0.95 }
+ ListElement{ xPos: -1.65 ; yPos: 0.96 ; zPos: 1.25 }
+ ListElement{ xPos: 1.45 ; yPos: 0.84 ; zPos: 0.25 }
+ ListElement{ xPos: 2.2 ; yPos: -1.76 ; zPos: 0 }
+ ListElement{ xPos: -0.75 ; yPos: 1.08 ; zPos: -2.1 }
+ ListElement{ xPos: -3.15 ; yPos: -0.16 ; zPos: -1.1 }
+ ListElement{ xPos: 2.55 ; yPos: -1.6 ; zPos: 1.1 }
+ ListElement{ xPos: 0.15 ; yPos: 1.84 ; zPos: 0.4 }
+ ListElement{ xPos: -1.5 ; yPos: 2.04 ; zPos: 3.2 }
+ ListElement{ xPos: -1.05 ; yPos: -0.84 ; zPos: -1.9 }
+ ListElement{ xPos: 0.1 ; yPos: -2.96 ; zPos: -0.2 }
+ ListElement{ xPos: 2.6 ; yPos: 0.68 ; zPos: -2.6 }
+ ListElement{ xPos: -0.4 ; yPos: -0.36 ; zPos: -1.05 }
+ ListElement{ xPos: 1.1 ; yPos: 0.04 ; zPos: -2.4 }
+ ListElement{ xPos: -2.3 ; yPos: 1.4 ; zPos: -0.1 }
+ ListElement{ xPos: 0.85 ; yPos: -1.2 ; zPos: 1.5 }
+ ListElement{ xPos: 0.1 ; yPos: 0.24 ; zPos: -2.75 }
+ ListElement{ xPos: 1.15 ; yPos: 1.32 ; zPos: -1.7 }
+ ListElement{ xPos: 0.35 ; yPos: -1.6 ; zPos: -2.75 }
+ ListElement{ xPos: 0.35 ; yPos: -1.36 ; zPos: 2.55 }
+ ListElement{ xPos: -1.65 ; yPos: -0.28 ; zPos: 2.75 }
+ ListElement{ xPos: -3.8 ; yPos: -3.28 ; zPos: 2.55 }
+ ListElement{ xPos: -2.6 ; yPos: 1.08 ; zPos: -0.45 }
+ ListElement{ xPos: 1.6 ; yPos: -2.2 ; zPos: 2.45 }
+ ListElement{ xPos: -0.75 ; yPos: 1.16 ; zPos: -1.9 }
+ ListElement{ xPos: -2.05 ; yPos: 3.04 ; zPos: 1.9 }
+ ListElement{ xPos: -0.6 ; yPos: 2.88 ; zPos: 1 }
+ ListElement{ xPos: 3.25 ; yPos: -2 ; zPos: -0.35 }
+ ListElement{ xPos: -0.7 ; yPos: 1.36 ; zPos: 1.85 }
+ ListElement{ xPos: 0.85 ; yPos: 1.08 ; zPos: 0.95 }
+ ListElement{ xPos: 1.15 ; yPos: 1.32 ; zPos: 3.4 }
+ ListElement{ xPos: 3.6 ; yPos: 0.44 ; zPos: -0.4 }
+ ListElement{ xPos: 0.9 ; yPos: 2.12 ; zPos: 1.95 }
+ ListElement{ xPos: -0.6 ; yPos: -0.24 ; zPos: 1.05 }
+ ListElement{ xPos: -1.6 ; yPos: 0.64 ; zPos: -1.3 }
+ ListElement{ xPos: -1.3 ; yPos: -0.6 ; zPos: -1.95 }
+ ListElement{ xPos: -0.1 ; yPos: 0.36 ; zPos: -1.25 }
+ ListElement{ xPos: 1 ; yPos: -1.48 ; zPos: 0.95 }
+ ListElement{ xPos: 1.2 ; yPos: -1.92 ; zPos: -0.9 }
+ ListElement{ xPos: 0.1 ; yPos: 2.2 ; zPos: -0.4 }
+ ListElement{ xPos: -2.85 ; yPos: 0.64 ; zPos: 0.55 }
+ ListElement{ xPos: -1.6 ; yPos: 2.56 ; zPos: -2.2 }
+ ListElement{ xPos: -3.2 ; yPos: -0.08 ; zPos: -0.65 }
+ ListElement{ xPos: 3.15 ; yPos: -0.76 ; zPos: 1.15 }
+ ListElement{ xPos: 1.2 ; yPos: 0.6 ; zPos: -2.6 }
+ ListElement{ xPos: 2.65 ; yPos: -3.52 ; zPos: 1.5 }
+ ListElement{ xPos: -1.85 ; yPos: -1.76 ; zPos: -1.7 }
+ ListElement{ xPos: -1.55 ; yPos: 1.2 ; zPos: 2.15 }
+ ListElement{ xPos: -0.55 ; yPos: 2.88 ; zPos: -2.85 }
+ ListElement{ xPos: -3.1 ; yPos: -0.28 ; zPos: -3.35 }
+ ListElement{ xPos: 2.45 ; yPos: 0.08 ; zPos: -2.2 }
+ ListElement{ xPos: -2.05 ; yPos: 0.88 ; zPos: -0.65 }
+ ListElement{ xPos: 1.1 ; yPos: -0.56 ; zPos: -3.65 }
+ ListElement{ xPos: -0.5 ; yPos: -0.68 ; zPos: 0.3 }
+ ListElement{ xPos: 0.4 ; yPos: 0.88 ; zPos: -1.65 }
+ ListElement{ xPos: 1.65 ; yPos: 0.16 ; zPos: 0.75 }
+ ListElement{ xPos: -0.2 ; yPos: 1.72 ; zPos: 0.6 }
+ ListElement{ xPos: 1.15 ; yPos: -0.48 ; zPos: 0.1 }
+ ListElement{ xPos: 0.05 ; yPos: 1.04 ; zPos: 2.15 }
+ ListElement{ xPos: 0.15 ; yPos: -0.64 ; zPos: -1.3 }
+ ListElement{ xPos: 1.7 ; yPos: -1.88 ; zPos: -2.85 }
+ ListElement{ xPos: 3.35 ; yPos: 1.28 ; zPos: -1.05 }
+ ListElement{ xPos: -3.7 ; yPos: -2.88 ; zPos: -1.05 }
+ ListElement{ xPos: -1.7 ; yPos: 3.08 ; zPos: 0.15 }
+ ListElement{ xPos: 3 ; yPos: -2.52 ; zPos: -2.45 }
+ ListElement{ xPos: -0.15 ; yPos: 0.16 ; zPos: -0.3 }
+ ListElement{ xPos: -2.15 ; yPos: -0.8 ; zPos: 1.25 }
+ ListElement{ xPos: -1.95 ; yPos: -0.84 ; zPos: -3.1 }
+ ListElement{ xPos: -0.2 ; yPos: -0.8 ; zPos: -3.55 }
+ ListElement{ xPos: 0.4 ; yPos: 0.32 ; zPos: -1.55 }
+ ListElement{ xPos: 1.9 ; yPos: -2.84 ; zPos: -0.55 }
+ ListElement{ xPos: 1.05 ; yPos: 1.32 ; zPos: 0.6 }
+ ListElement{ xPos: 2.4 ; yPos: 1 ; zPos: 2.35 }
+ ListElement{ xPos: -0.7 ; yPos: 0.28 ; zPos: -1.3 }
+ ListElement{ xPos: 0.85 ; yPos: 0.96 ; zPos: -2.7 }
+ ListElement{ xPos: -0.85 ; yPos: -0.88 ; zPos: 1.1 }
+ ListElement{ xPos: 1.5 ; yPos: 0.28 ; zPos: -3.1 }
+ ListElement{ xPos: 1.9 ; yPos: 0.28 ; zPos: -1.75 }
+ ListElement{ xPos: 0.2 ; yPos: -2.04 ; zPos: -0.85 }
+ ListElement{ xPos: -1.5 ; yPos: 2.04 ; zPos: -1.35 }
+ ListElement{ xPos: -0.7 ; yPos: 1.24 ; zPos: 1.95 }
+ ListElement{ xPos: 1.65 ; yPos: -1.04 ; zPos: -0.95 }
+ ListElement{ xPos: -2.35 ; yPos: -1.76 ; zPos: -0.2 }
+ ListElement{ xPos: 0.85 ; yPos: -2.92 ; zPos: 3.4 }
+ ListElement{ xPos: -0.7 ; yPos: 2.52 ; zPos: 1 }
+ ListElement{ xPos: -3.4 ; yPos: 0.6 ; zPos: 0.9 }
+ }
+
+ ListModel {
+ id: dataModelThree
+ ListElement{ xPos: 8.0; yPos: -2.0; zPos: 4.0 }
+ ListElement{ xPos: 7.8; yPos: -2.2; zPos: 5.0 }
+ ListElement{ xPos: 7.6; yPos: -2.4; zPos: 4.5 }
+ ListElement{ xPos: 9.4; yPos: -2.6; zPos: 3.8 }
+ ListElement{ xPos: 7.2; yPos: -2.8; zPos: 4.8 }
+ ListElement{ xPos: 9.0; yPos: -2.3; zPos: 4.1 }
+ ListElement{ xPos: 6.9; yPos: -3.3; zPos: 4.9 }
+ ListElement{ xPos: 6.7; yPos: -3.5; zPos: 3.5 }
+ ListElement{ xPos: 6.5; yPos: -3.7; zPos: 3.3 }
+ ListElement{ xPos: 6.3; yPos: -3.4; zPos: 3.7 }
+ ListElement{ xPos: 7.9 ; yPos: -3.32 ; zPos: 2.48 }
+ ListElement{ xPos: 6.2 ; yPos: -4.04 ; zPos: 3.4 }
+ ListElement{ xPos: 9.06 ; yPos: -4.6 ; zPos: 4.08 }
+ ListElement{ xPos: 5.98 ; yPos: -2.26 ; zPos: 2.82 }
+ ListElement{ xPos: 5.46 ; yPos: -3.9 ; zPos: 3.2 }
+ ListElement{ xPos: 8.14 ; yPos: -3.34 ; zPos: 3.42 }
+ ListElement{ xPos: 6.84 ; yPos: -5.0 ; zPos: 2.36 }
+ ListElement{ xPos: 7.6 ; yPos: -3.82 ; zPos: 2.78 }
+ ListElement{ xPos: 7.1 ; yPos: -3.94 ; zPos: 2.7 }
+ ListElement{ xPos: 6.02 ; yPos: -4.36 ; zPos: 2.56 }
+ ListElement{ xPos: 8.64 ; yPos: -3.04 ; zPos: 2.62 }
+ ListElement{ xPos: 7.82 ; yPos: -3.68 ; zPos: 2.96 }
+ ListElement{ xPos: 7.1 ; yPos: -3.6 ; zPos: 4.22 }
+ ListElement{ xPos: 8.6 ; yPos: -3.88 ; zPos: 3.9 }
+ ListElement{ xPos: 8.46 ; yPos: -4.2 ; zPos: 3.32 }
+ ListElement{ xPos: 6.98 ; yPos: -3.94 ; zPos: 3.1 }
+ ListElement{ xPos: 7.36 ; yPos: -4.24 ; zPos: 1.72 }
+ ListElement{ xPos: 9.42 ; yPos: -4.52 ; zPos: 2.62 }
+ ListElement{ xPos: 6.04 ; yPos: -4.48 ; zPos: 2.74 }
+ ListElement{ xPos: 10.0 ; yPos: -3.92 ; zPos: 3.82 }
+ ListElement{ xPos: 6.76 ; yPos: -3.5 ; zPos: 2.92 }
+ ListElement{ xPos: 7 ; yPos: -4.42 ; zPos: 2.62 }
+ ListElement{ xPos: 5.32 ; yPos: -3.28 ; zPos: 3.34 }
+ ListElement{ xPos: 6.4 ; yPos: -4.6 ; zPos: 2.4 }
+ ListElement{ xPos: 5.66 ; yPos: -4.98 ; zPos: 3.72 }
+ }
+}
diff --git a/examples/datavisualization/qmlscatter/qml/qmlscatter/NewButton.qml b/examples/datavisualization/qmlscatter/qml/qmlscatter/NewButton.qml
new file mode 100644
index 00000000..e4fb99d2
--- /dev/null
+++ b/examples/datavisualization/qmlscatter/qml/qmlscatter/NewButton.qml
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+import QtQuick 2.1
+import QtQuick.Controls 1.0
+import QtQuick.Controls.Styles 1.0
+
+Item {
+ id: newbutton
+
+ property alias text: buttonText.text
+
+ signal clicked
+
+ implicitWidth: buttonText.implicitWidth + 5
+ implicitHeight: buttonText.implicitHeight + 10
+
+ Button {
+ id: buttonText
+ width: parent.width
+ height: parent.height
+
+ style: ButtonStyle {
+ label: Component {
+ Text {
+ text: buttonText.text
+ clip: true
+ wrapMode: Text.WordWrap
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ anchors.fill: parent
+ }
+ }
+ }
+ onClicked: newbutton.clicked()
+ }
+}
diff --git a/examples/datavisualization/qmlscatter/qml/qmlscatter/main.qml b/examples/datavisualization/qmlscatter/qml/qmlscatter/main.qml
new file mode 100644
index 00000000..beb4ccaa
--- /dev/null
+++ b/examples/datavisualization/qmlscatter/qml/qmlscatter/main.qml
@@ -0,0 +1,229 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+//! [0]
+import QtQuick 2.1
+import QtQuick.Layouts 1.0
+import QtDataVisualization 1.0
+import "."
+//! [0]
+
+//! [1]
+Item {
+ id: mainView
+ //! [1]
+
+ //! [4]
+ Data {
+ id: seriesData
+ }
+ //! [4]
+
+ //! [13]
+ Theme3D {
+ id: themeIsabelle
+ type: Theme3D.ThemeIsabelle
+ font.family: "Lucida Handwriting"
+ font.pointSize: 40
+ }
+ //! [13]
+
+ Theme3D {
+ id: themeArmyBlue
+ type: Theme3D.ThemeArmyBlue
+ }
+
+ //! [8]
+ //! [9]
+ Item {
+ id: dataView
+ anchors.bottom: parent.bottom
+ //! [9]
+ width: parent.width
+ height: parent.height - buttonLayout.height
+ //! [8]
+
+ //! [2]
+ Scatter3D {
+ id: scatterGraph
+ width: dataView.width
+ height: dataView.height
+ //! [2]
+ //! [3]
+ theme: themeIsabelle
+ shadowQuality: AbstractGraph3D.ShadowQualitySoftLow
+ //! [3]
+ //! [6]
+ axisX.segmentCount: 3
+ axisX.subSegmentCount: 2
+ axisX.labelFormat: "%.2f"
+ axisZ.segmentCount: 2
+ axisZ.subSegmentCount: 2
+ axisZ.labelFormat: "%.2f"
+ axisY.segmentCount: 2
+ axisY.subSegmentCount: 2
+ axisY.labelFormat: "%.2f"
+ //! [6]
+ //! [5]
+ Scatter3DSeries {
+ id: scatterSeries
+ //! [5]
+ //! [10]
+ itemLabelFormat: "Series 1: X:@xLabel Y:@yLabel Z:@zLabel"
+ //! [10]
+
+ //! [11]
+ ItemModelScatterDataProxy {
+ itemModel: seriesData.model
+ xPosRole: "xPos"
+ yPosRole: "yPos"
+ zPosRole: "zPos"
+ }
+ //! [11]
+ }
+
+ //! [12]
+ Scatter3DSeries {
+ id: scatterSeriesTwo
+ itemLabelFormat: "Series 2: X:@xLabel Y:@yLabel Z:@zLabel"
+ itemSize: 0.1
+ mesh: Abstract3DSeries.MeshCube
+ //! [12]
+
+ ItemModelScatterDataProxy {
+ itemModel: seriesData.modelTwo
+ xPosRole: "xPos"
+ yPosRole: "yPos"
+ zPosRole: "zPos"
+ }
+ }
+ Scatter3DSeries {
+ id: scatterSeriesThree
+ itemLabelFormat: "Series 3: X:@xLabel Y:@yLabel Z:@zLabel"
+ itemSize: 0.2
+ mesh: Abstract3DSeries.MeshMinimal
+
+ ItemModelScatterDataProxy {
+ itemModel: seriesData.modelThree
+ xPosRole: "xPos"
+ yPosRole: "yPos"
+ zPosRole: "zPos"
+ }
+ }
+ }
+ }
+
+ RowLayout {
+ id: buttonLayout
+ Layout.minimumHeight: cameraToggle.height
+ width: parent.width
+ anchors.left: parent.left
+ spacing: 0
+ //! [7]
+ NewButton {
+ id: shadowToggle
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ text: "Hide Shadows"
+ onClicked: {
+ if (scatterGraph.shadowQuality === AbstractGraph3D.ShadowQualityNone) {
+ scatterGraph.shadowQuality = AbstractGraph3D.ShadowQualitySoftLow;
+ text = "Hide Shadows";
+ } else {
+ scatterGraph.shadowQuality = AbstractGraph3D.ShadowQualityNone;
+ text = "Show Shadows";
+ }
+ }
+ }
+ //! [7]
+
+ NewButton {
+ id: smoothToggle
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ text: "Use Smooth for Series One"
+ onClicked: {
+ if (scatterSeries.meshSmooth === false) {
+ text = "Use Flat for Series One";
+ scatterSeries.meshSmooth = true;
+ } else {
+ text = "Use Smooth for Series One"
+ scatterSeries.meshSmooth = false;
+ }
+ }
+ }
+
+ NewButton {
+ id: cameraToggle
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ text: "Change Camera Placement"
+ onClicked: {
+ if (scatterGraph.scene.activeCamera.cameraPreset === Camera3D.CameraPresetFront) {
+ scatterGraph.scene.activeCamera.cameraPreset =
+ Camera3D.CameraPresetIsometricRightHigh;
+ } else {
+ scatterGraph.scene.activeCamera.cameraPreset = Camera3D.CameraPresetFront;
+ }
+ }
+ }
+
+ NewButton {
+ id: themeToggle
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ text: "Change Theme"
+ onClicked: {
+ if (scatterGraph.theme.type === Theme3D.ThemeArmyBlue) {
+ scatterGraph.theme = themeIsabelle
+ } else {
+ scatterGraph.theme = themeArmyBlue
+ }
+ if (scatterGraph.theme.backgroundEnabled === true) {
+ backgroundToggle.text = "Hide Background";
+ } else {
+ backgroundToggle.text = "Show Background";
+ }
+ }
+ }
+
+ NewButton {
+ id: backgroundToggle
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ text: "Hide Background"
+ onClicked: {
+ if (scatterGraph.theme.backgroundEnabled === true) {
+ scatterGraph.theme.backgroundEnabled = false;
+ text = "Show Background";
+ } else {
+ scatterGraph.theme.backgroundEnabled = true;
+ text = "Hide Background";
+ }
+ }
+ }
+
+ NewButton {
+ id: exitButton
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ text: "Quit"
+ onClicked: Qt.quit(0);
+ }
+ }
+}
diff --git a/examples/datavisualization/qmlscatter/qmlscatter.desktop b/examples/datavisualization/qmlscatter/qmlscatter.desktop
new file mode 100644
index 00000000..0f9e5498
--- /dev/null
+++ b/examples/datavisualization/qmlscatter/qmlscatter.desktop
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Encoding=UTF-8
+Version=1.0
+Type=Application
+Terminal=false
+Name=qmlscatter
+Exec=/opt/qmlscatter/bin/qmlscatter
+Icon=qmlscatter64
+X-Window-Icon=
+X-HildonDesk-ShowInToolbar=true
+X-Osso-Type=application/x-executable
diff --git a/examples/datavisualization/qmlscatter/qmlscatter.pro b/examples/datavisualization/qmlscatter/qmlscatter.pro
new file mode 100644
index 00000000..166b26a0
--- /dev/null
+++ b/examples/datavisualization/qmlscatter/qmlscatter.pro
@@ -0,0 +1,20 @@
+!include( ../examples.pri ) {
+ error( "Couldn't find the examples.pri file!" )
+}
+
+# Add more folders to ship with the application, here
+folder_01.source = qml/qmlscatter
+folder_01.target = qml
+DEPLOYMENTFOLDERS = folder_01
+
+# Additional import path used to resolve QML modules in Creator's code model
+QML_IMPORT_PATH =
+
+# The .cpp file which was generated for your project. Feel free to hack it.
+SOURCES += main.cpp
+
+# Please do not modify the following two lines. Required for deployment.
+include(qtquick2applicationviewer/qtquick2applicationviewer.pri)
+qtcAddDeployment()
+
+RESOURCES += qmlscatter.qrc
diff --git a/examples/datavisualization/qmlscatter/qmlscatter.qrc b/examples/datavisualization/qmlscatter/qmlscatter.qrc
new file mode 100644
index 00000000..225d78b0
--- /dev/null
+++ b/examples/datavisualization/qmlscatter/qmlscatter.qrc
@@ -0,0 +1,7 @@
+<RCC>
+ <qresource prefix="/">
+ <file>qml/qmlscatter/Data.qml</file>
+ <file>qml/qmlscatter/main.qml</file>
+ <file>qml/qmlscatter/NewButton.qml</file>
+ </qresource>
+</RCC>
diff --git a/examples/datavisualization/qmlscatter/qmlscatter64.png b/examples/datavisualization/qmlscatter/qmlscatter64.png
new file mode 100644
index 00000000..707d5c4e
--- /dev/null
+++ b/examples/datavisualization/qmlscatter/qmlscatter64.png
Binary files differ
diff --git a/examples/datavisualization/qmlscatter/qtquick2applicationviewer/qtquick2applicationviewer.cpp b/examples/datavisualization/qmlscatter/qtquick2applicationviewer/qtquick2applicationviewer.cpp
new file mode 100644
index 00000000..10709d7a
--- /dev/null
+++ b/examples/datavisualization/qmlscatter/qtquick2applicationviewer/qtquick2applicationviewer.cpp
@@ -0,0 +1,81 @@
+// checksum 0x4f6f version 0x90005
+/*
+ This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
+ QtQuick2ApplicationViewer is a convenience class containing mobile device specific
+ code such as screen orientation handling. Also QML paths and debugging are
+ handled here.
+ It is recommended not to modify this file, since newer versions of Qt Creator
+ may offer an updated version of it.
+*/
+
+#include "qtquick2applicationviewer.h"
+
+#include <QtCore/QCoreApplication>
+#include <QtCore/QDir>
+#include <QtQml/QQmlEngine>
+
+class QtQuick2ApplicationViewerPrivate
+{
+ QString mainQmlFile;
+ friend class QtQuick2ApplicationViewer;
+ static QString adjustPath(const QString &path);
+};
+
+QString QtQuick2ApplicationViewerPrivate::adjustPath(const QString &path)
+{
+#if defined(Q_OS_MAC)
+ if (!QDir::isAbsolutePath(path))
+ return QString::fromLatin1("%1/../Resources/%2")
+ .arg(QCoreApplication::applicationDirPath(), path);
+#elif defined(Q_OS_BLACKBERRY)
+ if (!QDir::isAbsolutePath(path))
+ return QString::fromLatin1("app/native/%1").arg(path);
+#elif !defined(Q_OS_ANDROID)
+ QString pathInInstallDir =
+ QString::fromLatin1("%1/../%2").arg(QCoreApplication::applicationDirPath(), path);
+ if (QFileInfo(pathInInstallDir).exists())
+ return pathInInstallDir;
+ pathInInstallDir =
+ QString::fromLatin1("%1/%2").arg(QCoreApplication::applicationDirPath(), path);
+ if (QFileInfo(pathInInstallDir).exists())
+ return pathInInstallDir;
+#endif
+ return path;
+}
+
+QtQuick2ApplicationViewer::QtQuick2ApplicationViewer(QWindow *parent)
+ : QQuickView(parent)
+ , d(new QtQuick2ApplicationViewerPrivate())
+{
+ connect(engine(), SIGNAL(quit()), SLOT(close()));
+ setResizeMode(QQuickView::SizeRootObjectToView);
+}
+
+QtQuick2ApplicationViewer::~QtQuick2ApplicationViewer()
+{
+ delete d;
+}
+
+void QtQuick2ApplicationViewer::setMainQmlFile(const QString &file)
+{
+ d->mainQmlFile = QtQuick2ApplicationViewerPrivate::adjustPath(file);
+#ifdef Q_OS_ANDROID
+ setSource(QUrl(QLatin1String("assets:/")+d->mainQmlFile));
+#else
+ setSource(QUrl::fromLocalFile(d->mainQmlFile));
+#endif
+}
+
+void QtQuick2ApplicationViewer::addImportPath(const QString &path)
+{
+ engine()->addImportPath(QtQuick2ApplicationViewerPrivate::adjustPath(path));
+}
+
+void QtQuick2ApplicationViewer::showExpanded()
+{
+#if defined(Q_WS_SIMULATOR) || defined(Q_OS_QNX)
+ showFullScreen();
+#else
+ show();
+#endif
+}
diff --git a/examples/datavisualization/qmlscatter/qtquick2applicationviewer/qtquick2applicationviewer.h b/examples/datavisualization/qmlscatter/qtquick2applicationviewer/qtquick2applicationviewer.h
new file mode 100644
index 00000000..cf66f140
--- /dev/null
+++ b/examples/datavisualization/qmlscatter/qtquick2applicationviewer/qtquick2applicationviewer.h
@@ -0,0 +1,33 @@
+// checksum 0xfde6 version 0x90005
+/*
+ This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
+ QtQuick2ApplicationViewer is a convenience class containing mobile device specific
+ code such as screen orientation handling. Also QML paths and debugging are
+ handled here.
+ It is recommended not to modify this file, since newer versions of Qt Creator
+ may offer an updated version of it.
+*/
+
+#ifndef QTQUICK2APPLICATIONVIEWER_H
+#define QTQUICK2APPLICATIONVIEWER_H
+
+#include <QtQuick/QQuickView>
+
+class QtQuick2ApplicationViewer : public QQuickView
+{
+ Q_OBJECT
+
+public:
+ explicit QtQuick2ApplicationViewer(QWindow *parent = 0);
+ virtual ~QtQuick2ApplicationViewer();
+
+ void setMainQmlFile(const QString &file);
+ void addImportPath(const QString &path);
+
+ void showExpanded();
+
+private:
+ class QtQuick2ApplicationViewerPrivate *d;
+};
+
+#endif // QTQUICK2APPLICATIONVIEWER_H
diff --git a/examples/datavisualization/qmlscatter/qtquick2applicationviewer/qtquick2applicationviewer.pri b/examples/datavisualization/qmlscatter/qtquick2applicationviewer/qtquick2applicationviewer.pri
new file mode 100644
index 00000000..e5f7990f
--- /dev/null
+++ b/examples/datavisualization/qmlscatter/qtquick2applicationviewer/qtquick2applicationviewer.pri
@@ -0,0 +1,180 @@
+# checksum 0x7b0d version 0x90005
+# This file was generated by the Qt Quick 2 Application wizard of Qt Creator.
+# The code below adds the QtQuick2ApplicationViewer to the project and handles
+# the activation of QML debugging.
+# It is recommended not to modify this file, since newer versions of Qt Creator
+# may offer an updated version of it.
+
+QT += qml quick
+
+SOURCES += $$PWD/qtquick2applicationviewer.cpp
+HEADERS += $$PWD/qtquick2applicationviewer.h
+INCLUDEPATH += $$PWD
+# This file was generated by an application wizard of Qt Creator.
+# The code below handles deployment to Android and Maemo, aswell as copying
+# of the application data to shadow build directories on desktop.
+# It is recommended not to modify this file, since newer versions of Qt Creator
+# may offer an updated version of it.
+
+defineTest(qtcAddDeployment) {
+for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ greaterThan(QT_MAJOR_VERSION, 4) {
+ itemsources = $${item}.files
+ } else {
+ itemsources = $${item}.sources
+ }
+ $$itemsources = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath= $$eval($${deploymentfolder}.target)
+ export($$itemsources)
+ export($$itempath)
+ DEPLOYMENT += $$item
+}
+
+MAINPROFILEPWD = $$PWD
+
+android-no-sdk {
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemfiles = $${item}.files
+ $$itemfiles = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath = /data/user/qt/$$eval($${deploymentfolder}.target)
+ export($$itemfiles)
+ export($$itempath)
+ INSTALLS += $$item
+ }
+
+ target.path = /data/user/qt
+
+ export(target.path)
+ INSTALLS += target
+} else:android {
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemfiles = $${item}.files
+ $$itemfiles = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath = /assets/$$eval($${deploymentfolder}.target)
+ export($$itemfiles)
+ export($$itempath)
+ INSTALLS += $$item
+ }
+
+ x86 {
+ target.path = /libs/x86
+ } else: armeabi-v7a {
+ target.path = /libs/armeabi-v7a
+ } else {
+ target.path = /libs/armeabi
+ }
+
+ export(target.path)
+ INSTALLS += target
+} else:win32 {
+ copyCommand =
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
+ source = $$replace(source, /, \\)
+ sourcePathSegments = $$split(source, \\)
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)/$$last(sourcePathSegments)
+ target = $$replace(target, /, \\)
+ target ~= s,\\\\\\.?\\\\,\\,
+ !isEqual(source,$$target) {
+ !isEmpty(copyCommand):copyCommand += &&
+ isEqual(QMAKE_DIR_SEP, \\) {
+ copyCommand += $(COPY_DIR) \"$$source\" \"$$target\"
+ } else {
+ source = $$replace(source, \\\\, /)
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
+ target = $$replace(target, \\\\, /)
+ copyCommand += test -d \"$$target\" || mkdir -p \"$$target\" && cp -r \"$$source\" \"$$target\"
+ }
+ }
+ }
+ !isEmpty(copyCommand) {
+ copyCommand = @echo Copying application data... && $$copyCommand
+ copydeploymentfolders.commands = $$copyCommand
+ first.depends = $(first) copydeploymentfolders
+ export(first.depends)
+ export(copydeploymentfolders.commands)
+ QMAKE_EXTRA_TARGETS += first copydeploymentfolders
+ }
+} else:unix {
+ maemo5 {
+ desktopfile.files = $${TARGET}.desktop
+ desktopfile.path = /usr/share/applications/hildon
+ icon.files = $${TARGET}64.png
+ icon.path = /usr/share/icons/hicolor/64x64/apps
+ } else:!isEmpty(MEEGO_VERSION_MAJOR) {
+ desktopfile.files = $${TARGET}_harmattan.desktop
+ desktopfile.path = /usr/share/applications
+ icon.files = $${TARGET}80.png
+ icon.path = /usr/share/icons/hicolor/80x80/apps
+ } else { # Assumed to be a Desktop Unix
+ copyCommand =
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
+ source = $$replace(source, \\\\, /)
+ macx {
+ target = $$OUT_PWD/$${TARGET}.app/Contents/Resources/$$eval($${deploymentfolder}.target)
+ } else {
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
+ }
+ target = $$replace(target, \\\\, /)
+ sourcePathSegments = $$split(source, /)
+ targetFullPath = $$target/$$last(sourcePathSegments)
+ targetFullPath ~= s,/\\.?/,/,
+ !isEqual(source,$$targetFullPath) {
+ !isEmpty(copyCommand):copyCommand += &&
+ copyCommand += $(MKDIR) \"$$target\"
+ copyCommand += && $(COPY_DIR) \"$$source\" \"$$target\"
+ }
+ }
+ !isEmpty(copyCommand) {
+ copyCommand = @echo Copying application data... && $$copyCommand
+ copydeploymentfolders.commands = $$copyCommand
+ first.depends = $(first) copydeploymentfolders
+ export(first.depends)
+ export(copydeploymentfolders.commands)
+ QMAKE_EXTRA_TARGETS += first copydeploymentfolders
+ }
+ }
+ !isEmpty(target.path) {
+ installPrefix = $${target.path}
+ } else {
+ installPrefix = /opt/$${TARGET}
+ }
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemfiles = $${item}.files
+ $$itemfiles = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath = $${installPrefix}/$$eval($${deploymentfolder}.target)
+ export($$itemfiles)
+ export($$itempath)
+ INSTALLS += $$item
+ }
+
+ !isEmpty(desktopfile.path) {
+ export(icon.files)
+ export(icon.path)
+ export(desktopfile.files)
+ export(desktopfile.path)
+ INSTALLS += icon desktopfile
+ }
+
+ isEmpty(target.path) {
+ target.path = $${installPrefix}/bin
+ export(target.path)
+ }
+ INSTALLS += target
+}
+
+export (ICON)
+export (INSTALLS)
+export (DEPLOYMENT)
+export (LIBS)
+export (QMAKE_EXTRA_TARGETS)
+}
diff --git a/examples/datavisualization/qmlsurface/doc/images/qmlsurface-example.png b/examples/datavisualization/qmlsurface/doc/images/qmlsurface-example.png
new file mode 100644
index 00000000..d8d394fa
--- /dev/null
+++ b/examples/datavisualization/qmlsurface/doc/images/qmlsurface-example.png
Binary files differ
diff --git a/examples/datavisualization/qmlsurface/doc/src/qmlsurface.qdoc b/examples/datavisualization/qmlsurface/doc/src/qmlsurface.qdoc
new file mode 100644
index 00000000..00ef03d4
--- /dev/null
+++ b/examples/datavisualization/qmlsurface/doc/src/qmlsurface.qdoc
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+/*!
+ \example qmlsurface
+ \title Qt Quick 2 Surface Example
+ \ingroup qtdatavisualization_examples
+ \brief Using Surface3D in a QML application.
+
+ The Qt Quick 2 surface example shows how to make a simple 3D surface plot using Surface3D with
+ Qt Quick 2.
+
+ \image qmlsurface-example.png
+
+ The focus in this example is on generating a surface graph from height data, so in this section
+ we skip explaining the application creation. For more detailed QML example documentation,
+ see \l{Qt Quick 2 Scatter Example}.
+
+ \section1 Adding data to the graph
+
+ This example shows two methods to set data to surface graph, using the HeightMapSurfaceDataProxy
+ and ItemModelSurfaceDataProxy. First we go through setting the data using the height map specific
+ data proxy. It is done with the code snippet below. The proxy itself is contained in a
+ Surface3DSeries. Inside the HeightMapSurfaceDataProxy the \c heightMapFile specifies the
+ image file containing the height data. The value properties in the proxy define the minimum
+ and maximum values for surface area width and depth. This example shows the terrain around Tycho
+ crater at imaginary position from 67 to 97 and from 30 to 60. Note that on the graph the scale
+ on the Y dimension exaggerates the height.
+
+ \snippet ../examples/qmlsurface/qml/qmlsurface/main.qml 4
+
+ The other method to set surface data used in this example is with model mapping. We do that by
+ first defining a \c ListModel containing the data for the surface:
+
+ \snippet ../examples/qmlsurface/qml/qmlsurface/Data.qml 0
+ \dots 4
+
+ Then we set up a Surface3DSeries with a ItemModelSurfaceDataProxy:
+
+ \snippet ../examples/qmlsurface/qml/qmlsurface/main.qml 5
+ \dots
+
+ We add the actual data to the \c itemModel of the ItemModelSurfaceDataProxy. We also define the
+ roles for columns, rows and values. In this example the row holds values for longitude, column
+ for latitude and the value is for height.
+
+ \dots 0
+ \snippet ../examples/qmlsurface/qml/qmlsurface/main.qml 6
+
+ \section1 Showing data
+
+ In the \c main.qml, we set up the Surface3D element to show the data and various UI elements
+ to illustrate few interesting features.
+
+ First is the gradient to be used for the surface, which can be defined as seen in the following
+ snippet. With the ColorGradient we set example colors from position 0.0 to 1.0.
+
+ \snippet ../examples/qmlsurface/qml/qmlsurface/main.qml 0
+
+ This element is set into the \c baseGradients property in the \c theme used in Surface3D:
+
+ \snippet ../examples/qmlsurface/qml/qmlsurface/main.qml 7
+
+ Other interesting features can be controlled with buttons.
+
+ The first button is to toggle on and off the surface grid, for which we use the following code:
+
+ \snippet ../examples/qmlsurface/qml/qmlsurface/main.qml 1
+
+ Second button is for surface shading mode, which is controlled with this code:
+
+ \snippet ../examples/qmlsurface/qml/qmlsurface/main.qml 2
+
+ Third button is for series visibility, which is controlled with this code:
+
+ \snippet ../examples/qmlsurface/qml/qmlsurface/main.qml 8
+
+ Notice that the \c drawMode and \c flatShadingEnable properties are set for both series.
+
+ Fourth and fifth buttons are for controlling background features.
+
+ The last button is for switching between the two series, one of which uses
+ HeightMapSurfaceDataProxy and the other one ItemModelSurfaceDataProxy. For this we use the
+ following code:
+
+ \snippet ../examples/qmlsurface/qml/qmlsurface/main.qml 3
+
+ We also set the maximum value to 500 in model proxy to make the surface flatter and
+ 250 on height map proxy to show exaggerated height. At the same time the middle color position
+ on the gradient is modified to match the value range change.
+
+ \section1 Example contents
+*/
diff --git a/examples/datavisualization/qmlsurface/heightmap.png b/examples/datavisualization/qmlsurface/heightmap.png
new file mode 100644
index 00000000..051a0125
--- /dev/null
+++ b/examples/datavisualization/qmlsurface/heightmap.png
Binary files differ
diff --git a/examples/datavisualization/qmlsurface/main.cpp b/examples/datavisualization/qmlsurface/main.cpp
new file mode 100644
index 00000000..3c31dee4
--- /dev/null
+++ b/examples/datavisualization/qmlsurface/main.cpp
@@ -0,0 +1,51 @@
+/****************************************************************************
+**
+** 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 "qtquick2applicationviewer.h"
+#include <QtDataVisualization/qutils.h>
+
+#include <QtGui/QGuiApplication>
+#include <QtCore/QDir>
+
+int main(int argc, char *argv[])
+{
+ QGuiApplication app(argc, argv);
+
+ QtQuick2ApplicationViewer viewer;
+
+ // Enable antialiasing
+ viewer.setFormat(QtDataVisualization::qDefaultSurfaceFormat());
+
+ // The following are needed to make examples run without having to install the module
+ // in desktop environments.
+#ifdef Q_OS_WIN
+ QString extraImportPath(QStringLiteral("%1/../../../../%2"));
+#else
+ QString extraImportPath(QStringLiteral("%1/../../../%2"));
+#endif
+ viewer.addImportPath(extraImportPath.arg(QGuiApplication::applicationDirPath(),
+ QString::fromLatin1("qml")));
+
+ viewer.setSource(QUrl("qrc:/qml/qml/qmlsurface/main.qml"));
+
+ viewer.setTitle(QStringLiteral("Tycho crater on the Moon (height exaggerated)"));
+ viewer.setResizeMode(QQuickView::SizeRootObjectToView);
+ viewer.show();
+
+ return app.exec();
+}
diff --git a/examples/datavisualization/qmlsurface/qml/qmlsurface/Data.qml b/examples/datavisualization/qmlsurface/qml/qmlsurface/Data.qml
new file mode 100644
index 00000000..5fd4ece8
--- /dev/null
+++ b/examples/datavisualization/qmlsurface/qml/qmlsurface/Data.qml
@@ -0,0 +1,10029 @@
+/****************************************************************************
+**
+** 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
+**
+****************************************************************************/
+
+import QtQuick 2.1
+
+Item {
+ property alias model: dataModel
+
+ //! [0]
+ ListModel {
+ id: dataModel
+ ListElement{ longitude: "0"; latitude: "0"; height: "124"; }
+ ListElement{ longitude: "0"; latitude: "1"; height: "125"; }
+ ListElement{ longitude: "0"; latitude: "2"; height: "124"; }
+ //! [0]
+ ListElement{ longitude: "0"; latitude: "3"; height: "118"; }
+ ListElement{ longitude: "0"; latitude: "4"; height: "112"; }
+ ListElement{ longitude: "0"; latitude: "5"; height: "111"; }
+ ListElement{ longitude: "0"; latitude: "6"; height: "115"; }
+ ListElement{ longitude: "0"; latitude: "7"; height: "102"; }
+ ListElement{ longitude: "0"; latitude: "8"; height: "115"; }
+ ListElement{ longitude: "0"; latitude: "9"; height: "126"; }
+ ListElement{ longitude: "0"; latitude: "10"; height: "127"; }
+ ListElement{ longitude: "0"; latitude: "11"; height: "127"; }
+ ListElement{ longitude: "0"; latitude: "12"; height: "124"; }
+ ListElement{ longitude: "0"; latitude: "13"; height: "120"; }
+ ListElement{ longitude: "0"; latitude: "14"; height: "117"; }
+ ListElement{ longitude: "0"; latitude: "15"; height: "116"; }
+ ListElement{ longitude: "0"; latitude: "16"; height: "114"; }
+ ListElement{ longitude: "0"; latitude: "17"; height: "112"; }
+ ListElement{ longitude: "0"; latitude: "18"; height: "114"; }
+ ListElement{ longitude: "0"; latitude: "19"; height: "114"; }
+ ListElement{ longitude: "0"; latitude: "20"; height: "112"; }
+ ListElement{ longitude: "0"; latitude: "21"; height: "112"; }
+ ListElement{ longitude: "0"; latitude: "22"; height: "116"; }
+ ListElement{ longitude: "0"; latitude: "23"; height: "117"; }
+ ListElement{ longitude: "0"; latitude: "24"; height: "118"; }
+ ListElement{ longitude: "0"; latitude: "25"; height: "119"; }
+ ListElement{ longitude: "0"; latitude: "26"; height: "117"; }
+ ListElement{ longitude: "0"; latitude: "27"; height: "115"; }
+ ListElement{ longitude: "0"; latitude: "28"; height: "112"; }
+ ListElement{ longitude: "0"; latitude: "29"; height: "109"; }
+ ListElement{ longitude: "0"; latitude: "30"; height: "108"; }
+ ListElement{ longitude: "0"; latitude: "31"; height: "105"; }
+ ListElement{ longitude: "0"; latitude: "32"; height: "105"; }
+ ListElement{ longitude: "0"; latitude: "33"; height: "104"; }
+ ListElement{ longitude: "0"; latitude: "34"; height: "105"; }
+ ListElement{ longitude: "0"; latitude: "35"; height: "107"; }
+ ListElement{ longitude: "0"; latitude: "36"; height: "110"; }
+ ListElement{ longitude: "0"; latitude: "37"; height: "114"; }
+ ListElement{ longitude: "0"; latitude: "38"; height: "117"; }
+ ListElement{ longitude: "0"; latitude: "39"; height: "119"; }
+ ListElement{ longitude: "0"; latitude: "40"; height: "121"; }
+ ListElement{ longitude: "0"; latitude: "41"; height: "123"; }
+ ListElement{ longitude: "0"; latitude: "42"; height: "125"; }
+ ListElement{ longitude: "0"; latitude: "43"; height: "126"; }
+ ListElement{ longitude: "0"; latitude: "44"; height: "119"; }
+ ListElement{ longitude: "0"; latitude: "45"; height: "115"; }
+ ListElement{ longitude: "0"; latitude: "46"; height: "114"; }
+ ListElement{ longitude: "0"; latitude: "47"; height: "123"; }
+ ListElement{ longitude: "0"; latitude: "48"; height: "131"; }
+ ListElement{ longitude: "0"; latitude: "49"; height: "130"; }
+ ListElement{ longitude: "0"; latitude: "50"; height: "128"; }
+ ListElement{ longitude: "0"; latitude: "51"; height: "124"; }
+ ListElement{ longitude: "0"; latitude: "52"; height: "121"; }
+ ListElement{ longitude: "0"; latitude: "53"; height: "120"; }
+ ListElement{ longitude: "0"; latitude: "54"; height: "118"; }
+ ListElement{ longitude: "0"; latitude: "55"; height: "116"; }
+ ListElement{ longitude: "0"; latitude: "56"; height: "116"; }
+ ListElement{ longitude: "0"; latitude: "57"; height: "115"; }
+ ListElement{ longitude: "0"; latitude: "58"; height: "112"; }
+ ListElement{ longitude: "0"; latitude: "59"; height: "110"; }
+ ListElement{ longitude: "0"; latitude: "60"; height: "109"; }
+ ListElement{ longitude: "0"; latitude: "61"; height: "107"; }
+ ListElement{ longitude: "0"; latitude: "62"; height: "107"; }
+ ListElement{ longitude: "0"; latitude: "63"; height: "108"; }
+ ListElement{ longitude: "0"; latitude: "64"; height: "110"; }
+ ListElement{ longitude: "0"; latitude: "65"; height: "113"; }
+ ListElement{ longitude: "0"; latitude: "66"; height: "115"; }
+ ListElement{ longitude: "0"; latitude: "67"; height: "117"; }
+ ListElement{ longitude: "0"; latitude: "68"; height: "119"; }
+ ListElement{ longitude: "0"; latitude: "69"; height: "121"; }
+ ListElement{ longitude: "0"; latitude: "70"; height: "122"; }
+ ListElement{ longitude: "0"; latitude: "71"; height: "124"; }
+ ListElement{ longitude: "0"; latitude: "72"; height: "125"; }
+ ListElement{ longitude: "0"; latitude: "73"; height: "125"; }
+ ListElement{ longitude: "0"; latitude: "74"; height: "125"; }
+ ListElement{ longitude: "0"; latitude: "75"; height: "123"; }
+ ListElement{ longitude: "0"; latitude: "76"; height: "123"; }
+ ListElement{ longitude: "0"; latitude: "77"; height: "122"; }
+ ListElement{ longitude: "0"; latitude: "78"; height: "125"; }
+ ListElement{ longitude: "0"; latitude: "79"; height: "129"; }
+ ListElement{ longitude: "0"; latitude: "80"; height: "135"; }
+ ListElement{ longitude: "0"; latitude: "81"; height: "138"; }
+ ListElement{ longitude: "0"; latitude: "82"; height: "136"; }
+ ListElement{ longitude: "0"; latitude: "83"; height: "129"; }
+ ListElement{ longitude: "0"; latitude: "84"; height: "121"; }
+ ListElement{ longitude: "0"; latitude: "85"; height: "116"; }
+ ListElement{ longitude: "0"; latitude: "86"; height: "115"; }
+ ListElement{ longitude: "0"; latitude: "87"; height: "118"; }
+ ListElement{ longitude: "0"; latitude: "88"; height: "122"; }
+ ListElement{ longitude: "0"; latitude: "89"; height: "127"; }
+ ListElement{ longitude: "0"; latitude: "90"; height: "129"; }
+ ListElement{ longitude: "0"; latitude: "91"; height: "130"; }
+ ListElement{ longitude: "0"; latitude: "92"; height: "130"; }
+ ListElement{ longitude: "0"; latitude: "93"; height: "128"; }
+ ListElement{ longitude: "0"; latitude: "94"; height: "128"; }
+ ListElement{ longitude: "0"; latitude: "95"; height: "129"; }
+ ListElement{ longitude: "0"; latitude: "96"; height: "133"; }
+ ListElement{ longitude: "0"; latitude: "97"; height: "138"; }
+ ListElement{ longitude: "0"; latitude: "98"; height: "139"; }
+ ListElement{ longitude: "0"; latitude: "99"; height: "128"; }
+ ListElement{ longitude: "1"; latitude: "0"; height: "120"; }
+ ListElement{ longitude: "1"; latitude: "1"; height: "120"; }
+ ListElement{ longitude: "1"; latitude: "2"; height: "118"; }
+ ListElement{ longitude: "1"; latitude: "3"; height: "110"; }
+ ListElement{ longitude: "1"; latitude: "4"; height: "105"; }
+ ListElement{ longitude: "1"; latitude: "5"; height: "110"; }
+ ListElement{ longitude: "1"; latitude: "6"; height: "116"; }
+ ListElement{ longitude: "1"; latitude: "7"; height: "117"; }
+ ListElement{ longitude: "1"; latitude: "8"; height: "123"; }
+ ListElement{ longitude: "1"; latitude: "9"; height: "128"; }
+ ListElement{ longitude: "1"; latitude: "10"; height: "131"; }
+ ListElement{ longitude: "1"; latitude: "11"; height: "130"; }
+ ListElement{ longitude: "1"; latitude: "12"; height: "128"; }
+ ListElement{ longitude: "1"; latitude: "13"; height: "122"; }
+ ListElement{ longitude: "1"; latitude: "14"; height: "119"; }
+ ListElement{ longitude: "1"; latitude: "15"; height: "116"; }
+ ListElement{ longitude: "1"; latitude: "16"; height: "113"; }
+ ListElement{ longitude: "1"; latitude: "17"; height: "109"; }
+ ListElement{ longitude: "1"; latitude: "18"; height: "109"; }
+ ListElement{ longitude: "1"; latitude: "19"; height: "109"; }
+ ListElement{ longitude: "1"; latitude: "20"; height: "107"; }
+ ListElement{ longitude: "1"; latitude: "21"; height: "109"; }
+ ListElement{ longitude: "1"; latitude: "22"; height: "109"; }
+ ListElement{ longitude: "1"; latitude: "23"; height: "114"; }
+ ListElement{ longitude: "1"; latitude: "24"; height: "117"; }
+ ListElement{ longitude: "1"; latitude: "25"; height: "121"; }
+ ListElement{ longitude: "1"; latitude: "26"; height: "120"; }
+ ListElement{ longitude: "1"; latitude: "27"; height: "118"; }
+ ListElement{ longitude: "1"; latitude: "28"; height: "115"; }
+ ListElement{ longitude: "1"; latitude: "29"; height: "112"; }
+ ListElement{ longitude: "1"; latitude: "30"; height: "110"; }
+ ListElement{ longitude: "1"; latitude: "31"; height: "104"; }
+ ListElement{ longitude: "1"; latitude: "32"; height: "104"; }
+ ListElement{ longitude: "1"; latitude: "33"; height: "103"; }
+ ListElement{ longitude: "1"; latitude: "34"; height: "101"; }
+ ListElement{ longitude: "1"; latitude: "35"; height: "105"; }
+ ListElement{ longitude: "1"; latitude: "36"; height: "108"; }
+ ListElement{ longitude: "1"; latitude: "37"; height: "113"; }
+ ListElement{ longitude: "1"; latitude: "38"; height: "116"; }
+ ListElement{ longitude: "1"; latitude: "39"; height: "117"; }
+ ListElement{ longitude: "1"; latitude: "40"; height: "120"; }
+ ListElement{ longitude: "1"; latitude: "41"; height: "121"; }
+ ListElement{ longitude: "1"; latitude: "42"; height: "121"; }
+ ListElement{ longitude: "1"; latitude: "43"; height: "128"; }
+ ListElement{ longitude: "1"; latitude: "44"; height: "128"; }
+ ListElement{ longitude: "1"; latitude: "45"; height: "126"; }
+ ListElement{ longitude: "1"; latitude: "46"; height: "130"; }
+ ListElement{ longitude: "1"; latitude: "47"; height: "133"; }
+ ListElement{ longitude: "1"; latitude: "48"; height: "134"; }
+ ListElement{ longitude: "1"; latitude: "49"; height: "133"; }
+ ListElement{ longitude: "1"; latitude: "50"; height: "133"; }
+ ListElement{ longitude: "1"; latitude: "51"; height: "128"; }
+ ListElement{ longitude: "1"; latitude: "52"; height: "125"; }
+ ListElement{ longitude: "1"; latitude: "53"; height: "122"; }
+ ListElement{ longitude: "1"; latitude: "54"; height: "118"; }
+ ListElement{ longitude: "1"; latitude: "55"; height: "116"; }
+ ListElement{ longitude: "1"; latitude: "56"; height: "116"; }
+ ListElement{ longitude: "1"; latitude: "57"; height: "117"; }
+ ListElement{ longitude: "1"; latitude: "58"; height: "114"; }
+ ListElement{ longitude: "1"; latitude: "59"; height: "113"; }
+ ListElement{ longitude: "1"; latitude: "60"; height: "109"; }
+ ListElement{ longitude: "1"; latitude: "61"; height: "106"; }
+ ListElement{ longitude: "1"; latitude: "62"; height: "103"; }
+ ListElement{ longitude: "1"; latitude: "63"; height: "105"; }
+ ListElement{ longitude: "1"; latitude: "64"; height: "105"; }
+ ListElement{ longitude: "1"; latitude: "65"; height: "111"; }
+ ListElement{ longitude: "1"; latitude: "66"; height: "112"; }
+ ListElement{ longitude: "1"; latitude: "67"; height: "114"; }
+ ListElement{ longitude: "1"; latitude: "68"; height: "117"; }
+ ListElement{ longitude: "1"; latitude: "69"; height: "119"; }
+ ListElement{ longitude: "1"; latitude: "70"; height: "120"; }
+ ListElement{ longitude: "1"; latitude: "71"; height: "122"; }
+ ListElement{ longitude: "1"; latitude: "72"; height: "123"; }
+ ListElement{ longitude: "1"; latitude: "73"; height: "125"; }
+ ListElement{ longitude: "1"; latitude: "74"; height: "124"; }
+ ListElement{ longitude: "1"; latitude: "75"; height: "123"; }
+ ListElement{ longitude: "1"; latitude: "76"; height: "120"; }
+ ListElement{ longitude: "1"; latitude: "77"; height: "120"; }
+ ListElement{ longitude: "1"; latitude: "78"; height: "122"; }
+ ListElement{ longitude: "1"; latitude: "79"; height: "128"; }
+ ListElement{ longitude: "1"; latitude: "80"; height: "135"; }
+ ListElement{ longitude: "1"; latitude: "81"; height: "140"; }
+ ListElement{ longitude: "1"; latitude: "82"; height: "137"; }
+ ListElement{ longitude: "1"; latitude: "83"; height: "132"; }
+ ListElement{ longitude: "1"; latitude: "84"; height: "124"; }
+ ListElement{ longitude: "1"; latitude: "85"; height: "116"; }
+ ListElement{ longitude: "1"; latitude: "86"; height: "115"; }
+ ListElement{ longitude: "1"; latitude: "87"; height: "120"; }
+ ListElement{ longitude: "1"; latitude: "88"; height: "125"; }
+ ListElement{ longitude: "1"; latitude: "89"; height: "131"; }
+ ListElement{ longitude: "1"; latitude: "90"; height: "134"; }
+ ListElement{ longitude: "1"; latitude: "91"; height: "136"; }
+ ListElement{ longitude: "1"; latitude: "92"; height: "134"; }
+ ListElement{ longitude: "1"; latitude: "93"; height: "131"; }
+ ListElement{ longitude: "1"; latitude: "94"; height: "130"; }
+ ListElement{ longitude: "1"; latitude: "95"; height: "130"; }
+ ListElement{ longitude: "1"; latitude: "96"; height: "133"; }
+ ListElement{ longitude: "1"; latitude: "97"; height: "139"; }
+ ListElement{ longitude: "1"; latitude: "98"; height: "140"; }
+ ListElement{ longitude: "1"; latitude: "99"; height: "124"; }
+ ListElement{ longitude: "2"; latitude: "0"; height: "116"; }
+ ListElement{ longitude: "2"; latitude: "1"; height: "116"; }
+ ListElement{ longitude: "2"; latitude: "2"; height: "111"; }
+ ListElement{ longitude: "2"; latitude: "3"; height: "105"; }
+ ListElement{ longitude: "2"; latitude: "4"; height: "108"; }
+ ListElement{ longitude: "2"; latitude: "5"; height: "110"; }
+ ListElement{ longitude: "2"; latitude: "6"; height: "114"; }
+ ListElement{ longitude: "2"; latitude: "7"; height: "118"; }
+ ListElement{ longitude: "2"; latitude: "8"; height: "124"; }
+ ListElement{ longitude: "2"; latitude: "9"; height: "130"; }
+ ListElement{ longitude: "2"; latitude: "10"; height: "131"; }
+ ListElement{ longitude: "2"; latitude: "11"; height: "134"; }
+ ListElement{ longitude: "2"; latitude: "12"; height: "133"; }
+ ListElement{ longitude: "2"; latitude: "13"; height: "128"; }
+ ListElement{ longitude: "2"; latitude: "14"; height: "125"; }
+ ListElement{ longitude: "2"; latitude: "15"; height: "119"; }
+ ListElement{ longitude: "2"; latitude: "16"; height: "115"; }
+ ListElement{ longitude: "2"; latitude: "17"; height: "111"; }
+ ListElement{ longitude: "2"; latitude: "18"; height: "105"; }
+ ListElement{ longitude: "2"; latitude: "19"; height: "102"; }
+ ListElement{ longitude: "2"; latitude: "20"; height: "99"; }
+ ListElement{ longitude: "2"; latitude: "21"; height: "102"; }
+ ListElement{ longitude: "2"; latitude: "22"; height: "106"; }
+ ListElement{ longitude: "2"; latitude: "23"; height: "110"; }
+ ListElement{ longitude: "2"; latitude: "24"; height: "115"; }
+ ListElement{ longitude: "2"; latitude: "25"; height: "122"; }
+ ListElement{ longitude: "2"; latitude: "26"; height: "122"; }
+ ListElement{ longitude: "2"; latitude: "27"; height: "121"; }
+ ListElement{ longitude: "2"; latitude: "28"; height: "118"; }
+ ListElement{ longitude: "2"; latitude: "29"; height: "115"; }
+ ListElement{ longitude: "2"; latitude: "30"; height: "111"; }
+ ListElement{ longitude: "2"; latitude: "31"; height: "79"; }
+ ListElement{ longitude: "2"; latitude: "32"; height: "94"; }
+ ListElement{ longitude: "2"; latitude: "33"; height: "103"; }
+ ListElement{ longitude: "2"; latitude: "34"; height: "102"; }
+ ListElement{ longitude: "2"; latitude: "35"; height: "103"; }
+ ListElement{ longitude: "2"; latitude: "36"; height: "107"; }
+ ListElement{ longitude: "2"; latitude: "37"; height: "113"; }
+ ListElement{ longitude: "2"; latitude: "38"; height: "116"; }
+ ListElement{ longitude: "2"; latitude: "39"; height: "118"; }
+ ListElement{ longitude: "2"; latitude: "40"; height: "117"; }
+ ListElement{ longitude: "2"; latitude: "41"; height: "119"; }
+ ListElement{ longitude: "2"; latitude: "42"; height: "119"; }
+ ListElement{ longitude: "2"; latitude: "43"; height: "121"; }
+ ListElement{ longitude: "2"; latitude: "44"; height: "123"; }
+ ListElement{ longitude: "2"; latitude: "45"; height: "127"; }
+ ListElement{ longitude: "2"; latitude: "46"; height: "131"; }
+ ListElement{ longitude: "2"; latitude: "47"; height: "132"; }
+ ListElement{ longitude: "2"; latitude: "48"; height: "132"; }
+ ListElement{ longitude: "2"; latitude: "49"; height: "135"; }
+ ListElement{ longitude: "2"; latitude: "50"; height: "134"; }
+ ListElement{ longitude: "2"; latitude: "51"; height: "130"; }
+ ListElement{ longitude: "2"; latitude: "52"; height: "128"; }
+ ListElement{ longitude: "2"; latitude: "53"; height: "123"; }
+ ListElement{ longitude: "2"; latitude: "54"; height: "120"; }
+ ListElement{ longitude: "2"; latitude: "55"; height: "118"; }
+ ListElement{ longitude: "2"; latitude: "56"; height: "118"; }
+ ListElement{ longitude: "2"; latitude: "57"; height: "123"; }
+ ListElement{ longitude: "2"; latitude: "58"; height: "121"; }
+ ListElement{ longitude: "2"; latitude: "59"; height: "120"; }
+ ListElement{ longitude: "2"; latitude: "60"; height: "114"; }
+ ListElement{ longitude: "2"; latitude: "61"; height: "107"; }
+ ListElement{ longitude: "2"; latitude: "62"; height: "103"; }
+ ListElement{ longitude: "2"; latitude: "63"; height: "103"; }
+ ListElement{ longitude: "2"; latitude: "64"; height: "106"; }
+ ListElement{ longitude: "2"; latitude: "65"; height: "108"; }
+ ListElement{ longitude: "2"; latitude: "66"; height: "109"; }
+ ListElement{ longitude: "2"; latitude: "67"; height: "114"; }
+ ListElement{ longitude: "2"; latitude: "68"; height: "117"; }
+ ListElement{ longitude: "2"; latitude: "69"; height: "121"; }
+ ListElement{ longitude: "2"; latitude: "70"; height: "121"; }
+ ListElement{ longitude: "2"; latitude: "71"; height: "122"; }
+ ListElement{ longitude: "2"; latitude: "72"; height: "123"; }
+ ListElement{ longitude: "2"; latitude: "73"; height: "123"; }
+ ListElement{ longitude: "2"; latitude: "74"; height: "122"; }
+ ListElement{ longitude: "2"; latitude: "75"; height: "123"; }
+ ListElement{ longitude: "2"; latitude: "76"; height: "120"; }
+ ListElement{ longitude: "2"; latitude: "77"; height: "118"; }
+ ListElement{ longitude: "2"; latitude: "78"; height: "119"; }
+ ListElement{ longitude: "2"; latitude: "79"; height: "125"; }
+ ListElement{ longitude: "2"; latitude: "80"; height: "130"; }
+ ListElement{ longitude: "2"; latitude: "81"; height: "138"; }
+ ListElement{ longitude: "2"; latitude: "82"; height: "138"; }
+ ListElement{ longitude: "2"; latitude: "83"; height: "131"; }
+ ListElement{ longitude: "2"; latitude: "84"; height: "125"; }
+ ListElement{ longitude: "2"; latitude: "85"; height: "122"; }
+ ListElement{ longitude: "2"; latitude: "86"; height: "121"; }
+ ListElement{ longitude: "2"; latitude: "87"; height: "133"; }
+ ListElement{ longitude: "2"; latitude: "88"; height: "132"; }
+ ListElement{ longitude: "2"; latitude: "89"; height: "135"; }
+ ListElement{ longitude: "2"; latitude: "90"; height: "138"; }
+ ListElement{ longitude: "2"; latitude: "91"; height: "137"; }
+ ListElement{ longitude: "2"; latitude: "92"; height: "137"; }
+ ListElement{ longitude: "2"; latitude: "93"; height: "134"; }
+ ListElement{ longitude: "2"; latitude: "94"; height: "133"; }
+ ListElement{ longitude: "2"; latitude: "95"; height: "133"; }
+ ListElement{ longitude: "2"; latitude: "96"; height: "133"; }
+ ListElement{ longitude: "2"; latitude: "97"; height: "140"; }
+ ListElement{ longitude: "2"; latitude: "98"; height: "140"; }
+ ListElement{ longitude: "2"; latitude: "99"; height: "121"; }
+ ListElement{ longitude: "3"; latitude: "0"; height: "115"; }
+ ListElement{ longitude: "3"; latitude: "1"; height: "111"; }
+ ListElement{ longitude: "3"; latitude: "2"; height: "108"; }
+ ListElement{ longitude: "3"; latitude: "3"; height: "107"; }
+ ListElement{ longitude: "3"; latitude: "4"; height: "108"; }
+ ListElement{ longitude: "3"; latitude: "5"; height: "111"; }
+ ListElement{ longitude: "3"; latitude: "6"; height: "117"; }
+ ListElement{ longitude: "3"; latitude: "7"; height: "119"; }
+ ListElement{ longitude: "3"; latitude: "8"; height: "124"; }
+ ListElement{ longitude: "3"; latitude: "9"; height: "130"; }
+ ListElement{ longitude: "3"; latitude: "10"; height: "133"; }
+ ListElement{ longitude: "3"; latitude: "11"; height: "136"; }
+ ListElement{ longitude: "3"; latitude: "12"; height: "136"; }
+ ListElement{ longitude: "3"; latitude: "13"; height: "132"; }
+ ListElement{ longitude: "3"; latitude: "14"; height: "129"; }
+ ListElement{ longitude: "3"; latitude: "15"; height: "125"; }
+ ListElement{ longitude: "3"; latitude: "16"; height: "119"; }
+ ListElement{ longitude: "3"; latitude: "17"; height: "115"; }
+ ListElement{ longitude: "3"; latitude: "18"; height: "106"; }
+ ListElement{ longitude: "3"; latitude: "19"; height: "101"; }
+ ListElement{ longitude: "3"; latitude: "20"; height: "99"; }
+ ListElement{ longitude: "3"; latitude: "21"; height: "98"; }
+ ListElement{ longitude: "3"; latitude: "22"; height: "103"; }
+ ListElement{ longitude: "3"; latitude: "23"; height: "109"; }
+ ListElement{ longitude: "3"; latitude: "24"; height: "115"; }
+ ListElement{ longitude: "3"; latitude: "25"; height: "121"; }
+ ListElement{ longitude: "3"; latitude: "26"; height: "126"; }
+ ListElement{ longitude: "3"; latitude: "27"; height: "127"; }
+ ListElement{ longitude: "3"; latitude: "28"; height: "123"; }
+ ListElement{ longitude: "3"; latitude: "29"; height: "117"; }
+ ListElement{ longitude: "3"; latitude: "30"; height: "116"; }
+ ListElement{ longitude: "3"; latitude: "31"; height: "106"; }
+ ListElement{ longitude: "3"; latitude: "32"; height: "105"; }
+ ListElement{ longitude: "3"; latitude: "33"; height: "100"; }
+ ListElement{ longitude: "3"; latitude: "34"; height: "99"; }
+ ListElement{ longitude: "3"; latitude: "35"; height: "103"; }
+ ListElement{ longitude: "3"; latitude: "36"; height: "106"; }
+ ListElement{ longitude: "3"; latitude: "37"; height: "114"; }
+ ListElement{ longitude: "3"; latitude: "38"; height: "115"; }
+ ListElement{ longitude: "3"; latitude: "39"; height: "115"; }
+ ListElement{ longitude: "3"; latitude: "40"; height: "115"; }
+ ListElement{ longitude: "3"; latitude: "41"; height: "116"; }
+ ListElement{ longitude: "3"; latitude: "42"; height: "117"; }
+ ListElement{ longitude: "3"; latitude: "43"; height: "119"; }
+ ListElement{ longitude: "3"; latitude: "44"; height: "124"; }
+ ListElement{ longitude: "3"; latitude: "45"; height: "127"; }
+ ListElement{ longitude: "3"; latitude: "46"; height: "129"; }
+ ListElement{ longitude: "3"; latitude: "47"; height: "128"; }
+ ListElement{ longitude: "3"; latitude: "48"; height: "135"; }
+ ListElement{ longitude: "3"; latitude: "49"; height: "139"; }
+ ListElement{ longitude: "3"; latitude: "50"; height: "139"; }
+ ListElement{ longitude: "3"; latitude: "51"; height: "136"; }
+ ListElement{ longitude: "3"; latitude: "52"; height: "130"; }
+ ListElement{ longitude: "3"; latitude: "53"; height: "126"; }
+ ListElement{ longitude: "3"; latitude: "54"; height: "121"; }
+ ListElement{ longitude: "3"; latitude: "55"; height: "120"; }
+ ListElement{ longitude: "3"; latitude: "56"; height: "121"; }
+ ListElement{ longitude: "3"; latitude: "57"; height: "128"; }
+ ListElement{ longitude: "3"; latitude: "58"; height: "98"; }
+ ListElement{ longitude: "3"; latitude: "59"; height: "78"; }
+ ListElement{ longitude: "3"; latitude: "60"; height: "115"; }
+ ListElement{ longitude: "3"; latitude: "61"; height: "112"; }
+ ListElement{ longitude: "3"; latitude: "62"; height: "108"; }
+ ListElement{ longitude: "3"; latitude: "63"; height: "106"; }
+ ListElement{ longitude: "3"; latitude: "64"; height: "105"; }
+ ListElement{ longitude: "3"; latitude: "65"; height: "108"; }
+ ListElement{ longitude: "3"; latitude: "66"; height: "111"; }
+ ListElement{ longitude: "3"; latitude: "67"; height: "115"; }
+ ListElement{ longitude: "3"; latitude: "68"; height: "120"; }
+ ListElement{ longitude: "3"; latitude: "69"; height: "121"; }
+ ListElement{ longitude: "3"; latitude: "70"; height: "123"; }
+ ListElement{ longitude: "3"; latitude: "71"; height: "124"; }
+ ListElement{ longitude: "3"; latitude: "72"; height: "126"; }
+ ListElement{ longitude: "3"; latitude: "73"; height: "127"; }
+ ListElement{ longitude: "3"; latitude: "74"; height: "126"; }
+ ListElement{ longitude: "3"; latitude: "75"; height: "124"; }
+ ListElement{ longitude: "3"; latitude: "76"; height: "121"; }
+ ListElement{ longitude: "3"; latitude: "77"; height: "117"; }
+ ListElement{ longitude: "3"; latitude: "78"; height: "113"; }
+ ListElement{ longitude: "3"; latitude: "79"; height: "119"; }
+ ListElement{ longitude: "3"; latitude: "80"; height: "124"; }
+ ListElement{ longitude: "3"; latitude: "81"; height: "130"; }
+ ListElement{ longitude: "3"; latitude: "82"; height: "133"; }
+ ListElement{ longitude: "3"; latitude: "83"; height: "131"; }
+ ListElement{ longitude: "3"; latitude: "84"; height: "124"; }
+ ListElement{ longitude: "3"; latitude: "85"; height: "122"; }
+ ListElement{ longitude: "3"; latitude: "86"; height: "66"; }
+ ListElement{ longitude: "3"; latitude: "87"; height: "109"; }
+ ListElement{ longitude: "3"; latitude: "88"; height: "136"; }
+ ListElement{ longitude: "3"; latitude: "89"; height: "142"; }
+ ListElement{ longitude: "3"; latitude: "90"; height: "144"; }
+ ListElement{ longitude: "3"; latitude: "91"; height: "144"; }
+ ListElement{ longitude: "3"; latitude: "92"; height: "141"; }
+ ListElement{ longitude: "3"; latitude: "93"; height: "137"; }
+ ListElement{ longitude: "3"; latitude: "94"; height: "136"; }
+ ListElement{ longitude: "3"; latitude: "95"; height: "136"; }
+ ListElement{ longitude: "3"; latitude: "96"; height: "139"; }
+ ListElement{ longitude: "3"; latitude: "97"; height: "142"; }
+ ListElement{ longitude: "3"; latitude: "98"; height: "142"; }
+ ListElement{ longitude: "3"; latitude: "99"; height: "120"; }
+ ListElement{ longitude: "4"; latitude: "0"; height: "112"; }
+ ListElement{ longitude: "4"; latitude: "1"; height: "107"; }
+ ListElement{ longitude: "4"; latitude: "2"; height: "107"; }
+ ListElement{ longitude: "4"; latitude: "3"; height: "106"; }
+ ListElement{ longitude: "4"; latitude: "4"; height: "110"; }
+ ListElement{ longitude: "4"; latitude: "5"; height: "113"; }
+ ListElement{ longitude: "4"; latitude: "6"; height: "117"; }
+ ListElement{ longitude: "4"; latitude: "7"; height: "122"; }
+ ListElement{ longitude: "4"; latitude: "8"; height: "128"; }
+ ListElement{ longitude: "4"; latitude: "9"; height: "131"; }
+ ListElement{ longitude: "4"; latitude: "10"; height: "134"; }
+ ListElement{ longitude: "4"; latitude: "11"; height: "135"; }
+ ListElement{ longitude: "4"; latitude: "12"; height: "135"; }
+ ListElement{ longitude: "4"; latitude: "13"; height: "135"; }
+ ListElement{ longitude: "4"; latitude: "14"; height: "133"; }
+ ListElement{ longitude: "4"; latitude: "15"; height: "131"; }
+ ListElement{ longitude: "4"; latitude: "16"; height: "125"; }
+ ListElement{ longitude: "4"; latitude: "17"; height: "119"; }
+ ListElement{ longitude: "4"; latitude: "18"; height: "111"; }
+ ListElement{ longitude: "4"; latitude: "19"; height: "107"; }
+ ListElement{ longitude: "4"; latitude: "20"; height: "100"; }
+ ListElement{ longitude: "4"; latitude: "21"; height: "102"; }
+ ListElement{ longitude: "4"; latitude: "22"; height: "103"; }
+ ListElement{ longitude: "4"; latitude: "23"; height: "110"; }
+ ListElement{ longitude: "4"; latitude: "24"; height: "115"; }
+ ListElement{ longitude: "4"; latitude: "25"; height: "124"; }
+ ListElement{ longitude: "4"; latitude: "26"; height: "126"; }
+ ListElement{ longitude: "4"; latitude: "27"; height: "131"; }
+ ListElement{ longitude: "4"; latitude: "28"; height: "108"; }
+ ListElement{ longitude: "4"; latitude: "29"; height: "103"; }
+ ListElement{ longitude: "4"; latitude: "30"; height: "117"; }
+ ListElement{ longitude: "4"; latitude: "31"; height: "114"; }
+ ListElement{ longitude: "4"; latitude: "32"; height: "105"; }
+ ListElement{ longitude: "4"; latitude: "33"; height: "101"; }
+ ListElement{ longitude: "4"; latitude: "34"; height: "101"; }
+ ListElement{ longitude: "4"; latitude: "35"; height: "103"; }
+ ListElement{ longitude: "4"; latitude: "36"; height: "108"; }
+ ListElement{ longitude: "4"; latitude: "37"; height: "112"; }
+ ListElement{ longitude: "4"; latitude: "38"; height: "114"; }
+ ListElement{ longitude: "4"; latitude: "39"; height: "116"; }
+ ListElement{ longitude: "4"; latitude: "40"; height: "116"; }
+ ListElement{ longitude: "4"; latitude: "41"; height: "117"; }
+ ListElement{ longitude: "4"; latitude: "42"; height: "117"; }
+ ListElement{ longitude: "4"; latitude: "43"; height: "121"; }
+ ListElement{ longitude: "4"; latitude: "44"; height: "122"; }
+ ListElement{ longitude: "4"; latitude: "45"; height: "125"; }
+ ListElement{ longitude: "4"; latitude: "46"; height: "127"; }
+ ListElement{ longitude: "4"; latitude: "47"; height: "130"; }
+ ListElement{ longitude: "4"; latitude: "48"; height: "137"; }
+ ListElement{ longitude: "4"; latitude: "49"; height: "147"; }
+ ListElement{ longitude: "4"; latitude: "50"; height: "143"; }
+ ListElement{ longitude: "4"; latitude: "51"; height: "143"; }
+ ListElement{ longitude: "4"; latitude: "52"; height: "133"; }
+ ListElement{ longitude: "4"; latitude: "53"; height: "127"; }
+ ListElement{ longitude: "4"; latitude: "54"; height: "123"; }
+ ListElement{ longitude: "4"; latitude: "55"; height: "121"; }
+ ListElement{ longitude: "4"; latitude: "56"; height: "123"; }
+ ListElement{ longitude: "4"; latitude: "57"; height: "132"; }
+ ListElement{ longitude: "4"; latitude: "58"; height: "125"; }
+ ListElement{ longitude: "4"; latitude: "59"; height: "120"; }
+ ListElement{ longitude: "4"; latitude: "60"; height: "123"; }
+ ListElement{ longitude: "4"; latitude: "61"; height: "116"; }
+ ListElement{ longitude: "4"; latitude: "62"; height: "111"; }
+ ListElement{ longitude: "4"; latitude: "63"; height: "109"; }
+ ListElement{ longitude: "4"; latitude: "64"; height: "107"; }
+ ListElement{ longitude: "4"; latitude: "65"; height: "110"; }
+ ListElement{ longitude: "4"; latitude: "66"; height: "113"; }
+ ListElement{ longitude: "4"; latitude: "67"; height: "117"; }
+ ListElement{ longitude: "4"; latitude: "68"; height: "123"; }
+ ListElement{ longitude: "4"; latitude: "69"; height: "126"; }
+ ListElement{ longitude: "4"; latitude: "70"; height: "127"; }
+ ListElement{ longitude: "4"; latitude: "71"; height: "128"; }
+ ListElement{ longitude: "4"; latitude: "72"; height: "128"; }
+ ListElement{ longitude: "4"; latitude: "73"; height: "128"; }
+ ListElement{ longitude: "4"; latitude: "74"; height: "116"; }
+ ListElement{ longitude: "4"; latitude: "75"; height: "116"; }
+ ListElement{ longitude: "4"; latitude: "76"; height: "130"; }
+ ListElement{ longitude: "4"; latitude: "77"; height: "116"; }
+ ListElement{ longitude: "4"; latitude: "78"; height: "112"; }
+ ListElement{ longitude: "4"; latitude: "79"; height: "115"; }
+ ListElement{ longitude: "4"; latitude: "80"; height: "120"; }
+ ListElement{ longitude: "4"; latitude: "81"; height: "126"; }
+ ListElement{ longitude: "4"; latitude: "82"; height: "128"; }
+ ListElement{ longitude: "4"; latitude: "83"; height: "126"; }
+ ListElement{ longitude: "4"; latitude: "84"; height: "124"; }
+ ListElement{ longitude: "4"; latitude: "85"; height: "128"; }
+ ListElement{ longitude: "4"; latitude: "86"; height: "121"; }
+ ListElement{ longitude: "4"; latitude: "87"; height: "132"; }
+ ListElement{ longitude: "4"; latitude: "88"; height: "141"; }
+ ListElement{ longitude: "4"; latitude: "89"; height: "147"; }
+ ListElement{ longitude: "4"; latitude: "90"; height: "148"; }
+ ListElement{ longitude: "4"; latitude: "91"; height: "147"; }
+ ListElement{ longitude: "4"; latitude: "92"; height: "144"; }
+ ListElement{ longitude: "4"; latitude: "93"; height: "141"; }
+ ListElement{ longitude: "4"; latitude: "94"; height: "138"; }
+ ListElement{ longitude: "4"; latitude: "95"; height: "138"; }
+ ListElement{ longitude: "4"; latitude: "96"; height: "141"; }
+ ListElement{ longitude: "4"; latitude: "97"; height: "145"; }
+ ListElement{ longitude: "4"; latitude: "98"; height: "143"; }
+ ListElement{ longitude: "4"; latitude: "99"; height: "121"; }
+ ListElement{ longitude: "5"; latitude: "0"; height: "112"; }
+ ListElement{ longitude: "5"; latitude: "1"; height: "109"; }
+ ListElement{ longitude: "5"; latitude: "2"; height: "108"; }
+ ListElement{ longitude: "5"; latitude: "3"; height: "107"; }
+ ListElement{ longitude: "5"; latitude: "4"; height: "112"; }
+ ListElement{ longitude: "5"; latitude: "5"; height: "116"; }
+ ListElement{ longitude: "5"; latitude: "6"; height: "122"; }
+ ListElement{ longitude: "5"; latitude: "7"; height: "126"; }
+ ListElement{ longitude: "5"; latitude: "8"; height: "130"; }
+ ListElement{ longitude: "5"; latitude: "9"; height: "133"; }
+ ListElement{ longitude: "5"; latitude: "10"; height: "135"; }
+ ListElement{ longitude: "5"; latitude: "11"; height: "136"; }
+ ListElement{ longitude: "5"; latitude: "12"; height: "137"; }
+ ListElement{ longitude: "5"; latitude: "13"; height: "129"; }
+ ListElement{ longitude: "5"; latitude: "14"; height: "126"; }
+ ListElement{ longitude: "5"; latitude: "15"; height: "134"; }
+ ListElement{ longitude: "5"; latitude: "16"; height: "129"; }
+ ListElement{ longitude: "5"; latitude: "17"; height: "123"; }
+ ListElement{ longitude: "5"; latitude: "18"; height: "116"; }
+ ListElement{ longitude: "5"; latitude: "19"; height: "108"; }
+ ListElement{ longitude: "5"; latitude: "20"; height: "102"; }
+ ListElement{ longitude: "5"; latitude: "21"; height: "102"; }
+ ListElement{ longitude: "5"; latitude: "22"; height: "105"; }
+ ListElement{ longitude: "5"; latitude: "23"; height: "113"; }
+ ListElement{ longitude: "5"; latitude: "24"; height: "118"; }
+ ListElement{ longitude: "5"; latitude: "25"; height: "127"; }
+ ListElement{ longitude: "5"; latitude: "26"; height: "130"; }
+ ListElement{ longitude: "5"; latitude: "27"; height: "133"; }
+ ListElement{ longitude: "5"; latitude: "28"; height: "129"; }
+ ListElement{ longitude: "5"; latitude: "29"; height: "123"; }
+ ListElement{ longitude: "5"; latitude: "30"; height: "66"; }
+ ListElement{ longitude: "5"; latitude: "31"; height: "102"; }
+ ListElement{ longitude: "5"; latitude: "32"; height: "106"; }
+ ListElement{ longitude: "5"; latitude: "33"; height: "100"; }
+ ListElement{ longitude: "5"; latitude: "34"; height: "100"; }
+ ListElement{ longitude: "5"; latitude: "35"; height: "104"; }
+ ListElement{ longitude: "5"; latitude: "36"; height: "107"; }
+ ListElement{ longitude: "5"; latitude: "37"; height: "110"; }
+ ListElement{ longitude: "5"; latitude: "38"; height: "112"; }
+ ListElement{ longitude: "5"; latitude: "39"; height: "113"; }
+ ListElement{ longitude: "5"; latitude: "40"; height: "114"; }
+ ListElement{ longitude: "5"; latitude: "41"; height: "116"; }
+ ListElement{ longitude: "5"; latitude: "42"; height: "118"; }
+ ListElement{ longitude: "5"; latitude: "43"; height: "121"; }
+ ListElement{ longitude: "5"; latitude: "44"; height: "123"; }
+ ListElement{ longitude: "5"; latitude: "45"; height: "127"; }
+ ListElement{ longitude: "5"; latitude: "46"; height: "127"; }
+ ListElement{ longitude: "5"; latitude: "47"; height: "130"; }
+ ListElement{ longitude: "5"; latitude: "48"; height: "137"; }
+ ListElement{ longitude: "5"; latitude: "49"; height: "139"; }
+ ListElement{ longitude: "5"; latitude: "50"; height: "77"; }
+ ListElement{ longitude: "5"; latitude: "51"; height: "123"; }
+ ListElement{ longitude: "5"; latitude: "52"; height: "131"; }
+ ListElement{ longitude: "5"; latitude: "53"; height: "126"; }
+ ListElement{ longitude: "5"; latitude: "54"; height: "123"; }
+ ListElement{ longitude: "5"; latitude: "55"; height: "123"; }
+ ListElement{ longitude: "5"; latitude: "56"; height: "124"; }
+ ListElement{ longitude: "5"; latitude: "57"; height: "127"; }
+ ListElement{ longitude: "5"; latitude: "58"; height: "129"; }
+ ListElement{ longitude: "5"; latitude: "59"; height: "129"; }
+ ListElement{ longitude: "5"; latitude: "60"; height: "123"; }
+ ListElement{ longitude: "5"; latitude: "61"; height: "121"; }
+ ListElement{ longitude: "5"; latitude: "62"; height: "116"; }
+ ListElement{ longitude: "5"; latitude: "63"; height: "113"; }
+ ListElement{ longitude: "5"; latitude: "64"; height: "110"; }
+ ListElement{ longitude: "5"; latitude: "65"; height: "111"; }
+ ListElement{ longitude: "5"; latitude: "66"; height: "116"; }
+ ListElement{ longitude: "5"; latitude: "67"; height: "121"; }
+ ListElement{ longitude: "5"; latitude: "68"; height: "127"; }
+ ListElement{ longitude: "5"; latitude: "69"; height: "130"; }
+ ListElement{ longitude: "5"; latitude: "70"; height: "130"; }
+ ListElement{ longitude: "5"; latitude: "71"; height: "131"; }
+ ListElement{ longitude: "5"; latitude: "72"; height: "133"; }
+ ListElement{ longitude: "5"; latitude: "73"; height: "128"; }
+ ListElement{ longitude: "5"; latitude: "74"; height: "107"; }
+ ListElement{ longitude: "5"; latitude: "75"; height: "74"; }
+ ListElement{ longitude: "5"; latitude: "76"; height: "121"; }
+ ListElement{ longitude: "5"; latitude: "77"; height: "116"; }
+ ListElement{ longitude: "5"; latitude: "78"; height: "109"; }
+ ListElement{ longitude: "5"; latitude: "79"; height: "110"; }
+ ListElement{ longitude: "5"; latitude: "80"; height: "113"; }
+ ListElement{ longitude: "5"; latitude: "81"; height: "118"; }
+ ListElement{ longitude: "5"; latitude: "82"; height: "120"; }
+ ListElement{ longitude: "5"; latitude: "83"; height: "124"; }
+ ListElement{ longitude: "5"; latitude: "84"; height: "123"; }
+ ListElement{ longitude: "5"; latitude: "85"; height: "122"; }
+ ListElement{ longitude: "5"; latitude: "86"; height: "127"; }
+ ListElement{ longitude: "5"; latitude: "87"; height: "135"; }
+ ListElement{ longitude: "5"; latitude: "88"; height: "140"; }
+ ListElement{ longitude: "5"; latitude: "89"; height: "146"; }
+ ListElement{ longitude: "5"; latitude: "90"; height: "150"; }
+ ListElement{ longitude: "5"; latitude: "91"; height: "148"; }
+ ListElement{ longitude: "5"; latitude: "92"; height: "146"; }
+ ListElement{ longitude: "5"; latitude: "93"; height: "142"; }
+ ListElement{ longitude: "5"; latitude: "94"; height: "140"; }
+ ListElement{ longitude: "5"; latitude: "95"; height: "140"; }
+ ListElement{ longitude: "5"; latitude: "96"; height: "142"; }
+ ListElement{ longitude: "5"; latitude: "97"; height: "144"; }
+ ListElement{ longitude: "5"; latitude: "98"; height: "145"; }
+ ListElement{ longitude: "5"; latitude: "99"; height: "123"; }
+ ListElement{ longitude: "6"; latitude: "0"; height: "115"; }
+ ListElement{ longitude: "6"; latitude: "1"; height: "111"; }
+ ListElement{ longitude: "6"; latitude: "2"; height: "110"; }
+ ListElement{ longitude: "6"; latitude: "3"; height: "111"; }
+ ListElement{ longitude: "6"; latitude: "4"; height: "116"; }
+ ListElement{ longitude: "6"; latitude: "5"; height: "119"; }
+ ListElement{ longitude: "6"; latitude: "6"; height: "125"; }
+ ListElement{ longitude: "6"; latitude: "7"; height: "129"; }
+ ListElement{ longitude: "6"; latitude: "8"; height: "132"; }
+ ListElement{ longitude: "6"; latitude: "9"; height: "132"; }
+ ListElement{ longitude: "6"; latitude: "10"; height: "135"; }
+ ListElement{ longitude: "6"; latitude: "11"; height: "136"; }
+ ListElement{ longitude: "6"; latitude: "12"; height: "135"; }
+ ListElement{ longitude: "6"; latitude: "13"; height: "126"; }
+ ListElement{ longitude: "6"; latitude: "14"; height: "137"; }
+ ListElement{ longitude: "6"; latitude: "15"; height: "136"; }
+ ListElement{ longitude: "6"; latitude: "16"; height: "132"; }
+ ListElement{ longitude: "6"; latitude: "17"; height: "128"; }
+ ListElement{ longitude: "6"; latitude: "18"; height: "118"; }
+ ListElement{ longitude: "6"; latitude: "19"; height: "111"; }
+ ListElement{ longitude: "6"; latitude: "20"; height: "105"; }
+ ListElement{ longitude: "6"; latitude: "21"; height: "106"; }
+ ListElement{ longitude: "6"; latitude: "22"; height: "107"; }
+ ListElement{ longitude: "6"; latitude: "23"; height: "115"; }
+ ListElement{ longitude: "6"; latitude: "24"; height: "121"; }
+ ListElement{ longitude: "6"; latitude: "25"; height: "111"; }
+ ListElement{ longitude: "6"; latitude: "26"; height: "78"; }
+ ListElement{ longitude: "6"; latitude: "27"; height: "131"; }
+ ListElement{ longitude: "6"; latitude: "28"; height: "130"; }
+ ListElement{ longitude: "6"; latitude: "29"; height: "129"; }
+ ListElement{ longitude: "6"; latitude: "30"; height: "103"; }
+ ListElement{ longitude: "6"; latitude: "31"; height: "113"; }
+ ListElement{ longitude: "6"; latitude: "32"; height: "108"; }
+ ListElement{ longitude: "6"; latitude: "33"; height: "103"; }
+ ListElement{ longitude: "6"; latitude: "34"; height: "103"; }
+ ListElement{ longitude: "6"; latitude: "35"; height: "107"; }
+ ListElement{ longitude: "6"; latitude: "36"; height: "109"; }
+ ListElement{ longitude: "6"; latitude: "37"; height: "113"; }
+ ListElement{ longitude: "6"; latitude: "38"; height: "112"; }
+ ListElement{ longitude: "6"; latitude: "39"; height: "115"; }
+ ListElement{ longitude: "6"; latitude: "40"; height: "115"; }
+ ListElement{ longitude: "6"; latitude: "41"; height: "119"; }
+ ListElement{ longitude: "6"; latitude: "42"; height: "122"; }
+ ListElement{ longitude: "6"; latitude: "43"; height: "125"; }
+ ListElement{ longitude: "6"; latitude: "44"; height: "127"; }
+ ListElement{ longitude: "6"; latitude: "45"; height: "127"; }
+ ListElement{ longitude: "6"; latitude: "46"; height: "129"; }
+ ListElement{ longitude: "6"; latitude: "47"; height: "131"; }
+ ListElement{ longitude: "6"; latitude: "48"; height: "133"; }
+ ListElement{ longitude: "6"; latitude: "49"; height: "141"; }
+ ListElement{ longitude: "6"; latitude: "50"; height: "135"; }
+ ListElement{ longitude: "6"; latitude: "51"; height: "137"; }
+ ListElement{ longitude: "6"; latitude: "52"; height: "132"; }
+ ListElement{ longitude: "6"; latitude: "53"; height: "124"; }
+ ListElement{ longitude: "6"; latitude: "54"; height: "122"; }
+ ListElement{ longitude: "6"; latitude: "55"; height: "125"; }
+ ListElement{ longitude: "6"; latitude: "56"; height: "126"; }
+ ListElement{ longitude: "6"; latitude: "57"; height: "127"; }
+ ListElement{ longitude: "6"; latitude: "58"; height: "128"; }
+ ListElement{ longitude: "6"; latitude: "59"; height: "127"; }
+ ListElement{ longitude: "6"; latitude: "60"; height: "126"; }
+ ListElement{ longitude: "6"; latitude: "61"; height: "124"; }
+ ListElement{ longitude: "6"; latitude: "62"; height: "120"; }
+ ListElement{ longitude: "6"; latitude: "63"; height: "118"; }
+ ListElement{ longitude: "6"; latitude: "64"; height: "118"; }
+ ListElement{ longitude: "6"; latitude: "65"; height: "117"; }
+ ListElement{ longitude: "6"; latitude: "66"; height: "119"; }
+ ListElement{ longitude: "6"; latitude: "67"; height: "124"; }
+ ListElement{ longitude: "6"; latitude: "68"; height: "125"; }
+ ListElement{ longitude: "6"; latitude: "69"; height: "130"; }
+ ListElement{ longitude: "6"; latitude: "70"; height: "132"; }
+ ListElement{ longitude: "6"; latitude: "71"; height: "135"; }
+ ListElement{ longitude: "6"; latitude: "72"; height: "136"; }
+ ListElement{ longitude: "6"; latitude: "73"; height: "135"; }
+ ListElement{ longitude: "6"; latitude: "74"; height: "131"; }
+ ListElement{ longitude: "6"; latitude: "75"; height: "135"; }
+ ListElement{ longitude: "6"; latitude: "76"; height: "123"; }
+ ListElement{ longitude: "6"; latitude: "77"; height: "112"; }
+ ListElement{ longitude: "6"; latitude: "78"; height: "106"; }
+ ListElement{ longitude: "6"; latitude: "79"; height: "106"; }
+ ListElement{ longitude: "6"; latitude: "80"; height: "107"; }
+ ListElement{ longitude: "6"; latitude: "81"; height: "110"; }
+ ListElement{ longitude: "6"; latitude: "82"; height: "114"; }
+ ListElement{ longitude: "6"; latitude: "83"; height: "116"; }
+ ListElement{ longitude: "6"; latitude: "84"; height: "92"; }
+ ListElement{ longitude: "6"; latitude: "85"; height: "105"; }
+ ListElement{ longitude: "6"; latitude: "86"; height: "124"; }
+ ListElement{ longitude: "6"; latitude: "87"; height: "130"; }
+ ListElement{ longitude: "6"; latitude: "88"; height: "138"; }
+ ListElement{ longitude: "6"; latitude: "89"; height: "142"; }
+ ListElement{ longitude: "6"; latitude: "90"; height: "147"; }
+ ListElement{ longitude: "6"; latitude: "91"; height: "147"; }
+ ListElement{ longitude: "6"; latitude: "92"; height: "142"; }
+ ListElement{ longitude: "6"; latitude: "93"; height: "139"; }
+ ListElement{ longitude: "6"; latitude: "94"; height: "138"; }
+ ListElement{ longitude: "6"; latitude: "95"; height: "136"; }
+ ListElement{ longitude: "6"; latitude: "96"; height: "141"; }
+ ListElement{ longitude: "6"; latitude: "97"; height: "142"; }
+ ListElement{ longitude: "6"; latitude: "98"; height: "146"; }
+ ListElement{ longitude: "6"; latitude: "99"; height: "126"; }
+ ListElement{ longitude: "7"; latitude: "0"; height: "117"; }
+ ListElement{ longitude: "7"; latitude: "1"; height: "111"; }
+ ListElement{ longitude: "7"; latitude: "2"; height: "108"; }
+ ListElement{ longitude: "7"; latitude: "3"; height: "112"; }
+ ListElement{ longitude: "7"; latitude: "4"; height: "119"; }
+ ListElement{ longitude: "7"; latitude: "5"; height: "124"; }
+ ListElement{ longitude: "7"; latitude: "6"; height: "130"; }
+ ListElement{ longitude: "7"; latitude: "7"; height: "131"; }
+ ListElement{ longitude: "7"; latitude: "8"; height: "133"; }
+ ListElement{ longitude: "7"; latitude: "9"; height: "136"; }
+ ListElement{ longitude: "7"; latitude: "10"; height: "133"; }
+ ListElement{ longitude: "7"; latitude: "11"; height: "134"; }
+ ListElement{ longitude: "7"; latitude: "12"; height: "138"; }
+ ListElement{ longitude: "7"; latitude: "13"; height: "138"; }
+ ListElement{ longitude: "7"; latitude: "14"; height: "138"; }
+ ListElement{ longitude: "7"; latitude: "15"; height: "138"; }
+ ListElement{ longitude: "7"; latitude: "16"; height: "136"; }
+ ListElement{ longitude: "7"; latitude: "17"; height: "129"; }
+ ListElement{ longitude: "7"; latitude: "18"; height: "123"; }
+ ListElement{ longitude: "7"; latitude: "19"; height: "115"; }
+ ListElement{ longitude: "7"; latitude: "20"; height: "109"; }
+ ListElement{ longitude: "7"; latitude: "21"; height: "109"; }
+ ListElement{ longitude: "7"; latitude: "22"; height: "109"; }
+ ListElement{ longitude: "7"; latitude: "23"; height: "117"; }
+ ListElement{ longitude: "7"; latitude: "24"; height: "124"; }
+ ListElement{ longitude: "7"; latitude: "25"; height: "122"; }
+ ListElement{ longitude: "7"; latitude: "26"; height: "105"; }
+ ListElement{ longitude: "7"; latitude: "27"; height: "131"; }
+ ListElement{ longitude: "7"; latitude: "28"; height: "127"; }
+ ListElement{ longitude: "7"; latitude: "29"; height: "127"; }
+ ListElement{ longitude: "7"; latitude: "30"; height: "121"; }
+ ListElement{ longitude: "7"; latitude: "31"; height: "115"; }
+ ListElement{ longitude: "7"; latitude: "32"; height: "110"; }
+ ListElement{ longitude: "7"; latitude: "33"; height: "108"; }
+ ListElement{ longitude: "7"; latitude: "34"; height: "107"; }
+ ListElement{ longitude: "7"; latitude: "35"; height: "113"; }
+ ListElement{ longitude: "7"; latitude: "36"; height: "115"; }
+ ListElement{ longitude: "7"; latitude: "37"; height: "115"; }
+ ListElement{ longitude: "7"; latitude: "38"; height: "114"; }
+ ListElement{ longitude: "7"; latitude: "39"; height: "114"; }
+ ListElement{ longitude: "7"; latitude: "40"; height: "116"; }
+ ListElement{ longitude: "7"; latitude: "41"; height: "119"; }
+ ListElement{ longitude: "7"; latitude: "42"; height: "122"; }
+ ListElement{ longitude: "7"; latitude: "43"; height: "127"; }
+ ListElement{ longitude: "7"; latitude: "44"; height: "129"; }
+ ListElement{ longitude: "7"; latitude: "45"; height: "129"; }
+ ListElement{ longitude: "7"; latitude: "46"; height: "132"; }
+ ListElement{ longitude: "7"; latitude: "47"; height: "132"; }
+ ListElement{ longitude: "7"; latitude: "48"; height: "135"; }
+ ListElement{ longitude: "7"; latitude: "49"; height: "136"; }
+ ListElement{ longitude: "7"; latitude: "50"; height: "137"; }
+ ListElement{ longitude: "7"; latitude: "51"; height: "133"; }
+ ListElement{ longitude: "7"; latitude: "52"; height: "130"; }
+ ListElement{ longitude: "7"; latitude: "53"; height: "126"; }
+ ListElement{ longitude: "7"; latitude: "54"; height: "124"; }
+ ListElement{ longitude: "7"; latitude: "55"; height: "125"; }
+ ListElement{ longitude: "7"; latitude: "56"; height: "124"; }
+ ListElement{ longitude: "7"; latitude: "57"; height: "125"; }
+ ListElement{ longitude: "7"; latitude: "58"; height: "127"; }
+ ListElement{ longitude: "7"; latitude: "59"; height: "127"; }
+ ListElement{ longitude: "7"; latitude: "60"; height: "127"; }
+ ListElement{ longitude: "7"; latitude: "61"; height: "127"; }
+ ListElement{ longitude: "7"; latitude: "62"; height: "126"; }
+ ListElement{ longitude: "7"; latitude: "63"; height: "125"; }
+ ListElement{ longitude: "7"; latitude: "64"; height: "121"; }
+ ListElement{ longitude: "7"; latitude: "65"; height: "122"; }
+ ListElement{ longitude: "7"; latitude: "66"; height: "127"; }
+ ListElement{ longitude: "7"; latitude: "67"; height: "129"; }
+ ListElement{ longitude: "7"; latitude: "68"; height: "130"; }
+ ListElement{ longitude: "7"; latitude: "69"; height: "129"; }
+ ListElement{ longitude: "7"; latitude: "70"; height: "130"; }
+ ListElement{ longitude: "7"; latitude: "71"; height: "136"; }
+ ListElement{ longitude: "7"; latitude: "72"; height: "135"; }
+ ListElement{ longitude: "7"; latitude: "73"; height: "136"; }
+ ListElement{ longitude: "7"; latitude: "74"; height: "132"; }
+ ListElement{ longitude: "7"; latitude: "75"; height: "124"; }
+ ListElement{ longitude: "7"; latitude: "76"; height: "118"; }
+ ListElement{ longitude: "7"; latitude: "77"; height: "110"; }
+ ListElement{ longitude: "7"; latitude: "78"; height: "103"; }
+ ListElement{ longitude: "7"; latitude: "79"; height: "101"; }
+ ListElement{ longitude: "7"; latitude: "80"; height: "103"; }
+ ListElement{ longitude: "7"; latitude: "81"; height: "105"; }
+ ListElement{ longitude: "7"; latitude: "82"; height: "107"; }
+ ListElement{ longitude: "7"; latitude: "83"; height: "112"; }
+ ListElement{ longitude: "7"; latitude: "84"; height: "104"; }
+ ListElement{ longitude: "7"; latitude: "85"; height: "109"; }
+ ListElement{ longitude: "7"; latitude: "86"; height: "119"; }
+ ListElement{ longitude: "7"; latitude: "87"; height: "125"; }
+ ListElement{ longitude: "7"; latitude: "88"; height: "132"; }
+ ListElement{ longitude: "7"; latitude: "89"; height: "139"; }
+ ListElement{ longitude: "7"; latitude: "90"; height: "143"; }
+ ListElement{ longitude: "7"; latitude: "91"; height: "146"; }
+ ListElement{ longitude: "7"; latitude: "92"; height: "143"; }
+ ListElement{ longitude: "7"; latitude: "93"; height: "139"; }
+ ListElement{ longitude: "7"; latitude: "94"; height: "138"; }
+ ListElement{ longitude: "7"; latitude: "95"; height: "138"; }
+ ListElement{ longitude: "7"; latitude: "96"; height: "141"; }
+ ListElement{ longitude: "7"; latitude: "97"; height: "143"; }
+ ListElement{ longitude: "7"; latitude: "98"; height: "147"; }
+ ListElement{ longitude: "7"; latitude: "99"; height: "130"; }
+ ListElement{ longitude: "8"; latitude: "0"; height: "119"; }
+ ListElement{ longitude: "8"; latitude: "1"; height: "113"; }
+ ListElement{ longitude: "8"; latitude: "2"; height: "114"; }
+ ListElement{ longitude: "8"; latitude: "3"; height: "115"; }
+ ListElement{ longitude: "8"; latitude: "4"; height: "121"; }
+ ListElement{ longitude: "8"; latitude: "5"; height: "127"; }
+ ListElement{ longitude: "8"; latitude: "6"; height: "132"; }
+ ListElement{ longitude: "8"; latitude: "7"; height: "132"; }
+ ListElement{ longitude: "8"; latitude: "8"; height: "134"; }
+ ListElement{ longitude: "8"; latitude: "9"; height: "135"; }
+ ListElement{ longitude: "8"; latitude: "10"; height: "133"; }
+ ListElement{ longitude: "8"; latitude: "11"; height: "135"; }
+ ListElement{ longitude: "8"; latitude: "12"; height: "138"; }
+ ListElement{ longitude: "8"; latitude: "13"; height: "137"; }
+ ListElement{ longitude: "8"; latitude: "14"; height: "137"; }
+ ListElement{ longitude: "8"; latitude: "15"; height: "138"; }
+ ListElement{ longitude: "8"; latitude: "16"; height: "138"; }
+ ListElement{ longitude: "8"; latitude: "17"; height: "133"; }
+ ListElement{ longitude: "8"; latitude: "18"; height: "126"; }
+ ListElement{ longitude: "8"; latitude: "19"; height: "118"; }
+ ListElement{ longitude: "8"; latitude: "20"; height: "114"; }
+ ListElement{ longitude: "8"; latitude: "21"; height: "114"; }
+ ListElement{ longitude: "8"; latitude: "22"; height: "115"; }
+ ListElement{ longitude: "8"; latitude: "23"; height: "120"; }
+ ListElement{ longitude: "8"; latitude: "24"; height: "123"; }
+ ListElement{ longitude: "8"; latitude: "25"; height: "124"; }
+ ListElement{ longitude: "8"; latitude: "26"; height: "129"; }
+ ListElement{ longitude: "8"; latitude: "27"; height: "130"; }
+ ListElement{ longitude: "8"; latitude: "28"; height: "127"; }
+ ListElement{ longitude: "8"; latitude: "29"; height: "123"; }
+ ListElement{ longitude: "8"; latitude: "30"; height: "121"; }
+ ListElement{ longitude: "8"; latitude: "31"; height: "116"; }
+ ListElement{ longitude: "8"; latitude: "32"; height: "115"; }
+ ListElement{ longitude: "8"; latitude: "33"; height: "113"; }
+ ListElement{ longitude: "8"; latitude: "34"; height: "114"; }
+ ListElement{ longitude: "8"; latitude: "35"; height: "119"; }
+ ListElement{ longitude: "8"; latitude: "36"; height: "117"; }
+ ListElement{ longitude: "8"; latitude: "37"; height: "117"; }
+ ListElement{ longitude: "8"; latitude: "38"; height: "118"; }
+ ListElement{ longitude: "8"; latitude: "39"; height: "116"; }
+ ListElement{ longitude: "8"; latitude: "40"; height: "118"; }
+ ListElement{ longitude: "8"; latitude: "41"; height: "121"; }
+ ListElement{ longitude: "8"; latitude: "42"; height: "126"; }
+ ListElement{ longitude: "8"; latitude: "43"; height: "131"; }
+ ListElement{ longitude: "8"; latitude: "44"; height: "130"; }
+ ListElement{ longitude: "8"; latitude: "45"; height: "133"; }
+ ListElement{ longitude: "8"; latitude: "46"; height: "132"; }
+ ListElement{ longitude: "8"; latitude: "47"; height: "133"; }
+ ListElement{ longitude: "8"; latitude: "48"; height: "136"; }
+ ListElement{ longitude: "8"; latitude: "49"; height: "136"; }
+ ListElement{ longitude: "8"; latitude: "50"; height: "136"; }
+ ListElement{ longitude: "8"; latitude: "51"; height: "132"; }
+ ListElement{ longitude: "8"; latitude: "52"; height: "129"; }
+ ListElement{ longitude: "8"; latitude: "53"; height: "126"; }
+ ListElement{ longitude: "8"; latitude: "54"; height: "124"; }
+ ListElement{ longitude: "8"; latitude: "55"; height: "125"; }
+ ListElement{ longitude: "8"; latitude: "56"; height: "124"; }
+ ListElement{ longitude: "8"; latitude: "57"; height: "126"; }
+ ListElement{ longitude: "8"; latitude: "58"; height: "127"; }
+ ListElement{ longitude: "8"; latitude: "59"; height: "127"; }
+ ListElement{ longitude: "8"; latitude: "60"; height: "127"; }
+ ListElement{ longitude: "8"; latitude: "61"; height: "127"; }
+ ListElement{ longitude: "8"; latitude: "62"; height: "116"; }
+ ListElement{ longitude: "8"; latitude: "63"; height: "126"; }
+ ListElement{ longitude: "8"; latitude: "64"; height: "128"; }
+ ListElement{ longitude: "8"; latitude: "65"; height: "129"; }
+ ListElement{ longitude: "8"; latitude: "66"; height: "110"; }
+ ListElement{ longitude: "8"; latitude: "67"; height: "107"; }
+ ListElement{ longitude: "8"; latitude: "68"; height: "124"; }
+ ListElement{ longitude: "8"; latitude: "69"; height: "131"; }
+ ListElement{ longitude: "8"; latitude: "70"; height: "130"; }
+ ListElement{ longitude: "8"; latitude: "71"; height: "134"; }
+ ListElement{ longitude: "8"; latitude: "72"; height: "138"; }
+ ListElement{ longitude: "8"; latitude: "73"; height: "136"; }
+ ListElement{ longitude: "8"; latitude: "74"; height: "127"; }
+ ListElement{ longitude: "8"; latitude: "75"; height: "117"; }
+ ListElement{ longitude: "8"; latitude: "76"; height: "115"; }
+ ListElement{ longitude: "8"; latitude: "77"; height: "111"; }
+ ListElement{ longitude: "8"; latitude: "78"; height: "100"; }
+ ListElement{ longitude: "8"; latitude: "79"; height: "99"; }
+ ListElement{ longitude: "8"; latitude: "80"; height: "99"; }
+ ListElement{ longitude: "8"; latitude: "81"; height: "102"; }
+ ListElement{ longitude: "8"; latitude: "82"; height: "101"; }
+ ListElement{ longitude: "8"; latitude: "83"; height: "105"; }
+ ListElement{ longitude: "8"; latitude: "84"; height: "107"; }
+ ListElement{ longitude: "8"; latitude: "85"; height: "103"; }
+ ListElement{ longitude: "8"; latitude: "86"; height: "110"; }
+ ListElement{ longitude: "8"; latitude: "87"; height: "119"; }
+ ListElement{ longitude: "8"; latitude: "88"; height: "126"; }
+ ListElement{ longitude: "8"; latitude: "89"; height: "134"; }
+ ListElement{ longitude: "8"; latitude: "90"; height: "136"; }
+ ListElement{ longitude: "8"; latitude: "91"; height: "138"; }
+ ListElement{ longitude: "8"; latitude: "92"; height: "136"; }
+ ListElement{ longitude: "8"; latitude: "93"; height: "137"; }
+ ListElement{ longitude: "8"; latitude: "94"; height: "136"; }
+ ListElement{ longitude: "8"; latitude: "95"; height: "134"; }
+ ListElement{ longitude: "8"; latitude: "96"; height: "135"; }
+ ListElement{ longitude: "8"; latitude: "97"; height: "137"; }
+ ListElement{ longitude: "8"; latitude: "98"; height: "143"; }
+ ListElement{ longitude: "8"; latitude: "99"; height: "137"; }
+ ListElement{ longitude: "9"; latitude: "0"; height: "120"; }
+ ListElement{ longitude: "9"; latitude: "1"; height: "118"; }
+ ListElement{ longitude: "9"; latitude: "2"; height: "118"; }
+ ListElement{ longitude: "9"; latitude: "3"; height: "120"; }
+ ListElement{ longitude: "9"; latitude: "4"; height: "126"; }
+ ListElement{ longitude: "9"; latitude: "5"; height: "129"; }
+ ListElement{ longitude: "9"; latitude: "6"; height: "133"; }
+ ListElement{ longitude: "9"; latitude: "7"; height: "132"; }
+ ListElement{ longitude: "9"; latitude: "8"; height: "133"; }
+ ListElement{ longitude: "9"; latitude: "9"; height: "134"; }
+ ListElement{ longitude: "9"; latitude: "10"; height: "134"; }
+ ListElement{ longitude: "9"; latitude: "11"; height: "134"; }
+ ListElement{ longitude: "9"; latitude: "12"; height: "131"; }
+ ListElement{ longitude: "9"; latitude: "13"; height: "134"; }
+ ListElement{ longitude: "9"; latitude: "14"; height: "136"; }
+ ListElement{ longitude: "9"; latitude: "15"; height: "137"; }
+ ListElement{ longitude: "9"; latitude: "16"; height: "131"; }
+ ListElement{ longitude: "9"; latitude: "17"; height: "119"; }
+ ListElement{ longitude: "9"; latitude: "18"; height: "126"; }
+ ListElement{ longitude: "9"; latitude: "19"; height: "121"; }
+ ListElement{ longitude: "9"; latitude: "20"; height: "120"; }
+ ListElement{ longitude: "9"; latitude: "21"; height: "117"; }
+ ListElement{ longitude: "9"; latitude: "22"; height: "116"; }
+ ListElement{ longitude: "9"; latitude: "23"; height: "119"; }
+ ListElement{ longitude: "9"; latitude: "24"; height: "122"; }
+ ListElement{ longitude: "9"; latitude: "25"; height: "122"; }
+ ListElement{ longitude: "9"; latitude: "26"; height: "120"; }
+ ListElement{ longitude: "9"; latitude: "27"; height: "121"; }
+ ListElement{ longitude: "9"; latitude: "28"; height: "121"; }
+ ListElement{ longitude: "9"; latitude: "29"; height: "120"; }
+ ListElement{ longitude: "9"; latitude: "30"; height: "120"; }
+ ListElement{ longitude: "9"; latitude: "31"; height: "117"; }
+ ListElement{ longitude: "9"; latitude: "32"; height: "116"; }
+ ListElement{ longitude: "9"; latitude: "33"; height: "118"; }
+ ListElement{ longitude: "9"; latitude: "34"; height: "120"; }
+ ListElement{ longitude: "9"; latitude: "35"; height: "123"; }
+ ListElement{ longitude: "9"; latitude: "36"; height: "122"; }
+ ListElement{ longitude: "9"; latitude: "37"; height: "122"; }
+ ListElement{ longitude: "9"; latitude: "38"; height: "121"; }
+ ListElement{ longitude: "9"; latitude: "39"; height: "119"; }
+ ListElement{ longitude: "9"; latitude: "40"; height: "120"; }
+ ListElement{ longitude: "9"; latitude: "41"; height: "121"; }
+ ListElement{ longitude: "9"; latitude: "42"; height: "128"; }
+ ListElement{ longitude: "9"; latitude: "43"; height: "132"; }
+ ListElement{ longitude: "9"; latitude: "44"; height: "134"; }
+ ListElement{ longitude: "9"; latitude: "45"; height: "135"; }
+ ListElement{ longitude: "9"; latitude: "46"; height: "135"; }
+ ListElement{ longitude: "9"; latitude: "47"; height: "133"; }
+ ListElement{ longitude: "9"; latitude: "48"; height: "136"; }
+ ListElement{ longitude: "9"; latitude: "49"; height: "136"; }
+ ListElement{ longitude: "9"; latitude: "50"; height: "136"; }
+ ListElement{ longitude: "9"; latitude: "51"; height: "132"; }
+ ListElement{ longitude: "9"; latitude: "52"; height: "131"; }
+ ListElement{ longitude: "9"; latitude: "53"; height: "126"; }
+ ListElement{ longitude: "9"; latitude: "54"; height: "124"; }
+ ListElement{ longitude: "9"; latitude: "55"; height: "125"; }
+ ListElement{ longitude: "9"; latitude: "56"; height: "123"; }
+ ListElement{ longitude: "9"; latitude: "57"; height: "125"; }
+ ListElement{ longitude: "9"; latitude: "58"; height: "126"; }
+ ListElement{ longitude: "9"; latitude: "59"; height: "125"; }
+ ListElement{ longitude: "9"; latitude: "60"; height: "127"; }
+ ListElement{ longitude: "9"; latitude: "61"; height: "129"; }
+ ListElement{ longitude: "9"; latitude: "62"; height: "129"; }
+ ListElement{ longitude: "9"; latitude: "63"; height: "127"; }
+ ListElement{ longitude: "9"; latitude: "64"; height: "131"; }
+ ListElement{ longitude: "9"; latitude: "65"; height: "122"; }
+ ListElement{ longitude: "9"; latitude: "66"; height: "107"; }
+ ListElement{ longitude: "9"; latitude: "67"; height: "103"; }
+ ListElement{ longitude: "9"; latitude: "68"; height: "105"; }
+ ListElement{ longitude: "9"; latitude: "69"; height: "112"; }
+ ListElement{ longitude: "9"; latitude: "70"; height: "130"; }
+ ListElement{ longitude: "9"; latitude: "71"; height: "134"; }
+ ListElement{ longitude: "9"; latitude: "72"; height: "140"; }
+ ListElement{ longitude: "9"; latitude: "73"; height: "134"; }
+ ListElement{ longitude: "9"; latitude: "74"; height: "129"; }
+ ListElement{ longitude: "9"; latitude: "75"; height: "120"; }
+ ListElement{ longitude: "9"; latitude: "76"; height: "117"; }
+ ListElement{ longitude: "9"; latitude: "77"; height: "113"; }
+ ListElement{ longitude: "9"; latitude: "78"; height: "102"; }
+ ListElement{ longitude: "9"; latitude: "79"; height: "99"; }
+ ListElement{ longitude: "9"; latitude: "80"; height: "101"; }
+ ListElement{ longitude: "9"; latitude: "81"; height: "101"; }
+ ListElement{ longitude: "9"; latitude: "82"; height: "101"; }
+ ListElement{ longitude: "9"; latitude: "83"; height: "101"; }
+ ListElement{ longitude: "9"; latitude: "84"; height: "96"; }
+ ListElement{ longitude: "9"; latitude: "85"; height: "98"; }
+ ListElement{ longitude: "9"; latitude: "86"; height: "106"; }
+ ListElement{ longitude: "9"; latitude: "87"; height: "112"; }
+ ListElement{ longitude: "9"; latitude: "88"; height: "119"; }
+ ListElement{ longitude: "9"; latitude: "89"; height: "126"; }
+ ListElement{ longitude: "9"; latitude: "90"; height: "128"; }
+ ListElement{ longitude: "9"; latitude: "91"; height: "132"; }
+ ListElement{ longitude: "9"; latitude: "92"; height: "134"; }
+ ListElement{ longitude: "9"; latitude: "93"; height: "134"; }
+ ListElement{ longitude: "9"; latitude: "94"; height: "131"; }
+ ListElement{ longitude: "9"; latitude: "95"; height: "131"; }
+ ListElement{ longitude: "9"; latitude: "96"; height: "131"; }
+ ListElement{ longitude: "9"; latitude: "97"; height: "137"; }
+ ListElement{ longitude: "9"; latitude: "98"; height: "141"; }
+ ListElement{ longitude: "9"; latitude: "99"; height: "139"; }
+ ListElement{ longitude: "10"; latitude: "0"; height: "122"; }
+ ListElement{ longitude: "10"; latitude: "1"; height: "121"; }
+ ListElement{ longitude: "10"; latitude: "2"; height: "122"; }
+ ListElement{ longitude: "10"; latitude: "3"; height: "124"; }
+ ListElement{ longitude: "10"; latitude: "4"; height: "129"; }
+ ListElement{ longitude: "10"; latitude: "5"; height: "131"; }
+ ListElement{ longitude: "10"; latitude: "6"; height: "132"; }
+ ListElement{ longitude: "10"; latitude: "7"; height: "130"; }
+ ListElement{ longitude: "10"; latitude: "8"; height: "130"; }
+ ListElement{ longitude: "10"; latitude: "9"; height: "130"; }
+ ListElement{ longitude: "10"; latitude: "10"; height: "133"; }
+ ListElement{ longitude: "10"; latitude: "11"; height: "135"; }
+ ListElement{ longitude: "10"; latitude: "12"; height: "130"; }
+ ListElement{ longitude: "10"; latitude: "13"; height: "134"; }
+ ListElement{ longitude: "10"; latitude: "14"; height: "135"; }
+ ListElement{ longitude: "10"; latitude: "15"; height: "133"; }
+ ListElement{ longitude: "10"; latitude: "16"; height: "129"; }
+ ListElement{ longitude: "10"; latitude: "17"; height: "105"; }
+ ListElement{ longitude: "10"; latitude: "18"; height: "127"; }
+ ListElement{ longitude: "10"; latitude: "19"; height: "124"; }
+ ListElement{ longitude: "10"; latitude: "20"; height: "115"; }
+ ListElement{ longitude: "10"; latitude: "21"; height: "101"; }
+ ListElement{ longitude: "10"; latitude: "22"; height: "103"; }
+ ListElement{ longitude: "10"; latitude: "23"; height: "113"; }
+ ListElement{ longitude: "10"; latitude: "24"; height: "120"; }
+ ListElement{ longitude: "10"; latitude: "25"; height: "120"; }
+ ListElement{ longitude: "10"; latitude: "26"; height: "118"; }
+ ListElement{ longitude: "10"; latitude: "27"; height: "118"; }
+ ListElement{ longitude: "10"; latitude: "28"; height: "120"; }
+ ListElement{ longitude: "10"; latitude: "29"; height: "120"; }
+ ListElement{ longitude: "10"; latitude: "30"; height: "120"; }
+ ListElement{ longitude: "10"; latitude: "31"; height: "119"; }
+ ListElement{ longitude: "10"; latitude: "32"; height: "119"; }
+ ListElement{ longitude: "10"; latitude: "33"; height: "119"; }
+ ListElement{ longitude: "10"; latitude: "34"; height: "123"; }
+ ListElement{ longitude: "10"; latitude: "35"; height: "124"; }
+ ListElement{ longitude: "10"; latitude: "36"; height: "125"; }
+ ListElement{ longitude: "10"; latitude: "37"; height: "125"; }
+ ListElement{ longitude: "10"; latitude: "38"; height: "122"; }
+ ListElement{ longitude: "10"; latitude: "39"; height: "121"; }
+ ListElement{ longitude: "10"; latitude: "40"; height: "122"; }
+ ListElement{ longitude: "10"; latitude: "41"; height: "125"; }
+ ListElement{ longitude: "10"; latitude: "42"; height: "130"; }
+ ListElement{ longitude: "10"; latitude: "43"; height: "135"; }
+ ListElement{ longitude: "10"; latitude: "44"; height: "135"; }
+ ListElement{ longitude: "10"; latitude: "45"; height: "138"; }
+ ListElement{ longitude: "10"; latitude: "46"; height: "136"; }
+ ListElement{ longitude: "10"; latitude: "47"; height: "136"; }
+ ListElement{ longitude: "10"; latitude: "48"; height: "136"; }
+ ListElement{ longitude: "10"; latitude: "49"; height: "136"; }
+ ListElement{ longitude: "10"; latitude: "50"; height: "136"; }
+ ListElement{ longitude: "10"; latitude: "51"; height: "134"; }
+ ListElement{ longitude: "10"; latitude: "52"; height: "131"; }
+ ListElement{ longitude: "10"; latitude: "53"; height: "127"; }
+ ListElement{ longitude: "10"; latitude: "54"; height: "124"; }
+ ListElement{ longitude: "10"; latitude: "55"; height: "122"; }
+ ListElement{ longitude: "10"; latitude: "56"; height: "122"; }
+ ListElement{ longitude: "10"; latitude: "57"; height: "124"; }
+ ListElement{ longitude: "10"; latitude: "58"; height: "125"; }
+ ListElement{ longitude: "10"; latitude: "59"; height: "126"; }
+ ListElement{ longitude: "10"; latitude: "60"; height: "127"; }
+ ListElement{ longitude: "10"; latitude: "61"; height: "128"; }
+ ListElement{ longitude: "10"; latitude: "62"; height: "128"; }
+ ListElement{ longitude: "10"; latitude: "63"; height: "115"; }
+ ListElement{ longitude: "10"; latitude: "64"; height: "133"; }
+ ListElement{ longitude: "10"; latitude: "65"; height: "126"; }
+ ListElement{ longitude: "10"; latitude: "66"; height: "115"; }
+ ListElement{ longitude: "10"; latitude: "67"; height: "105"; }
+ ListElement{ longitude: "10"; latitude: "68"; height: "98"; }
+ ListElement{ longitude: "10"; latitude: "69"; height: "106"; }
+ ListElement{ longitude: "10"; latitude: "70"; height: "132"; }
+ ListElement{ longitude: "10"; latitude: "71"; height: "134"; }
+ ListElement{ longitude: "10"; latitude: "72"; height: "139"; }
+ ListElement{ longitude: "10"; latitude: "73"; height: "137"; }
+ ListElement{ longitude: "10"; latitude: "74"; height: "130"; }
+ ListElement{ longitude: "10"; latitude: "75"; height: "122"; }
+ ListElement{ longitude: "10"; latitude: "76"; height: "116"; }
+ ListElement{ longitude: "10"; latitude: "77"; height: "107"; }
+ ListElement{ longitude: "10"; latitude: "78"; height: "104"; }
+ ListElement{ longitude: "10"; latitude: "79"; height: "104"; }
+ ListElement{ longitude: "10"; latitude: "80"; height: "104"; }
+ ListElement{ longitude: "10"; latitude: "81"; height: "105"; }
+ ListElement{ longitude: "10"; latitude: "82"; height: "102"; }
+ ListElement{ longitude: "10"; latitude: "83"; height: "100"; }
+ ListElement{ longitude: "10"; latitude: "84"; height: "99"; }
+ ListElement{ longitude: "10"; latitude: "85"; height: "102"; }
+ ListElement{ longitude: "10"; latitude: "86"; height: "101"; }
+ ListElement{ longitude: "10"; latitude: "87"; height: "110"; }
+ ListElement{ longitude: "10"; latitude: "88"; height: "114"; }
+ ListElement{ longitude: "10"; latitude: "89"; height: "121"; }
+ ListElement{ longitude: "10"; latitude: "90"; height: "125"; }
+ ListElement{ longitude: "10"; latitude: "91"; height: "128"; }
+ ListElement{ longitude: "10"; latitude: "92"; height: "128"; }
+ ListElement{ longitude: "10"; latitude: "93"; height: "130"; }
+ ListElement{ longitude: "10"; latitude: "94"; height: "129"; }
+ ListElement{ longitude: "10"; latitude: "95"; height: "131"; }
+ ListElement{ longitude: "10"; latitude: "96"; height: "131"; }
+ ListElement{ longitude: "10"; latitude: "97"; height: "132"; }
+ ListElement{ longitude: "10"; latitude: "98"; height: "139"; }
+ ListElement{ longitude: "10"; latitude: "99"; height: "140"; }
+ ListElement{ longitude: "11"; latitude: "0"; height: "122"; }
+ ListElement{ longitude: "11"; latitude: "1"; height: "128"; }
+ ListElement{ longitude: "11"; latitude: "2"; height: "127"; }
+ ListElement{ longitude: "11"; latitude: "3"; height: "129"; }
+ ListElement{ longitude: "11"; latitude: "4"; height: "131"; }
+ ListElement{ longitude: "11"; latitude: "5"; height: "132"; }
+ ListElement{ longitude: "11"; latitude: "6"; height: "132"; }
+ ListElement{ longitude: "11"; latitude: "7"; height: "130"; }
+ ListElement{ longitude: "11"; latitude: "8"; height: "131"; }
+ ListElement{ longitude: "11"; latitude: "9"; height: "130"; }
+ ListElement{ longitude: "11"; latitude: "10"; height: "130"; }
+ ListElement{ longitude: "11"; latitude: "11"; height: "133"; }
+ ListElement{ longitude: "11"; latitude: "12"; height: "131"; }
+ ListElement{ longitude: "11"; latitude: "13"; height: "134"; }
+ ListElement{ longitude: "11"; latitude: "14"; height: "135"; }
+ ListElement{ longitude: "11"; latitude: "15"; height: "130"; }
+ ListElement{ longitude: "11"; latitude: "16"; height: "130"; }
+ ListElement{ longitude: "11"; latitude: "17"; height: "130"; }
+ ListElement{ longitude: "11"; latitude: "18"; height: "127"; }
+ ListElement{ longitude: "11"; latitude: "19"; height: "124"; }
+ ListElement{ longitude: "11"; latitude: "20"; height: "100"; }
+ ListElement{ longitude: "11"; latitude: "21"; height: "86"; }
+ ListElement{ longitude: "11"; latitude: "22"; height: "90"; }
+ ListElement{ longitude: "11"; latitude: "23"; height: "104"; }
+ ListElement{ longitude: "11"; latitude: "24"; height: "117"; }
+ ListElement{ longitude: "11"; latitude: "25"; height: "120"; }
+ ListElement{ longitude: "11"; latitude: "26"; height: "115"; }
+ ListElement{ longitude: "11"; latitude: "27"; height: "115"; }
+ ListElement{ longitude: "11"; latitude: "28"; height: "117"; }
+ ListElement{ longitude: "11"; latitude: "29"; height: "118"; }
+ ListElement{ longitude: "11"; latitude: "30"; height: "116"; }
+ ListElement{ longitude: "11"; latitude: "31"; height: "117"; }
+ ListElement{ longitude: "11"; latitude: "32"; height: "118"; }
+ ListElement{ longitude: "11"; latitude: "33"; height: "120"; }
+ ListElement{ longitude: "11"; latitude: "34"; height: "126"; }
+ ListElement{ longitude: "11"; latitude: "35"; height: "126"; }
+ ListElement{ longitude: "11"; latitude: "36"; height: "127"; }
+ ListElement{ longitude: "11"; latitude: "37"; height: "127"; }
+ ListElement{ longitude: "11"; latitude: "38"; height: "126"; }
+ ListElement{ longitude: "11"; latitude: "39"; height: "124"; }
+ ListElement{ longitude: "11"; latitude: "40"; height: "126"; }
+ ListElement{ longitude: "11"; latitude: "41"; height: "128"; }
+ ListElement{ longitude: "11"; latitude: "42"; height: "131"; }
+ ListElement{ longitude: "11"; latitude: "43"; height: "135"; }
+ ListElement{ longitude: "11"; latitude: "44"; height: "135"; }
+ ListElement{ longitude: "11"; latitude: "45"; height: "138"; }
+ ListElement{ longitude: "11"; latitude: "46"; height: "135"; }
+ ListElement{ longitude: "11"; latitude: "47"; height: "136"; }
+ ListElement{ longitude: "11"; latitude: "48"; height: "136"; }
+ ListElement{ longitude: "11"; latitude: "49"; height: "136"; }
+ ListElement{ longitude: "11"; latitude: "50"; height: "136"; }
+ ListElement{ longitude: "11"; latitude: "51"; height: "134"; }
+ ListElement{ longitude: "11"; latitude: "52"; height: "132"; }
+ ListElement{ longitude: "11"; latitude: "53"; height: "129"; }
+ ListElement{ longitude: "11"; latitude: "54"; height: "124"; }
+ ListElement{ longitude: "11"; latitude: "55"; height: "122"; }
+ ListElement{ longitude: "11"; latitude: "56"; height: "121"; }
+ ListElement{ longitude: "11"; latitude: "57"; height: "123"; }
+ ListElement{ longitude: "11"; latitude: "58"; height: "122"; }
+ ListElement{ longitude: "11"; latitude: "59"; height: "125"; }
+ ListElement{ longitude: "11"; latitude: "60"; height: "127"; }
+ ListElement{ longitude: "11"; latitude: "61"; height: "128"; }
+ ListElement{ longitude: "11"; latitude: "62"; height: "128"; }
+ ListElement{ longitude: "11"; latitude: "63"; height: "130"; }
+ ListElement{ longitude: "11"; latitude: "64"; height: "131"; }
+ ListElement{ longitude: "11"; latitude: "65"; height: "127"; }
+ ListElement{ longitude: "11"; latitude: "66"; height: "103"; }
+ ListElement{ longitude: "11"; latitude: "67"; height: "110"; }
+ ListElement{ longitude: "11"; latitude: "68"; height: "102"; }
+ ListElement{ longitude: "11"; latitude: "69"; height: "114"; }
+ ListElement{ longitude: "11"; latitude: "70"; height: "130"; }
+ ListElement{ longitude: "11"; latitude: "71"; height: "134"; }
+ ListElement{ longitude: "11"; latitude: "72"; height: "137"; }
+ ListElement{ longitude: "11"; latitude: "73"; height: "133"; }
+ ListElement{ longitude: "11"; latitude: "74"; height: "122"; }
+ ListElement{ longitude: "11"; latitude: "75"; height: "120"; }
+ ListElement{ longitude: "11"; latitude: "76"; height: "114"; }
+ ListElement{ longitude: "11"; latitude: "77"; height: "110"; }
+ ListElement{ longitude: "11"; latitude: "78"; height: "109"; }
+ ListElement{ longitude: "11"; latitude: "79"; height: "111"; }
+ ListElement{ longitude: "11"; latitude: "80"; height: "111"; }
+ ListElement{ longitude: "11"; latitude: "81"; height: "111"; }
+ ListElement{ longitude: "11"; latitude: "82"; height: "103"; }
+ ListElement{ longitude: "11"; latitude: "83"; height: "102"; }
+ ListElement{ longitude: "11"; latitude: "84"; height: "98"; }
+ ListElement{ longitude: "11"; latitude: "85"; height: "100"; }
+ ListElement{ longitude: "11"; latitude: "86"; height: "102"; }
+ ListElement{ longitude: "11"; latitude: "87"; height: "104"; }
+ ListElement{ longitude: "11"; latitude: "88"; height: "110"; }
+ ListElement{ longitude: "11"; latitude: "89"; height: "115"; }
+ ListElement{ longitude: "11"; latitude: "90"; height: "119"; }
+ ListElement{ longitude: "11"; latitude: "91"; height: "122"; }
+ ListElement{ longitude: "11"; latitude: "92"; height: "126"; }
+ ListElement{ longitude: "11"; latitude: "93"; height: "126"; }
+ ListElement{ longitude: "11"; latitude: "94"; height: "127"; }
+ ListElement{ longitude: "11"; latitude: "95"; height: "128"; }
+ ListElement{ longitude: "11"; latitude: "96"; height: "130"; }
+ ListElement{ longitude: "11"; latitude: "97"; height: "133"; }
+ ListElement{ longitude: "11"; latitude: "98"; height: "141"; }
+ ListElement{ longitude: "11"; latitude: "99"; height: "142"; }
+ ListElement{ longitude: "12"; latitude: "0"; height: "120"; }
+ ListElement{ longitude: "12"; latitude: "1"; height: "122"; }
+ ListElement{ longitude: "12"; latitude: "2"; height: "130"; }
+ ListElement{ longitude: "12"; latitude: "3"; height: "134"; }
+ ListElement{ longitude: "12"; latitude: "4"; height: "136"; }
+ ListElement{ longitude: "12"; latitude: "5"; height: "134"; }
+ ListElement{ longitude: "12"; latitude: "6"; height: "131"; }
+ ListElement{ longitude: "12"; latitude: "7"; height: "131"; }
+ ListElement{ longitude: "12"; latitude: "8"; height: "131"; }
+ ListElement{ longitude: "12"; latitude: "9"; height: "131"; }
+ ListElement{ longitude: "12"; latitude: "10"; height: "129"; }
+ ListElement{ longitude: "12"; latitude: "11"; height: "130"; }
+ ListElement{ longitude: "12"; latitude: "12"; height: "133"; }
+ ListElement{ longitude: "12"; latitude: "13"; height: "133"; }
+ ListElement{ longitude: "12"; latitude: "14"; height: "132"; }
+ ListElement{ longitude: "12"; latitude: "15"; height: "129"; }
+ ListElement{ longitude: "12"; latitude: "16"; height: "129"; }
+ ListElement{ longitude: "12"; latitude: "17"; height: "125"; }
+ ListElement{ longitude: "12"; latitude: "18"; height: "126"; }
+ ListElement{ longitude: "12"; latitude: "19"; height: "119"; }
+ ListElement{ longitude: "12"; latitude: "20"; height: "98"; }
+ ListElement{ longitude: "12"; latitude: "21"; height: "84"; }
+ ListElement{ longitude: "12"; latitude: "22"; height: "87"; }
+ ListElement{ longitude: "12"; latitude: "23"; height: "103"; }
+ ListElement{ longitude: "12"; latitude: "24"; height: "119"; }
+ ListElement{ longitude: "12"; latitude: "25"; height: "117"; }
+ ListElement{ longitude: "12"; latitude: "26"; height: "113"; }
+ ListElement{ longitude: "12"; latitude: "27"; height: "112"; }
+ ListElement{ longitude: "12"; latitude: "28"; height: "113"; }
+ ListElement{ longitude: "12"; latitude: "29"; height: "114"; }
+ ListElement{ longitude: "12"; latitude: "30"; height: "115"; }
+ ListElement{ longitude: "12"; latitude: "31"; height: "118"; }
+ ListElement{ longitude: "12"; latitude: "32"; height: "118"; }
+ ListElement{ longitude: "12"; latitude: "33"; height: "121"; }
+ ListElement{ longitude: "12"; latitude: "34"; height: "124"; }
+ ListElement{ longitude: "12"; latitude: "35"; height: "126"; }
+ ListElement{ longitude: "12"; latitude: "36"; height: "127"; }
+ ListElement{ longitude: "12"; latitude: "37"; height: "127"; }
+ ListElement{ longitude: "12"; latitude: "38"; height: "127"; }
+ ListElement{ longitude: "12"; latitude: "39"; height: "127"; }
+ ListElement{ longitude: "12"; latitude: "40"; height: "126"; }
+ ListElement{ longitude: "12"; latitude: "41"; height: "129"; }
+ ListElement{ longitude: "12"; latitude: "42"; height: "129"; }
+ ListElement{ longitude: "12"; latitude: "43"; height: "133"; }
+ ListElement{ longitude: "12"; latitude: "44"; height: "134"; }
+ ListElement{ longitude: "12"; latitude: "45"; height: "137"; }
+ ListElement{ longitude: "12"; latitude: "46"; height: "136"; }
+ ListElement{ longitude: "12"; latitude: "47"; height: "135"; }
+ ListElement{ longitude: "12"; latitude: "48"; height: "135"; }
+ ListElement{ longitude: "12"; latitude: "49"; height: "135"; }
+ ListElement{ longitude: "12"; latitude: "50"; height: "135"; }
+ ListElement{ longitude: "12"; latitude: "51"; height: "135"; }
+ ListElement{ longitude: "12"; latitude: "52"; height: "133"; }
+ ListElement{ longitude: "12"; latitude: "53"; height: "130"; }
+ ListElement{ longitude: "12"; latitude: "54"; height: "127"; }
+ ListElement{ longitude: "12"; latitude: "55"; height: "122"; }
+ ListElement{ longitude: "12"; latitude: "56"; height: "121"; }
+ ListElement{ longitude: "12"; latitude: "57"; height: "121"; }
+ ListElement{ longitude: "12"; latitude: "58"; height: "121"; }
+ ListElement{ longitude: "12"; latitude: "59"; height: "123"; }
+ ListElement{ longitude: "12"; latitude: "60"; height: "126"; }
+ ListElement{ longitude: "12"; latitude: "61"; height: "128"; }
+ ListElement{ longitude: "12"; latitude: "62"; height: "128"; }
+ ListElement{ longitude: "12"; latitude: "63"; height: "129"; }
+ ListElement{ longitude: "12"; latitude: "64"; height: "117"; }
+ ListElement{ longitude: "12"; latitude: "65"; height: "127"; }
+ ListElement{ longitude: "12"; latitude: "66"; height: "119"; }
+ ListElement{ longitude: "12"; latitude: "67"; height: "118"; }
+ ListElement{ longitude: "12"; latitude: "68"; height: "117"; }
+ ListElement{ longitude: "12"; latitude: "69"; height: "123"; }
+ ListElement{ longitude: "12"; latitude: "70"; height: "128"; }
+ ListElement{ longitude: "12"; latitude: "71"; height: "130"; }
+ ListElement{ longitude: "12"; latitude: "72"; height: "132"; }
+ ListElement{ longitude: "12"; latitude: "73"; height: "119"; }
+ ListElement{ longitude: "12"; latitude: "74"; height: "111"; }
+ ListElement{ longitude: "12"; latitude: "75"; height: "117"; }
+ ListElement{ longitude: "12"; latitude: "76"; height: "113"; }
+ ListElement{ longitude: "12"; latitude: "77"; height: "112"; }
+ ListElement{ longitude: "12"; latitude: "78"; height: "114"; }
+ ListElement{ longitude: "12"; latitude: "79"; height: "117"; }
+ ListElement{ longitude: "12"; latitude: "80"; height: "117"; }
+ ListElement{ longitude: "12"; latitude: "81"; height: "115"; }
+ ListElement{ longitude: "12"; latitude: "82"; height: "110"; }
+ ListElement{ longitude: "12"; latitude: "83"; height: "105"; }
+ ListElement{ longitude: "12"; latitude: "84"; height: "102"; }
+ ListElement{ longitude: "12"; latitude: "85"; height: "101"; }
+ ListElement{ longitude: "12"; latitude: "86"; height: "102"; }
+ ListElement{ longitude: "12"; latitude: "87"; height: "105"; }
+ ListElement{ longitude: "12"; latitude: "88"; height: "108"; }
+ ListElement{ longitude: "12"; latitude: "89"; height: "111"; }
+ ListElement{ longitude: "12"; latitude: "90"; height: "116"; }
+ ListElement{ longitude: "12"; latitude: "91"; height: "121"; }
+ ListElement{ longitude: "12"; latitude: "92"; height: "124"; }
+ ListElement{ longitude: "12"; latitude: "93"; height: "126"; }
+ ListElement{ longitude: "12"; latitude: "94"; height: "126"; }
+ ListElement{ longitude: "12"; latitude: "95"; height: "129"; }
+ ListElement{ longitude: "12"; latitude: "96"; height: "131"; }
+ ListElement{ longitude: "12"; latitude: "97"; height: "131"; }
+ ListElement{ longitude: "12"; latitude: "98"; height: "140"; }
+ ListElement{ longitude: "12"; latitude: "99"; height: "142"; }
+ ListElement{ longitude: "13"; latitude: "0"; height: "108"; }
+ ListElement{ longitude: "13"; latitude: "1"; height: "113"; }
+ ListElement{ longitude: "13"; latitude: "2"; height: "131"; }
+ ListElement{ longitude: "13"; latitude: "3"; height: "136"; }
+ ListElement{ longitude: "13"; latitude: "4"; height: "137"; }
+ ListElement{ longitude: "13"; latitude: "5"; height: "136"; }
+ ListElement{ longitude: "13"; latitude: "6"; height: "130"; }
+ ListElement{ longitude: "13"; latitude: "7"; height: "131"; }
+ ListElement{ longitude: "13"; latitude: "8"; height: "128"; }
+ ListElement{ longitude: "13"; latitude: "9"; height: "129"; }
+ ListElement{ longitude: "13"; latitude: "10"; height: "128"; }
+ ListElement{ longitude: "13"; latitude: "11"; height: "130"; }
+ ListElement{ longitude: "13"; latitude: "12"; height: "132"; }
+ ListElement{ longitude: "13"; latitude: "13"; height: "132"; }
+ ListElement{ longitude: "13"; latitude: "14"; height: "132"; }
+ ListElement{ longitude: "13"; latitude: "15"; height: "129"; }
+ ListElement{ longitude: "13"; latitude: "16"; height: "127"; }
+ ListElement{ longitude: "13"; latitude: "17"; height: "127"; }
+ ListElement{ longitude: "13"; latitude: "18"; height: "124"; }
+ ListElement{ longitude: "13"; latitude: "19"; height: "122"; }
+ ListElement{ longitude: "13"; latitude: "20"; height: "106"; }
+ ListElement{ longitude: "13"; latitude: "21"; height: "95"; }
+ ListElement{ longitude: "13"; latitude: "22"; height: "98"; }
+ ListElement{ longitude: "13"; latitude: "23"; height: "111"; }
+ ListElement{ longitude: "13"; latitude: "24"; height: "120"; }
+ ListElement{ longitude: "13"; latitude: "25"; height: "116"; }
+ ListElement{ longitude: "13"; latitude: "26"; height: "112"; }
+ ListElement{ longitude: "13"; latitude: "27"; height: "111"; }
+ ListElement{ longitude: "13"; latitude: "28"; height: "111"; }
+ ListElement{ longitude: "13"; latitude: "29"; height: "113"; }
+ ListElement{ longitude: "13"; latitude: "30"; height: "116"; }
+ ListElement{ longitude: "13"; latitude: "31"; height: "118"; }
+ ListElement{ longitude: "13"; latitude: "32"; height: "119"; }
+ ListElement{ longitude: "13"; latitude: "33"; height: "118"; }
+ ListElement{ longitude: "13"; latitude: "34"; height: "122"; }
+ ListElement{ longitude: "13"; latitude: "35"; height: "124"; }
+ ListElement{ longitude: "13"; latitude: "36"; height: "126"; }
+ ListElement{ longitude: "13"; latitude: "37"; height: "127"; }
+ ListElement{ longitude: "13"; latitude: "38"; height: "129"; }
+ ListElement{ longitude: "13"; latitude: "39"; height: "127"; }
+ ListElement{ longitude: "13"; latitude: "40"; height: "126"; }
+ ListElement{ longitude: "13"; latitude: "41"; height: "127"; }
+ ListElement{ longitude: "13"; latitude: "42"; height: "130"; }
+ ListElement{ longitude: "13"; latitude: "43"; height: "131"; }
+ ListElement{ longitude: "13"; latitude: "44"; height: "131"; }
+ ListElement{ longitude: "13"; latitude: "45"; height: "133"; }
+ ListElement{ longitude: "13"; latitude: "46"; height: "134"; }
+ ListElement{ longitude: "13"; latitude: "47"; height: "132"; }
+ ListElement{ longitude: "13"; latitude: "48"; height: "133"; }
+ ListElement{ longitude: "13"; latitude: "49"; height: "133"; }
+ ListElement{ longitude: "13"; latitude: "50"; height: "134"; }
+ ListElement{ longitude: "13"; latitude: "51"; height: "136"; }
+ ListElement{ longitude: "13"; latitude: "52"; height: "135"; }
+ ListElement{ longitude: "13"; latitude: "53"; height: "131"; }
+ ListElement{ longitude: "13"; latitude: "54"; height: "127"; }
+ ListElement{ longitude: "13"; latitude: "55"; height: "124"; }
+ ListElement{ longitude: "13"; latitude: "56"; height: "121"; }
+ ListElement{ longitude: "13"; latitude: "57"; height: "120"; }
+ ListElement{ longitude: "13"; latitude: "58"; height: "122"; }
+ ListElement{ longitude: "13"; latitude: "59"; height: "123"; }
+ ListElement{ longitude: "13"; latitude: "60"; height: "125"; }
+ ListElement{ longitude: "13"; latitude: "61"; height: "128"; }
+ ListElement{ longitude: "13"; latitude: "62"; height: "128"; }
+ ListElement{ longitude: "13"; latitude: "63"; height: "126"; }
+ ListElement{ longitude: "13"; latitude: "64"; height: "128"; }
+ ListElement{ longitude: "13"; latitude: "65"; height: "118"; }
+ ListElement{ longitude: "13"; latitude: "66"; height: "121"; }
+ ListElement{ longitude: "13"; latitude: "67"; height: "122"; }
+ ListElement{ longitude: "13"; latitude: "68"; height: "120"; }
+ ListElement{ longitude: "13"; latitude: "69"; height: "121"; }
+ ListElement{ longitude: "13"; latitude: "70"; height: "124"; }
+ ListElement{ longitude: "13"; latitude: "71"; height: "128"; }
+ ListElement{ longitude: "13"; latitude: "72"; height: "130"; }
+ ListElement{ longitude: "13"; latitude: "73"; height: "126"; }
+ ListElement{ longitude: "13"; latitude: "74"; height: "114"; }
+ ListElement{ longitude: "13"; latitude: "75"; height: "116"; }
+ ListElement{ longitude: "13"; latitude: "76"; height: "114"; }
+ ListElement{ longitude: "13"; latitude: "77"; height: "114"; }
+ ListElement{ longitude: "13"; latitude: "78"; height: "117"; }
+ ListElement{ longitude: "13"; latitude: "79"; height: "119"; }
+ ListElement{ longitude: "13"; latitude: "80"; height: "118"; }
+ ListElement{ longitude: "13"; latitude: "81"; height: "119"; }
+ ListElement{ longitude: "13"; latitude: "82"; height: "114"; }
+ ListElement{ longitude: "13"; latitude: "83"; height: "110"; }
+ ListElement{ longitude: "13"; latitude: "84"; height: "103"; }
+ ListElement{ longitude: "13"; latitude: "85"; height: "103"; }
+ ListElement{ longitude: "13"; latitude: "86"; height: "105"; }
+ ListElement{ longitude: "13"; latitude: "87"; height: "104"; }
+ ListElement{ longitude: "13"; latitude: "88"; height: "106"; }
+ ListElement{ longitude: "13"; latitude: "89"; height: "109"; }
+ ListElement{ longitude: "13"; latitude: "90"; height: "116"; }
+ ListElement{ longitude: "13"; latitude: "91"; height: "119"; }
+ ListElement{ longitude: "13"; latitude: "92"; height: "124"; }
+ ListElement{ longitude: "13"; latitude: "93"; height: "127"; }
+ ListElement{ longitude: "13"; latitude: "94"; height: "125"; }
+ ListElement{ longitude: "13"; latitude: "95"; height: "127"; }
+ ListElement{ longitude: "13"; latitude: "96"; height: "129"; }
+ ListElement{ longitude: "13"; latitude: "97"; height: "132"; }
+ ListElement{ longitude: "13"; latitude: "98"; height: "137"; }
+ ListElement{ longitude: "13"; latitude: "99"; height: "140"; }
+ ListElement{ longitude: "14"; latitude: "0"; height: "103"; }
+ ListElement{ longitude: "14"; latitude: "1"; height: "99"; }
+ ListElement{ longitude: "14"; latitude: "2"; height: "120"; }
+ ListElement{ longitude: "14"; latitude: "3"; height: "137"; }
+ ListElement{ longitude: "14"; latitude: "4"; height: "134"; }
+ ListElement{ longitude: "14"; latitude: "5"; height: "131"; }
+ ListElement{ longitude: "14"; latitude: "6"; height: "130"; }
+ ListElement{ longitude: "14"; latitude: "7"; height: "128"; }
+ ListElement{ longitude: "14"; latitude: "8"; height: "125"; }
+ ListElement{