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
f778e405
Commit
f778e405
authored
Dec 14, 2020
by
Valentin Platzgummer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
loading almost finished
parent
8250ef7b
Changes
14
Show whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
329 additions
and
282 deletions
+329
-282
AreaData.cc
src/MeasurementComplexItem/AreaData.cc
+77
-97
AreaData.h
src/MeasurementComplexItem/AreaData.h
+3
-1
CircularGenerator.cpp
src/MeasurementComplexItem/CircularGenerator.cpp
+57
-30
CircularGenerator.h
src/MeasurementComplexItem/CircularGenerator.h
+10
-5
GeneratorBase.cc
src/MeasurementComplexItem/GeneratorBase.cc
+9
-17
GeneratorBase.h
src/MeasurementComplexItem/GeneratorBase.h
+1
-3
LinearGenerator.cpp
src/MeasurementComplexItem/LinearGenerator.cpp
+47
-21
LinearGenerator.h
src/MeasurementComplexItem/LinearGenerator.h
+10
-5
MeasurementComplexItem.cc
src/MeasurementComplexItem/MeasurementComplexItem.cc
+99
-56
MeasurementComplexItem.h
src/MeasurementComplexItem/MeasurementComplexItem.h
+4
-2
AreaDataEditor.qml
src/MeasurementComplexItem/qml/AreaDataEditor.qml
+0
-11
MeasurementItemEditor.qml
src/MeasurementComplexItem/qml/MeasurementItemEditor.qml
+4
-29
MeasurementItemMapVisual.qml
src/MeasurementComplexItem/qml/MeasurementItemMapVisual.qml
+7
-4
ParameterEditor.qml
src/MeasurementComplexItem/qml/ParameterEditor.qml
+1
-1
No files found.
src/MeasurementComplexItem/AreaData.cc
View file @
f778e405
...
...
@@ -13,14 +13,13 @@ QGC_LOGGING_CATEGORY(AreaDataLog, "AreaDataLog")
const
char
*
originKey
=
"Origin"
;
const
char
*
areaListKey
=
"AreaList"
;
const
char
*
initializedKey
=
"Initialized"
;
AreaData
::
AreaData
(
QObject
*
parent
)
:
QObject
(
parent
)
{}
AreaData
::~
AreaData
()
{}
AreaData
::
AreaData
(
const
AreaData
&
other
,
QObject
*
parent
)
:
QObject
(
parent
),
_
initialized
(
false
),
_
showErrorMessages
(
true
)
{
:
QObject
(
parent
),
_showErrorMessages
(
true
)
{
*
this
=
other
;
}
...
...
@@ -35,7 +34,6 @@ AreaData &AreaData::operator=(const AreaData &other) {
}
_origin
=
other
.
_origin
;
_initialized
=
other
.
_initialized
;
return
*
this
;
}
...
...
@@ -130,11 +128,10 @@ bool AreaData::isCorrect() {
// qDebug() << ss.str().c_str();
if
(
!
bg
::
covered_by
(
measurementAreaENU
,
safeAreaENU
))
{
_processError
(
tr
(
"Measurement Area not inside Safe Area. Please adjust "
"the Measurement Area."
));
"the Measurement Area.
\n
"
));
return
false
;
}
_initialized
=
true
;
return
true
;
}
...
...
@@ -196,7 +193,6 @@ bool AreaData::initialize(const QGeoCoordinate &bottomLeft,
safeArea
->
vertexCoordinate
(
0
).
longitude
()
*
0.5
+
measurementArea
->
vertexCoordinate
(
0
).
longitude
()
*
0.5
));
_initialized
=
true
;
return
true
;
}
else
{
qCWarning
(
AreaDataLog
)
...
...
@@ -206,7 +202,12 @@ bool AreaData::initialize(const QGeoCoordinate &bottomLeft,
}
}
bool
AreaData
::
initialized
()
{
return
_initialized
;
}
bool
AreaData
::
initialized
()
{
auto
measurementArea
=
getGeoArea
<
MeasurementArea
*>
(
_areaList
);
auto
safeArea
=
getGeoArea
<
SafeArea
*>
(
_areaList
);
return
measurementArea
!=
nullptr
&&
safeArea
!=
nullptr
&&
measurementArea
->
count
()
>=
3
&&
safeArea
->
count
()
>=
3
;
}
void
AreaData
::
intersection
()
{
if
(
initialized
()
&&
_areasCorrect
())
{
...
...
@@ -261,6 +262,12 @@ void AreaData::intersection() {
}
}
MeasurementArea
*
AreaData
::
measurementArea
()
{
return
getGeoArea
<
MeasurementArea
*>
(
_areaList
);
}
SafeArea
*
AreaData
::
safeArea
()
{
return
getGeoArea
<
SafeArea
*>
(
_areaList
);
}
bool
AreaData
::
operator
==
(
const
AreaData
&
other
)
const
{
if
(
_areaList
.
count
()
==
other
.
_areaList
.
count
())
{
for
(
int
i
=
0
;
i
<
_areaList
.
count
();
++
i
)
{
...
...
@@ -280,43 +287,29 @@ bool AreaData::operator!=(const AreaData &other) const {
bool
AreaData
::
load
(
const
QJsonObject
&
obj
,
QString
&
errorString
)
{
bool
returnValue
=
true
;
// load initialized.
{
QString
e
;
QList
<
JsonHelper
::
KeyValidateInfo
>
keyInfo
=
{
{
initializedKey
,
QJsonValue
::
Bool
,
true
},
};
if
(
JsonHelper
::
validateKeys
(
obj
,
keyInfo
,
e
))
{
_initialized
=
obj
[
initializedKey
].
toBool
();
}
else
{
returnValue
=
false
;
errorString
.
append
(
e
);
errorString
.
append
(
"
\n
"
);
}
}
// load areaList.
{
QString
e
;
QList
<
JsonHelper
::
KeyValidateInfo
>
keyInfo
=
{
{
areaListKey
,
QJsonValue
::
Array
,
true
},
};
if
(
JsonHelper
::
validateKeys
(
obj
,
keyInfo
,
e
))
{
if
(
obj
.
contains
(
areaListKey
)
&&
obj
[
areaListKey
].
isArray
())
{
this
->
clear
();
// iterate over json array
for
(
const
auto
valueRef
:
obj
[
areaListKey
].
toArray
())
{
const
auto
jsonArea
=
valueRef
.
toObject
();
// check if area type key is present
QList
<
JsonHelper
::
KeyValidateInfo
>
areaInfo
=
{
{
GeoArea
::
areaTypeKey
,
QJsonValue
::
String
,
true
},
};
if
(
!
JsonHelper
::
validateKeys
(
jsonArea
,
areaInfo
,
e
))
{
if
(
jsonArea
.
contains
(
GeoArea
::
areaTypeKey
)
&&
jsonArea
[
GeoArea
::
areaTypeKey
].
isString
())
{
// load MeasurementArea
if
(
jsonArea
[
GeoArea
::
areaTypeKey
].
toString
()
==
MeasurementArea
::
name
)
{
auto
area
=
getGeoArea
<
MeasurementArea
*>
(
_areaList
);
if
(
area
==
nullptr
)
{
auto
area
=
new
MeasurementArea
(
this
);
QString
e
;
if
(
area
->
loadFromJson
(
jsonArea
,
e
))
{
this
->
insert
(
area
);
}
else
{
...
...
@@ -332,11 +325,13 @@ bool AreaData::load(const QJsonObject &obj, QString &errorString) {
}
}
// load SafeArea
else
if
(
jsonArea
[
GeoArea
::
areaTypeKey
].
toString
()
==
SafeArea
::
name
)
{
else
if
(
jsonArea
[
GeoArea
::
areaTypeKey
].
toString
()
==
SafeArea
::
name
)
{
auto
area
=
getGeoArea
<
SafeArea
*>
(
_areaList
);
if
(
area
==
nullptr
)
{
auto
area
=
new
SafeArea
(
this
);
QString
e
;
if
(
area
->
loadFromJson
(
jsonArea
,
e
))
{
this
->
insert
(
area
);
}
else
{
...
...
@@ -357,41 +352,27 @@ bool AreaData::load(const QJsonObject &obj, QString &errorString) {
errorString
.
append
(
tr
(
"Unknown area type: "
)
+
jsonArea
[
GeoArea
::
areaTypeKey
].
toString
());
}
}
}
else
{
// GeoArea::areaTypeKey missing
else
{
returnValue
=
false
;
errorString
.
append
(
e
);
errorString
.
append
(
"
\n
"
);
}
errorString
.
append
(
"Area type key missing, not able to determine area type.
\n
"
);
}
}
}
else
{
// AreaList missing
else
{
returnValue
=
false
;
errorString
.
append
(
e
);
errorString
.
append
(
"
\n
"
);
}
errorString
.
append
(
"Not able to load areas.
\n
"
);
}
// load origin
{
QString
e
;
QList
<
JsonHelper
::
KeyValidateInfo
>
keyInfo
=
{
{
originKey
,
QJsonValue
::
Object
,
true
},
};
if
(
JsonHelper
::
validateKeys
(
obj
,
keyInfo
,
e
))
{
if
(
obj
.
contains
(
originKey
)
&&
obj
[
originKey
].
isObject
())
{
QGeoCoordinate
origin
;
QString
e
;
if
(
JsonHelper
::
loadGeoCoordinate
(
obj
[
originKey
],
false
,
origin
,
e
))
{
_origin
=
origin
;
}
}
}
// check if this is correct.
if
(
!
this
->
isCorrect
())
{
returnValue
=
false
;
}
return
returnValue
;
}
...
...
@@ -402,7 +383,6 @@ bool AreaData::save(QJsonObject &obj) {
QJsonValue
jsonOrigin
;
JsonHelper
::
saveGeoCoordinate
(
_origin
,
false
,
jsonOrigin
);
temp
[
originKey
]
=
jsonOrigin
;
temp
[
initializedKey
]
=
_initialized
;
QJsonArray
jsonAreaList
;
for
(
int
i
=
0
;
i
<
_areaList
.
count
();
++
i
)
{
...
...
src/MeasurementComplexItem/AreaData.h
View file @
f778e405
...
...
@@ -71,6 +71,9 @@ public:
Q_INVOKABLE
bool
initialized
();
Q_INVOKABLE
void
intersection
();
Q_INVOKABLE
MeasurementArea
*
measurementArea
();
Q_INVOKABLE
SafeArea
*
safeArea
();
bool
operator
==
(
const
AreaData
&
other
)
const
;
bool
operator
!=
(
const
AreaData
&
other
)
const
;
...
...
@@ -98,7 +101,6 @@ private:
QGeoCoordinate
_origin
;
QmlObjectListModel
_areaList
;
bool
_initialized
;
QString
_errorString
;
bool
_showErrorMessages
;
};
src/MeasurementComplexItem/CircularGenerator.cpp
View file @
f778e405
...
...
@@ -21,8 +21,6 @@ template <> inline auto get<1>(const IntPoint &p) { return p.Y; }
namespace
routing
{
namespace
{
const
QString
generatorType
=
"CircularGenerator"
;
GeneratorBase
*
creator
(
QObject
*
parent
)
{
return
new
CircularGenerator
(
parent
);
}
...
...
@@ -33,8 +31,6 @@ const char *minLengthKey = "MinLength";
const
char
*
referenceKey
=
"ReferencePoint"
;
}
// namespace
REGISTER_GENERATOR
(
generatorType
,
creator
)
bool
circularTransects
(
const
snake
::
FPoint
&
reference
,
const
snake
::
FPolygon
&
polygon
,
const
std
::
vector
<
snake
::
FPolygon
>
&
tiles
,
...
...
@@ -42,9 +38,20 @@ bool circularTransects(const snake::FPoint &reference,
snake
::
Length
minLength
,
snake
::
Transects
&
transects
);
const
char
*
CircularGenerator
::
settingsGroup
=
"CircularGenerator"
;
const
char
*
CircularGenerator
::
typeString
=
"CircularGenerator"
;
REGISTER_GENERATOR
(
CircularGenerator
::
typeString
,
creator
)
CircularGenerator
::
CircularGenerator
(
QObject
*
parent
)
:
CircularGenerator
(
nullptr
,
parent
)
{}
:
GeneratorBase
(
parent
),
_metaDataMap
(
FactMetaData
::
createMapFromJsonFile
(
QStringLiteral
(
":/json/CircularGenerator.SettingsGroup.json"
),
this
)),
_distance
(
settingsGroup
,
_metaDataMap
[
distanceKey
]),
_deltaAlpha
(
settingsGroup
,
_metaDataMap
[
deltaAlphaKey
]),
_minLength
(
settingsGroup
,
_metaDataMap
[
minLengthKey
]),
_measurementArea
(
nullptr
)
{
init
();
}
CircularGenerator
::
CircularGenerator
(
GeneratorBase
::
Data
d
,
QObject
*
parent
)
:
GeneratorBase
(
d
,
parent
),
...
...
@@ -54,28 +61,20 @@ CircularGenerator::CircularGenerator(GeneratorBase::Data d, QObject *parent)
_deltaAlpha
(
settingsGroup
,
_metaDataMap
[
deltaAlphaKey
]),
_minLength
(
settingsGroup
,
_metaDataMap
[
minLengthKey
]),
_measurementArea
(
nullptr
)
{
connect
(
this
->
distance
(),
&
Fact
::
rawValueChanged
,
this
,
&
GeneratorBase
::
generatorChanged
);
connect
(
this
->
deltaAlpha
(),
&
Fact
::
rawValueChanged
,
this
,
&
GeneratorBase
::
generatorChanged
);
connect
(
this
->
minLength
(),
&
Fact
::
rawValueChanged
,
this
,
&
GeneratorBase
::
generatorChanged
);
connect
(
this
,
&
CircularGenerator
::
referenceChanged
,
this
,
&
GeneratorBase
::
generatorChanged
);
setName
(
tr
(
"Circular Generator"
));
init
();
}
QString
CircularGenerator
::
editorQml
()
{
QString
CircularGenerator
::
editorQml
()
const
{
return
QStringLiteral
(
"CircularGeneratorEditor.qml"
);
}
QString
CircularGenerator
::
mapVisualQml
()
{
QString
CircularGenerator
::
mapVisualQml
()
const
{
return
QStringLiteral
(
"CircularGeneratorMapVisual.qml"
);
}
QString
CircularGenerator
::
abbreviation
()
{
return
tr
(
"C. Gen."
);
}
QString
CircularGenerator
::
abbreviation
()
const
{
return
tr
(
"C. Gen."
);
}
QString
CircularGenerator
::
type
()
{
return
generatorType
;
}
QString
CircularGenerator
::
type
()
const
{
return
typeString
;
}
bool
CircularGenerator
::
get
(
Generator
&
generator
)
{
if
(
this
->
_d
)
{
...
...
@@ -327,6 +326,7 @@ void CircularGenerator::resetReferenceIfInvalid() {
}
void
CircularGenerator
::
resetReference
()
{
if
(
this
->
_d
!=
nullptr
)
{
auto
measurementArea
=
getGeoArea
<
const
MeasurementArea
*>
(
*
this
->
_d
->
areaList
());
...
...
@@ -341,6 +341,7 @@ void CircularGenerator::resetReference() {
qCDebug
(
CircularGeneratorLog
)
<<
"resetReference(): measurement area == nullptr"
;
}
}
}
Fact
*
CircularGenerator
::
distance
()
{
return
&
_distance
;
}
...
...
@@ -350,8 +351,34 @@ Fact *CircularGenerator::deltaAlpha() { return &_deltaAlpha; }
Fact
*
CircularGenerator
::
minLength
()
{
return
&
_minLength
;
}
void
CircularGenerator
::
onAreaListChanged
()
{
auto
*
measurementArea
=
getGeoArea
<
MeasurementArea
*>
(
*
this
->
_d
->
areaList
());
if
(
this
->
_d
!=
nullptr
)
{
auto
*
measurementArea
=
getGeoArea
<
MeasurementArea
*>
(
*
this
->
_d
->
areaList
());
setMeasurementArea
(
measurementArea
);
}
}
void
CircularGenerator
::
onDataChanged
()
{
if
(
this
->
_d
!=
nullptr
)
{
connect
(
this
->
_d
,
&
AreaData
::
areaListChanged
,
this
,
&
CircularGenerator
::
onAreaListChanged
);
onAreaListChanged
();
}
}
void
CircularGenerator
::
init
()
{
connect
(
this
->
distance
(),
&
Fact
::
rawValueChanged
,
this
,
&
GeneratorBase
::
generatorChanged
);
connect
(
this
->
deltaAlpha
(),
&
Fact
::
rawValueChanged
,
this
,
&
GeneratorBase
::
generatorChanged
);
connect
(
this
->
minLength
(),
&
Fact
::
rawValueChanged
,
this
,
&
GeneratorBase
::
generatorChanged
);
connect
(
this
,
&
CircularGenerator
::
referenceChanged
,
this
,
&
GeneratorBase
::
generatorChanged
);
connect
(
this
,
&
CircularGenerator
::
dataChanged
,
this
,
&
CircularGenerator
::
onDataChanged
);
onDataChanged
();
setName
(
tr
(
"Circular Generator"
));
}
void
CircularGenerator
::
setMeasurementArea
(
MeasurementArea
*
area
)
{
...
...
src/MeasurementComplexItem/CircularGenerator.h
View file @
f778e405
...
...
@@ -20,11 +20,11 @@ public:
Q_PROPERTY
(
Fact
*
deltaAlpha
READ
deltaAlpha
CONSTANT
)
Q_PROPERTY
(
Fact
*
minLength
READ
minLength
CONSTANT
)
virtual
QString
editorQml
()
override
;
virtual
QString
mapVisualQml
()
override
;
virtual
QString
editorQml
()
const
override
;
virtual
QString
mapVisualQml
()
const
override
;
virtual
QString
abbreviation
()
override
;
virtual
QString
type
()
override
;
virtual
QString
abbreviation
()
const
override
;
virtual
QString
type
()
const
override
;
virtual
bool
get
(
Generator
&
generator
)
override
;
...
...
@@ -47,6 +47,7 @@ public:
virtual
bool
load
(
const
QJsonObject
&
obj
,
QString
&
guiErrorMessage
)
override
;
static
const
char
*
settingsGroup
;
static
const
char
*
typeString
;
signals:
void
referenceChanged
();
...
...
@@ -55,8 +56,12 @@ public slots:
Q_INVOKABLE
void
resetReferenceIfInvalid
();
Q_INVOKABLE
void
resetReference
();
private:
private
slots
:
void
onAreaListChanged
();
void
onDataChanged
();
private:
void
init
();
void
setMeasurementArea
(
MeasurementArea
*
area
);
QGeoCoordinate
_reference
;
...
...
src/MeasurementComplexItem/GeneratorBase.cc
View file @
f778e405
...
...
@@ -11,20 +11,18 @@ GeneratorBase::GeneratorBase(QObject *parent)
:
GeneratorBase
(
nullptr
,
parent
)
{}
GeneratorBase
::
GeneratorBase
(
GeneratorBase
::
Data
d
,
QObject
*
parent
)
:
QObject
(
parent
),
_d
(
d
)
{
establishConnections
();
}
:
QObject
(
parent
),
_d
(
d
)
{}
GeneratorBase
::~
GeneratorBase
()
{}
bool
GeneratorBase
::
save
(
QJsonObject
&
obj
)
const
{
obj
[
typeKey
]
=
type
();
obj
[
name
]
=
name
();
obj
[
typeKey
]
=
t
his
->
t
ype
();
obj
[
name
Key
]
=
this
->
name
();
return
true
;
}
bool
GeneratorBase
::
load
(
const
QJsonObject
&
obj
,
QString
&
errorString
)
{
if
(
obj
.
contains
[
nameKey
]
&&
obj
[
nameKey
].
isString
())
{
if
(
obj
.
contains
(
nameKey
)
&&
obj
[
nameKey
].
isString
())
{
setName
(
obj
[
nameKey
].
toString
());
return
true
;
}
else
{
...
...
@@ -46,18 +44,12 @@ void GeneratorBase::setName(const QString &name) {
GeneratorBase
::
Data
GeneratorBase
::
data
()
const
{
return
_d
;
}
void
GeneratorBase
::
setData
(
Data
d
)
{
if
(
d
!=
_d
&&
d
!=
nullptr
)
{
deleteConnections
();
if
(
d
!=
_d
)
{
_d
=
d
;
establishConnections
();
emit
dataChanged
();
}
}
void
GeneratorBase
::
establishConnections
()
{}
void
GeneratorBase
::
deleteConnections
()
{}
GeneratorFactory
::
GeneratorFactory
()
{}
GeneratorFactory
*
GeneratorFactory
::
createInstance
()
{
...
...
@@ -112,14 +104,14 @@ GeneratorBase *GeneratorFactory::create(const QJsonObject &jsonGenerator,
return
nullptr
;
}
}
else
{
errorMessage
.
append
(
QObject
::
tr
(
"Not able to create generator of type"
)
+
" "
+
errorMessage
.
append
(
QObject
::
tr
(
"Not able to create generator of type.
\n
"
)
+
" "
+
jsonGenerator
[
GeneratorBase
::
typeKey
].
toString
());
return
nullptr
;
}
}
else
{
errorMessage
.
append
(
QObject
::
tr
(
"Not able to load Generator. Impossible to determine type."
));
"Not able to load Generator. Impossible to determine type.
\n
"
));
return
nullptr
;
}
}
...
...
src/MeasurementComplexItem/GeneratorBase.h
View file @
f778e405
...
...
@@ -53,8 +53,6 @@ signals:
void
nameChanged
();
protected:
virtual
void
establishConnections
();
virtual
void
deleteConnections
();
Data
_d
;
QString
_name
;
...
...
@@ -87,7 +85,7 @@ private:
#define REGISTER_GENERATOR(type, creator) \
namespace { \
auto registered
_##type =
\
auto registered
=
\
GeneratorFactory::instance() -> registerGenerator(type, creator); \
}
}
// namespace routing
src/MeasurementComplexItem/LinearGenerator.cpp
View file @
f778e405
...
...
@@ -14,8 +14,6 @@
namespace
routing
{
namespace
{
const
QString
generatorType
=
"LinearGenerator"
;
GeneratorBase
*
creator
(
QObject
*
parent
)
{
return
new
LinearGenerator
(
parent
);
}
const
char
*
distanceKey
=
"TransectDistance"
;
...
...
@@ -23,7 +21,6 @@ const char *alphaKey = "Alpha";
const
char
*
minLengthKey
=
"MinLength"
;
}
// namespace
REGISTER_GENERATOR
(
generatorType
,
creator
)
QGC_LOGGING_CATEGORY
(
LinearGeneratorLog
,
"LinearGeneratorLog"
)
bool
linearTransects
(
const
snake
::
FPolygon
&
polygon
,
...
...
@@ -32,9 +29,20 @@ bool linearTransects(const snake::FPolygon &polygon,
snake
::
Length
minLength
,
snake
::
Transects
&
transects
);
const
char
*
LinearGenerator
::
settingsGroup
=
"LinearGenerator"
;
const
char
*
LinearGenerator
::
typeString
=
"LinearGenerator"
;
REGISTER_GENERATOR
(
"LinearGenerator"
,
creator
)
LinearGenerator
::
LinearGenerator
(
QObject
*
parent
)
:
LinearGenerator
(
nullptr
,
parent
)
{}
:
GeneratorBase
(
nullptr
,
parent
),
_metaDataMap
(
FactMetaData
::
createMapFromJsonFile
(
QStringLiteral
(
":/json/LinearGenerator.SettingsGroup.json"
),
this
)),
_distance
(
settingsGroup
,
_metaDataMap
[
distanceKey
]),
_alpha
(
settingsGroup
,
_metaDataMap
[
alphaKey
]),
_minLength
(
settingsGroup
,
_metaDataMap
[
minLengthKey
]),
_measurementArea
(
nullptr
)
{
init
();
}
LinearGenerator
::
LinearGenerator
(
GeneratorBase
::
Data
d
,
QObject
*
parent
)
:
GeneratorBase
(
d
,
parent
),
...
...
@@ -43,30 +51,24 @@ LinearGenerator::LinearGenerator(GeneratorBase::Data d, QObject *parent)
_distance
(
settingsGroup
,
_metaDataMap
[
distanceKey
]),
_alpha
(
settingsGroup
,
_metaDataMap
[
alphaKey
]),
_minLength
(
settingsGroup
,
_metaDataMap
[
minLengthKey
]),
_measurementArea
(
nullptr
),
_safeArea
(
nullptr
)
{
connect
(
this
->
distance
(),
&
Fact
::
rawValueChanged
,
this
,
&
GeneratorBase
::
generatorChanged
);
connect
(
this
->
alpha
(),
&
Fact
::
rawValueChanged
,
this
,
&
GeneratorBase
::
generatorChanged
);
connect
(
this
->
minLength
(),
&
Fact
::
rawValueChanged
,
this
,
&
GeneratorBase
::
generatorChanged
);
connect
(
this
->
_d
,
&
AreaData
::
areaListChanged
,
this
,
&
LinearGenerator
::
onAreaListChanged
);
setName
(
tr
(
"Linear Generator"
));
_measurementArea
(
nullptr
)
{
init
();
}
QString
LinearGenerator
::
editorQml
()
{
QString
LinearGenerator
::
editorQml
()
const
{
return
QStringLiteral
(
"LinearGeneratorEditor.qml"
);
}
QString
LinearGenerator
::
mapVisualQml
()
{
return
QStringLiteral
(
""
);
}
QString
LinearGenerator
::
mapVisualQml
()
const
{
return
QStringLiteral
(
""
);
}
QString
LinearGenerator
::
abbreviation
()
{
return
QStringLiteral
(
"L. Gen."
);
}
QString
LinearGenerator
::
abbreviation
()
const
{
return
QStringLiteral
(
"L. Gen."
);
}
QString
LinearGenerator
::
type
()
{
return
generatorType
;
}
QString
LinearGenerator
::
type
()
const
{
return
typeString
;
}
bool
LinearGenerator
::
get
(
Generator
&
generator
)
{
if
(
_d
)
{
if
(
_d
!=
nullptr
)
{
if
(
this
->
_d
->
isCorrect
())
{
// Prepare data.
auto
origin
=
this
->
_d
->
origin
();
...
...
@@ -268,9 +270,33 @@ Fact *LinearGenerator::alpha() { return &_alpha; }
Fact
*
LinearGenerator
::
minLength
()
{
return
&
_minLength
;
}
void
LinearGenerator
::
init
()
{
connect
(
this
->
distance
(),
&
Fact
::
rawValueChanged
,
this
,
&
GeneratorBase
::
generatorChanged
);
connect
(
this
->
alpha
(),
&
Fact
::
rawValueChanged
,
this
,
&
GeneratorBase
::
generatorChanged
);
connect
(
this
->
minLength
(),
&
Fact
::
rawValueChanged
,
this
,
&
GeneratorBase
::
generatorChanged
);
connect
(
this
,
&
LinearGenerator
::
dataChanged
,
this
,
&
LinearGenerator
::
onDataChanged
);
onDataChanged
();
setName
(
tr
(
"Linear Generator"
));
}
void
LinearGenerator
::
onAreaListChanged
()
{
auto
*
measurementArea
=
getGeoArea
<
MeasurementArea
*>
(
*
this
->
_d
->
areaList
());
if
(
this
->
_d
!=
nullptr
)
{
auto
*
measurementArea
=
getGeoArea
<
MeasurementArea
*>
(
*
this
->
_d
->
areaList
());
setMeasurementArea
(
measurementArea
);
}
}
void
LinearGenerator
::
onDataChanged
()
{
if
(
this
->
_d
!=
nullptr
)
{
connect
(
this
->
_d
,
&
AreaData
::
areaListChanged
,
this
,
&
LinearGenerator
::
onAreaListChanged
);
onAreaListChanged
();
}
}
void
LinearGenerator
::
setMeasurementArea
(
MeasurementArea
*
area
)
{
...
...
src/MeasurementComplexItem/LinearGenerator.h
View file @
f778e405
...
...
@@ -19,11 +19,11 @@ public:
Q_PROPERTY
(
Fact
*
alpha
READ
alpha
CONSTANT
)
Q_PROPERTY
(
Fact
*
minLength
READ
minLength
CONSTANT
)
virtual
QString
editorQml
()
override
;
virtual
QString
mapVisualQml
()
override
;
virtual
QString
editorQml
()
const
override
;
virtual
QString
mapVisualQml
()
const
override
;
virtual
QString
abbreviation
()
override
;
virtual
QString
type
()
override
;
virtual
QString
abbreviation
()
const
override
;
virtual
QString
type
()
const
override
;
virtual
bool
get
(
Generator
&
generator
)
override
;
...
...
@@ -43,9 +43,14 @@ public:
Fact
*
minLength
();
static
const
char
*
settingsGroup
;
static
const
char
*
typeString
;
private:
private
slots
:
void
onAreaListChanged
();
void
onDataChanged
();
private:
void
init
();
void
setMeasurementArea
(
MeasurementArea
*
area
);
QMap
<
QString
,
FactMetaData
*>
_metaDataMap
;
...
...
src/MeasurementComplexItem/MeasurementComplexItem.cc
View file @
f778e405
...
...
@@ -31,12 +31,16 @@ const char *MeasurementComplexItem::settingsGroup = "MeasurementComplexItem";
const
char
*
MeasurementComplexItem
::
jsonComplexItemTypeValue
=
"MeasurementComplexItem"
;
const
QString
MeasurementComplexItem
::
name
(
tr
(
"Measurement"
));
namespace
{
const
char
*
variantKey
=
"Variant"
;
const
char
*
altitudeKey
=
"Altitude"
;
const
char
*
areaDataKey
=
"AreaData"
;
const
char
*
variantNamesKey
=
"VariantNames"
;
const
char
*
generatorsKey
=
"Generators"
;
const
char
*
variantsKey
=
"Variants"
;
const
char
*
generatorIndexKey
=
"generatorIndex"
;
}
// namespace
MeasurementComplexItem
::
MeasurementComplexItem
(
PlanMasterController
*
masterController
,
bool
flyView
,
...
...
@@ -101,6 +105,7 @@ MeasurementComplexItem::MeasurementComplexItem(
[
this
]
{
emit
this
->
complexDistanceChanged
();
});
resetGenerators
();
startEditing
();
qCritical
()
<<
"ToDo: _altitude connections missing."
;
qCritical
()
<<
"ToDo: remove generatorNameList and use GeneratorBase::name() "
...
...
@@ -166,17 +171,12 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
}
setSequenceNumber
(
sequenceNumber
);
startEditing
();
bool
returnValue
=
true
;
// load variant
if
(
complexObject
.
contains
(
variantKey
)
&&
complexObject
[
variantKey
].
isDouble
())
{
_variant
.
setRawValue
(
complexObject
[
variantKey
].
toInt
());
}
else
{
returnValue
=
false
;
errorString
.
append
(
tr
(
"No route variant number found in file.
\n
"
));
}
// load altitude
...
...
@@ -184,8 +184,9 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
complexObject
[
altitudeKey
].
isDouble
())
{
_altitude
.
setRawValue
(
complexObject
[
altitudeKey
].
toDouble
());
}
else
{
returnValue
=
false
;
errorString
.
append
(
tr
(
"No altitude found in file.
\n
"
));
abortEditing
();
return
false
;
}
// load AreaData.
...
...
@@ -195,18 +196,17 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
if
(
_pCurrentData
->
load
(
complexObject
[
areaDataKey
].
toObject
(),
e
))
{
_pCurrentData
->
setShowErrorMessages
(
false
);
if
(
!
_pCurrentData
->
isCorrect
())
{
errorString
.
append
(
_pCurrentData
->
errorString
());
_pCurrentData
->
setShowErrorMessages
(
true
);
errorString
.
append
(
tr
(
"Loaded area data does not fullfill rules. Abort loading.
\n
"
));
abortEditing
();
return
false
;
}
_pCurrentData
->
setShowErrorMessages
(
true
);
}
else
{
// this is critical, proceeding is not
// reasonable.
errorString
.
append
(
e
);
errorString
.
append
(
tr
(
"Abort loading.
\n
"
));
abortEditing
();
return
false
;
}
...
...
@@ -263,13 +263,14 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
"that the generator was not registered. In the latter case "
"use the REGISTER_GENERATOR() for registration"
;
}
returnValue
=
false
;
abortEditing
();
return
false
;
}
}
else
{
errorString
.
append
(
tr
(
"Can not determine type of generator. Skipping this generator."
)
);
return
Value
=
false
;
errorString
.
append
(
tr
(
"Can not determine type of generator.
\n
"
));
abortEditing
(
);
return
false
;
}
// insert generators
...
...
@@ -279,54 +280,97 @@ bool MeasurementComplexItem::load(const QJsonObject &complexObject,
}
}
}
else
{
returnValue
=
false
;
errorString
.
append
(
tr
(
"No generators found in file. Leaving generators unchanged.
\n
"
));
abortEditing
();
return
false
;
}
// load generator index
bool
indexLoaded
=
false
;
if
(
complexObject
.
contains
(
generatorIndexKey
)
&&
complexObject
[
generatorIndexKey
].
isDouble
())
{
int
index
=
complexObject
[
generatorIndexKey
].
toDouble
();
if
(
index
>=
0
&&
index
<
_generatorList
.
size
())
{
indexLoaded
=
true
;
switchToGenerator
(
index
);
}
}
if
(
!
indexLoaded
)
{
switchToGenerator
(
0
);
}
// load Route Variants
bool
variantsSuccess
=
true
;
QVector
<
Variant
>
variantVector
;
if
(
complexObject
.
contains
(
variantsKey
)
&&
complexObject
[
variantsKey
].
isArray
())
{
QVector
<
Variant
>
variantVector
;
// load variants to variantVector for further processing.
for
(
const
auto
valueRef
:
complexObject
[
variantsKey
].
toArray
())
{
if
(
valueRef
.
isArray
())
{
const
auto
jsonVariant
=
valueRef
.
to
Object
();
const
auto
jsonVariant
=
valueRef
.
to
Array
();
Variant
variant
;
QString
e
;
if
(
JsonHelper
::
loadGeoCoordinateArray
(
jsonVariant
,
false
,
variant
List
,
if
(
JsonHelper
::
loadGeoCoordinateArray
(
jsonVariant
,
false
,
variant
,
e
))
{
if
(
variant
.
size
()
>
0
)
{
variantVector
.
append
(
std
::
move
(
variant
));
}
else
{
errorString
.
append
(
"Empty route variant skipped.
\n
"
);
returnValue
=
false
;
qCDebug
(
MeasurementComplexItemLog
)
<<
"Empty route variant skipped.
\n
"
<<
valueRef
.
type
();
}
}
else
{
errorString
.
append
(
e
);
errorString
.
append
(
"
\n
"
)
;
returnValue
=
false
;
qCDebug
(
MeasurementComplexItemLog
)
<<
"Error loading route variant: "
<<
e
;
variantsSuccess
=
false
;
}
}
else
{
qCDebug
(
MeasurementComplexItemLog
)
<<
"json variant is not an array but of type: "
<<
valueRef
.
type
();
returnValue
=
false
;
variantsSuccess
=
false
;
}
}
// Check if variants are covered by safe area.
qCritical
()
<<
"Continue here!"
;
if
(
variantsSuccess
)
{
auto
safeArea
=
_pCurrentData
->
safeArea
();
if
(
safeArea
!=
nullptr
)
{
QGeoCoordinate
origin
=
safeArea
->
pathModel
().
value
<
QGCQGeoCoordinate
*>
(
0
)
->
coordinate
();
snake
::
FPolygon
safeAreaENU
;
snake
::
areaToEnu
(
origin
,
safeArea
->
coordinateList
(),
safeAreaENU
);
for
(
const
auto
&
variant
:
variantVector
)
{
snake
::
FLineString
varENU
;
for
(
const
auto
&
vertex
:
variant
)
{
snake
::
FPoint
vertexENU
;
snake
::
toENU
(
origin
,
vertex
.
value
<
QGeoCoordinate
>
(),
vertexENU
);
varENU
.
push_back
(
vertexENU
);
}
if
(
!
bg
::
covered_by
(
varENU
,
safeAreaENU
))
{
variantsSuccess
=
false
;
break
;
}
}
}
else
{
variantsSuccess
=
false
;
}
}
}
else
{
returnValue
=
false
;
errorString
.
append
(
tr
(
"No route variants found in file. Calculating new route variants.
\n
"
));
stopEditing
();
variantsSuccess
=
false
;
}
stopEditing
(
false
);
return
returnValue
;
if
(
!
variantsSuccess
)
{
stopEditing
();
// stop editing and trigger update
}
else
{
_variantVector
.
swap
(
variantVector
);
qCritical
()
<<
"add variant names and set variant"
;
stopEditing
(
false
/*doUpdate*/
);
// does noting if editing was already stopped
}
return
true
;
}
double
...
...
@@ -392,24 +436,25 @@ void MeasurementComplexItem::save(QJsonArray &planItems) {
for
(
int
i
=
0
;
i
<
_generatorList
.
size
();
++
i
)
{
auto
const
gen
=
_generatorList
[
i
];
auto
const
&
name
=
_generatorNameList
[
i
];
QJsonObject
innerO
bj
;
if
(
!
gen
->
save
(
innerO
bj
))
{
QJsonObject
o
bj
;
if
(
!
gen
->
save
(
o
bj
))
{
qCDebug
(
MeasurementComplexItemLog
)
<<
"save(): not able to save generator: "
<<
name
;
return
;
}
else
{
QJsonObject
outerObj
;
outerObj
[
name
]
=
innerObj
;
generatorArray
.
append
(
outerObj
);
generatorArray
.
append
(
obj
);
}
}
saveObject
[
generatorsKey
]
=
generatorArray
;
// generator index
saveObject
[
generatorIndex
]
=
generatorIndex
();
// Route Variants
QJsonArray
variantsArray
;
for
(
auto
const
&
route
:
_variantVector
)
{
QJsonValue
variant
;
if
(
!
(
route
.
size
()
==
0
)
)
{
if
(
route
.
size
()
>
0
)
{
JsonHelper
::
saveGeoCoordinateArray
(
route
,
false
,
variant
);
}
else
{
JsonHelper
::
saveGeoCoordinateArray
(
_route
,
false
,
variant
);
...
...
@@ -814,19 +859,17 @@ int MeasurementComplexItem::lastSequenceNumber() const {
bool
MeasurementComplexItem
::
addGenerator
(
const
QString
&
name
,
routing
::
GeneratorBase
*
g
)
{
if
(
name
.
isEmpty
())
{
qCDebug
(
MeasurementComplexItemLog
)
<<
"registerGenerator(): empty name string."
;
qCDebug
(
MeasurementComplexItemLog
)
<<
"addGenerator(): empty name string."
;
return
false
;
}
if
(
!
g
)
{
qCDebug
(
MeasurementComplexItemLog
)
<<
"registerGenerator(): empty generator."
;
qCDebug
(
MeasurementComplexItemLog
)
<<
"addGenerator(): empty generator."
;
return
false
;
}
if
(
this
->
_generatorNameList
.
contains
(
name
))
{
qCDebug
(
MeasurementComplexItemLog
)
<<
"
register
Generator(): generator "
qCDebug
(
MeasurementComplexItemLog
)
<<
"
add
Generator(): generator "
"already registered."
;
return
false
;
}
else
{
...
...
@@ -851,8 +894,6 @@ bool MeasurementComplexItem::removeGenerator(const QString &name) {
_setGenerator
(
this
->
_generatorList
.
at
(
index
-
1
));
}
else
{
_setGenerator
(
nullptr
);
qCDebug
(
MeasurementComplexItemLog
)
<<
"unregisterGenerator(): last generator unregistered."
;
}
}
...
...
@@ -864,17 +905,16 @@ bool MeasurementComplexItem::removeGenerator(const QString &name) {
return
true
;
}
else
{
qCDebug
(
MeasurementComplexItemLog
)
<<
"
unregister
Generator(): generator "
<<
name
<<
" not registered."
;
<<
"
remove
Generator(): generator "
<<
name
<<
" not registered."
;
return
false
;
}
}
bool
MeasurementComplexItem
::
removeGenerator
(
int
index
)
{
if
(
index
>
0
&&
index
<
this
->
_generatorNameList
.
size
())
{
if
(
index
>
=
0
&&
index
<
this
->
_generatorNameList
.
size
())
{
return
removeGenerator
(
this
->
_generatorNameList
.
at
(
index
));
}
else
{
qCDebug
(
MeasurementComplexItemLog
)
<<
"unregisterGenerator(): index ("
<<
index
qCDebug
(
MeasurementComplexItemLog
)
<<
"removeGenerator(): index ("
<<
index
<<
") out"
"of bounds ( "
<<
this
->
_generatorList
.
size
()
<<
" )."
;
...
...
@@ -895,7 +935,7 @@ bool MeasurementComplexItem::switchToGenerator(const QString &name) {
}
bool
MeasurementComplexItem
::
switchToGenerator
(
int
index
)
{
if
(
index
>=
0
)
{
if
(
index
>=
0
&&
index
<
_generatorList
.
size
()
)
{
_setGenerator
(
this
->
_generatorList
.
at
(
index
));
return
true
;
}
else
{
...
...
@@ -932,7 +972,7 @@ const routing::GeneratorBase *MeasurementComplexItem::generator() const {
const
routing
::
GeneratorBase
*
MeasurementComplexItem
::
generator
(
int
index
)
const
{
if
(
index
>
0
&&
index
<
_generatorList
.
size
())
{
if
(
index
>
=
0
&&
index
<
_generatorList
.
size
())
{
return
_generatorList
[
index
];
}
else
{
return
nullptr
;
...
...
@@ -940,7 +980,7 @@ MeasurementComplexItem::generator(int index) const {
}
routing
::
GeneratorBase
*
MeasurementComplexItem
::
generator
(
int
index
)
{
if
(
index
>
0
&&
index
<
_generatorList
.
size
())
{
if
(
index
>
=
0
&&
index
<
_generatorList
.
size
())
{
return
_generatorList
[
index
];
}
else
{
return
nullptr
;
...
...
@@ -961,17 +1001,20 @@ void MeasurementComplexItem::startEditing() {
bool
MeasurementComplexItem
::
stopEditing
(
bool
doUpdate
)
{
if
(
editing
())
{
bool
isDifferent
=
*
_pEditorData
!=
*
_pAreaData
;
bool
correct
=
_pEditorData
->
isCorrect
();
if
(
correct
)
{
*
_pAreaData
=
*
_pEditorData
;
}
_setAreaData
(
_pAreaData
);
_setState
(
STATE
::
IDLE
);
if
(
doUpdate
&&
correct
&&
*
_pEditorData
!=
*
_pAreaData
)
{
bool
updated
=
false
;
if
(
doUpdate
&&
correct
&&
isDifferent
)
{
updated
=
true
;
_updateRoute
();
}
return
correct
;
return
updated
;
}
return
false
;
}
...
...
src/MeasurementComplexItem/MeasurementComplexItem.h
View file @
f778e405
...
...
@@ -123,7 +123,9 @@ public:
//! editingStart() if it is invalid. Triggers a route update.
//!
//! \param doUpdate No route update will be triggered if false, route update
//! will eventually be triggered if true. \return Returns true if a route
//! will eventually be triggered if true.
//!
//! \return Returns true if a route
//! update was triggered, false either.
//!
Q_INVOKABLE
bool
stopEditing
(
bool
doUpdate
=
true
);
...
...
@@ -145,7 +147,7 @@ public:
QStringList
variantNames
()
const
;
bool
calculating
()
const
;
bool
editing
()
const
;
bool
editing
()
const
;
// set to true on creation
bool
idle
()
const
;
bool
followTerrain
()
const
;
...
...
src/MeasurementComplexItem/qml/AreaDataEditor.qml
View file @
f778e405
...
...
@@ -23,11 +23,8 @@ GridLayout {
Component.onCompleted
:
{
console
.
assert
(
missionItem
!==
undefined
,
"
please set the missionItem property
"
)
checkedChangedHandler
()
}
onCheckedChanged
:
checkedChangedHandler
()
ExclusiveGroup
{
id
:
areaGroup
}
Repeater
{
...
...
@@ -115,13 +112,5 @@ GridLayout {
_areaData
.
intersection
()
}
}
function
checkedChangedHandler
(){
if
(
_root
.
checked
){
missionItem
.
startEditing
()
}
else
{
missionItem
.
stopEditing
()
}
}
}
src/MeasurementComplexItem/qml/MeasurementItemEditor.qml
View file @
f778e405
...
...
@@ -65,7 +65,7 @@ Rectangle {
Layout.fillWidth
:
true
Layout.columnSpan
:
2
onClicked
:{
areaDataEditor
.
checked
=
true
_missionItem
.
startEditing
()
}
}
...
...
@@ -75,7 +75,7 @@ Rectangle {
visible
:
areaDataEditor
.
visible
onClicked
:
{
if
(
_areaData
.
isCorrect
()){
parameterEditor
.
checked
=
true
_missionItem
.
stopEditing
()
}
}
}
...
...
@@ -86,32 +86,18 @@ Rectangle {
Layout.fillWidth
:
true
onClicked
:{
missionItem
.
abortEditing
()
parameterEditor
.
checked
=
true
}
}
}
// editorSelector
ExclusiveGroup
{
id
:
editorGroup
}
MCI.ParameterEditor
{
id
:
parameterEditor
missionItem
:
_root
.
_missionItem
availableWidth
:
mainColumn
.
width
checked
:
!
_missionItem
.
editing
visible
:
checked
property
ExclusiveGroup
group
:
editorGroup
onGroupChanged
:
{
if
(
group
){
group
.
bindCheckable
(
parameterEditor
)
}
}
Component
.
onCompleted
:
{
checked
=
false
}
}
MCI.AreaDataEditor
{
...
...
@@ -119,19 +105,8 @@ Rectangle {
missionItem
:
_root
.
_missionItem
availableWidth
:
mainColumn
.
width
checked
:
_missionItem
.
editing
visible
:
checked
property
ExclusiveGroup
group
:
editorGroup
onGroupChanged
:
{
if
(
group
){
group
.
bindCheckable
(
areaDataEditor
)
}
}
Component
.
onCompleted
:
{
checked
=
true
}
}
}
// main Column
...
...
src/MeasurementComplexItem/qml/MeasurementItemMapVisual.qml
View file @
f778e405
...
...
@@ -55,9 +55,12 @@ Item {
Component.onCompleted
:
{
console
.
assert
(
map
!=
undefined
,
"
please set the map property
"
)
if
(
!
_missionItem
.
areaData
.
initialized
()){
var
bbox
=
boundingBox
()
_missionItem
.
areaData
.
initialize
(
bbox
[
0
],
bbox
[
1
])
// _addEntryCoordinate()
}
// _addEntryCoordinate()
// _addExitCoordinate()
_addTransects
()
_addGeneratorVisuals
()
...
...
@@ -174,7 +177,7 @@ Item {
// Generator visuals
function
_addGeneratorVisuals
(){
if
(
_generator
.
mapVisualQml
&&
!
_generatorObject
)
{
if
(
_generator
&&
_generator
.
mapVisualQml
&&
!
_generatorObject
)
{
var
component
=
Qt
.
createComponent
(
_generator
.
mapVisualQml
)
if
(
component
.
status
===
Component
.
Error
)
{
console
.
log
(
"
Error loading Qml:
"
,
...
...
src/MeasurementComplexItem/qml/ParameterEditor.qml
View file @
f778e405
...
...
@@ -187,7 +187,7 @@ ColumnLayout {
}
// indicator column
function
_addGeneratorEditor
(){
if
(
_generator
.
editorQml
&&
!
_generatorEditor
)
{
if
(
_generator
&&
_generator
.
editorQml
&&
!
_generatorEditor
)
{
var
component
=
Qt
.
createComponent
(
_generator
.
editorQml
)
if
(
component
.
status
===
Component
.
Error
)
{
console
.
log
(
"
Error loading Qml:
"
,
...
...
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