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