Commit f55d443a authored by Patrick José Pereira's avatar Patrick José Pereira

Add KML integration

Signed-off-by: 's avatarPatrick José Pereira <patrickelectric@gmail.com>
parent 74eead41
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
****************************************************************************/ ****************************************************************************/
#include "MissionCommandUIInfo.h"
#include "MissionController.h" #include "MissionController.h"
#include "MultiVehicleManager.h" #include "MultiVehicleManager.h"
#include "MissionManager.h" #include "MissionManager.h"
...@@ -25,6 +26,7 @@ ...@@ -25,6 +26,7 @@
#include "MissionSettingsItem.h" #include "MissionSettingsItem.h"
#include "QGCQGeoCoordinate.h" #include "QGCQGeoCoordinate.h"
#include "PlanMasterController.h" #include "PlanMasterController.h"
#include "KML.h"
#ifndef __mobile__ #ifndef __mobile__
#include "MainWindow.h" #include "MainWindow.h"
...@@ -256,6 +258,44 @@ bool MissionController::_convertToMissionItems(QmlObjectListModel* visualMission ...@@ -256,6 +258,44 @@ bool MissionController::_convertToMissionItems(QmlObjectListModel* visualMission
return endActionSet; return endActionSet;
} }
void MissionController::convertToKMLDocument(QDomDocument& document)
{
QJsonObject missionJson;
QmlObjectListModel* visualItems = new QmlObjectListModel();
QList<MissionItem*> missionItens;
QString error;
save(missionJson);
_loadItemsFromJson(missionJson, visualItems, error);
_convertToMissionItems(visualItems, missionItens, this);
float altitude = missionJson[_jsonPlannedHomePositionKey].toArray()[2].toDouble();
QString coord;
QStringList coords;
// Drop home position
bool dropPoint = true;
for(const auto& item : missionItens) {
if(dropPoint) {
dropPoint = false;
continue;
}
const MissionCommandUIInfo* uiInfo = \
qgcApp()->toolbox()->missionCommandTree()->getUIInfo(_controllerVehicle, item->command());
if (uiInfo && uiInfo->specifiesCoordinate() && !uiInfo->isStandaloneCoordinate()) {
coord = QString::number(item->param6()) \
+ "," \
+ QString::number(item->param5()) \
+ "," \
+ QString::number(item->param7() + altitude);
coords.append(coord);
}
}
Kml kml;
kml.points(coords);
kml.save(document);
}
void MissionController::sendItemsToVehicle(Vehicle* vehicle, QmlObjectListModel* visualMissionItems) void MissionController::sendItemsToVehicle(Vehicle* vehicle, QmlObjectListModel* visualMissionItems)
{ {
if (vehicle) { if (vehicle) {
......
...@@ -26,6 +26,7 @@ class MissionSettingsItem; ...@@ -26,6 +26,7 @@ class MissionSettingsItem;
class AppSettings; class AppSettings;
class MissionManager; class MissionManager;
class SimpleMissionItem; class SimpleMissionItem;
class QDomDocument;
Q_DECLARE_LOGGING_CATEGORY(MissionControllerLog) Q_DECLARE_LOGGING_CATEGORY(MissionControllerLog)
...@@ -125,6 +126,9 @@ public: ...@@ -125,6 +126,9 @@ public:
void managerVehicleChanged (Vehicle* managerVehicle) final; void managerVehicleChanged (Vehicle* managerVehicle) final;
bool showPlanFromManagerVehicle (void) final; bool showPlanFromManagerVehicle (void) final;
// Create KML file
void convertToKMLDocument(QDomDocument& document);
// Property accessors // Property accessors
QmlObjectListModel* visualItems (void) { return _visualItems; } QmlObjectListModel* visualItems (void) { return _visualItems; }
......
...@@ -14,7 +14,9 @@ ...@@ -14,7 +14,9 @@
#include "AppSettings.h" #include "AppSettings.h"
#include "JsonHelper.h" #include "JsonHelper.h"
#include "MissionManager.h" #include "MissionManager.h"
#include "KML.h"
#include <QDomDocument>
#include <QJsonDocument> #include <QJsonDocument>
#include <QFileInfo> #include <QFileInfo>
...@@ -372,6 +374,30 @@ void PlanMasterController::saveToFile(const QString& filename) ...@@ -372,6 +374,30 @@ void PlanMasterController::saveToFile(const QString& filename)
} }
} }
void PlanMasterController::saveToKml(const QString& filename)
{
if (filename.isEmpty()) {
return;
}
QString kmlFilename = filename;
if (!QFileInfo(filename).fileName().contains(".")) {
kmlFilename += QString(".%1").arg(kmlFileExtension());
}
QFile file(kmlFilename);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
qgcApp()->showMessage(tr("KML save error %1 : %2").arg(filename).arg(file.errorString()));
} else {
QDomDocument domDocument;
_missionController.convertToKMLDocument(domDocument);
QTextStream stream(&file);
stream << domDocument.toString();
file.close();
}
}
void PlanMasterController::removeAll(void) void PlanMasterController::removeAll(void)
{ {
_missionController.removeAll(); _missionController.removeAll();
...@@ -417,6 +443,11 @@ QString PlanMasterController::fileExtension(void) const ...@@ -417,6 +443,11 @@ QString PlanMasterController::fileExtension(void) const
return AppSettings::planFileExtension; return AppSettings::planFileExtension;
} }
QString PlanMasterController::kmlFileExtension(void) const
{
return AppSettings::kmlFileExtension;
}
QStringList PlanMasterController::loadNameFilters(void) const QStringList PlanMasterController::loadNameFilters(void) const
{ {
QStringList filters; QStringList filters;
...@@ -435,6 +466,14 @@ QStringList PlanMasterController::saveNameFilters(void) const ...@@ -435,6 +466,14 @@ QStringList PlanMasterController::saveNameFilters(void) const
return filters; return filters;
} }
QStringList PlanMasterController::saveKmlFilters(void) const
{
QStringList filters;
filters << tr("KML Files (*.%1)").arg(kmlFileExtension()) << tr("All Files (*.*)");
return filters;
}
void PlanMasterController::sendPlanToVehicle(Vehicle* vehicle, const QString& filename) void PlanMasterController::sendPlanToVehicle(Vehicle* vehicle, const QString& filename)
{ {
// Use a transient PlanMasterController to accomplish this // Use a transient PlanMasterController to accomplish this
......
...@@ -43,6 +43,7 @@ public: ...@@ -43,6 +43,7 @@ public:
///< kml file extension for missions ///< kml file extension for missions
Q_PROPERTY(QStringList loadNameFilters READ loadNameFilters CONSTANT) ///< File filter list loading plan files Q_PROPERTY(QStringList loadNameFilters READ loadNameFilters CONSTANT) ///< File filter list loading plan files
Q_PROPERTY(QStringList saveNameFilters READ saveNameFilters CONSTANT) ///< File filter list saving plan files Q_PROPERTY(QStringList saveNameFilters READ saveNameFilters CONSTANT) ///< File filter list saving plan files
Q_PROPERTY(QStringList saveKmlFilters READ saveKmlFilters CONSTANT) ///< File filter list saving KML files
/// Should be called immediately upon Component.onCompleted. /// Should be called immediately upon Component.onCompleted.
/// @param editMode true: controller being used in Plan view, false: controller being used in Fly view /// @param editMode true: controller being used in Plan view, false: controller being used in Fly view
...@@ -60,6 +61,7 @@ public: ...@@ -60,6 +61,7 @@ public:
Q_INVOKABLE void sendToVehicle(void); Q_INVOKABLE void sendToVehicle(void);
Q_INVOKABLE void loadFromFile(const QString& filename); Q_INVOKABLE void loadFromFile(const QString& filename);
Q_INVOKABLE void saveToFile(const QString& filename); Q_INVOKABLE void saveToFile(const QString& filename);
Q_INVOKABLE void saveToKml(const QString& filename);
Q_INVOKABLE void removeAll(void); ///< Removes all from controller only, synce required to remove from vehicle Q_INVOKABLE void removeAll(void); ///< Removes all from controller only, synce required to remove from vehicle
Q_INVOKABLE void removeAllFromVehicle(void); ///< Removes all from vehicle and controller Q_INVOKABLE void removeAllFromVehicle(void); ///< Removes all from vehicle and controller
...@@ -73,8 +75,10 @@ public: ...@@ -73,8 +75,10 @@ public:
bool dirty (void) const; bool dirty (void) const;
void setDirty (bool dirty); void setDirty (bool dirty);
QString fileExtension (void) const; QString fileExtension (void) const;
QString kmlFileExtension(void) const;
QStringList loadNameFilters (void) const; QStringList loadNameFilters (void) const;
QStringList saveNameFilters (void) const; QStringList saveNameFilters (void) const;
QStringList saveKmlFilters (void) const;
Vehicle* controllerVehicle(void) { return _controllerVehicle; } Vehicle* controllerVehicle(void) { return _controllerVehicle; }
Vehicle* managerVehicle(void) { return _managerVehicle; } Vehicle* managerVehicle(void) { return _managerVehicle; }
......
...@@ -169,6 +169,7 @@ QGCView { ...@@ -169,6 +169,7 @@ QGCView {
function saveToSelectedFile() { function saveToSelectedFile() {
fileDialog.title = qsTr("Save Plan") fileDialog.title = qsTr("Save Plan")
fileDialog.plan = true
fileDialog.selectExisting = false fileDialog.selectExisting = false
fileDialog.nameFilters = masterController.saveNameFilters fileDialog.nameFilters = masterController.saveNameFilters
fileDialog.openForSave() fileDialog.openForSave()
...@@ -177,6 +178,14 @@ QGCView { ...@@ -177,6 +178,14 @@ QGCView {
function fitViewportToItems() { function fitViewportToItems() {
mapFitFunctions.fitMapViewportToMissionItems() mapFitFunctions.fitMapViewportToMissionItems()
} }
function saveKmlToSelectedFile() {
fileDialog.title = qsTr("Save KML")
fileDialog.plan = false
fileDialog.selectExisting = false
fileDialog.nameFilters = masterController.saveKmlFilters
fileDialog.openForSave()
}
} }
Connections { Connections {
...@@ -228,12 +237,13 @@ QGCView { ...@@ -228,12 +237,13 @@ QGCView {
QGCFileDialog { QGCFileDialog {
id: fileDialog id: fileDialog
qgcView: _qgcView qgcView: _qgcView
property var plan: true
folder: QGroundControl.settingsManager.appSettings.missionSavePath folder: QGroundControl.settingsManager.appSettings.missionSavePath
fileExtension: QGroundControl.settingsManager.appSettings.planFileExtension fileExtension: QGroundControl.settingsManager.appSettings.planFileExtension
fileExtension2: QGroundControl.settingsManager.appSettings.missionFileExtension fileExtension2: QGroundControl.settingsManager.appSettings.missionFileExtension
onAcceptedForSave: { onAcceptedForSave: {
masterController.saveToFile(file) plan ? masterController.saveToFile(file) : masterController.saveToKml(file)
close() close()
} }
...@@ -792,6 +802,16 @@ QGCView { ...@@ -792,6 +802,16 @@ QGCView {
_qgcView.showDialog(removeAllPromptDialog, qsTr("Remove all"), _qgcView.showDialogDefaultWidth, StandardButton.Yes | StandardButton.No) _qgcView.showDialog(removeAllPromptDialog, qsTr("Remove all"), _qgcView.showDialogDefaultWidth, StandardButton.Yes | StandardButton.No)
} }
} }
QGCButton {
text: qsTr("Save KML...")
Layout.fillWidth: true
enabled: !masterController.syncInProgress
onClicked: {
dropPanel.hide()
masterController.saveKmlToSelectedFile()
}
}
} }
} }
} }
......
...@@ -44,6 +44,7 @@ const char* AppSettings::waypointsFileExtension = "waypoints"; ...@@ -44,6 +44,7 @@ const char* AppSettings::waypointsFileExtension = "waypoints";
const char* AppSettings::fenceFileExtension = "fence"; const char* AppSettings::fenceFileExtension = "fence";
const char* AppSettings::rallyPointFileExtension = "rally"; const char* AppSettings::rallyPointFileExtension = "rally";
const char* AppSettings::telemetryFileExtension = "tlog"; const char* AppSettings::telemetryFileExtension = "tlog";
const char* AppSettings::kmlFileExtension = "kml";
const char* AppSettings::logFileExtension = "ulg"; const char* AppSettings::logFileExtension = "ulg";
const char* AppSettings::parameterDirectory = "Parameters"; const char* AppSettings::parameterDirectory = "Parameters";
......
...@@ -52,6 +52,7 @@ public: ...@@ -52,6 +52,7 @@ public:
Q_PROPERTY(QString waypointsFileExtension MEMBER waypointsFileExtension CONSTANT) Q_PROPERTY(QString waypointsFileExtension MEMBER waypointsFileExtension CONSTANT)
Q_PROPERTY(QString parameterFileExtension MEMBER parameterFileExtension CONSTANT) Q_PROPERTY(QString parameterFileExtension MEMBER parameterFileExtension CONSTANT)
Q_PROPERTY(QString telemetryFileExtension MEMBER telemetryFileExtension CONSTANT) Q_PROPERTY(QString telemetryFileExtension MEMBER telemetryFileExtension CONSTANT)
Q_PROPERTY(QString kmlFileExtension MEMBER kmlFileExtension CONSTANT)
Q_PROPERTY(QString logFileExtension MEMBER logFileExtension CONSTANT) Q_PROPERTY(QString logFileExtension MEMBER logFileExtension CONSTANT)
Fact* offlineEditingFirmwareType (void); Fact* offlineEditingFirmwareType (void);
...@@ -115,6 +116,7 @@ public: ...@@ -115,6 +116,7 @@ public:
static const char* fenceFileExtension; static const char* fenceFileExtension;
static const char* rallyPointFileExtension; static const char* rallyPointFileExtension;
static const char* telemetryFileExtension; static const char* telemetryFileExtension;
static const char* kmlFileExtension;
static const char* logFileExtension; static const char* logFileExtension;
// Child directories of savePath for specific file types // Child directories of savePath for specific file types
......
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