14 connect(
this, &QQuickItem::heightChanged,
this, &TerrainProfile::_updateProfile);
31 QQuickItem::componentComplete();
50void TerrainProfile::_newVisualItems(
void)
56void TerrainProfile::_updateSegmentCounts(
FlightPathSegment* segment,
int& cFlightProfileSegments,
int& cTerrainProfilePoints,
int& cMissingTerrainSegments,
int& cTerrainCollisionSegments,
double& minTerrainHeight,
double& maxTerrainHeight)
58 if (_shouldAddFlightProfileSegment(segment)) {
62 cFlightProfileSegments++;
66 if (_shouldAddMissingTerrainSegment(segment)) {
67 cMissingTerrainSegments += 1;
71 minTerrainHeight = std::fmin(minTerrainHeight, segment->
amslTerrainHeights()[i].value<
double>());
72 maxTerrainHeight = std::fmax(maxTerrainHeight, segment->
amslTerrainHeights()[i].value<
double>());
76 cTerrainCollisionSegments++;
80void TerrainProfile::_updateProfile(
void)
82 if (!_missionController || !_visualItems) {
86 int cTerrainProfilePoints = 0;
87 int cMissingTerrainSegments = 0;
88 int cFlightProfileSegments = 0;
89 int cTerrainCollisionSegments = 0;
90 double minTerrainHeight = qQNaN();
91 double maxTerrainHeight = qQNaN();
93 for (
int viIndex=0; viIndex<_visualItems->
count(); viIndex++) {
99 _updateSegmentCounts(segment, cFlightProfileSegments, cTerrainProfilePoints, cMissingTerrainSegments, cTerrainCollisionSegments, minTerrainHeight, maxTerrainHeight);
103 for (
int segmentIndex=0; segmentIndex<complexItem->flightPathSegments()->count(); segmentIndex++) {
105 _updateSegmentCounts(segment, cFlightProfileSegments, cTerrainProfilePoints, cMissingTerrainSegments, cTerrainCollisionSegments, minTerrainHeight, maxTerrainHeight);
110 _minAMSLAlt = std::fmin(_missionController->
minAMSLAltitude(), minTerrainHeight);
111 _maxAMSLAlt = std::fmax(_missionController->
maxAMSLAltitude(), maxTerrainHeight);
113 double amslAltRange = _maxAMSLAlt - _minAMSLAlt;
114 double amslAltRangeBuffer = amslAltRange * 0.1;
115 _maxAMSLAlt += amslAltRangeBuffer;
116 if (_minAMSLAlt > 0.0) {
117 _minAMSLAlt -= amslAltRangeBuffer;
118 _minAMSLAlt = std::fmax(_minAMSLAlt, 0.0);
122 _pixelsPerMeter = (missionTotalDistance > 0.0) ? (_visibleWidth / missionTotalDistance) : 0.0;
124 static int counter = 0;
125 qCDebug(TerrainProfileLog).noquote() <<
"counter" << counter++ <<
126 "\n\tmissionController minAMSLAltitude" << _missionController->
minAMSLAltitude() <<
127 "\n\tmissionController maxAMSLAltitude" << _missionController->
maxAMSLAltitude() <<
128 "\n\tcFlightProfileSegments" << cFlightProfileSegments <<
129 "\n\tcTerrainProfilePoints" << cTerrainProfilePoints <<
130 "\n\tcMissingTerrainSegments" << cMissingTerrainSegments <<
131 "\n\tcTerrainCollisionSegments" << cTerrainCollisionSegments <<
132 "\n\t_minAMSLAlt" << _minAMSLAlt <<
133 "\n\t_maxAMSLAlt" << _maxAMSLAlt <<
134 "\n\tmaxTerrainHeight" << maxTerrainHeight;
136 setImplicitWidth(_visibleWidth);
137 setWidth(implicitWidth());
147 if (!_missionController || !_visualItems) {
151 QList<QPointF> terrainPoints;
152 QList<QPointF> flightPoints;
153 QList<QPointF> missingPoints;
154 QList<QPointF> collisionPoints;
156 double currentDistance = 0;
158 for (
int viIndex=0; viIndex<_visualItems->
count(); viIndex++) {
163 if (complexItem->flightPathSegments()->count() == 0) {
166 for (
int segmentIndex=0; segmentIndex<complexItem->flightPathSegments()->count(); segmentIndex++) {
169 _addTerrainPoints (segment, currentDistance, terrainPoints);
170 _addFlightPoints (segment, currentDistance, flightPoints);
171 _addMissingPoints (segment, currentDistance, missingPoints);
172 _addCollisionPoints (segment, currentDistance, collisionPoints);
182 _addTerrainPoints (segment, currentDistance, terrainPoints);
183 _addFlightPoints (segment, currentDistance, flightPoints);
184 _addMissingPoints (segment, currentDistance, missingPoints);
185 _addCollisionPoints (segment, currentDistance, collisionPoints);
193 terrainSeries->clear();
194 terrainSeries->append(terrainPoints);
197 flightSeries->clear();
198 flightSeries->append(flightPoints);
201 missingSeries->clear();
202 missingSeries->append(missingPoints);
204 if (collisionSeries) {
205 collisionSeries->clear();
206 collisionSeries->append(collisionPoints);
209 qCDebug(TerrainProfileLog).noquote() << QStringLiteral(
"updateSeries terrainPoints:%1 flightPoints:%2 missingPoints:%3 collisionPoints:%4")
210 .arg(terrainPoints.count()).arg(flightPoints.count()).arg(missingPoints.count()).arg(collisionPoints.count());
213void TerrainProfile::_addTerrainPoints(
FlightPathSegment* segment,
double currentDistance, QList<QPointF>& points)
215 if (_shouldAddMissingTerrainSegment(segment)) {
216 if (!points.isEmpty()) {
217 points.append(QPointF(qQNaN(), qQNaN()));
222 double terrainDistance = 0;
223 for (
int heightIndex=0; heightIndex<segment->
amslTerrainHeights().count(); heightIndex++) {
224 if (heightIndex == 0) {
232 const double amslTerrainHeight = segment->
amslTerrainHeights()[heightIndex].value<
double>() * _verticalScale;
233 points.append(QPointF((currentDistance + terrainDistance) * _horizontalScale, amslTerrainHeight));
237void TerrainProfile::_addFlightPoints(
FlightPathSegment* segment,
double currentDistance, QList<QPointF>& points)
239 if (!_shouldAddFlightProfileSegment(segment)) {
240 if (!points.isEmpty()) {
241 points.append(QPointF(currentDistance * _horizontalScale, qQNaN()));
247 double terrainDistance = 0;
249 for (
int heightIndex=0; heightIndex<segment->
amslTerrainHeights().count(); heightIndex++) {
250 if (heightIndex == 0) {
258 const double amslTerrainHeight = (segment->
amslTerrainHeights()[heightIndex].value<
double>() + distanceToSurface) * _verticalScale;
259 points.append(QPointF((currentDistance + terrainDistance) * _horizontalScale, amslTerrainHeight));
262 points.append(QPointF(currentDistance * _horizontalScale, segment->
coord1AMSLAlt() * _verticalScale));
263 points.append(QPointF((currentDistance + segment->
totalDistance()) * _horizontalScale, segment->
coord2AMSLAlt() * _verticalScale));
267void TerrainProfile::_addMissingPoints(
FlightPathSegment* segment,
double currentDistance, QList<QPointF>& points)
269 if (_shouldAddMissingTerrainSegment(segment)) {
270 if (!points.isEmpty()) {
271 points.append(QPointF(currentDistance * _horizontalScale, qQNaN()));
273 const double minAlt = _minAMSLAlt * _verticalScale;
274 points.append(QPointF(currentDistance * _horizontalScale, minAlt));
275 points.append(QPointF((currentDistance + segment->
totalDistance()) * _horizontalScale, minAlt));
279void TerrainProfile::_addCollisionPoints(
FlightPathSegment* segment,
double currentDistance, QList<QPointF>& points)
282 if (!points.isEmpty()) {
283 points.append(QPointF(currentDistance * _horizontalScale, qQNaN()));
285 points.append(QPointF(currentDistance * _horizontalScale, segment->
coord1AMSLAlt() * _verticalScale));
286 points.append(QPointF((currentDistance + segment->
totalDistance()) * _horizontalScale, segment->
coord2AMSLAlt() * _verticalScale));
#define QGC_LOGGING_CATEGORY(name, categoryStr)
virtual double complexDistance(void) const =0
double distanceBetween(void) const
@ SegmentTypeTerrainFrame
SegmentType segmentType(void) const
const QVariantList & amslTerrainHeights(void) const
double finalDistanceBetween(void) const
bool terrainCollision(void) const
double totalDistance(void) const
double coord2AMSLAlt(void) const
double coord1AMSLAlt(void) const
double minAMSLAltitude(void) const
double maxAMSLAltitude(void) const
void recalcTerrainProfile(void)
void visualItemsReset(void)
double missionTotalDistance(void) const
QmlObjectListModel * visualItems(void)
int count() const override final
void profileChanged(void)
void componentComplete(void) final
void setMissionController(MissionController *missionController)
double visibleWidth(void) const
void pixelsPerMeterChanged(void)
Q_INVOKABLE void updateSeries(QXYSeries *terrainSeries, QXYSeries *flightSeries, QXYSeries *missingSeries, QXYSeries *collisionSeries)
void visibleWidthChanged(void)
MissionController * missionController(void)
void setVisibleWidth(double visibleWidth)
void minAMSLAltChanged(void)
void maxAMSLAltChanged(void)
void missionControllerChanged(void)
FlightPathSegment * simpleFlightPathSegment(void)