9 changed files with 290 additions and 5 deletions
@ -0,0 +1,108 @@ |
|||||||
|
/**************************************************************************** |
||||||
|
* |
||||||
|
* (c) 2009-2020 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. |
||||||
|
* |
||||||
|
****************************************************************************/ |
||||||
|
|
||||||
|
import QtQuick 2.12 |
||||||
|
import QtLocation 5.3 |
||||||
|
import QtPositioning 5.3 |
||||||
|
import QtGraphicalEffects 1.0 |
||||||
|
|
||||||
|
import QGroundControl 1.0 |
||||||
|
import QGroundControl.ScreenTools 1.0 |
||||||
|
import QGroundControl.Vehicle 1.0 |
||||||
|
import QGroundControl.Controls 1.0 |
||||||
|
//import QGroundControl.Controllers 1.0 |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// Marker for displaying a vehicle location on the map |
||||||
|
Item { |
||||||
|
id: _root |
||||||
|
anchors.fill: parent |
||||||
|
|
||||||
|
property var vehicle /// Vehicle object, undefined for ADSB vehicle |
||||||
|
property var range |
||||||
|
|
||||||
|
property var _distanceSensor: vehicle?vehicle.distanceSensors:null |
||||||
|
property var _range: range?range:6 // default 6m view |
||||||
|
|
||||||
|
property var _rotationNone: _distanceSensor?_distanceSensor.rotationNone.value:0 |
||||||
|
property var _rotationYaw45: _distanceSensor?_distanceSensor.rotationYaw45.value:0 |
||||||
|
property var _rotationYaw90: _distanceSensor?_distanceSensor.rotationYaw90.value:0 |
||||||
|
property var _rotationYaw135: _distanceSensor?_distanceSensor.rotationYaw135.value:0 |
||||||
|
property var _rotationYaw180: _distanceSensor?_distanceSensor.rotationYaw180.value:0 |
||||||
|
property var _rotationYaw225: _distanceSensor?_distanceSensor.rotationYaw225.value:0 |
||||||
|
property var _rotationYaw270: _distanceSensor?_distanceSensor.rotationYaw270.value:0 |
||||||
|
property var _rotationYaw315: _distanceSensor?_distanceSensor.rotationYaw315.value:0 |
||||||
|
property var _rottab: [_rotationNone,_rotationYaw45,_rotationYaw90,_rotationYaw135,_rotationYaw180,_rotationYaw225,_rotationYaw270,_rotationYaw315] |
||||||
|
|
||||||
|
// on_RottabChanged: _sectorViewEllipsoid.requestPaint() |
||||||
|
on_RotationNoneChanged: _sectorViewEllipsoid.requestPaint() |
||||||
|
on_RotationYaw45Changed: _sectorViewEllipsoid.requestPaint() |
||||||
|
on_RotationYaw90Changed: _sectorViewEllipsoid.requestPaint() |
||||||
|
on_RotationYaw135Changed: _sectorViewEllipsoid.requestPaint() |
||||||
|
on_RotationYaw180Changed: _sectorViewEllipsoid.requestPaint() |
||||||
|
on_RotationYaw225Changed: _sectorViewEllipsoid.requestPaint() |
||||||
|
on_RotationYaw270Changed: _sectorViewEllipsoid.requestPaint() |
||||||
|
on_RotationYaw315Changed: _sectorViewEllipsoid.requestPaint() |
||||||
|
|
||||||
|
property var _minlength: Math.min(_root.width,_root.height) |
||||||
|
property var _ratio: (_minlength/2)/_root._range |
||||||
|
|
||||||
|
Canvas{ |
||||||
|
id:_sectorViewEllipsoid |
||||||
|
anchors.fill: _root |
||||||
|
opacity: 0.5 |
||||||
|
visible: _distanceSensor?true:false |
||||||
|
onPaint: { |
||||||
|
if(_distanceSensor) { |
||||||
|
var ctx = getContext("2d"); |
||||||
|
ctx.reset(); |
||||||
|
ctx.translate(width/2,height/2) |
||||||
|
ctx.strokeStyle = Qt.rgba(1, 0, 0, 1); |
||||||
|
ctx.lineWidth = width/100; |
||||||
|
ctx.scale(_root.width / _minlength,_root.height / _minlength); |
||||||
|
ctx.rotate(-Math.PI/2-Math.PI/8); |
||||||
|
for(var i=0; i< _rottab.length; i++) |
||||||
|
{ |
||||||
|
var a=Math.PI/4*i; |
||||||
|
ctx.beginPath(); |
||||||
|
ctx.arc(0,0,_rottab[i]*_ratio,0+a+Math.PI/50,Math.PI/4+a-Math.PI/50,false); |
||||||
|
ctx.stroke(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
Item{ |
||||||
|
anchors.fill: parent |
||||||
|
visible: _distanceSensor?true:false |
||||||
|
Repeater{ |
||||||
|
model: _rottab |
||||||
|
QGCLabel{ |
||||||
|
x: _sectorViewEllipsoid.width / 2-width/2 |
||||||
|
y: _sectorViewEllipsoid.height / 2-height/2 |
||||||
|
text: modelData |
||||||
|
font.family: ScreenTools.demiboldFontFamily |
||||||
|
transform: Translate { |
||||||
|
x: Math.cos(-Math.PI/2+Math.PI/4*index)*(modelData*_ratio) |
||||||
|
y: Math.sin(-Math.PI/2+Math.PI/4*index)*(modelData*_ratio) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
transform: Scale { |
||||||
|
origin.x: _sectorViewEllipsoid.width / 2 |
||||||
|
origin.y: _sectorViewEllipsoid.height / 2 |
||||||
|
xScale: _root.width / _minlength |
||||||
|
yScale: _root.height / _minlength |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
@ -0,0 +1,148 @@ |
|||||||
|
/**************************************************************************** |
||||||
|
* |
||||||
|
* (c) 2009-2020 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. |
||||||
|
* |
||||||
|
****************************************************************************/ |
||||||
|
|
||||||
|
import QtQuick 2.12 |
||||||
|
import QtLocation 5.3 |
||||||
|
import QtPositioning 5.3 |
||||||
|
import QtGraphicalEffects 1.0 |
||||||
|
|
||||||
|
import QGroundControl 1.0 |
||||||
|
import QGroundControl.ScreenTools 1.0 |
||||||
|
import QGroundControl.Vehicle 1.0 |
||||||
|
import QGroundControl.Controls 1.0 |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// Marker for displaying a vehicle location on the map |
||||||
|
MapQuickItem { |
||||||
|
id: _root |
||||||
|
property var vehicle /// Vehicle object, undefined for ADSB vehicle |
||||||
|
property var map |
||||||
|
property double heading: vehicle ? vehicle.heading.value : Number.NaN ///< Vehicle heading, NAN for none |
||||||
|
|
||||||
|
anchorPoint.x: vehicleItem.width / 2 |
||||||
|
anchorPoint.y: vehicleItem.height / 2 |
||||||
|
visible: coordinate.isValid |
||||||
|
|
||||||
|
property bool _adsbVehicle: vehicle ? false : true |
||||||
|
property real _uavSize: ScreenTools.defaultFontPixelHeight * 5 |
||||||
|
property real _adsbSize: ScreenTools.defaultFontPixelHeight * 2.5 |
||||||
|
property var _map: map |
||||||
|
property bool _multiVehicle: QGroundControl.multiVehicleManager.vehicles.count > 1 |
||||||
|
property real _ratio: 1 |
||||||
|
|
||||||
|
property var _distanceSensor: vehicle?vehicle.distanceSensors:null |
||||||
|
property var _maxSensor: _distanceSensor?_distanceSensor.maxDistance.value:1 //need to change in cc |
||||||
|
property var _rotationNone: _distanceSensor?_distanceSensor.rotationNone.value:0 |
||||||
|
property var _rotationYaw45: _distanceSensor?_distanceSensor.rotationYaw45.value:0 |
||||||
|
property var _rotationYaw90: _distanceSensor?_distanceSensor.rotationYaw90.value:0 |
||||||
|
property var _rotationYaw135: _distanceSensor?_distanceSensor.rotationYaw135.value:0 |
||||||
|
property var _rotationYaw180: _distanceSensor?_distanceSensor.rotationYaw180.value:0 |
||||||
|
property var _rotationYaw225: _distanceSensor?_distanceSensor.rotationYaw225.value:0 |
||||||
|
property var _rotationYaw270: _distanceSensor?_distanceSensor.rotationYaw270.value:0 |
||||||
|
property var _rotationYaw315: _distanceSensor?_distanceSensor.rotationYaw315.value:0 |
||||||
|
property var _rottab: [_rotationNone,_rotationYaw45,_rotationYaw90,_rotationYaw135,_rotationYaw180,_rotationYaw225,_rotationYaw270,_rotationYaw315] |
||||||
|
|
||||||
|
function calcSize(){ |
||||||
|
if(_map) { |
||||||
|
var scaleLinePixelLength = 100 |
||||||
|
var leftCoord = _map.toCoordinate(Qt.point(0, 0), false /* clipToViewPort */) |
||||||
|
var rightCoord = _map.toCoordinate(Qt.point(scaleLinePixelLength, 0), false /* clipToViewPort */) |
||||||
|
var scaleLineMeters = Math.round(leftCoord.distanceTo(rightCoord)) |
||||||
|
} |
||||||
|
_ratio=scaleLinePixelLength/scaleLineMeters; |
||||||
|
} |
||||||
|
|
||||||
|
on_RotationNoneChanged: vehicleSensors.requestPaint() |
||||||
|
on_RotationYaw45Changed: vehicleSensors.requestPaint() |
||||||
|
on_RotationYaw90Changed: vehicleSensors.requestPaint() |
||||||
|
on_RotationYaw135Changed: vehicleSensors.requestPaint() |
||||||
|
on_RotationYaw180Changed: vehicleSensors.requestPaint() |
||||||
|
on_RotationYaw225Changed: vehicleSensors.requestPaint() |
||||||
|
on_RotationYaw270Changed: vehicleSensors.requestPaint() |
||||||
|
on_RotationYaw315Changed: vehicleSensors.requestPaint() |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Connections { |
||||||
|
target: map |
||||||
|
onWidthChanged: scaleTimer.restart() |
||||||
|
onHeightChanged: scaleTimer.restart() |
||||||
|
onZoomLevelChanged: scaleTimer.restart() |
||||||
|
} |
||||||
|
|
||||||
|
Timer { |
||||||
|
id: scaleTimer |
||||||
|
interval: 100 |
||||||
|
running: false |
||||||
|
repeat: false |
||||||
|
onTriggered: calcSize() |
||||||
|
} |
||||||
|
|
||||||
|
sourceItem: Item { |
||||||
|
id: vehicleItem |
||||||
|
width: detectionLimitCircle.width |
||||||
|
height: detectionLimitCircle.height |
||||||
|
opacity: 0.5 |
||||||
|
|
||||||
|
Canvas{ |
||||||
|
id: vehicleSensors |
||||||
|
anchors.fill: detectionLimitCircle |
||||||
|
transform: Rotation { |
||||||
|
origin.x: detectionLimitCircle.width / 2 |
||||||
|
origin.y: detectionLimitCircle.height / 2 |
||||||
|
angle: isNaN(heading) ? 0 : heading |
||||||
|
} |
||||||
|
function deg2rad(degrees) |
||||||
|
{ |
||||||
|
var pi = Math.PI; |
||||||
|
return degrees * (pi/180); |
||||||
|
} |
||||||
|
onPaint: { |
||||||
|
if(_distanceSensor) |
||||||
|
{ |
||||||
|
var ctx = getContext("2d"); |
||||||
|
ctx.reset(); |
||||||
|
ctx.translate(width/2,height/2) |
||||||
|
ctx.rotate(-Math.PI/2); |
||||||
|
ctx.lineWidth = 5; |
||||||
|
ctx.strokeStyle = Qt.rgba(1, 0, 0, 1); |
||||||
|
for(var i=0; i<_rottab.length;i++){ |
||||||
|
var a=deg2rad(360-22.5)+Math.PI/4*i; |
||||||
|
ctx.beginPath(); |
||||||
|
ctx.arc(0,0,_rottab[i]*_ratio, a,a+Math.PI/4,false); |
||||||
|
ctx.stroke(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
Rectangle { |
||||||
|
id: detectionLimitCircle |
||||||
|
width: _maxSensor*2*_ratio |
||||||
|
height: _maxSensor*2*_ratio |
||||||
|
anchors.fill: detectionLimitCircle |
||||||
|
color: Qt.rgba(1,1,1,0) |
||||||
|
border.color: Qt.rgba(1,1,1,1) |
||||||
|
border.width: 5 |
||||||
|
radius: width*0.5 |
||||||
|
transform: Rotation { |
||||||
|
origin.x: detectionLimitCircle.width / 2 |
||||||
|
origin.y: detectionLimitCircle.height / 2 |
||||||
|
angle: isNaN(heading) ? 0 : heading |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
Component.onCompleted: { |
||||||
|
calcSize(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
Loading…
Reference in new issue