From 3f1b3bf23575d09bae1c1846ba1de8a4eba5f026 Mon Sep 17 00:00:00 2001 From: DonLakeFlyer Date: Tue, 20 Mar 2018 13:17:40 -0700 Subject: [PATCH] Load KML support --- src/MissionManager/QGCMapPolygon.cc | 11 +++--- src/MissionManager/QGCMapPolyline.cc | 41 ++++++++------------ src/MissionManager/QGCMapPolyline.h | 1 + src/MissionManager/QGCMapPolylineVisuals.qml | 35 ++++++++++++++++- 4 files changed, 55 insertions(+), 33 deletions(-) diff --git a/src/MissionManager/QGCMapPolygon.cc b/src/MissionManager/QGCMapPolygon.cc index 6b607e386..eecb5069d 100644 --- a/src/MissionManager/QGCMapPolygon.cc +++ b/src/MissionManager/QGCMapPolygon.cc @@ -56,9 +56,11 @@ const QGCMapPolygon& QGCMapPolygon::operator=(const QGCMapPolygon& other) clear(); QVariantList vertices = other.path(); - for (int i=0; i()); + QList rgCoord; + foreach (const QVariant& vertexVar, vertices) { + rgCoord.append(vertexVar.value()); } + appendVertices(rgCoord); setDirty(true); @@ -270,7 +272,6 @@ void QGCMapPolygon::appendVertices(const QList& coordinates) emit pathChanged(); } - void QGCMapPolygon::_polygonModelDirtyChanged(bool dirty) { if (dirty) { @@ -447,9 +448,7 @@ void QGCMapPolygon::offset(double distance) // Update internals clear(); - for (int i=0; ishowMessage(tr("Unable to find Polygon node in KML")); + qgcApp()->showMessage(tr("Unable to find LineString node in KML")); return false; } - QDomNode coordinatesNode = rgNodes.item(0).namedItem("outerBoundaryIs").namedItem("LinearRing").namedItem("coordinates"); + QDomNode coordinatesNode = rgNodes.item(0).namedItem("coordinates"); if (coordinatesNode.isNull()) { qgcApp()->showMessage(tr("Internal error: Unable to find coordinates node in KML")); return false; @@ -386,29 +386,8 @@ bool QGCMapPolyline::loadKMLFile(const QString& kmlFile) rgCoords.append(coord); } - // Determine winding, reverse if needed - double sum = 0; - for (int i=0; i rgReversed; - - for (int i=0; i& coordinates) +{ + QList objects; + + foreach (const QGeoCoordinate& coordinate, coordinates) { + objects.append(new QGCQGeoCoordinate(coordinate, this)); + _polylinePath.append(QVariant::fromValue(coordinate)); + } + _polylineModel.append(objects); + emit pathChanged(); +} diff --git a/src/MissionManager/QGCMapPolyline.h b/src/MissionManager/QGCMapPolyline.h index f4ec936b2..08389a041 100644 --- a/src/MissionManager/QGCMapPolyline.h +++ b/src/MissionManager/QGCMapPolyline.h @@ -34,6 +34,7 @@ public: Q_INVOKABLE void clear(void); Q_INVOKABLE void appendVertex(const QGeoCoordinate& coordinate); Q_INVOKABLE void removeVertex(int vertexIndex); + Q_INVOKABLE void appendVertices(const QList& coordinates); /// Adjust the value for the specified coordinate /// @param vertexIndex Polygon point index to modify (0-based) diff --git a/src/MissionManager/QGCMapPolylineVisuals.qml b/src/MissionManager/QGCMapPolylineVisuals.qml index 27f9ed8a7..07a25aee0 100644 --- a/src/MissionManager/QGCMapPolylineVisuals.qml +++ b/src/MissionManager/QGCMapPolylineVisuals.qml @@ -120,13 +120,28 @@ Item { selectExisting: true nameFilters: [ qsTr("KML files (*.kml)") ] - onAcceptedForLoad: { mapPolyline.loadKMLFile(file) close() } } + Menu { + id: menu + + property int removeVertex + + MenuItem { + text: qsTr("Remove vertex" ) + onTriggered: mapPolyline.removeVertex(parent.removeVertex) + } + + MenuItem { + text: qsTr("Load KML...") + onTriggered: kmlLoadDialog.openForLoad() + } + } + Component { id: polylineComponent @@ -227,7 +242,15 @@ Item { } } - onClicked: mapPolyline.removeVertex(polylineVertex) + onClicked: { + if (polylineVertex == 0) { + menu.removeVertex = polylineVertex + menu.popup() + } else { + mapPolyline.removeVertex(polylineVertex) + } + } + } } @@ -249,6 +272,14 @@ Item { radius: width / 2 color: "white" opacity: .90 + + QGCLabel { + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + text: "..." + color: "black" + visible: polylineVertex == 0 + } } } } -- 2.22.0