Commit 5d91598d authored by Valentin Platzgummer's avatar Valentin Platzgummer

service area depot issue solved.

parent 0397d607
...@@ -10,56 +10,60 @@ ...@@ -10,56 +10,60 @@
#ifndef QGCMapPolygon_H #ifndef QGCMapPolygon_H
#define QGCMapPolygon_H #define QGCMapPolygon_H
#include <QObject>
#include <QGeoCoordinate> #include <QGeoCoordinate>
#include <QVariantList> #include <QObject>
#include <QPolygon> #include <QPolygon>
#include <QVariantList>
#include "QmlObjectListModel.h" #include "QmlObjectListModel.h"
/// The QGCMapPolygon class provides a polygon which can be displayed on a map using a map visuals control. /// The QGCMapPolygon class provides a polygon which can be displayed on a map
/// It maintains a representation of the polygon on QVariantList and QmlObjectListModel format. /// using a map visuals control. It maintains a representation of the polygon on
class QGCMapPolygon : public QObject /// QVariantList and QmlObjectListModel format.
{ class QGCMapPolygon : public QObject {
Q_OBJECT Q_OBJECT
public: public:
QGCMapPolygon(QObject* parent = nullptr); QGCMapPolygon(QObject *parent = nullptr);
QGCMapPolygon(const QGCMapPolygon& other, QObject* parent = nullptr); QGCMapPolygon(const QGCMapPolygon &other, QObject *parent = nullptr);
const QGCMapPolygon& operator=(const QGCMapPolygon& other); const QGCMapPolygon &operator=(const QGCMapPolygon &other);
Q_PROPERTY(int count READ count NOTIFY countChanged) Q_PROPERTY(int count READ count NOTIFY countChanged)
Q_PROPERTY(QVariantList path READ path NOTIFY pathChanged) Q_PROPERTY(QVariantList path READ path NOTIFY pathChanged)
Q_PROPERTY(QmlObjectListModel* pathModel READ qmlPathModel CONSTANT) Q_PROPERTY(QmlObjectListModel *pathModel READ qmlPathModel CONSTANT)
Q_PROPERTY(bool dirty READ dirty WRITE setDirty NOTIFY dirtyChanged) Q_PROPERTY(bool dirty READ dirty WRITE setDirty NOTIFY dirtyChanged)
Q_PROPERTY(QGeoCoordinate center READ center WRITE setCenter NOTIFY centerChanged) Q_PROPERTY(
Q_PROPERTY(bool centerDrag READ centerDrag WRITE setCenterDrag NOTIFY centerDragChanged) QGeoCoordinate center READ center WRITE setCenter NOTIFY centerChanged)
Q_PROPERTY(bool interactive READ interactive WRITE setInteractive NOTIFY interactiveChanged) Q_PROPERTY(bool centerDrag READ centerDrag WRITE setCenterDrag NOTIFY
centerDragChanged)
Q_PROPERTY(bool interactive READ interactive WRITE setInteractive NOTIFY
interactiveChanged)
Q_PROPERTY(double area READ area NOTIFY areaChanged) Q_PROPERTY(double area READ area NOTIFY areaChanged)
Q_INVOKABLE void clear(void); Q_INVOKABLE void clear(void);
Q_INVOKABLE void appendVertex(const QGeoCoordinate& coordinate); Q_INVOKABLE void appendVertex(const QGeoCoordinate &coordinate);
Q_INVOKABLE void removeVertex(int vertexIndex); Q_INVOKABLE void removeVertex(int vertexIndex);
Q_INVOKABLE void appendVertices(const QList<QGeoCoordinate>& coordinates); Q_INVOKABLE void appendVertices(const QList<QGeoCoordinate> &coordinates);
/// Adjust the value for the specified coordinate /// Adjust the value for the specified coordinate
/// @param vertexIndex Polygon point index to modify (0-based) /// @param vertexIndex Polygon point index to modify (0-based)
/// @param coordinate New coordinate for point /// @param coordinate New coordinate for point
Q_INVOKABLE void adjustVertex(int vertexIndex, const QGeoCoordinate coordinate); Q_INVOKABLE void adjustVertex(int vertexIndex,
const QGeoCoordinate coordinate);
/// Splits the segment comprised of vertextIndex -> vertexIndex + 1 /// Splits the segment comprised of vertextIndex -> vertexIndex + 1
Q_INVOKABLE void splitPolygonSegment(int vertexIndex); Q_INVOKABLE void splitPolygonSegment(int vertexIndex);
/// Returns true if the specified coordinate is within the polygon /// Returns true if the specified coordinate is within the polygon
Q_INVOKABLE bool containsCoordinate(const QGeoCoordinate& coordinate) const; Q_INVOKABLE bool containsCoordinate(const QGeoCoordinate &coordinate) const;
/// Offsets the current polygon edges by the specified distance in meters /// Offsets the current polygon edges by the specified distance in meters
Q_INVOKABLE void offset(double distance); Q_INVOKABLE void offset(double distance);
/// Loads a polygon from a KML/SH{ file /// Loads a polygon from a KML/SH{ file
/// @return true: success /// @return true: success
Q_INVOKABLE bool loadKMLOrSHPFile(const QString& file); Q_INVOKABLE bool loadKMLOrSHPFile(const QString &file);
/// Returns the path in a list of QGeoCoordinate's format /// Returns the path in a list of QGeoCoordinate's format
QList<QGeoCoordinate> coordinateList(void) const; QList<QGeoCoordinate> coordinateList(void) const;
...@@ -72,14 +76,15 @@ public: ...@@ -72,14 +76,15 @@ public:
/// Saves the polygon to the json object. /// Saves the polygon to the json object.
/// @param json Json object to save to /// @param json Json object to save to
void saveToJson(QJsonObject& json); void saveToJson(QJsonObject &json);
/// Load a polygon from json /// Load a polygon from json
/// @param json Json object to load from /// @param json Json object to load from
/// @param required true: no polygon in object will generate error /// @param required true: no polygon in object will generate error
/// @param errorString Error string if return is false /// @param errorString Error string if return is false
/// @return true: success, false: failure (errorString set) /// @return true: success, false: failure (errorString set)
bool loadFromJson(const QJsonObject& json, bool required, QString& errorString); bool loadFromJson(const QJsonObject &json, bool required,
QString &errorString);
/// Convert polygon to NED and return (D is ignored) /// Convert polygon to NED and return (D is ignored)
QList<QPointF> nedPolygon(void) const; QList<QPointF> nedPolygon(void) const;
...@@ -89,52 +94,53 @@ public: ...@@ -89,52 +94,53 @@ public:
// Property methods // Property methods
int count (void) const { return _polygonPath.count(); } int count(void) const { return _polygonPath.count(); }
bool dirty (void) const { return _dirty; } bool dirty(void) const { return _dirty; }
void setDirty (bool dirty); void setDirty(bool dirty);
QGeoCoordinate center (void) const { return _center; } QGeoCoordinate center(void) const { return _center; }
bool centerDrag (void) const { return _centerDrag; } bool centerDrag(void) const { return _centerDrag; }
bool interactive (void) const { return _interactive; } bool interactive(void) const { return _interactive; }
QVariantList path (void) const { return _polygonPath; } QVariantList path(void) const { return _polygonPath; }
QmlObjectListModel* qmlPathModel(void) { return &_polygonModel; } const QVariantList &pathReference(void) const { return _polygonPath; }
QmlObjectListModel& pathModel (void) { return _polygonModel; } QmlObjectListModel *qmlPathModel(void) { return &_polygonModel; }
QmlObjectListModel &pathModel(void) { return _polygonModel; }
// Friends // Friends
friend void print(const QGCMapPolygon& poly, QString& outputString); friend void print(const QGCMapPolygon &poly, QString &outputString);
friend void print(const QGCMapPolygon& poly); friend void print(const QGCMapPolygon &poly);
// static Variables // static Variables
static const char* jsonPolygonKey; static const char *jsonPolygonKey;
signals: signals:
void countChanged (int count); void countChanged(int count);
void pathChanged (void); void pathChanged(void);
void dirtyChanged (bool dirty); void dirtyChanged(bool dirty);
void cleared (void); void cleared(void);
void centerChanged (QGeoCoordinate center); void centerChanged(QGeoCoordinate center);
void centerDragChanged (bool centerDrag); void centerDragChanged(bool centerDrag);
void interactiveChanged (bool interactive); void interactiveChanged(bool interactive);
void areaChanged (void); void areaChanged(void);
public slots: public slots:
void setPath (const QList<QGeoCoordinate>& path); void setPath(const QList<QGeoCoordinate> &path);
void setPath (const QVector<QGeoCoordinate>& path); void setPath(const QVector<QGeoCoordinate> &path);
void setPath (const QVariantList& path); void setPath(const QVariantList &path);
void setCenter (QGeoCoordinate newCenter); void setCenter(QGeoCoordinate newCenter);
void setCenterDrag (bool centerDrag); void setCenterDrag(bool centerDrag);
void setInteractive (bool interactive); void setInteractive(bool interactive);
private slots: private slots:
void _polygonModelCountChanged (int count); void _polygonModelCountChanged(int count);
void _polygonModelDirtyChanged (bool dirty); void _polygonModelDirtyChanged(bool dirty);
void _updateCenter (void); void _updateCenter(void);
private: private:
void _init(void); void _init(void);
QPolygonF _toPolygonF(void) const; QPolygonF _toPolygonF(void) const;
QGeoCoordinate _coordFromPointF(const QPointF& point) const; QGeoCoordinate _coordFromPointF(const QPointF &point) const;
QPointF _pointFFromCoord(const QGeoCoordinate& coordinate) const; QPointF _pointFFromCoord(const QGeoCoordinate &coordinate) const;
QVariantList _polygonPath; QVariantList _polygonPath;
QmlObjectListModel _polygonModel; QmlObjectListModel _polygonModel;
......
...@@ -23,10 +23,16 @@ WimaServiceArea &WimaServiceArea::operator=(const WimaServiceArea &other) { ...@@ -23,10 +23,16 @@ WimaServiceArea &WimaServiceArea::operator=(const WimaServiceArea &other) {
return *this; return *this;
} }
const QGeoCoordinate &WimaServiceArea::depot() const { return _depot; }
QGeoCoordinate WimaServiceArea::depotQml() const { return _depot; }
bool WimaServiceArea::setDepot(const QGeoCoordinate &coordinate) { bool WimaServiceArea::setDepot(const QGeoCoordinate &coordinate) {
if (_depot != coordinate) { if (_depot.latitude() != coordinate.latitude() ||
_depot.longitude() != coordinate.longitude()) {
if (this->containsCoordinate(coordinate)) { if (this->containsCoordinate(coordinate)) {
_depot = coordinate; _depot = coordinate;
_depot.setAltitude(0);
emit depotChanged(); emit depotChanged();
return true; return true;
} }
...@@ -90,7 +96,27 @@ void WimaServiceArea::init() { ...@@ -90,7 +96,27 @@ void WimaServiceArea::init() {
this->setObjectName(wimaServiceAreaName); this->setObjectName(wimaServiceAreaName);
connect(this, &WimaArea::pathChanged, [this] { connect(this, &WimaArea::pathChanged, [this] {
if (!this->_depot.isValid() || !this->containsCoordinate(this->_depot)) { if (!this->_depot.isValid() || !this->containsCoordinate(this->_depot)) {
if (this->containsCoordinate(this->center())) {
// Use center.
this->setDepot(this->center()); this->setDepot(this->center());
} else if (this->_depot.isValid()) {
// Use nearest coordinate.
auto minDist = std::numeric_limits<double>::infinity();
auto minIt = this->pathReference().begin();
for (auto it = this->pathReference().begin();
it < this->pathReference().end(); ++it) {
const auto vertex = it->value<QGeoCoordinate>();
auto d = vertex.distanceTo(this->_depot);
if (d < minDist) {
minDist = d;
minIt = it;
}
}
this->setDepot(minIt->value<QGeoCoordinate>());
} else if (this->pathReference().size() > 0) {
// Use first coordinate.
this->setDepot(this->pathReference().value(0).value<QGeoCoordinate>());
}
} }
}); });
} }
...@@ -11,14 +11,16 @@ public: ...@@ -11,14 +11,16 @@ public:
WimaServiceArea(const WimaServiceArea &other, QObject *parent); WimaServiceArea(const WimaServiceArea &other, QObject *parent);
WimaServiceArea &operator=(const WimaServiceArea &other); WimaServiceArea &operator=(const WimaServiceArea &other);
Q_PROPERTY(QGeoCoordinate depot READ depot WRITE setDepot NOTIFY depotChanged) Q_PROPERTY(
QGeoCoordinate depot READ depotQml WRITE setDepot NOTIFY depotChanged)
// Overrides from WimaPolygon // Overrides from WimaPolygon
QString mapVisualQML(void) const { return "WimaServiceAreaMapVisual.qml"; } QString mapVisualQML(void) const { return "WimaServiceAreaMapVisual.qml"; }
QString editorQML(void) const { return "WimaServiceAreaEditor.qml"; } QString editorQML(void) const { return "WimaServiceAreaEditor.qml"; }
// Property acessors // Property acessors
const QGeoCoordinate &depot(void) const { return _depot; } const QGeoCoordinate &depot(void) const;
QGeoCoordinate depotQml(void) const;
// Member Methodes // Member Methodes
void saveToJson(QJsonObject &json); void saveToJson(QJsonObject &json);
......
...@@ -7,12 +7,12 @@ WaypointManager::EmptyManager::EmptyManager(Settings &settings, AreaInterface &) ...@@ -7,12 +7,12 @@ WaypointManager::EmptyManager::EmptyManager(Settings &settings, AreaInterface &)
void WaypointManager::EmptyManager::clear() {} void WaypointManager::EmptyManager::clear() {}
bool WaypointManager::EmptyManager::update() {} bool WaypointManager::EmptyManager::update() { return true; }
bool WaypointManager::EmptyManager::next() {} bool WaypointManager::EmptyManager::next() { return true; }
bool WaypointManager::EmptyManager::previous() {} bool WaypointManager::EmptyManager::previous() { return true; }
bool WaypointManager::EmptyManager::reset() {} bool WaypointManager::EmptyManager::reset() { return true; }
} // namespace WaypointManager } // namespace WaypointManager
...@@ -29,10 +29,8 @@ Item { ...@@ -29,10 +29,8 @@ Item {
property bool checked property bool checked
property string label: "Reference" property string label: "Reference"
property var _itemVisual property var _itemVisual: undefined
property bool _itemVisualShowing: false property var _dragArea: undefined
property var _dragArea
property bool _dragAreaShowing: false
signal clicked() signal clicked()
signal released() signal released()
...@@ -45,31 +43,30 @@ Item { ...@@ -45,31 +43,30 @@ Item {
signal dragReleased() signal dragReleased()
function hideItemVisuals() { function hideItemVisuals() {
if (_itemVisualShowing) { if (_itemVisual) {
map.removeMapItem(_itemVisual)
_itemVisual.destroy() _itemVisual.destroy()
_itemVisualShowing = false _itemVisual = undefined
} }
} }
function showItemVisuals() { function showItemVisuals() {
if (!_itemVisualShowing) { if (!_itemVisual) {
_itemVisual = indicatorComponent.createObject(map) _itemVisual = indicatorComponent.createObject(map)
map.addMapItem(_itemVisual) map.addMapItem(_itemVisual)
_itemVisualShowing = true
} }
} }
function hideDragArea() { function hideDragArea() {
if (_dragAreaShowing) { if (_dragArea) {
_dragArea.destroy() _dragArea.destroy()
_dragAreaShowing = false _dragArea = undefined
} }
} }
function showDragArea() { function showDragArea() {
if (!_dragAreaShowing) { if (!_dragArea) {
_dragArea = dragAreaComponent.createObject(map) _dragArea = dragAreaComponent.createObject(map)
_dragAreaShowing = true
} }
} }
...@@ -102,7 +99,9 @@ Item { ...@@ -102,7 +99,9 @@ Item {
itemIndicator: _itemVisual itemIndicator: _itemVisual
Component.onCompleted: itemCoordinate = _root.coordinate Component.onCompleted: itemCoordinate = _root.coordinate
onItemCoordinateChanged: _root.coordinate = itemCoordinate onItemCoordinateChanged: {
_root.coordinate = itemCoordinate
}
onDragStart: _root.dragStart() onDragStart: _root.dragStart()
onDragStop: _root.dragStop() onDragStop: _root.dragStop()
......
...@@ -26,35 +26,32 @@ Item { ...@@ -26,35 +26,32 @@ Item {
property var areaItem: object property var areaItem: object
property var _polygon: areaItem property var _polygon: areaItem
property var _depot property var _depot: undefined
property bool showDepot: areaItem.interactive || areaItem.borderPolygon.interactive property bool _showDepot: areaItem.interactive || areaItem.borderPolygon.interactive
property bool _depotVisible: false
onShowDepotChanged: { on_ShowDepotChanged: {
if (showDepot){ if (_showDepot){
if (!_depotVisible){
_addDepot() _addDepot()
}
} else { } else {
if (_depotVisible){
_destroyDepot() _destroyDepot()
} }
} }
}
signal clicked(int sequenceNumber) signal clicked(int sequenceNumber)
function _addDepot() { function _addDepot() {
_depot = depotPointComponent.createObject(map) if (!_depot){
_depot = depotPointComponent.createObject(_root)
map.addMapItem(_depot) map.addMapItem(_depot)
_depotVisible = true }
} }
function _destroyDepot() { function _destroyDepot() {
if (_depot){ if (_depot){
map.removeMapItem(_depot)
_depot.destroy() _depot.destroy()
_depot = undefined
} }
_depotVisible = false
} }
/// Add an initial 4 sided polygon if there is none /// Add an initial 4 sided polygon if there is none
...@@ -104,7 +101,7 @@ Item { ...@@ -104,7 +101,7 @@ Item {
Component.onCompleted: { Component.onCompleted: {
_addInitialPolygon() _addInitialPolygon()
if (showDepot){ if (_showDepot){
_addDepot() _addDepot()
} }
} }
...@@ -137,21 +134,33 @@ Item { ...@@ -137,21 +134,33 @@ Item {
Component { Component {
id: depotPointComponent id: depotPointComponent
DragCoordinate { DragCoordinate {
property var depot: areaItem.depot property var depot: _root.areaItem.depot
map: _root.map map: _root.map
qgcView: _root.qgcView qgcView: _root.qgcView
z: QGroundControl.zOrderMapItems z: QGroundControl.zOrderMapItems
checked: showDepot checked: _root._showDepot
coordinate: depot coordinate: _root.areaItem.depot
label: "Depot" label: "Depot"
function syncAndBind(){
if (coordinate.latitude !== depot.latitude ||
coordinate.longitude !== depot.longitude){
if (_root.areaItem.containsCoordinate(coordinate)){
_root.areaItem.depot = coordinate
}
}
coordinate = Qt.binding(function(){return _root.areaItem.depot})
}
onDragReleased: { onDragReleased: {
if (areaItem.containsCoordinate(coordinate)){ syncAndBind()
areaItem.depot = coordinate
} }
coordinate = Qt.binding(function() { return areaItem.depot; })
Component.onCompleted: {
syncAndBind()
} }
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment