SurveyMapVisual.qml 5.76 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

DonLakeFlyer's avatar
DonLakeFlyer committed
25
    property var map        ///< Map control to place item in
26

27
    property var _missionItem:      object
28 29
    property var _mapPolygon:       object.surveyAreaPolygon
    property var _visualTransectsComponent
30 31
    property var _entryCoordinate
    property var _exitCoordinate
32

33 34
    signal clicked(int sequenceNumber)

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

44
    function _destroyVisualElements() {
45
        _visualTransectsComponent.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
    QGCMapPolygonVisuals {
91 92 93 94 95 96 97 98
        id:                 mapPolygonVisuals
        mapControl:         map
        mapPolygon:         _mapPolygon
        interactive:        _missionItem.isCurrentItem
        borderWidth:        1
        borderColor:        "black"
        interiorColor:      "green"
        interiorOpacity:    0.5
99 100
    }

101
    // Transect lines
102
    Component {
103
        id: visualTransectsComponent
104 105 106 107

        MapPolyline {
            line.color: "white"
            line.width: 2
108
            path:       _missionItem.visualTransectPoints
109 110 111 112 113 114 115 116
        }
    }

    // Entry point
    Component {
        id: entryPointComponent

        MapQuickItem {
117 118
            anchorPoint.x:  sourceItem.anchorPointX
            anchorPoint.y:  sourceItem.anchorPointY
119 120
            z:              QGroundControl.zOrderMapItems
            coordinate:     _missionItem.coordinate
121
            visible:        _missionItem.exitCoordinate.isValid
122

123
            sourceItem: MissionItemIndexLabel {
124
                index:      _missionItem.sequenceNumber
125 126
                label:      "Entry"
                checked:    _missionItem.isCurrentItem
127
                onClicked:  _root.clicked(_missionItem.sequenceNumber)
128 129 130 131 132 133 134 135 136
            }
        }
    }

    // Exit point
    Component {
        id: exitPointComponent

        MapQuickItem {
137 138
            anchorPoint.x:  sourceItem.anchorPointX
            anchorPoint.y:  sourceItem.anchorPointY
139 140
            z:              QGroundControl.zOrderMapItems
            coordinate:     _missionItem.exitCoordinate
141
            visible:        _missionItem.exitCoordinate.isValid
142

143
            sourceItem: MissionItemIndexLabel {
144
                index:      _missionItem.lastSequenceNumber
145 146
                label:      "Exit"
                checked:    _missionItem.isCurrentItem
147
                onClicked:  _root.clicked(_missionItem.sequenceNumber)
148
            }
149 150 151
        }
    }
}