From 7d68c86eb9d2ce94d502c320699f3e14061e7bd9 Mon Sep 17 00:00:00 2001 From: cuav-zhang3 Date: Tue, 28 Jul 2026 09:59:48 +0800 Subject: [PATCH] fix(CorridorScanComplexItem): Fix the signal emission logic for coordinate specification state changes Add a cache variable to record the previous coordinate specification status, detect status changes during corridor polygon reconstruction, and emit corresponding signals to ensure the task controller correctly updates the waypoint connection lines. --- src/MissionManager/CorridorScanComplexItem.cc | 14 ++++++++++++++ src/MissionManager/CorridorScanComplexItem.h | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/src/MissionManager/CorridorScanComplexItem.cc b/src/MissionManager/CorridorScanComplexItem.cc index 4f905b5d5ff6..d0b829bc2e82 100644 --- a/src/MissionManager/CorridorScanComplexItem.cc +++ b/src/MissionManager/CorridorScanComplexItem.cc @@ -19,6 +19,10 @@ CorridorScanComplexItem::CorridorScanComplexItem(PlanMasterController* masterCon { _editorQml = "qrc:/qml/QGroundControl/PlanView/CorridorScanEditor.qml"; + // specifiesCoordinate() depends on _corridorPolyline.count(), so cache the + // initial value before any signal connections fire to keep the cache in sync. + _specifiesCoordinate = specifiesCoordinate(); + // We override the altitude to the mission default if (_cameraCalc.isManualCamera() || !_cameraCalc.valueSetIsDistance()->rawValue().toBool()) { _cameraCalc.distanceToSurface()->setRawValue(SettingsManager::instance()->appSettings()->defaultMissionItemAltitude()->rawValue()); @@ -211,6 +215,16 @@ void CorridorScanComplexItem::rotateEntryPoint(void) void CorridorScanComplexItem::_rebuildCorridorPolygon(void) { + // specifiesCoordinate() flips when the polyline crosses the 2-vertex threshold. + // MissionController only re-evaluates waypoint connector lines on this signal, + // so emit it here to link the corridor entry to the previous waypoint once the + // corridor polyline becomes valid. + const bool specifiesCoord = specifiesCoordinate(); + if (specifiesCoord != _specifiesCoordinate) { + _specifiesCoordinate = specifiesCoord; + emit specifiesCoordinateChanged(); + } + if (_corridorPolyline.count() < 2) { _surveyAreaPolygon.clear(); return; diff --git a/src/MissionManager/CorridorScanComplexItem.h b/src/MissionManager/CorridorScanComplexItem.h index 5d25fd347157..3e46446f10e5 100644 --- a/src/MissionManager/CorridorScanComplexItem.h +++ b/src/MissionManager/CorridorScanComplexItem.h @@ -82,5 +82,9 @@ private slots: QMap _metaDataMap; SettingsFact _corridorWidthFact; + // Cache of the last specifiesCoordinate() value so we can emit + // specifiesCoordinateChanged when the polyline crosses the 2-vertex threshold. + bool _specifiesCoordinate = false; + static constexpr const char* _jsonEntryPointKey = "EntryPoint"; };