diff --git a/src/MissionManager/CorridorScanComplexItem.cc b/src/MissionManager/CorridorScanComplexItem.cc index d02752b16443392c67cd9ba1a28b79b0c72c6358..7b44997cbfd3bf6cf03c7ccf176fb3609ec1225d 100644 --- a/src/MissionManager/CorridorScanComplexItem.cc +++ b/src/MissionManager/CorridorScanComplexItem.cc @@ -456,7 +456,7 @@ void CorridorScanComplexItem::_rebuildTransectsPhase2(void) { // Calculate distance flown for complex item _complexDistance = 0; - for (int i=0; i<_visualTransectPoints.count() - 2; i++) { + for (int i=0; i<_visualTransectPoints.count() - 1; i++) { _complexDistance += _visualTransectPoints[i].value().distanceTo(_visualTransectPoints[i+1].value()); } diff --git a/src/MissionManager/SurveyComplexItem.cc b/src/MissionManager/SurveyComplexItem.cc index 32006c6d73dffb089f1250cd1340e5558921472f..78cf671273cf3a4d321973b31622b60734d4529f 100644 --- a/src/MissionManager/SurveyComplexItem.cc +++ b/src/MissionManager/SurveyComplexItem.cc @@ -1136,6 +1136,14 @@ bool SurveyComplexItem::_hoverAndCaptureEnabled(void) const #endif void SurveyComplexItem::_rebuildTransectsPhase1(void) +{ + _rebuildTransectsPhase1Worker(false /* refly */); + if (_refly90DegreesFact.rawValue().toBool()) { + _rebuildTransectsPhase1Worker(true /* refly */); + } +} + +void SurveyComplexItem::_rebuildTransectsPhase1Worker(bool refly) { if (_ignoreRecalc) { return; @@ -1148,15 +1156,16 @@ void SurveyComplexItem::_rebuildTransectsPhase1(void) _loadedMissionItemsParent = NULL; } - _transects.clear(); - _transectsPathHeightInfo.clear(); + // First pass will clear old transect data, refly will append to existing data + if (!refly) { + _transects.clear(); + _transectsPathHeightInfo.clear(); + } if (_surveyAreaPolygon.count() < 3) { return; } - QList> transectSegments; - // Convert polygon to NED QList polygonPoints; @@ -1177,12 +1186,11 @@ void SurveyComplexItem::_rebuildTransectsPhase1(void) // Generate transects - bool refly = _refly90DegreesFact.rawValue().toBool(); double gridAngle = _gridAngleFact.rawValue().toDouble(); double gridSpacing = _cameraCalc.adjustedFootprintSide()->rawValue().toDouble(); gridAngle = _clampGridAngle90(gridAngle); - //gridAngle += refly ? 90 : 0; + gridAngle += refly ? 90 : 0; qCDebug(SurveyComplexItemLog) << "_rebuildTransectsPhase1 Clamped grid angle" << gridAngle; qCDebug(SurveyComplexItemLog) << "_rebuildTransectsPhase1 gridSpacing:gridAngle:refly" << gridSpacing << gridAngle << refly; @@ -1265,7 +1273,29 @@ void SurveyComplexItem::_rebuildTransectsPhase1(void) _adjustTransectsToEntryPointLocation(transects); - // Convert to CoordInfo transects + if (refly) { + _optimizeTransectsForShortestDistance(_transects.last().last().coord, transects); + } + + // Adjust to lawnmower pattern + bool reverseVertices = false; + for (int i=0; i transectVertices = transects[i]; + if (reverseVertices) { + reverseVertices = false; + QList reversedVertices; + for (int j=transectVertices.count()-1; j>=0; j--) { + reversedVertices.append(transectVertices[j]); + } + transectVertices = reversedVertices; + } else { + reverseVertices = true; + } + transects[i] = transectVertices; + } + + // Convert to CoordInfo transects and append to _transects foreach (const QList& transect, transects) { QGeoCoordinate coord; QList coordInfoTransect; @@ -1297,183 +1327,33 @@ void SurveyComplexItem::_rebuildTransectsPhase1(void) _transects.append(coordInfoTransect); } - - // Adjust to lawnmower pattern - bool reverseVertices = false; - for (int i=0; i<_transects.count(); i++) { - // We must reverse the vertices for every other transect in order to make a lawnmower pattern - QList transectVertices = _transects[i]; - if (reverseVertices) { - reverseVertices = false; - QList reversedVertices; - for (int j=transectVertices.count()-1; j>=0; j--) { - reversedVertices.append(transectVertices[j]); - } - transectVertices = reversedVertices; - } else { - reverseVertices = true; - } - _transects[i] = transectVertices; - } - -#if 0 - CorridorScan code - - if (_ignoreRecalc) { - return; - } - - // If the transects are getting rebuilt then any previsouly loaded mission items are now invalid - if (_loadedMissionItemsParent) { - _loadedMissionItems.clear(); - _loadedMissionItemsParent->deleteLater(); - _loadedMissionItemsParent = NULL; - } - - _transects.clear(); - _transectsPathHeightInfo.clear(); - - double transectSpacing = _cameraCalc.adjustedFootprintSide()->rawValue().toDouble(); - double fullWidth = _corridorWidthFact.rawValue().toDouble(); - double halfWidth = fullWidth / 2.0; - int transectCount = _transectCount(); - double normalizedTransectPosition = transectSpacing / 2.0; - - if (_corridorPolyline.count() >= 2) { - // First build up the transects all going the same direction - //qDebug() << "_rebuildTransectsPhase1"; - for (int i=0; i transect; - QList transectCoords = _corridorPolyline.offsetPolyline(offsetDistance); - for (int j=1; j> reversedTransects; - foreach (const QList& transect, _transects) { - reversedTransects.prepend(transect); - } - _transects = reversedTransects; - } - if (reverseVertices) { - for (int i=0; i<_transects.count(); i++) { - QList reversedVertices; - foreach (const TransectStyleComplexItem::CoordInfo_t& vertex, _transects[i]) { - reversedVertices.prepend(vertex); - } - _transects[i] = reversedVertices; - } - } - - // Adjust to lawnmower pattern - reverseVertices = false; - for (int i=0; i<_transects.count(); i++) { - // We must reverse the vertices for every other transect in order to make a lawnmower pattern - QList transectVertices = _transects[i]; - if (reverseVertices) { - reverseVertices = false; - QList reversedVertices; - for (int j=transectVertices.count()-1; j>=0; j--) { - reversedVertices.append(transectVertices[j]); - } - transectVertices = reversedVertices; - } else { - reverseVertices = true; - } - _transects[i] = transectVertices; - } - } -#endif } void SurveyComplexItem::_rebuildTransectsPhase2(void) { // Calculate distance flown for complex item _complexDistance = 0; - for (int i=0; i<_visualTransectPoints.count() - 2; i++) { + for (int i=0; i<_visualTransectPoints.count() - 1; i++) { _complexDistance += _visualTransectPoints[i].value().distanceTo(_visualTransectPoints[i+1].value()); } -#if 0 + double triggerDistance = _cameraCalc.adjustedFootprintFrontal()->rawValue().toDouble(); if (_cameraTriggerInTurnAroundFact.rawValue().toBool()) { - _cameraShots = qCeil(_complexDistance / _cameraCalc.adjustedFootprintFrontal()->rawValue().toDouble()); + _cameraShots = qCeil(_complexDistance / triggerDistance); } else { - int singleTransectImageCount = qCeil(_corridorPolyline.length() / _cameraCalc.adjustedFootprintFrontal()->rawValue().toDouble()); - _cameraShots = singleTransectImageCount * _transectCount(); + _cameraShots = 0; + foreach (const QList& transect, _transects) { + QGeoCoordinate firstCameraCoord, lastCameraCoord; + if (_hasTurnaround()) { + firstCameraCoord = transect[1].coord; + lastCameraCoord = transect[transect.count() - 2].coord; + } else { + firstCameraCoord = transect.first().coord; + lastCameraCoord = transect.last().coord; + } + _cameraShots += qCeil(firstCameraCoord.distanceTo(lastCameraCoord) / triggerDistance); + } } -#endif _coordinate = _visualTransectPoints.count() ? _visualTransectPoints.first().value() : QGeoCoordinate(); _exitCoordinate = _visualTransectPoints.count() ? _visualTransectPoints.last().value() : QGeoCoordinate(); diff --git a/src/MissionManager/SurveyComplexItem.h b/src/MissionManager/SurveyComplexItem.h index 3a415847a86fd2a19bd9b0c3310c896f682eddfd..36d5d8582c6d7236db834fba87247bf9c9ff1a0d 100644 --- a/src/MissionManager/SurveyComplexItem.h +++ b/src/MissionManager/SurveyComplexItem.h @@ -101,6 +101,7 @@ private: bool _hoverAndCaptureEnabled(void) const; bool _loadV3(const QJsonObject& complexObject, int sequenceNumber, QString& errorString); bool _loadV4(const QJsonObject& complexObject, int sequenceNumber, QString& errorString); + void _rebuildTransectsPhase1Worker(bool refly); QMap _metaDataMap;