SurveyMapVisual.qml 5.97 KB
Newer Older
1 2 3 4 5 6 7 8 9
/****************************************************************************
 *
 *   (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
 *
 * QGroundControl is licensed according to the terms in the file
 * COPYING.md in the root of the source code directory.
 *
 ****************************************************************************/

10 11 12 13
import QtQuick          2.3
import QtQuick.Controls 1.2
import QtLocation       5.3
import QtPositioning    5.3
14

15
import QGroundControl               1.0
16 17 18
import QGroundControl.ScreenTools   1.0
import QGroundControl.Palette       1.0
import QGroundControl.Controls      1.0
19
import QGroundControl.FlightMap     1.0
20 21 22

/// Survey Complex Mission Item visuals
Item {
23 24
    id: _root

25 26
    property var map    ///< Map control to place item in

27
    property var _missionItem:      object
28 29
    property var _mapPolygon:       object.mapPolygon
    property var _gridComponent
30 31
    property var _entryCoordinate
    property var _exitCoordinate
32

33 34
    signal clicked(int sequenceNumber)

35
    function _addVisualElements() {
36
        _gridComponent = gridComponent.createObject(map)
37 38
        _entryCoordinate = entryPointComponent.createObject(map)
        _exitCoordinate = exitPointComponent.createObject(map)
39
        map.addMapItem(_gridComponent)
40 41
        map.addMapItem(_entryCoordinate)
        map.addMapItem(_exitCoordinate)
42 43
    }

44
    function _destroyVisualElements() {
45
        _gridComponent.destroy()
46 47
        _entryCoordinate.destroy()
        _exitCoordinate.destroy()
48 49
    }

50 51
    /// Add an initial 4 sided polygon if there is none
    function _addInitialPolygon() {
52
        if (_mapPolygon.count < 3) {
53
            // Initial polygon is inset to take 2/3rds space
54
            var rect = Qt.rect(map.centerViewport.x, map.centerViewport.y, map.centerViewport.width, map.centerViewport.height)
55 56 57 58
            rect.x += (rect.width * 0.25) / 2
            rect.y += (rect.height * 0.25) / 2
            rect.width *= 0.75
            rect.height *= 0.75
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77

            var centerCoord =       map.toCoordinate(Qt.point(rect.x + (rect.width / 2), rect.y + (rect.height / 2)),   false /* clipToViewPort */)
            var topLeftCoord =      map.toCoordinate(Qt.point(rect.x, rect.y),                                          false /* clipToViewPort */)
            var topRightCoord =     map.toCoordinate(Qt.point(rect.x + rect.width, rect.y),                             false /* clipToViewPort */)
            var bottomLeftCoord =   map.toCoordinate(Qt.point(rect.x, rect.y + rect.height),                            false /* clipToViewPort */)
            var bottomRightCoord =  map.toCoordinate(Qt.point(rect.x + rect.width, rect.y + rect.height),               false /* clipToViewPort */)

            // Initial polygon has max width and height of 3000 meters
            var halfWidthMeters =   Math.min(topLeftCoord.distanceTo(topRightCoord), 3000) / 2
            var halfHeightMeters =  Math.min(topLeftCoord.distanceTo(bottomLeftCoord), 3000) / 2
            topLeftCoord =      centerCoord.atDistanceAndAzimuth(halfWidthMeters, -90).atDistanceAndAzimuth(halfHeightMeters, 0)
            topRightCoord =     centerCoord.atDistanceAndAzimuth(halfWidthMeters, 90).atDistanceAndAzimuth(halfHeightMeters, 0)
            bottomLeftCoord =   centerCoord.atDistanceAndAzimuth(halfWidthMeters, -90).atDistanceAndAzimuth(halfHeightMeters, 180)
            bottomRightCoord =  centerCoord.atDistanceAndAzimuth(halfWidthMeters, 90).atDistanceAndAzimuth(halfHeightMeters, 180)

            _mapPolygon.appendVertex(topLeftCoord)
            _mapPolygon.appendVertex(topRightCoord)
            _mapPolygon.appendVertex(bottomRightCoord)
            _mapPolygon.appendVertex(bottomLeftCoord)
78 79 80 81 82 83 84 85 86 87 88 89
        }
    }

    Component.onCompleted: {
        _addInitialPolygon()
        _addVisualElements()
    }

    Component.onDestruction: {
        _destroyVisualElements()
    }

90 91 92 93
    QGCMapPolygonVisuals {
        id:         mapPolygonVisuals
        mapControl: map
        mapPolygon: _mapPolygon
94

95 96
        Component.onCompleted: {
            mapPolygonVisuals.addVisuals()
97
            if (_missionItem.isCurrentItem) {
98
                mapPolygonVisuals.addHandles()
99 100 101
            }
        }

102 103
        Connections {
            target: _missionItem
104

105 106 107 108 109 110 111
            onIsCurrentItemChanged: {
                if (_missionItem.isCurrentItem) {
                    mapPolygonVisuals.addHandles()
                } else {
                    mapPolygonVisuals.removeHandles()
                }
            }
112 113 114 115 116 117 118 119 120 121
        }
    }

    // Survey grid lines
    Component {
        id: gridComponent

        MapPolyline {
            line.color: "white"
            line.width: 2
122 123 124 125 126 127 128 129 130
            path:       _missionItem.gridPoints
        }
    }

    // Entry point
    Component {
        id: entryPointComponent

        MapQuickItem {
131 132
            anchorPoint.x:  sourceItem.anchorPointX
            anchorPoint.y:  sourceItem.anchorPointY
133 134
            z:              QGroundControl.zOrderMapItems
            coordinate:     _missionItem.coordinate
135
            visible:        _missionItem.exitCoordinate.isValid
136

137
            sourceItem: MissionItemIndexLabel {
138
                index:      _missionItem.sequenceNumber
139 140
                label:      "Entry"
                checked:    _missionItem.isCurrentItem
141
                onClicked:  _root.clicked(_missionItem.sequenceNumber)
142 143 144 145 146 147 148 149 150
            }
        }
    }

    // Exit point
    Component {
        id: exitPointComponent

        MapQuickItem {
151 152
            anchorPoint.x:  sourceItem.anchorPointX
            anchorPoint.y:  sourceItem.anchorPointY
153 154
            z:              QGroundControl.zOrderMapItems
            coordinate:     _missionItem.exitCoordinate
155
            visible:        _missionItem.exitCoordinate.isValid
156

157
            sourceItem: MissionItemIndexLabel {
158
                index:      _missionItem.lastSequenceNumber
159 160
                label:      "Exit"
                checked:    _missionItem.isCurrentItem
161
                onClicked:  _root.clicked(_missionItem.sequenceNumber)
162
            }
163 164 165
        }
    }
}