/**************************************************************************** * * (c) 2009-2016 QGROUNDCONTROL PROJECT * * 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 property var _refPoint signal clicked(int sequenceNumber) function _addVisualElements() { _visualTransectsComponent = visualTransectsComponent.createObject(map) _entryCoordinate = entryPointComponent.createObject(map) _exitCoordinate = exitPointComponent.createObject(map) _refPoint = refPointComponent.createObject(map) map.addMapItem(_visualTransectsComponent) map.addMapItem(_entryCoordinate) map.addMapItem(_exitCoordinate) map.addMapItem(_refPoint) } function _destroyVisualElements() { _visualTransectsComponent.destroy() _entryCoordinate.destroy() _exitCoordinate.destroy() _refPoint.destroy() } /// 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) } } function _setRefPoint() { _missionItem.resetReference(); } Component.onCompleted: { if ( !_missionItem.isInitialized ) { _addInitialPolygon() _missionItem.isInitialized = true // set isInitialized to true, to trigger _rebuildTransectsPhase1 in the last line _setRefPoint() } _addVisualElements() } Component.onDestruction: { _destroyVisualElements() } WimaMapPolygonVisuals { 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) } } } // Ref. point (Base Station) Component { id: refPointComponent DragCoordinate { map: _root.map qgcView: _root.qgcView z: QGroundControl.zOrderMapItems checked: _missionItem.isCurrentItem coordinate: _missionItem.refPoint property var refPoint: _missionItem.refPoint onRefPointChanged: { if (refPoint !== coordinate) { coordinate = refPoint } } onClicked: { _root.clicked(_missionItem.sequenceNumber) } onDragReleased: { _missionItem.refPoint = coordinate } } } }