CircularSurveyMapVisual.qml 7.07 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
/****************************************************************************
 *
 *   (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.
 *
 ****************************************************************************/

// original file: SurveyMapVisual.qml

import QtQuick          2.3
import QtQuick.Controls 1.2
import QtLocation       5.3
import QtPositioning    5.3

import QGroundControl               1.0
import QGroundControl.ScreenTools   1.0
import QGroundControl.Palette       1.0
import QGroundControl.Controls      1.0
import QGroundControl.FlightMap     1.0

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

    property var map        ///< Map control to place item in
    property var qgcView    ///< QGCView to use for popping dialogs

    property var _missionItem:      object
    property var _mapPolygon:       object.surveyAreaPolygon
    property var _visualTransectsComponent
    property var _entryCoordinate
    property var _exitCoordinate
Valentin Platzgummer's avatar
Valentin Platzgummer committed
35
    property var _refPoint
36 37 38 39 40 41 42

    signal clicked(int sequenceNumber)

    function _addVisualElements() {
        _visualTransectsComponent = visualTransectsComponent.createObject(map)
        _entryCoordinate = entryPointComponent.createObject(map)
        _exitCoordinate = exitPointComponent.createObject(map)
Valentin Platzgummer's avatar
Valentin Platzgummer committed
43
        _refPoint = refPointComponent.createObject(map)
44 45 46
        map.addMapItem(_visualTransectsComponent)
        map.addMapItem(_entryCoordinate)
        map.addMapItem(_exitCoordinate)
Valentin Platzgummer's avatar
Valentin Platzgummer committed
47
        map.addMapItem(_refPoint)
48 49 50 51 52 53
    }

    function _destroyVisualElements() {
        _visualTransectsComponent.destroy()
        _entryCoordinate.destroy()
        _exitCoordinate.destroy()
Valentin Platzgummer's avatar
Valentin Platzgummer committed
54
        _refPoint.destroy()
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
    }

    /// Add an initial 4 sided polygon if there is none
    function _addInitialPolygon() {
        if (_mapPolygon.count < 3) {
            // Initial polygon is inset to take 2/3rds space
            var rect = Qt.rect(map.centerViewport.x, map.centerViewport.y, map.centerViewport.width, map.centerViewport.height)
            rect.x += (rect.width * 0.25) / 2
            rect.y += (rect.height * 0.25) / 2
            rect.width *= 0.75
            rect.height *= 0.75

            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)
85
        }
86 87 88
    }

    function _setRefPoint() {
89
        _missionItem.resetReference();
90 91 92
    }

    Component.onCompleted: {
93
        if ( !_missionItem.isInitialized ) {
94
            _addInitialPolygon()
95
            _missionItem.isInitialized = true // set isInitialized to true, to trigger _rebuildTransectsPhase1 in the last line
Valentin Platzgummer's avatar
Valentin Platzgummer committed
96 97
            _setRefPoint()
        }
98
        _addVisualElements()
Valentin Platzgummer's avatar
Valentin Platzgummer committed
99

100 101 102 103 104 105
    }

    Component.onDestruction: {
        _destroyVisualElements()
    }

106
    WimaMapPolygonVisuals {
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
        id:                 mapPolygonVisuals
        qgcView:            _root.qgcView
        mapControl:         map
        mapPolygon:         _mapPolygon
        interactive:        _missionItem.isCurrentItem
        borderWidth:        1
        borderColor:        "black"
        interiorColor:      "green"
        interiorOpacity:    0.5
    }

    // Transect lines
    Component {
        id: visualTransectsComponent

        MapPolyline {
            line.color: "white"
            line.width: 2
            path:       _missionItem.visualTransectPoints
        }
    }

    // Entry point
    Component {
        id: entryPointComponent

        MapQuickItem {
            anchorPoint.x:  sourceItem.anchorPointX
            anchorPoint.y:  sourceItem.anchorPointY
            z:              QGroundControl.zOrderMapItems
            coordinate:     _missionItem.coordinate
            visible:        _missionItem.exitCoordinate.isValid

            sourceItem: MissionItemIndexLabel {
                index:      _missionItem.sequenceNumber
                label:      "Entry"
                checked:    _missionItem.isCurrentItem
                onClicked:  _root.clicked(_missionItem.sequenceNumber)
            }
        }
    }

    // Exit point
    Component {
        id: exitPointComponent

        MapQuickItem {
            anchorPoint.x:  sourceItem.anchorPointX
            anchorPoint.y:  sourceItem.anchorPointY
            z:              QGroundControl.zOrderMapItems
            coordinate:     _missionItem.exitCoordinate
            visible:        _missionItem.exitCoordinate.isValid

            sourceItem: MissionItemIndexLabel {
                index:      _missionItem.lastSequenceNumber
                label:      "Exit"
                checked:    _missionItem.isCurrentItem
                onClicked:  _root.clicked(_missionItem.sequenceNumber)
            }
        }
    }
168 169 170 171 172

    // Ref. point (Base Station)
    Component {
        id: refPointComponent

Valentin Platzgummer's avatar
Valentin Platzgummer committed
173 174 175
        DragCoordinate {
            map:        _root.map
            qgcView:    _root.qgcView
176
            z:          QGroundControl.zOrderMapItems
Valentin Platzgummer's avatar
Valentin Platzgummer committed
177
            checked:    _missionItem.isCurrentItem
Valentin Platzgummer's avatar
Valentin Platzgummer committed
178
            coordinate: _missionItem.refPoint
179

180 181 182 183 184 185 186 187
            property var refPoint: _missionItem.refPoint

            onRefPointChanged: {
                if (refPoint !== coordinate) {
                    coordinate = refPoint
                }
            }

188 189 190 191
            onClicked:  {
                _root.clicked(_missionItem.sequenceNumber)
            }

192 193
            onDragReleased: {
                _missionItem.refPoint = coordinate
194
            }
195 196
        }
    }
197
}