Qt Quick 2 Surface Example

 /****************************************************************************
 **
 ** Copyright (C) 2016 The Qt Company Ltd.
 ** Contact: https://www.qt.io/licensing/
 **
 ** This file is part of the Qt Data Visualization module of the Qt Toolkit.
 **
 ** $QT_BEGIN_LICENSE:GPL$
 ** Commercial License Usage
 ** Licensees holding valid commercial Qt licenses may use this file in
 ** accordance with the commercial license agreement provided with the
 ** Software or, alternatively, in accordance with the terms contained in
 ** a written agreement between you and The Qt Company. For licensing terms
 ** and conditions see https://www.qt.io/terms-conditions. For further
 ** information use the contact form at https://www.qt.io/contact-us.
 **
 ** GNU General Public License Usage
 ** Alternatively, this file may be used under the terms of the GNU
 ** General Public License version 3 or (at your option) any later version
 ** approved by the KDE Free Qt Foundation. The licenses are as published by
 ** the Free Software Foundation and appearing in the file LICENSE.GPL3
 ** included in the packaging of this file. Please review the following
 ** information to ensure the GNU General Public License requirements will
 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
 **
 ** $QT_END_LICENSE$
 **
 ****************************************************************************/

 import QtQuick 2.1
 import QtQuick.Layouts 1.0
 import QtDataVisualization 1.0
 import "."

 Rectangle {
     id: mainview
     width: 1024
     height: 768
     color: surfacePlot.theme.windowColor

     Data {
         id: surfaceData
     }

     Item {
         id: surfaceView
         width: mainview.width
         height: mainview.height
         anchors.top: mainview.top
         anchors.left: mainview.left

         ColorGradient {
             id: surfaceGradient
             ColorGradientStop { position: 0.0; color: "darkslategray" }
             ColorGradientStop { id: middleGradient; position: 0.25; color: "peru" }
             ColorGradientStop { position: 1.0; color: "red" }
         }

         Surface3D {
             id: surfacePlot
             width: surfaceView.width
             height: surfaceView.height
             theme: Theme3D {
                 type: Theme3D.ThemeStoneMoss
                 font.family: "STCaiyun"
                 font.pointSize: 35
                 colorStyle: Theme3D.ColorStyleRangeGradient
                 baseGradients: [surfaceGradient]
             }
             shadowQuality: AbstractGraph3D.ShadowQualityMedium
             selectionMode: AbstractGraph3D.SelectionSlice | AbstractGraph3D.SelectionItemAndRow
             scene.activeCamera.cameraPreset: Camera3D.CameraPresetIsometricLeft
             axisY.min: 0.0
             axisY.max: 500.0
             axisX.segmentCount: 10
             axisX.subSegmentCount: 2
             axisX.labelFormat: "%i"
             axisZ.segmentCount: 10
             axisZ.subSegmentCount: 2
             axisZ.labelFormat: "%i"
             axisY.segmentCount: 5
             axisY.subSegmentCount: 2
             axisY.labelFormat: "%i"
             axisY.title: "Height"
             axisX.title: "Latitude"
             axisZ.title: "Longitude"

             Surface3DSeries {
                 id: surfaceSeries
                 flatShadingEnabled: false
                 drawMode: Surface3DSeries.DrawSurface

                 ItemModelSurfaceDataProxy {
                     itemModel: surfaceData.model
                     rowRole: "longitude"
                     columnRole: "latitude"
                     yPosRole: "height"
                 }
                 onDrawModeChanged: checkState()
             }
             Surface3DSeries {
                 id: heightSeries
                 flatShadingEnabled: false
                 drawMode: Surface3DSeries.DrawSurface
                 visible: false

                 HeightMapSurfaceDataProxy {
                     heightMapFile: ":/heightmaps/image"
                     // We don't want the default data values set by heightmap proxy.
                     minZValue: 30
                     maxZValue: 60
                     minXValue: 67
                     maxXValue: 97
                 }

                 onDrawModeChanged: checkState()
             }
         }
     }

     RowLayout {
         id: buttonLayout
         anchors.top: parent.top
         anchors.left: parent.left
         anchors.right: parent.right
         opacity: 0.5

         NewButton {
             id: surfaceGridToggle
             Layout.fillWidth: true
             Layout.fillHeight: true
             text: "Show Surface Grid"
             onClicked: {
                 if (surfaceSeries.drawMode & Surface3DSeries.DrawWireframe) {
                     surfaceSeries.drawMode &= ~Surface3DSeries.DrawWireframe;
                     heightSeries.drawMode &= ~Surface3DSeries.DrawWireframe;
                 } else {
                     surfaceSeries.drawMode |= Surface3DSeries.DrawWireframe;
                     heightSeries.drawMode |= Surface3DSeries.DrawWireframe;
                 }
             }
         }

         NewButton {
             id: surfaceToggle
             Layout.fillWidth: true
             Layout.fillHeight: true
             text: "Hide Surface"
             onClicked: {
                 if (surfaceSeries.drawMode & Surface3DSeries.DrawSurface) {
                     surfaceSeries.drawMode &= ~Surface3DSeries.DrawSurface;
                     heightSeries.drawMode &= ~Surface3DSeries.DrawSurface;
                 } else {
                     surfaceSeries.drawMode |= Surface3DSeries.DrawSurface;
                     heightSeries.drawMode |= Surface3DSeries.DrawSurface;
                 }
             }
         }

         NewButton {
             id: flatShadingToggle
             Layout.fillWidth: true
             Layout.fillHeight: true
             text: surfaceSeries.flatShadingSupported ? "Show Flat" : "Flat not supported"
             enabled: surfaceSeries.flatShadingSupported
             onClicked: {
                 if (surfaceSeries.flatShadingEnabled === true) {
                     surfaceSeries.flatShadingEnabled = false;
                     heightSeries.flatShadingEnabled = false;
                     text = "Show Flat"
                 } else {
                     surfaceSeries.flatShadingEnabled = true;
                     heightSeries.flatShadingEnabled = true;
                     text = "Show Smooth"
                 }
             }
         }

         NewButton {
             id: backgroundToggle
             Layout.fillWidth: true
             Layout.fillHeight: true
             text: "Hide Background"
             onClicked: {
                 if (surfacePlot.theme.backgroundEnabled === true) {
                     surfacePlot.theme.backgroundEnabled = false;
                     text = "Show Background"
                 } else {
                     surfacePlot.theme.backgroundEnabled = true;
                     text = "Hide Background"
                 }
             }
         }

         NewButton {
             id: gridToggle
             Layout.fillWidth: true
             Layout.fillHeight: true
             text: "Hide Grid"
             onClicked: {
                 if (surfacePlot.theme.gridEnabled === true) {
                     surfacePlot.theme.gridEnabled = false;
                     text = "Show Grid"
                 } else {
                     surfacePlot.theme.gridEnabled = true;
                     text = "Hide Grid"
                 }
             }
         }

         NewButton {
             id: seriesToggle
             Layout.fillWidth: true
             Layout.fillHeight: true
             text: "Switch to Height Map Series"
             onClicked: {
                 if (surfaceSeries.visible === false) {
                     surfacePlot.axisY.max = 500.0
                     surfaceSeries.visible = true
                     heightSeries.visible = false
                     middleGradient.position = 0.25
                     text = "Switch to Height Map Series"
                 } else {
                     surfacePlot.axisY.max = 250.0
                     surfaceSeries.visible = false
                     heightSeries.visible = true
                     middleGradient.position = 0.50
                     text = "Switch to Item Model Series"
                 }
             }
         }
     }

     function checkState() {
         if (surfaceSeries.drawMode & Surface3DSeries.DrawSurface)
             surfaceToggle.text = "Hide Surface"
         else
             surfaceToggle.text = "Show Surface"

         if (surfaceSeries.drawMode & Surface3DSeries.DrawWireframe)
             surfaceGridToggle.text = "Hide Surface Grid"
         else
             surfaceGridToggle.text = "Show Surface Grid"
     }
 }