QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
KMLPlanDomDocument.cc
Go to the documentation of this file.
2#include "QGCPalette.h"
3#include "QGCApplication.h"
6#include "MissionItem.h"
7#include "FactMetaData.h"
9#include "Vehicle.h"
10#include "QmlObjectListModel.h"
11
13 : KMLDomDocument(QStringLiteral("%1 Plan KML").arg(QCoreApplication::applicationName()))
14{
15 _addStyles();
16}
17
18void KMLPlanDomDocument::_addFlightPath(Vehicle* vehicle, QList<MissionItem*> rgMissionItems)
19{
20 if (rgMissionItems.count() == 0) {
21 return;
22 }
23
24 QDomElement itemFolderElement = addFolder("Items");
25
26 QDomElement flightPathElement = createElement("Placemark");
27 _rootDocumentElement.appendChild(flightPathElement);
28
29 addTextElement(flightPathElement, "styleUrl", QStringLiteral("#%1").arg(_missionLineStyleName));
30 addTextElement(flightPathElement, "name", "Flight Path");
31 addTextElement(flightPathElement, "visibility", "1");
32 addLookAt(flightPathElement, rgMissionItems[0]->coordinate());
33
34 // Build up the mission trajectory line coords
35 QList<QGeoCoordinate> rgFlightCoords;
36 QGeoCoordinate homeCoord = rgMissionItems[0]->coordinate();
37 for (const MissionItem* item : rgMissionItems) {
39 if (uiInfo) {
40 double altAdjustment = item->frame() == MAV_FRAME_GLOBAL ? 0 : homeCoord.altitude(); // Used to convert to amsl
41 if (uiInfo->isTakeoffCommand() && !vehicle->fixedWing()) {
42 // These takeoff items go straight up from home position to specified altitude
43 QGeoCoordinate coord = homeCoord;
44 coord.setAltitude(item->param7() + altAdjustment);
45 rgFlightCoords += coord;
46 }
47 if (uiInfo->specifiesCoordinate()) {
48 QGeoCoordinate coord = item->coordinate();
49 coord.setAltitude(coord.altitude() + altAdjustment); // convert to amsl
50
51 if (!uiInfo->isStandaloneCoordinate()) {
52 // Flight path goes through this item
53 rgFlightCoords += coord;
54 }
55
56 // Add a place mark for each WP
57
58 QDomElement wpPlacemarkElement = createElement("Placemark");
59 addTextElement(wpPlacemarkElement, "name", QStringLiteral("%1 %2").arg(QString::number(item->sequenceNumber())).arg(item->command() == MAV_CMD_NAV_WAYPOINT ? "" : uiInfo->friendlyName()));
60 addTextElement(wpPlacemarkElement, "styleUrl", QStringLiteral("#%1").arg(balloonStyleName));
61
62 QString htmlString;
63 htmlString += QStringLiteral("Index: %1\n").arg(item->sequenceNumber());
64 htmlString += uiInfo->friendlyName() + "\n";
65 htmlString += QStringLiteral("Alt AMSL: %1 %2\n").arg(QString::number(FactMetaData::metersToAppSettingsVerticalDistanceUnits(coord.altitude()).toDouble(), 'f', 2)).arg(FactMetaData::appSettingsVerticalDistanceUnitsString());
66 htmlString += QStringLiteral("Alt Rel: %1 %2\n").arg(QString::number(FactMetaData::metersToAppSettingsVerticalDistanceUnits(coord.altitude() - homeCoord.altitude()).toDouble(), 'f', 2)).arg(FactMetaData::appSettingsVerticalDistanceUnitsString());
67 htmlString += QStringLiteral("Lat: %1\n").arg(QString::number(coord.latitude(), 'f', 7));
68 htmlString += QStringLiteral("Lon: %1\n").arg(QString::number(coord.longitude(), 'f', 7));
69 addDescription(wpPlacemarkElement, htmlString);
70 (void) addPoint(wpPlacemarkElement, coord);
71 (void) itemFolderElement.appendChild(wpPlacemarkElement);
72 }
73 }
74 }
75
76 (void) addLineString(flightPathElement, rgFlightCoords);
77}
78
79void KMLPlanDomDocument::_addComplexItems(QmlObjectListModel* visualItems)
80{
81 for (int i=0; i<visualItems->count(); i++) {
82 ComplexMissionItem* complexItem = visualItems->value<ComplexMissionItem*>(i);
83 if (complexItem) {
84 complexItem->addKMLVisuals(*this);
85 }
86 }
87}
88
89void KMLPlanDomDocument::addMission(Vehicle* vehicle, QmlObjectListModel* visualItems, QList<MissionItem*> rgMissionItems)
90{
91 _addFlightPath(vehicle, rgMissionItems);
92 _addComplexItems(visualItems);
93}
94
95void KMLPlanDomDocument::_addStyles(void)
96{
97 QGCPalette palette;
98
99 QDomElement missionLineStyle = addStyle(_missionLineStyleName);
100 addLineStyle(missionLineStyle, palette.mapMissionTrajectory(), 4);
101
102 QDomElement surveyStyle = addStyle(surveyPolygonStyleName);
103 addPolyStyle(surveyStyle, palette.surveyPolygonInterior(), 0.5);
104 addLineStyle(surveyStyle, palette.surveyPolygonInterior(), 1, 0.5);
105}
virtual void addKMLVisuals(KMLPlanDomDocument &domDocument)
static QVariant metersToAppSettingsVerticalDistanceUnits(const QVariant &meters)
Converts from meters to the user specified vertical distance unit.
static QString appSettingsVerticalDistanceUnitsString()
Returns the string for vertical distance units which has configued by user.
Used to convert a Plan to a KML document.
void addPolyStyle(QDomElement &styleElement, const QColor &color, double opacity=1.0)
void addLineStyle(QDomElement &styleElement, const QColor &color, int width=1, double opacity=1.0)
void addLookAt(QDomElement &parentElement, const QGeoCoordinate &coord)
QDomElement _rootDocumentElement
QDomElement addFolder(const QString &name)
QDomElement addLineString(QDomElement &parent, const QList< QGeoCoordinate > &coords, const QString &altitudeMode=QLatin1String("absolute"), bool extrude=true, bool tessellate=true)
QDomElement addPoint(QDomElement &parent, const QGeoCoordinate &coord, const QString &altitudeMode=QLatin1String("absolute"), bool extrude=true)
void addTextElement(QDomElement &parentElement, const QString &name, const QString &value)
void addDescription(QDomElement &parent, const QString &content)
static constexpr const char * balloonStyleName
QDomElement addStyle(const QString &id)
void addMission(Vehicle *vehicle, QmlObjectListModel *visualItems, QList< MissionItem * > rgMissionItems)
static constexpr const char * surveyPolygonStyleName
static MissionCommandTree * instance()
const MissionCommandUIInfo * getUIInfo(Vehicle *vehicle, QGCMAVLink::VehicleClass_t vtolMode, MAV_CMD command)
bool isTakeoffCommand(void) const
QString friendlyName(void) const
bool specifiesCoordinate(void) const
bool isStandaloneCoordinate(void) const
T value(int index) const
int count() const override final
bool fixedWing() const
Definition Vehicle.cc:1844