Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Q
qgroundcontrol
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Valentin Platzgummer
qgroundcontrol
Commits
10fc35fb
Unverified
Commit
10fc35fb
authored
Oct 05, 2019
by
Don Gagne
Committed by
GitHub
Oct 05, 2019
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #7876 from DonLakeFlyer/StructureScan
Structure Scan: Start with no polygon
parents
d6685452
f3ddd277
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
152 additions
and
176 deletions
+152
-176
QGCMapPolygonVisuals.qml
src/MissionManager/QGCMapPolygonVisuals.qml
+2
-2
QGCMapPolylineVisuals.qml
src/MissionManager/QGCMapPolylineVisuals.qml
+2
-2
CorridorScanEditor.qml
src/PlanView/CorridorScanEditor.qml
+1
-1
StructureScanEditor.qml
src/PlanView/StructureScanEditor.qml
+145
-126
StructureScanMapVisual.qml
src/PlanView/StructureScanMapVisual.qml
+2
-45
No files found.
src/MissionManager/QGCMapPolygonVisuals.qml
View file @
10fc35fb
...
@@ -525,14 +525,14 @@ Item {
...
@@ -525,14 +525,14 @@ Item {
QGCButton
{
QGCButton
{
_horizontalPadding
:
0
_horizontalPadding
:
0
text
:
qsTr
(
"
Basic
Polygon
"
)
text
:
qsTr
(
"
Basic
"
)
visible
:
!
_traceMode
visible
:
!
_traceMode
onClicked
:
_resetPolygon
()
onClicked
:
_resetPolygon
()
}
}
QGCButton
{
QGCButton
{
_horizontalPadding
:
0
_horizontalPadding
:
0
text
:
qsTr
(
"
Circular
Polygon
"
)
text
:
qsTr
(
"
Circular
"
)
visible
:
!
_traceMode
visible
:
!
_traceMode
onClicked
:
_resetCircle
()
onClicked
:
_resetCircle
()
}
}
...
...
src/MissionManager/QGCMapPolylineVisuals.qml
View file @
10fc35fb
...
@@ -323,14 +323,14 @@ Item {
...
@@ -323,14 +323,14 @@ Item {
QGCButton
{
QGCButton
{
_horizontalPadding
:
0
_horizontalPadding
:
0
text
:
qsTr
(
"
Basic
Corridor
"
)
text
:
qsTr
(
"
Basic
"
)
visible
:
!
_traceMode
visible
:
!
_traceMode
onClicked
:
_resetPolyline
()
onClicked
:
_resetPolyline
()
}
}
QGCButton
{
QGCButton
{
_horizontalPadding
:
0
_horizontalPadding
:
0
text
:
_traceMode
?
qsTr
(
"
Done Tracing
"
)
:
qsTr
(
"
Trace
Corridor
"
)
text
:
_traceMode
?
qsTr
(
"
Done Tracing
"
)
:
qsTr
(
"
Trace
"
)
onClicked
:
{
onClicked
:
{
if
(
_traceMode
)
{
if
(
_traceMode
)
{
if
(
mapPolyline
.
count
<
2
)
{
if
(
mapPolyline
.
count
<
2
)
{
...
...
src/PlanView/CorridorScanEditor.qml
View file @
10fc35fb
...
@@ -72,7 +72,7 @@ Rectangle {
...
@@ -72,7 +72,7 @@ Rectangle {
anchors.left
:
parent
.
left
anchors.left
:
parent
.
left
anchors.right
:
parent
.
right
anchors.right
:
parent
.
right
spacing
:
_margin
spacing
:
_margin
visible
:
missionItem
.
surveyAreaPolygon
.
isValid
visible
:
missionItem
.
corridorPolyline
.
isValid
QGCTabBar
{
QGCTabBar
{
id
:
tabBar
id
:
tabBar
...
...
src/PlanView/StructureScanEditor.qml
View file @
10fc35fb
...
@@ -55,168 +55,187 @@ Rectangle {
...
@@ -55,168 +55,187 @@ Rectangle {
anchors.top
:
parent
.
top
anchors.top
:
parent
.
top
anchors.left
:
parent
.
left
anchors.left
:
parent
.
left
anchors.right
:
parent
.
right
anchors.right
:
parent
.
right
spacing
:
_margin
QGCTabBar
{
ColumnLayout
{
id
:
tabBar
anchors.left
:
parent
.
left
anchors.left
:
parent
.
left
anchors.right
:
parent
.
right
anchors.right
:
parent
.
right
spacing
:
_margin
visible
:
!
missionItem
.
structurePolygon
.
isValid
Component.onCompleted
:
currentIndex
=
0
QGCLabel
{
Layout.fillWidth
:
true
QGCTabButton
{
text
:
qsTr
(
"
Grid
"
)
}
wrapMode
:
Text
.
WordWrap
QGCTabButton
{
text
:
qsTr
(
"
Camera
"
)
}
text
:
qsTr
(
"
Use the Polygon Tools to create the polygon which outlines the structure.
"
)
}
}
}
Column
{
Column
{
anchors.left
:
parent
.
left
anchors.left
:
parent
.
left
anchors.right
:
parent
.
right
anchors.right
:
parent
.
right
spacing
:
_margin
spacing
:
_margin
visible
:
tabBar
.
currentIndex
==
0
visible
:
missionItem
.
structurePolygon
.
isValid
QGCLabel
{
QGCTabBar
{
id
:
tabBar
anchors.left
:
parent
.
left
anchors.left
:
parent
.
left
anchors.right
:
parent
.
right
anchors.right
:
parent
.
right
text
:
qsTr
(
"
Note: Polygon respresents structure surface not vehicle flight path.
"
)
wrapMode
:
Text
.
WordWrap
font.pointSize
:
ScreenTools
.
smallFontPointSize
}
QGCLabel
{
Component.onCompleted
:
currentIndex
=
0
anchors.left
:
parent
.
left
anchors.right
:
parent
.
right
text
:
qsTr
(
"
WARNING: Photo interval is below minimum interval (%1 secs) supported by camera.
"
).
arg
(
_cameraMinTriggerInterval
.
toFixed
(
1
))
wrapMode
:
Text
.
WordWrap
color
:
qgcPal
.
warningText
visible
:
missionItem
.
cameraShots
>
0
&&
_cameraMinTriggerInterval
!==
0
&&
_cameraMinTriggerInterval
>
missionItem
.
timeBetweenShots
}
CameraCalcGrid
{
QGCTabButton
{
text
:
qsTr
(
"
Grid
"
)
}
cameraCalc
:
missionItem
.
cameraCalc
QGCTabButton
{
text
:
qsTr
(
"
Camera
"
)
}
vehicleFlightIsFrontal
:
false
distanceToSurfaceLabel
:
qsTr
(
"
Scan Distance
"
)
distanceToSurfaceAltitudeMode
:
QGroundControl
.
AltitudeModeNone
frontalDistanceLabel
:
qsTr
(
"
Layer Height
"
)
sideDistanceLabel
:
qsTr
(
"
Trigger Distance
"
)
}
SectionHeader
{
id
:
scanHeader
text
:
qsTr
(
"
Scan
"
)
}
}
Column
{
Column
{
anchors.left
:
parent
.
left
anchors.left
:
parent
.
left
anchors.right
:
parent
.
right
anchors.right
:
parent
.
right
spacing
:
_margin
spacing
:
_margin
visible
:
scanHeader
.
checked
visible
:
tabBar
.
currentIndex
==
0
GridLayout
{
QGCLabel
{
anchors.left
:
parent
.
left
anchors.left
:
parent
.
left
anchors.right
:
parent
.
right
anchors.right
:
parent
.
right
columnSpacing
:
_margin
text
:
qsTr
(
"
Note: Polygon respresents structure surface not vehicle flight path.
"
)
rowSpacing
:
_margin
wrapMode
:
Text
.
WordWrap
columns
:
2
font.pointSize
:
ScreenTools
.
smallFontPointSize
}
FactComboBox
{
QGCLabel
{
fact
:
missionItem
.
startFromTop
anchors.left
:
parent
.
left
indexModel
:
true
anchors.right
:
parent
.
right
model
:
[
qsTr
(
"
Start Scan From Bottom
"
),
qsTr
(
"
Start Scan From Top
"
)
]
text
:
qsTr
(
"
WARNING: Photo interval is below minimum interval (%1 secs) supported by camera.
"
).
arg
(
_cameraMinTriggerInterval
.
toFixed
(
1
))
Layout.columnSpan
:
2
wrapMode
:
Text
.
WordWrap
Layout.fillWidth
:
true
color
:
qgcPal
.
warningText
}
visible
:
missionItem
.
cameraShots
>
0
&&
_cameraMinTriggerInterval
!==
0
&&
_cameraMinTriggerInterval
>
missionItem
.
timeBetweenShots
}
QGCLabel
{
CameraCalcGrid
{
text
:
qsTr
(
"
Structure Height
"
)
cameraCalc
:
missionItem
.
cameraCalc
}
vehicleFlightIsFrontal
:
false
FactTextField
{
distanceToSurfaceLabel
:
qsTr
(
"
Scan Distance
"
)
fact
:
missionItem
.
structureHeight
distanceToSurfaceAltitudeMode
:
QGroundControl
.
AltitudeModeNone
Layout.fillWidth
:
true
frontalDistanceLabel
:
qsTr
(
"
Layer Height
"
)
}
sideDistanceLabel
:
qsTr
(
"
Trigger Distance
"
)
}
QGCLabel
{
text
:
qsTr
(
"
Scan Bottom Alt
"
)
}
SectionHeader
{
AltitudeFactTextField
{
id
:
scanHeader
fact
:
missionItem
.
scanBottomAlt
text
:
qsTr
(
"
Scan
"
)
altitudeMode
:
QGroundControl
.
AltitudeModeRelative
}
Layout.fillWidth
:
true
}
QGCLabel
{
text
:
qsTr
(
"
Entrance/Exit Alt
"
)
}
Column
{
AltitudeFactTextField
{
anchors.left
:
parent
.
left
fact
:
missionItem
.
entranceAlt
anchors.right
:
parent
.
right
altitudeMode
:
QGroundControl
.
AltitudeModeRelative
spacing
:
_margin
Layout.fillWidth
:
true
visible
:
scanHeader
.
checked
GridLayout
{
anchors.left
:
parent
.
left
anchors.right
:
parent
.
right
columnSpacing
:
_margin
rowSpacing
:
_margin
columns
:
2
FactComboBox
{
fact
:
missionItem
.
startFromTop
indexModel
:
true
model
:
[
qsTr
(
"
Start Scan From Bottom
"
),
qsTr
(
"
Start Scan From Top
"
)
]
Layout.columnSpan
:
2
Layout.fillWidth
:
true
}
QGCLabel
{
text
:
qsTr
(
"
Structure Height
"
)
}
FactTextField
{
fact
:
missionItem
.
structureHeight
Layout.fillWidth
:
true
}
QGCLabel
{
text
:
qsTr
(
"
Scan Bottom Alt
"
)
}
AltitudeFactTextField
{
fact
:
missionItem
.
scanBottomAlt
altitudeMode
:
QGroundControl
.
AltitudeModeRelative
Layout.fillWidth
:
true
}
QGCLabel
{
text
:
qsTr
(
"
Entrance/Exit Alt
"
)
}
AltitudeFactTextField
{
fact
:
missionItem
.
entranceAlt
altitudeMode
:
QGroundControl
.
AltitudeModeRelative
Layout.fillWidth
:
true
}
QGCLabel
{
text
:
qsTr
(
"
Gimbal Pitch
"
)
visible
:
missionItem
.
cameraCalc
.
isManualCamera
}
FactTextField
{
fact
:
missionItem
.
gimbalPitch
Layout.fillWidth
:
true
visible
:
missionItem
.
cameraCalc
.
isManualCamera
}
}
}
QGCLabel
{
Item
{
text
:
qsTr
(
"
Gimbal Pitch
"
)
height
:
ScreenTools
.
defaultFontPixelHeight
/
2
visible
:
missionItem
.
cameraCalc
.
isManualCamera
width
:
1
}
FactTextField
{
fact
:
missionItem
.
gimbalPitch
Layout.fillWidth
:
true
visible
:
missionItem
.
cameraCalc
.
isManualCamera
}
}
}
Item
{
QGCButton
{
height
:
ScreenTools
.
defaultFontPixelHeight
/
2
text
:
qsTr
(
"
Rotate entry point
"
)
width
:
1
onClicked
:
missionItem
.
rotateEntryPoint
()
}
}
}
// Column - Scan
QGCButton
{
SectionHeader
{
text
:
qsTr
(
"
Rotate entry point
"
)
id
:
statsHeader
onClicked
:
missionItem
.
rotateEntryPoint
(
)
text
:
qsTr
(
"
Statistics
"
)
}
}
}
// Column - Scan
SectionHeader
{
id
:
statsHeader
text
:
qsTr
(
"
Statistics
"
)
}
Grid
{
Grid
{
columns
:
2
columns
:
2
columnSpacing
:
ScreenTools
.
defaultFontPixelWidth
columnSpacing
:
ScreenTools
.
defaultFontPixelWidth
visible
:
statsHeader
.
checked
visible
:
statsHeader
.
checked
QGCLabel
{
text
:
qsTr
(
"
Layers
"
)
}
QGCLabel
{
text
:
qsTr
(
"
Layers
"
)
}
QGCLabel
{
text
:
missionItem
.
layers
.
valueString
}
QGCLabel
{
text
:
missionItem
.
layers
.
valueString
}
QGCLabel
{
text
:
qsTr
(
"
Layer Height
"
)
}
QGCLabel
{
text
:
qsTr
(
"
Layer Height
"
)
}
QGCLabel
{
text
:
missionItem
.
cameraCalc
.
adjustedFootprintFrontal
.
valueString
+
"
"
+
QGroundControl
.
appSettingsDistanceUnitsString
}
QGCLabel
{
text
:
missionItem
.
cameraCalc
.
adjustedFootprintFrontal
.
valueString
+
"
"
+
QGroundControl
.
appSettingsDistanceUnitsString
}
QGCLabel
{
text
:
qsTr
(
"
Top Layer Alt
"
)
}
QGCLabel
{
text
:
qsTr
(
"
Top Layer Alt
"
)
}
QGCLabel
{
text
:
QGroundControl
.
metersToAppSettingsDistanceUnits
(
missionItem
.
topFlightAlt
).
toFixed
(
1
)
+
"
"
+
QGroundControl
.
appSettingsDistanceUnitsString
}
QGCLabel
{
text
:
QGroundControl
.
metersToAppSettingsDistanceUnits
(
missionItem
.
topFlightAlt
).
toFixed
(
1
)
+
"
"
+
QGroundControl
.
appSettingsDistanceUnitsString
}
QGCLabel
{
text
:
qsTr
(
"
Bottom Layer Alt
"
)
}
QGCLabel
{
text
:
qsTr
(
"
Bottom Layer Alt
"
)
}
QGCLabel
{
text
:
QGroundControl
.
metersToAppSettingsDistanceUnits
(
missionItem
.
bottomFlightAlt
).
toFixed
(
1
)
+
"
"
+
QGroundControl
.
appSettingsDistanceUnitsString
}
QGCLabel
{
text
:
QGroundControl
.
metersToAppSettingsDistanceUnits
(
missionItem
.
bottomFlightAlt
).
toFixed
(
1
)
+
"
"
+
QGroundControl
.
appSettingsDistanceUnitsString
}
QGCLabel
{
text
:
qsTr
(
"
Photo Count
"
)
}
QGCLabel
{
text
:
qsTr
(
"
Photo Count
"
)
}
QGCLabel
{
text
:
missionItem
.
cameraShots
}
QGCLabel
{
text
:
missionItem
.
cameraShots
}
QGCLabel
{
text
:
qsTr
(
"
Photo Interval
"
)
}
QGCLabel
{
text
:
qsTr
(
"
Photo Interval
"
)
}
QGCLabel
{
text
:
missionItem
.
timeBetweenShots
.
toFixed
(
1
)
+
"
"
+
qsTr
(
"
secs
"
)
}
QGCLabel
{
text
:
missionItem
.
timeBetweenShots
.
toFixed
(
1
)
+
"
"
+
qsTr
(
"
secs
"
)
}
QGCLabel
{
text
:
qsTr
(
"
Trigger Distance
"
)
}
QGCLabel
{
text
:
qsTr
(
"
Trigger Distance
"
)
}
QGCLabel
{
text
:
missionItem
.
cameraCalc
.
adjustedFootprintSide
.
valueString
+
"
"
+
QGroundControl
.
appSettingsDistanceUnitsString
}
QGCLabel
{
text
:
missionItem
.
cameraCalc
.
adjustedFootprintSide
.
valueString
+
"
"
+
QGroundControl
.
appSettingsDistanceUnitsString
}
}
}
}
// Grid Column
}
// Grid Column
Column
{
Column
{
anchors.left
:
parent
.
left
anchors.left
:
parent
.
left
anchors.right
:
parent
.
right
anchors.right
:
parent
.
right
spacing
:
_margin
spacing
:
_margin
visible
:
tabBar
.
currentIndex
==
1
visible
:
tabBar
.
currentIndex
==
1
CameraCalcCamera
{
CameraCalcCamera
{
cameraCalc
:
missionItem
.
cameraCalc
cameraCalc
:
missionItem
.
cameraCalc
vehicleFlightIsFrontal
:
false
vehicleFlightIsFrontal
:
false
distanceToSurfaceLabel
:
qsTr
(
"
Scan Distance
"
)
distanceToSurfaceLabel
:
qsTr
(
"
Scan Distance
"
)
distanceToSurfaceAltitudeMode
:
QGroundControl
.
AltitudeModeNone
distanceToSurfaceAltitudeMode
:
QGroundControl
.
AltitudeModeNone
frontalDistanceLabel
:
qsTr
(
"
Layer Height
"
)
frontalDistanceLabel
:
qsTr
(
"
Layer Height
"
)
sideDistanceLabel
:
qsTr
(
"
Trigger Distance
"
)
sideDistanceLabel
:
qsTr
(
"
Trigger Distance
"
)
}
}
}
}
// Camera Column
}
}
}
}
// Rectangle
}
src/PlanView/StructureScanMapVisual.qml
View file @
10fc35fb
...
@@ -18,7 +18,7 @@ import QGroundControl.Palette 1.0
...
@@ -18,7 +18,7 @@ import QGroundControl.Palette 1.0
import
QGroundControl
.
Controls
1.0
import
QGroundControl
.
Controls
1.0
import
QGroundControl
.
FlightMap
1.0
import
QGroundControl
.
FlightMap
1.0
/// S
urvey
Complex Mission Item visuals
/// S
tructure Scan
Complex Mission Item visuals
Item
{
Item
{
id
:
_root
id
:
_root
...
@@ -34,54 +34,11 @@ Item {
...
@@ -34,54 +34,11 @@ Item {
objMgr
.
createObjects
([
entryPointComponent
,
exitPointComponent
],
map
,
true
/* parentObjectIsMap */
)
objMgr
.
createObjects
([
entryPointComponent
,
exitPointComponent
],
map
,
true
/* parentObjectIsMap */
)
}
}
function
_destroyVisualElements
()
{
objMgr
.
destroyObjects
()
}
/// Add an initial 4 sided polygon if there is none
function
_addInitialPolygon
()
{
if
(
_structurePolygon
.
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 */
)
// Adjust polygon to max size
var
maxSize
=
100
var
halfWidthMeters
=
Math
.
min
(
topLeftCoord
.
distanceTo
(
topRightCoord
),
maxSize
)
/
2
var
halfHeightMeters
=
Math
.
min
(
topLeftCoord
.
distanceTo
(
bottomLeftCoord
),
maxSize
)
/
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
)
_structurePolygon
.
appendVertex
(
topLeftCoord
)
_structurePolygon
.
appendVertex
(
topRightCoord
)
_structurePolygon
.
appendVertex
(
bottomRightCoord
)
_structurePolygon
.
appendVertex
(
bottomLeftCoord
)
}
}
Component.onCompleted
:
{
Component.onCompleted
:
{
_addInitialPolygon
()
_addVisualElements
()
_addVisualElements
()
}
}
Component.onDestruction
:
{
QGCDynamicObjectManager
{
id
:
objMgr
}
_destroyVisualElements
()
}
QGCDynamicObjectManager
{
id
:
objMgr
}
QGCMapPolygonVisuals
{
QGCMapPolygonVisuals
{
mapControl
:
map
mapControl
:
map
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment