From 8b4e085eb39ab052700f65457fd9df61180f69bc Mon Sep 17 00:00:00 2001 From: DonLakeFlyer Date: Tue, 13 Mar 2018 08:06:29 -0700 Subject: [PATCH 1/5] Initial grid calc not correct --- src/PlanView/SurveyItemEditor.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/PlanView/SurveyItemEditor.qml b/src/PlanView/SurveyItemEditor.qml index 58fad1c..d5f085a 100644 --- a/src/PlanView/SurveyItemEditor.qml +++ b/src/PlanView/SurveyItemEditor.qml @@ -63,6 +63,7 @@ Rectangle { } } } + recalcFromCameraValues() } function recalcFromCameraValues() { From 0e15ab7d1aec38014a59bf25b5c77eb4ef2ccbe0 Mon Sep 17 00:00:00 2001 From: DonLakeFlyer Date: Tue, 13 Mar 2018 13:09:29 -0700 Subject: [PATCH 2/5] Remove duplicate signals These are defined in PlanManager. Having them here as well causes lost signaling. --- src/MissionManager/MissionManager.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/MissionManager/MissionManager.h b/src/MissionManager/MissionManager.h index e34d6e3..a333678 100644 --- a/src/MissionManager/MissionManager.h +++ b/src/MissionManager/MissionManager.h @@ -38,10 +38,6 @@ public: /// from mission start to resumeIndex in the generate mission. void generateResumeMission(int resumeIndex); -signals: - void currentIndexChanged (int currentIndex); - void lastCurrentIndexChanged (int lastCurrentIndex); - private slots: void _mavlinkMessageReceived(const mavlink_message_t& message); From f622859bfc26e61b75178ed67a45f2de15ca6ac1 Mon Sep 17 00:00:00 2001 From: DonLakeFlyer Date: Tue, 13 Mar 2018 15:40:53 -0700 Subject: [PATCH 3/5] Add support for insert/append of multiple objects at a time For much better performance --- src/QmlControls/QmlObjectListModel.cc | 31 +++++++++++++++++++++++++++++++ src/QmlControls/QmlObjectListModel.h | 14 ++++++++------ 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/QmlControls/QmlObjectListModel.cc b/src/QmlControls/QmlObjectListModel.cc index 1db22e6..f45a6e9 100644 --- a/src/QmlControls/QmlObjectListModel.cc +++ b/src/QmlControls/QmlObjectListModel.cc @@ -172,11 +172,42 @@ void QmlObjectListModel::insert(int i, QObject* object) setDirty(true); } +void QmlObjectListModel::insert(int i, QList objects) +{ + if (i < 0 || i > _objectList.count()) { + qWarning() << "Invalid index index:count" << i << _objectList.count(); + } + + int j = i; + foreach (QObject* object, objects) { + QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership); + + // Look for a dirtyChanged signal on the object + if (object->metaObject()->indexOfSignal(QMetaObject::normalizedSignature("dirtyChanged(bool)")) != -1) { + if (!_skipDirtyFirstItem || j != 0) { + QObject::connect(object, SIGNAL(dirtyChanged(bool)), this, SLOT(_childDirtyChanged(bool))); + } + } + j++; + + _objectList.insert(i, object); + } + + insertRows(i, objects.count()); + + setDirty(true); +} + void QmlObjectListModel::append(QObject* object) { insert(_objectList.count(), object); } +void QmlObjectListModel::append(QList objects) +{ + insert(_objectList.count(), objects); +} + QObjectList QmlObjectListModel::swapObjectList(const QObjectList& newlist) { QObjectList oldlist(_objectList); diff --git a/src/QmlControls/QmlObjectListModel.h b/src/QmlControls/QmlObjectListModel.h index 78a202d..976405e 100644 --- a/src/QmlControls/QmlObjectListModel.h +++ b/src/QmlControls/QmlObjectListModel.h @@ -37,11 +37,13 @@ public: void setDirty(bool dirty); void append(QObject* object); + void append(QList objects); QObjectList swapObjectList(const QObjectList& newlist); void clear(void); QObject* removeAt(int i); QObject* removeOne(QObject* object) { return removeAt(indexOf(object)); } void insert(int i, QObject* object); + void insert(int i, QList objects); QObject* operator[](int i); const QObject* operator[](int i) const; bool contains(QObject* object) { return _objectList.indexOf(object) != -1; } @@ -63,12 +65,12 @@ private slots: private: // Overrides from QAbstractListModel - virtual int rowCount(const QModelIndex & parent = QModelIndex()) const; - virtual QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const; - virtual QHash roleNames(void) const; - virtual bool insertRows(int position, int rows, const QModelIndex &index = QModelIndex()); - virtual bool removeRows(int position, int rows, const QModelIndex &index = QModelIndex()); - virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); + int rowCount(const QModelIndex & parent = QModelIndex()) const override; + QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const override; + QHash roleNames(void) const override; + bool insertRows(int position, int rows, const QModelIndex &index = QModelIndex()) override; + bool removeRows(int position, int rows, const QModelIndex &index = QModelIndex()) override; + bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; private: QList _objectList; From cf1895971c5a933a2b390ec3c562eb10a3fb8904 Mon Sep 17 00:00:00 2001 From: DonLakeFlyer Date: Tue, 13 Mar 2018 15:41:24 -0700 Subject: [PATCH 4/5] Better performance of KML loading --- src/MissionManager/QGCMapPolygon.cc | 17 ++++++++++++++--- src/MissionManager/QGCMapPolygon.h | 1 + 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/MissionManager/QGCMapPolygon.cc b/src/MissionManager/QGCMapPolygon.cc index 18ae00f..8ac2ba1 100644 --- a/src/MissionManager/QGCMapPolygon.cc +++ b/src/MissionManager/QGCMapPolygon.cc @@ -258,6 +258,19 @@ void QGCMapPolygon::appendVertex(const QGeoCoordinate& coordinate) emit pathChanged(); } +void QGCMapPolygon::appendVertices(const QList& coordinates) +{ + QList objects; + + foreach (const QGeoCoordinate& coordinate, coordinates) { + objects.append(new QGCQGeoCoordinate(coordinate, this)); + _polygonPath.append(QVariant::fromValue(coordinate)); + } + _polygonModel.append(objects); + emit pathChanged(); +} + + void QGCMapPolygon::_polygonModelDirtyChanged(bool dirty) { if (dirty) { @@ -509,9 +522,7 @@ bool QGCMapPolygon::loadKMLFile(const QString& kmlFile) } clear(); - for (int i=0; i& coordinates); /// Adjust the value for the specified coordinate /// @param vertexIndex Polygon point index to modify (0-based) From fd4c081db4c6b58c9e2ca1d4c11041bfc8126c40 Mon Sep 17 00:00:00 2001 From: DonLakeFlyer Date: Tue, 13 Mar 2018 15:41:41 -0700 Subject: [PATCH 5/5] New convex polygon transect intersection method --- src/MissionManager/SurveyMissionItem.cc | 88 ++++++++++----------------------- src/MissionManager/SurveyMissionItem.h | 1 - 2 files changed, 25 insertions(+), 64 deletions(-) diff --git a/src/MissionManager/SurveyMissionItem.cc b/src/MissionManager/SurveyMissionItem.cc index 91d2989..80c2367 100644 --- a/src/MissionManager/SurveyMissionItem.cc +++ b/src/MissionManager/SurveyMissionItem.cc @@ -554,53 +554,6 @@ void SurveyMissionItem::_swapPoints(QList& points, int index1, int inde points[index2] = temp; } -QList SurveyMissionItem::_convexPolygon(const QList& polygon) -{ - // We use the Graham scan algorithem to convert the possibly concave polygon to a convex polygon - // https://en.wikipedia.org/wiki/Graham_scan - - QList workPolygon(polygon); - - // First point must be lowest y-coordinate point - for (int i=1; i angle) { - _swapPoints(workPolygon, i, j); - angle = _dp(workPolygon[0], workPolygon[j]); - } - } - } - - // Perform the the Graham scan - - workPolygon.insert(0, workPolygon.last()); // Sentinel for algo stop - int convexCount = 1; // Number of points on the convex hull. - - for (int i=2; i<=polygon.count(); i++) { - while (_ccw(workPolygon[convexCount-1], workPolygon[convexCount], workPolygon[i]) <= 0) { - if (convexCount > 1) { - convexCount -= 1; - } else if (i == polygon.count()) { - break; - } else { - i++; - } - } - convexCount++; - _swapPoints(workPolygon, convexCount, i); - } - - return workPolygon.mid(1, convexCount); -} - /// Returns true if the current grid angle generates north/south oriented transects bool SurveyMissionItem::_gridAngleIsNorthSouthTransects() { @@ -695,8 +648,6 @@ void SurveyMissionItem::_generateGrid(void) qCDebug(SurveyMissionItemLog) << "vertex:x:y" << vertex << polygonPoints.last().x() << polygonPoints.last().y(); } - polygonPoints = _convexPolygon(polygonPoints); - double coveredArea = 0.0; for (int i=0; i& lineList, c void SurveyMissionItem::_intersectLinesWithPolygon(const QList& lineList, const QPolygonF& polygon, QList& resultLines) { resultLines.clear(); + for (int i=0; i intersections; + // Intersect the line with all the polygon edges for (int j=0; j 1) { + QPointF firstPoint; + QPointF secondPoint; + double currentMaxDistance = 0; + + for (int i=0; i currentMaxDistance) { + firstPoint = intersections[i]; + secondPoint = intersections[j]; + currentMaxDistance = newMaxDistance; + } + } + } + + resultLines += QLineF(firstPoint, secondPoint); } } } diff --git a/src/MissionManager/SurveyMissionItem.h b/src/MissionManager/SurveyMissionItem.h index 307042c..92b084f 100644 --- a/src/MissionManager/SurveyMissionItem.h +++ b/src/MissionManager/SurveyMissionItem.h @@ -217,7 +217,6 @@ private: qreal _ccw(QPointF pt1, QPointF pt2, QPointF pt3); qreal _dp(QPointF pt1, QPointF pt2); void _swapPoints(QList& points, int index1, int index2); - QList _convexPolygon(const QList& polygon); void _reverseTransectOrder(QList>& transects); void _reverseInternalTransectPoints(QList>& transects); void _adjustTransectsToEntryPointLocation(QList>& transects);