From 964a0e18c6b938c207f1bd62728a15571e66f1f8 Mon Sep 17 00:00:00 2001 From: Stephen Dade Date: Thu, 1 Aug 2024 20:45:15 +1000 Subject: [PATCH 1/5] Modules: grapher layout and file export fixed for Windows --- MAVProxy/modules/lib/grapher.py | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/MAVProxy/modules/lib/grapher.py b/MAVProxy/modules/lib/grapher.py index a44a1ee1f8..9d9a8de687 100755 --- a/MAVProxy/modules/lib/grapher.py +++ b/MAVProxy/modules/lib/grapher.py @@ -8,12 +8,15 @@ import sys, struct, time, os, datetime, platform import math, re import matplotlib -if platform.system() != "Darwin" and os.getenv("MPLBACKEND") is None: +if platform.system() == "Windows": + # wxAgg doesn't properly show the graph values in the lower right on Windows + matplotlib.use('TkAgg') +elif platform.system() != "Darwin" and os.getenv("MPLBACKEND") is None: # on MacOS we can't set WxAgg here as it conflicts with the MacOS version matplotlib.use('WXAgg') from math import * from pymavlink.mavextra import * -import pylab +import matplotlib.pyplot as plt from pymavlink import mavutil import threading import numpy as np @@ -266,8 +269,8 @@ def button_click(self, event): def plotit(self, x, y, fields, colors=[], title=None, interactive=True): '''plot a set of graphs using date for x axis''' if interactive: - pylab.ion() - self.fig = pylab.figure(num=1, figsize=(12,6)) + plt.ion() + self.fig = plt.figure(num=1, figsize=(12,6)) self.ax1 = self.fig.gca() self.ax2 = None for i in range(0, len(fields)): @@ -287,6 +290,8 @@ def plotit(self, x, y, fields, colors=[], title=None, interactive=True): self.fig.canvas.mpl_connect('draw_event', self.draw_event) self.fig.canvas.mpl_connect('close_event', self.close_event) self.fig.canvas.mpl_connect('button_press_event', self.button_click) + self.fig.canvas.get_default_filename = lambda: ''.join("graph" if self.title is None else + (x if x.isalnum() else '_' for x in self.title)) + '.png' empty = True ax1_labels = [] ax2_labels = [] @@ -379,7 +384,7 @@ def plotit(self, x, y, fields, colors=[], title=None, interactive=True): empty = False if self.grid: - pylab.grid() + plt.grid() if self.show_flightmode != 0: alpha = 0.3 @@ -401,7 +406,7 @@ def plotit(self, x, y, fields, colors=[], title=None, interactive=True): return if title is not None: - pylab.title(title) + plt.title(title) else: title = fields[0] if self.fig.canvas.manager is not None: @@ -417,10 +422,10 @@ def plotit(self, x, y, fields, colors=[], title=None, interactive=True): label=mode, alpha=alpha*1.5)) labels = [patch.get_label() for patch in mode_patches] if ax1_labels != [] and self.show_flightmode != 2: - patches_legend = matplotlib.pyplot.legend(mode_patches, labels, loc=self.legend_flightmode) + patches_legend = plt.legend(mode_patches, labels, loc=self.legend_flightmode) self.fig.gca().add_artist(patches_legend) else: - pylab.legend(mode_patches, labels) + plt.legend(mode_patches, labels) if ax1_labels != []: self.ax1.legend(ax1_labels,loc=self.legend) @@ -674,8 +679,8 @@ def show(self, lenmavlist, block=True, xlim_pipe=None, output=None): self.xlim_t.start() if output is None: - pylab.draw() - pylab.show(block=block) + plt.draw() + plt.show(block=block) elif output.endswith(".html"): import mpld3 html = mpld3.fig_to_html(self.fig) @@ -683,7 +688,7 @@ def show(self, lenmavlist, block=True, xlim_pipe=None, output=None): f_out.write(html) f_out.close() else: - pylab.savefig(output, bbox_inches='tight', dpi=200) + plt.savefig(output, bbox_inches='tight', dpi=200) if __name__ == "__main__": from argparse import ArgumentParser From 622caace4f86259e9f4a672cada86ad41f5a2383 Mon Sep 17 00:00:00 2001 From: Stephen Dade Date: Fri, 2 Aug 2024 10:04:52 +1000 Subject: [PATCH 2/5] Build: Allow tkinter in Windows setup exe for MAVExplorer --- windows/mavproxy.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/windows/mavproxy.spec b/windows/mavproxy.spec index 77afe41c50..06f46ecc11 100755 --- a/windows/mavproxy.spec +++ b/windows/mavproxy.spec @@ -36,7 +36,7 @@ MAVExpAny = Analysis(['.\\tools\\MAVExplorer.py'], datas= [ ('tools\\graphs\\*.*', 'MAVProxy\\tools\\graphs' ) ], hookspath=None, runtime_hooks=None, - excludes= ['sphinx', 'docutils', 'alabaster', 'FixTk', 'tcl', 'tk', '_tkinter', 'tkinter', 'Tkinter']) + excludes= ['sphinx', 'docutils', 'alabaster', 'FixTk', 'tcl', 'tk', 'Tkinter']) MAVPicViewerAny = Analysis(['.\\tools\\mavpicviewer\\mavpicviewer.py'], pathex=[os.path.abspath('.')], # for some unknown reason these hidden imports don't pull in From 0a7da322bba9684fde8d20c45124e794e518f200 Mon Sep 17 00:00:00 2001 From: Stephen Dade Date: Sun, 24 Nov 2024 15:03:31 +1100 Subject: [PATCH 3/5] Add Heli parameter xmls --- .github/workflows/windows_build.yml | 1 + MAVProxy/modules/lib/param_help.py | 2 +- MAVProxy/modules/mavproxy_paramedit/param_editor_frame.py | 2 +- MAVProxy/tools/MAVExplorer.py | 3 ++- windows/MAVProxyWinBuild.bat | 1 + 5 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/windows_build.yml b/.github/workflows/windows_build.yml index cfd559d727..689ddeddfa 100644 --- a/.github/workflows/windows_build.yml +++ b/.github/workflows/windows_build.yml @@ -50,6 +50,7 @@ jobs: $wc.DownloadFile('https://autotest.ardupilot.org/Parameters/ArduPlane/apm.pdef.xml', 'Parameters\ArduPlane.xml') $wc.DownloadFile('https://autotest.ardupilot.org/Parameters/ArduSub/apm.pdef.xml', 'Parameters\ArduSub.xml') $wc.DownloadFile('https://autotest.ardupilot.org/Parameters/AntennaTracker/apm.pdef.xml', 'Parameters\AntennaTracker.xml') + $wc.DownloadFile('https://autotest.ardupilot.org/Parameters/Heli/apm.pdef.xml', 'Parameters\Heli.xml') - name: Build installer run: | cd windows diff --git a/MAVProxy/modules/lib/param_help.py b/MAVProxy/modules/lib/param_help.py index 0828257bc2..be57e8c13f 100644 --- a/MAVProxy/modules/lib/param_help.py +++ b/MAVProxy/modules/lib/param_help.py @@ -13,7 +13,7 @@ def __init__(self): def param_help_download(self): '''download XML files for parameters''' files = [] - for vehicle in ['Rover', 'ArduCopter', 'ArduPlane', 'ArduSub', 'AntennaTracker', 'Blimp']: + for vehicle in ['Rover', 'ArduCopter', 'ArduPlane', 'ArduSub', 'AntennaTracker', 'Blimp', 'Heli']: url = 'http://autotest.ardupilot.org/Parameters/%s/apm.pdef.xml.gz' % vehicle path = mp_util.dot_mavproxy("%s.xml" % vehicle) files.append((url, path)) diff --git a/MAVProxy/modules/mavproxy_paramedit/param_editor_frame.py b/MAVProxy/modules/mavproxy_paramedit/param_editor_frame.py index a6fdcd9ad4..6568d1fa7d 100755 --- a/MAVProxy/modules/mavproxy_paramedit/param_editor_frame.py +++ b/MAVProxy/modules/mavproxy_paramedit/param_editor_frame.py @@ -544,7 +544,7 @@ def ParamChanged(self, event): # wxGlade: ParamEditor. def param_help_download(self): '''download XML files for parameters''' files = [] - for vehicle in ['APMrover2', 'ArduCopter', 'ArduPlane', 'ArduSub', 'AntennaTracker']: + for vehicle in ['APMrover2', 'ArduCopter', 'ArduPlane', 'ArduSub', 'AntennaTracker', 'Heli']: url = 'http://autotest.ardupilot.org/Parameters/%s/apm.pdef.xml' % vehicle path = mp_util.dot_mavproxy("%s.xml" % vehicle) files.append((url, path)) diff --git a/MAVProxy/tools/MAVExplorer.py b/MAVProxy/tools/MAVExplorer.py index ace647faf1..69450a343e 100755 --- a/MAVProxy/tools/MAVExplorer.py +++ b/MAVProxy/tools/MAVExplorer.py @@ -347,7 +347,8 @@ def load_graphs(): continue # skip parameter files. They specify an encoding, and under # Python3 this leads to a warning from etree - if os.path.basename(file) in ["ArduSub.xml", "ArduPlane.xml", "APMrover2.xml", "ArduCopter.xml", "AntennaTracker.xml", "Blimp.xml", "Rover.xml"]: + if os.path.basename(file) in ["ArduSub.xml", "ArduPlane.xml", "APMrover2.xml", "ArduCopter.xml", + "AntennaTracker.xml", "Blimp.xml", "Rover.xml", "Heli.xml"]: continue graphs = load_graph_xml(open(file).read(), file) if graphs: diff --git a/windows/MAVProxyWinBuild.bat b/windows/MAVProxyWinBuild.bat index 6c82bcd2d6..dddb488eda 100755 --- a/windows/MAVProxyWinBuild.bat +++ b/windows/MAVProxyWinBuild.bat @@ -58,6 +58,7 @@ powershell.exe "Start-BitsTransfer -Source 'http://autotest.ardupilot.org/Parame powershell.exe "Start-BitsTransfer -Source 'http://autotest.ardupilot.org/Parameters/ArduPlane/apm.pdef.xml' -Destination 'Parameters\ArduPlane.xml'" powershell.exe "Start-BitsTransfer -Source 'http://autotest.ardupilot.org/Parameters/ArduSub/apm.pdef.xml' -Destination 'Parameters\ArduSub.xml'" powershell.exe "Start-BitsTransfer -Source 'http://autotest.ardupilot.org/Parameters/AntennaTracker/apm.pdef.xml' -Destination 'Parameters\AntennaTracker.xml'" +powershell.exe "Start-BitsTransfer -Source 'http://autotest.ardupilot.org/Parameters/Heli/apm.pdef.xml' -Destination 'Parameters\Heli.xml'" rem -----Build the Installer----- cd .\windows From c1974ca1b0f330c8ccff8e8e5232ee6c63f54f3e Mon Sep 17 00:00:00 2001 From: Stephen Dade Date: Sun, 24 Nov 2024 15:06:19 +1100 Subject: [PATCH 4/5] Windows: Modernise build scripts --- MAVProxy/MAVProxyWinLAN.bat | 4 ++-- MAVProxy/MAVProxyWinUSB.bat | 4 ++-- MAVProxy/tools/MAVExplorer.bat | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/MAVProxy/MAVProxyWinLAN.bat b/MAVProxy/MAVProxyWinLAN.bat index 3456ce9416..0a323a2af1 100644 --- a/MAVProxy/MAVProxyWinLAN.bat +++ b/MAVProxy/MAVProxyWinLAN.bat @@ -1,4 +1,4 @@ cd ..\ -python setup.py build install --user -python .\MAVProxy\mavproxy.py --master=0.0.0.0:14550 --console +python.exe -m pip install --upgrade build . --user +python.exe .\MAVProxy\mavproxy.py --master=0.0.0.0:14550 --console pause diff --git a/MAVProxy/MAVProxyWinUSB.bat b/MAVProxy/MAVProxyWinUSB.bat index 44b18cbf50..3e08f06a47 100644 --- a/MAVProxy/MAVProxyWinUSB.bat +++ b/MAVProxy/MAVProxyWinUSB.bat @@ -1,4 +1,4 @@ cd ..\ -python setup.py build install --user -python .\MAVProxy\mavproxy.py --console +python.exe -m pip install --upgrade build . --user +python.exe .\MAVProxy\mavproxy.py --console pause \ No newline at end of file diff --git a/MAVProxy/tools/MAVExplorer.bat b/MAVProxy/tools/MAVExplorer.bat index 7a7ee38cf1..bf1814fefd 100644 --- a/MAVProxy/tools/MAVExplorer.bat +++ b/MAVProxy/tools/MAVExplorer.bat @@ -1,4 +1,4 @@ cd ..\..\ -python setup.py build install --user -python .\MAVProxy\tools\MAVExplorer.py +python.exe -m pip install --upgrade build . --user +python.exe .\MAVProxy\tools\MAVExplorer.py pause From 55e2b1bb3f7518dfbba1351c53e1a41621dd98f8 Mon Sep 17 00:00:00 2001 From: Stephen Dade Date: Sun, 24 Nov 2024 15:07:08 +1100 Subject: [PATCH 5/5] magfit: Use wxagg on Windows --- MAVProxy/modules/lib/magfit.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MAVProxy/modules/lib/magfit.py b/MAVProxy/modules/lib/magfit.py index ffee4e88cb..df6a0ed6f7 100644 --- a/MAVProxy/modules/lib/magfit.py +++ b/MAVProxy/modules/lib/magfit.py @@ -7,7 +7,7 @@ from MAVProxy.modules.lib import wx_processguard from MAVProxy.modules.lib.wx_loader import wx -import sys, time, os, math, copy +import sys, time, os, math, copy, platform from pymavlink import mavutil from pymavlink import mavextra @@ -18,6 +18,8 @@ from MAVProxy.modules.lib.multiproc_util import MPDataLogChildTask import matplotlib +if platform.system() == "Windows": + matplotlib.use('wxagg') import matplotlib.pyplot as pyplot import numpy import datetime