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
1b05f323
Commit
1b05f323
authored
Dec 16, 2020
by
Valentin Platzgummer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
MeasurementItemEditor improved
parent
31d4efc3
Changes
18
Show whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
653 additions
and
319 deletions
+653
-319
qgroundcontrol.pro
qgroundcontrol.pro
+2
-3
AreaData.cc
src/MeasurementComplexItem/AreaData.cc
+37
-40
AreaData.h
src/MeasurementComplexItem/AreaData.h
+7
-12
CircularGenerator.cpp
src/MeasurementComplexItem/CircularGenerator.cpp
+1
-6
GeneratorBase.cc
src/MeasurementComplexItem/GeneratorBase.cc
+1
-0
MeasurementComplexItem.cc
src/MeasurementComplexItem/MeasurementComplexItem.cc
+172
-107
MeasurementComplexItem.h
src/MeasurementComplexItem/MeasurementComplexItem.h
+48
-10
GeoArea.cc
src/MeasurementComplexItem/geometry/GeoArea.cc
+3
-3
GeoArea.h
src/MeasurementComplexItem/geometry/GeoArea.h
+3
-2
MeasurementArea.cc
src/MeasurementComplexItem/geometry/MeasurementArea.cc
+152
-8
MeasurementArea.h
src/MeasurementComplexItem/geometry/MeasurementArea.h
+4
-1
SafeArea.cc
src/MeasurementComplexItem/geometry/SafeArea.cc
+3
-3
SafeArea.h
src/MeasurementComplexItem/geometry/SafeArea.h
+1
-1
MeasurementComplexItem.SettingsGroup.json
...omplexItem/json/MeasurementComplexItem.SettingsGroup.json
+3
-3
AreaDataEditor.qml
src/MeasurementComplexItem/qml/AreaDataEditor.qml
+112
-34
CircularGeneratorEditor.qml
src/MeasurementComplexItem/qml/CircularGeneratorEditor.qml
+1
-1
MeasurementItemEditor.qml
src/MeasurementComplexItem/qml/MeasurementItemEditor.qml
+101
-85
ParameterEditor.qml
src/MeasurementComplexItem/qml/ParameterEditor.qml
+2
-0
No files found.
qgroundcontrol.pro
View file @
1b05f323
...
@@ -34,14 +34,13 @@ DebugBuild {
...
@@ -34,14 +34,13 @@ DebugBuild {
DEFINES
+=
DEBUG
DEFINES
+=
DEBUG
#
DEFINES
+=
SNAKE_SHOW_TIME
#
DEFINES
+=
SNAKE_SHOW_TIME
#
DEFINES
+=
SNAKE_DEBUG
#
DEFINES
+=
SNAKE_DEBUG
DEFINES
+=
SNAKE_SHOW_TIME
#
DEFINES
+=
SNAKE_SHOW_TIME
DEFINES
+=
DEBUG_CIRCULAR_SURVEY
DEFINES
+=
ROS_BRIDGE_DEBUG
DEFINES
+=
ROS_BRIDGE_DEBUG
}
}
else
{
else
{
DESTDIR
=
$$
{
OUT_PWD
}
/
release
DESTDIR
=
$$
{
OUT_PWD
}
/
release
#
DEFINES
+=
ROS_BRIDGE_DEBUG
#
DEFINES
+=
ROS_BRIDGE_DEBUG
DEFINES
+=
SNAKE_SHOW_TIME
#
DEFINES
+=
SNAKE_SHOW_TIME
#
DEFINES
+=
SNAKE_DEBUG
#
DEFINES
+=
SNAKE_DEBUG
DEFINES
+=
NDEBUG
DEFINES
+=
NDEBUG
}
}
...
...
src/MeasurementComplexItem/AreaData.cc
View file @
1b05f323
...
@@ -18,8 +18,7 @@ AreaData::AreaData(QObject *parent) : QObject(parent) {}
...
@@ -18,8 +18,7 @@ AreaData::AreaData(QObject *parent) : QObject(parent) {}
AreaData
::~
AreaData
()
{}
AreaData
::~
AreaData
()
{}
AreaData
::
AreaData
(
const
AreaData
&
other
,
QObject
*
parent
)
AreaData
::
AreaData
(
const
AreaData
&
other
,
QObject
*
parent
)
:
QObject
(
parent
)
{
:
QObject
(
parent
),
_showErrorMessages
(
true
)
{
*
this
=
other
;
*
this
=
other
;
}
}
...
@@ -93,21 +92,21 @@ const QmlObjectListModel *AreaData::areaList() const { return &_areaList; }
...
@@ -93,21 +92,21 @@ const QmlObjectListModel *AreaData::areaList() const { return &_areaList; }
QGeoCoordinate
AreaData
::
origin
()
const
{
return
_origin
;
}
QGeoCoordinate
AreaData
::
origin
()
const
{
return
_origin
;
}
bool
AreaData
::
isCorrect
()
{
bool
AreaData
::
isCorrect
(
bool
showError
)
{
if
(
!
initialized
())
{
if
(
!
initialized
())
{
qCWarning
(
AreaDataLog
)
<<
"isCorrect(): not initialized"
;
qCWarning
(
AreaDataLog
)
<<
"isCorrect(): not initialized"
;
return
false
;
return
false
;
}
}
// Check if areas are correct
// Check if areas are correct
if
(
!
_areasCorrect
())
{
if
(
!
_areasCorrect
(
showError
))
{
return
false
;
return
false
;
}
}
// Check if areas where added.
// Check if areas where added.
MeasurementArea
*
measurementArea
=
nullptr
;
MeasurementArea
*
measurementArea
=
nullptr
;
SafeArea
*
safeArea
=
nullptr
;
SafeArea
*
safeArea
=
nullptr
;
if
(
!
_getAreas
(
&
measurementArea
,
&
safeArea
))
{
if
(
!
_getAreas
(
&
measurementArea
,
&
safeArea
,
showError
))
{
return
false
;
return
false
;
}
}
...
@@ -128,7 +127,8 @@ bool AreaData::isCorrect() {
...
@@ -128,7 +127,8 @@ bool AreaData::isCorrect() {
// qDebug() << ss.str().c_str();
// qDebug() << ss.str().c_str();
if
(
!
bg
::
covered_by
(
measurementAreaENU
,
safeAreaENU
))
{
if
(
!
bg
::
covered_by
(
measurementAreaENU
,
safeAreaENU
))
{
_processError
(
tr
(
"Measurement Area not inside Safe Area. Please adjust "
_processError
(
tr
(
"Measurement Area not inside Safe Area. Please adjust "
"the Measurement Area.
\n
"
));
"the Measurement Area.
\n
"
),
showError
);
return
false
;
return
false
;
}
}
...
@@ -209,11 +209,11 @@ bool AreaData::initialized() {
...
@@ -209,11 +209,11 @@ bool AreaData::initialized() {
measurementArea
->
count
()
>=
3
&&
safeArea
->
count
()
>=
3
;
measurementArea
->
count
()
>=
3
&&
safeArea
->
count
()
>=
3
;
}
}
void
AreaData
::
intersection
()
{
void
AreaData
::
intersection
(
bool
showError
)
{
if
(
initialized
()
&&
_areasCorrect
())
{
if
(
initialized
()
&&
_areasCorrect
(
showError
))
{
MeasurementArea
*
measurementArea
=
nullptr
;
MeasurementArea
*
measurementArea
=
nullptr
;
SafeArea
*
safeArea
=
nullptr
;
SafeArea
*
safeArea
=
nullptr
;
if
(
_getAreas
(
&
measurementArea
,
&
safeArea
))
{
if
(
_getAreas
(
&
measurementArea
,
&
safeArea
,
showError
))
{
// convert to ENU
// convert to ENU
const
auto
origin
=
this
->
origin
();
const
auto
origin
=
this
->
origin
();
...
@@ -230,7 +230,8 @@ void AreaData::intersection() {
...
@@ -230,7 +230,8 @@ void AreaData::intersection() {
if
(
outputENU
.
size
()
<
1
||
outputENU
[
0
].
outer
().
size
()
<
4
)
{
if
(
outputENU
.
size
()
<
1
||
outputENU
[
0
].
outer
().
size
()
<
4
)
{
_processError
(
_processError
(
"Intersection did't deliver any result. Measurement Area and "
"Intersection did't deliver any result. Measurement Area and "
"Safe Area must touch each other."
);
"Safe Area must touch each other."
,
showError
);
return
;
return
;
}
}
...
@@ -238,7 +239,8 @@ void AreaData::intersection() {
...
@@ -238,7 +239,8 @@ void AreaData::intersection() {
_processError
(
_processError
(
"Hint: Only simple polygons can be displayed. If Intersection"
"Hint: Only simple polygons can be displayed. If Intersection"
"produces polygons with holes or multi polygons, only "
"produces polygons with holes or multi polygons, only "
"partial information can be displayed."
);
"partial information can be displayed."
,
showError
);
}
}
// Shrink the result if safeAreaENU doesn't cover it.
// Shrink the result if safeAreaENU doesn't cover it.
...
@@ -247,9 +249,10 @@ void AreaData::intersection() {
...
@@ -247,9 +249,10 @@ void AreaData::intersection() {
while
(
!
bg
::
covered_by
(
large
,
safeAreaENU
))
{
while
(
!
bg
::
covered_by
(
large
,
safeAreaENU
))
{
snake
::
offsetPolygon
(
large
,
small
,
-
0.1
);
snake
::
offsetPolygon
(
large
,
small
,
-
0.1
);
large
=
std
::
move
(
small
);
large
=
std
::
move
(
small
);
qDebug
()
<<
"intersection(): shrink"
;
}
}
// Check if result is different from input.
if
(
!
bg
::
equals
(
large
,
measurementAreaENU
))
{
// Convert.
// Convert.
measurementArea
->
clear
();
measurementArea
->
clear
();
for
(
auto
it
=
large
.
outer
().
begin
();
it
!=
large
.
outer
().
end
()
-
1
;
for
(
auto
it
=
large
.
outer
().
begin
();
it
!=
large
.
outer
().
end
()
-
1
;
...
@@ -260,6 +263,7 @@ void AreaData::intersection() {
...
@@ -260,6 +263,7 @@ void AreaData::intersection() {
}
}
}
}
}
}
}
}
}
MeasurementArea
*
AreaData
::
measurementArea
()
{
MeasurementArea
*
AreaData
::
measurementArea
()
{
...
@@ -302,7 +306,7 @@ bool AreaData::load(const QJsonObject &obj, QString &errorString) {
...
@@ -302,7 +306,7 @@ bool AreaData::load(const QJsonObject &obj, QString &errorString) {
// load MeasurementArea
// load MeasurementArea
if
(
jsonArea
[
GeoArea
::
areaTypeKey
].
toString
()
==
if
(
jsonArea
[
GeoArea
::
areaTypeKey
].
toString
()
==
MeasurementArea
::
name
)
{
MeasurementArea
::
name
String
)
{
auto
area
=
getGeoArea
<
MeasurementArea
*>
(
_areaList
);
auto
area
=
getGeoArea
<
MeasurementArea
*>
(
_areaList
);
...
@@ -325,7 +329,8 @@ bool AreaData::load(const QJsonObject &obj, QString &errorString) {
...
@@ -325,7 +329,8 @@ bool AreaData::load(const QJsonObject &obj, QString &errorString) {
}
}
}
}
// load SafeArea
// load SafeArea
else
if
(
jsonArea
[
GeoArea
::
areaTypeKey
].
toString
()
==
SafeArea
::
name
)
{
else
if
(
jsonArea
[
GeoArea
::
areaTypeKey
].
toString
()
==
SafeArea
::
nameString
)
{
auto
area
=
getGeoArea
<
SafeArea
*>
(
_areaList
);
auto
area
=
getGeoArea
<
SafeArea
*>
(
_areaList
);
if
(
area
==
nullptr
)
{
if
(
area
==
nullptr
)
{
...
@@ -394,7 +399,6 @@ bool AreaData::save(QJsonObject &obj) {
...
@@ -394,7 +399,6 @@ bool AreaData::save(QJsonObject &obj) {
}
else
{
}
else
{
qDebug
(
AreaDataLog
)
<<
"save(): not able to save area: "
qDebug
(
AreaDataLog
)
<<
"save(): not able to save area: "
<<
area
->
objectName
();
<<
area
->
objectName
();
_processError
(
tr
(
"Not able to save area: "
)
+
area
->
objectName
());
return
false
;
return
false
;
}
}
}
}
...
@@ -411,21 +415,21 @@ void AreaData::_setOrigin(const QGeoCoordinate &origin) {
...
@@ -411,21 +415,21 @@ void AreaData::_setOrigin(const QGeoCoordinate &origin) {
}
}
}
}
void
AreaData
::
_processError
(
const
QString
&
str
)
{
void
AreaData
::
_processError
(
const
QString
&
str
,
bool
showError
)
{
this
->
_errorString
=
str
;
this
->
_errorString
=
str
;
emit
error
();
emit
error
();
if
(
_showErrorMessages
)
{
if
(
showError
)
{
qgcApp
()
->
informationMessageBoxOnMainThread
(
tr
(
"Area Editor"
),
qgcApp
()
->
informationMessageBoxOnMainThread
(
tr
(
"Area Editor"
),
this
->
errorString
());
this
->
errorString
());
}
}
}
}
bool
AreaData
::
_areasCorrect
()
{
bool
AreaData
::
_areasCorrect
(
bool
showError
)
{
// Check if areas are correct.
// Check if areas are correct.
for
(
int
i
=
0
;
i
<
_areaList
.
count
();
++
i
)
{
for
(
int
i
=
0
;
i
<
_areaList
.
count
();
++
i
)
{
auto
*
area
=
_areaList
.
value
<
GeoArea
*>
(
0
);
auto
*
area
=
_areaList
.
value
<
GeoArea
*>
(
i
);
if
(
!
area
->
isCorrect
())
{
if
(
!
area
->
isCorrect
())
{
_processError
(
area
->
errorString
());
_processError
(
area
->
errorString
()
,
showError
);
return
false
;
return
false
;
}
}
}
}
...
@@ -433,30 +437,25 @@ bool AreaData::_areasCorrect() {
...
@@ -433,30 +437,25 @@ bool AreaData::_areasCorrect() {
return
true
;
return
true
;
}
}
bool
AreaData
::
_getAreas
(
MeasurementArea
**
measurementArea
,
bool
AreaData
::
_getAreas
(
MeasurementArea
**
measurementArea
,
SafeArea
**
safeArea
,
SafeArea
**
safeArea
)
{
bool
showError
)
{
*
measurementArea
=
getGeoArea
<
MeasurementArea
*>
(
_areaList
);
*
measurementArea
=
getGeoArea
<
MeasurementArea
*>
(
_areaList
);
if
(
*
measurementArea
==
nullptr
)
{
if
(
*
measurementArea
==
nullptr
)
{
_processError
(
_processError
(
tr
(
"Measurement Area missing. Please define a measurement area."
));
tr
(
"Measurement Area missing. Please define a measurement area."
),
showError
);
return
false
;
return
false
;
}
}
*
safeArea
=
getGeoArea
<
SafeArea
*>
(
_areaList
);
*
safeArea
=
getGeoArea
<
SafeArea
*>
(
_areaList
);
if
(
*
safeArea
==
nullptr
)
{
if
(
*
safeArea
==
nullptr
)
{
_processError
(
tr
(
"Safe Area missing. Please define a safe area."
));
_processError
(
tr
(
"Safe Area missing. Please define a safe area."
),
showError
);
return
false
;
return
false
;
}
}
return
true
;
return
true
;
}
}
void
AreaData
::
setShowErrorMessages
(
bool
showErrorMessages
)
{
if
(
showErrorMessages
!=
_showErrorMessages
)
{
_showErrorMessages
=
showErrorMessages
;
emit
showErrorMessagesChanged
();
}
}
void
AreaData
::
_updateOrigin
()
{
void
AreaData
::
_updateOrigin
()
{
auto
*
measurementArea
=
getGeoArea
<
MeasurementArea
*>
(
_areaList
);
auto
*
measurementArea
=
getGeoArea
<
MeasurementArea
*>
(
_areaList
);
if
(
measurementArea
!=
nullptr
)
{
if
(
measurementArea
!=
nullptr
)
{
...
@@ -464,6 +463,4 @@ void AreaData::_updateOrigin() {
...
@@ -464,6 +463,4 @@ void AreaData::_updateOrigin() {
}
}
}
}
bool
AreaData
::
showErrorMessages
()
const
{
return
_showErrorMessages
;
}
QString
AreaData
::
errorString
()
const
{
return
_errorString
;
}
QString
AreaData
::
errorString
()
const
{
return
_errorString
;
}
src/MeasurementComplexItem/AreaData.h
View file @
1b05f323
...
@@ -20,8 +20,7 @@ public:
...
@@ -20,8 +20,7 @@ public:
AreaData
&
operator
=
(
const
AreaData
&
other
);
AreaData
&
operator
=
(
const
AreaData
&
other
);
Q_PROPERTY
(
QmlObjectListModel
*
areaList
READ
areaList
NOTIFY
areaListChanged
)
Q_PROPERTY
(
QmlObjectListModel
*
areaList
READ
areaList
NOTIFY
areaListChanged
)
Q_PROPERTY
(
bool
showErrorMessages
READ
showErrorMessages
WRITE
Q_PROPERTY
(
QString
errorString
READ
errorString
NOTIFY
error
)
setShowErrorMessages
NOTIFY
showErrorMessagesChanged
)
// Member Methodes
// Member Methodes
//!
//!
...
@@ -51,7 +50,7 @@ public:
...
@@ -51,7 +50,7 @@ public:
//! \note Origin might change if the list of areas changes.
//! \note Origin might change if the list of areas changes.
QGeoCoordinate
origin
()
const
;
QGeoCoordinate
origin
()
const
;
Q_INVOKABLE
bool
isCorrect
();
Q_INVOKABLE
bool
isCorrect
(
bool
showError
=
true
);
//!
//!
//! \brief initialize Initializes the areas in a valid way, such that they
//! \brief initialize Initializes the areas in a valid way, such that they
//! area inside the bounding box. \param bottomLeft bottom left corner of the
//! area inside the bounding box. \param bottomLeft bottom left corner of the
...
@@ -69,7 +68,7 @@ public:
...
@@ -69,7 +68,7 @@ public:
//! either.
//! either.
//!
//!
Q_INVOKABLE
bool
initialized
();
Q_INVOKABLE
bool
initialized
();
Q_INVOKABLE
void
intersection
();
Q_INVOKABLE
void
intersection
(
bool
showError
=
true
);
Q_INVOKABLE
MeasurementArea
*
measurementArea
();
Q_INVOKABLE
MeasurementArea
*
measurementArea
();
Q_INVOKABLE
SafeArea
*
safeArea
();
Q_INVOKABLE
SafeArea
*
safeArea
();
...
@@ -82,25 +81,21 @@ public:
...
@@ -82,25 +81,21 @@ public:
QString
errorString
()
const
;
// Contains a message about the last error.
QString
errorString
()
const
;
// Contains a message about the last error.
bool
showErrorMessages
()
const
;
void
setShowErrorMessages
(
bool
showErrorMessages
);
signals:
signals:
void
areaListChanged
();
void
areaListChanged
();
void
originChanged
();
void
originChanged
();
void
error
();
// Emitted if errorString() contains a new message.
void
error
();
// Emitted if errorString() contains a new message.
void
showErrorMessagesChanged
();
private
slots
:
private
slots
:
void
_updateOrigin
();
void
_updateOrigin
();
private:
private:
void
_setOrigin
(
const
QGeoCoordinate
&
origin
);
void
_setOrigin
(
const
QGeoCoordinate
&
origin
);
void
_processError
(
const
QString
&
str
);
void
_processError
(
const
QString
&
str
,
bool
showError
);
bool
_areasCorrect
();
bool
_areasCorrect
(
bool
showError
);
bool
_getAreas
(
MeasurementArea
**
measurementArea
,
SafeArea
**
safeArea
);
bool
_getAreas
(
MeasurementArea
**
measurementArea
,
SafeArea
**
safeArea
,
bool
showError
);
QGeoCoordinate
_origin
;
QGeoCoordinate
_origin
;
QmlObjectListModel
_areaList
;
QmlObjectListModel
_areaList
;
QString
_errorString
;
QString
_errorString
;
bool
_showErrorMessages
;
};
};
src/MeasurementComplexItem/CircularGenerator.cpp
View file @
1b05f323
...
@@ -406,6 +406,7 @@ void CircularGenerator::setMeasurementArea(MeasurementArea *area) {
...
@@ -406,6 +406,7 @@ void CircularGenerator::setMeasurementArea(MeasurementArea *area) {
&
CircularGenerator
::
resetReferenceIfInvalid
);
&
CircularGenerator
::
resetReferenceIfInvalid
);
connect
(
_measurementArea
,
&
MeasurementArea
::
pathChanged
,
this
,
connect
(
_measurementArea
,
&
MeasurementArea
::
pathChanged
,
this
,
&
GeneratorBase
::
generatorChanged
);
&
GeneratorBase
::
generatorChanged
);
resetReferenceIfInvalid
();
}
}
emit
generatorChanged
();
emit
generatorChanged
();
...
@@ -438,16 +439,13 @@ bool circularTransects(const snake::FPoint &reference,
...
@@ -438,16 +439,13 @@ bool circularTransects(const snake::FPoint &reference,
distances
.
reserve
(
polygon
.
outer
().
size
());
distances
.
reserve
(
polygon
.
outer
().
size
());
std
::
vector
<
snake
::
Angle
>
angles
;
std
::
vector
<
snake
::
Angle
>
angles
;
angles
.
reserve
(
polygon
.
outer
().
size
());
angles
.
reserve
(
polygon
.
outer
().
size
());
//#ifdef DEBUG_CIRCULAR_SURVEY
// qCDebug(CircularGeneratorLog) << "circularTransects():";
// qCDebug(CircularGeneratorLog) << "circularTransects():";
//#endif
for
(
const
auto
&
p
:
polygon
.
outer
())
{
for
(
const
auto
&
p
:
polygon
.
outer
())
{
snake
::
Length
distance
=
bg
::
distance
(
reference
,
p
)
*
si
::
meter
;
snake
::
Length
distance
=
bg
::
distance
(
reference
,
p
)
*
si
::
meter
;
distances
.
push_back
(
distance
);
distances
.
push_back
(
distance
);
snake
::
Angle
alpha
=
(
std
::
atan2
(
p
.
get
<
1
>
(),
p
.
get
<
0
>
()))
*
si
::
radian
;
snake
::
Angle
alpha
=
(
std
::
atan2
(
p
.
get
<
1
>
(),
p
.
get
<
0
>
()))
*
si
::
radian
;
alpha
=
alpha
<
0
*
si
::
radian
?
alpha
+
2
*
M_PI
*
si
::
radian
:
alpha
;
alpha
=
alpha
<
0
*
si
::
radian
?
alpha
+
2
*
M_PI
*
si
::
radian
:
alpha
;
angles
.
push_back
(
alpha
);
angles
.
push_back
(
alpha
);
//#ifdef DEBUG_CIRCULAR_SURVEY
// qCDebug(CircularGeneratorLog) << "distances, angles,
// qCDebug(CircularGeneratorLog) << "distances, angles,
// coordinates:"; qCDebug(CircularGeneratorLog) <<
// coordinates:"; qCDebug(CircularGeneratorLog) <<
// to_string(distance).c_str(); qCDebug(CircularGeneratorLog)
// to_string(distance).c_str(); qCDebug(CircularGeneratorLog)
...
@@ -455,7 +453,6 @@ bool circularTransects(const snake::FPoint &reference,
...
@@ -455,7 +453,6 @@ bool circularTransects(const snake::FPoint &reference,
// qCDebug(CircularGeneratorLog) << "x = " << p.get<0>() << "y
// qCDebug(CircularGeneratorLog) << "x = " << p.get<0>() << "y
// = "
// = "
// << p.get<1>();
// << p.get<1>();
//#endif
}
}
auto
rMin
=
deltaR
;
// minimal circle radius
auto
rMin
=
deltaR
;
// minimal circle radius
...
@@ -484,7 +481,6 @@ bool circularTransects(const snake::FPoint &reference,
...
@@ -484,7 +481,6 @@ bool circularTransects(const snake::FPoint &reference,
vector
<
ClipperLib
::
Path
>
sectors
(
nTran
,
ClipperLib
::
Path
());
vector
<
ClipperLib
::
Path
>
sectors
(
nTran
,
ClipperLib
::
Path
());
const
auto
nSectors
=
const
auto
nSectors
=
long
(
std
::
round
(((
alpha2
-
alpha1
)
/
deltaAlpha
).
value
()));
long
(
std
::
round
(((
alpha2
-
alpha1
)
/
deltaAlpha
).
value
()));
//#ifdef DEBUG_CIRCULAR_SURVEY
// qCDebug(CircularGeneratorLog) << "circularTransects(): sector
// qCDebug(CircularGeneratorLog) << "circularTransects(): sector
// parameres:"; qCDebug(CircularGeneratorLog) << "alpha1: " <<
// parameres:"; qCDebug(CircularGeneratorLog) << "alpha1: " <<
// to_string(snake::Degree(alpha1)).c_str();
// to_string(snake::Degree(alpha1)).c_str();
...
@@ -499,7 +495,6 @@ bool circularTransects(const snake::FPoint &reference,
...
@@ -499,7 +495,6 @@ bool circularTransects(const snake::FPoint &reference,
// qCDebug(CircularGeneratorLog)
// qCDebug(CircularGeneratorLog)
// << "rMax: " << to_string(rMax).c_str();
// << "rMax: " << to_string(rMax).c_str();
// qCDebug(CircularGeneratorLog) << "nTran: " << nTran;
// qCDebug(CircularGeneratorLog) << "nTran: " << nTran;
//#endif
using
ClipperCircle
=
using
ClipperCircle
=
GenericCircle
<
ClipperLib
::
cInt
,
ClipperLib
::
IntPoint
>
;
GenericCircle
<
ClipperLib
::
cInt
,
ClipperLib
::
IntPoint
>
;
for
(
auto
&
sector
:
sectors
)
{
for
(
auto
&
sector
:
sectors
)
{
...
...
src/MeasurementComplexItem/GeneratorBase.cc
View file @
1b05f323
...
@@ -67,6 +67,7 @@ bool GeneratorFactory::registerGenerator(const QString &type,
...
@@ -67,6 +67,7 @@ bool GeneratorFactory::registerGenerator(const QString &type,
GeneratorFactory
::
Creator
creator
)
{
GeneratorFactory
::
Creator
creator
)
{
const
auto
pair
=
_creatorMap
.
insert
(
std
::
make_pair
(
type
,
creator
));
const
auto
pair
=
_creatorMap
.
insert
(
std
::
make_pair
(
type
,
creator
));
auto
success
=
pair
.
second
;
auto
success
=
pair
.
second
;
Q_ASSERT
(
success
);
return
success
;
return
success
;
}
}
...
...
src/MeasurementComplexItem/MeasurementComplexItem.cc
View file @
1b05f323
...
@@ -33,12 +33,12 @@ const char *MeasurementComplexItem::jsonComplexItemTypeValue =
...
@@ -33,12 +33,12 @@ const char *MeasurementComplexItem::jsonComplexItemTypeValue =
const
QString
MeasurementComplexItem
::
name
(
tr
(
"Measurement"
));
const
QString
MeasurementComplexItem
::
name
(
tr
(
"Measurement"
));
namespace
{
namespace
{
const
char
*
variant
Key
=
"Variant
"
;
const
char
*
variant
IndexKey
=
"VariantIndex
"
;
const
char
*
altitudeKey
=
"Altitude"
;
const
char
*
altitudeKey
=
"Altitude"
;
const
char
*
areaDataKey
=
"AreaData"
;
const
char
*
areaDataKey
=
"AreaData"
;
const
char
*
variantNamesKey
=
"VariantNames"
;
const
char
*
variantNamesKey
=
"VariantNames"
;
const
char
*
generator
sKey
=
"Generators
"
;
const
char
*
generator
ArrayKey
=
"GeneratorArray
"
;
const
char
*
variant
sKey
=
"Variants
"
;
const
char
*
variant
ArrayKey
=
"VariantArray
"
;
const
char
*
generatorIndexKey
=
"GeneratorIndex"
;
const
char
*
generatorIndexKey
=
"GeneratorIndex"
;
}
// namespace
}
// namespace
...
@@ -51,17 +51,39 @@ MeasurementComplexItem::MeasurementComplexItem(
...
@@ -51,17 +51,39 @@ MeasurementComplexItem::MeasurementComplexItem(
QStringLiteral
(
":/json/MeasurementComplexItem.SettingsGroup.json"
),
QStringLiteral
(
":/json/MeasurementComplexItem.SettingsGroup.json"
),
this
)),
this
)),
_altitude
(
settingsGroup
,
_metaDataMap
[
altitudeKey
]),
_altitude
(
settingsGroup
,
_metaDataMap
[
altitudeKey
]),
_variant
(
settingsGroup
,
_metaDataMap
[
variant
Key
]),
_variant
Index
(
settingsGroup
,
_metaDataMap
[
variantIndex
Key
]),
_pAreaData
(
new
AreaData
(
this
)),
_pEditorData
(
new
AreaData
(
this
)),
_pAreaData
(
new
AreaData
(
this
)),
_pEditorData
(
new
AreaData
(
this
)),
_pCurrentData
(
_pAreaData
),
_pGenerator
(
nullptr
),
_pCurrentData
(
_pAreaData
),
_pGenerator
(
nullptr
),
_pWorker
(
new
RoutingThread
(
this
))
{
_pWorker
(
new
RoutingThread
(
this
))
{
// Setup altitude.
_altitude
.
setRawValue
(
qgcApp
()
->
toolbox
()
->
settingsManager
()
->
appSettings
()
->
defaultMissionItemAltitude
()
->
rawValue
());
connect
(
&
_altitude
,
&
SettingsFact
::
rawValueChanged
,
[
this
]
{
emit
this
->
minAMSLAltitudeChanged
(
this
->
_altitude
.
rawValue
().
toDouble
());
});
connect
(
&
_altitude
,
&
SettingsFact
::
rawValueChanged
,
[
this
]
{
emit
this
->
maxAMSLAltitudeChanged
(
this
->
_altitude
.
rawValue
().
toDouble
());
});
connect
(
&
_altitude
,
&
SettingsFact
::
rawValueChanged
,
[
this
]
{
emit
this
->
amslEntryAltChanged
(
this
->
_altitude
.
rawValue
().
toDouble
());
});
connect
(
&
_altitude
,
&
SettingsFact
::
rawValueChanged
,
[
this
]
{
emit
this
->
amslExitAltChanged
(
this
->
_altitude
.
rawValue
().
toDouble
());
});
connect
(
&
_altitude
,
&
SettingsFact
::
rawValueChanged
,
this
,
&
MeasurementComplexItem
::
_onAltitudeChanged
);
Q_UNUSED
(
kmlOrShpFile
)
Q_UNUSED
(
kmlOrShpFile
)
_editorQml
=
"qrc:/qml/MeasurementItemEditor.qml"
;
_editorQml
=
"qrc:/qml/MeasurementItemEditor.qml"
;
// Connect facts.
// Connect facts.
connect
(
&
this
->
_variant
,
&
Fact
::
rawValueChanged
,
this
,
connect
(
&
this
->
_variant
Index
,
&
Fact
::
rawValueChanged
,
this
,
&
MeasurementComplexItem
::
_changeVariant
);
&
MeasurementComplexItem
::
_changeVariant
Index
);
// Connect worker.
// Connect worker.
connect
(
this
->
_pWorker
,
&
RoutingThread
::
result
,
this
,
connect
(
this
->
_pWorker
,
&
RoutingThread
::
result
,
this
,
...
@@ -106,10 +128,6 @@ MeasurementComplexItem::MeasurementComplexItem(
...
@@ -106,10 +128,6 @@ MeasurementComplexItem::MeasurementComplexItem(
resetGenerators
();
resetGenerators
();
startEditing
();
startEditing
();
qCritical
()
<<
"ToDo: _altitude connections missing."
;
qCritical
()
<<
"ToDo: remove generatorNameList and use GeneratorBase::name() "
"instead."
;
}
}
MeasurementComplexItem
::~
MeasurementComplexItem
()
{}
MeasurementComplexItem
::~
MeasurementComplexItem
()
{}
...
@@ -173,10 +191,10 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
...
@@ -173,10 +191,10 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
setSequenceNumber
(
sequenceNumber
);
setSequenceNumber
(
sequenceNumber
);
startEditing
();
startEditing
();
// load variant
// load variant
index
if
(
complexObject
.
contains
(
variantKey
)
&&
if
(
complexObject
.
contains
(
variant
Index
Key
)
&&
complexObject
[
variantKey
].
isDouble
())
{
complexObject
[
variant
Index
Key
].
isDouble
())
{
_variant
.
setRawValue
(
complexObject
[
variant
Key
].
toInt
());
_variant
Index
.
setRawValue
(
complexObject
[
variantIndex
Key
].
toInt
());
}
}
// load altitude
// load altitude
...
@@ -194,14 +212,11 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
...
@@ -194,14 +212,11 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
complexObject
[
areaDataKey
].
isObject
())
{
complexObject
[
areaDataKey
].
isObject
())
{
QString
e
;
QString
e
;
if
(
_pCurrentData
->
load
(
complexObject
[
areaDataKey
].
toObject
(),
e
))
{
if
(
_pCurrentData
->
load
(
complexObject
[
areaDataKey
].
toObject
(),
e
))
{
_pCurrentData
->
setShowErrorMessages
(
false
);
if
(
!
_pCurrentData
->
isCorrect
(
false
/*don't show gui message*/
))
{
if
(
!
_pCurrentData
->
isCorrect
())
{
errorString
.
append
(
_pCurrentData
->
errorString
());
errorString
.
append
(
_pCurrentData
->
errorString
());
_pCurrentData
->
setShowErrorMessages
(
true
);
abortEditing
();
abortEditing
();
return
false
;
return
false
;
}
}
_pCurrentData
->
setShowErrorMessages
(
true
);
}
else
{
}
else
{
// this is critical, proceeding is not
// this is critical, proceeding is not
...
@@ -218,13 +233,13 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
...
@@ -218,13 +233,13 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
}
}
// load Generators.
// load Generators.
if
(
complexObject
.
contains
(
generator
s
Key
)
&&
if
(
complexObject
.
contains
(
generator
Array
Key
)
&&
complexObject
[
generator
s
Key
].
isArray
())
{
complexObject
[
generator
Array
Key
].
isArray
())
{
QVector
<
PtrGenerator
>
generatorList
;
QVector
<
PtrGenerator
>
generatorList
;
QObject
parent
;
QObject
parent
;
for
(
const
auto
valueRef
:
complexObject
[
generator
s
Key
].
toArray
())
{
for
(
const
auto
valueRef
:
complexObject
[
generator
Array
Key
].
toArray
())
{
const
auto
jsonGen
=
valueRef
.
toObject
();
const
auto
jsonGen
=
valueRef
.
toObject
();
if
(
jsonGen
.
contains
(
routing
::
GeneratorBase
::
typeKey
)
&&
if
(
jsonGen
.
contains
(
routing
::
GeneratorBase
::
typeKey
)
&&
...
@@ -276,7 +291,7 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
...
@@ -276,7 +291,7 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
// insert generators
// insert generators
for
(
const
auto
gen
:
generatorList
)
{
for
(
const
auto
gen
:
generatorList
)
{
gen
->
setParent
(
this
);
gen
->
setParent
(
this
);
addGenerator
(
gen
->
name
(),
gen
);
addGenerator
(
gen
);
}
}
}
}
}
else
{
}
else
{
...
@@ -303,11 +318,11 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
...
@@ -303,11 +318,11 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
// load Route Variants
// load Route Variants
bool
variantsSuccess
=
true
;
bool
variantsSuccess
=
true
;
QVector
<
Variant
>
variantVector
;
QVector
<
Variant
>
variantVector
;
if
(
complexObject
.
contains
(
variant
s
Key
)
&&
if
(
complexObject
.
contains
(
variant
Array
Key
)
&&
complexObject
[
variant
s
Key
].
isArray
())
{
complexObject
[
variant
Array
Key
].
isArray
())
{
// load variants to variantVector for further processing.
// load variants to variantVector for further processing.
for
(
const
auto
valueRef
:
complexObject
[
variant
s
Key
].
toArray
())
{
for
(
const
auto
valueRef
:
complexObject
[
variant
Array
Key
].
toArray
())
{
if
(
valueRef
.
isArray
())
{
if
(
valueRef
.
isArray
())
{
const
auto
jsonVariant
=
valueRef
.
toArray
();
const
auto
jsonVariant
=
valueRef
.
toArray
();
Variant
variant
;
Variant
variant
;
...
@@ -333,6 +348,16 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
...
@@ -333,6 +348,16 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
}
}
}
}
// Check if variantVector and variants are non empty
if
(
variantVector
.
size
()
==
0
)
{
variantsSuccess
=
false
;
}
for
(
const
auto
&
var
:
variantVector
)
{
if
(
var
.
size
()
==
0
)
{
variantsSuccess
=
false
;
}
}
// Check if variants are covered by safe area.
// Check if variants are covered by safe area.
if
(
variantsSuccess
)
{
if
(
variantsSuccess
)
{
auto
safeArea
=
_pCurrentData
->
safeArea
();
auto
safeArea
=
_pCurrentData
->
safeArea
();
...
@@ -362,11 +387,8 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
...
@@ -362,11 +387,8 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
variantsSuccess
=
false
;
variantsSuccess
=
false
;
}
}
if
(
!
variantsSuccess
)
{
if
(
variantsSuccess
)
{
stopEditing
();
// stop editing and trigger update
}
else
{
_variantVector
.
swap
(
variantVector
);
_variantVector
.
swap
(
variantVector
);
qCritical
()
<<
"add variant names and set variant"
;