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
be40a955
Commit
be40a955
authored
Nov 20, 2020
by
Valentin Platzgummer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
MeasurementItemEditor fixed
parent
3dfdeec9
Changes
32
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
32 changed files
with
675 additions
and
981 deletions
+675
-981
qgroundcontrol.qrc
qgroundcontrol.qrc
+19
-23
AreaData.cc
src/MeasurementComplexItem/AreaData.cc
+11
-25
MeasurementComplexItem.cc
src/MeasurementComplexItem/MeasurementComplexItem.cc
+87
-24
MeasurementComplexItem.h
src/MeasurementComplexItem/MeasurementComplexItem.h
+7
-6
MeasurementArea.cc
src/MeasurementComplexItem/geometry/MeasurementArea.cc
+1
-1
MeasurementArea.SettingsGroup.json
...plexItem/geometry/json/MeasurementArea.SettingsGroup.json
+5
-0
WimaArea.SettingsGroup.json
...mentComplexItem/geometry/json/WimaArea.SettingsGroup.json
+0
-17
CircularGeneratorEditor.qml
src/MeasurementComplexItem/qml/CircularGeneratorEditor.qml
+3
-1
CircularGeneratorMapVisual.qml
...MeasurementComplexItem/qml/CircularGeneratorMapVisual.qml
+0
-1
CoordinateIndicator.qml
src/MeasurementComplexItem/qml/CoordinateIndicator.qml
+0
-0
CoordinateIndicatorDrag.qml
src/MeasurementComplexItem/qml/CoordinateIndicatorDrag.qml
+0
-0
DragCoordinate.qml
src/MeasurementComplexItem/qml/DragCoordinate.qml
+0
-0
GeoAreaEditorLoader.qml
src/MeasurementComplexItem/qml/GeoAreaEditorLoader.qml
+0
-0
GeoAreaVisualLoader.qml
src/MeasurementComplexItem/qml/GeoAreaVisualLoader.qml
+6
-5
LinearGeneratorEditor.qml
src/MeasurementComplexItem/qml/LinearGeneratorEditor.qml
+3
-2
MeasurementAreaEditor.qml
src/MeasurementComplexItem/qml/MeasurementAreaEditor.qml
+0
-0
MeasurementAreaMapVisual.qml
src/MeasurementComplexItem/qml/MeasurementAreaMapVisual.qml
+111
-0
MeasurementItemEditor.qml
src/MeasurementComplexItem/qml/MeasurementItemEditor.qml
+270
-0
MeasurementItemMapVisual.qml
src/MeasurementComplexItem/qml/MeasurementItemMapVisual.qml
+33
-6
ProgressIndicator.qml
src/MeasurementComplexItem/qml/ProgressIndicator.qml
+0
-0
SafeAreaEditor.qml
src/MeasurementComplexItem/qml/SafeAreaEditor.qml
+0
-0
SafeAreaMapVisual.qml
src/MeasurementComplexItem/qml/SafeAreaMapVisual.qml
+113
-0
WimaAreaMapVisual.qml
src/MeasurementComplexItem/qml/WimaAreaMapVisual.qml
+0
-0
WimaMapPolygonVisuals.qml
src/MeasurementComplexItem/qml/WimaMapPolygonVisuals.qml
+0
-0
WimaView.qml
src/MeasurementComplexItem/qml/WimaView.qml
+0
-0
MissionItemMapVisual.qml
src/PlanView/MissionItemMapVisual.qml
+0
-1
SurveyItemEditor.qml
src/PlanView/SurveyItemEditor.qml
+3
-1
qmldir
src/QmlControls/QGroundControl/Controls/qmldir
+3
-0
MeasurementItemEditor.qml
src/WimaView/MeasurementItemEditor.qml
+0
-209
Wima.qmldir
src/WimaView/Wima.qmldir
+0
-18
WimaCorridorEditor.qml
src/WimaView/WimaCorridorEditor.qml
+0
-176
WimaToolBar.qml
src/WimaView/WimaToolBar.qml
+0
-465
No files found.
qgroundcontrol.qrc
View file @
be40a955
...
...
@@ -261,26 +261,20 @@
<file alias="QmlTest.qml">src/QmlControls/QmlTest.qml</file>
<file alias="RadioComponent.qml">src/AutoPilotPlugins/Common/RadioComponent.qml</file>
<file alias="SerialSettings.qml">src/ui/preferences/SerialSettings.qml</file>
<file alias="CircularGeneratorEditor.qml">src/WimaView/CircularGeneratorEditor.qml</file>
<file alias="QGroundControl/Controls/CircularGeneratorMapVisual.qml">src/WimaView/CircularGeneratorMapVisual.qml</file>
<file alias="CircularSurveyItemEditor.qml">src/WimaView/MeasurementItemEditor.qml</file>
<file alias="QGroundControl/Controls/CircularSurveyMapVisual.qml">src/WimaView/MeasurementItemMapVisual.qml</file>
<file alias="Wima/CoordinateIndicator.qml">src/WimaView/CoordinateIndicator.qml</file>
<file alias="Wima/CoordinateIndicatorDrag.qml">src/WimaView/CoordinateIndicatorDrag.qml</file>
<file alias="Wima/DragCoordinate.qml">src/WimaView/DragCoordinate.qml</file>
<file alias="LinearGeneratorEditor.qml">src/WimaView/LinearGeneratorEditor.qml</file>
<file alias="Wima/ProgressIndicator.qml">src/WimaView/ProgressIndicator.qml</file>
<file alias="Wima/qmldir">src/WimaView/Wima.qmldir</file>
<file alias="Wima/WimaAreaMapVisual.qml">src/WimaView/WimaAreaMapVisual.qml</file>
<file alias="Wima/WimaCorridorEditor.qml">src/WimaView/WimaCorridorEditor.qml</file>
<file alias="Wima/WimaItemEditor.qml">src/WimaView/WimaItemEditor.qml</file>
<file alias="Wima/WimaMapPolygonVisuals.qml">src/WimaView/WimaMapPolygonVisuals.qml</file>
<file alias="Wima/WimaMapVisual.qml">src/WimaView/WimaMapVisual.qml</file>
<file alias="Wima/WimaMeasurementAreaEditor.qml">src/WimaView/MeasurementAreaEditor.qml</file>
<file alias="Wima/WimaMeasurementAreaMapVisual.qml">src/WimaView/MeasurementAreaMapVisual.qml</file>
<file alias="Wima/WimaServiceAreaEditor.qml">src/WimaView/SafeAreaEditor.qml</file>
<file alias="Wima/WimaServiceAreaMapVisual.qml">src/WimaView/SafeAreaMapVisual.qml</file>
<file alias="Wima/WimaToolBar.qml">src/WimaView/WimaToolBar.qml</file>
<file alias="CircularGeneratorEditor.qml">src/MeasurementComplexItem/qml/CircularGeneratorEditor.qml</file>
<file alias="QGroundControl/Controls/CircularGeneratorMapVisual.qml">src/MeasurementComplexItem/qml/CircularGeneratorMapVisual.qml</file>
<file alias="MeasurementItemEditor.qml">src/MeasurementComplexItem/qml/MeasurementItemEditor.qml</file>
<file alias="QGroundControl/Controls/MeasurementItemMapVisual.qml">src/MeasurementComplexItem/qml/MeasurementItemMapVisual.qml</file>
<file alias="CoordinateIndicator.qml">src/MeasurementComplexItem/qml/CoordinateIndicator.qml</file>
<file alias="CoordinateIndicatorDrag.qml">src/MeasurementComplexItem/qml/CoordinateIndicatorDrag.qml</file>
<file alias="DragCoordinate.qml">src/MeasurementComplexItem/qml/DragCoordinate.qml</file>
<file alias="LinearGeneratorEditor.qml">src/MeasurementComplexItem/qml/LinearGeneratorEditor.qml</file>
<file alias="ProgressIndicator.qml">src/MeasurementComplexItem/qml/ProgressIndicator.qml</file>
<file alias="QGroundControl/Controls/GeoAreaVisualLoader.qml">src/MeasurementComplexItem/qml/GeoAreaVisualLoader.qml</file>
<file alias="MeasurementAreaEditor.qml">src/MeasurementComplexItem/qml/MeasurementAreaEditor.qml</file>
<file alias="MeasurementAreaMapVisual.qml">src/MeasurementComplexItem/qml/MeasurementAreaMapVisual.qml</file>
<file alias="SafeAreaEditor.qml">src/MeasurementComplexItem/qml/SafeAreaEditor.qml</file>
<file alias="SafeAreaMapVisual.qml">src/MeasurementComplexItem/qml/SafeAreaMapVisual.qml</file>
<file alias="SetupParameterEditor.qml">src/VehicleSetup/SetupParameterEditor.qml</file>
<file alias="SetupView.qml">src/VehicleSetup/SetupView.qml</file>
<file alias="SimpleItemEditor.qml">src/PlanView/SimpleItemEditor.qml</file>
...
...
@@ -295,6 +289,7 @@
<file alias="VibrationPage.qml">src/AnalyzeView/VibrationPage.qml</file>
<file alias="VirtualJoystick.qml">src/FlightDisplay/VirtualJoystick.qml</file>
<file alias="VTOLLandingPatternEditor.qml">src/PlanView/VTOLLandingPatternEditor.qml</file>
<file>src/MeasurementComplexItem/qml/GeoAreaEditorLoader.qml</file>
</qresource>
<qresource prefix="/FirstRunPromptDialogs">
<file alias="UnitsFirstRunPrompt.qml">src/FirstRunPromptDialogs/UnitsFirstRunPrompt.qml</file>
...
...
@@ -352,9 +347,10 @@
<file alias="Video.SettingsGroup.json">src/Settings/Video.SettingsGroup.json</file>
<file alias="VTOLLandingPattern.FactMetaData.json">src/MissionManager/VTOLLandingPattern.FactMetaData.json</file>
<file alias="Wima.SettingsGroup.json">src/Settings/Wima.SettingsGroup.json</file>
<file>src/MeasurementComplexItem/json/CircularGenerator.SettingsGroup.json</file>
<file>src/MeasurementComplexItem/json/LinearGenerator.SettingsGroup.json</file>
<file>src/MeasurementComplexItem/json/MeasurementComplexItem.SettingsGroup.json</file>
<file alias="CircularGenerator.SettingsGroup.json">src/MeasurementComplexItem/json/CircularGenerator.SettingsGroup.json</file>
<file alias="LinearGenerator.SettingsGroup.json">src/MeasurementComplexItem/json/LinearGenerator.SettingsGroup.json</file>
<file alias="MeasurementComplexItem.SettingsGroup.json">src/MeasurementComplexItem/json/MeasurementComplexItem.SettingsGroup.json</file>
<file alias="MeasurementArea.SettingsGroup.json">src/MeasurementComplexItem/geometry/json/MeasurementArea.SettingsGroup.json</file>
</qresource>
<qresource prefix="/MockLink">
<file alias="APMArduSubMockLink.params">src/comm/APMArduSubMockLink.params</file>
...
...
src/MeasurementComplexItem/AreaData.cc
View file @
be40a955
...
...
@@ -30,29 +30,11 @@ AreaData &AreaData::operator=(const AreaData &other) {
}
bool
AreaData
::
insert
(
GeoArea
*
areaData
)
{
{
SafeArea
*
area
=
qobject_cast
<
SafeArea
*>
(
areaData
);
if
(
area
!=
nullptr
)
{
if
(
Q_LIKELY
(
!
this
->
_areaList
.
contains
(
area
)))
{
_areaList
.
append
(
area
);
emit
areaList
();
return
true
;
}
else
{
return
false
;
}
}
}
{
MeasurementArea
*
area
=
qobject_cast
<
MeasurementArea
*>
(
areaData
);
if
(
area
!=
nullptr
)
{
if
(
Q_LIKELY
(
!
this
->
_areaList
.
contains
(
area
)))
{
_areaList
.
append
(
area
);
emit
areaList
();
return
true
;
}
else
{
return
false
;
}
if
(
areaData
!=
nullptr
)
{
if
(
Q_LIKELY
(
!
this
->
_areaList
.
contains
(
areaData
)))
{
_areaList
.
append
(
areaData
);
emit
areaList
();
return
true
;
}
}
...
...
@@ -111,7 +93,9 @@ bool AreaData::initialize(const QGeoCoordinate &bottomLeft,
auto
*
safeArea
=
getGeoArea
<
SafeArea
*>
(
_areaList
);
if
(
safeArea
==
nullptr
)
{
if
(
!
insert
(
new
SafeArea
()))
{
safeArea
=
new
SafeArea
(
this
);
if
(
!
insert
(
safeArea
))
{
safeArea
->
deleteLater
();
qCCritical
(
AreaDataLog
)
<<
"initialize(): safeArea == nullptr, but insert() failed."
;
return
false
;
...
...
@@ -119,7 +103,9 @@ bool AreaData::initialize(const QGeoCoordinate &bottomLeft,
}
if
(
measurementArea
==
nullptr
)
{
if
(
!
insert
(
new
MeasurementArea
()))
{
measurementArea
=
new
MeasurementArea
(
this
);
if
(
!
insert
(
measurementArea
))
{
measurementArea
->
deleteLater
();
qCCritical
(
AreaDataLog
)
<<
"initialize(): measurementArea == nullptr, "
"but insert() failed."
;
return
false
;
...
...
src/MeasurementComplexItem/MeasurementComplexItem.cc
View file @
be40a955
...
...
@@ -41,14 +41,15 @@ MeasurementComplexItem::MeasurementComplexItem(
const
QString
&
kmlOrShpFile
,
QObject
*
parent
)
:
ComplexMissionItem
(
masterController
,
flyView
,
parent
),
_masterController
(
masterController
),
_sequenceNumber
(
0
),
_followTerrain
(
false
),
_altitude
(
settingsGroup
,
_metaDataMap
[
altitudeName
]),
_state
(
STATE
::
IDLE
),
_followTerrain
(
false
),
_state
(
STATE
::
IDLE
),
_metaDataMap
(
FactMetaData
::
createMapFromJsonFile
(
QStringLiteral
(
":/json/MeasurementComplexItem.SettingsGroup.json"
),
this
)),
_altitude
(
settingsGroup
,
_metaDataMap
[
altitudeName
]),
_variant
(
settingsGroup
,
_metaDataMap
[
variantName
]),
_areaData
(
new
AreaData
(
this
)),
_editorData
(
new
AreaData
(
this
)),
_currentData
(
_areaData
),
_pWorker
(
new
RoutingThread
(
this
))
{
_pAreaData
(
new
AreaData
(
this
)),
_pEditorData
(
new
AreaData
(
this
)),
_pCurrentData
(
_pAreaData
),
_pGenerator
(
nullptr
),
_pWorker
(
new
RoutingThread
(
this
))
{
Q_UNUSED
(
kmlOrShpFile
)
_editorQml
=
"qrc:/qml/MeasurementItemEditor.qml"
;
...
...
@@ -61,7 +62,7 @@ MeasurementComplexItem::MeasurementComplexItem(
connect
(
this
->
_pWorker
,
&
RoutingThread
::
result
,
this
,
&
MeasurementComplexItem
::
_storeRoutingData
);
// Connect coordinate and exitCoordinate
// Connect coordinate and exitCoordinate
.
connect
(
this
,
&
MeasurementComplexItem
::
routeChanged
,
[
this
]
{
emit
this
->
coordinateChanged
(
this
->
coordinate
());
});
connect
(
this
,
&
MeasurementComplexItem
::
routeChanged
,
...
...
@@ -71,10 +72,14 @@ MeasurementComplexItem::MeasurementComplexItem(
this
->
exitCoordinateSameAsEntry
());
});
// Connect complexDistance.
connect
(
this
,
&
MeasurementComplexItem
::
routeChanged
,
[
this
]
{
emit
this
->
complexDistanceChanged
();
});
// Register Generators.
auto
lg
=
new
routing
::
LinearGenerator
(
this
->
_
a
reaData
,
this
);
auto
lg
=
new
routing
::
LinearGenerator
(
this
->
_
pA
reaData
,
this
);
registerGenerator
(
lg
->
name
(),
lg
);
auto
cg
=
new
routing
::
CircularGenerator
(
this
->
_
a
reaData
,
this
);
auto
cg
=
new
routing
::
CircularGenerator
(
this
->
_
pA
reaData
,
this
);
registerGenerator
(
cg
->
name
(),
cg
);
qCritical
()
<<
"ToDo: _altitude connections missing."
;
...
...
@@ -86,10 +91,10 @@ MeasurementComplexItem::~MeasurementComplexItem() {}
void
MeasurementComplexItem
::
reverseRoute
()
{
_reverseRoute
();
}
const
AreaData
*
MeasurementComplexItem
::
areaData
()
const
{
return
this
->
_
c
urrentData
;
return
this
->
_
pC
urrentData
;
}
AreaData
*
MeasurementComplexItem
::
areaData
()
{
return
this
->
_
c
urrentData
;
}
AreaData
*
MeasurementComplexItem
::
areaData
()
{
return
this
->
_
pC
urrentData
;
}
QVariantList
MeasurementComplexItem
::
route
()
{
return
_route
;
}
...
...
@@ -155,6 +160,24 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
return
true
;
}
double
MeasurementComplexItem
::
greatestDistanceTo
(
const
QGeoCoordinate
&
other
)
const
{
double
d
=
-
1
*
std
::
numeric_limits
<
double
>::
infinity
();
if
(
other
.
isValid
())
{
if
(
this
->
_route
.
size
()
>
0
)
{
std
::
for_each
(
this
->
_route
.
cbegin
(),
this
->
_route
.
cend
(),
[
&
d
,
&
other
](
const
QVariant
&
variant
)
{
auto
vertex
=
variant
.
value
<
QGeoCoordinate
>
();
d
=
std
::
max
(
d
,
vertex
.
distanceTo
(
other
));
});
}
}
else
{
qCDebug
(
MeasurementComplexItemLog
)
<<
"greatestDistanceTo(): invalid QGeoCoordinate: "
<<
other
;
}
return
d
;
}
bool
MeasurementComplexItem
::
dirty
()
const
{
return
_dirty
;
}
bool
MeasurementComplexItem
::
isSimpleItem
()
const
{
return
false
;
}
...
...
@@ -202,6 +225,18 @@ double MeasurementComplexItem::maxAMSLAltitude() const {
return
amslEntryAlt
();
}
QString
MeasurementComplexItem
::
commandDescription
()
const
{
return
QStringLiteral
(
"Measurement"
);
}
QString
MeasurementComplexItem
::
commandName
()
const
{
return
QStringLiteral
(
"Measurement"
);
}
QString
MeasurementComplexItem
::
abbreviation
()
const
{
return
QStringLiteral
(
"M"
);
}
bool
MeasurementComplexItem
::
specifiesCoordinate
()
const
{
return
_route
.
count
()
>
0
;
}
...
...
@@ -283,8 +318,12 @@ bool MeasurementComplexItem::_setGenerator(PtrGenerator newG) {
}
this
->
_pGenerator
=
newG
;
connect
(
this
->
_pGenerator
,
&
routing
::
GeneratorBase
::
generatorChanged
,
this
,
&
MeasurementComplexItem
::
_updateRoute
);
if
(
this
->
_pGenerator
!=
nullptr
)
{
connect
(
this
->
_pGenerator
,
&
routing
::
GeneratorBase
::
generatorChanged
,
this
,
&
MeasurementComplexItem
::
_updateRoute
);
}
emit
generatorChanged
();
if
(
!
editing
())
{
...
...
@@ -321,14 +360,18 @@ bool MeasurementComplexItem::_calculating(MeasurementComplexItem::STATE state) {
return
state
==
STATE
::
ROUTING
;
}
bool
MeasurementComplexItem
::
_editing
(
MeasurementComplexItem
::
STATE
state
)
{
return
state
==
STATE
::
EDITING
;
}
bool
MeasurementComplexItem
::
_ready
(
MeasurementComplexItem
::
STATE
state
)
{
return
state
==
STATE
::
IDLE
;
}
void
MeasurementComplexItem
::
_setAreaData
(
MeasurementComplexItem
::
PtrAreaData
data
)
{
if
(
_
c
urrentData
!=
data
)
{
_
c
urrentData
=
data
;
if
(
_
pC
urrentData
!=
data
)
{
_
pC
urrentData
=
data
;
emit
areaDataChanged
();
}
}
...
...
@@ -340,10 +383,10 @@ bool MeasurementComplexItem::_updateRoute() {
this
->
_variantNames
.
clear
();
emit
variantNamesChanged
();
if
(
this
->
_
a
reaData
->
isValid
())
{
if
(
this
->
_
pA
reaData
->
isValid
())
{
// Prepare data.
auto
origin
=
this
->
_
a
reaData
->
origin
();
auto
origin
=
this
->
_
pA
reaData
->
origin
();
origin
.
setAltitude
(
0
);
if
(
!
origin
.
isValid
())
{
qCDebug
(
MeasurementComplexItemLog
)
...
...
@@ -353,7 +396,7 @@ bool MeasurementComplexItem::_updateRoute() {
// Convert safe area.
auto
serviceArea
=
getGeoArea
<
const
SafeArea
*>
(
*
this
->
_
a
reaData
->
areaList
());
getGeoArea
<
const
SafeArea
*>
(
*
this
->
_
pA
reaData
->
areaList
());
auto
geoSafeArea
=
serviceArea
->
coordinateList
();
if
(
!
(
geoSafeArea
.
size
()
>=
3
))
{
qCDebug
(
MeasurementComplexItemLog
)
...
...
@@ -378,7 +421,7 @@ bool MeasurementComplexItem::_updateRoute() {
snake
::
areaToEnu
(
origin
,
geoSafeArea
,
safeAreaENU
);
// Create generator.
if
(
this
->
_pGenerator
)
{
if
(
this
->
_pGenerator
!=
nullptr
)
{
routing
::
GeneratorBase
::
Generator
g
;
// Transect generator.
if
(
this
->
_pGenerator
->
get
(
g
))
{
// Start/Restart routing worker.
...
...
@@ -491,6 +534,24 @@ void MeasurementComplexItem::setSequenceNumber(int sequenceNumber) {
QString
MeasurementComplexItem
::
patternName
()
const
{
return
name
;
}
double
MeasurementComplexItem
::
complexDistance
()
const
{
double
d
=
0
;
if
(
this
->
_route
.
size
()
>
1
)
{
auto
vertex
=
_route
.
first
().
value
<
QGeoCoordinate
>
();
std
::
for_each
(
this
->
_route
.
cbegin
()
+
1
,
this
->
_route
.
cend
(),
[
&
vertex
,
&
d
](
const
QVariant
&
variant
)
{
auto
otherVertex
=
variant
.
value
<
QGeoCoordinate
>
();
d
+=
vertex
.
distanceTo
(
otherVertex
);
vertex
=
otherVertex
;
});
}
return
d
;
}
int
MeasurementComplexItem
::
lastSequenceNumber
()
const
{
return
_sequenceNumber
+
std
::
max
(
0
,
this
->
_route
.
size
()
-
1
);
}
bool
MeasurementComplexItem
::
registerGenerator
(
const
QString
&
name
,
routing
::
GeneratorBase
*
g
)
{
if
(
name
.
isEmpty
())
{
...
...
@@ -602,20 +663,20 @@ int MeasurementComplexItem::generatorIndex() {
void
MeasurementComplexItem
::
editingStart
()
{
if
(
!
_editing
(
this
->
_state
))
{
*
_
editorData
=
*
_a
reaData
;
_setAreaData
(
_
e
ditorData
);
*
_
pEditorData
=
*
_pA
reaData
;
_setAreaData
(
_
pE
ditorData
);
_setState
(
STATE
::
EDITING
);
}
}
void
MeasurementComplexItem
::
editingStop
()
{
if
(
_editing
(
this
->
_state
))
{
if
(
_
e
ditorData
->
isValid
())
{
*
_
areaData
=
*
_e
ditorData
;
if
(
_
pE
ditorData
->
isValid
())
{
*
_
pAreaData
=
*
_pE
ditorData
;
}
_setAreaData
(
_
a
reaData
);
_setAreaData
(
_
pA
reaData
);
_setState
(
STATE
::
IDLE
);
if
(
_
editorData
->
isValid
()
&&
*
_editorData
!=
*
_a
reaData
)
{
if
(
_
pEditorData
->
isValid
()
&&
*
_pEditorData
!=
*
_pA
reaData
)
{
_updateRoute
();
}
}
...
...
@@ -625,7 +686,7 @@ void MeasurementComplexItem::_storeRoutingData(
MeasurementComplexItem
::
PtrRoutingData
pRoute
)
{
if
(
this
->
_state
==
STATE
::
ROUTING
)
{
// Store solutions.
auto
ori
=
this
->
_
a
reaData
->
origin
();
auto
ori
=
this
->
_
pA
reaData
->
origin
();
ori
.
setAltitude
(
0
);
const
auto
&
transectsENU
=
pRoute
->
transects
;
QVector
<
Variant
>
variantVector
;
...
...
@@ -742,4 +803,6 @@ bool MeasurementComplexItem::calculating() const {
bool
MeasurementComplexItem
::
editing
()
const
{
return
_editing
(
this
->
_state
);
}
bool
MeasurementComplexItem
::
ready
()
const
{
return
_ready
(
this
->
_state
);
}
bool
MeasurementComplexItem
::
followTerrain
()
const
{
return
_followTerrain
;
}
src/MeasurementComplexItem/MeasurementComplexItem.h
View file @
be40a955
...
...
@@ -45,8 +45,6 @@ public:
Q_PROPERTY
(
routing
::
GeneratorBase
*
generator
READ
generator
NOTIFY
generatorChanged
)
Q_PROPERTY
(
int
generatorIndex
READ
generatorIndex
NOTIFY
generatorChanged
)
Q_PROPERTY
(
bool
editing
READ
editing
NOTIFY
editingChanged
)
Q_PROPERTY
(
bool
editing
READ
editing
NOTIFY
editingChanged
)
Q_PROPERTY
(
AreaData
*
areaData
READ
areaData
NOTIFY
areaDataChanged
)
Q_PROPERTY
(
QVariantList
route
READ
route
NOTIFY
routeChanged
)
...
...
@@ -91,6 +89,9 @@ public:
virtual
double
amslExitAlt
(
void
)
const
override
final
;
virtual
double
minAMSLAltitude
(
void
)
const
override
final
;
virtual
double
maxAMSLAltitude
(
void
)
const
override
final
;
virtual
QString
commandDescription
(
void
)
const
override
final
;
virtual
QString
commandName
(
void
)
const
override
final
;
virtual
QString
abbreviation
(
void
)
const
override
final
;
// Generator
bool
registerGenerator
(
const
QString
&
name
,
routing
::
GeneratorBase
*
g
);
...
...
@@ -171,20 +172,20 @@ private:
PlanMasterController
*
_masterController
;
int
_sequenceNumber
;
bool
_followTerrain
;
SettingsFact
_altitude
;
// State.
STATE
_state
;
// Facts
QMap
<
QString
,
FactMetaData
*>
_metaDataMap
;
SettingsFact
_altitude
;
SettingsFact
_variant
;
QStringList
_variantNames
;
// Area data
PtrAreaData
_
a
reaData
;
PtrAreaData
_
e
ditorData
;
PtrAreaData
_
c
urrentData
;
PtrAreaData
_
pA
reaData
;
PtrAreaData
_
pE
ditorData
;
PtrAreaData
_
pC
urrentData
;
// Generators
QList
<
PtrGenerator
>
_generatorList
;
...
...
src/MeasurementComplexItem/geometry/MeasurementArea.cc
View file @
be40a955
...
...
@@ -73,7 +73,7 @@ const char *MeasurementArea::MeasurementAreaName = "Measurement Area";
MeasurementArea
::
MeasurementArea
(
QObject
*
parent
)
:
GeoArea
(
parent
),
_metaDataMap
(
FactMetaData
::
createMapFromJsonFile
(
QStringLiteral
(
":/json/
Wima
MeasurementArea.SettingsGroup.json"
),
QStringLiteral
(
":/json/MeasurementArea.SettingsGroup.json"
),
this
/* QObject parent */
)),
_tileHeight
(
SettingsFact
(
settingsGroup
,
_metaDataMap
[
tileHeightName
],
this
/* QObject parent */
)),
...
...
src/MeasurementComplexItem/geometry/json/
Wima
MeasurementArea.SettingsGroup.json
→
src/MeasurementComplexItem/geometry/json/MeasurementArea.SettingsGroup.json
View file @
be40a955
{
"version"
:
1
,
"fileType"
:
"FactMetaData"
,
"QGC.MetaData.Facts"
:
[
{
"name"
:
"TileHeight"
,
...
...
@@ -43,3 +47,4 @@
"defaultValue"
:
5
}
]
}
src/MeasurementComplexItem/geometry/json/WimaArea.SettingsGroup.json
deleted
100644 → 0
View file @
3dfdeec9
[
{
"name"
:
"BorderPolygonOffset"
,
"shortDescription"
:
"The distance between the measurement area and it's surrounding polygon"
,
"type"
:
"double"
,
"units"
:
"m"
,
"min"
:
0
,
"decimalPlaces"
:
1
,
"defaultValue"
:
5
},
{
"name"
:
"ShowBorderPolygon"
,
"shortDescription"
:
"Border polygon will be displayed if checked."
,
"type"
:
"bool"
,
"defaultValue"
:
true
}
]
src/
WimaView
/CircularGeneratorEditor.qml
→
src/
MeasurementComplexItem/qml
/CircularGeneratorEditor.qml
View file @
be40a955
...
...
@@ -7,11 +7,13 @@ import QGroundControl.FactControls 1.0
import
QGroundControl
.
ScreenTools
1.0
GridLayout
{
id
:
grid
property
var
generator
// CircularGenerator
property
var
availableWidth
property
real
_margin
:
ScreenTools
.
defaultFontPixelWidth
/
2
width
:
availableWidth
columnSpacing
:
_margin
rowSpacing
:
_margin
columns
:
2
...
...
src/
WimaView
/CircularGeneratorMapVisual.qml
→
src/
MeasurementComplexItem/qml
/CircularGeneratorMapVisual.qml
View file @
be40a955
import
QtQuick
2.0
import
Wima
1.0
import
QGroundControl
1.0
Item
{
...
...
src/
WimaView
/CoordinateIndicator.qml
→
src/
MeasurementComplexItem/qml
/CoordinateIndicator.qml
View file @
be40a955
File moved
src/
WimaView
/CoordinateIndicatorDrag.qml
→
src/
MeasurementComplexItem/qml
/CoordinateIndicatorDrag.qml
View file @
be40a955
File moved
src/
WimaView
/DragCoordinate.qml
→
src/
MeasurementComplexItem/qml
/DragCoordinate.qml
View file @
be40a955
File moved
src/
WimaView/WimaItemEdito
r.qml
→
src/
MeasurementComplexItem/qml/GeoAreaEditorLoade
r.qml
View file @
be40a955
File moved
src/
WimaView/WimaMapVisual
.qml
→
src/
MeasurementComplexItem/qml/GeoAreaVisualLoader
.qml
View file @
be40a955
...
...
@@ -15,26 +15,27 @@ import QtPositioning 5.3
import
QGroundControl
.
ScreenTools
1.0
import
QGroundControl
.
Palette
1.0
import
QGroundControl
.
Controls
1.0
import
QGroundControl
1.0
/// Wima map visual
Item
{
id
:
_root
property
var
map
///< Map control to place item in
property
var
qgcView
///< QGCView to use for popping dialogs
property
var
geoArea
///< GeoArea derived class
signal
clicked
(
int
sequenceNumber
)
property
var
_visualItem
Component.onCompleted
:
{
if
(
object
.
mapVisualQML
)
{
var
component
=
Qt
.
createComponent
(
object
.
mapVisualQML
)
if
(
geoArea
.
mapVisualQML
)
{
var
component
=
Qt
.
createComponent
(
geoArea
.
mapVisualQML
)
if
(
component
.
status
===
Component
.
Error
)
{
console
.
log
(
"
Error loading Qml:
"
,
object
.
mapVisualQML
,
component
.
errorString
())
console
.
log
(
"
Error loading Qml:
"
,
geoArea
.
mapVisualQML
,
component
.
errorString
())
}
_visualItem
=
component
.
createObject
(
map
,
{
"
map
"
:
_root
.
map
,
"
qgcView
"
:
_root
.
qgcView
})
_visualItem
=
component
.
createObject
(
map
,
{
"
map
"
:
_root
.
map
,
"
qgcView
"
:
_root
.
qgcView
,
"
geoArea
"
:
_root
.
geoArea
})
_visualItem
.
clicked
.
connect
(
_root
.
clicked
)
}
}
...
...
src/
WimaView
/LinearGeneratorEditor.qml
→
src/
MeasurementComplexItem/qml
/LinearGeneratorEditor.qml
View file @
be40a955
...
...
@@ -8,10 +8,11 @@ import QGroundControl.ScreenTools 1.0
GridLayout
{
property
var
generator
//
/< Line
arGenerator
property
var
generator
//
Circul
arGenerator
property
var
availableWidth
property
real
_margin
:
ScreenTools
.
defaultFontPixelWidth
/
2
width
:
availableWidth
columnSpacing
:
_margin
rowSpacing
:
_margin
columns
:
2
...
...
src/
WimaView
/MeasurementAreaEditor.qml
→
src/
MeasurementComplexItem/qml
/MeasurementAreaEditor.qml
View file @
be40a955
File moved
src/
WimaView
/MeasurementAreaMapVisual.qml
→
src/
MeasurementComplexItem/qml
/MeasurementAreaMapVisual.qml
View file @
be40a955
...
...
@@ -18,93 +18,29 @@ import QGroundControl.Palette 1.0
import
QGroundControl
.
Controls
1.0
import
QGroundControl
.
FlightMap
1.0
/// Wima Global Measurement Area visuals
Item
{
id
:
_root
property
var
map
///< Map control to place item in
property
var
qgcView
///< QGCView to use for popping dialogs
property
var
areaItem
///< GeoArea derived class
property
var
areaItem
:
object
property
var
_polygon
:
areaItem
property
var
opacity
:
0.5
signal
clicked
(
int
sequenceNumber
)
/// Add an initial 4 sided polygon if there is none
function
_addInitialPolygon
()
{
// 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
)
if
(
areaItem
.
showBorderPolygon
.
rawValue
===
true
)
{
if
(
areaItem
.
borderPolygon
.
count
<
3
)
{
areaItem
.
borderPolygon
.
appendVertex
(
topLeftCoord
)
areaItem
.
borderPolygon
.
appendVertex
(
topRightCoord
)
areaItem
.
borderPolygon
.
appendVertex
(
bottomRightCoord
)
areaItem
.
borderPolygon
.
appendVertex
(
bottomLeftCoord
)
}
}
else
{
if
(
_polygon
.
count
<
3
)
{
_polygon
.
appendVertex
(
topLeftCoord
)
_polygon
.
appendVertex
(
topRightCoord
)
_polygon
.
appendVertex
(
bottomRightCoord
)
_polygon
.
appendVertex
(
bottomLeftCoord
)
}
}
}
Component.onCompleted
:
{
_addInitialPolygon
()
//_addInitialPolyline()
}
Component.onDestruction
:
{
}
//
P
olygon
Wima
MapPolygonVisuals
{
qgcView
:
_root
.
qgcView
//
Area p
olygon
QGC
MapPolygonVisuals
{
id
:
mapPolygonVisuals
mapControl
:
map
mapPolygon
:
_polygon
mapPolygon
:
areaItem
interactive
:
true
borderWidth
:
1
borderColor
:
"
black
"
interiorColor
:
"
green
"
interiorOpacity
:
0.25
}
// Border Polygon
WimaMapPolygonVisuals
{
qgcView
:
_root
.
qgcView
mapControl
:
map
mapPolygon
:
areaItem
.
borderPolygon
borderWidth
:
1
borderColor
:
areaItem
.
borderPolygon
.
interactive
?
"
white
"
:
"
transparent
"
interiorColor
:
"
transparent
"
interiorOpacity
:
1
altColor
:
QGroundControl
.
globalPalette
.
surveyPolygonTerrainCollision
interiorOpacity
:
_root
.
opacity
}
// Add Snake tiles to the map
...
...
@@ -131,6 +67,7 @@ Item {
}
}
}
function
getColor
(
progress
)
{
if
(
progress
===
0
)
return
"
transparent
"
...
...
src/MeasurementComplexItem/qml/MeasurementItemEditor.qml
0 → 100644
View file @
be40a955
This diff is collapsed.
Click to expand it.
src/
WimaView
/MeasurementItemMapVisual.qml
→
src/
MeasurementComplexItem/qml
/MeasurementItemMapVisual.qml
View file @
be40a955
...
...
@@ -51,6 +51,8 @@ Item {
_addExitCoordinate
()
_addTransectsComponent
()
_addGeneratorVisuals
()
var
bbox
=
boundingBox
()
_areaData
.
initialize
(
bbox
[
0
],
bbox
[
1
])
}
Component.onDestruction
:
{
...
...
@@ -70,7 +72,7 @@ Item {
id
:
visualTransectsComponent
MapPolyline
{
property
var
transects
:
_missionItem
.
visualTransectPoints
property
var
transects
:
_missionItem
.
route
line.color
:
"
white
"
line.width
:
2
path
:
transects
.
length
>
0
?
transects
:
[]
...
...
@@ -120,13 +122,10 @@ Item {
Repeater
{
model
:
_areaData
.
areaList
delegate
:
WimaMapVisual
{
delegate
:
GeoAreaVisualLoader
{
map
:
_root
.
map
qgcView
:
_root
.
qgcView
}
onItemAdded
:
{
//console.log("Item added")
geoArea
:
_areaData
.
areaList
[
index
]
}
}
...
...
@@ -205,4 +204,32 @@ Item {
_transectsComponent
=
undefined
}
}
function
boundingBox
()
{
// 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
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
topLeftCoord
=
map
.
toCoordinate
(
Qt
.
point
(
rect
.
x
,
rect
.
y
),
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
topRightCoord
=
centerCoord
.
atDistanceAndAzimuth
(
halfWidthMeters
,
90
).
atDistanceAndAzimuth
(
halfHeightMeters
,
0
)
bottomLeftCoord
=
centerCoord
.
atDistanceAndAzimuth
(
halfWidthMeters
,
-
90
).
atDistanceAndAzimuth
(
halfHeightMeters
,
180
)
return
[
bottomLeftCoord
,
topRightCoord
]