QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
SurveyComplexItem.h
Go to the documentation of this file.
1#pragma once
2
4#include "SettingsFact.h"
5
7class MissionItem;
8
10{
11 Q_OBJECT
12
13public:
16 SurveyComplexItem(PlanMasterController* masterController, bool flyView, const QString& kmlOrShpFile);
17
18 Q_PROPERTY(Fact* gridAngle READ gridAngle CONSTANT)
19 Q_PROPERTY(Fact* flyAlternateTransects READ flyAlternateTransects CONSTANT)
20 Q_PROPERTY(Fact* splitConcavePolygons READ splitConcavePolygons CONSTANT)
21 Q_PROPERTY(QGeoCoordinate centerCoordinate READ centerCoordinate WRITE setCenterCoordinate)
22
23 Fact* gridAngle (void) { return &_gridAngleFact; }
24 Fact* flyAlternateTransects (void) { return &_flyAlternateTransectsFact; }
25 Fact* splitConcavePolygons (void) { return &_splitConcavePolygonsFact; }
26
27 Q_INVOKABLE void rotateEntryPoint(void);
28
29 // Overrides from ComplexMissionItem
30 QString patternName (void) const final { return tr(canonicalName); }
31 void applyPreviousAltitudeFrame(QGroundControlQmlGlobal::AltitudeFrame prevAltFrame, double prevAltitude) final;
32 bool load (const QJsonObject& complexObject, int sequenceNumber, QString& errorString) final;
33 QString mapVisualQML (void) const final { return QStringLiteral("SurveyMapVisual.qml"); }
34 QString presetsSettingsGroup(void) { return settingsGroup; }
35 void savePreset (const QString& name);
36 void loadPreset (const QString& name);
37 bool isSurveyItem (void) const final { return true; }
38 QGeoCoordinate centerCoordinate (void) const { return _surveyAreaPolygon.center(); }
40
41 // Overrides from TransectStyleComplexItem
42 void save (QJsonArray& planItems) final;
43 bool specifiesCoordinate (void) const final { return true; }
44 double timeBetweenShots (void) final;
45
46 // Overrides from VisualMissionionItem
47 QString commandDescription (void) const final { return tr("Survey"); }
48 QString commandName (void) const final { return tr("Survey"); }
49 QString abbreviation (void) const final { return tr("S"); }
50 ReadyForSaveState readyForSaveState (void) const final;
51 double additionalTimeDelay (void) const final;
52
53 // Must match json spec for GridEntryLocation
62
63 static constexpr const char* canonicalName = QT_TR_NOOP("Survey");
64
65 static constexpr const char* jsonComplexItemTypeValue = "survey";
66 static constexpr const char* jsonV3ComplexItemTypeValue = "survey";
67
68 static constexpr const char* settingsGroup = "Survey";
69 static constexpr const char* gridAngleName = "GridAngle";
70 static constexpr const char* gridEntryLocationName = "GridEntryLocation";
71 static constexpr const char* flyAlternateTransectsName = "FlyAlternateTransects";
72 static constexpr const char* splitConcavePolygonsName = "SplitConcavePolygons";
73
74signals:
76
77private slots:
78 void _updateWizardMode (void);
79
80 // Overrides from TransectStyleComplexItem
81 void _rebuildTransectsPhase1 (void) final;
82 void _recalcCameraShots (void) final;
83
84private:
85 enum CameraTriggerCode {
86 CameraTriggerNone,
87 CameraTriggerOn,
88 CameraTriggerOff,
89 CameraTriggerHoverAndCapture
90 };
91
92 QPointF _rotatePoint(const QPointF& point, const QPointF& origin, double angle);
93 void _intersectLinesWithRect(const QList<QLineF>& lineList, const QRectF& boundRect, QList<QLineF>& resultLines);
94 void _intersectLinesWithPolygon(const QList<QLineF>& lineList, const QPolygonF& polygon, QList<QLineF>& resultLines);
95 void _adjustLineDirection(const QList<QLineF>& lineList, QList<QLineF>& resultLines);
96 bool _nextTransectCoord(const QList<QGeoCoordinate>& transectPoints, int pointIndex, QGeoCoordinate& coord);
97 bool _appendMissionItemsWorker(QList<MissionItem*>& items, QObject* missionItemParent, int& seqNum, bool hasRefly, bool buildRefly);
98 void _optimizeTransectsForShortestDistance(const QGeoCoordinate& distanceCoord, QList<QList<QGeoCoordinate>>& transects);
99 qreal _ccw(QPointF pt1, QPointF pt2, QPointF pt3);
100 qreal _dp(QPointF pt1, QPointF pt2);
101 void _swapPoints(QList<QPointF>& points, int index1, int index2);
102 void _reverseTransectOrder(QList<QList<QGeoCoordinate>>& transects);
103 void _reverseInternalTransectPoints(QList<QList<QGeoCoordinate>>& transects);
104 void _adjustTransectsToEntryPointLocation(QList<QList<QGeoCoordinate>>& transects);
105 bool _gridAngleIsNorthSouthTransects();
106 double _clampGridAngle90(double gridAngle);
107 bool _imagesEverywhere(void) const;
108 bool _triggerCamera(void) const;
109 bool _hasTurnaround(void) const;
110 double _turnaroundDistance(void) const;
111 bool _hoverAndCaptureEnabled(void) const;
112 bool _loadV3(const QJsonObject& complexObject, int sequenceNumber, QString& errorString);
113 bool _loadV4V5(const QJsonObject& complexObject, int sequenceNumber, QString& errorString, int version, bool forPresets);
114 void _saveCommon(QJsonObject& complexObject);
115 void _rebuildTransectsPhase1Worker(bool refly);
116 void _rebuildTransectsPhase1WorkerSinglePolygon(bool refly);
118 void _rebuildTransectsFromPolygon(bool refly, const QPolygonF& polygon, const QGeoCoordinate& tangentOrigin, const QPointF* const transitionPoint);
119
120#if 0
121 // Splitting polygons is not supported since this code would get stuck in a infinite loop
122 // Code is left here in case someone wants to try to resurrect it
123
124 void _rebuildTransectsPhase1WorkerSplitPolygons(bool refly);
125
126 // Decompose polygon into list of convex sub polygons
127 void _PolygonDecomposeConvex(const QPolygonF& polygon, QList<QPolygonF>& decomposedPolygons);
128 // return true if vertex a can see vertex b
129 bool _VertexCanSeeOther(const QPolygonF& polygon, const QPointF* vertexA, const QPointF* vertexB);
130 bool _VertexIsReflex(const QPolygonF& polygon, QList<QPointF>::const_iterator& vertexIter);
131#endif
132
133 QMap<QString, FactMetaData*> _metaDataMap;
134
135 SettingsFact _gridAngleFact;
136 SettingsFact _flyAlternateTransectsFact;
137 SettingsFact _splitConcavePolygonsFact;
138 int _entryPoint;
139
140 static constexpr const char* _jsonGridAngleKey = "angle";
141 static constexpr const char* _jsonEntryPointKey = "entryLocation";
142
143 static constexpr const char* _jsonV3GridObjectKey = "grid";
144 static constexpr const char* _jsonV3GridAltitudeKey = "altitude";
145 static constexpr const char* _jsonV3GridAltitudeRelativeKey = "relativeAltitude";
146 static constexpr const char* _jsonV3GridAngleKey = "angle";
147 static constexpr const char* _jsonV3GridSpacingKey = "spacing";
148 static constexpr const char* _jsonV3EntryPointKey = "entryLocation";
149 static constexpr const char* _jsonV3TurnaroundDistKey = "turnAroundDistance";
150 static constexpr const char* _jsonV3CameraTriggerDistanceKey = "cameraTriggerDistance";
151 static constexpr const char* _jsonV3CameraTriggerInTurnaroundKey = "cameraTriggerInTurnaround";
152 static constexpr const char* _jsonV3HoverAndCaptureKey = "hoverAndCapture";
153 static constexpr const char* _jsonV3GroundResolutionKey = "groundResolution";
154 static constexpr const char* _jsonV3FrontalOverlapKey = "imageFrontalOverlap";
155 static constexpr const char* _jsonV3SideOverlapKey = "imageSideOverlap";
156 static constexpr const char* _jsonV3CameraSensorWidthKey = "sensorWidth";
157 static constexpr const char* _jsonV3CameraSensorHeightKey = "sensorHeight";
158 static constexpr const char* _jsonV3CameraResolutionWidthKey = "resolutionWidth";
159 static constexpr const char* _jsonV3CameraResolutionHeightKey = "resolutionHeight";
160 static constexpr const char* _jsonV3CameraFocalLengthKey = "focalLength";
161 static constexpr const char* _jsonV3CameraMinTriggerIntervalKey = "minTriggerInterval";
162 static constexpr const char* _jsonV3CameraObjectKey = "camera";
163 static constexpr const char* _jsonV3CameraNameKey = "name";
164 static constexpr const char* _jsonV3ManualGridKey = "manualGrid";
165 static constexpr const char* _jsonV3CameraOrientationLandscapeKey = "orientationLandscape";
166 static constexpr const char* _jsonV3FixedValueIsAltitudeKey = "fixedValueIsAltitude";
167 static constexpr const char* _jsonV3Refly90DegreesKey = "refly90Degrees";
168 static constexpr const char* _jsonFlyAlternateTransectsKey = "flyAlternateTransects";
169 static constexpr const char* _jsonSplitConcavePolygonsKey = "splitConcavePolygons";
170};
QString errorString
A Fact is used to hold a single value within the system.
Definition Fact.h:17
Master controller for mission, fence, rally.
void setCenter(QGeoCoordinate newCenter)
QGeoCoordinate center(void) const
A SettingsFact is Fact which holds a QSettings value.
QGeoCoordinate centerCoordinate(void) const
bool specifiesCoordinate(void) const final
double timeBetweenShots(void) final
static constexpr const char * jsonComplexItemTypeValue
Fact * flyAlternateTransects(void)
Q_INVOKABLE void rotateEntryPoint(void)
Fact * splitConcavePolygons(void)
void refly90DegreesChanged(bool refly90Degrees)
static constexpr const char * settingsGroup
ReadyForSaveState readyForSaveState(void) const final
QString commandName(void) const final
QString presetsSettingsGroup(void)
static constexpr const char * splitConcavePolygonsName
double additionalTimeDelay(void) const final
static constexpr const char * canonicalName
void setCenterCoordinate(const QGeoCoordinate &coordinate)
static constexpr const char * gridAngleName
bool load(const QJsonObject &complexObject, int sequenceNumber, QString &errorString) final
void applyPreviousAltitudeFrame(QGroundControlQmlGlobal::AltitudeFrame prevAltFrame, double prevAltitude) final
QString mapVisualQML(void) const final
bool isSurveyItem(void) const final
QString abbreviation(void) const final
QString commandDescription(void) const final
QString patternName(void) const final
static constexpr const char * gridEntryLocationName
static constexpr const char * jsonV3ComplexItemTypeValue
void loadPreset(const QString &name)
void savePreset(const QString &name)
void save(QJsonArray &planItems) final
static constexpr const char * flyAlternateTransectsName
QGeoCoordinate coordinate(void) const final
int sequenceNumber(void) const final
bool flyView(void) const
PlanMasterController * masterController(void)