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