Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Q
qgroundcontrol
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Valentin Platzgummer
qgroundcontrol
Commits
67cbe3f7
Commit
67cbe3f7
authored
Oct 20, 2020
by
Valentin Platzgummer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
generators seem to work, still some bugs
parent
60b604d9
Changes
23
Hide whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
609 additions
and
1023 deletions
+609
-1023
qgroundcontrol.qrc
qgroundcontrol.qrc
+179
-175
FlightDisplayViewMap.qml
src/FlightDisplay/FlightDisplayViewMap.qml
+2
-0
QGCApplication.cc
src/QGCApplication.cc
+6
-0
QGroundControl.Controls.qmldir
src/QmlControls/QGroundControl.Controls.qmldir
+0
-17
CircularSurvey.cc
src/Wima/CircularSurvey.cc
+152
-605
CircularSurvey.h
src/Wima/CircularSurvey.h
+20
-16
CircularGenerator.cpp
src/Wima/Snake/CircularGenerator.cpp
+6
-4
CircularGenerator.h
src/Wima/Snake/CircularGenerator.h
+3
-3
GeneratorBase.cc
src/Wima/Snake/GeneratorBase.cc
+8
-0
GeneratorBase.h
src/Wima/Snake/GeneratorBase.h
+7
-2
LinearGenerator.cpp
src/Wima/Snake/LinearGenerator.cpp
+7
-8
LinearGenerator.h
src/Wima/Snake/LinearGenerator.h
+1
-2
snake.cpp
src/Wima/Snake/snake.cpp
+11
-1
WimaPlaner.cc
src/Wima/WimaPlaner.cc
+8
-6
CircularGeneratorEditor.qml
src/WimaView/CircularGeneratorEditor.qml
+44
-0
CircularGeneratorMapVisual.qml
src/WimaView/CircularGeneratorMapVisual.qml
+69
-0
CircularSurveyItemEditor.qml
src/WimaView/CircularSurveyItemEditor.qml
+19
-80
CircularSurveyMapVisual.qml
src/WimaView/CircularSurveyMapVisual.qml
+0
-101
LinearGeneratorEditor.qml
src/WimaView/LinearGeneratorEditor.qml
+46
-0
Wima.qmldir
src/WimaView/Wima.qmldir
+18
-0
LinkConfiguration.h
src/comm/LinkConfiguration.h
+1
-1
LinkInterface.h
src/comm/LinkInterface.h
+1
-1
UnitTest.h
src/qgcunittest/UnitTest.h
+1
-1
No files found.
qgroundcontrol.qrc
View file @
67cbe3f7
...
...
@@ -7,93 +7,146 @@
<file alias="BatteryIndicator.qml">src/ui/toolbar/BatteryIndicator.qml</file>
<file alias="GPSIndicator.qml">src/ui/toolbar/GPSIndicator.qml</file>
<file alias="GPSRTKIndicator.qml">src/ui/toolbar/GPSRTKIndicator.qml</file>
<file alias="JoystickIndicator.qml">src/ui/toolbar/JoystickIndicator.qml</file>
<file alias="LinkIndicator.qml">src/ui/toolbar/LinkIndicator.qml</file>
<file alias="MessageIndicator.qml">src/ui/toolbar/MessageIndicator.qml</file>
<file alias="ModeIndicator.qml">src/ui/toolbar/ModeIndicator.qml</file>
<file alias="VTOLModeIndicator.qml">src/ui/toolbar/VTOLModeIndicator.qml</file>
<file alias="RCRSSIIndicator.qml">src/ui/toolbar/RCRSSIIndicator.qml</file>
<file alias="TelemetryRSSIIndicator.qml">src/ui/toolbar/TelemetryRSSIIndicator.qml</file>
<file alias="JoystickIndicator.qml">src/ui/toolbar/JoystickIndicator.qml</file>
<file alias="LinkIndicator.qml">src/ui/toolbar/LinkIndicator.qml</file>
<file alias="VTOLModeIndicator.qml">src/ui/toolbar/VTOLModeIndicator.qml</file>
</qresource>
<qresource prefix="/qml">
<file alias="CorridorScanEditor.qml">src/PlanView/CorridorScanEditor.qml</file>
<file alias="QGroundControl/Controls/CameraCalc.qml">src/PlanView/CameraCalc.qml</file>
<file alias="QGroundControl/Controls/CorridorScanMapVisual.qml">src/PlanView/CorridorScanMapVisual.qml</file>
<file alias="QGroundControl/Controls/EditPositionDialog.qml">src/QmlControls/EditPositionDialog.qml</file>
<file alias="QGroundControl/Controls/FileButton.qml">src/QmlControls/FileButton.qml</file>
<file alias="QGroundControl/Controls/QGCMapCircleVisuals.qml">src/MissionManager/QGCMapCircleVisuals.qml</file>
<file alias="QGroundControl/Controls/QGCMapPolylineVisuals.qml">src/MissionManager/QGCMapPolylineVisuals.qml</file>
<file alias="QGroundControl/Controls/StructureScanMapVisual.qml">src/PlanView/StructureScanMapVisual.qml</file>
<file alias="QGroundControl/Controls/AnalyzePage.qml">src/AnalyzeView/AnalyzePage.qml</file>
<file alias="AnalyzeView.qml">src/AnalyzeView/AnalyzeView.qml</file>
<file alias="AppSettings.qml">src/ui/AppSettings.qml</file>
<file alias="BluetoothSettings.qml">src/ui/preferences/BluetoothSettings.qml</file>
<file alias="CameraPageWidget.qml">src/FlightMap/Widgets/CameraPageWidget.qml</file>
<file alias="CustomCommandWidget.qml">src/ViewWidgets/CustomCommandWidget.qml</file>
<file alias="DebugWindow.qml">src/ui/preferences/DebugWindow.qml</file>
<file alias="GeoTagPage.qml">src/AnalyzeView/GeoTagPage.qml</file>
<file alias="LogDownloadPage.qml">src/AnalyzeView/LogDownloadPage.qml</file>
<file alias="MavlinkConsolePage.qml">src/AnalyzeView/MavlinkConsolePage.qml</file>
<file alias="ESP8266Component.qml">src/AutoPilotPlugins/Common/ESP8266Component.qml</file>
<file alias="ESP8266ComponentSummary.qml">src/AutoPilotPlugins/Common/ESP8266ComponentSummary.qml</file>
<file alias="FirmwareUpgrade.qml">src/VehicleSetup/FirmwareUpgrade.qml</file>
<file alias="MotorComponent.qml">src/AutoPilotPlugins/Common/MotorComponent.qml</file>
<file alias="RadioComponent.qml">src/AutoPilotPlugins/Common/RadioComponent.qml</file>
<file alias="QGroundControl/Controls/SetupPage.qml">src/AutoPilotPlugins/Common/SetupPage.qml</file>
<file alias="SyslinkComponent.qml">src/AutoPilotPlugins/Common/SyslinkComponent.qml</file>
<file alias="QGroundControl/FactControls/AltitudeFactTextField.qml">src/FactSystem/FactControls/AltitudeFactTextField.qml</file>
<file alias="QGroundControl/FactControls/FactBitmask.qml">src/FactSystem/FactControls/FactBitmask.qml</file>
<file alias="QGroundControl/FactControls/FactCheckBox.qml">src/FactSystem/FactControls/FactCheckBox.qml</file>
<file alias="QGroundControl/FactControls/FactComboBox.qml">src/FactSystem/FactControls/FactComboBox.qml</file>
<file alias="QGroundControl/FactControls/FactLabel.qml">src/FactSystem/FactControls/FactLabel.qml</file>
<file alias="QGroundControl/FactControls/FactPanel.qml">src/FactSystem/FactControls/FactPanel.qml</file>
<file alias="QGroundControl/FactControls/FactTextField.qml">src/FactSystem/FactControls/FactTextField.qml</file>
<file alias="QGroundControl/FactControls/FactTextFieldGrid.qml">src/FactSystem/FactControls/FactTextFieldGrid.qml</file>
<file alias="QGroundControl/FactControls/FactTextFieldRow.qml">src/FactSystem/FactControls/FactTextFieldRow.qml</file>
<file alias="QGroundControl/FactControls/FactTextFieldSlider.qml">src/FactSystem/FactControls/FactTextFieldSlider.qml</file>
<file alias="QGroundControl/FactControls/FactValueSlider.qml">src/FactSystem/FactControls/FactValueSlider.qml</file>
<file alias="QGroundControl/FactControls/qmldir">src/FactSystem/FactControls/qmldir</file>
<file alias="QGroundControl/FlightDisplay/BuiltInPreFlightCheckModel.qml">src/FlightDisplay/BuiltInPreFlightCheckModel.qml</file>
<file alias="QGroundControl/FlightDisplay/FlightDisplayView.qml">src/FlightDisplay/FlightDisplayView.qml</file>
<file alias="FlightDisplayViewDummy.qml">src/FlightDisplay/FlightDisplayViewDummy.qml</file>
<file alias="QGroundControl/FlightDisplay/FlightDisplayViewMap.qml">src/FlightDisplay/FlightDisplayViewMap.qml</file>
<file alias="FlightDisplayViewUVC.qml">src/FlightDisplay/FlightDisplayViewUVC.qml</file>
<file alias="FWLandingPatternEditor.qml">src/PlanView/FWLandingPatternEditor.qml</file>
<file alias="GeneralSettings.qml">src/ui/preferences/GeneralSettings.qml</file>
<file alias="GeoTagPage.qml">src/AnalyzeView/GeoTagPage.qml</file>
<file alias="QGroundControl/FlightDisplay/FlightDisplayViewVideo.qml">src/FlightDisplay/FlightDisplayViewVideo.qml</file>
<file alias="QGroundControl/FlightDisplay/FlightDisplayViewWidgets.qml">src/FlightDisplay/FlightDisplayViewWidgets.qml</file>
<file alias="QGroundControl/FlightDisplay/FlightDisplayWimaMenu.qml">src/FlightDisplay/FlightDisplayWimaMenu.qml</file>
<file alias="QGroundControl/FlightDisplay/GuidedActionConfirm.qml">src/FlightDisplay/GuidedActionConfirm.qml</file>
<file alias="QGroundControl/FlightDisplay/GuidedActionList.qml">src/FlightDisplay/GuidedActionList.qml</file>
<file alias="QGroundControl/FlightDisplay/GuidedActionsController.qml">src/FlightDisplay/GuidedActionsController.qml</file>
<file alias="QGroundControl/FlightDisplay/GuidedAltitudeSlider.qml">src/FlightDisplay/GuidedAltitudeSlider.qml</file>
<file alias="QGroundControl/FlightDisplay/MultiVehicleList.qml">src/FlightDisplay/MultiVehicleList.qml</file>
<file alias="QGroundControl/FlightDisplay/PreFlightBatteryCheck.qml">src/FlightDisplay/PreFlightBatteryCheck.qml</file>
<file alias="QGroundControl/FlightDisplay/PreFlightGPSCheck.qml">src/FlightDisplay/PreFlightGPSCheck.qml</file>
<file alias="QGroundControl/FlightDisplay/PreFlightRCCheck.qml">src/FlightDisplay/PreFlightRCCheck.qml</file>
<file alias="QGroundControl/FlightDisplay/PreFlightSensorsHealthCheck.qml">src/FlightDisplay/PreFlightSensorsHealthCheck.qml</file>
<file alias="QGroundControl/FlightDisplay/PreFlightSoundCheck.qml">src/FlightDisplay/PreFlightSoundCheck.qml</file>
<file alias="QGroundControl/FlightDisplay/SmallValue.qml">src/FlightDisplay/SmallValue.qml</file>
<file alias="VirtualJoystick.qml">src/FlightDisplay/VirtualJoystick.qml</file>
<file alias="QGroundControl/FlightDisplay/qmldir">src/FlightDisplay/qmldir</file>
<file alias="QGroundControl/FlightMap/FlightMap.qml">src/FlightMap/FlightMap.qml</file>
<file alias="QGroundControl/FlightMap/CameraTriggerIndicator.qml">src/FlightMap/MapItems/CameraTriggerIndicator.qml</file>
<file alias="QGroundControl/FlightMap/CustomMapItems.qml">src/FlightMap/MapItems/CustomMapItems.qml</file>
<file alias="QGroundControl/FlightMap/MissionItemIndicator.qml">src/FlightMap/MapItems/MissionItemIndicator.qml</file>
<file alias="QGroundControl/FlightMap/MissionItemIndicatorDrag.qml">src/FlightMap/MapItems/MissionItemIndicatorDrag.qml</file>
<file alias="QGroundControl/FlightMap/MissionItemView.qml">src/FlightMap/MapItems/MissionItemView.qml</file>
<file alias="QGroundControl/FlightMap/MissionLineView.qml">src/FlightMap/MapItems/MissionLineView.qml</file>
<file alias="QGroundControl/FlightMap/PlanMapItems.qml">src/FlightMap/MapItems/PlanMapItems.qml</file>
<file alias="QGroundControl/FlightMap/PolygonEditor.qml">src/FlightMap/MapItems/PolygonEditor.qml</file>
<file alias="QGroundControl/FlightMap/VehicleMapItem.qml">src/FlightMap/MapItems/VehicleMapItem.qml</file>
<file alias="QGroundControl/FlightMap/WimaPlanMapItems.qml">src/FlightMap/MapItems/WimaPlanMapItems.qml</file>
<file alias="QGroundControl/FlightMap/MapScale.qml">src/FlightMap/MapScale.qml</file>
<file alias="QGroundControl/FlightMap/QGCVideoBackground.qml">src/FlightMap/QGCVideoBackground.qml</file>
<file alias="CameraPageWidget.qml">src/FlightMap/Widgets/CameraPageWidget.qml</file>
<file alias="QGroundControl/FlightMap/CenterMapDropButton.qml">src/FlightMap/Widgets/CenterMapDropButton.qml</file>
<file alias="QGroundControl/FlightMap/CenterMapDropPanel.qml">src/FlightMap/Widgets/CenterMapDropPanel.qml</file>
<file alias="QGroundControl/FlightMap/CompassRing.qml">src/FlightMap/Widgets/CompassRing.qml</file>
<file alias="HealthPageWidget.qml">src/FlightMap/Widgets/HealthPageWidget.qml</file>
<file alias="HelpSettings.qml">src/ui/preferences/HelpSettings.qml</file>
<file alias="JoystickConfig.qml">src/VehicleSetup/JoystickConfig.qml</file>
<file alias="LinkSettings.qml">src/ui/preferences/LinkSettings.qml</file>
<file alias="LogDownloadPage.qml">src/AnalyzeView/LogDownloadPage.qml</file>
<file alias="LogReplaySettings.qml">src/ui/preferences/LogReplaySettings.qml</file>
<file alias="MainWindowHybrid.qml">src/ui/MainWindowHybrid.qml</file>
<file alias="MainWindowInner.qml">src/ui/MainWindowInner.qml</file>
<file alias="MainWindowNative.qml">src/ui/MainWindowNative.qml</file>
<file alias="MavlinkConsolePage.qml">src/AnalyzeView/MavlinkConsolePage.qml</file>
<file alias="MavlinkSettings.qml">src/ui/preferences/MavlinkSettings.qml</file>
<file alias="MissionSettingsEditor.qml">src/PlanView/MissionSettingsEditor.qml</file>
<file alias="MockLink.qml">src/ui/preferences/MockLink.qml</file>
<file alias="MockLinkSettings.qml">src/ui/preferences/MockLinkSettings.qml</file>
<file alias="MotorComponent.qml">src/AutoPilotPlugins/Common/MotorComponent.qml</file>
<file alias="OfflineMap.qml">src/QtLocationPlugin/QMLControl/OfflineMap.qml</file>
<file alias="PlanView.qml">src/PlanView/PlanView.qml</file>
<file alias="PX4FlowSensor.qml">src/VehicleSetup/PX4FlowSensor.qml</file>
<file alias="QGroundControl/FlightMap/InstrumentSwipeView.qml">src/FlightMap/Widgets/InstrumentSwipeView.qml</file>
<file alias="QGroundControl/FlightMap/MapFitFunctions.qml">src/FlightMap/Widgets/MapFitFunctions.qml</file>
<file alias="QGroundControl/FlightMap/QGCArtificialHorizon.qml">src/FlightMap/Widgets/QGCArtificialHorizon.qml</file>
<file alias="QGroundControl/FlightMap/QGCAttitudeHUD.qml">src/FlightMap/Widgets/QGCAttitudeHUD.qml</file>
<file alias="QGroundControl/FlightMap/QGCAttitudeWidget.qml">src/FlightMap/Widgets/QGCAttitudeWidget.qml</file>
<file alias="QGroundControl/FlightMap/QGCCompassWidget.qml">src/FlightMap/Widgets/QGCCompassWidget.qml</file>
<file alias="QGCInstrumentWidget.qml">src/FlightMap/Widgets/QGCInstrumentWidget.qml</file>
<file alias="QGCInstrumentWidgetAlternate.qml">src/FlightMap/Widgets/QGCInstrumentWidgetAlternate.qml</file>
<file alias="QGroundControl/Controls/AnalyzePage.qml">src/AnalyzeView/AnalyzePage.qml</file>
<file alias="QGroundControl/Controls/AppMessages.qml">src/QmlControls/AppMessages.qml</file>
<file alias="QGroundControl/FlightMap/QGCPitchIndicator.qml">src/FlightMap/Widgets/QGCPitchIndicator.qml</file>
<file alias="ValuePageWidget.qml">src/FlightMap/Widgets/ValuePageWidget.qml</file>
<file alias="VibrationPageWidget.qml">src/FlightMap/Widgets/VibrationPageWidget.qml</file>
<file alias="VideoPageWidget.qml">src/FlightMap/Widgets/VideoPageWidget.qml</file>
<file alias="QGroundControl/FlightMap/qmldir">src/FlightMap/qmldir</file>
<file alias="QGroundControl/Controls/QGCMapCircleVisuals.qml">src/MissionManager/QGCMapCircleVisuals.qml</file>
<file alias="QGroundControl/Controls/QGCMapPolygonVisuals.qml">src/MissionManager/QGCMapPolygonVisuals.qml</file>
<file alias="QGroundControl/Controls/QGCMapPolylineVisuals.qml">src/MissionManager/QGCMapPolylineVisuals.qml</file>
<file alias="QGroundControl/Controls/CameraCalc.qml">src/PlanView/CameraCalc.qml</file>
<file alias="QGroundControl/Controls/CameraSection.qml">src/PlanView/CameraSection.qml</file>
<file alias="CorridorScanEditor.qml">src/PlanView/CorridorScanEditor.qml</file>
<file alias="QGroundControl/Controls/CorridorScanMapVisual.qml">src/PlanView/CorridorScanMapVisual.qml</file>
<file alias="FWLandingPatternEditor.qml">src/PlanView/FWLandingPatternEditor.qml</file>
<file alias="QGroundControl/Controls/FWLandingPatternMapVisual.qml">src/PlanView/FWLandingPatternMapVisual.qml</file>
<file alias="QGroundControl/Controls/GeoFenceEditor.qml">src/PlanView/GeoFenceEditor.qml</file>
<file alias="QGroundControl/Controls/GeoFenceMapVisuals.qml">src/PlanView/GeoFenceMapVisuals.qml</file>
<file alias="QGroundControl/Controls/MissionItemEditor.qml">src/PlanView/MissionItemEditor.qml</file>
<file alias="QGroundControl/Controls/MissionItemMapVisual.qml">src/PlanView/MissionItemMapVisual.qml</file>
<file alias="QGroundControl/Controls/MissionItemStatus.qml">src/PlanView/MissionItemStatus.qml</file>
<file alias="MissionSettingsEditor.qml">src/PlanView/MissionSettingsEditor.qml</file>
<file alias="QGroundControl/Controls/PlanToolBar.qml">src/PlanView/PlanToolBar.qml</file>
<file alias="PlanView.qml">src/PlanView/PlanView.qml</file>
<file alias="QGroundControl/Controls/RallyPointEditorHeader.qml">src/PlanView/RallyPointEditorHeader.qml</file>
<file alias="QGroundControl/Controls/RallyPointItemEditor.qml">src/PlanView/RallyPointItemEditor.qml</file>
<file alias="QGroundControl/Controls/RallyPointMapVisuals.qml">src/PlanView/RallyPointMapVisuals.qml</file>
<file alias="SimpleItemEditor.qml">src/PlanView/SimpleItemEditor.qml</file>
<file alias="QGroundControl/Controls/SimpleItemMapVisual.qml">src/PlanView/SimpleItemMapVisual.qml</file>
<file alias="StructureScanEditor.qml">src/PlanView/StructureScanEditor.qml</file>
<file alias="QGroundControl/Controls/StructureScanMapVisual.qml">src/PlanView/StructureScanMapVisual.qml</file>
<file alias="SurveyItemEditor.qml">src/PlanView/SurveyItemEditor.qml</file>
<file alias="QGroundControl/Controls/SurveyMapVisual.qml">src/PlanView/SurveyMapVisual.qml</file>
<file alias="QGroundControl/Controls/TransectStyleComplexItemStats.qml">src/PlanView/TransectStyleComplexItemStats.qml</file>
<file alias="QGroundControl/FlightMap/WimaMissionItemMapVisual.qml">src/PlanView/WimaMissionItemMapVisual.qml</file>
<file alias="QGroundControl/Controls/AppMessages.qml">src/QmlControls/AppMessages.qml</file>
<file alias="QGroundControl/Controls/ClickableColor.qml">src/QmlControls/ClickableColor.qml</file>
<file alias="QGroundControl/Controls/DeadMouseArea.qml">src/QmlControls/DeadMouseArea.qml</file>
<file alias="QGroundControl/Controls/DropButton.qml">src/QmlControls/DropButton.qml</file>
<file alias="QGroundControl/Controls/DropPanel.qml">src/QmlControls/DropPanel.qml</file>
<file alias="QGroundControl/Controls/EditPositionDialog.qml">src/QmlControls/EditPositionDialog.qml</file>
<file alias="QGroundControl/Controls/ExclusiveGroupItem.qml">src/QmlControls/ExclusiveGroupItem.qml</file>
<file alias="QGroundControl/Controls/FactSliderPanel.qml">src/QmlControls/FactSliderPanel.qml</file>
<file alias="QGroundControl/Controls/FileButton.qml">src/QmlControls/FileButton.qml</file>
<file alias="QGroundControl/Controls/FlightModeDropdown.qml">src/QmlControls/FlightModeDropdown.qml</file>
<file alias="QGroundControl/Controls/FlightModeMenu.qml">src/QmlControls/FlightModeMenu.qml</file>
<file alias="QGroundControl/Controls/FWLandingPatternMapVisual.qml">src/PlanView/FWLandingPatternMapVisual.qml</file>
<file alias="QGroundControl/Controls/GeoFenceEditor.qml">src/PlanView/GeoFenceEditor.qml</file>
<file alias="QGroundControl/Controls/GeoFenceMapVisuals.qml">src/PlanView/GeoFenceMapVisuals.qml</file>
<file alias="QGroundControl/Controls/IndicatorButton.qml">src/QmlControls/IndicatorButton.qml</file>
<file alias="QGroundControl/Controls/JoystickThumbPad.qml">src/QmlControls/JoystickThumbPad.qml</file>
<file alias="QGroundControl/Controls/MainToolBar.qml">src/ui/toolbar/MainToolBar.qml</file>
<file alias="QGroundControl/Controls/MainToolBarIndicators.qml">src/ui/toolbar/MainToolBarIndicators.qml</file>
<file alias="QGroundControl/Controls/MissionCommandDialog.qml">src/QmlControls/MissionCommandDialog.qml</file>
<file alias="QGroundControl/Controls/MissionItemEditor.qml">src/PlanView/MissionItemEditor.qml</file>
<file alias="QGroundControl/Controls/MissionItemIndexLabel.qml">src/QmlControls/MissionItemIndexLabel.qml</file>
<file alias="QGroundControl/Controls/MissionItemMapVisual.qml">src/PlanView/MissionItemMapVisual.qml</file>
<file alias="QGroundControl/Controls/MissionItemStatus.qml">src/PlanView/MissionItemStatus.qml</file>
<file alias="QGroundControl/Controls/ModeSwitchDisplay.qml">src/QmlControls/ModeSwitchDisplay.qml</file>
<file alias="QGroundControl/Controls/MultiRotorMotorDisplay.qml">src/QmlControls/MultiRotorMotorDisplay.qml</file>
<file alias="QGroundControl/Controls/OfflineMapButton.qml">src/QmlControls/OfflineMapButton.qml</file>
<file alias="QGroundControl/Controls/PIDTuning.qml">src/QmlControls/PIDTuning.qml</file>
<file alias="QGroundControl/Controls/PageView.qml">src/QmlControls/PageView.qml</file>
<file alias="QGroundControl/Controls/ParameterEditor.qml">src/QmlControls/ParameterEditor.qml</file>
<file alias="QGroundControl/Controls/ParameterEditorDialog.qml">src/QmlControls/ParameterEditorDialog.qml</file>
<file alias="QGroundControl/Controls/PIDTuning.qml">src/QmlControls/PIDTuning.qml</file>
<file alias="QGroundControl/Controls/PlanToolBar.qml">src/PlanView/PlanToolBar.qml</file>
<file alias="QGroundControl/Controls/PreFlightCheckButton.qml">src/QmlControls/PreFlightCheckButton.qml</file>
<file alias="QGroundControl/Controls/PreFlightCheckGroup.qml">src/QmlControls/PreFlightCheckGroup.qml</file>
<file alias="QGroundControl/Controls/PreFlightCheckList.qml">src/QmlControls/PreFlightCheckList.qml</file>
<file alias="QGroundControl/Controls/PreFlightCheckModel.qml">src/QmlControls/PreFlightCheckModel.qml</file>
<file alias="QGroundControl/Controls/QGCButton.qml">src/QmlControls/QGCButton.qml</file>
<file alias="QGroundControl/Controls/QGCButtonColumn.qml">src/QmlControls/QGCButtonColumn.qml</file>
<file alias="QGroundControl/Controls/QGCCheckBox.qml">src/QmlControls/QGCCheckBox.qml</file>
<file alias="QGroundControl/Controls/QGCColoredImage.qml">src/QmlControls/QGCColoredImage.qml</file>
<file alias="QGroundControl/Controls/QGCComboBox.qml">src/QmlControls/QGCComboBox.qml</file>
...
...
@@ -105,7 +158,6 @@
<file alias="QGroundControl/Controls/QGCLabel.qml">src/QmlControls/QGCLabel.qml</file>
<file alias="QGroundControl/Controls/QGCListView.qml">src/QmlControls/QGCListView.qml</file>
<file alias="QGroundControl/Controls/QGCMapLabel.qml">src/QmlControls/QGCMapLabel.qml</file>
<file alias="QGroundControl/Controls/QGCMapPolygonVisuals.qml">src/MissionManager/QGCMapPolygonVisuals.qml</file>
<file alias="QGroundControl/Controls/QGCMouseArea.qml">src/QmlControls/QGCMouseArea.qml</file>
<file alias="QGroundControl/Controls/QGCMovableItem.qml">src/QmlControls/QGCMovableItem.qml</file>
<file alias="QGroundControl/Controls/QGCPipable.qml">src/QmlControls/QGCPipable.qml</file>
...
...
@@ -120,142 +172,83 @@
<file alias="QGroundControl/Controls/QGCViewMessage.qml">src/QmlControls/QGCViewMessage.qml</file>
<file alias="QGroundControl/Controls/QGCViewPanel.qml">src/QmlControls/QGCViewPanel.qml</file>
<file alias="QGroundControl/Controls/qmldir">src/QmlControls/QGroundControl.Controls.qmldir</file>
<file alias="QGroundControl/Controls/RallyPointEditorHeader.qml">src/PlanView/RallyPointEditorHeader.qml</file>
<file alias="QGroundControl/Controls/RallyPointItemEditor.qml">src/PlanView/RallyPointItemEditor.qml</file>
<file alias="QGroundControl/Controls/RallyPointMapVisuals.qml">src/PlanView/RallyPointMapVisuals.qml</file>
<file alias="QGroundControl/ScreenTools/qmldir">src/QmlControls/QGroundControl.ScreenTools.qmldir</file>
<file alias="QmlTest.qml">src/QmlControls/QmlTest.qml</file>
<file alias="QGroundControl/Controls/RCChannelMonitor.qml">src/QmlControls/RCChannelMonitor.qml</file>
<file alias="QGroundControl/Controls/RoundButton.qml">src/QmlControls/RoundButton.qml</file>
<file alias="QGroundControl/ScreenTools/ScreenTools.qml">src/QmlControls/ScreenTools.qml</file>
<file alias="QGroundControl/Controls/SectionHeader.qml">src/QmlControls/SectionHeader.qml</file>
<file alias="QGroundControl/Controls/SetupPage.qml">src/AutoPilotPlugins/Common/SetupPage.qml</file>
<file alias="QGroundControl/Controls/SignalStrength.qml">src/ui/toolbar/SignalStrength.qml</file>
<file alias="QGroundControl/Controls/SimpleItemMapVisual.qml">src/PlanView/SimpleItemMapVisual.qml</file>
<file alias="QGroundControl/Controls/SliderSwitch.qml">src/QmlControls/SliderSwitch.qml</file>
<file alias="QGroundControl/Controls/SubMenuButton.qml">src/QmlControls/SubMenuButton.qml</file>
<file alias="QGroundControl/Controls/SurveyMapVisual.qml">src/PlanView/SurveyMapVisual.qml</file>
<file alias="QGroundControl/Controls/TransectStyleComplexItemStats.qml">src/PlanView/TransectStyleComplexItemStats.qml</file>
<file alias="QGroundControl/Controls/ToolStrip.qml">src/QmlControls/ToolStrip.qml</file>
<file alias="QGroundControl/Controls/VehicleRotationCal.qml">src/QmlControls/VehicleRotationCal.qml</file>
<file alias="QGroundControl/Controls/VehicleSummaryRow.qml">src/QmlControls/VehicleSummaryRow.qml</file>
<file alias="QGroundControl/Controls/ViewWidget.qml">src/ViewWidgets/ViewWidget.qml</file>
<file alias="QGroundControl/FactControls/AltitudeFactTextField.qml">src/FactSystem/FactControls/AltitudeFactTextField.qml</file>
<file alias="QGroundControl/FactControls/FactBitmask.qml">src/FactSystem/FactControls/FactBitmask.qml</file>
<file alias="QGroundControl/FactControls/FactCheckBox.qml">src/FactSystem/FactControls/FactCheckBox.qml</file>
<file alias="QGroundControl/FactControls/FactComboBox.qml">src/FactSystem/FactControls/FactComboBox.qml</file>
<file alias="QGroundControl/FactControls/FactLabel.qml">src/FactSystem/FactControls/FactLabel.qml</file>
<file alias="QGroundControl/FactControls/FactPanel.qml">src/FactSystem/FactControls/FactPanel.qml</file>
<file alias="QGroundControl/FactControls/FactTextField.qml">src/FactSystem/FactControls/FactTextField.qml</file>
<file alias="QGroundControl/FactControls/FactTextFieldGrid.qml">src/FactSystem/FactControls/FactTextFieldGrid.qml</file>
<file alias="QGroundControl/FactControls/FactTextFieldRow.qml">src/FactSystem/FactControls/FactTextFieldRow.qml</file>
<file alias="QGroundControl/FactControls/FactValueSlider.qml">src/FactSystem/FactControls/FactValueSlider.qml</file>
<file alias="QGroundControl/FactControls/FactTextFieldSlider.qml">src/FactSystem/FactControls/FactTextFieldSlider.qml</file>
<file alias="QGroundControl/FactControls/qmldir">src/FactSystem/FactControls/qmldir</file>
<file alias="QGroundControl/FlightDisplay/FlightDisplayView.qml">src/FlightDisplay/FlightDisplayView.qml</file>
<file alias="QGroundControl/FlightDisplay/FlightDisplayViewMap.qml">src/FlightDisplay/FlightDisplayViewMap.qml</file>
<file alias="QGroundControl/FlightDisplay/FlightDisplayViewVideo.qml">src/FlightDisplay/FlightDisplayViewVideo.qml</file>
<file alias="QGroundControl/FlightDisplay/FlightDisplayViewWidgets.qml">src/FlightDisplay/FlightDisplayViewWidgets.qml</file>
<file alias="QGroundControl/FlightDisplay/GuidedActionConfirm.qml">src/FlightDisplay/GuidedActionConfirm.qml</file>
<file alias="QGroundControl/FlightDisplay/GuidedActionList.qml">src/FlightDisplay/GuidedActionList.qml</file>
<file alias="QGroundControl/FlightDisplay/GuidedActionsController.qml">src/FlightDisplay/GuidedActionsController.qml</file>
<file alias="QGroundControl/FlightDisplay/GuidedAltitudeSlider.qml">src/FlightDisplay/GuidedAltitudeSlider.qml</file>
<file alias="QGroundControl/FlightDisplay/MultiVehicleList.qml">src/FlightDisplay/MultiVehicleList.qml</file>
<file alias="QGroundControl/FlightDisplay/PreFlightBatteryCheck.qml">src/FlightDisplay/PreFlightBatteryCheck.qml</file>
<file alias="QGroundControl/FlightDisplay/BuiltInPreFlightCheckModel.qml">src/FlightDisplay/BuiltInPreFlightCheckModel.qml</file>
<file alias="QGroundControl/FlightDisplay/PreFlightGPSCheck.qml">src/FlightDisplay/PreFlightGPSCheck.qml</file>
<file alias="QGroundControl/FlightDisplay/PreFlightRCCheck.qml">src/FlightDisplay/PreFlightRCCheck.qml</file>
<file alias="QGroundControl/FlightDisplay/PreFlightSensorsHealthCheck.qml">src/FlightDisplay/PreFlightSensorsHealthCheck.qml</file>
<file alias="QGroundControl/FlightDisplay/PreFlightSoundCheck.qml">src/FlightDisplay/PreFlightSoundCheck.qml</file>
<file alias="QGroundControl/FlightDisplay/qmldir">src/FlightDisplay/qmldir</file>
<file alias="QGroundControl/FlightMap/CameraTriggerIndicator.qml">src/FlightMap/MapItems/CameraTriggerIndicator.qml</file>
<file alias="QGroundControl/FlightMap/CenterMapDropButton.qml">src/FlightMap/Widgets/CenterMapDropButton.qml</file>
<file alias="QGroundControl/FlightMap/CenterMapDropPanel.qml">src/FlightMap/Widgets/CenterMapDropPanel.qml</file>
<file alias="QGroundControl/FlightMap/CompassRing.qml">src/FlightMap/Widgets/CompassRing.qml</file>
<file alias="QGroundControl/FlightMap/CustomMapItems.qml">src/FlightMap/MapItems/CustomMapItems.qml</file>
<file alias="QGroundControl/FlightMap/FlightMap.qml">src/FlightMap/FlightMap.qml</file>
<file alias="QGroundControl/FlightMap/InstrumentSwipeView.qml">src/FlightMap/Widgets/InstrumentSwipeView.qml</file>
<file alias="QGroundControl/FlightMap/MapFitFunctions.qml">src/FlightMap/Widgets/MapFitFunctions.qml</file>
<file alias="QGroundControl/FlightMap/MapScale.qml">src/FlightMap/MapScale.qml</file>
<file alias="QGroundControl/FlightMap/MissionItemIndicator.qml">src/FlightMap/MapItems/MissionItemIndicator.qml</file>
<file alias="QGroundControl/FlightMap/MissionItemIndicatorDrag.qml">src/FlightMap/MapItems/MissionItemIndicatorDrag.qml</file>
<file alias="QGroundControl/FlightMap/MissionItemView.qml">src/FlightMap/MapItems/MissionItemView.qml</file>
<file alias="QGroundControl/FlightMap/MissionLineView.qml">src/FlightMap/MapItems/MissionLineView.qml</file>
<file alias="QGroundControl/FlightMap/PlanMapItems.qml">src/FlightMap/MapItems/PlanMapItems.qml</file>
<file alias="QGroundControl/FlightMap/PolygonEditor.qml">src/FlightMap/MapItems/PolygonEditor.qml</file>
<file alias="QGroundControl/FlightMap/QGCArtificialHorizon.qml">src/FlightMap/Widgets/QGCArtificialHorizon.qml</file>
<file alias="QGroundControl/FlightMap/QGCAttitudeHUD.qml">src/FlightMap/Widgets/QGCAttitudeHUD.qml</file>
<file alias="QGroundControl/FlightMap/QGCAttitudeWidget.qml">src/FlightMap/Widgets/QGCAttitudeWidget.qml</file>
<file alias="QGroundControl/FlightMap/QGCCompassWidget.qml">src/FlightMap/Widgets/QGCCompassWidget.qml</file>
<file alias="QGroundControl/FlightMap/QGCPitchIndicator.qml">src/FlightMap/Widgets/QGCPitchIndicator.qml</file>
<file alias="QGroundControl/FlightMap/QGCVideoBackground.qml">src/FlightMap/QGCVideoBackground.qml</file>
<file alias="QGroundControl/FlightMap/qmldir">src/FlightMap/qmldir</file>
<file alias="QGroundControl/FlightMap/VehicleMapItem.qml">src/FlightMap/MapItems/VehicleMapItem.qml</file>
<file alias="QGroundControl/ScreenTools/qmldir">src/QmlControls/QGroundControl.ScreenTools.qmldir</file>
<file alias="QGroundControl/ScreenTools/ScreenTools.qml">src/QmlControls/ScreenTools.qml</file>
<file alias="QmlTest.qml">src/QmlControls/QmlTest.qml</file>
<file alias="RadioComponent.qml">src/AutoPilotPlugins/Common/RadioComponent.qml</file>
<file alias="SerialSettings.qml">src/ui/preferences/SerialSettings.qml</file>
<file alias="OfflineMap.qml">src/QtLocationPlugin/QMLControl/OfflineMap.qml</file>
<file alias="TaisyncSettings.qml">src/Taisync/TaisyncSettings.qml</file>
<file alias="FirmwareUpgrade.qml">src/VehicleSetup/FirmwareUpgrade.qml</file>
<file alias="JoystickConfig.qml">src/VehicleSetup/JoystickConfig.qml</file>
<file alias="PX4FlowSensor.qml">src/VehicleSetup/PX4FlowSensor.qml</file>
<file alias="SetupParameterEditor.qml">src/VehicleSetup/SetupParameterEditor.qml</file>
<file alias="SetupView.qml">src/VehicleSetup/SetupView.qml</file>
<file alias="SimpleItemEditor.qml">src/PlanView/SimpleItemEditor.qml</file>
<file alias="StructureScanEditor.qml">src/PlanView/StructureScanEditor.qml</file>
<file alias="SurveyItemEditor.qml">src/PlanView/SurveyItemEditor.qml</file>
<file alias="SyslinkComponent.qml">src/AutoPilotPlugins/Common/SyslinkComponent.qml</file>
<file alias="TcpSettings.qml">src/ui/preferences/TcpSettings.qml</file>
<file alias="TaisyncSettings.qml">src/Taisync/TaisyncSettings.qml</file>
<file alias="test.qml">src/test.qml</file>
<file alias="UdpSettings.qml">src/ui/preferences/UdpSettings.qml</file>
<file alias="ValuePageWidget.qml">src/FlightMap/Widgets/ValuePageWidget.qml</file>
<file alias="VehicleSummary.qml">src/VehicleSetup/VehicleSummary.qml</file>
<file alias="VibrationPageWidget.qml">src/FlightMap/Widgets/VibrationPageWidget.qml</file>
<file alias="VideoPageWidget.qml">src/FlightMap/Widgets/VideoPageWidget.qml</file>
<file alias="VirtualJoystick.qml">src/FlightDisplay/VirtualJoystick.qml</file>
<file alias="QGroundControl/Controls/WimaToolBar.qml">src/WimaView/WimaToolBar.qml</file>
<file alias="CustomCommandWidget.qml">src/ViewWidgets/CustomCommandWidget.qml</file>
<file alias="QGroundControl/Controls/ViewWidget.qml">src/ViewWidgets/ViewWidget.qml</file>
<file alias="Wima/WimaAreaNoVisual.qml">src/Wima/Snake/WimaAreaNoVisual.qml</file>
<file alias="CircularGeneratorEditor.qml">src/WimaView/CircularGeneratorEditor.qml</file>
<file alias="Wima/CircularGeneratorMapVisual.qml">src/WimaView/CircularGeneratorMapVisual.qml</file>
<file alias="CircularSurveyItemEditor.qml">src/WimaView/CircularSurveyItemEditor.qml</file>
<file alias="Wima/CircularSurveyMapVisual.qml">src/WimaView/CircularSurveyMapVisual.qml</file>
<file alias="Wima/CoordinateIndicator.qml">src/WimaView/CoordinateIndicator.qml</file>
<file alias="Wima/CoordinateIndicatorDrag.qml">src/WimaView/CoordinateIndicatorDrag.qml</file>
<file alias="Wima/DragCoordinate.qml">src/WimaView/DragCoordinate.qml</file>
<file alias="LinearGeneratorEditor.qml">src/WimaView/LinearGeneratorEditor.qml</file>
<file alias="Wima/ProgressIndicator.qml">src/WimaView/ProgressIndicator.qml</file>
<file alias="Wima/qmldir">src/WimaView/Wima.qmldir</file>
<file alias="Wima/WimaAreaMapVisual.qml">src/WimaView/WimaAreaMapVisual.qml</file>
<file alias="Wima/WimaCorridorDataVisual.qml">src/WimaView/WimaCorridorDataVisual.qml</file>
<file alias="Wima/WimaCorridorEditor.qml">src/WimaView/WimaCorridorEditor.qml</file>
<file alias="Wima/WimaCorridorMapVisual.qml">src/WimaView/WimaCorridorMapVisual.qml</file>
<file alias="Wima/WimaItemEditor.qml">src/WimaView/WimaItemEditor.qml</file>
<file alias="Wima/WimaJoinedAreaDataVisual.qml">src/WimaView/WimaJoinedAreaDataVisual.qml</file>
<file alias="Wima/WimaJoinedAreaMapVisual.qml">src/WimaView/WimaJoinedAreaMapVisual.qml</file>
<file alias="Wima/WimaMapPolygonVisuals.qml">src/WimaView/WimaMapPolygonVisuals.qml</file>
<file alias="Wima/WimaMapPolylineVisuals.qml">src/WimaView/WimaMapPolylineVisuals.qml</file>
<file alias="Wima/WimaMapVisual.qml">src/WimaView/WimaMapVisual.qml</file>
<file alias="Wima/WimaMeasurementAreaDataVisual.qml">src/WimaView/WimaMeasurementAreaDataVisual.qml</file>
<file alias="Wima/WimaMeasurementAreaEditor.qml">src/WimaView/WimaMeasurementAreaEditor.qml</file>
<file alias="Wima/WimaMeasurementAreaMapVisual.qml">src/WimaView/WimaMeasurementAreaMapVisual.qml</file>
<file alias="Wima/WimaServiceAreaDataVisual.qml">src/WimaView/WimaServiceAreaDataVisual.qml</file>
<file alias="Wima/WimaServiceAreaEditor.qml">src/WimaView/WimaServiceAreaEditor.qml</file>
<file alias="Wima/WimaServiceAreaMapVisual.qml">src/WimaView/WimaServiceAreaMapVisual.qml</file>
<file alias="Wima/WimaToolBar.qml">src/WimaView/WimaToolBar.qml</file>
<file alias="WimaView.qml">src/WimaView/WimaView.qml</file>
<file alias="QGroundControl/Controls/WimaMapVisual.qml">src/WimaView/WimaMapVisual.qml</file>
<file alias="QGroundControl/Controls/WimaItemEditor.qml">src/WimaView/WimaItemEditor.qml</file>
<file alias="QGroundControl/Controls/WimaMapPolylineVisuals.qml">src/WimaView/WimaMapPolylineVisuals.qml</file>
<file alias="QGroundControl/Controls/WimaMapPolygonVisuals.qml">src/WimaView/WimaMapPolygonVisuals.qml</file>
<file alias="QGroundControl/Controls/WimaServiceAreaMapVisual.qml">src/WimaView/WimaServiceAreaMapVisual.qml</file>
<file alias="QGroundControl/Controls/WimaServiceAreaEditor.qml">src/WimaView/WimaServiceAreaEditor.qml</file>
<file alias="QGroundControl/Controls/WimaAreaMapVisual.qml">src/WimaView/WimaAreaMapVisual.qml</file>
<file alias="QGroundControl/Controls/WimaMeasurementAreaMapVisual.qml">src/WimaView/WimaMeasurementAreaMapVisual.qml</file>
<file alias="QGroundControl/Controls/WimaCorridorMapVisual.qml">src/WimaView/WimaCorridorMapVisual.qml</file>
<file alias="QGroundControl/Controls/WimaMeasurementAreaEditor.qml">src/WimaView/WimaMeasurementAreaEditor.qml</file>
<file alias="CircularSurveyItemEditor.qml">src/PlanView/CircularSurveyItemEditor.qml</file>
<file alias="QGroundControl/Controls/DragCoordinate.qml">src/WimaView/DragCoordinate.qml</file>
<file alias="QGroundControl/Controls/CoordinateIndicatorDrag.qml">src/WimaView/CoordinateIndicatorDrag.qml</file>
<file alias="QGroundControl/Controls/CoordinateIndicator.qml">src/WimaView/CoordinateIndicator.qml</file>
<file alias="QGroundControl/Controls/WimaJoinedAreaMapVisual.qml">src/WimaView/WimaJoinedAreaMapVisual.qml</file>
<file alias="QGroundControl/Controls/WimaCorridorEditor.qml">src/WimaView/WimaCorridorEditor.qml</file>
<file alias="QGroundControl/FlightMap/WimaPlanMapItems.qml">src/FlightMap/MapItems/WimaPlanMapItems.qml</file>
<file alias="QGroundControl/FlightMap/WimaMissionItemMapVisual.qml">src/PlanView/WimaMissionItemMapVisual.qml</file>
<file alias="QGroundControl/FlightDisplay/FlightDisplayWimaMenu.qml">src/FlightDisplay/FlightDisplayWimaMenu.qml</file>
<file alias="QGroundControl/Controls/CircularSurveyMapVisual.qml">src/WimaView/CircularSurveyMapVisual.qml</file>
<file alias="QGroundControl/FlightDisplay/SmallValue.qml">src/FlightDisplay/SmallValue.qml</file>
<file alias="QGroundControl/Controls/ProgressIndicator.qml">src/WimaView/ProgressIndicator.qml</file>
<file alias="QGroundControl/Controls/WimaServiceAreaDataVisual.qml">src/WimaView/WimaServiceAreaDataVisual.qml</file>
<file alias="QGroundControl/Controls/WimaCorridorDataVisual.qml">src/WimaView/WimaCorridorDataVisual.qml</file>
<file alias="QGroundControl/Controls/WimaJoinedAreaDataVisual.qml">src/WimaView/WimaJoinedAreaDataVisual.qml</file>
<file alias="QGroundControl/Controls/WimaAreaNoVisual.qml">src/Wima/Snake/WimaAreaNoVisual.qml</file>
<file alias="QGroundControl/Controls/WimaMeasurementAreaDataVisual.qml">src/WimaView/WimaMeasurementAreaDataVisual.qml</file>
<file alias="QGroundControl/Controls/QGCButtonColumn.qml">src/QmlControls/QGCButtonColumn.qml</file>
<file alias="test.qml">src/test.qml</file>
<file alias="AppSettings.qml">src/ui/AppSettings.qml</file>
<file alias="MainWindowHybrid.qml">src/ui/MainWindowHybrid.qml</file>
<file alias="MainWindowInner.qml">src/ui/MainWindowInner.qml</file>
<file alias="MainWindowNative.qml">src/ui/MainWindowNative.qml</file>
<file alias="BluetoothSettings.qml">src/ui/preferences/BluetoothSettings.qml</file>
<file alias="DebugWindow.qml">src/ui/preferences/DebugWindow.qml</file>
<file alias="GeneralSettings.qml">src/ui/preferences/GeneralSettings.qml</file>
<file alias="HelpSettings.qml">src/ui/preferences/HelpSettings.qml</file>
<file alias="LinkSettings.qml">src/ui/preferences/LinkSettings.qml</file>
<file alias="LogReplaySettings.qml">src/ui/preferences/LogReplaySettings.qml</file>
<file alias="MavlinkSettings.qml">src/ui/preferences/MavlinkSettings.qml</file>
<file alias="MockLink.qml">src/ui/preferences/MockLink.qml</file>
<file alias="MockLinkSettings.qml">src/ui/preferences/MockLinkSettings.qml</file>
<file alias="SerialSettings.qml">src/ui/preferences/SerialSettings.qml</file>
<file alias="TcpSettings.qml">src/ui/preferences/TcpSettings.qml</file>
<file alias="UdpSettings.qml">src/ui/preferences/UdpSettings.qml</file>
<file alias="QGroundControl/Controls/MainToolBar.qml">src/ui/toolbar/MainToolBar.qml</file>
<file alias="QGroundControl/Controls/MainToolBarIndicators.qml">src/ui/toolbar/MainToolBarIndicators.qml</file>
<file alias="QGroundControl/Controls/SignalStrength.qml">src/ui/toolbar/SignalStrength.qml</file>
</qresource>
<qresource prefix="/json">
<file alias="APMMavlinkStreamRate.SettingsGroup.json">src/Settings/APMMavlinkStreamRate.SettingsGroup.json</file>
<file alias="CameraCalc.FactMetaData.json">src/MissionManager/CameraCalc.FactMetaData.json</file>
<file alias="CameraSection.FactMetaData.json">src/MissionManager/CameraSection.FactMetaData.json</file>
<file alias="CameraSpec.FactMetaData.json">src/MissionManager/CameraSpec.FactMetaData.json</file>
<file alias="CorridorScan.SettingsGroup.json">src/MissionManager/CorridorScan.SettingsGroup.json</file>
<file alias="EditPositionDialog.FactMetaData.json">src/QmlControls/EditPositionDialog.FactMetaData.json</file>
<file alias="QGCMapCircle.Facts.json">src/MissionManager/QGCMapCircle.Facts.json</file>
<file alias="StructureScan.SettingsGroup.json">src/MissionManager/StructureScan.SettingsGroup.json</file>
<file alias="TransectStyle.SettingsGroup.json">src/MissionManager/TransectStyle.SettingsGroup.json</file>
<file alias="App.SettingsGroup.json">src/Settings/App.SettingsGroup.json</file>
<file alias="AutoConnect.SettingsGroup.json">src/Settings/AutoConnect.SettingsGroup.json</file>
<file alias="BrandImage.SettingsGroup.json">src/Settings/BrandImage.SettingsGroup.json</file>
<file alias="CameraSection.FactMetaData.json">src/MissionManager/CameraSection.FactMetaData.json</file>
<file alias="FlightMap.SettingsGroup.json">src/Settings/FlightMap.SettingsGroup.json</file>
<file alias="FWLandingPattern.FactMetaData.json">src/MissionManager/FWLandingPattern.FactMetaData.json</file>
<file alias="FlyView.SettingsGroup.json">src/Settings/FlyView.SettingsGroup.json</file>
<file alias="PlanView.SettingsGroup.json">src/Settings/PlanView.SettingsGroup.json</file>
<file alias="MavCmdInfoCommon.json">src/MissionManager/MavCmdInfoCommon.json</file>
<file alias="MavCmdInfoFixedWing.json">src/MissionManager/MavCmdInfoFixedWing.json</file>
<file alias="MavCmdInfoMultiRotor.json">src/MissionManager/MavCmdInfoMultiRotor.json</file>
...
...
@@ -263,12 +256,24 @@
<file alias="MavCmdInfoSub.json">src/MissionManager/MavCmdInfoSub.json</file>
<file alias="MavCmdInfoVTOL.json">src/MissionManager/MavCmdInfoVTOL.json</file>
<file alias="MissionSettings.FactMetaData.json">src/MissionManager/MissionSettings.FactMetaData.json</file>
<file alias="QGCMapCircle.Facts.json">src/MissionManager/QGCMapCircle.Facts.json</file>
<file alias="RallyPoint.FactMetaData.json">src/MissionManager/RallyPoint.FactMetaData.json</file>
<file alias="RTK.SettingsGroup.json">src/Settings/RTK.SettingsGroup.json</file>
<file alias="SpeedSection.FactMetaData.json">src/MissionManager/SpeedSection.FactMetaData.json</file>
<file alias="StructureScan.SettingsGroup.json">src/MissionManager/StructureScan.SettingsGroup.json</file>
<file alias="Survey.SettingsGroup.json">src/MissionManager/Survey.SettingsGroup.json</file>
<file alias="TransectStyle.SettingsGroup.json">src/MissionManager/TransectStyle.SettingsGroup.json</file>
<file alias="EditPositionDialog.FactMetaData.json">src/QmlControls/EditPositionDialog.FactMetaData.json</file>
<file alias="APMMavlinkStreamRate.SettingsGroup.json">src/Settings/APMMavlinkStreamRate.SettingsGroup.json</file>
<file alias="App.SettingsGroup.json">src/Settings/App.SettingsGroup.json</file>
<file alias="AutoConnect.SettingsGroup.json">src/Settings/AutoConnect.SettingsGroup.json</file>
<file alias="BrandImage.SettingsGroup.json">src/Settings/BrandImage.SettingsGroup.json</file>
<file alias="FlightMap.SettingsGroup.json">src/Settings/FlightMap.SettingsGroup.json</file>
<file alias="FlyView.SettingsGroup.json">src/Settings/FlyView.SettingsGroup.json</file>
<file alias="PlanView.SettingsGroup.json">src/Settings/PlanView.SettingsGroup.json</file>
<file alias="RTK.SettingsGroup.json">src/Settings/RTK.SettingsGroup.json</file>
<file alias="Units.SettingsGroup.json">src/Settings/Units.SettingsGroup.json</file>
<file alias="USBBoardInfo.json">src/comm/USBBoardInfo.json</file>
<file alias="Video.SettingsGroup.json">src/Settings/Video.SettingsGroup.json</file>
<file alias="Wima.SettingsGroup.json">src/Settings/Wima.SettingsGroup.json</file>
<file alias="Vehicle/BatteryFact.json">src/Vehicle/BatteryFact.json</file>
<file alias="Vehicle/ClockFact.json">src/Vehicle/ClockFact.json</file>
<file alias="Vehicle/DistanceSensorFact.json">src/Vehicle/DistanceSensorFact.json</file>
...
...
@@ -281,14 +286,13 @@
<file alias="Vehicle/VehicleFact.json">src/Vehicle/VehicleFact.json</file>
<file alias="Vehicle/VibrationFact.json">src/Vehicle/VibrationFact.json</file>
<file alias="Vehicle/WindFact.json">src/Vehicle/WindFact.json</file>
<file alias="Video.SettingsGroup.json">src/Settings/Video.SettingsGroup.json</file>
<file alias="WimaMeasurementArea.SettingsGroup.json">src/Wima/Geometry/json/WimaMeasurementArea.SettingsGroup.json</file>
<file alias="CircularSurvey.SettingsGroup.json">src/Wima/json/CircularSurvey.SettingsGroup.json</file>
<file alias="WimaArea.SettingsGroup.json">src/Wima/Geometry/json/WimaArea.SettingsGroup.json</file>
<file alias="WimaController.SettingsGroup.json">src/Wima/json/WimaController.SettingsGroup.json</file>
<file alias="Wima.SettingsGroup.json">src/Settings/Wima.SettingsGroup.json</file>
<file alias="WimaMeasurementArea.SettingsGroup.json">src/Wima/Geometry/json/WimaMeasurementArea.SettingsGroup.json</file>
<file alias="CircularGenerator.SettingsGroup.json">src/Wima/Snake/json/CircularGenerator.SettingsGroup.json</file>
<file alias="LinearGenerator.SettingsGroup.json">src/Wima/Snake/json/LinearGenerator.SettingsGroup.json</file>
<file alias="CircularSurvey.SettingsGroup.json">src/Wima/json/CircularSurvey.SettingsGroup.json</file>
<file alias="WimaController.SettingsGroup.json">src/Wima/json/WimaController.SettingsGroup.json</file>
<file alias="USBBoardInfo.json">src/comm/USBBoardInfo.json</file>
</qresource>
<qresource prefix="/MockLink">
<file alias="APMArduCopterMockLink.params">src/comm/APMArduCopterMockLink.params</file>
...
...
src/FlightDisplay/FlightDisplayViewMap.qml
View file @
67cbe3f7
...
...
@@ -24,6 +24,8 @@ import QGroundControl.Palette 1.0
import
QGroundControl
.
ScreenTools
1.0
import
QGroundControl
.
Vehicle
1.0
import
Wima
1.0
FlightMap
{
id
:
flightMap
anchors.fill
:
parent
...
...
src/QGCApplication.cc
View file @
67cbe3f7
...
...
@@ -89,6 +89,8 @@
#include "VideoSurface.h"
#include "ViewWidgetController.h"
#include "VisualMissionItem.h"
#include "Wima/Snake/CircularGenerator.h"
#include "Wima/Snake/LinearGenerator.h"
#include "Wima/Snake/NemoInterface.h"
#include "Wima/WimaController.h"
#include "Wima/WimaPlaner.h"
...
...
@@ -520,6 +522,10 @@ void QGCApplication::_initCommon(void) {
qmlRegisterType
<
WimaController
>
(
"Wima"
,
1
,
0
,
"WimaController"
);
qmlRegisterType
<
WimaPlaner
>
(
"Wima"
,
1
,
0
,
"WimaPlaner"
);
qmlRegisterType
<
NemoInterface
>
(
"Wima"
,
1
,
0
,
"NemoInterface"
);
qmlRegisterInterface
<
routing
::
GeneratorBase
>
(
"GeneratorBase"
);
qmlRegisterType
<
routing
::
CircularGenerator
>
(
"Wima"
,
1
,
0
,
"CircularGenerator"
);
qmlRegisterType
<
routing
::
LinearGenerator
>
(
"Wima"
,
1
,
0
,
"LinearGenerator"
);
// Register Qml Singletons
qmlRegisterSingletonType
<
QGroundControlQmlGlobal
>
(
...
...
src/QmlControls/QGroundControl.Controls.qmldir
View file @
67cbe3f7
...
...
@@ -65,7 +65,6 @@ QGCViewDialog 1.0 QGCViewDialog.qml
QGCViewDialogContainer 1.0 QGCViewDialogContainer.qml
QGCViewMessage 1.0 QGCViewMessage.qml
QGCViewPanel 1.0 QGCViewPanel.qml
WimaToolBar 1.0 WimaToolBar.qml
RallyPointEditorHeader 1.0 RallyPointEditorHeader.qml
RallyPointItemEditor 1.0 RallyPointItemEditor.qml
RallyPointMapVisuals 1.0 RallyPointMapVisuals.qml
...
...
@@ -85,22 +84,6 @@ VehicleSummaryRow 1.0 VehicleSummaryRow.qml
ViewWidget 1.0 ViewWidget.qml
FlyAreaItemEditor 1.0 FlyAreaItemEditor.qml
WimaMapVisual 1.0 WimaMapVisual.qml
WimaMeasurementAreaMapVisual 1.0 WimaMeasurementAreaMapVisual.qml
WimaJoinedAreaMapVisual 1.0 WimaJoinedAreaMapVisual.qml
WimaMeasurementAreaEditor 1.0 WimaMeasurementAreaEditor.qml
WimaServiceAreaMapVisual 1.0 WimaServiceAreaMapVisual.qml
WimaAreaMapVisual 1.0 WimaAreaMapVisual.qml
WimaServiceAreaEditor 1.0 WimaServiceAreaEditor.qml
WimaCorridorMapVisual 1.0 WimaCorridorMapVisual.qml
WimaItemEditor 1.0 WimaItemEditor.qml
WimaMapPolygonVisuals 1.0 WimaMapPolygonVisuals.qml
WimaMapPolylineVisuals 1.0 WimaMapPolylineVisuals.qml
CircularSurveyMapVisual 1.0 CircularSurveyMapVisual.qml
DragCoordinate 1.0 DragCoordinate.qml
CoordinateIndicator 1.0 CoordinateIndicator.qml
CoordinateIndicatorDrag 1.0 CoordinateIndicatorDrag.qml
ProgressIndicator 1.0 ProgressIndicator.qml
QGCButtonColumn 1.0 QGCButtonColumn.qml
src/Wima/CircularSurvey.cc
View file @
67cbe3f7
...
...
@@ -27,7 +27,6 @@ constexpr typename std::underlying_type<T>::type integral(T value) {
}
const
char
*
CircularSurvey
::
settingsGroup
=
"CircularSurvey"
;
const
char
*
CircularSurvey
::
typeName
=
"Type"
;
const
char
*
CircularSurvey
::
CircularSurveyName
=
"CircularSurvey"
;
const
char
*
CircularSurvey
::
variantName
=
"Variant"
;
...
...
@@ -37,17 +36,14 @@ CircularSurvey::CircularSurvey(Vehicle *vehicle, bool flyView,
_state
(
STATE
::
IDLE
),
_metaDataMap
(
FactMetaData
::
createMapFromJsonFile
(
QStringLiteral
(
":/json/CircularSurvey.SettingsGroup.json"
),
this
)),
_type
(
settingsGroup
,
_metaDataMap
[
typeName
]),
_variant
(
settingsGroup
,
_metaDataMap
[
variantName
]),
_
a
reaData
(
std
::
make_shared
<
WimaPlanData
>
()),
_
pA
reaData
(
std
::
make_shared
<
WimaPlanData
>
()),
_pWorker
(
std
::
make_unique
<
RoutingThread
>
())
{
Q_UNUSED
(
kmlOrShpFile
)
_editorQml
=
"qrc:/qml/CircularSurveyItemEditor.qml"
;
// Connect facts.
connect
(
&
this
->
_type
,
&
Fact
::
rawValueChanged
,
this
,
&
CircularSurvey
::
_rebuildTransects
);
connect
(
&
this
->
_variant
,
&
Fact
::
rawValueChanged
,
this
,
&
CircularSurvey
::
_changeVariant
);
...
...
@@ -65,10 +61,10 @@ CircularSurvey::CircularSurvey(Vehicle *vehicle, bool flyView,
&
CircularSurvey
::
exitCoordinateHasRelativeAltitudeChanged
);
// Register Generators.
auto
cg
=
std
::
make_shared
<
routing
::
CircularGenerator
>
(
this
->
_areaData
);
registerGenerator
(
cg
->
name
(),
cg
);
auto
lg
=
std
::
make_shared
<
routing
::
LinearGenerator
>
(
this
->
_areaData
);
auto
lg
=
std
::
make_shared
<
routing
::
LinearGenerator
>
(
this
->
_pAreaData
);
registerGenerator
(
lg
->
name
(),
lg
);
auto
cg
=
std
::
make_shared
<
routing
::
CircularGenerator
>
(
this
->
_pAreaData
);
registerGenerator
(
cg
->
name
(),
cg
);
}
CircularSurvey
::~
CircularSurvey
()
{}
...
...
@@ -79,10 +75,10 @@ void CircularSurvey::reverse() {
}
void
CircularSurvey
::
setPlanData
(
const
WimaPlanData
&
d
)
{
*
this
->
_
a
reaData
=
d
;
*
this
->
_
pA
reaData
=
d
;
}
Q
List
<
QString
>
CircularSurvey
::
variantNames
()
const
{
return
_variantNames
;
}
Q
StringList
CircularSurvey
::
variantNames
()
const
{
return
_variantNames
;
}
bool
CircularSurvey
::
load
(
const
QJsonObject
&
complexObject
,
int
sequenceNumber
,
QString
&
errorString
)
{
...
...
@@ -105,16 +101,7 @@ bool CircularSurvey::load(const QJsonObject &complexObject, int sequenceNumber,
QList
<
JsonHelper
::
KeyValidateInfo
>
keyInfoList
=
{
{
VisualMissionItem
::
jsonTypeKey
,
QJsonValue
::
String
,
true
},
{
ComplexMissionItem
::
jsonComplexItemTypeKey
,
QJsonValue
::
String
,
true
},
{
transectDistanceName
,
QJsonValue
::
Double
,
true
},
{
alphaName
,
QJsonValue
::
Double
,
true
},
{
minLengthName
,
QJsonValue
::
Double
,
true
},
{
typeName
,
QJsonValue
::
Double
,
true
},
{
variantName
,
QJsonValue
::
Double
,
false
},
{
numRunsName
,
QJsonValue
::
Double
,
false
},
{
runName
,
QJsonValue
::
Double
,
false
},
{
refPointLatitudeName
,
QJsonValue
::
Double
,
true
},
{
refPointLongitudeName
,
QJsonValue
::
Double
,
true
},
{
refPointAltitudeName
,
QJsonValue
::
Double
,
true
},
};
if
(
!
JsonHelper
::
validateKeys
(
complexObject
,
keyInfoList
,
errorString
))
{
...
...
@@ -149,13 +136,7 @@ bool CircularSurvey::load(const QJsonObject &complexObject, int sequenceNumber,
return
false
;
}
_type
.
setRawValue
(
complexObject
[
typeName
].
toInt
());
_variant
.
setRawValue
(
complexObject
[
variantName
].
toInt
());
_numRuns
.
setRawValue
(
complexObject
[
numRunsName
].
toInt
());
_run
.
setRawValue
(
complexObject
[
runName
].
toInt
());
_referencePoint
.
setLongitude
(
complexObject
[
refPointLongitudeName
].
toDouble
());
_referencePoint
.
setLatitude
(
complexObject
[
refPointLatitudeName
].
toDouble
());
_referencePoint
.
setAltitude
(
complexObject
[
refPointAltitudeName
].
toDouble
());
_ignoreRecalc
=
false
;
...
...
@@ -182,13 +163,7 @@ void CircularSurvey::save(QJsonArray &planItems) {
VisualMissionItem
::
jsonTypeComplexItemValue
;
saveObject
[
ComplexMissionItem
::
jsonComplexItemTypeKey
]
=
CircularSurveyName
;
saveObject
[
typeName
]
=
double
(
_type
.
rawValue
().
toUInt
());
saveObject
[
variantName
]
=
double
(
_variant
.
rawValue
().
toUInt
());
saveObject
[
numRunsName
]
=
double
(
_numRuns
.
rawValue
().
toUInt
());
saveObject
[
runName
]
=
double
(
_numRuns
.
rawValue
().
toUInt
());
saveObject
[
refPointLongitudeName
]
=
_referencePoint
.
longitude
();
saveObject
[
refPointLatitudeName
]
=
_referencePoint
.
latitude
();
saveObject
[
refPointAltitudeName
]
=
_referencePoint
.
altitude
();
// Polygon shape
_surveyAreaPolygon
.
saveToJson
(
saveObject
);
...
...
@@ -264,13 +239,15 @@ bool CircularSurvey::_switchToGenerator(
const
CircularSurvey
::
PtrGenerator
&
newG
)
{
if
(
this
->
_pGenerator
!=
newG
)
{
if
(
this
->
_pGenerator
!=
nullptr
)
{
disconnect
(
this
->
_pGenerator
.
get
(),
&
GeneratorBase
::
generatorChanged
,
this
,
&
CircularSurvey
::
_rebuildTransects
);
disconnect
(
this
->
_pGenerator
.
get
(),
&
routing
::
GeneratorBase
::
generatorChanged
,
this
,
&
CircularSurvey
::
_rebuildTransects
);
}
this
->
_pGenerator
=
newG
;
connect
(
this
->
_pGenerator
.
get
(),
&
GeneratorBase
::
generatorChanged
,
this
,
&
CircularSurvey
::
_rebuildTransects
);
connect
(
this
->
_pGenerator
.
get
(),
&
routing
::
GeneratorBase
::
generatorChanged
,
this
,
&
CircularSurvey
::
_rebuildTransects
);
emit
generatorChanged
();
this
->
_state
=
STATE
::
IDLE
;
_rebuildTransects
();
...
...
@@ -286,11 +263,6 @@ void CircularSurvey::_changeVariant() {
this
->
_rebuildTransects
();
}
void
CircularSurvey
::
_changeRun
()
{
this
->
_state
=
STATE
::
RUN_CHANGE
;
this
->
_rebuildTransects
();
}
void
CircularSurvey
::
_updateWorker
()
{
// Mark transects as dirty.
this
->
_transectsDirty
=
true
;
...
...
@@ -300,12 +272,19 @@ void CircularSurvey::_updateWorker() {
this
->
_variantNames
.
clear
();
emit
variantNamesChanged
();
if
(
this
->
_
a
reaData
->
isValid
())
{
if
(
this
->
_
pA
reaData
->
isValid
())
{
// Prepare data.
auto
origin
=
this
->
_areaData
->
origin
();
auto
origin
=
this
->
_pAreaData
->
origin
();
origin
.
setAltitude
(
0
);
if
(
!
origin
.
isValid
())
{
qCWarning
(
CircularSurveyLog
)
<<
"_updateWorker(): origin invalid."
<<
origin
;
return
;
}
// Convert safe area.
auto
geoSafeArea
=
this
->
_
jArea
.
coordinateList
();
auto
geoSafeArea
=
this
->
_
pAreaData
->
joinedArea
()
.
coordinateList
();
if
(
!
(
geoSafeArea
.
size
()
>=
3
))
{
qCWarning
(
CircularSurveyLog
)
<<
"_updateWorker(): safe area invalid."
<<
geoSafeArea
;
...
...
@@ -329,13 +308,20 @@ void CircularSurvey::_updateWorker() {
snake
::
areaToEnu
(
origin
,
geoSafeArea
,
safeAreaENU
);
// Create generator.
GeneratorBase
::
Generator
g
;
// Transect generator.
if
(
_pGenerator
->
get
(
g
))
{
// Start/Restart routing worker.
this
->
_pWorker
->
route
(
par
,
g
);
if
(
this
->
_pGenerator
)
{
routing
::
GeneratorBase
::
Generator
g
;
// Transect generator.
if
(
this
->
_pGenerator
->
get
(
g
))
{
// Start/Restart routing worker.
this
->
_pWorker
->
route
(
par
,
g
);
}
else
{
qCWarning
(
CircularSurveyLog
)
<<
"_updateWorker(): generator creation failed."
;
}
}
else
{
qCWarning
(
CircularSurveyLog
)
<<
"_updateWorker(): generator creation failed."
;
<<
"_updateWorker(): pGenerator == nullptr, number of registered "
"generators: "
<<
this
->
_generatorList
.
size
();
}
}
else
{
qCWarning
(
CircularSurveyLog
)
<<
"_updateWorker(): plan data invalid."
;
...
...
@@ -344,78 +330,42 @@ void CircularSurvey::_updateWorker() {
void
CircularSurvey
::
_changeVariantWorker
()
{
auto
variant
=
this
->
_variant
.
rawValue
().
toUInt
();
auto
run
=
this
->
_run
.
rawValue
().
toUInt
();
// Find old variant and run. Old run corresponts with empty list.
std
::
size_t
old_variant
=
std
::
numeric_limits
<
std
::
size_t
>::
max
();
std
::
size_t
old_run
=
std
::
numeric_limits
<
std
::
size_t
>::
max
();
for
(
std
::
size_t
i
=
0
;
i
<
std
::
size_t
(
this
->
_variantVector
.
size
());
++
i
)
{
const
auto
&
solution
=
this
->
_variantVector
.
at
(
i
);
for
(
std
::
size_t
j
=
0
;
j
<
std
::
size_t
(
solution
.
size
());
++
j
)
{
const
auto
&
r
=
solution
[
j
];
if
(
r
.
isEmpty
())
{
old_variant
=
i
;
old_run
=
j
;
// break
i
=
std
::
numeric_limits
<
std
::
size_t
>::
max
()
-
1
;
j
=
std
::
numeric_limits
<
std
::
size_t
>::
max
()
-
1
;
}
const
auto
&
variantCoordinates
=
this
->
_variantVector
.
at
(
i
);
if
(
variantCoordinates
.
isEmpty
())
{
old_variant
=
i
;
break
;
}
}
// Swap route.
if
(
variant
!=
old_variant
||
run
!=
old_run
)
{
if
(
variant
!=
old_variant
)
{
// Swap in new variant, if condition.
if
(
variant
<
std
::
size_t
(
this
->
_variantVector
.
size
())
&&
run
<
std
::
size_t
(
this
->
_variantVector
.
at
(
variant
).
size
()))
{
if
(
variant
<
std
::
size_t
(
this
->
_variantVector
.
size
()))
{
if
(
old_variant
!=
std
::
numeric_limits
<
std
::
size_t
>::
max
())
{
// this->_transects containes a route, swap it back to
// this->_solutionVector
auto
&
old_solution
=
this
->
_variantVector
[
old_variant
];
auto
&
old_route
=
old_solution
[
old_run
];
old_route
.
swap
(
this
->
_transects
);
}
auto
&
solution
=
this
->
_variantVector
[
variant
];
auto
&
route
=
solution
[
run
];
this
->
_transects
.
swap
(
route
);
if
(
variant
!=
old_variant
)
{
// Add run names.
this
->
_runNames
.
clear
();
for
(
std
::
size_t
i
=
1
;
i
<=
std
::
size_t
(
solution
.
size
());
++
i
)
{
this
->
_runNames
.
append
(
QString
::
number
(
i
));
}
emit
runNamesChanged
();
auto
&
oldVariantCoordinates
=
this
->
_variantVector
[
old_variant
];
oldVariantCoordinates
.
swap
(
this
->
_transects
);
}
auto
&
newVariantCoordinates
=
this
->
_variantVector
[
variant
];
this
->
_transects
.
swap
(
newVariantCoordinates
);
}
else
{
// error
qCWarning
(
CircularSurveyLog
)
<<
"Variant or run out of bounds (variant = "
<<
variant
<<
", run = "
<<
run
<<
")."
;
qCWarning
(
CircularSurveyLog
)
<<
"Resetting variant and run."
;
<<
"Variant out of bounds (variant ="
<<
variant
<<
")."
;
qCWarning
(
CircularSurveyLog
)
<<
"Resetting variant to zero."
;
disconnect
(
&
this
->
_variant
,
&
Fact
::
rawValueChanged
,
this
,
&
CircularSurvey
::
_changeVariant
);
disconnect
(
&
this
->
_run
,
&
Fact
::
rawValueChanged
,
this
,
&
CircularSurvey
::
_changeRun
);
if
(
old_variant
<
std
::
size_t
(
this
->
_variantVector
.
size
()))
{
this
->
_variant
.
setCookedValue
(
QVariant
::
fromValue
(
old_variant
));
auto
&
solution
=
this
->
_variantVector
[
old_variant
];
if
(
old_run
<
std
::
size_t
(
solution
.
size
()))
{
this
->
_run
.
setCookedValue
(
QVariant
::
fromValue
(
old_run
));
}
else
{
this
->
_run
.
setCookedValue
(
QVariant
(
0
));
}
}
else
{
this
->
_variant
.
setCookedValue
(
QVariant
(
0
));
this
->
_run
.
setCookedValue
(
QVariant
(
0
));
}
this
->
_variant
.
setCookedValue
(
QVariant
(
0
));
connect
(
&
this
->
_variant
,
&
Fact
::
rawValueChanged
,
this
,
&
CircularSurvey
::
_changeVariant
);
connect
(
&
this
->
_run
,
&
Fact
::
rawValueChanged
,
this
,
&
CircularSurvey
::
_changeRun
);
if
(
this
->
_variantVector
.
size
()
>
0
&&
this
->
_variantVector
.
front
().
size
()
>
0
)
{
if
(
this
->
_variantVector
.
size
()
>
0
)
{
this
->
_changeVariantWorker
();
}
}
...
...
@@ -438,143 +388,22 @@ void CircularSurvey::_storeWorker() {
_loadedMissionItemsParent
=
nullptr
;
}
// Store raw transects.
const
auto
&
pRoutingData
=
this
->
_pRoutingData
;
const
auto
&
ori
=
this
->
_referencePoint
;
const
auto
&
transectsENU
=
pRoutingData
->
transects
;
QList
<
QList
<
QGeoCoordinate
>>
rawTransects
;
for
(
std
::
size_t
i
=
1
;
i
<
transectsENU
.
size
();
++
i
)
{
const
auto
&
t
=
transectsENU
[
i
];
rawTransects
.
append
(
QList
<
QGeoCoordinate
>
());
auto
trGeo
=
rawTransects
.
back
();
for
(
auto
&
v
:
t
)
{
QGeoCoordinate
c
;
snake
::
fromENU
(
ori
,
v
,
c
);
trGeo
.
append
(
c
);
}
}
// Store solutions.
QVector
<
Variant
>
solutionVector
;
const
auto
nSolutions
=
pRoutingData
->
solutionVector
.
size
();
for
(
std
::
size_t
j
=
0
;
j
<
nSolutions
;
++
j
)
{
const
auto
&
solution
=
pRoutingData
->
solutionVector
.
at
(
j
);
const
auto
nRuns
=
solution
.
size
();
// Store runs.
Variant
runs
(
nRuns
,
Transects
{
QList
<
CoordInfo_t
>
()});
for
(
std
::
size_t
k
=
0
;
k
<
nRuns
;
++
k
)
{
const
auto
&
route
=
solution
.
at
(
k
);
const
auto
&
path
=
route
.
path
;
const
auto
&
info
=
route
.
info
;
if
(
info
.
size
()
>
1
)
{
// Find index of first waypoint.
std
::
size_t
idxFirst
=
0
;
const
auto
&
infoFirst
=
info
.
at
(
1
);
const
auto
&
firstTransect
=
transectsENU
[
infoFirst
.
index
];
if
(
firstTransect
.
size
()
>
0
)
{
const
auto
&
firstWaypoint
=
infoFirst
.
reversed
?
firstTransect
.
back
()
:
firstTransect
.
front
();
double
th
=
0.01
;
for
(
std
::
size_t
i
=
0
;
i
<
path
.
size
();
++
i
)
{
auto
dist
=
bg
::
distance
(
path
[
i
],
firstWaypoint
);
if
(
dist
<
th
)
{
idxFirst
=
i
;
break
;
}
}
// Find index of last waypoint.
std
::
size_t
idxLast
=
path
.
size
()
-
1
;
const
auto
&
infoLast
=
info
.
at
(
info
.
size
()
-
2
);
const
auto
&
lastTransect
=
transectsENU
[
infoLast
.
index
];
if
(
lastTransect
.
size
()
>
0
)
{
const
auto
&
lastWaypoint
=
infoLast
.
reversed
?
lastTransect
.
front
()
:
lastTransect
.
back
();
for
(
long
i
=
path
.
size
()
-
1
;
i
>=
0
;
--
i
)
{
auto
dist
=
bg
::
distance
(
path
[
i
],
lastWaypoint
);
if
(
dist
<
th
)
{
idxLast
=
i
;
break
;
}
}
// Convert to geo coordinates.
auto
&
list
=
runs
[
k
].
front
();
for
(
std
::
size_t
i
=
idxFirst
;
i
<=
idxLast
;
++
i
)
{
auto
&
vertex
=
path
[
i
];
QGeoCoordinate
c
;
snake
::
fromENU
(
ori
,
vertex
,
c
);
list
.
append
(
CoordInfo_t
{
c
,
CoordTypeInterior
});
}
}
else
{
qCWarning
(
CircularSurveyLog
)
<<
"_storeWorker(): lastTransect.size() == 0"
;
}
}
else
{
qCWarning
(
CircularSurveyLog
)
<<
"_storeWorker(): firstTransect.size() == 0"
;
}
}
else
{
qCWarning
(
CircularSurveyLog
)
<<
"_storeWorker(): transectsInfo.size() <= 1"
;
}
}
// Remove empty runs.
bool
error
=
true
;
for
(
auto
it
=
runs
.
begin
();
it
<
runs
.
end
();)
{
if
(
it
->
size
()
>
0
&&
it
->
front
().
size
()
>
0
)
{
error
=
false
;
++
it
;
}
else
{
it
=
runs
.
erase
(
it
);
}
}
if
(
!
error
)
{
solutionVector
.
push_back
(
std
::
move
(
runs
));
}
}
// Remove empty solutions.
std
::
size_t
nSol
=
0
;
for
(
auto
it
=
solutionVector
.
begin
();
it
<
solutionVector
.
end
();)
{
if
(
it
->
size
()
>
0
&&
it
->
front
().
size
()
>
0
)
{
++
it
;
++
nSol
;
}
else
{
it
=
solutionVector
.
erase
(
it
);
}
// Add route variant names.
this
->
_variantNames
.
clear
();
for
(
std
::
size_t
i
=
1
;
i
<=
std
::
size_t
(
this
->
_variantVector
.
size
());
++
i
)
{
this
->
_variantNames
.
append
(
QString
::
number
(
i
));
}
emit
variantNamesChanged
();
// Assign routes if no error occured.
if
(
nSol
>
0
)
{
// Swap first route to _transects.
this
->
_variantVector
.
swap
(
solutionVector
);
disconnect
(
&
this
->
_variant
,
&
Fact
::
rawValueChanged
,
this
,
&
CircularSurvey
::
_changeVariant
);
this
->
_variant
.
setCookedValue
(
QVariant
(
0
));
connect
(
&
this
->
_variant
,
&
Fact
::
rawValueChanged
,
this
,
&
CircularSurvey
::
_changeVariant
);
this
->
_changeVariantWorker
();
// Add route variant names.
this
->
_variantNames
.
clear
();
for
(
std
::
size_t
i
=
1
;
i
<=
std
::
size_t
(
this
->
_variantVector
.
size
());
++
i
)
{
this
->
_variantNames
.
append
(
QString
::
number
(
i
));
}
emit
variantNamesChanged
();
// Swap in rawTransects.
this
->
_rawTransects
.
swap
(
rawTransects
);
disconnect
(
&
this
->
_variant
,
&
Fact
::
rawValueChanged
,
this
,
&
CircularSurvey
::
_changeVariant
);
disconnect
(
&
this
->
_run
,
&
Fact
::
rawValueChanged
,
this
,
&
CircularSurvey
::
_changeRun
);
this
->
_variant
.
setCookedValue
(
QVariant
(
0
));
this
->
_run
.
setCookedValue
(
QVariant
(
0
));
connect
(
&
this
->
_variant
,
&
Fact
::
rawValueChanged
,
this
,
&
CircularSurvey
::
_changeVariant
);
connect
(
&
this
->
_run
,
&
Fact
::
rawValueChanged
,
this
,
&
CircularSurvey
::
_changeRun
);
this
->
_changeVariantWorker
();
// Mark transect as stored and ready.
this
->
_transectsDirty
=
false
;
}
// Mark transect as stored and ready.
this
->
_transectsDirty
=
false
;
}
void
CircularSurvey
::
applyNewAltitude
(
double
newAltitude
)
{
...
...
@@ -600,14 +429,14 @@ bool CircularSurvey::readyForSave() const {
double
CircularSurvey
::
additionalTimeDelay
()
const
{
return
0
;
}
bool
CircularSurvey
::
registerGenerator
(
const
QString
&
name
,
std
::
shared_ptr
<
GeneratorBase
>
g
)
{
bool
CircularSurvey
::
registerGenerator
(
const
QString
&
name
,
std
::
shared_ptr
<
routing
::
GeneratorBase
>
g
)
{
if
(
name
.
isEmpty
())
{
qCWarning
(
CircularSurveyLog
)
<<
"registerGenerator(): empty name string."
;
return
false
;
}
if
(
g
)
{
if
(
!
g
)
{
qCWarning
(
CircularSurveyLog
)
<<
"registerGenerator(): empty generator."
;
return
false
;
}
...
...
@@ -620,7 +449,7 @@ bool CircularSurvey::registerGenerator(const QString &name,
this
->
_generatorNameList
.
push_back
(
name
);
this
->
_generatorList
.
push_back
(
g
);
if
(
this
->
_generatorList
.
size
()
==
1
)
{
this
->
_pGenerator
=
g
;
_switchToGenerator
(
g
)
;
}
emit
generatorNameListChanged
();
...
...
@@ -633,7 +462,7 @@ bool CircularSurvey::unregisterGenerator(const QString &name) {
if
(
index
>=
0
)
{
// Is this the current generator?
const
auto
&
g
=
this
->
_generatorList
.
at
(
index
);
if
(
g
.
get
()
==
this
->
_pGenerator
.
get
()
)
{
if
(
g
==
this
->
_pGenerator
)
{
if
(
index
>
0
)
{
_switchToGenerator
(
this
->
_generatorList
.
at
(
index
-
1
));
}
else
{
...
...
@@ -692,10 +521,18 @@ bool CircularSurvey::switchToGenerator(int index) {
}
}
Q
List
<
QString
>
CircularSurvey
::
generatorNameList
()
{
Q
StringList
CircularSurvey
::
generatorNameList
()
{
return
this
->
_generatorNameList
;
}
routing
::
GeneratorBase
*
CircularSurvey
::
generator
()
{
return
_pGenerator
.
get
();
}
int
CircularSurvey
::
generatorIndex
()
{
return
this
->
_generatorList
.
indexOf
(
this
->
_pGenerator
);
}
void
CircularSurvey
::
_rebuildTransectsPhase1
(
void
)
{
auto
start
=
std
::
chrono
::
high_resolution_clock
::
now
();
...
...
@@ -747,388 +584,98 @@ void CircularSurvey::_recalcComplexDistance() {
void
CircularSurvey
::
_recalcCameraShots
()
{
_cameraShots
=
0
;
}
void
CircularSurvey
::
_setTransects
(
CircularSurvey
::
PtrRoutingData
pRoute
)
{
this
->
_pRoutingData
=
pRoute
;
this
->
_state
=
STATE
::
STORE
;
this
->
_rebuildTransects
();
}
Fact
*
CircularSurvey
::
type
()
{
return
&
_type
;
}
Fact
*
CircularSurvey
::
variant
()
{
return
&
_variant
;
}
Fact
*
CircularSurvey
::
numRuns
()
{
return
&
_numRuns
;
}
Fact
*
CircularSurvey
::
run
()
{
return
&
_run
;
}
int
CircularSurvey
::
typeCount
()
const
{
return
int
(
integral
(
Type
::
Count
));
}
bool
CircularSurvey
::
calculating
()
const
{
return
this
->
_pWorker
->
calculating
();
}
bool
circularTransects
(
const
snake
::
FPolygon
&
polygon
,
const
std
::
vector
<
snake
::
FPolygon
>
&
tiles
,
snake
::
Length
deltaR
,
snake
::
Angle
deltaAlpha
,
snake
::
Length
minLength
,
snake
::
Transects
&
transects
)
{
auto
s1
=
std
::
chrono
::
high_resolution_clock
::
now
();
// Check preconitions
if
(
polygon
.
outer
().
size
()
>=
3
)
{
using
namespace
boost
::
units
;
// Convert geo polygon to ENU polygon.
snake
::
FPoint
origin
{
0
,
0
};
std
::
string
error
;
// Check validity.
if
(
!
bg
::
is_valid
(
polygon
,
error
))
{
qCWarning
(
CircularSurveyLog
)
<<
"circularTransects(): "
"invalid polygon."
;
qCWarning
(
CircularSurveyLog
)
<<
error
.
c_str
();
std
::
stringstream
ss
;
ss
<<
bg
::
wkt
(
polygon
);
qCWarning
(
CircularSurveyLog
)
<<
ss
.
str
().
c_str
();
}
else
{
// Calculate polygon distances and angles.
std
::
vector
<
snake
::
Length
>
distances
;
distances
.
reserve
(
polygon
.
outer
().
size
());
std
::
vector
<
snake
::
Angle
>
angles
;
angles
.
reserve
(
polygon
.
outer
().
size
());
//#ifdef DEBUG_CIRCULAR_SURVEY
// qCWarning(CircularSurveyLog) << "circularTransects():";
//#endif
for
(
const
auto
&
p
:
polygon
.
outer
())
{
snake
::
Length
distance
=
bg
::
distance
(
origin
,
p
)
*
si
::
meter
;
distances
.
push_back
(
distance
);
snake
::
Angle
alpha
=
(
std
::
atan2
(
p
.
get
<
1
>
(),
p
.
get
<
0
>
()))
*
si
::
radian
;
alpha
=
alpha
<
0
*
si
::
radian
?
alpha
+
2
*
M_PI
*
si
::
radian
:
alpha
;
angles
.
push_back
(
alpha
);
//#ifdef DEBUG_CIRCULAR_SURVEY
// qCWarning(CircularSurveyLog) << "distances, angles,
// coordinates:"; qCWarning(CircularSurveyLog) <<
// to_string(distance).c_str(); qCWarning(CircularSurveyLog) <<
// to_string(snake::Degree(alpha)).c_str();
// qCWarning(CircularSurveyLog) << "x = " << p.get<0>() << "y = "
// << p.get<1>();
//#endif
}
auto
rMin
=
deltaR
;
// minimal circle radius
snake
::
Angle
alpha1
(
0
*
degree
::
degree
);
snake
::
Angle
alpha2
(
360
*
degree
::
degree
);
// Determine r_min by successive approximation
if
(
!
bg
::
within
(
origin
,
polygon
.
outer
()))
{
rMin
=
bg
::
distance
(
origin
,
polygon
)
*
si
::
meter
;
}
// Store solutions.
const
auto
&
ori
=
this
->
_pAreaData
->
origin
();
const
auto
&
transectsENU
=
pRoute
->
transects
;
QVector
<
Variant
>
variantVector
;
const
auto
nSolutions
=
pRoute
->
solutionVector
.
size
();
auto
rMax
=
(
*
std
::
max_element
(
distances
.
begin
(),
distances
.
end
()));
// maximal circle radius
// Scale parameters and coordinates.
const
auto
rMinScaled
=
ClipperLib
::
cInt
(
std
::
round
(
rMin
.
value
()
*
CLIPPER_SCALE
));
const
auto
deltaRScaled
=
ClipperLib
::
cInt
(
std
::
round
(
deltaR
.
value
()
*
CLIPPER_SCALE
));
auto
originScaled
=
ClipperLib
::
IntPoint
{
ClipperLib
::
cInt
(
std
::
round
(
origin
.
get
<
0
>
())),
ClipperLib
::
cInt
(
std
::
round
(
origin
.
get
<
1
>
()))};
// Generate circle sectors.
auto
rScaled
=
rMinScaled
;
const
auto
nTran
=
long
(
std
::
ceil
(((
rMax
-
rMin
)
/
deltaR
).
value
()));
vector
<
ClipperLib
::
Path
>
sectors
(
nTran
,
ClipperLib
::
Path
());
const
auto
nSectors
=
long
(
std
::
round
(((
alpha2
-
alpha1
)
/
deltaAlpha
).
value
()));
//#ifdef DEBUG_CIRCULAR_SURVEY
// qCWarning(CircularSurveyLog) << "circularTransects(): sector
// parameres:"; qCWarning(CircularSurveyLog) << "alpha1: " <<
// to_string(snake::Degree(alpha1)).c_str();
// qCWarning(CircularSurveyLog) << "alpha2:
// "
// << to_string(snake::Degree(alpha2)).c_str();
// qCWarning(CircularSurveyLog) << "n: "
// << to_string((alpha2 - alpha1) / deltaAlpha).c_str();
// qCWarning(CircularSurveyLog)
// << "nSectors: " << nSectors; qCWarning(CircularSurveyLog) <<
// "rMin: " << to_string(rMin).c_str(); qCWarning(CircularSurveyLog)
// << "rMax: " << to_string(rMax).c_str();
// qCWarning(CircularSurveyLog) << "nTran: " << nTran;
//#endif
using
ClipperCircle
=
GenericCircle
<
ClipperLib
::
cInt
,
ClipperLib
::
IntPoint
>
;
for
(
auto
&
sector
:
sectors
)
{
ClipperCircle
circle
(
rScaled
,
originScaled
);
approximate
(
circle
,
nSectors
,
sector
);
rScaled
+=
deltaRScaled
;
}
// Clip sectors to polygonENU.
ClipperLib
::
Path
polygonClipper
;
snake
::
FPolygon
shrinked
;
snake
::
offsetPolygon
(
polygon
,
shrinked
,
-
0.3
);
auto
&
outer
=
shrinked
.
outer
();
polygonClipper
.
reserve
(
outer
.
size
());
for
(
auto
it
=
outer
.
begin
();
it
<
outer
.
end
()
-
1
;
++
it
)
{
auto
x
=
ClipperLib
::
cInt
(
std
::
round
(
it
->
get
<
0
>
()
*
CLIPPER_SCALE
));
auto
y
=
ClipperLib
::
cInt
(
std
::
round
(
it
->
get
<
1
>
()
*
CLIPPER_SCALE
));
polygonClipper
.
push_back
(
ClipperLib
::
IntPoint
{
x
,
y
});
}
ClipperLib
::
Clipper
clipper
;
clipper
.
AddPath
(
polygonClipper
,
ClipperLib
::
ptClip
,
true
);
clipper
.
AddPaths
(
sectors
,
ClipperLib
::
ptSubject
,
false
);
ClipperLib
::
PolyTree
transectsClipper
;
clipper
.
Execute
(
ClipperLib
::
ctIntersection
,
transectsClipper
,
ClipperLib
::
pftNonZero
,
ClipperLib
::
pftNonZero
);
// Subtract holes.
if
(
tiles
.
size
()
>
0
)
{
vector
<
ClipperLib
::
Path
>
processedTiles
;
for
(
const
auto
&
tile
:
tiles
)
{
ClipperLib
::
Path
path
;
for
(
const
auto
&
v
:
tile
.
outer
())
{
path
.
push_back
(
ClipperLib
::
IntPoint
{
static_cast
<
ClipperLib
::
cInt
>
(
v
.
get
<
0
>
()
*
CLIPPER_SCALE
),
static_cast
<
ClipperLib
::
cInt
>
(
v
.
get
<
1
>
()
*
CLIPPER_SCALE
)});
for
(
std
::
size_t
j
=
0
;
j
<
nSolutions
;
++
j
)
{
Variant
var
{
QList
<
CoordInfo_t
>
()};
const
auto
&
solution
=
pRoute
->
solutionVector
.
at
(
j
);
if
(
solution
.
size
()
>
0
)
{
const
auto
&
route
=
solution
.
at
(
0
);
const
auto
&
path
=
route
.
path
;
const
auto
&
info
=
route
.
info
;
if
(
info
.
size
()
>
1
)
{
// Find index of first waypoint.
std
::
size_t
idxFirst
=
0
;
const
auto
&
infoFirst
=
info
.
at
(
1
);
const
auto
&
firstTransect
=
transectsENU
[
infoFirst
.
index
];
if
(
firstTransect
.
size
()
>
0
)
{
const
auto
&
firstWaypoint
=
infoFirst
.
reversed
?
firstTransect
.
back
()
:
firstTransect
.
front
();
double
th
=
0.01
;
for
(
std
::
size_t
i
=
0
;
i
<
path
.
size
();
++
i
)
{
auto
dist
=
bg
::
distance
(
path
[
i
],
firstWaypoint
);
if
(
dist
<
th
)
{
idxFirst
=
i
;
break
;
}
}
processedTiles
.
push_back
(
std
::
move
(
path
));
}
clipper
.
Clear
();
for
(
const
auto
&
child
:
transectsClipper
.
Childs
)
{
clipper
.
AddPath
(
child
->
Contour
,
ClipperLib
::
ptSubject
,
false
);
}
clipper
.
AddPaths
(
processedTiles
,
ClipperLib
::
ptClip
,
true
);
transectsClipper
.
Clear
();
clipper
.
Execute
(
ClipperLib
::
ctDifference
,
transectsClipper
,
ClipperLib
::
pftNonZero
,
ClipperLib
::
pftNonZero
);
}
// Extract transects from PolyTree and convert them to
// BoostLineString
for
(
const
auto
&
child
:
transectsClipper
.
Childs
)
{
snake
::
FLineString
transect
;
transect
.
reserve
(
child
->
Contour
.
size
());
for
(
const
auto
&
vertex
:
child
->
Contour
)
{
auto
x
=
static_cast
<
double
>
(
vertex
.
X
)
/
CLIPPER_SCALE
;
auto
y
=
static_cast
<
double
>
(
vertex
.
Y
)
/
CLIPPER_SCALE
;
transect
.
push_back
(
snake
::
FPoint
(
x
,
y
));
}
transects
.
push_back
(
transect
);
}
// Join sectors which where slit due to clipping.
const
double
th
=
0.01
;
for
(
auto
ito
=
transects
.
begin
();
ito
<
transects
.
end
();
++
ito
)
{
for
(
auto
iti
=
ito
+
1
;
iti
<
transects
.
end
();
++
iti
)
{
auto
dist1
=
bg
::
distance
(
ito
->
front
(),
iti
->
front
());
if
(
dist1
<
th
)
{
snake
::
FLineString
temp
;
for
(
auto
it
=
iti
->
end
()
-
1
;
it
>=
iti
->
begin
();
--
it
)
{
temp
.
push_back
(
*
it
);
// Find index of last waypoint.
std
::
size_t
idxLast
=
path
.
size
()
-
1
;
const
auto
&
infoLast
=
info
.
at
(
info
.
size
()
-
2
);
const
auto
&
lastTransect
=
transectsENU
[
infoLast
.
index
];
if
(
lastTransect
.
size
()
>
0
)
{
const
auto
&
lastWaypoint
=
infoLast
.
reversed
?
lastTransect
.
front
()
:
lastTransect
.
back
();
for
(
long
i
=
path
.
size
()
-
1
;
i
>=
0
;
--
i
)
{
auto
dist
=
bg
::
distance
(
path
[
i
],
lastWaypoint
);
if
(
dist
<
th
)
{
idxLast
=
i
;
break
;
}
}
temp
.
insert
(
temp
.
end
(),
ito
->
begin
(),
ito
->
end
());
*
ito
=
temp
;
transects
.
erase
(
iti
);
break
;
}
auto
dist2
=
bg
::
distance
(
ito
->
front
(),
iti
->
back
());
if
(
dist2
<
th
)
{
snake
::
FLineString
temp
;
temp
.
insert
(
temp
.
end
(),
iti
->
begin
(),
iti
->
end
());
temp
.
insert
(
temp
.
end
(),
ito
->
begin
(),
ito
->
end
());
*
ito
=
temp
;
transects
.
erase
(
iti
);
break
;
}
auto
dist3
=
bg
::
distance
(
ito
->
back
(),
iti
->
front
());
if
(
dist3
<
th
)
{
snake
::
FLineString
temp
;
temp
.
insert
(
temp
.
end
(),
ito
->
begin
(),
ito
->
end
());
temp
.
insert
(
temp
.
end
(),
iti
->
begin
(),
iti
->
end
());
*
ito
=
temp
;
transects
.
erase
(
iti
);
break
;
}
auto
dist4
=
bg
::
distance
(
ito
->
back
(),
iti
->
back
());
if
(
dist4
<
th
)
{
snake
::
FLineString
temp
;
temp
.
insert
(
temp
.
end
(),
ito
->
begin
(),
ito
->
end
());
for
(
auto
it
=
iti
->
end
()
-
1
;
it
>=
iti
->
begin
();
--
it
)
{
temp
.
push_back
(
*
it
);
// Convert to geo coordinates.
auto
&
list
=
var
.
front
();
for
(
std
::
size_t
i
=
idxFirst
;
i
<=
idxLast
;
++
i
)
{
auto
&
vertex
=
path
[
i
];
QGeoCoordinate
c
;
snake
::
fromENU
(
ori
,
vertex
,
c
);
list
.
append
(
CoordInfo_t
{
c
,
CoordTypeInterior
});
}
*
ito
=
temp
;
transects
.
erase
(
iti
);
break
;
}
}
}
// Remove short transects
for
(
auto
it
=
transects
.
begin
();
it
<
transects
.
end
();)
{
if
(
bg
::
length
(
*
it
)
<
minLength
.
value
())
{
it
=
transects
.
erase
(
it
);
}
else
{
qCWarning
(
CircularSurveyLog
)
<<
"_setTransects(): lastTransect.size() == 0"
;
}
}
else
{
++
it
;
qCWarning
(
CircularSurveyLog
)
<<
"_setTransects(): firstTransect.size() == 0"
;
}
}
else
{
qCWarning
(
CircularSurveyLog
)
<<
"_setTransects(): transectsInfo.size() <= 1"
;
}
}
else
{
qCWarning
(
CircularSurveyLog
)
<<
"_setTransects(): solution.size() == 0"
;
}
qCWarning
(
CircularSurveyLog
)
<<
"circularTransects(): transect gen. time: "
<<
std
::
chrono
::
duration_cast
<
std
::
chrono
::
milliseconds
>
(
std
::
chrono
::
high_resolution_clock
::
now
()
-
s1
)
.
count
()
<<
" ms"
;
return
true
;
if
(
var
.
size
()
>
0
&&
var
.
front
().
size
()
>
0
)
{
variantVector
.
push_back
(
std
::
move
(
var
));
}
}
return
false
;
}
bool
linearTransects
(
const
snake
::
FPolygon
&
polygon
,
const
std
::
vector
<
snake
::
FPolygon
>
&
tiles
,
snake
::
Length
distance
,
snake
::
Angle
angle
,
snake
::
Length
minLength
,
snake
::
Transects
&
transects
)
{
namespace
tr
=
bg
::
strategy
::
transform
;
auto
s1
=
std
::
chrono
::
high_resolution_clock
::
now
();
// Check preconitions
if
(
polygon
.
outer
().
size
()
>=
3
)
{
// Convert to ENU system.
std
::
string
error
;
// Check validity.
if
(
!
bg
::
is_valid
(
polygon
,
error
))
{
std
::
stringstream
ss
;
ss
<<
bg
::
wkt
(
polygon
);
qCWarning
(
CircularSurveyLog
)
<<
"linearTransects(): "
"invalid polygon. "
<<
error
.
c_str
()
<<
ss
.
str
().
c_str
();
}
else
{
tr
::
rotate_transformer
<
bg
::
degree
,
double
,
2
,
2
>
rotate
(
angle
.
value
()
*
180
/
M_PI
);
// Rotate polygon by angle and calculate bounding box.
snake
::
FPolygon
polygonENURotated
;
bg
::
transform
(
polygon
.
outer
(),
polygonENURotated
.
outer
(),
rotate
);
snake
::
FBox
box
;
boost
::
geometry
::
envelope
(
polygonENURotated
,
box
);
double
x0
=
box
.
min_corner
().
get
<
0
>
();
double
y0
=
box
.
min_corner
().
get
<
1
>
();
double
x1
=
box
.
max_corner
().
get
<
0
>
();
double
y1
=
box
.
max_corner
().
get
<
1
>
();
// Generate transects and convert them to clipper path.
size_t
num_t
=
ceil
((
y1
-
y0
)
/
distance
.
value
());
// number of transects
vector
<
ClipperLib
::
Path
>
transectsClipper
;
transectsClipper
.
reserve
(
num_t
);
for
(
size_t
i
=
0
;
i
<
num_t
;
++
i
)
{
// calculate transect
snake
::
FPoint
v1
{
x0
,
y0
+
i
*
distance
.
value
()};
snake
::
FPoint
v2
{
x1
,
y0
+
i
*
distance
.
value
()};
snake
::
FLineString
transect
;
transect
.
push_back
(
v1
);
transect
.
push_back
(
v2
);
// transform back
snake
::
FLineString
temp_transect
;
tr
::
rotate_transformer
<
bg
::
degree
,
double
,
2
,
2
>
rotate_back
(
-
angle
.
value
()
*
180
/
M_PI
);
bg
::
transform
(
transect
,
temp_transect
,
rotate_back
);
// to clipper
ClipperLib
::
IntPoint
c1
{
static_cast
<
ClipperLib
::
cInt
>
(
temp_transect
[
0
].
get
<
0
>
()
*
CLIPPER_SCALE
),
static_cast
<
ClipperLib
::
cInt
>
(
temp_transect
[
0
].
get
<
1
>
()
*
CLIPPER_SCALE
)};
ClipperLib
::
IntPoint
c2
{
static_cast
<
ClipperLib
::
cInt
>
(
temp_transect
[
1
].
get
<
0
>
()
*
CLIPPER_SCALE
),
static_cast
<
ClipperLib
::
cInt
>
(
temp_transect
[
1
].
get
<
1
>
()
*
CLIPPER_SCALE
)};
ClipperLib
::
Path
path
{
c1
,
c2
};
transectsClipper
.
push_back
(
path
);
}
if
(
transectsClipper
.
size
()
==
0
)
{
std
::
stringstream
ss
;
ss
<<
"Not able to generate transects. Parameter: distance = "
<<
distance
<<
std
::
endl
;
qCWarning
(
CircularSurveyLog
)
<<
"linearTransects(): "
<<
ss
.
str
().
c_str
();
return
false
;
}
// Convert measurement area to clipper path.
snake
::
FPolygon
shrinked
;
snake
::
offsetPolygon
(
polygon
,
shrinked
,
-
0.2
);
auto
&
outer
=
shrinked
.
outer
();
ClipperLib
::
Path
polygonClipper
;
for
(
auto
vertex
:
outer
)
{
polygonClipper
.
push_back
(
ClipperLib
::
IntPoint
{
static_cast
<
ClipperLib
::
cInt
>
(
vertex
.
get
<
0
>
()
*
CLIPPER_SCALE
),
static_cast
<
ClipperLib
::
cInt
>
(
vertex
.
get
<
1
>
()
*
CLIPPER_SCALE
)});
}
// Perform clipping.
// Clip transects to measurement area.
ClipperLib
::
Clipper
clipper
;
clipper
.
AddPath
(
polygonClipper
,
ClipperLib
::
ptClip
,
true
);
clipper
.
AddPaths
(
transectsClipper
,
ClipperLib
::
ptSubject
,
false
);
ClipperLib
::
PolyTree
clippedTransecs
;
clipper
.
Execute
(
ClipperLib
::
ctIntersection
,
clippedTransecs
,
ClipperLib
::
pftNonZero
,
ClipperLib
::
pftNonZero
);
// Subtract holes.
if
(
tiles
.
size
()
>
0
)
{
vector
<
ClipperLib
::
Path
>
processedTiles
;
for
(
const
auto
&
tile
:
tiles
)
{
ClipperLib
::
Path
path
;
for
(
const
auto
&
v
:
tile
.
outer
())
{
path
.
push_back
(
ClipperLib
::
IntPoint
{
static_cast
<
ClipperLib
::
cInt
>
(
v
.
get
<
0
>
()
*
CLIPPER_SCALE
),
static_cast
<
ClipperLib
::
cInt
>
(
v
.
get
<
1
>
()
*
CLIPPER_SCALE
)});
}
processedTiles
.
push_back
(
std
::
move
(
path
));
}
clipper
.
Clear
();
for
(
const
auto
&
child
:
clippedTransecs
.
Childs
)
{
clipper
.
AddPath
(
child
->
Contour
,
ClipperLib
::
ptSubject
,
false
);
}
clipper
.
AddPaths
(
processedTiles
,
ClipperLib
::
ptClip
,
true
);
clippedTransecs
.
Clear
();
clipper
.
Execute
(
ClipperLib
::
ctDifference
,
clippedTransecs
,
ClipperLib
::
pftNonZero
,
ClipperLib
::
pftNonZero
);
}
// Assign routes if no error occured.
if
(
variantVector
.
size
()
>
0
)
{
// Swap first route to _transects.
this
->
_variantVector
.
swap
(
variantVector
);
this
->
_state
=
STATE
::
STORE
;
this
->
_rebuildTransects
();
}
else
{
this
->
_state
=
STATE
::
IDLE
;
}
}
// Extract transects from PolyTree and convert them to BoostLineString
for
(
const
auto
&
child
:
clippedTransecs
.
Childs
)
{
const
auto
&
clipperTransect
=
child
->
Contour
;
snake
::
FPoint
v1
{
static_cast
<
double
>
(
clipperTransect
[
0
].
X
)
/
CLIPPER_SCALE
,
static_cast
<
double
>
(
clipperTransect
[
0
].
Y
)
/
CLIPPER_SCALE
};
snake
::
FPoint
v2
{
static_cast
<
double
>
(
clipperTransect
[
1
].
X
)
/
CLIPPER_SCALE
,
static_cast
<
double
>
(
clipperTransect
[
1
].
Y
)
/
CLIPPER_SCALE
};
snake
::
FLineString
transect
{
v1
,
v2
};
if
(
bg
::
length
(
transect
)
>=
minLength
.
value
())
{
transects
.
push_back
(
transect
);
}
}
Fact
*
CircularSurvey
::
variant
()
{
return
&
_variant
;
}
if
(
transects
.
size
()
==
0
)
{
std
::
stringstream
ss
;
ss
<<
"Not able to generatetransects. Parameter: minLength = "
<<
minLength
<<
std
::
endl
;
qCWarning
(
CircularSurveyLog
)
<<
"linearTransects(): "
<<
ss
.
str
().
c_str
();
return
false
;
}
qCWarning
(
CircularSurveyLog
)
<<
"linearTransects(): transect gen. time: "
<<
std
::
chrono
::
duration_cast
<
std
::
chrono
::
milliseconds
>
(
std
::
chrono
::
high_resolution_clock
::
now
()
-
s1
)
.
count
()
<<
" ms"
;
return
true
;
}
}
return
false
;
bool
CircularSurvey
::
calculating
()
const
{
return
this
->
_pWorker
->
calculating
();
}
/*!
\class CircularSurveyComplexItem
\inmodule Wima
...
...
src/Wima/CircularSurvey.h
View file @
67cbe3f7
...
...
@@ -13,13 +13,17 @@
class
RoutingThread
;
class
RoutingData
;
namespace
routing
{
class
GeneratorBase
;
}
class
CircularSurvey
:
public
TransectStyleComplexItem
{
Q_OBJECT
using
PtrGenerator
=
std
::
shared_ptr
<
GeneratorBase
>
;
using
PtrGenerator
=
std
::
shared_ptr
<
routing
::
GeneratorBase
>
;
using
PtrRoutingData
=
std
::
shared_ptr
<
RoutingData
>
;
using
PtrWorker
=
std
::
shared_ptr
<
RoutingThread
>
;
public:
/// @param vehicle Vehicle which this is being contructed for
...
...
@@ -31,14 +35,15 @@ public:
QObject
*
parent
);
~
CircularSurvey
();
Q_PROPERTY
(
Fact
*
type
READ
type
CONSTANT
)
Q_PROPERTY
(
int
typeCount
READ
typeCount
CONSTANT
)
Q_PROPERTY
(
Fact
*
variant
READ
variant
CONSTANT
)
Q_PROPERTY
(
Q
List
<
QString
>
variantNames
READ
variantNames
NOTIFY
variantNamesChanged
)
Q_PROPERTY
(
Q
List
<
QString
>
generatorNameList
READ
generatorNameList
NOTIFY
Q
StringList
variantNames
READ
variantNames
NOTIFY
variantNamesChanged
)
Q_PROPERTY
(
Q
StringList
generatorNameList
READ
generatorNameList
NOTIFY
generatorNameListChanged
)
Q_PROPERTY
(
bool
calculating
READ
calculating
NOTIFY
calculatingChanged
)
Q_PROPERTY
(
routing
::
GeneratorBase
*
generator
READ
generator
NOTIFY
generatorChanged
)
Q_PROPERTY
(
int
generatorIndex
READ
generatorIndex
NOTIFY
generatorChanged
)
Q_INVOKABLE
void
reverse
(
void
);
...
...
@@ -46,10 +51,9 @@ public:
void
setPlanData
(
const
WimaPlanData
&
d
);
// Property getters
Fact
*
type
();
int
typeCount
()
const
;
Fact
*
variant
();
QList
<
QString
>
variantNames
()
const
;
QStringList
variantNames
()
const
;
bool
calculating
()
const
;
// Overrides
bool
load
(
const
QJsonObject
&
complexObject
,
int
sequenceNumber
,
...
...
@@ -68,15 +72,17 @@ public:
double
additionalTimeDelay
(
void
)
const
override
final
;
// Generator
bool
registerGenerator
(
const
QString
&
name
,
std
::
shared_ptr
<
GeneratorBase
>
g
);
bool
registerGenerator
(
const
QString
&
name
,
std
::
shared_ptr
<
routing
::
GeneratorBase
>
g
);
bool
unregisterGenerator
(
const
QString
&
name
);
bool
unregisterGenerator
(
int
index
);
Q_INVOKABLE
bool
switchToGenerator
(
const
QString
&
name
);
Q_INVOKABLE
bool
switchToGenerator
(
int
index
);
QList
<
QString
>
generatorNameList
();
QStringList
generatorNameList
();
routing
::
GeneratorBase
*
generator
();
int
generatorIndex
();
static
const
char
*
settingsGroup
;
static
const
char
*
typeName
;
static
const
char
*
variantName
;
static
const
char
*
CircularSurveyName
;
...
...
@@ -120,20 +126,18 @@ private:
// center of the circular lanes, e.g. base station
QMap
<
QString
,
FactMetaData
*>
_metaDataMap
;
SettingsFact
_type
;
SettingsFact
_variant
;
Q
List
<
QString
>
_variantNames
;
Q
StringList
_variantNames
;
// Area data
std
::
shared_ptr
<
Wima
AreaData
>
_a
reaData
;
std
::
shared_ptr
<
Wima
PlanData
>
_pA
reaData
;
// Generators
QList
<
PtrGenerator
>
_generatorList
;
Q
List
<
QString
>
_generatorNameList
;
Q
StringList
_generatorNameList
;
PtrGenerator
_pGenerator
;
// Worker
using
PtrWorker
=
std
::
shared_ptr
<
RoutingThread
>
;
PtrWorker
_pWorker
;
PtrRoutingData
_pRoutingData
;
// remove this, not necessary.
...
...
src/Wima/Snake/CircularGenerator.cpp
View file @
67cbe3f7
...
...
@@ -43,11 +43,11 @@ CircularGenerator::CircularGenerator(GeneratorBase::Data d, QObject *parent)
establishConnections
();
}
QString
CircularGenerator
::
editorQ
ML
()
{
QString
CircularGenerator
::
editorQ
ml
()
{
return
QStringLiteral
(
"CircularGeneratorEditor.qml"
);
}
QString
CircularGenerator
::
mapVisualQ
ML
()
{
QString
CircularGenerator
::
mapVisualQ
ml
()
{
return
QStringLiteral
(
"CircularGeneratorMapVisual.qml"
);
}
...
...
@@ -61,13 +61,15 @@ bool CircularGenerator::get(Generator &generator) {
if
(
this
->
_d
)
{
if
(
this
->
_d
->
isValid
())
{
// Prepare data.
const
auto
&
origin
=
this
->
_d
->
origin
();
auto
origin
=
this
->
_d
->
origin
();
origin
.
setAltitude
(
0
);
if
(
!
origin
.
isValid
())
{
qCWarning
(
CircularGeneratorLog
)
<<
"get(): origin invalid."
<<
origin
;
return
false
;
}
const
auto
&
ref
=
this
->
_reference
;
auto
ref
=
this
->
_reference
;
ref
.
setAltitude
(
0
);
if
(
!
ref
.
isValid
())
{
qCWarning
(
CircularGeneratorLog
)
<<
"get(): reference invalid."
<<
ref
;
return
false
;
...
...
src/Wima/Snake/CircularGenerator.h
View file @
67cbe3f7
...
...
@@ -16,8 +16,8 @@ public:
Q_PROPERTY
(
Fact
*
deltaAlpha
READ
deltaAlpha
CONSTANT
)
Q_PROPERTY
(
Fact
*
minLength
READ
minLength
CONSTANT
)
virtual
QString
editorQ
ML
()
override
;
virtual
QString
mapVisualQ
ML
()
override
;
virtual
QString
editorQ
ml
()
override
;
virtual
QString
mapVisualQ
ml
()
override
;
virtual
QString
name
()
override
;
virtual
QString
abbreviation
()
override
;
...
...
@@ -30,7 +30,7 @@ public:
Fact
*
minLength
();
void
setReference
(
const
QGeoCoordinate
&
reference
);
void
resetReference
();
Q_INVOKABLE
void
resetReference
();
static
const
char
*
settingsGroup
;
static
const
char
*
distanceName
;
...
...
src/Wima/Snake/GeneratorBase.cc
View file @
67cbe3f7
...
...
@@ -12,6 +12,14 @@ GeneratorBase::GeneratorBase(GeneratorBase::Data d, QObject *parent)
GeneratorBase
::~
GeneratorBase
()
{}
QString
GeneratorBase
::
editorQml
()
{
return
QStringLiteral
(
"EmptyGeneratorEditor.qml"
);
}
QString
GeneratorBase
::
mapVisualQml
()
{
return
QStringLiteral
(
"EmptyGeneratorMapVisual.qml"
);
}
GeneratorBase
::
Data
GeneratorBase
::
data
()
const
{
return
_d
;
}
void
GeneratorBase
::
setData
(
const
Data
&
d
)
{
...
...
src/Wima/Snake/GeneratorBase.h
View file @
67cbe3f7
#pragma once
#include <QObject>
#include <functional>
...
...
@@ -19,8 +21,11 @@ public:
explicit
GeneratorBase
(
Data
d
,
QObject
*
parent
=
nullptr
);
~
GeneratorBase
();
virtual
QString
editorQML
()
=
0
;
virtual
QString
mapVisualQML
()
=
0
;
Q_PROPERTY
(
QString
editorQml
READ
editorQml
CONSTANT
)
Q_PROPERTY
(
QString
mapVisualQml
READ
mapVisualQml
CONSTANT
)
virtual
QString
editorQml
();
virtual
QString
mapVisualQml
();
virtual
QString
name
()
=
0
;
virtual
QString
abbreviation
()
=
0
;
...
...
src/Wima/Snake/LinearGenerator.cpp
View file @
67cbe3f7
...
...
@@ -34,25 +34,24 @@ LinearGenerator::LinearGenerator(GeneratorBase::Data d, QObject *parent)
establishConnections
();
}
QString
LinearGenerator
::
editorQ
ML
()
{
QString
LinearGenerator
::
editorQ
ml
()
{
return
QStringLiteral
(
"LinearGeneratorEditor.qml"
);
}
QString
LinearGenerator
::
mapVisualQML
()
{
return
QStringLiteral
(
"LinearGeneratorMapVisual.qml"
);
}
QString
LinearGenerator
::
name
()
{
return
QStringLiteral
(
"Linear Generator"
);
}
QString
LinearGenerator
::
abbreviation
()
{
return
QStringLiteral
(
"L. Gen."
);
}
bool
LinearGenerator
::
get
(
Generator
&
generator
)
{
if
(
_d
)
{
if
(
this
->
_d
->
isValid
())
{
// Prepare data.
const
auto
&
origin
=
this
->
_d
->
origin
();
auto
origin
=
this
->
_d
->
origin
();
origin
.
setAltitude
(
0
);
if
(
!
origin
.
isValid
())
{
qCWarning
(
LinearGeneratorLog
)
<<
"get(): origin invalid."
;
}
auto
geoPolygon
=
this
->
_d
->
measurementArea
().
coordinateList
();
for
(
auto
&
v
:
geoPolygon
)
{
if
(
v
.
isValid
())
{
...
...
src/Wima/Snake/LinearGenerator.h
View file @
67cbe3f7
...
...
@@ -14,8 +14,7 @@ public:
Q_PROPERTY
(
Fact
*
alpha
READ
alpha
CONSTANT
)
Q_PROPERTY
(
Fact
*
minLength
READ
minLength
CONSTANT
)
virtual
QString
editorQML
()
override
;
virtual
QString
mapVisualQML
()
override
;
virtual
QString
editorQml
()
override
;
virtual
QString
name
()
override
;
virtual
QString
abbreviation
()
override
;
...
...
src/Wima/Snake/snake.cpp
View file @
67cbe3f7
...
...
@@ -760,7 +760,17 @@ bool route(const FPolygon &area, const Transects &transects,
if
(
std
::
isinf
(
dist
))
{
std
::
vector
<
std
::
size_t
>
route
;
if
(
!
dijkstraAlgorithm
(
n
,
i
,
j
,
route
,
dist
,
distLambda
))
{
par
.
errorString
=
"Distance matrix calculation failed."
;
std
::
stringstream
ss
;
ss
<<
"Distance matrix calculation failed. connection graph: "
<<
connectionGraph
<<
std
::
endl
;
ss
<<
"area: "
<<
bg
::
wkt
(
area
)
<<
std
::
endl
;
ss
<<
"transects:"
<<
std
::
endl
;
for
(
const
auto
&
t
:
transects
)
{
ss
<<
bg
::
wkt
(
t
)
<<
std
::
endl
;
}
par
.
errorString
=
ss
.
str
();
return
false
;
}
(
void
)
route
;
...
...
src/Wima/WimaPlaner.cc
View file @
67cbe3f7
...
...
@@ -356,8 +356,6 @@ void WimaPlaner::_update() {
}
// establish connections
_survey
->
setRefPoint
(
_measurementArea
.
center
());
_survey
->
setHidePolygon
(
true
);
connect
(
_survey
,
&
CircularSurvey
::
calculatingChanged
,
this
,
&
WimaPlaner
::
CSCalculatingChangedHandler
);
connect
(
_survey
,
&
CircularSurvey
::
missionItemReady
,
this
,
...
...
@@ -369,9 +367,14 @@ void WimaPlaner::_update() {
// update survey area
disconnect
(
_survey
,
&
CircularSurvey
::
calculatingChanged
,
this
,
&
WimaPlaner
::
CSCalculatingChangedHandler
);
_survey
->
setMeasurementArea
(
this
->
_measurementArea
);
_survey
->
setJoinedArea
(
this
->
_joinedArea
);
_survey
->
setDepot
(
this
->
_serviceArea
.
depot
());
WimaPlanData
planData
;
if
(
!
toPlanData
(
planData
))
{
qCWarning
(
WimaPlanerLog
)
<<
"not able to create plan data."
;
return
;
}
_survey
->
setPlanData
(
planData
);
connect
(
_survey
,
&
CircularSurvey
::
calculatingChanged
,
this
,
&
WimaPlaner
::
CSCalculatingChangedHandler
);
...
...
@@ -772,7 +775,6 @@ bool WimaPlaner::loadFromFile(const QString &filename) {
for
(
int
i
=
0
;
i
<
missionItems
->
count
();
i
++
)
{
_survey
=
missionItems
->
value
<
CircularSurvey
*>
(
i
);
if
(
_survey
!=
nullptr
)
{
_survey
->
setHidePolygon
(
true
);
connect
(
_survey
,
&
CircularSurvey
::
calculatingChanged
,
this
,
&
WimaPlaner
::
CSCalculatingChangedHandler
);
connect
(
_survey
,
&
CircularSurvey
::
missionItemReady
,
this
,
...
...
src/WimaView/CircularGeneratorEditor.qml
0 → 100644
View file @
67cbe3f7
import
QtQuick
2.0
import
QtQuick
.
Layouts
1.11
import
QGroundControl
.
Controls
1.0
import
QGroundControl
.
FactControls
1.0
import
QGroundControl
.
ScreenTools
1.0
GridLayout
{
// Item must be loaded, expects the following properties:
// property var generator
property
real
_margin
:
ScreenTools
.
defaultFontPixelWidth
/
2
columnSpacing
:
_margin
rowSpacing
:
_margin
columns
:
2
QGCLabel
{
text
:
qsTr
(
"
Distance
"
)
}
FactTextField
{
fact
:
generator
.
distance
Layout.fillWidth
:
true
}
QGCLabel
{
text
:
qsTr
(
"
Delta Alpha
"
)
}
FactTextField
{
fact
:
generator
.
deltaAlpha
Layout.fillWidth
:
true
}
QGCLabel
{
text
:
qsTr
(
"
Min. Length
"
)
}
FactTextField
{
fact
:
generator
.
minLength
Layout.fillWidth
:
true
}
QGCButton
{
text
:
qsTr
(
"
Reset Ref.
"
)
onClicked
:
generator
.
resetReference
();
Layout.fillWidth
:
true
Layout.columnSpan
:
2
}
}
src/WimaView/CircularGeneratorMapVisual.qml
0 → 100644
View file @
67cbe3f7
import
QtQuick
2.0
Item
{
id
:
_root
property
var
map
///< Map control to place item in
property
var
qgcView
///< QGCView to use for popping dialogs
property
var
generator
property
bool
checked
:
false
property
var
_referenceComponent
signal
clicked
()
function
_addRefPoint
(){
if
(
!
_referenceComponent
){
_referenceComponent
=
refPointComponent
.
createObject
(
_root
)
map
.
addMapItem
(
_referenceComponent
)
}
}
function
_destroyRefPoint
(){
if
(
_referenceComponent
){
map
.
removeMapItem
(
_referenceComponent
)
_referenceComponent
.
destroy
()
_referenceComponent
=
undefined
}
}
onVisibleChanged
:
{
if
(
visible
){
_addRefPoint
()
}
else
{
_destroyRefPoint
()
}
}
Component.onCompleted
:
{
if
(
visible
){
_addRefPoint
()
}
}
Component
.
onDestroyed
:
{
_destroyRefPoint
()
}
// Ref. point (Base Station)
Component
{
id
:
refPointComponent
DragCoordinate
{
map
:
_root
.
map
qgcView
:
_root
.
qgcView
z
:
QGroundControl
.
zOrderMapItems
checked
:
_root
.
checked
coordinate
:
_root
.
generator
.
reference
onClicked
:
{
_root
.
clicked
()
}
onDragReleased
:
{
_root
.
generator
.
reference
=
coordinate
coordinate
=
Qt
.
binding
(
function
(){
return
_root
.
generator
.
reference
})
}
}
}
}
src/
Plan
View/CircularSurveyItemEditor.qml
→
src/
Wima
View/CircularSurveyItemEditor.qml
View file @
67cbe3f7
...
...
@@ -30,6 +30,8 @@ Rectangle {
property
var
_vehicle
:
QGroundControl
.
multiVehicleManager
.
activeVehicle
?
QGroundControl
.
multiVehicleManager
.
activeVehicle
:
QGroundControl
.
multiVehicleManager
.
offlineEditingVehicle
property
real
_cameraMinTriggerInterval
:
missionItem
.
cameraCalc
.
minTriggerInterval
.
rawValue
property
var
_generator
:
missionItem
.
generator
function
polygonCaptureStarted
()
{
missionItem
.
clearPolygon
()
}
...
...
@@ -95,31 +97,24 @@ Rectangle {
}
QGCLabel
{
text
:
qsTr
(
"
Type
"
)
text
:
qsTr
(
"
Generator
Type
"
)
Layout.columnSpan
:
2
}
Repeater
{
id
:
typeRepeater
property
var
typeFact
:
missionItem
.
type
property
int
type
:
typeFact
.
value
property
var
names
:
[
"
Circular
"
,
"
Linear
"
]
QGCComboBox
{
property
var
names
:
missionItem
.
generatorNameList
property
int
length
:
names
.
length
model
:
missionItem
.
typeCount
QGCRadioButton
{
checked
:
index
===
typeRepeater
.
type
text
:
qsTr
(
typeRepeater
.
names
[
index
])
anchors.margins
:
ScreenTools
.
defaultFontPixelWidth
currentIndex
:
missionItem
.
generatorIndex
Layout.columnSpan
:
2
model
:
missionItem
.
generatorNameList
onCheckedChanged
:
{
if
(
checked
){
missionItem
.
type
.
value
=
index
}
checked
=
Qt
.
binding
(
function
(){
return
index
===
typeRepeater
.
type
})
}
onActivated
:
{
missionItem
.
switchToGenerator
(
index
)
}
}
QGCLabel
{
text
:
qsTr
(
"
Variant
"
)
Layout.columnSpan
:
2
...
...
@@ -156,74 +151,18 @@ Rectangle {
}
}
// Generator Editor
SectionHeader
{
id
:
transectsHeader
text
:
qsTr
(
"
Transects
"
)
text
:
qsTr
(
"
Generator
"
)
}
GridLayout
{
anchors.left
:
parent
.
left
anchors.right
:
parent
.
right
columnSpacing
:
_margin
rowSpacing
:
_margin
columns
:
2
visible
:
transectsHeader
.
checked
QGCLabel
{
text
:
qsTr
(
"
Distance
"
)
}
FactTextField
{
fact
:
missionItem
.
transectDistance
Layout.fillWidth
:
true
}
/*QGCSlider {
id: rSlider
minimumValue: 0.3
maximumValue: 20
stepSize: 0.1
tickmarksEnabled: false
Layout.fillWidth: true
Layout.columnSpan: 2
Layout.preferredHeight: ScreenTools.defaultFontPixelHeight * 1.5
onValueChanged: missionItem.deltaR.value = value
Component.onCompleted: value = missionItem.deltaR.defaultValue
updateValueWhileDragging: true
}*/
QGCLabel
{
text
:
qsTr
(
"
Alpha
"
)
}
FactTextField
{
fact
:
missionItem
.
alpha
Layout.fillWidth
:
true
}
QGCLabel
{
text
:
qsTr
(
"
Min. Length
"
)
}
FactTextField
{
fact
:
missionItem
.
minLength
Layout.fillWidth
:
true
}
Loader
{
source
:
_generator
.
editorQml
property
var
generator
:
_generator
property
real
margin
:
_margin
visible
:
transectsHeader
.
checked
}
GridLayout
{
anchors.left
:
parent
.
left
anchors.right
:
parent
.
right
columnSpacing
:
_margin
rowSpacing
:
_margin
columns
:
2
visible
:
transectsHeader
.
checked
QGCButton
{
text
:
qsTr
(
"
Reverse
"
)
onClicked
:
missionItem
.
reverse
();
Layout.fillWidth
:
true
}
QGCButton
{
text
:
qsTr
(
"
Reset Ref.
"
)
onClicked
:
missionItem
.
resetReference
();
Layout.fillWidth
:
true
}
}
Column
{
anchors.left
:
parent
.
left
...
...
src/WimaView/CircularSurveyMapVisual.qml
View file @
67cbe3f7
...
...
@@ -26,12 +26,9 @@ Item {
property
var
qgcView
///< QGCView to use for popping dialogs
property
var
_missionItem
:
object
property
var
_mapPolygon
:
object
.
surveyAreaPolygon
property
var
_transectsComponent
property
var
_entryCoordinate
property
var
_exitCoordinate
property
var
_refPoint
property
bool
showRefPoint
:
_missionItem
.
type
.
value
===
0
// type == Circular
signal
clicked
(
int
sequenceNumber
)
...
...
@@ -56,13 +53,6 @@ Item {
}
}
function
_addRefPoint
(){
if
(
!
_refPoint
){
_refPoint
=
refPointComponent
.
createObject
(
_root
)
map
.
addMapItem
(
_refPoint
)
}
}
function
_destroyEntryCoordinate
(){
if
(
_entryCoordinate
){
map
.
removeMapItem
(
_entryCoordinate
)
...
...
@@ -79,14 +69,6 @@ Item {
}
}
function
_destroyRefPoint
(){
if
(
_refPoint
){
map
.
removeMapItem
(
_refPoint
)
_refPoint
.
destroy
()
_refPoint
=
undefined
}
}
function
_destroyTransectsComponent
(){
if
(
_transectsComponent
){
map
.
removeMapItem
(
_transectsComponent
)
...
...
@@ -95,79 +77,18 @@ Item {
}
}
/// Add an initial 4 sided polygon if there is none
function
_addInitialPolygon
()
{
if
(
_mapPolygon
.
count
<
3
)
{
// Initial polygon is inset to take 2/3rds space
var
rect
=
Qt
.
rect
(
map
.
centerViewport
.
x
,
map
.
centerViewport
.
y
,
map
.
centerViewport
.
width
,
map
.
centerViewport
.
height
)
rect
.
x
+=
(
rect
.
width
*
0.25
)
/
2
rect
.
y
+=
(
rect
.
height
*
0.25
)
/
2
rect
.
width
*=
0.75
rect
.
height
*=
0.75
var
centerCoord
=
map
.
toCoordinate
(
Qt
.
point
(
rect
.
x
+
(
rect
.
width
/
2
),
rect
.
y
+
(
rect
.
height
/
2
)),
false
/* clipToViewPort */
)
var
topLeftCoord
=
map
.
toCoordinate
(
Qt
.
point
(
rect
.
x
,
rect
.
y
),
false
/* clipToViewPort */
)
var
topRightCoord
=
map
.
toCoordinate
(
Qt
.
point
(
rect
.
x
+
rect
.
width
,
rect
.
y
),
false
/* clipToViewPort */
)
var
bottomLeftCoord
=
map
.
toCoordinate
(
Qt
.
point
(
rect
.
x
,
rect
.
y
+
rect
.
height
),
false
/* clipToViewPort */
)
var
bottomRightCoord
=
map
.
toCoordinate
(
Qt
.
point
(
rect
.
x
+
rect
.
width
,
rect
.
y
+
rect
.
height
),
false
/* clipToViewPort */
)
// Initial polygon has max width and height of 3000 meters
var
halfWidthMeters
=
Math
.
min
(
topLeftCoord
.
distanceTo
(
topRightCoord
),
3000
)
/
2
var
halfHeightMeters
=
Math
.
min
(
topLeftCoord
.
distanceTo
(
bottomLeftCoord
),
3000
)
/
2
topLeftCoord
=
centerCoord
.
atDistanceAndAzimuth
(
halfWidthMeters
,
-
90
).
atDistanceAndAzimuth
(
halfHeightMeters
,
0
)
topRightCoord
=
centerCoord
.
atDistanceAndAzimuth
(
halfWidthMeters
,
90
).
atDistanceAndAzimuth
(
halfHeightMeters
,
0
)
bottomLeftCoord
=
centerCoord
.
atDistanceAndAzimuth
(
halfWidthMeters
,
-
90
).
atDistanceAndAzimuth
(
halfHeightMeters
,
180
)
bottomRightCoord
=
centerCoord
.
atDistanceAndAzimuth
(
halfWidthMeters
,
90
).
atDistanceAndAzimuth
(
halfHeightMeters
,
180
)
_mapPolygon
.
appendVertex
(
topLeftCoord
)
_mapPolygon
.
appendVertex
(
topRightCoord
)
_mapPolygon
.
appendVertex
(
bottomRightCoord
)
_mapPolygon
.
appendVertex
(
bottomLeftCoord
)
}
}
Component.onCompleted
:
{
if
(
_mapPolygon
.
count
===
0
)
{
_addInitialPolygon
()
_missionItem
.
resetReference
();
}
_addEntryCoordinate
()
_addExitCoordinate
()
if
(
showRefPoint
){
_addRefPoint
()
}
_addTransectsComponent
()
}
Component.onDestruction
:
{
_destroyEntryCoordinate
()
_destroyExitCoordinate
()
_destroyRefPoint
()
_destroyTransectsComponent
()
}
onShowRefPointChanged
:
{
if
(
showRefPoint
){
_addRefPoint
()
}
else
{
_destroyRefPoint
()
}
}
WimaMapPolygonVisuals
{
id
:
mapPolygonVisuals
qgcView
:
_root
.
qgcView
mapControl
:
map
mapPolygon
:
_mapPolygon
interactive
:
_missionItem
.
isCurrentItem
borderWidth
:
1
borderColor
:
"
black
"
interiorColor
:
"
green
"
interiorOpacity
:
0.5
visible
:
!
_missionItem
.
hidePolygon
}
// Transect lines
Component
{
id
:
visualTransectsComponent
...
...
@@ -219,26 +140,4 @@ Item {
}
}
}
// Ref. point (Base Station)
Component
{
id
:
refPointComponent
DragCoordinate
{
map
:
_root
.
map
qgcView
:
_root
.
qgcView
z
:
QGroundControl
.
zOrderMapItems
checked
:
_missionItem
.
isCurrentItem
coordinate
:
_missionItem
.
refPoint
onClicked
:
{
_root
.
clicked
(
_missionItem
.
sequenceNumber
)
}
onDragReleased
:
{
_missionItem
.
refPoint
=
coordinate
coordinate
=
Qt
.
binding
(
function
(){
return
_missionItem
.
refPoint
})
}
}
}
}
src/WimaView/LinearGeneratorEditor.qml
0 → 100644
View file @
67cbe3f7
import
QtQuick
2.0
import
QtQuick
.
Layouts
1.11
import
QGroundControl
.
Controls
1.0
import
QGroundControl
.
FactControls
1.0
import
QGroundControl
.
ScreenTools
1.0
GridLayout
{
// Item must be loaded, expects the following properties:
// property var generator
property
real
_margin
:
ScreenTools
.
defaultFontPixelWidth
/
2
columnSpacing
:
_margin
rowSpacing
:
_margin
columns
:
2
QGCLabel
{
text
:
qsTr
(
"
Distance
"
)
}
FactTextField
{
fact
:
generator
.
distance
Layout.fillWidth
:
true
}
QGCLabel
{
text
:
qsTr
(
"
Alpha
"
)
}
QGCSlider
{
id
:
rSlider
minimumValue
:
0
maximumValue
:
180
stepSize
:
0.1
tickmarksEnabled
:
false
Layout.fillWidth
:
true
Layout.columnSpan
:
2
Layout.preferredHeight
:
ScreenTools
.
defaultFontPixelHeight
*
1.5
onValueChanged
:
generator
.
alpha
.
value
=
value
Component.onCompleted
:
value
=
0
updateValueWhileDragging
:
true
}
QGCLabel
{
text
:
qsTr
(
"
Min. Length
"
)
}
FactTextField
{
fact
:
generator
.
minLength
Layout.fillWidth
:
true
}
}
src/WimaView/Wima.qmldir
0 → 100644
View file @
67cbe3f7
WimaMapVisual 1.0 WimaMapVisual.qml
WimaMeasurementAreaMapVisual 1.0 WimaMeasurementAreaMapVisual.qml
WimaJoinedAreaMapVisual 1.0 WimaJoinedAreaMapVisual.qml
WimaMeasurementAreaEditor 1.0 WimaMeasurementAreaEditor.qml
WimaServiceAreaMapVisual 1.0 WimaServiceAreaMapVisual.qml
WimaAreaMapVisual 1.0 WimaAreaMapVisual.qml
WimaServiceAreaEditor 1.0 WimaServiceAreaEditor.qml
WimaCorridorMapVisual 1.0 WimaCorridorMapVisual.qml
WimaItemEditor 1.0 WimaItemEditor.qml
WimaMapPolygonVisuals 1.0 WimaMapPolygonVisuals.qml
WimaMapPolylineVisuals 1.0 WimaMapPolylineVisuals.qml
CircularSurveyMapVisual 1.0 CircularSurveyMapVisual.qml
DragCoordinate 1.0 DragCoordinate.qml
CoordinateIndicator 1.0 CoordinateIndicator.qml
CoordinateIndicatorDrag 1.0 CoordinateIndicatorDrag.qml
ProgressIndicator 1.0 ProgressIndicator.qml
WimaToolBar 1.0 WimaToolBar.qml
src/comm/LinkConfiguration.h
View file @
67cbe3f7
...
...
@@ -213,5 +213,5 @@ private:
bool
_highLatency
;
};
typedef
shared_pt
r
<
LinkConfiguration
>
SharedLinkConfigurationPointer
;
typedef
QSharedPointe
r
<
LinkConfiguration
>
SharedLinkConfigurationPointer
;
src/comm/LinkInterface.h
View file @
67cbe3f7
...
...
@@ -305,5 +305,5 @@ private:
QMap
<
int
/* vehicle id */
,
MavlinkMessagesTimer
*>
_mavlinkMessagesTimers
;
};
typedef
shared_pt
r
<
LinkInterface
>
SharedLinkInterfacePointer
;
typedef
QSharedPointe
r
<
LinkInterface
>
SharedLinkInterfacePointer
;
src/qgcunittest/UnitTest.h
View file @
67cbe3f7
...
...
@@ -215,7 +215,7 @@ public:
}
private:
shared_pt
r
<
T
>
_unitTest
;
QSharedPointe
r
<
T
>
_unitTest
;
};
#endif
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment